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 {
}
});
- trans_fn(cx, inst);
+ trans_fn(cx, inst, linkage);
}
MonoItem::Static(def_id) => {
crate::constant::codegen_static(&mut cx.ccx, def_id);
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;
// 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
) {
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);
});
}