• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 use crate::ty::subst::SubstsRef;
2 use crate::ty::{self, Ty, TyCtxt};
3 use rustc_hir::def_id::{DefId, LOCAL_CRATE};
4 use rustc_macros::HashStable;
5 
6 /// The SymbolExportLevel of a symbols specifies from which kinds of crates
7 /// the symbol will be exported. `C` symbols will be exported from any
8 /// kind of crate, including cdylibs which export very few things.
9 /// `Rust` will only be exported if the crate produced is a Rust
10 /// dylib.
11 #[derive(Eq, PartialEq, Debug, Copy, Clone, TyEncodable, TyDecodable, HashStable)]
12 pub enum SymbolExportLevel {
13     C,
14     Rust,
15 }
16 
17 impl SymbolExportLevel {
is_below_threshold(self, threshold: SymbolExportLevel) -> bool18     pub fn is_below_threshold(self, threshold: SymbolExportLevel) -> bool {
19         threshold == SymbolExportLevel::Rust // export everything from Rust dylibs
20           || self == SymbolExportLevel::C
21     }
22 }
23 
24 /// Kind of exported symbols.
25 #[derive(Eq, PartialEq, Debug, Copy, Clone, Encodable, Decodable, HashStable)]
26 pub enum SymbolExportKind {
27     Text,
28     Data,
29     Tls,
30 }
31 
32 /// The `SymbolExportInfo` of a symbols specifies symbol-related information
33 /// that is relevant to code generation and linking.
34 #[derive(Eq, PartialEq, Debug, Copy, Clone, TyEncodable, TyDecodable, HashStable)]
35 pub struct SymbolExportInfo {
36     pub level: SymbolExportLevel,
37     pub kind: SymbolExportKind,
38     pub used: bool,
39 }
40 
41 #[derive(Eq, PartialEq, Debug, Copy, Clone, TyEncodable, TyDecodable, HashStable)]
42 pub enum ExportedSymbol<'tcx> {
43     NonGeneric(DefId),
44     Generic(DefId, SubstsRef<'tcx>),
45     DropGlue(Ty<'tcx>),
46     ThreadLocalShim(DefId),
47     NoDefId(ty::SymbolName<'tcx>),
48 }
49 
50 impl<'tcx> ExportedSymbol<'tcx> {
51     /// This is the symbol name of an instance if it is instantiated in the
52     /// local crate.
symbol_name_for_local_instance(&self, tcx: TyCtxt<'tcx>) -> ty::SymbolName<'tcx>53     pub fn symbol_name_for_local_instance(&self, tcx: TyCtxt<'tcx>) -> ty::SymbolName<'tcx> {
54         match *self {
55             ExportedSymbol::NonGeneric(def_id) => tcx.symbol_name(ty::Instance::mono(tcx, def_id)),
56             ExportedSymbol::Generic(def_id, substs) => {
57                 tcx.symbol_name(ty::Instance::new(def_id, substs))
58             }
59             ExportedSymbol::DropGlue(ty) => {
60                 tcx.symbol_name(ty::Instance::resolve_drop_in_place(tcx, ty))
61             }
62             ExportedSymbol::ThreadLocalShim(def_id) => tcx.symbol_name(ty::Instance {
63                 def: ty::InstanceDef::ThreadLocalShim(def_id),
64                 substs: ty::InternalSubsts::empty(),
65             }),
66             ExportedSymbol::NoDefId(symbol_name) => symbol_name,
67         }
68     }
69 }
70 
metadata_symbol_name(tcx: TyCtxt<'_>) -> String71 pub fn metadata_symbol_name(tcx: TyCtxt<'_>) -> String {
72     format!(
73         "rust_metadata_{}_{:08x}",
74         tcx.crate_name(LOCAL_CRATE),
75         tcx.sess.local_stable_crate_id(),
76     )
77 }
78