Skip to content

Commit 013591e

Browse files
committed
resolve: Split module_map into two maps for local and extern modules
1 parent c62b248 commit 013591e

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
@@ -102,33 +102,36 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
102102
/// or trait), then this function returns that module's resolver representation, otherwise it
103103
/// returns `None`.
104104
pub(crate) fn get_module(&mut self, def_id: DefId) -> Option<Module<'ra>> {
105-
if let module @ Some(..) = self.module_map.get(&def_id) {
106-
return module.copied();
107-
}
105+
match def_id.as_local() {
106+
Some(local_def_id) => self.local_module_map.get(&local_def_id).copied(),
107+
None => {
108+
if let module @ Some(..) = self.extern_module_map.borrow().get(&def_id) {
109+
return module.copied();
110+
}
108111

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

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

800-
self.parent_scope.module = self.r.new_module(
803+
self.parent_scope.module = self.r.new_local_module(
801804
Some(parent),
802805
ModuleKind::Def(def_kind, def_id, Some(ident.name)),
803806
expansion.to_expn_id(),
@@ -993,7 +996,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
993996
let parent = self.parent_scope.module;
994997
let expansion = self.parent_scope.expansion;
995998
if self.block_needs_anonymous_module(block) {
996-
let module = self.r.new_module(
999+
let module = self.r.new_local_module(
9971000
Some(parent),
9981001
ModuleKind::Block,
9991002
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
@@ -1074,7 +1074,8 @@ pub struct Resolver<'ra, 'tcx> {
10741074
/// some AST passes can generate identifiers that only resolve to local or
10751075
/// lang items.
10761076
empty_module: Module<'ra>,
1077-
module_map: FxIndexMap<DefId, Module<'ra>>,
1077+
local_module_map: FxIndexMap<LocalDefId, Module<'ra>>,
1078+
extern_module_map: RefCell<FxIndexMap<DefId, Module<'ra>>>,
10781079
binding_parent_modules: FxHashMap<NameBinding<'ra>, Module<'ra>>,
10791080

10801081
underscore_disambiguator: u32,
@@ -1255,7 +1256,6 @@ impl<'ra> ResolverArenas<'ra> {
12551256
expn_id: ExpnId,
12561257
span: Span,
12571258
no_implicit_prelude: bool,
1258-
module_map: &mut FxIndexMap<DefId, Module<'ra>>,
12591259
) -> Module<'ra> {
12601260
let (def_id, self_binding) = match kind {
12611261
ModuleKind::Def(def_kind, def_id, _) => (
@@ -1275,9 +1275,6 @@ impl<'ra> ResolverArenas<'ra> {
12751275
if def_id.is_none_or(|def_id| def_id.is_local()) {
12761276
self.local_modules.borrow_mut().push(module);
12771277
}
1278-
if let Some(def_id) = def_id {
1279-
module_map.insert(def_id, module);
1280-
}
12811278
module
12821279
}
12831280
fn local_modules(&'ra self) -> std::cell::Ref<'ra, Vec<Module<'ra>>> {
@@ -1415,22 +1412,21 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
14151412
arenas: &'ra ResolverArenas<'ra>,
14161413
) -> Resolver<'ra, 'tcx> {
14171414
let root_def_id = CRATE_DEF_ID.to_def_id();
1418-
let mut module_map = FxIndexMap::default();
1415+
let mut local_module_map = FxIndexMap::default();
14191416
let graph_root = arenas.new_module(
14201417
None,
14211418
ModuleKind::Def(DefKind::Mod, root_def_id, None),
14221419
ExpnId::root(),
14231420
crate_span,
14241421
attr::contains_name(attrs, sym::no_implicit_prelude),
1425-
&mut module_map,
14261422
);
1423+
local_module_map.insert(CRATE_DEF_ID, graph_root);
14271424
let empty_module = arenas.new_module(
14281425
None,
14291426
ModuleKind::Def(DefKind::Mod, root_def_id, None),
14301427
ExpnId::root(),
14311428
DUMMY_SP,
14321429
true,
1433-
&mut Default::default(),
14341430
);
14351431

14361432
let mut node_id_to_def_id = NodeMap::default();
@@ -1491,7 +1487,8 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
14911487
trait_map: NodeMap::default(),
14921488
underscore_disambiguator: 0,
14931489
empty_module,
1494-
module_map,
1490+
local_module_map,
1491+
extern_module_map: Default::default(),
14951492
block_map: Default::default(),
14961493
binding_parent_modules: FxHashMap::default(),
14971494
ast_transform_scopes: FxHashMap::default(),
@@ -1593,16 +1590,32 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
15931590
resolver
15941591
}
15951592

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

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

0 commit comments

Comments
 (0)