diff --git a/src/base.rs b/src/base.rs index 46e47b99224d0..b3c87258a34e9 100644 --- a/src/base.rs +++ b/src/base.rs @@ -12,6 +12,7 @@ impl String> Drop for PrintOnPanic { pub fn trans_mono_item<'a, 'clif, 'tcx: 'a, B: Backend + 'static>( cx: &mut crate::CodegenCx<'a, 'clif, 'tcx, B>, mono_item: MonoItem<'tcx>, + linkage: Linkage, ) { let tcx = cx.tcx; match mono_item { @@ -42,7 +43,7 @@ pub fn trans_mono_item<'a, 'clif, 'tcx: 'a, B: Backend + 'static>( } }); - trans_fn(cx, inst); + trans_fn(cx, inst, linkage); } MonoItem::Static(def_id) => { crate::constant::codegen_static(&mut cx.ccx, def_id); @@ -56,6 +57,7 @@ pub fn trans_mono_item<'a, 'clif, 'tcx: 'a, B: Backend + 'static>( fn trans_fn<'a, 'clif, 'tcx: 'a, B: Backend + 'static>( cx: &mut crate::CodegenCx<'a, 'clif, 'tcx, B>, instance: Instance<'tcx>, + linkage: Linkage, ) { let tcx = cx.tcx; @@ -65,7 +67,7 @@ fn trans_fn<'a, 'clif, 'tcx: 'a, B: Backend + 'static>( // Step 2. Declare function let (name, sig) = get_function_name_and_sig(tcx, instance); let func_id = cx.module - .declare_function(&name, Linkage::Export, &sig) + .declare_function(&name, linkage, &sig) .unwrap(); // Step 3. Make FunctionBuilder diff --git a/src/lib.rs b/src/lib.rs index ec916449d57fb..8cbd597fd59be 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -393,9 +393,17 @@ fn codegen_mono_items<'a, 'tcx: 'a>( ) { let mut cx = CodegenCx::new(tcx, module); time("codegen mono items", move || { - for (mono_item, (_linkage, _vis)) in mono_items { + for (mono_item, (linkage, vis)) in mono_items { unimpl::try_unimpl(tcx, log, || { - base::trans_mono_item(&mut cx, mono_item); + let linkage = match (linkage, vis) { + (RLinkage::External, Visibility::Default) => Linkage::Export, + (RLinkage::Internal, Visibility::Default) => Linkage::Local, + // FIXME this should get external linkage, but hidden visibility, + // not internal linkage and default visibility + | (RLinkage::External, Visibility::Hidden) => Linkage::Local, + _ => panic!("{:?} = {:?} {:?}", mono_item, linkage, vis), + }; + base::trans_mono_item(&mut cx, mono_item, linkage); }); }