]> git.lizzy.rs Git - rust.git/blob - src/linkage.rs
23940c33f1feac97f2bc30b7aaf16d5deb8ac6bb
[rust.git] / src / linkage.rs
1 use rustc_middle::mir::mono::{Linkage as RLinkage, MonoItem, Visibility};
2
3 use crate::prelude::*;
4
5 pub(crate) fn get_clif_linkage(mono_item: MonoItem<'_>, linkage: RLinkage, visibility: Visibility) -> Linkage {
6     match (linkage, visibility) {
7         (RLinkage::External, Visibility::Default) => Linkage::Export,
8         (RLinkage::Internal, Visibility::Default) => Linkage::Local,
9         (RLinkage::External, Visibility::Hidden) => Linkage::Hidden,
10         _ => panic!("{:?} = {:?} {:?}", mono_item, linkage, visibility),
11     }
12 }
13
14 pub(crate) fn get_static_linkage(tcx: TyCtxt<'_>, def_id: DefId) -> Linkage {
15     let fn_attrs = tcx.codegen_fn_attrs(def_id);
16
17     if let Some(linkage) = fn_attrs.linkage {
18         match linkage {
19             RLinkage::External => Linkage::Export,
20             RLinkage::Internal => Linkage::Local,
21             RLinkage::ExternalWeak | RLinkage::WeakAny => Linkage::Preemptible,
22             _ => panic!("{:?}", linkage),
23         }
24     } else {
25         if tcx.is_reachable_non_generic(def_id) {
26             Linkage::Export
27         } else {
28             Linkage::Export // FIXME use Linkage::Hidden
29         }
30     }
31 }