Skip to content

Commit 0959015

Browse files
committed
Split the resolver tables into per-owner tables, starting with node_id_to_def_id
1 parent 1a6ae26 commit 0959015

File tree

12 files changed

+20793
-98
lines changed

12 files changed

+20793
-98
lines changed

compiler/rustc_ast_lowering/src/item.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,10 @@ impl<'a, 'hir> ItemLowerer<'a, 'hir> {
7777
match node {
7878
AstOwner::NonOwner => {}
7979
AstOwner::Crate(c) => {
80-
assert_eq!(self.resolver.node_id_to_def_id[&CRATE_NODE_ID], CRATE_DEF_ID);
80+
assert_eq!(
81+
self.resolver.owners[&CRATE_NODE_ID].node_id_to_def_id[&CRATE_NODE_ID],
82+
CRATE_DEF_ID
83+
);
8184
self.with_lctx(CRATE_NODE_ID, |lctx| {
8285
let module = lctx.lower_mod(&c.items, &c.spans);
8386
// FIXME(jdonszelman): is dummy span ever a problem here?

compiler/rustc_ast_lowering/src/lib.rs

Lines changed: 64 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
3333
// tidy-alphabetical-start
3434
#![feature(box_patterns)]
35+
#![feature(closure_track_caller)]
3536
#![feature(if_let_guard)]
3637
// tidy-alphabetical-end
3738

@@ -58,7 +59,7 @@ use rustc_hir::{
5859
};
5960
use rustc_index::{Idx, IndexSlice, IndexVec};
6061
use rustc_middle::span_bug;
61-
use rustc_middle::ty::{ResolverAstLowering, TyCtxt};
62+
use rustc_middle::ty::{PerOwnerResolverData, ResolverAstLowering, TyCtxt};
6263
use rustc_session::parse::add_feature_diagnostics;
6364
use rustc_span::symbol::{Ident, Symbol, kw, sym};
6465
use rustc_span::{DUMMY_SP, DesugaringKind, Span};
@@ -154,7 +155,10 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
154155
Self {
155156
// Pseudo-globals.
156157
tcx,
157-
resolver: PerOwnerResolver { general: resolver },
158+
resolver: PerOwnerResolver {
159+
general: resolver,
160+
item: PerOwnerResolverData::new(DUMMY_NODE_ID),
161+
},
158162
disambiguator: DisambiguatorState::new(),
159163
arena: tcx.hir_arena,
160164

@@ -234,6 +238,15 @@ impl SpanLowerer {
234238

235239
pub(crate) struct PerOwnerResolver<'a> {
236240
pub general: &'a mut ResolverAstLowering,
241+
pub item: PerOwnerResolverData,
242+
}
243+
244+
impl<'a> std::ops::Deref for PerOwnerResolver<'a> {
245+
type Target = PerOwnerResolverData;
246+
247+
fn deref(&self) -> &Self::Target {
248+
&self.item
249+
}
237250
}
238251

239252
impl PerOwnerResolver<'_> {
@@ -434,17 +447,22 @@ enum TryBlockScope {
434447
}
435448

436449
fn index_crate<'a>(
437-
node_id_to_def_id: &NodeMap<LocalDefId>,
450+
owners: &NodeMap<PerOwnerResolverData>,
438451
krate: &'a Crate,
439452
) -> IndexVec<LocalDefId, AstOwner<'a>> {
440-
let mut indexer = Indexer { node_id_to_def_id, index: IndexVec::new() };
453+
let mut indexer = Indexer {
454+
owners,
455+
node_id_to_def_id: &owners[&CRATE_NODE_ID].node_id_to_def_id,
456+
index: IndexVec::new(),
457+
};
441458
*indexer.index.ensure_contains_elem(CRATE_DEF_ID, || AstOwner::NonOwner) =
442459
AstOwner::Crate(krate);
443460
visit::walk_crate(&mut indexer, krate);
444461
return indexer.index;
445462

446463
struct Indexer<'s, 'a> {
447464
node_id_to_def_id: &'s NodeMap<LocalDefId>,
465+
owners: &'s NodeMap<PerOwnerResolverData>,
448466
index: IndexVec<LocalDefId, AstOwner<'a>>,
449467
}
450468

@@ -455,23 +473,38 @@ fn index_crate<'a>(
455473
}
456474

457475
fn visit_item(&mut self, item: &'a ast::Item) {
476+
let old = std::mem::replace(
477+
&mut self.node_id_to_def_id,
478+
&self.owners[&item.id].node_id_to_def_id,
479+
);
458480
let def_id = self.node_id_to_def_id[&item.id];
459481
*self.index.ensure_contains_elem(def_id, || AstOwner::NonOwner) = AstOwner::Item(item);
460-
visit::walk_item(self, item)
482+
visit::walk_item(self, item);
483+
self.node_id_to_def_id = old;
461484
}
462485

463486
fn visit_assoc_item(&mut self, item: &'a ast::AssocItem, ctxt: visit::AssocCtxt) {
487+
let old = std::mem::replace(
488+
&mut self.node_id_to_def_id,
489+
&self.owners[&item.id].node_id_to_def_id,
490+
);
464491
let def_id = self.node_id_to_def_id[&item.id];
465492
*self.index.ensure_contains_elem(def_id, || AstOwner::NonOwner) =
466493
AstOwner::AssocItem(item, ctxt);
467494
visit::walk_assoc_item(self, item, ctxt);
495+
self.node_id_to_def_id = old;
468496
}
469497

470498
fn visit_foreign_item(&mut self, item: &'a ast::ForeignItem) {
499+
let old = std::mem::replace(
500+
&mut self.node_id_to_def_id,
501+
&self.owners[&item.id].node_id_to_def_id,
502+
);
471503
let def_id = self.node_id_to_def_id[&item.id];
472504
*self.index.ensure_contains_elem(def_id, || AstOwner::NonOwner) =
473505
AstOwner::ForeignItem(item);
474506
visit::walk_item(self, item);
507+
self.node_id_to_def_id = old;
475508
}
476509
}
477510
}
@@ -508,7 +541,7 @@ pub fn lower_to_hir(tcx: TyCtxt<'_>, (): ()) -> hir::Crate<'_> {
508541
tcx.ensure_done().get_lang_items(());
509542
let (mut resolver, krate) = tcx.resolver_for_lowering().steal();
510543

511-
let ast_index = index_crate(&resolver.node_id_to_def_id, &krate);
544+
let ast_index = index_crate(&resolver.owners, &krate);
512545
let mut owners = IndexVec::from_fn_n(
513546
|_| hir::MaybeOwner::Phantom,
514547
tcx.definitions_untracked().def_index_count(),
@@ -592,7 +625,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
592625
.def_id();
593626

594627
debug!("create_def: def_id_to_node_id[{:?}] <-> {:?}", def_id, node_id);
595-
self.resolver.general.node_id_to_def_id.insert(node_id, def_id);
628+
self.resolver.item.node_id_to_def_id.insert(node_id, def_id);
596629

597630
def_id
598631
}
@@ -607,16 +640,29 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
607640
/// Given the id of some node in the AST, finds the `LocalDefId` associated with it by the name
608641
/// resolver (if any).
609642
fn opt_local_def_id(&self, node: NodeId) -> Option<LocalDefId> {
610-
self.resolver.general.node_id_to_def_id.get(&node).copied()
643+
self.resolver.node_id_to_def_id.get(&node).copied()
611644
}
612645

613646
fn local_def_id(&self, node: NodeId) -> LocalDefId {
614-
self.opt_local_def_id(node).unwrap_or_else(|| panic!("no entry for node id: `{node:?}`"))
647+
self.opt_local_def_id(node).unwrap_or_else(|| {
648+
self.resolver.general.owners.items().any(|(id, items)| {
649+
items.node_id_to_def_id.items().any(|(node_id, def_id)| {
650+
if *node_id == node {
651+
panic!(
652+
"{def_id:?} ({node_id}) was found in {:?} ({id})",
653+
items.node_id_to_def_id.get(id),
654+
)
655+
}
656+
false
657+
})
658+
});
659+
panic!("no entry for node id: `{node:?}`");
660+
})
615661
}
616662

617663
/// Given the id of an owner node in the AST, returns the corresponding `OwnerId`.
618664
fn owner_id(&self, node: NodeId) -> hir::OwnerId {
619-
hir::OwnerId { def_id: self.local_def_id(node) }
665+
hir::OwnerId { def_id: self.resolver.general.owners[&node].node_id_to_def_id[&node] }
620666
}
621667

622668
/// Freshen the `LoweringContext` and ready it to lower a nested item.
@@ -635,6 +681,10 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
635681
let current_attrs = std::mem::take(&mut self.attrs);
636682
let current_bodies = std::mem::take(&mut self.bodies);
637683
let current_define_opaque = std::mem::take(&mut self.define_opaque);
684+
let current_ast_owner = std::mem::replace(
685+
&mut self.resolver.item,
686+
self.resolver.general.owners.remove(&owner).unwrap(),
687+
);
638688
let current_ident_and_label_to_local_id =
639689
std::mem::take(&mut self.ident_and_label_to_local_id);
640690

@@ -682,6 +732,10 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
682732
self.impl_trait_bounds = current_impl_trait_bounds;
683733
self.delayed_lints = current_delayed_lints;
684734

735+
let _prev_owner_data = std::mem::replace(&mut self.resolver.item, current_ast_owner);
736+
#[cfg(debug_assertions)]
737+
self.resolver.general.owners.insert(owner, _prev_owner_data);
738+
685739
debug_assert!(!self.children.iter().any(|(id, _)| id == &owner_id.def_id));
686740
self.children.push((owner_id.def_id, hir::MaybeOwner::Owner(info)));
687741
}

compiler/rustc_expand/src/base.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1192,6 +1192,13 @@ pub trait ResolverExpand {
11921192
/// Mark the scope as having a compile error so that error for lookup in this scope
11931193
/// should be suppressed
11941194
fn mark_scope_with_compile_error(&mut self, parent_node: NodeId);
1195+
1196+
/// Set a new owner and return the old one. Use only in the implementation
1197+
/// of `with_owner` and always call [Self::reset_owner] afterwards
1198+
fn set_owner(&mut self, id: NodeId) -> NodeId;
1199+
1200+
/// Switch back to the original owner.
1201+
fn reset_owner(&mut self, id: NodeId);
11951202
}
11961203

11971204
pub trait LintStoreExpand {

compiler/rustc_expand/src/expand.rs

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ use rustc_ast::tokenstream::TokenStream;
88
use rustc_ast::visit::{self, AssocCtxt, Visitor, VisitorResult, try_visit, walk_list};
99
use rustc_ast::{
1010
self as ast, AssocItemKind, AstNodeWrapper, AttrArgs, AttrItemKind, AttrStyle, AttrVec,
11-
DUMMY_NODE_ID, EarlyParsedAttribute, ExprKind, ForeignItemKind, HasAttrs, HasNodeId, Inline,
12-
ItemKind, MacStmtStyle, MetaItemInner, MetaItemKind, ModKind, NodeId, PatKind, StmtKind,
13-
TyKind, token,
11+
CRATE_NODE_ID, DUMMY_NODE_ID, EarlyParsedAttribute, ExprKind, ForeignItemKind, HasAttrs,
12+
HasNodeId, Inline, ItemKind, MacStmtStyle, MetaItemInner, MetaItemKind, ModKind, NodeId,
13+
PatKind, StmtKind, TyKind, token,
1414
};
1515
use rustc_ast_pretty::pprust;
1616
use rustc_attr_parsing::{
@@ -2385,34 +2385,45 @@ impl<'a, 'b> InvocationCollector<'a, 'b> {
23852385
};
23862386
}
23872387
}
2388+
2389+
fn with_owner<T>(&mut self, id: NodeId, f: impl FnOnce(&mut Self) -> T) -> T {
2390+
if id == DUMMY_NODE_ID {
2391+
f(self)
2392+
} else {
2393+
let old = self.cx.resolver.set_owner(id);
2394+
let val = f(self);
2395+
self.cx.resolver.reset_owner(old);
2396+
val
2397+
}
2398+
}
23882399
}
23892400

23902401
impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> {
23912402
fn flat_map_item(&mut self, node: Box<ast::Item>) -> SmallVec<[Box<ast::Item>; 1]> {
2392-
self.flat_map_node(node)
2403+
self.with_owner(node.id, |this| this.flat_map_node(node))
23932404
}
23942405

23952406
fn flat_map_assoc_item(
23962407
&mut self,
23972408
node: Box<ast::AssocItem>,
23982409
ctxt: AssocCtxt,
23992410
) -> SmallVec<[Box<ast::AssocItem>; 1]> {
2400-
match ctxt {
2401-
AssocCtxt::Trait => self.flat_map_node(AstNodeWrapper::new(node, TraitItemTag)),
2411+
self.with_owner(node.id, |this| match ctxt {
2412+
AssocCtxt::Trait => this.flat_map_node(AstNodeWrapper::new(node, TraitItemTag)),
24022413
AssocCtxt::Impl { of_trait: false, .. } => {
2403-
self.flat_map_node(AstNodeWrapper::new(node, ImplItemTag))
2414+
this.flat_map_node(AstNodeWrapper::new(node, ImplItemTag))
24042415
}
24052416
AssocCtxt::Impl { of_trait: true, .. } => {
2406-
self.flat_map_node(AstNodeWrapper::new(node, TraitImplItemTag))
2417+
this.flat_map_node(AstNodeWrapper::new(node, TraitImplItemTag))
24072418
}
2408-
}
2419+
})
24092420
}
24102421

24112422
fn flat_map_foreign_item(
24122423
&mut self,
24132424
node: Box<ast::ForeignItem>,
24142425
) -> SmallVec<[Box<ast::ForeignItem>; 1]> {
2415-
self.flat_map_node(node)
2426+
self.with_owner(node.id, |this| this.flat_map_node(node))
24162427
}
24172428

24182429
fn flat_map_variant(&mut self, node: ast::Variant) -> SmallVec<[ast::Variant; 1]> {
@@ -2483,7 +2494,7 @@ impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> {
24832494
}
24842495

24852496
fn visit_crate(&mut self, node: &mut ast::Crate) {
2486-
self.visit_node(node)
2497+
self.with_owner(CRATE_NODE_ID, |this| this.visit_node(node))
24872498
}
24882499

24892500
fn visit_ty(&mut self, node: &mut ast::Ty) {

compiler/rustc_interface/src/passes.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ fn configure_and_expand(
211211
};
212212

213213
let lint_store = LintStoreExpandImpl(lint_store);
214-
let mut ecx = ExtCtxt::new(sess, cfg, resolver, Some(&lint_store));
214+
let mut ecx: ExtCtxt<'_> = ExtCtxt::new(sess, cfg, resolver, Some(&lint_store));
215215
ecx.num_standard_library_imports = num_standard_library_imports;
216216
// Expand macros now!
217217
let krate = sess.time("expand_crate", || ecx.monotonic_expander().expand_crate(krate));

compiler/rustc_middle/src/ty/mod.rs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,19 @@ pub struct ResolverGlobalCtxt {
192192
pub stripped_cfg_items: Vec<StrippedCfgItem>,
193193
}
194194

195+
#[derive(Debug)]
196+
pub struct PerOwnerResolverData {
197+
pub node_id_to_def_id: NodeMap<LocalDefId>,
198+
/// The id of the owner
199+
pub id: ast::NodeId,
200+
}
201+
202+
impl PerOwnerResolverData {
203+
pub fn new(id: ast::NodeId) -> Self {
204+
Self { node_id_to_def_id: Default::default(), id }
205+
}
206+
}
207+
195208
/// Resolutions that should only be used for lowering.
196209
/// This struct is meant to be consumed by lowering.
197210
#[derive(Debug)]
@@ -207,9 +220,9 @@ pub struct ResolverAstLowering {
207220
/// Lifetime parameters that lowering will have to introduce.
208221
pub extra_lifetime_params_map: NodeMap<Vec<(Ident, ast::NodeId, LifetimeRes)>>,
209222

210-
pub next_node_id: ast::NodeId,
223+
pub owners: NodeMap<PerOwnerResolverData>,
211224

212-
pub node_id_to_def_id: NodeMap<LocalDefId>,
225+
pub next_node_id: ast::NodeId,
213226

214227
pub trait_map: NodeMap<Vec<hir::TraitCandidate>>,
215228
/// List functions and methods for which lifetime elision was successful.

compiler/rustc_passes/src/lang_items.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,7 @@ impl<'ast, 'tcx> visit::Visitor<'ast> for LanguageItemCollector<'ast, 'tcx> {
296296

297297
self.check_for_lang(
298298
target,
299-
self.resolver.node_id_to_def_id[&i.id],
299+
self.resolver.owners[&i.id].node_id_to_def_id[&i.id],
300300
&i.attrs,
301301
i.span,
302302
i.opt_generics(),
@@ -310,7 +310,7 @@ impl<'ast, 'tcx> visit::Visitor<'ast> for LanguageItemCollector<'ast, 'tcx> {
310310
fn visit_variant(&mut self, variant: &'ast ast::Variant) {
311311
self.check_for_lang(
312312
Target::Variant,
313-
self.resolver.node_id_to_def_id[&variant.id],
313+
self.resolver.owners[&self.parent_item.unwrap().id].node_id_to_def_id[&variant.id],
314314
&variant.attrs,
315315
variant.span,
316316
None,
@@ -349,7 +349,7 @@ impl<'ast, 'tcx> visit::Visitor<'ast> for LanguageItemCollector<'ast, 'tcx> {
349349

350350
self.check_for_lang(
351351
target,
352-
self.resolver.node_id_to_def_id[&i.id],
352+
self.resolver.owners[&i.id].node_id_to_def_id[&i.id],
353353
&i.attrs,
354354
i.span,
355355
generics,

0 commit comments

Comments
 (0)