rustc_middle/middle/
exported_symbols.rs1use rustc_hir::def_id::{DefId, LOCAL_CRATE};
2use rustc_macros::{Decodable, Encodable, HashStable, TyDecodable, TyEncodable};
3
4use crate::ty::{self, GenericArgsRef, Ty, TyCtxt};
5
6#[derive(Eq, PartialEq, Debug, Copy, Clone, TyEncodable, TyDecodable, HashStable)]
12pub enum SymbolExportLevel {
13 C,
14 Rust,
15}
16
17impl SymbolExportLevel {
18 pub fn is_below_threshold(self, threshold: SymbolExportLevel) -> bool {
19 threshold == SymbolExportLevel::Rust || self == SymbolExportLevel::C
21 }
22}
23
24#[derive(Eq, PartialEq, Debug, Copy, Clone, Encodable, Decodable, HashStable, Hash)]
26pub enum SymbolExportKind {
27 Text,
28 Data,
29 Tls,
30}
31
32#[derive(Eq, PartialEq, Debug, Copy, Clone, TyEncodable, TyDecodable, HashStable)]
38pub struct SymbolExportInfo {
39 pub level: SymbolExportLevel,
40 pub kind: SymbolExportKind,
41 pub used: bool,
43 pub rustc_std_internal_symbol: bool,
45}
46
47#[derive(Eq, PartialEq, Debug, Copy, Clone, TyEncodable, TyDecodable, HashStable)]
48pub enum ExportedSymbol<'tcx> {
49 NonGeneric(DefId),
50 Generic(DefId, GenericArgsRef<'tcx>),
51 DropGlue(Ty<'tcx>),
52 AsyncDropGlueCtorShim(Ty<'tcx>),
53 AsyncDropGlue(DefId, Ty<'tcx>),
54 ThreadLocalShim(DefId),
55 NoDefId(ty::SymbolName<'tcx>),
56}
57
58impl<'tcx> ExportedSymbol<'tcx> {
59 pub fn symbol_name_for_local_instance(&self, tcx: TyCtxt<'tcx>) -> ty::SymbolName<'tcx> {
62 match *self {
63 ExportedSymbol::NonGeneric(def_id) => tcx.symbol_name(ty::Instance::mono(tcx, def_id)),
64 ExportedSymbol::Generic(def_id, args) => {
65 tcx.symbol_name(ty::Instance::new_raw(def_id, args))
66 }
67 ExportedSymbol::DropGlue(ty) => {
68 tcx.symbol_name(ty::Instance::resolve_drop_in_place(tcx, ty))
69 }
70 ExportedSymbol::AsyncDropGlueCtorShim(ty) => {
71 tcx.symbol_name(ty::Instance::resolve_async_drop_in_place(tcx, ty))
72 }
73 ExportedSymbol::AsyncDropGlue(def_id, ty) => {
74 tcx.symbol_name(ty::Instance::resolve_async_drop_in_place_poll(tcx, def_id, ty))
75 }
76 ExportedSymbol::ThreadLocalShim(def_id) => tcx.symbol_name(ty::Instance {
77 def: ty::InstanceKind::ThreadLocalShim(def_id),
78 args: ty::GenericArgs::empty(),
79 }),
80 ExportedSymbol::NoDefId(symbol_name) => symbol_name,
81 }
82 }
83}
84
85pub fn metadata_symbol_name(tcx: TyCtxt<'_>) -> String {
86 format!(
87 "rust_metadata_{}_{:08x}",
88 tcx.crate_name(LOCAL_CRATE),
89 tcx.stable_crate_id(LOCAL_CRATE),
90 )
91}