Skip to content

Commit 27bb8f1

Browse files
committed
resolve: Split module_map into two maps for local and extern modules
1 parent 3ed7e6f commit 27bb8f1

File tree

3 files changed

+65
-40
lines changed

3 files changed

+65
-40
lines changed

compiler/rustc_resolve/src/build_reduced_graph.rs

Lines changed: 30 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -101,33 +101,36 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
101101
/// or trait), then this function returns that module's resolver representation, otherwise it
102102
/// returns `None`.
103103
pub(crate) fn get_module(&mut self, def_id: DefId) -> Option<Module<'ra>> {
104-
if let module @ Some(..) = self.module_map.get(&def_id) {
105-
return module.copied();
106-
}
104+
match def_id.as_local() {
105+
Some(local_def_id) => self.local_module_map.get(&local_def_id).copied(),
106+
None => {
107+
if let module @ Some(..) = self.extern_module_map.borrow().get(&def_id) {
108+
return module.copied();
109+
}
107110

108-
if !def_id.is_local() {
109-
// Query `def_kind` is not used because query system overhead is too expensive here.
110-
let def_kind = self.cstore().def_kind_untracked(def_id);
111-
if def_kind.is_module_like() {
112-
let parent = self
113-
.tcx
114-
.opt_parent(def_id)
115-
.map(|parent_id| self.get_nearest_non_block_module(parent_id));
116-
// Query `expn_that_defined` is not used because
117-
// hashing spans in its result is expensive.
118-
let expn_id = self.cstore().expn_that_defined_untracked(def_id, self.tcx.sess);
119-
return Some(self.new_module(
120-
parent,
121-
ModuleKind::Def(def_kind, def_id, Some(self.tcx.item_name(def_id))),
122-
expn_id,
123-
self.def_span(def_id),
124-
// FIXME: Account for `#[no_implicit_prelude]` attributes.
125-
parent.is_some_and(|module| module.no_implicit_prelude),
126-
));
111+
// Query `def_kind` is not used because query system overhead is too expensive here.
112+
let def_kind = self.cstore().def_kind_untracked(def_id);
113+
if def_kind.is_module_like() {
114+
let parent = self
115+
.tcx
116+
.opt_parent(def_id)
117+
.map(|parent_id| self.get_nearest_non_block_module(parent_id));
118+
// Query `expn_that_defined` is not used because
119+
// hashing spans in its result is expensive.
120+
let expn_id = self.cstore().expn_that_defined_untracked(def_id, self.tcx.sess);
121+
return Some(self.new_extern_module(
122+
parent,
123+
ModuleKind::Def(def_kind, def_id, Some(self.tcx.item_name(def_id))),
124+
expn_id,
125+
self.def_span(def_id),
126+
// FIXME: Account for `#[no_implicit_prelude]` attributes.
127+
parent.is_some_and(|module| module.no_implicit_prelude),
128+
));
129+
}
130+
131+
None
127132
}
128133
}
129-
130-
None
131134
}
132135

133136
pub(crate) fn expn_def_scope(&mut self, expn_id: ExpnId) -> Module<'ra> {
@@ -764,7 +767,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
764767
if let ast::ModKind::Loaded(_, _, _, Err(_)) = mod_kind {
765768
self.r.mods_with_parse_errors.insert(def_id);
766769
}
767-
self.parent_scope.module = self.r.new_module(
770+
self.parent_scope.module = self.r.new_local_module(
768771
Some(parent),
769772
ModuleKind::Def(def_kind, def_id, Some(ident.name)),
770773
expansion.to_expn_id(),
@@ -796,7 +799,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
796799
ItemKind::Enum(ident, _, _) | ItemKind::Trait(box ast::Trait { ident, .. }) => {
797800
self.r.define(parent, ident, TypeNS, res, vis, sp, expansion);
798801

799-
self.parent_scope.module = self.r.new_module(
802+
self.parent_scope.module = self.r.new_local_module(
800803
Some(parent),
801804
ModuleKind::Def(def_kind, def_id, Some(ident.name)),
802805
expansion.to_expn_id(),
@@ -992,7 +995,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
992995
let parent = self.parent_scope.module;
993996
let expansion = self.parent_scope.expansion;
994997
if self.block_needs_anonymous_module(block) {
995-
let module = self.r.new_module(
998+
let module = self.r.new_local_module(
996999
Some(parent),
9971000
ModuleKind::Block,
9981001
expansion.to_expn_id(),

compiler/rustc_resolve/src/diagnostics.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2155,7 +2155,16 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
21552155
.keys()
21562156
.map(|ident| ident.name)
21572157
.chain(
2158-
self.module_map
2158+
self.local_module_map
2159+
.iter()
2160+
.filter(|(_, module)| {
2161+
current_module.is_ancestor_of(**module) && current_module != **module
2162+
})
2163+
.flat_map(|(_, module)| module.kind.name()),
2164+
)
2165+
.chain(
2166+
self.extern_module_map
2167+
.borrow()
21592168
.iter()
21602169
.filter(|(_, module)| {
21612170
current_module.is_ancestor_of(**module) && current_module != **module

compiler/rustc_resolve/src/lib.rs

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1073,7 +1073,8 @@ pub struct Resolver<'ra, 'tcx> {
10731073
/// some AST passes can generate identifiers that only resolve to local or
10741074
/// lang items.
10751075
empty_module: Module<'ra>,
1076-
module_map: FxIndexMap<DefId, Module<'ra>>,
1076+
local_module_map: FxIndexMap<LocalDefId, Module<'ra>>,
1077+
extern_module_map: RefCell<FxIndexMap<DefId, Module<'ra>>>,
10771078
binding_parent_modules: FxHashMap<NameBinding<'ra>, Module<'ra>>,
10781079

10791080
underscore_disambiguator: u32,
@@ -1254,7 +1255,6 @@ impl<'ra> ResolverArenas<'ra> {
12541255
expn_id: ExpnId,
12551256
span: Span,
12561257
no_implicit_prelude: bool,
1257-
module_map: &mut FxIndexMap<DefId, Module<'ra>>,
12581258
) -> Module<'ra> {
12591259
let (def_id, self_binding) = match kind {
12601260
ModuleKind::Def(def_kind, def_id, _) => (
@@ -1274,9 +1274,6 @@ impl<'ra> ResolverArenas<'ra> {
12741274
if def_id.is_none_or(|def_id| def_id.is_local()) {
12751275
self.local_modules.borrow_mut().push(module);
12761276
}
1277-
if let Some(def_id) = def_id {
1278-
module_map.insert(def_id, module);
1279-
}
12801277
module
12811278
}
12821279
fn local_modules(&'ra self) -> std::cell::Ref<'ra, Vec<Module<'ra>>> {
@@ -1414,22 +1411,21 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
14141411
arenas: &'ra ResolverArenas<'ra>,
14151412
) -> Resolver<'ra, 'tcx> {
14161413
let root_def_id = CRATE_DEF_ID.to_def_id();
1417-
let mut module_map = FxIndexMap::default();
1414+
let mut local_module_map = FxIndexMap::default();
14181415
let graph_root = arenas.new_module(
14191416
None,
14201417
ModuleKind::Def(DefKind::Mod, root_def_id, None),
14211418
ExpnId::root(),
14221419
crate_span,
14231420
attr::contains_name(attrs, sym::no_implicit_prelude),
1424-
&mut module_map,
14251421
);
1422+
local_module_map.insert(CRATE_DEF_ID, graph_root);
14261423
let empty_module = arenas.new_module(
14271424
None,
14281425
ModuleKind::Def(DefKind::Mod, root_def_id, None),
14291426
ExpnId::root(),
14301427
DUMMY_SP,
14311428
true,
1432-
&mut Default::default(),
14331429
);
14341430

14351431
let mut node_id_to_def_id = NodeMap::default();
@@ -1490,7 +1486,8 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
14901486
trait_map: NodeMap::default(),
14911487
underscore_disambiguator: 0,
14921488
empty_module,
1493-
module_map,
1489+
local_module_map,
1490+
extern_module_map: Default::default(),
14941491
block_map: Default::default(),
14951492
binding_parent_modules: FxHashMap::default(),
14961493
ast_transform_scopes: FxHashMap::default(),
@@ -1592,16 +1589,32 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
15921589
resolver
15931590
}
15941591

1595-
fn new_module(
1592+
fn new_local_module(
1593+
&mut self,
1594+
parent: Option<Module<'ra>>,
1595+
kind: ModuleKind,
1596+
expn_id: ExpnId,
1597+
span: Span,
1598+
no_implicit_prelude: bool,
1599+
) -> Module<'ra> {
1600+
let module = self.arenas.new_module(parent, kind, expn_id, span, no_implicit_prelude);
1601+
if let Some(def_id) = module.opt_def_id() {
1602+
self.local_module_map.insert(def_id.expect_local(), module);
1603+
}
1604+
module
1605+
}
1606+
1607+
fn new_extern_module(
15961608
&mut self,
15971609
parent: Option<Module<'ra>>,
15981610
kind: ModuleKind,
15991611
expn_id: ExpnId,
16001612
span: Span,
16011613
no_implicit_prelude: bool,
16021614
) -> Module<'ra> {
1603-
let module_map = &mut self.module_map;
1604-
self.arenas.new_module(parent, kind, expn_id, span, no_implicit_prelude, module_map)
1615+
let module = self.arenas.new_module(parent, kind, expn_id, span, no_implicit_prelude);
1616+
self.extern_module_map.borrow_mut().insert(module.def_id(), module);
1617+
module
16051618
}
16061619

16071620
fn next_node_id(&mut self) -> NodeId {

0 commit comments

Comments
 (0)