@@ -190,9 +190,13 @@ impl<'a, 'tcx> TransItem<'tcx> {
190
190
} ) => {
191
191
let lldecl = declare:: declare_fn ( ccx, symbol_name, mono_ty) ;
192
192
llvm:: SetLinkage ( lldecl, linkage) ;
193
- attributes:: from_fn_attrs ( ccx, attrs, lldecl) ;
194
193
base:: set_link_section ( ccx, lldecl, attrs) ;
194
+ if linkage == llvm:: LinkOnceODRLinkage ||
195
+ linkage == llvm:: WeakODRLinkage {
196
+ llvm:: SetUniqueComdat ( ccx. llmod ( ) , lldecl) ;
197
+ }
195
198
199
+ attributes:: from_fn_attrs ( ccx, attrs, lldecl) ;
196
200
ccx. instances ( ) . borrow_mut ( ) . insert ( instance, lldecl) ;
197
201
}
198
202
_ => bug ! ( "Invalid item for TransItem::Fn: `{:?}`" , map_node)
@@ -223,6 +227,10 @@ impl<'a, 'tcx> TransItem<'tcx> {
223
227
assert ! ( declare:: get_defined_value( ccx, symbol_name) . is_none( ) ) ;
224
228
let llfn = declare:: declare_cfn ( ccx, symbol_name, llfnty) ;
225
229
llvm:: SetLinkage ( llfn, linkage) ;
230
+ if linkage == llvm:: LinkOnceODRLinkage ||
231
+ linkage == llvm:: WeakODRLinkage {
232
+ llvm:: SetUniqueComdat ( ccx. llmod ( ) , llfn) ;
233
+ }
226
234
attributes:: set_frame_pointer_elimination ( ccx, llfn) ;
227
235
ccx. drop_glues ( ) . borrow_mut ( ) . insert ( dg, ( llfn, fn_ty) ) ;
228
236
}
0 commit comments