Skip to content

Commit 6489ee1

Browse files
committed
Auto merge of #83723 - cjgillot:ownernode, r=petrochenkov
Store all HIR owners in the same container This replaces the previous storage in a BTreeMap for each of Item/ImplItem/TraitItem/ForeignItem. This should allow for a more compact storage. Based on #83114
2 parents 71a6c7c + f798510 commit 6489ee1

File tree

34 files changed

+572
-479
lines changed

34 files changed

+572
-479
lines changed

compiler/rustc_ast_lowering/src/item.rs

+5-11
Original file line numberDiff line numberDiff line change
@@ -82,15 +82,11 @@ impl<'a> Visitor<'a> for ItemLowerer<'a, '_, '_> {
8282
self.lctx.with_hir_id_owner(item.id, |lctx| match ctxt {
8383
AssocCtxt::Trait => {
8484
let hir_item = lctx.lower_trait_item(item);
85-
let id = hir_item.trait_item_id();
86-
lctx.trait_items.insert(id, hir_item);
87-
lctx.modules.entry(lctx.current_module).or_default().trait_items.insert(id);
85+
lctx.insert_trait_item(hir_item);
8886
}
8987
AssocCtxt::Impl => {
9088
let hir_item = lctx.lower_impl_item(item);
91-
let id = hir_item.impl_item_id();
92-
lctx.impl_items.insert(id, hir_item);
93-
lctx.modules.entry(lctx.current_module).or_default().impl_items.insert(id);
89+
lctx.insert_impl_item(hir_item);
9490
}
9591
});
9692

@@ -101,9 +97,7 @@ impl<'a> Visitor<'a> for ItemLowerer<'a, '_, '_> {
10197
self.lctx.allocate_hir_id_counter(item.id);
10298
self.lctx.with_hir_id_owner(item.id, |lctx| {
10399
let hir_item = lctx.lower_foreign_item(item);
104-
let id = hir_item.foreign_item_id();
105-
lctx.foreign_items.insert(id, hir_item);
106-
lctx.modules.entry(lctx.current_module).or_default().foreign_items.insert(id);
100+
lctx.insert_foreign_item(hir_item);
107101
});
108102

109103
visit::walk_foreign_item(self, item);
@@ -123,7 +117,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
123117
) -> T {
124118
let old_len = self.in_scope_lifetimes.len();
125119

126-
let parent_generics = match self.items.get(&parent_hir_id).unwrap().kind {
120+
let parent_generics = match self.owners[parent_hir_id.def_id].unwrap().expect_item().kind {
127121
hir::ItemKind::Impl(hir::Impl { ref generics, .. })
128122
| hir::ItemKind::Trait(_, _, ref generics, ..) => generics.params,
129123
_ => &[],
@@ -224,7 +218,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
224218
let hir_id = self.lower_node_id(i.id);
225219
self.lower_attrs(hir_id, &i.attrs);
226220
let body = P(self.lower_mac_args(body));
227-
self.exported_macros.push(hir::MacroDef {
221+
self.insert_macro_def(hir::MacroDef {
228222
ident,
229223
vis,
230224
def_id: hir_id.expect_owner(),

compiler/rustc_ast_lowering/src/lib.rs

+45-20
Original file line numberDiff line numberDiff line change
@@ -101,13 +101,8 @@ struct LoweringContext<'a, 'hir: 'a> {
101101
arena: &'hir Arena<'hir>,
102102

103103
/// The items being lowered are collected here.
104-
items: BTreeMap<hir::ItemId, hir::Item<'hir>>,
105-
106-
trait_items: BTreeMap<hir::TraitItemId, hir::TraitItem<'hir>>,
107-
impl_items: BTreeMap<hir::ImplItemId, hir::ImplItem<'hir>>,
108-
foreign_items: BTreeMap<hir::ForeignItemId, hir::ForeignItem<'hir>>,
104+
owners: IndexVec<LocalDefId, Option<hir::OwnerNode<'hir>>>,
109105
bodies: BTreeMap<hir::BodyId, hir::Body<'hir>>,
110-
exported_macros: Vec<hir::MacroDef<'hir>>,
111106
non_exported_macro_attrs: Vec<ast::Attribute>,
112107

113108
trait_impls: BTreeMap<DefId, Vec<LocalDefId>>,
@@ -330,15 +325,11 @@ pub fn lower_crate<'a, 'hir>(
330325
resolver,
331326
nt_to_tokenstream,
332327
arena,
333-
items: BTreeMap::new(),
334-
trait_items: BTreeMap::new(),
335-
impl_items: BTreeMap::new(),
336-
foreign_items: BTreeMap::new(),
328+
owners: IndexVec::default(),
337329
bodies: BTreeMap::new(),
338330
trait_impls: BTreeMap::new(),
339331
modules: BTreeMap::new(),
340332
attrs: BTreeMap::default(),
341-
exported_macros: Vec::new(),
342333
non_exported_macro_attrs: Vec::new(),
343334
catch_scopes: Vec::new(),
344335
loop_scopes: Vec::new(),
@@ -521,8 +512,11 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
521512
visit::walk_crate(&mut MiscCollector { lctx: &mut self }, c);
522513
visit::walk_crate(&mut item::ItemLowerer { lctx: &mut self }, c);
523514

524-
let module = self.lower_mod(&c.items, c.span);
515+
let module = self.arena.alloc(self.lower_mod(&c.items, c.span));
525516
self.lower_attrs(hir::CRATE_HIR_ID, &c.attrs);
517+
self.owners.ensure_contains_elem(CRATE_DEF_ID, || None);
518+
self.owners[CRATE_DEF_ID] = Some(hir::OwnerNode::Crate(module));
519+
526520
let body_ids = body_ids(&self.bodies);
527521
let proc_macros =
528522
c.proc_macros.iter().map(|id| self.node_id_to_hir_id[*id].unwrap()).collect();
@@ -557,13 +551,8 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
557551
}
558552

559553
let krate = hir::Crate {
560-
item: module,
561-
exported_macros: self.arena.alloc_from_iter(self.exported_macros),
562554
non_exported_macro_attrs: self.arena.alloc_from_iter(self.non_exported_macro_attrs),
563-
items: self.items,
564-
trait_items: self.trait_items,
565-
impl_items: self.impl_items,
566-
foreign_items: self.foreign_items,
555+
owners: self.owners,
567556
bodies: self.bodies,
568557
body_ids,
569558
trait_impls: self.trait_impls,
@@ -576,12 +565,48 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
576565
}
577566

578567
fn insert_item(&mut self, item: hir::Item<'hir>) -> hir::ItemId {
579-
let id = hir::ItemId { def_id: item.def_id };
580-
self.items.insert(id, item);
568+
let id = item.item_id();
569+
let item = self.arena.alloc(item);
570+
self.owners.ensure_contains_elem(id.def_id, || None);
571+
self.owners[id.def_id] = Some(hir::OwnerNode::Item(item));
581572
self.modules.entry(self.current_module).or_default().items.insert(id);
582573
id
583574
}
584575

576+
fn insert_foreign_item(&mut self, item: hir::ForeignItem<'hir>) -> hir::ForeignItemId {
577+
let id = item.foreign_item_id();
578+
let item = self.arena.alloc(item);
579+
self.owners.ensure_contains_elem(id.def_id, || None);
580+
self.owners[id.def_id] = Some(hir::OwnerNode::ForeignItem(item));
581+
self.modules.entry(self.current_module).or_default().foreign_items.insert(id);
582+
id
583+
}
584+
585+
fn insert_impl_item(&mut self, item: hir::ImplItem<'hir>) -> hir::ImplItemId {
586+
let id = item.impl_item_id();
587+
let item = self.arena.alloc(item);
588+
self.owners.ensure_contains_elem(id.def_id, || None);
589+
self.owners[id.def_id] = Some(hir::OwnerNode::ImplItem(item));
590+
self.modules.entry(self.current_module).or_default().impl_items.insert(id);
591+
id
592+
}
593+
594+
fn insert_trait_item(&mut self, item: hir::TraitItem<'hir>) -> hir::TraitItemId {
595+
let id = item.trait_item_id();
596+
let item = self.arena.alloc(item);
597+
self.owners.ensure_contains_elem(id.def_id, || None);
598+
self.owners[id.def_id] = Some(hir::OwnerNode::TraitItem(item));
599+
self.modules.entry(self.current_module).or_default().trait_items.insert(id);
600+
id
601+
}
602+
603+
fn insert_macro_def(&mut self, item: hir::MacroDef<'hir>) {
604+
let def_id = item.def_id;
605+
let item = self.arena.alloc(item);
606+
self.owners.ensure_contains_elem(def_id, || None);
607+
self.owners[def_id] = Some(hir::OwnerNode::MacroDef(item));
608+
}
609+
585610
fn allocate_hir_id_counter(&mut self, owner: NodeId) -> hir::HirId {
586611
// Set up the counter if needed.
587612
self.item_local_id_counters.entry(owner).or_insert(0);

compiler/rustc_hir/src/arena.rs

+4
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,14 @@ macro_rules! arena_types {
2929
[] fn_decl: rustc_hir::FnDecl<$tcx>,
3030
[] foreign_item: rustc_hir::ForeignItem<$tcx>,
3131
[few] foreign_item_ref: rustc_hir::ForeignItemRef<$tcx>,
32+
[] impl_item: rustc_hir::ImplItem<$tcx>,
3233
[] impl_item_ref: rustc_hir::ImplItemRef<$tcx>,
34+
[] item: rustc_hir::Item<$tcx>,
3335
[few] inline_asm: rustc_hir::InlineAsm<$tcx>,
3436
[few] llvm_inline_asm: rustc_hir::LlvmInlineAsm<$tcx>,
3537
[] local: rustc_hir::Local<$tcx>,
3638
[few] macro_def: rustc_hir::MacroDef<$tcx>,
39+
[few] mod_: rustc_hir::Mod<$tcx>,
3740
[] param: rustc_hir::Param<$tcx>,
3841
[] pat: rustc_hir::Pat<$tcx>,
3942
[] path: rustc_hir::Path<$tcx>,
@@ -42,6 +45,7 @@ macro_rules! arena_types {
4245
[] qpath: rustc_hir::QPath<$tcx>,
4346
[] stmt: rustc_hir::Stmt<$tcx>,
4447
[] field_def: rustc_hir::FieldDef<$tcx>,
48+
[] trait_item: rustc_hir::TraitItem<$tcx>,
4549
[] trait_item_ref: rustc_hir::TraitItemRef,
4650
[] ty: rustc_hir::Ty<$tcx>,
4751
[] type_binding: rustc_hir::TypeBinding<$tcx>,

0 commit comments

Comments
 (0)