]> git.lizzy.rs Git - rust.git/blob - compiler/rustc_codegen_cranelift/src/linkage.rs
Auto merge of #104334 - compiler-errors:ufcs-sugg-wrong-def-id, r=estebank
[rust.git] / compiler / rustc_codegen_cranelift / 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(
6     mono_item: MonoItem<'_>,
7     linkage: RLinkage,
8     visibility: Visibility,
9     is_compiler_builtins: bool,
10 ) -> Linkage {
11     match (linkage, visibility) {
12         (RLinkage::External, Visibility::Default) if is_compiler_builtins => Linkage::Hidden,
13         (RLinkage::External, Visibility::Default) => Linkage::Export,
14         (RLinkage::Internal, Visibility::Default) => Linkage::Local,
15         (RLinkage::External, Visibility::Hidden) => Linkage::Hidden,
16         (RLinkage::WeakAny, Visibility::Default) => Linkage::Preemptible,
17         _ => panic!("{:?} = {:?} {:?}", mono_item, linkage, visibility),
18     }
19 }
20
21 pub(crate) fn get_static_linkage(tcx: TyCtxt<'_>, def_id: DefId) -> Linkage {
22     let fn_attrs = tcx.codegen_fn_attrs(def_id);
23
24     if let Some(linkage) = fn_attrs.linkage {
25         match linkage {
26             RLinkage::External => Linkage::Export,
27             RLinkage::Internal => Linkage::Local,
28             RLinkage::ExternalWeak | RLinkage::WeakAny => Linkage::Preemptible,
29             _ => panic!("{:?}", linkage),
30         }
31     } else if tcx.is_reachable_non_generic(def_id) {
32         Linkage::Export
33     } else {
34         Linkage::Hidden
35     }
36 }