Skip to content

Commit 372e5b5

Browse files
committed
Querify MonoItem collection
1 parent db034ce commit 372e5b5

File tree

5 files changed

+53
-27
lines changed

5 files changed

+53
-27
lines changed

compiler/rustc_middle/src/mir/mono.rs

+18
Original file line numberDiff line numberDiff line change
@@ -556,3 +556,21 @@ impl<'tcx> CodegenUnitNameBuilder<'tcx> {
556556
Symbol::intern(&cgu_name)
557557
}
558558
}
559+
560+
/// See module-level docs on some contect for "mentioned" items.
561+
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, HashStable)]
562+
pub enum CollectionMode {
563+
/// Collect items that are used, i.e., actually needed for codegen.
564+
///
565+
/// Which items are used can depend on optimization levels, as MIR optimizations can remove
566+
/// uses.
567+
UsedItems,
568+
/// Collect items that are mentioned. The goal of this mode is that it is independent of
569+
/// optimizations: the set of "mentioned" items is computed before optimizations are run.
570+
///
571+
/// The exact contents of this set are *not* a stable guarantee. (For instance, it is currently
572+
/// computed after drop-elaboration. If we ever do some optimizations even in debug builds, we
573+
/// might decide to run them before computing mentioned items.) The key property of this set is
574+
/// that it is optimization-independent.
575+
MentionedItems,
576+
}

compiler/rustc_middle/src/query/erase.rs

+4
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,10 @@ impl<T0, T1> EraseType for (&'_ T0, &'_ [T1]) {
218218
type Result = [u8; size_of::<(&'static (), &'static [()])>()];
219219
}
220220

221+
impl<T0, T1> EraseType for (&'_ [T0], &'_ [T1]) {
222+
type Result = [u8; size_of::<(&'static [()], &'static [()])>()];
223+
}
224+
221225
impl<T0> EraseType for (&'_ T0, Result<(), ErrorGuaranteed>) {
222226
type Result = [u8; size_of::<(&'static (), Result<(), ErrorGuaranteed>)>()];
223227
}

compiler/rustc_middle/src/query/keys.rs

+9
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use rustc_span::{DUMMY_SP, Span};
88
use rustc_target::abi;
99

1010
use crate::infer::canonical::CanonicalQueryInput;
11+
use crate::mir::mono::CollectionMode;
1112
use crate::ty::fast_reject::SimplifiedType;
1213
use crate::ty::layout::{TyAndLayout, ValidityRequirement};
1314
use crate::ty::{self, GenericArg, GenericArgsRef, Ty, TyCtxt};
@@ -591,3 +592,11 @@ impl<'tcx> Key for (ValidityRequirement, ty::ParamEnvAnd<'tcx, Ty<'tcx>>) {
591592
}
592593
}
593594
}
595+
596+
impl<'tcx> Key for (ty::Instance<'tcx>, CollectionMode) {
597+
type Cache<V> = DefaultCache<Self, V>;
598+
599+
fn default_span(&self, _: TyCtxt<'_>) -> Span {
600+
DUMMY_SP
601+
}
602+
}

compiler/rustc_middle/src/query/mod.rs

+7-1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ use rustc_session::cstore::{
4040
};
4141
use rustc_session::lint::LintExpectationId;
4242
use rustc_span::def_id::LOCAL_CRATE;
43+
use rustc_span::source_map::Spanned;
4344
use rustc_span::symbol::Symbol;
4445
use rustc_span::{DUMMY_SP, Span};
4546
use rustc_target::abi;
@@ -60,7 +61,7 @@ use crate::mir::interpret::{
6061
EvalStaticInitializerRawResult, EvalToAllocationRawResult, EvalToConstValueResult,
6162
EvalToValTreeResult, GlobalId, LitToConstError, LitToConstInput,
6263
};
63-
use crate::mir::mono::CodegenUnit;
64+
use crate::mir::mono::{CodegenUnit, CollectionMode, MonoItem};
6465
use crate::query::erase::{Erase, erase, restore};
6566
use crate::query::plumbing::{
6667
CyclePlaceholder, DynamicQuery, query_ensure, query_ensure_error_guaranteed, query_get_at,
@@ -2315,6 +2316,11 @@ rustc_queries! {
23152316
desc { "whether the item should be made inlinable across crates" }
23162317
separate_provide_extern
23172318
}
2319+
2320+
query items_of_instance(key: (ty::Instance<'tcx>, CollectionMode)) -> (&'tcx [Spanned<MonoItem<'tcx>>], &'tcx [Spanned<MonoItem<'tcx>>]) {
2321+
desc { "collecting used items" }
2322+
cache_on_disk_if { true }
2323+
}
23182324
}
23192325

23202326
rustc_query_append! { define_callbacks! }

compiler/rustc_monomorphize/src/collector.rs

+15-26
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ use rustc_hir::def_id::{DefId, DefIdMap, LocalDefId};
218218
use rustc_hir::lang_items::LangItem;
219219
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags;
220220
use rustc_middle::mir::interpret::{AllocId, ErrorHandled, GlobalAlloc, Scalar};
221-
use rustc_middle::mir::mono::{InstantiationMode, MonoItem};
221+
use rustc_middle::mir::mono::{CollectionMode, InstantiationMode, MonoItem};
222222
use rustc_middle::mir::visit::Visitor as MirVisitor;
223223
use rustc_middle::mir::{self, Location, MentionedItem, traversal};
224224
use rustc_middle::query::TyCtxtAt;
@@ -268,24 +268,6 @@ struct SharedState<'tcx> {
268268
usage_map: MTLock<UsageMap<'tcx>>,
269269
}
270270

271-
/// See module-level docs on some contect for "mentioned" items.
272-
#[derive(Copy, Clone, Debug, PartialEq)]
273-
enum CollectionMode {
274-
/// Collect items that are used, i.e., actually needed for codegen.
275-
///
276-
/// Which items are used can depend on optimization levels, as MIR optimizations can remove
277-
/// uses.
278-
UsedItems,
279-
/// Collect items that are mentioned. The goal of this mode is that it is independent of
280-
/// optimizations: the set of "mentioned" items is computed before optimizations are run.
281-
///
282-
/// The exact contents of this set are *not* a stable guarantee. (For instance, it is currently
283-
/// computed after drop-elaboration. If we ever do some optimizations even in debug builds, we
284-
/// might decide to run them before computing mentioned items.) The key property of this set is
285-
/// that it is optimization-independent.
286-
MentionedItems,
287-
}
288-
289271
impl<'tcx> UsageMap<'tcx> {
290272
fn new() -> UsageMap<'tcx> {
291273
UsageMap { used_map: Default::default(), user_map: Default::default() }
@@ -447,13 +429,9 @@ fn collect_items_rec<'tcx>(
447429
));
448430

449431
rustc_data_structures::stack::ensure_sufficient_stack(|| {
450-
collect_items_of_instance(
451-
tcx,
452-
instance,
453-
&mut used_items,
454-
&mut mentioned_items,
455-
mode,
456-
)
432+
let (used, mentioned) = tcx.items_of_instance((instance, mode));
433+
used_items.extend(used);
434+
mentioned_items.extend(mentioned);
457435
});
458436
}
459437
MonoItem::GlobalAsm(item_id) => {
@@ -1253,6 +1231,16 @@ fn collect_items_of_instance<'tcx>(
12531231
}
12541232
}
12551233

1234+
fn items_of_instance<'tcx>(
1235+
tcx: TyCtxt<'tcx>,
1236+
(instance, mode): (Instance<'tcx>, CollectionMode),
1237+
) -> (&'tcx [Spanned<MonoItem<'tcx>>], &'tcx [Spanned<MonoItem<'tcx>>]) {
1238+
let mut used_items = MonoItems::default();
1239+
let mut mentioned_items = MonoItems::default();
1240+
collect_items_of_instance(tcx, instance, &mut used_items, &mut mentioned_items, mode);
1241+
(tcx.arena.alloc_slice(&used_items), tcx.arena.alloc_slice(&mentioned_items))
1242+
}
1243+
12561244
/// `item` must be already monomorphized.
12571245
#[instrument(skip(tcx, span, output), level = "debug")]
12581246
fn visit_mentioned_item<'tcx>(
@@ -1623,4 +1611,5 @@ pub(crate) fn collect_crate_mono_items<'tcx>(
16231611

16241612
pub(crate) fn provide(providers: &mut Providers) {
16251613
providers.hooks.should_codegen_locally = should_codegen_locally;
1614+
providers.items_of_instance = items_of_instance;
16261615
}

0 commit comments

Comments
 (0)