summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_codegen_cranelift/src/linkage.rs
blob: ca853aac15892285208581ed6884e4835babf864 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
use rustc_middle::mir::mono::{Linkage as RLinkage, MonoItem, Visibility};

use crate::prelude::*;

pub(crate) fn get_clif_linkage(
    mono_item: MonoItem<'_>,
    linkage: RLinkage,
    visibility: Visibility,
    is_compiler_builtins: bool,
) -> Linkage {
    match (linkage, visibility) {
        (RLinkage::External, Visibility::Default) if is_compiler_builtins => Linkage::Hidden,
        (RLinkage::External, Visibility::Default) => Linkage::Export,
        (RLinkage::Internal, Visibility::Default) => Linkage::Local,
        (RLinkage::External, Visibility::Hidden) => Linkage::Hidden,
        (RLinkage::WeakAny, Visibility::Default) => Linkage::Preemptible,
        _ => panic!("{:?} = {:?} {:?}", mono_item, linkage, visibility),
    }
}

pub(crate) fn get_static_linkage(tcx: TyCtxt<'_>, def_id: DefId) -> Linkage {
    let fn_attrs = tcx.codegen_fn_attrs(def_id);

    if let Some(linkage) = fn_attrs.linkage {
        match linkage {
            RLinkage::External => Linkage::Export,
            RLinkage::Internal => Linkage::Local,
            RLinkage::ExternalWeak | RLinkage::WeakAny => Linkage::Preemptible,
            _ => panic!("{:?}", linkage),
        }
    } else if tcx.is_reachable_non_generic(def_id) {
        Linkage::Export
    } else {
        Linkage::Hidden
    }
}