Skip to content

Commit b52f9eb

Browse files
committed
Introduce MonoItemData.
It replaces `(Linkage, Visibility)`, making the code nicer. Plus the next commit will add another field.
1 parent c4083fa commit b52f9eb

File tree

6 files changed

+39
-27
lines changed

6 files changed

+39
-27
lines changed

compiler/rustc_codegen_cranelift/src/driver/mod.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
//! [`codegen_static`]: crate::constant::codegen_static
66
77
use rustc_data_structures::profiling::SelfProfilerRef;
8-
use rustc_middle::mir::mono::{Linkage as RLinkage, MonoItem, Visibility};
8+
use rustc_middle::mir::mono::{MonoItem, MonoItemData};
99

1010
use crate::prelude::*;
1111

@@ -16,11 +16,11 @@ pub(crate) mod jit;
1616
fn predefine_mono_items<'tcx>(
1717
tcx: TyCtxt<'tcx>,
1818
module: &mut dyn Module,
19-
mono_items: &[(MonoItem<'tcx>, (RLinkage, Visibility))],
19+
mono_items: &[(MonoItem<'tcx>, MonoItemData)],
2020
) {
2121
tcx.prof.generic_activity("predefine functions").run(|| {
2222
let is_compiler_builtins = tcx.is_compiler_builtins(LOCAL_CRATE);
23-
for &(mono_item, (linkage, visibility)) in mono_items {
23+
for &(mono_item, data) in mono_items {
2424
match mono_item {
2525
MonoItem::Fn(instance) => {
2626
let name = tcx.symbol_name(instance).name;
@@ -29,8 +29,8 @@ fn predefine_mono_items<'tcx>(
2929
get_function_sig(tcx, module.target_config().default_call_conv, instance);
3030
let linkage = crate::linkage::get_clif_linkage(
3131
mono_item,
32-
linkage,
33-
visibility,
32+
data.linkage,
33+
data.visibility,
3434
is_compiler_builtins,
3535
);
3636
module.declare_function(name, linkage, &sig).unwrap();

compiler/rustc_codegen_gcc/src/base.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -159,8 +159,8 @@ pub fn compile_codegen_unit(tcx: TyCtxt<'_>, cgu_name: Symbol, supports_128bit_i
159159
let cx = CodegenCx::new(&context, cgu, tcx, supports_128bit_integers);
160160

161161
let mono_items = cgu.items_in_deterministic_order(tcx);
162-
for &(mono_item, (linkage, visibility)) in &mono_items {
163-
mono_item.predefine::<Builder<'_, '_, '_>>(&cx, linkage, visibility);
162+
for &(mono_item, data) in &mono_items {
163+
mono_item.predefine::<Builder<'_, '_, '_>>(&cx, data.linkage, data.visibility);
164164
}
165165

166166
// ... and now that we have everything pre-defined, fill out those definitions.

compiler/rustc_codegen_llvm/src/base.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,8 @@ pub fn compile_codegen_unit(tcx: TyCtxt<'_>, cgu_name: Symbol) -> (ModuleCodegen
8686
{
8787
let cx = CodegenCx::new(tcx, cgu, &llvm_module);
8888
let mono_items = cx.codegen_unit.items_in_deterministic_order(cx.tcx);
89-
for &(mono_item, (linkage, visibility)) in &mono_items {
90-
mono_item.predefine::<Builder<'_, '_, '_>>(&cx, linkage, visibility);
89+
for &(mono_item, data) in &mono_items {
90+
mono_item.predefine::<Builder<'_, '_, '_>>(&cx, data.linkage, data.visibility);
9191
}
9292

9393
// ... and now that we have everything pre-defined, fill out those definitions.

compiler/rustc_codegen_ssa/src/back/symbol_export.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -328,14 +328,14 @@ fn exported_symbols_provider_local(
328328

329329
let (_, cgus) = tcx.collect_and_partition_mono_items(());
330330

331-
for (mono_item, &(linkage, visibility)) in cgus.iter().flat_map(|cgu| cgu.items().iter()) {
332-
if linkage != Linkage::External {
331+
for (mono_item, data) in cgus.iter().flat_map(|cgu| cgu.items().iter()) {
332+
if data.linkage != Linkage::External {
333333
// We can only re-use things with external linkage, otherwise
334334
// we'll get a linker error
335335
continue;
336336
}
337337

338-
if need_visibility && visibility == Visibility::Hidden {
338+
if need_visibility && data.visibility == Visibility::Hidden {
339339
// If we potentially share things from Rust dylibs, they must
340340
// not be hidden
341341
continue;

compiler/rustc_middle/src/mir/mono.rs

+12-5
Original file line numberDiff line numberDiff line change
@@ -230,14 +230,21 @@ pub struct CodegenUnit<'tcx> {
230230
/// contain something unique to this crate (e.g., a module path)
231231
/// as well as the crate name and disambiguator.
232232
name: Symbol,
233-
items: FxHashMap<MonoItem<'tcx>, (Linkage, Visibility)>,
233+
items: FxHashMap<MonoItem<'tcx>, MonoItemData>,
234234
size_estimate: usize,
235235
primary: bool,
236236
/// True if this is CGU is used to hold code coverage information for dead code,
237237
/// false otherwise.
238238
is_code_coverage_dead_code_cgu: bool,
239239
}
240240

241+
/// Auxiliary info about a `MonoItem`.
242+
#[derive(Copy, Clone, PartialEq, Debug, HashStable)]
243+
pub struct MonoItemData {
244+
pub linkage: Linkage,
245+
pub visibility: Visibility,
246+
}
247+
241248
/// Specifies the linkage type for a `MonoItem`.
242249
///
243250
/// See <https://llvm.org/docs/LangRef.html#linkage-types> for more details about these variants.
@@ -292,12 +299,12 @@ impl<'tcx> CodegenUnit<'tcx> {
292299
}
293300

294301
/// The order of these items is non-determinstic.
295-
pub fn items(&self) -> &FxHashMap<MonoItem<'tcx>, (Linkage, Visibility)> {
302+
pub fn items(&self) -> &FxHashMap<MonoItem<'tcx>, MonoItemData> {
296303
&self.items
297304
}
298305

299306
/// The order of these items is non-determinstic.
300-
pub fn items_mut(&mut self) -> &mut FxHashMap<MonoItem<'tcx>, (Linkage, Visibility)> {
307+
pub fn items_mut(&mut self) -> &mut FxHashMap<MonoItem<'tcx>, MonoItemData> {
301308
&mut self.items
302309
}
303310

@@ -355,7 +362,7 @@ impl<'tcx> CodegenUnit<'tcx> {
355362
pub fn items_in_deterministic_order(
356363
&self,
357364
tcx: TyCtxt<'tcx>,
358-
) -> Vec<(MonoItem<'tcx>, (Linkage, Visibility))> {
365+
) -> Vec<(MonoItem<'tcx>, MonoItemData)> {
359366
// The codegen tests rely on items being process in the same order as
360367
// they appear in the file, so for local items, we sort by node_id first
361368
#[derive(PartialEq, Eq, PartialOrd, Ord)]
@@ -390,7 +397,7 @@ impl<'tcx> CodegenUnit<'tcx> {
390397
)
391398
}
392399

393-
let mut items: Vec<_> = self.items().iter().map(|(&i, &l)| (i, l)).collect();
400+
let mut items: Vec<_> = self.items().iter().map(|(&i, &data)| (i, data)).collect();
394401
items.sort_by_cached_key(|&(i, _)| item_sort_key(tcx, i));
395402
items
396403
}

compiler/rustc_monomorphize/src/partitioning.rs

+15-10
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,8 @@ use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags;
107107
use rustc_middle::middle::exported_symbols::{SymbolExportInfo, SymbolExportLevel};
108108
use rustc_middle::mir;
109109
use rustc_middle::mir::mono::{
110-
CodegenUnit, CodegenUnitNameBuilder, InstantiationMode, Linkage, MonoItem, Visibility,
110+
CodegenUnit, CodegenUnitNameBuilder, InstantiationMode, Linkage, MonoItem, MonoItemData,
111+
Visibility,
111112
};
112113
use rustc_middle::query::Providers;
113114
use rustc_middle::ty::print::{characteristic_def_id_of_type, with_no_trimmed_paths};
@@ -257,7 +258,7 @@ where
257258
internalization_candidates.insert(mono_item);
258259
}
259260

260-
cgu.items_mut().insert(mono_item, (linkage, visibility));
261+
cgu.items_mut().insert(mono_item, MonoItemData { linkage, visibility });
261262

262263
// Get all inlined items that are reachable from `mono_item` without
263264
// going via another root item. This includes drop-glue, functions from
@@ -271,7 +272,9 @@ where
271272
// the `insert` will be a no-op.
272273
for inlined_item in reachable_inlined_items {
273274
// This is a CGU-private copy.
274-
cgu.items_mut().insert(inlined_item, (Linkage::Internal, Visibility::Default));
275+
let linkage = Linkage::Internal;
276+
let visibility = Visibility::Default;
277+
cgu.items_mut().insert(inlined_item, MonoItemData { linkage, visibility });
275278
}
276279
}
277280

@@ -492,7 +495,7 @@ fn internalize_symbols<'tcx>(
492495
for cgu in codegen_units {
493496
let home_cgu = MonoItemPlacement::SingleCgu(cgu.name());
494497

495-
for (item, linkage_and_visibility) in cgu.items_mut() {
498+
for (item, data) in cgu.items_mut() {
496499
if !internalization_candidates.contains(item) {
497500
// This item is no candidate for internalizing, so skip it.
498501
continue;
@@ -520,7 +523,8 @@ fn internalize_symbols<'tcx>(
520523

521524
// If we got here, we did not find any uses from other CGUs, so
522525
// it's fine to make this monomorphization internal.
523-
*linkage_and_visibility = (Linkage::Internal, Visibility::Default);
526+
data.linkage = Linkage::Internal;
527+
data.visibility = Visibility::Default;
524528
}
525529
}
526530
}
@@ -537,7 +541,7 @@ fn mark_code_coverage_dead_code_cgu<'tcx>(codegen_units: &mut [CodegenUnit<'tcx>
537541
// function symbols to be included via `-u` or `/include` linker args.
538542
let dead_code_cgu = codegen_units
539543
.iter_mut()
540-
.filter(|cgu| cgu.items().iter().any(|(_, (linkage, _))| *linkage == Linkage::External))
544+
.filter(|cgu| cgu.items().iter().any(|(_, data)| data.linkage == Linkage::External))
541545
.min_by_key(|cgu| cgu.size_estimate());
542546

543547
// If there are no CGUs that have externally linked items, then we just
@@ -937,7 +941,8 @@ fn debug_dump<'a, 'tcx: 'a>(
937941
let _ =
938942
writeln!(s, " - items: {num_items}, mean size: {mean_size:.1}, sizes: {sizes}",);
939943

940-
for (item, linkage) in cgu.items_in_deterministic_order(tcx) {
944+
for (item, data) in cgu.items_in_deterministic_order(tcx) {
945+
let linkage = data.linkage;
941946
let symbol_name = item.symbol_name(tcx).name;
942947
let symbol_hash_start = symbol_name.rfind('h');
943948
let symbol_hash = symbol_hash_start.map_or("<no hash>", |i| &symbol_name[i..]);
@@ -1100,8 +1105,8 @@ fn collect_and_partition_mono_items(tcx: TyCtxt<'_>, (): ()) -> (&DefIdSet, &[Co
11001105
let mut item_to_cgus: FxHashMap<_, Vec<_>> = Default::default();
11011106

11021107
for cgu in codegen_units {
1103-
for (&mono_item, &linkage) in cgu.items() {
1104-
item_to_cgus.entry(mono_item).or_default().push((cgu.name(), linkage));
1108+
for (&mono_item, &data) in cgu.items() {
1109+
item_to_cgus.entry(mono_item).or_default().push((cgu.name(), data.linkage));
11051110
}
11061111
}
11071112

@@ -1114,7 +1119,7 @@ fn collect_and_partition_mono_items(tcx: TyCtxt<'_>, (): ()) -> (&DefIdSet, &[Co
11141119
let cgus = item_to_cgus.get_mut(i).unwrap_or(&mut empty);
11151120
cgus.sort_by_key(|(name, _)| *name);
11161121
cgus.dedup();
1117-
for &(ref cgu_name, (linkage, _)) in cgus.iter() {
1122+
for &(ref cgu_name, linkage) in cgus.iter() {
11181123
output.push(' ');
11191124
output.push_str(cgu_name.as_str());
11201125

0 commit comments

Comments
 (0)