Skip to content

Commit aa8413c

Browse files
committed
Add SymbolExportInfo
This is currently a wrapper to `SymbolExportLevel` but it allows later addition of extra information.
1 parent a867b8d commit aa8413c

File tree

12 files changed

+75
-38
lines changed

12 files changed

+75
-38
lines changed

compiler/rustc_codegen_llvm/src/back/lto.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use rustc_errors::{FatalError, Handler};
1616
use rustc_hir::def_id::LOCAL_CRATE;
1717
use rustc_middle::bug;
1818
use rustc_middle::dep_graph::WorkProduct;
19-
use rustc_middle::middle::exported_symbols::SymbolExportLevel;
19+
use rustc_middle::middle::exported_symbols::{SymbolExportInfo, SymbolExportLevel};
2020
use rustc_session::cgu_reuse_tracker::CguReuse;
2121
use rustc_session::config::{self, CrateType, Lto};
2222
use tracing::{debug, info};
@@ -55,8 +55,8 @@ fn prepare_lto(
5555
Lto::No => panic!("didn't request LTO but we're doing LTO"),
5656
};
5757

58-
let symbol_filter = &|&(ref name, level): &(String, SymbolExportLevel)| {
59-
if level.is_below_threshold(export_threshold) {
58+
let symbol_filter = &|&(ref name, info): &(String, SymbolExportInfo)| {
59+
if info.level.is_below_threshold(export_threshold) {
6060
Some(CString::new(name.as_str()).unwrap())
6161
} else {
6262
None

compiler/rustc_codegen_ssa/src/back/linker.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -1526,8 +1526,8 @@ pub(crate) fn exported_symbols(tcx: TyCtxt<'_>, crate_type: CrateType) -> Vec<St
15261526
let mut symbols = Vec::new();
15271527

15281528
let export_threshold = symbol_export::crates_export_threshold(&[crate_type]);
1529-
for &(symbol, level) in tcx.exported_symbols(LOCAL_CRATE).iter() {
1530-
if level.is_below_threshold(export_threshold) {
1529+
for &(symbol, info) in tcx.exported_symbols(LOCAL_CRATE).iter() {
1530+
if info.level.is_below_threshold(export_threshold) {
15311531
symbols.push(symbol_export::symbol_name_for_instance_in_crate(
15321532
tcx,
15331533
symbol,
@@ -1544,8 +1544,8 @@ pub(crate) fn exported_symbols(tcx: TyCtxt<'_>, crate_type: CrateType) -> Vec<St
15441544
// For each dependency that we are linking to statically ...
15451545
if *dep_format == Linkage::Static {
15461546
// ... we add its symbol list to our export list.
1547-
for &(symbol, level) in tcx.exported_symbols(cnum).iter() {
1548-
if !level.is_below_threshold(export_threshold) {
1547+
for &(symbol, info) in tcx.exported_symbols(cnum).iter() {
1548+
if !info.level.is_below_threshold(export_threshold) {
15491549
continue;
15501550
}
15511551

compiler/rustc_codegen_ssa/src/back/symbol_export.rs

+45-15
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use rustc_hir::Node;
99
use rustc_index::vec::IndexVec;
1010
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags;
1111
use rustc_middle::middle::exported_symbols::{
12-
metadata_symbol_name, ExportedSymbol, SymbolExportLevel,
12+
metadata_symbol_name, ExportedSymbol, SymbolExportInfo, SymbolExportLevel,
1313
};
1414
use rustc_middle::ty::query::{ExternProviders, Providers};
1515
use rustc_middle::ty::subst::{GenericArgKind, SubstsRef};
@@ -42,7 +42,7 @@ pub fn crates_export_threshold(crate_types: &[CrateType]) -> SymbolExportLevel {
4242
}
4343
}
4444

45-
fn reachable_non_generics_provider(tcx: TyCtxt<'_>, cnum: CrateNum) -> DefIdMap<SymbolExportLevel> {
45+
fn reachable_non_generics_provider(tcx: TyCtxt<'_>, cnum: CrateNum) -> DefIdMap<SymbolExportInfo> {
4646
assert_eq!(cnum, LOCAL_CRATE);
4747

4848
if !tcx.sess.opts.output_types.should_codegen() {
@@ -129,12 +129,17 @@ fn reachable_non_generics_provider(tcx: TyCtxt<'_>, cnum: CrateNum) -> DefIdMap<
129129
tcx.symbol_name(Instance::mono(tcx, def_id.to_def_id())),
130130
export_level
131131
);
132-
(def_id.to_def_id(), export_level)
132+
(def_id.to_def_id(), SymbolExportInfo {
133+
level: export_level,
134+
})
133135
})
134136
.collect();
135137

136138
if let Some(id) = tcx.proc_macro_decls_static(()) {
137-
reachable_non_generics.insert(id.to_def_id(), SymbolExportLevel::C);
139+
reachable_non_generics.insert(
140+
id.to_def_id(),
141+
SymbolExportInfo { level: SymbolExportLevel::C },
142+
);
138143
}
139144

140145
reachable_non_generics
@@ -143,8 +148,8 @@ fn reachable_non_generics_provider(tcx: TyCtxt<'_>, cnum: CrateNum) -> DefIdMap<
143148
fn is_reachable_non_generic_provider_local(tcx: TyCtxt<'_>, def_id: DefId) -> bool {
144149
let export_threshold = threshold(tcx);
145150

146-
if let Some(&level) = tcx.reachable_non_generics(def_id.krate).get(&def_id) {
147-
level.is_below_threshold(export_threshold)
151+
if let Some(&info) = tcx.reachable_non_generics(def_id.krate).get(&def_id) {
152+
info.level.is_below_threshold(export_threshold)
148153
} else {
149154
false
150155
}
@@ -157,7 +162,7 @@ fn is_reachable_non_generic_provider_extern(tcx: TyCtxt<'_>, def_id: DefId) -> b
157162
fn exported_symbols_provider_local<'tcx>(
158163
tcx: TyCtxt<'tcx>,
159164
cnum: CrateNum,
160-
) -> &'tcx [(ExportedSymbol<'tcx>, SymbolExportLevel)] {
165+
) -> &'tcx [(ExportedSymbol<'tcx>, SymbolExportInfo)] {
161166
assert_eq!(cnum, LOCAL_CRATE);
162167

163168
if !tcx.sess.opts.output_types.should_codegen() {
@@ -167,21 +172,27 @@ fn exported_symbols_provider_local<'tcx>(
167172
let mut symbols: Vec<_> = tcx
168173
.reachable_non_generics(LOCAL_CRATE)
169174
.iter()
170-
.map(|(&def_id, &level)| (ExportedSymbol::NonGeneric(def_id), level))
175+
.map(|(&def_id, &info)| (ExportedSymbol::NonGeneric(def_id), info))
171176
.collect();
172177

173178
if tcx.entry_fn(()).is_some() {
174179
let exported_symbol = ExportedSymbol::NoDefId(SymbolName::new(tcx, "main"));
175180

176-
symbols.push((exported_symbol, SymbolExportLevel::C));
181+
symbols.push((
182+
exported_symbol,
183+
SymbolExportInfo { level: SymbolExportLevel::C },
184+
));
177185
}
178186

179187
if tcx.allocator_kind(()).is_some() {
180188
for method in ALLOCATOR_METHODS {
181189
let symbol_name = format!("__rust_{}", method.name);
182190
let exported_symbol = ExportedSymbol::NoDefId(SymbolName::new(tcx, &symbol_name));
183191

184-
symbols.push((exported_symbol, SymbolExportLevel::Rust));
192+
symbols.push((
193+
exported_symbol,
194+
SymbolExportInfo { level: SymbolExportLevel::Rust },
195+
));
185196
}
186197
}
187198

@@ -194,7 +205,10 @@ fn exported_symbols_provider_local<'tcx>(
194205

195206
symbols.extend(PROFILER_WEAK_SYMBOLS.iter().map(|sym| {
196207
let exported_symbol = ExportedSymbol::NoDefId(SymbolName::new(tcx, sym));
197-
(exported_symbol, SymbolExportLevel::C)
208+
(
209+
exported_symbol,
210+
SymbolExportInfo { level: SymbolExportLevel::C },
211+
)
198212
}));
199213
}
200214

@@ -204,15 +218,21 @@ fn exported_symbols_provider_local<'tcx>(
204218

205219
symbols.extend(MSAN_WEAK_SYMBOLS.iter().map(|sym| {
206220
let exported_symbol = ExportedSymbol::NoDefId(SymbolName::new(tcx, sym));
207-
(exported_symbol, SymbolExportLevel::C)
221+
(
222+
exported_symbol,
223+
SymbolExportInfo { level: SymbolExportLevel::C },
224+
)
208225
}));
209226
}
210227

211228
if tcx.sess.crate_types().contains(&CrateType::Dylib) {
212229
let symbol_name = metadata_symbol_name(tcx);
213230
let exported_symbol = ExportedSymbol::NoDefId(SymbolName::new(tcx, &symbol_name));
214231

215-
symbols.push((exported_symbol, SymbolExportLevel::Rust));
232+
symbols.push((
233+
exported_symbol,
234+
SymbolExportInfo { level: SymbolExportLevel::Rust },
235+
));
216236
}
217237

218238
if tcx.sess.opts.share_generics() && tcx.local_crate_exports_generics() {
@@ -245,7 +265,12 @@ fn exported_symbols_provider_local<'tcx>(
245265
MonoItem::Fn(Instance { def: InstanceDef::Item(def), substs }) => {
246266
if substs.non_erasable_generics().next().is_some() {
247267
let symbol = ExportedSymbol::Generic(def.did, substs);
248-
symbols.push((symbol, SymbolExportLevel::Rust));
268+
symbols.push((
269+
symbol,
270+
SymbolExportInfo {
271+
level: SymbolExportLevel::Rust,
272+
},
273+
));
249274
}
250275
}
251276
MonoItem::Fn(Instance { def: InstanceDef::DropGlue(_, Some(ty)), substs }) => {
@@ -254,7 +279,12 @@ fn exported_symbols_provider_local<'tcx>(
254279
substs.non_erasable_generics().next(),
255280
Some(GenericArgKind::Type(ty))
256281
);
257-
symbols.push((ExportedSymbol::DropGlue(ty), SymbolExportLevel::Rust));
282+
symbols.push((
283+
ExportedSymbol::DropGlue(ty),
284+
SymbolExportInfo {
285+
level: SymbolExportLevel::Rust,
286+
},
287+
));
258288
}
259289
_ => {
260290
// Any other symbols don't qualify for sharing

compiler/rustc_codegen_ssa/src/back/write.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use rustc_incremental::{
2323
};
2424
use rustc_metadata::EncodedMetadata;
2525
use rustc_middle::dep_graph::{WorkProduct, WorkProductId};
26-
use rustc_middle::middle::exported_symbols::SymbolExportLevel;
26+
use rustc_middle::middle::exported_symbols::SymbolExportInfo;
2727
use rustc_middle::ty::TyCtxt;
2828
use rustc_session::cgu_reuse_tracker::CguReuseTracker;
2929
use rustc_session::config::{self, CrateType, Lto, OutputFilenames, OutputType};
@@ -304,7 +304,7 @@ pub type TargetMachineFactoryFn<B> = Arc<
304304
+ Sync,
305305
>;
306306

307-
pub type ExportedSymbols = FxHashMap<CrateNum, Arc<Vec<(String, SymbolExportLevel)>>>;
307+
pub type ExportedSymbols = FxHashMap<CrateNum, Arc<Vec<(String, SymbolExportInfo)>>>;
308308

309309
/// Additional resources used by optimize_and_codegen (not module specific)
310310
#[derive(Clone)]

compiler/rustc_metadata/src/rmeta/decoder.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use rustc_hir::lang_items;
2222
use rustc_index::vec::{Idx, IndexVec};
2323
use rustc_middle::arena::ArenaAllocatable;
2424
use rustc_middle::metadata::ModChild;
25-
use rustc_middle::middle::exported_symbols::{ExportedSymbol, SymbolExportLevel};
25+
use rustc_middle::middle::exported_symbols::{ExportedSymbol, SymbolExportInfo};
2626
use rustc_middle::middle::stability::DeprecationEntry;
2727
use rustc_middle::mir::interpret::{AllocDecodingSession, AllocDecodingState};
2828
use rustc_middle::thir;
@@ -1405,7 +1405,7 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
14051405
fn exported_symbols(
14061406
self,
14071407
tcx: TyCtxt<'tcx>,
1408-
) -> &'tcx [(ExportedSymbol<'tcx>, SymbolExportLevel)] {
1408+
) -> &'tcx [(ExportedSymbol<'tcx>, SymbolExportInfo)] {
14091409
tcx.arena.alloc_from_iter(self.root.exported_symbols.decode((self, tcx)))
14101410
}
14111411

compiler/rustc_metadata/src/rmeta/decoder/cstore_impl.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -188,9 +188,9 @@ provide! { <'tcx> tcx, def_id, other, cdata,
188188
let reachable_non_generics = tcx
189189
.exported_symbols(cdata.cnum)
190190
.iter()
191-
.filter_map(|&(exported_symbol, export_level)| {
191+
.filter_map(|&(exported_symbol, export_info)| {
192192
if let ExportedSymbol::NonGeneric(def_id) = exported_symbol {
193-
Some((def_id, export_level))
193+
Some((def_id, export_info))
194194
} else {
195195
None
196196
}

compiler/rustc_metadata/src/rmeta/encoder.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use rustc_index::vec::Idx;
2121
use rustc_middle::hir::nested_filter;
2222
use rustc_middle::middle::dependency_format::Linkage;
2323
use rustc_middle::middle::exported_symbols::{
24-
metadata_symbol_name, ExportedSymbol, SymbolExportLevel,
24+
metadata_symbol_name, ExportedSymbol, SymbolExportInfo,
2525
};
2626
use rustc_middle::mir::interpret;
2727
use rustc_middle::thir;
@@ -1844,8 +1844,8 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
18441844
// definition (as that's not defined in this crate).
18451845
fn encode_exported_symbols(
18461846
&mut self,
1847-
exported_symbols: &[(ExportedSymbol<'tcx>, SymbolExportLevel)],
1848-
) -> Lazy<[(ExportedSymbol<'tcx>, SymbolExportLevel)]> {
1847+
exported_symbols: &[(ExportedSymbol<'tcx>, SymbolExportInfo)],
1848+
) -> Lazy<[(ExportedSymbol<'tcx>, SymbolExportInfo)]> {
18491849
empty_proc_macro!(self);
18501850
// The metadata symbol name is special. It should not show up in
18511851
// downstream crates.

compiler/rustc_metadata/src/rmeta/mod.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use rustc_hir::definitions::DefKey;
1313
use rustc_hir::lang_items;
1414
use rustc_index::{bit_set::FiniteBitSet, vec::IndexVec};
1515
use rustc_middle::metadata::ModChild;
16-
use rustc_middle::middle::exported_symbols::{ExportedSymbol, SymbolExportLevel};
16+
use rustc_middle::middle::exported_symbols::{ExportedSymbol, SymbolExportInfo};
1717
use rustc_middle::mir;
1818
use rustc_middle::thir;
1919
use rustc_middle::ty::fast_reject::SimplifiedType;
@@ -218,7 +218,7 @@ crate struct CrateRoot<'tcx> {
218218

219219
tables: LazyTables<'tcx>,
220220

221-
exported_symbols: Lazy!([(ExportedSymbol<'tcx>, SymbolExportLevel)]),
221+
exported_symbols: Lazy!([(ExportedSymbol<'tcx>, SymbolExportInfo)]),
222222

223223
syntax_contexts: SyntaxContextTable,
224224
expn_data: ExpnDataTable,

compiler/rustc_middle/src/middle/exported_symbols.rs

+7
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,13 @@ impl SymbolExportLevel {
2121
}
2222
}
2323

24+
/// The `SymbolExportInfo` of a symbols specifies symbol-related information
25+
/// that is relevant to code generation and linking.
26+
#[derive(Eq, PartialEq, Debug, Copy, Clone, TyEncodable, TyDecodable, HashStable)]
27+
pub struct SymbolExportInfo {
28+
pub level: SymbolExportLevel,
29+
}
30+
2431
#[derive(Eq, PartialEq, Debug, Copy, Clone, TyEncodable, TyDecodable, HashStable)]
2532
pub enum ExportedSymbol<'tcx> {
2633
NonGeneric(DefId),

compiler/rustc_middle/src/query/mod.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1355,7 +1355,7 @@ rustc_queries! {
13551355
// Does not include external symbols that don't have a corresponding DefId,
13561356
// like the compiler-generated `main` function and so on.
13571357
query reachable_non_generics(_: CrateNum)
1358-
-> DefIdMap<SymbolExportLevel> {
1358+
-> DefIdMap<SymbolExportInfo> {
13591359
storage(ArenaCacheSelector<'tcx>)
13601360
desc { "looking up the exported symbols of a crate" }
13611361
separate_provide_extern
@@ -1672,7 +1672,7 @@ rustc_queries! {
16721672
/// correspond to a publicly visible symbol in `cnum` machine code.
16731673
/// - The `exported_symbols` sets of different crates do not intersect.
16741674
query exported_symbols(_: CrateNum)
1675-
-> &'tcx [(ExportedSymbol<'tcx>, SymbolExportLevel)] {
1675+
-> &'tcx [(ExportedSymbol<'tcx>, SymbolExportInfo)] {
16761676
desc { "exported_symbols" }
16771677
separate_provide_extern
16781678
}

compiler/rustc_middle/src/ty/query.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use crate::infer::canonical::{self, Canonical};
33
use crate::lint::LintLevelMap;
44
use crate::metadata::ModChild;
55
use crate::middle::codegen_fn_attrs::CodegenFnAttrs;
6-
use crate::middle::exported_symbols::{ExportedSymbol, SymbolExportLevel};
6+
use crate::middle::exported_symbols::{ExportedSymbol, SymbolExportInfo};
77
use crate::middle::lib_features::LibFeatures;
88
use crate::middle::privacy::AccessLevels;
99
use crate::middle::region;

compiler/rustc_monomorphize/src/partitioning/default.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use rustc_hir::def::DefKind;
55
use rustc_hir::def_id::{DefId, CRATE_DEF_INDEX, LOCAL_CRATE};
66
use rustc_hir::definitions::DefPathDataName;
77
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags;
8-
use rustc_middle::middle::exported_symbols::SymbolExportLevel;
8+
use rustc_middle::middle::exported_symbols::{SymbolExportInfo, SymbolExportLevel};
99
use rustc_middle::mir::mono::{CodegenUnit, CodegenUnitNameBuilder, Linkage, Visibility};
1010
use rustc_middle::mir::mono::{InstantiationMode, MonoItem};
1111
use rustc_middle::ty::print::characteristic_def_id_of_type;
@@ -554,7 +554,7 @@ fn default_visibility(tcx: TyCtxt<'_>, id: DefId, is_generic: bool) -> Visibilit
554554
// C-export level items remain at `Default`, all other internal
555555
// items become `Hidden`.
556556
match tcx.reachable_non_generics(id.krate).get(&id) {
557-
Some(SymbolExportLevel::C) => Visibility::Default,
557+
Some(SymbolExportInfo { level: SymbolExportLevel::C, .. }) => Visibility::Default,
558558
_ => Visibility::Hidden,
559559
}
560560
}

0 commit comments

Comments
 (0)