Skip to content

Commit ae5959f

Browse files
committed
Consume resolutions for lowering separately.
1 parent 8ffbd81 commit ae5959f

File tree

5 files changed

+59
-36
lines changed

5 files changed

+59
-36
lines changed

compiler/rustc_ast_lowering/src/item.rs

+4-5
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use rustc_hir::def_id::{LocalDefId, CRATE_DEF_ID};
1515
use rustc_hir::definitions::Definitions;
1616
use rustc_hir::PredicateOrigin;
1717
use rustc_index::vec::{Idx, IndexVec};
18-
use rustc_middle::ty::ResolverOutputs;
18+
use rustc_middle::ty::{ResolverAstLowering, ResolverOutputs};
1919
use rustc_session::cstore::CrateStoreDyn;
2020
use rustc_session::Session;
2121
use rustc_span::source_map::DesugaringKind;
@@ -30,7 +30,8 @@ pub(super) struct ItemLowerer<'a, 'hir> {
3030
pub(super) sess: &'a Session,
3131
pub(super) definitions: &'a mut Definitions,
3232
pub(super) cstore: &'a CrateStoreDyn,
33-
pub(super) resolver: &'a mut ResolverOutputs,
33+
pub(super) resolutions: &'a ResolverOutputs,
34+
pub(super) resolver: &'a mut ResolverAstLowering,
3435
pub(super) arena: &'hir Arena<'hir>,
3536
pub(super) ast_index: &'a IndexVec<LocalDefId, AstOwner<'a>>,
3637
pub(super) owners: &'a mut IndexVec<LocalDefId, hir::MaybeOwner<&'hir hir::OwnerInfo<'hir>>>,
@@ -62,12 +63,12 @@ impl<'a, 'hir> ItemLowerer<'a, 'hir> {
6263
owner: NodeId,
6364
f: impl FnOnce(&mut LoweringContext<'_, 'hir>) -> hir::OwnerNode<'hir>,
6465
) {
65-
let next_node_id = self.resolver.next_node_id;
6666
let mut lctx = LoweringContext {
6767
// Pseudo-globals.
6868
sess: &self.sess,
6969
definitions: self.definitions,
7070
cstore: self.cstore,
71+
resolutions: self.resolutions,
7172
resolver: self.resolver,
7273
arena: self.arena,
7374

@@ -80,8 +81,6 @@ impl<'a, 'hir> ItemLowerer<'a, 'hir> {
8081
node_id_to_local_id: Default::default(),
8182
local_id_to_def_id: SortedMap::new(),
8283
trait_map: Default::default(),
83-
local_node_id_to_def_id: FxHashMap::default(),
84-
next_node_id,
8584

8685
// Lowering state.
8786
catch_scope: None,

compiler/rustc_ast_lowering/src/lib.rs

+14-19
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ use rustc_hir::def_id::{LocalDefId, CRATE_DEF_ID};
5656
use rustc_hir::definitions::{DefPathData, Definitions};
5757
use rustc_hir::{ConstArg, GenericArg, ItemLocalId, ParamName, TraitCandidate};
5858
use rustc_index::vec::{Idx, IndexVec};
59-
use rustc_middle::ty::ResolverOutputs;
59+
use rustc_middle::ty::{ResolverAstLowering, ResolverOutputs};
6060
use rustc_query_system::ich::StableHashingContext;
6161
use rustc_session::cstore::CrateStoreDyn;
6262
use rustc_session::parse::feature_err;
@@ -91,7 +91,8 @@ struct LoweringContext<'a, 'hir: 'a> {
9191

9292
definitions: &'a mut Definitions,
9393
cstore: &'a CrateStoreDyn,
94-
resolver: &'a mut ResolverOutputs,
94+
resolutions: &'a ResolverOutputs,
95+
resolver: &'a mut ResolverAstLowering,
9596

9697
/// Used to allocate HIR nodes.
9798
arena: &'hir Arena<'hir>,
@@ -133,10 +134,6 @@ struct LoweringContext<'a, 'hir: 'a> {
133134
/// NodeIds that are lowered inside the current HIR owner.
134135
node_id_to_local_id: FxHashMap<NodeId, hir::ItemLocalId>,
135136

136-
// The next_node_id is reset for each item.
137-
next_node_id: ast::NodeId,
138-
local_node_id_to_def_id: FxHashMap<ast::NodeId, LocalDefId>,
139-
140137
allow_try_trait: Option<Lrc<[Symbol]>>,
141138
allow_gen_future: Option<Lrc<[Symbol]>>,
142139
allow_into_future: Option<Lrc<[Symbol]>>,
@@ -174,7 +171,7 @@ trait ResolverAstLoweringExt {
174171
fn decl_macro_kind(&self, def_id: LocalDefId) -> MacroKind;
175172
}
176173

177-
impl ResolverAstLoweringExt for ResolverOutputs {
174+
impl ResolverAstLoweringExt for ResolverAstLowering {
178175
fn legacy_const_generic_args(&self, expr: &Expr) -> Option<Vec<usize>> {
179176
if let ExprKind::Path(None, path) = &expr.kind {
180177
// Don't perform legacy const generics rewriting if the path already
@@ -415,7 +412,8 @@ pub fn lower_crate<'hir>(
415412
krate: &Crate,
416413
definitions: &mut Definitions,
417414
cstore: &CrateStoreDyn,
418-
resolver: &mut ResolverOutputs,
415+
resolutions: &ResolverOutputs,
416+
mut resolver: ResolverAstLowering,
419417
arena: &'hir Arena<'hir>,
420418
) -> &'hir hir::Crate<'hir> {
421419
let _prof_timer = sess.prof.verbose_generic_activity("hir_lowering");
@@ -430,15 +428,16 @@ pub fn lower_crate<'hir>(
430428
sess,
431429
definitions,
432430
cstore,
433-
resolver,
431+
resolutions,
432+
resolver: &mut resolver,
434433
arena,
435434
ast_index: &ast_index,
436435
owners: &mut owners,
437436
}
438437
.lower_node(def_id);
439438
}
440439

441-
let hir_hash = compute_hir_hash(sess, definitions, cstore, resolver, &owners);
440+
let hir_hash = compute_hir_hash(sess, definitions, cstore, resolutions, &owners);
442441
let krate = hir::Crate { owners, hir_hash };
443442
arena.alloc(krate)
444443
}
@@ -464,7 +463,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
464463
self.sess,
465464
self.definitions,
466465
self.cstore,
467-
&self.resolver.source_span,
466+
&self.resolutions.source_span,
468467
)
469468
}
470469

@@ -489,25 +488,21 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
489488
// we don't need a mapping from `NodeId` to `LocalDefId`.
490489
if node_id != ast::DUMMY_NODE_ID {
491490
debug!("create_def: def_id_to_node_id[{:?}] <-> {:?}", def_id, node_id);
492-
self.local_node_id_to_def_id.insert(node_id, def_id);
491+
self.resolver.node_id_to_def_id.insert(node_id, def_id);
493492
}
494493

495494
def_id
496495
}
497496

498497
fn next_node_id(&mut self) -> NodeId {
499-
let start = self.next_node_id;
498+
let start = self.resolver.next_node_id;
500499
let next = start.as_u32().checked_add(1).expect("input too large; ran out of NodeIds");
501-
self.next_node_id = ast::NodeId::from_u32(next);
500+
self.resolver.next_node_id = ast::NodeId::from_u32(next);
502501
start
503502
}
504503

505504
fn opt_local_def_id(&self, node: NodeId) -> Option<LocalDefId> {
506-
if node <= self.resolver.next_node_id {
507-
self.resolver.node_id_to_def_id.get(&node).copied()
508-
} else {
509-
self.local_node_id_to_def_id.get(&node).copied()
510-
}
505+
self.resolver.node_id_to_def_id.get(&node).copied()
511506
}
512507

513508
fn local_def_id(&self, node: NodeId) -> LocalDefId {

compiler/rustc_interface/src/passes.rs

+24-8
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use rustc_metadata::{encode_metadata, EncodedMetadata};
2121
use rustc_middle::arena::Arena;
2222
use rustc_middle::dep_graph::DepGraph;
2323
use rustc_middle::ty::query::{ExternProviders, Providers};
24-
use rustc_middle::ty::{self, GlobalCtxt, RegisteredTools, ResolverOutputs, TyCtxt};
24+
use rustc_middle::ty::{self, GlobalCtxt, RegisteredTools, TyCtxt};
2525
use rustc_mir_build as mir_build;
2626
use rustc_parse::{parse_crate_from_file, parse_crate_from_source_str, validate_attr};
2727
use rustc_passes::{self, hir_stats, layout_test};
@@ -139,7 +139,8 @@ mod boxed_resolver {
139139

140140
pub fn to_resolver_outputs(
141141
resolver: Rc<RefCell<BoxedResolver>>,
142-
) -> (Definitions, Box<CrateStoreDyn>, ResolverOutputs) {
142+
) -> (Definitions, Box<CrateStoreDyn>, ty::ResolverOutputs, ty::ResolverAstLowering)
143+
{
143144
match Rc::try_unwrap(resolver) {
144145
Ok(resolver) => {
145146
let mut resolver = resolver.into_inner();
@@ -485,13 +486,21 @@ fn lower_to_hir<'tcx>(
485486
sess: &Session,
486487
definitions: &mut Definitions,
487488
cstore: &CrateStoreDyn,
488-
resolver: &mut ResolverOutputs,
489+
resolutions: &ty::ResolverOutputs,
490+
resolver: ty::ResolverAstLowering,
489491
krate: Rc<ast::Crate>,
490492
arena: &'tcx rustc_ast_lowering::Arena<'tcx>,
491493
) -> &'tcx Crate<'tcx> {
492494
// Lower AST to HIR.
493-
let hir_crate =
494-
rustc_ast_lowering::lower_crate(sess, &krate, definitions, cstore, resolver, arena);
495+
let hir_crate = rustc_ast_lowering::lower_crate(
496+
sess,
497+
&krate,
498+
definitions,
499+
cstore,
500+
resolutions,
501+
resolver,
502+
arena,
503+
);
495504

496505
// Drop AST to free memory
497506
sess.time("drop_ast", || std::mem::drop(krate));
@@ -829,14 +838,21 @@ pub fn create_global_ctxt<'tcx>(
829838
// incr. comp. yet.
830839
dep_graph.assert_ignored();
831840

832-
let (mut definitions, cstore, mut resolver_outputs) =
841+
let (mut definitions, cstore, resolver_outputs, resolver_for_lowering) =
833842
BoxedResolver::to_resolver_outputs(resolver);
834843

835844
let sess = &compiler.session();
836845

837846
// Lower AST to HIR.
838-
let krate =
839-
lower_to_hir(sess, &mut definitions, &*cstore, &mut resolver_outputs, krate, hir_arena);
847+
let krate = lower_to_hir(
848+
sess,
849+
&mut definitions,
850+
&*cstore,
851+
&resolver_outputs,
852+
resolver_for_lowering,
853+
krate,
854+
hir_arena,
855+
);
840856

841857
let query_result_on_disk_cache = rustc_incremental::load_query_result_cache(sess);
842858

compiler/rustc_middle/src/ty/mod.rs

+5
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,12 @@ pub struct ResolverOutputs {
160160
/// exist under `std`. For example, wrote `str::from_utf8` instead of `std::str::from_utf8`.
161161
pub confused_type_with_std_module: FxHashMap<Span, Span>,
162162
pub registered_tools: RegisteredTools,
163+
}
163164

165+
/// Resolutions that should only be used for lowering.
166+
/// This struct is meant to be consumed by lowering.
167+
#[derive(Debug)]
168+
pub struct ResolverAstLowering {
164169
pub legacy_const_generic_args: FxHashMap<DefId, Option<Vec<usize>>>,
165170

166171
/// Resolutions for nodes that have a single resolution.

compiler/rustc_resolve/src/lib.rs

+12-4
Original file line numberDiff line numberDiff line change
@@ -1392,7 +1392,9 @@ impl<'a> Resolver<'a> {
13921392
Default::default()
13931393
}
13941394

1395-
pub fn into_outputs(self) -> (Definitions, Box<CrateStoreDyn>, ResolverOutputs) {
1395+
pub fn into_outputs(
1396+
self,
1397+
) -> (Definitions, Box<CrateStoreDyn>, ResolverOutputs, ty::ResolverAstLowering) {
13961398
let proc_macros = self.proc_macros.iter().map(|id| self.local_def_id(*id)).collect();
13971399
let definitions = self.definitions;
13981400
let cstore = Box::new(self.crate_loader.into_cstore());
@@ -1429,6 +1431,8 @@ impl<'a> Resolver<'a> {
14291431
proc_macros,
14301432
confused_type_with_std_module,
14311433
registered_tools: self.registered_tools,
1434+
};
1435+
let resolutions_lowering = ty::ResolverAstLowering {
14321436
legacy_const_generic_args: self.legacy_const_generic_args,
14331437
partial_res_map: self.partial_res_map,
14341438
import_res_map: self.import_res_map,
@@ -1441,10 +1445,12 @@ impl<'a> Resolver<'a> {
14411445
trait_map: self.trait_map,
14421446
builtin_macro_kinds: self.builtin_macro_kinds,
14431447
};
1444-
(definitions, cstore, resolutions)
1448+
(definitions, cstore, resolutions, resolutions_lowering)
14451449
}
14461450

1447-
pub fn clone_outputs(&self) -> (Definitions, Box<CrateStoreDyn>, ResolverOutputs) {
1451+
pub fn clone_outputs(
1452+
&self,
1453+
) -> (Definitions, Box<CrateStoreDyn>, ResolverOutputs, ty::ResolverAstLowering) {
14481454
let proc_macros = self.proc_macros.iter().map(|id| self.local_def_id(*id)).collect();
14491455
let definitions = self.definitions.clone();
14501456
let cstore = Box::new(self.cstore().clone());
@@ -1469,6 +1475,8 @@ impl<'a> Resolver<'a> {
14691475
confused_type_with_std_module: self.confused_type_with_std_module.clone(),
14701476
registered_tools: self.registered_tools.clone(),
14711477
access_levels: self.access_levels.clone(),
1478+
};
1479+
let resolutions_lowering = ty::ResolverAstLowering {
14721480
legacy_const_generic_args: self.legacy_const_generic_args.clone(),
14731481
partial_res_map: self.partial_res_map.clone(),
14741482
import_res_map: self.import_res_map.clone(),
@@ -1481,7 +1489,7 @@ impl<'a> Resolver<'a> {
14811489
trait_map: self.trait_map.clone(),
14821490
builtin_macro_kinds: self.builtin_macro_kinds.clone(),
14831491
};
1484-
(definitions, cstore, resolutions)
1492+
(definitions, cstore, resolutions, resolutions_lowering)
14851493
}
14861494

14871495
fn create_stable_hashing_context(&self) -> StableHashingContext<'_> {

0 commit comments

Comments
 (0)