Skip to content

Commit 3438b39

Browse files
petrochenkovLorrensP-2158466
authored andcommitted
resolve: Split module_map into two maps for local and extern modules
1 parent aedf892 commit 3438b39

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> {
@@ -767,7 +770,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
767770
if let ast::ModKind::Loaded(_, _, _, Err(_)) = mod_kind {
768771
self.r.mods_with_parse_errors.insert(def_id);
769772
}
770-
self.parent_scope.module = self.r.new_module(
773+
self.parent_scope.module = self.r.new_local_module(
771774
Some(parent),
772775
ModuleKind::Def(def_kind, def_id, Some(ident.name)),
773776
expansion.to_expn_id(),
@@ -799,7 +802,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
799802
ItemKind::Enum(ident, _, _) | ItemKind::Trait(box ast::Trait { ident, .. }) => {
800803
self.r.define(parent, ident, TypeNS, res, vis, sp, expansion);
801804

802-
self.parent_scope.module = self.r.new_module(
805+
self.parent_scope.module = self.r.new_local_module(
803806
Some(parent),
804807
ModuleKind::Def(def_kind, def_id, Some(ident.name)),
805808
expansion.to_expn_id(),
@@ -995,7 +998,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
995998
let parent = self.parent_scope.module;
996999
let expansion = self.parent_scope.expansion;
9971000
if self.block_needs_anonymous_module(block) {
998-
let module = self.r.new_module(
1001+
let module = self.r.new_local_module(
9991002
Some(parent),
10001003
ModuleKind::Block,
10011004
expansion.to_expn_id(),

compiler/rustc_resolve/src/diagnostics.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2160,7 +2160,16 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
21602160
.keys()
21612161
.map(|ident| ident.name)
21622162
.chain(
2163-
self.module_map
2163+
self.local_module_map
2164+
.iter()
2165+
.filter(|(_, module)| {
2166+
current_module.is_ancestor_of(**module) && current_module != **module
2167+
})
2168+
.flat_map(|(_, module)| module.kind.name()),
2169+
)
2170+
.chain(
2171+
self.extern_module_map
2172+
.borrow()
21642173
.iter()
21652174
.filter(|(_, module)| {
21662175
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,
@@ -1258,7 +1259,6 @@ impl<'ra> ResolverArenas<'ra> {
12581259
expn_id: ExpnId,
12591260
span: Span,
12601261
no_implicit_prelude: bool,
1261-
module_map: &mut FxIndexMap<DefId, Module<'ra>>,
12621262
) -> Module<'ra> {
12631263
let (def_id, self_binding) = match kind {
12641264
ModuleKind::Def(def_kind, def_id, _) => (
@@ -1278,9 +1278,6 @@ impl<'ra> ResolverArenas<'ra> {
12781278
if def_id.is_none_or(|def_id| def_id.is_local()) {
12791279
self.local_modules.borrow_mut().push(module);
12801280
}
1281-
if let Some(def_id) = def_id {
1282-
module_map.insert(def_id, module);
1283-
}
12841281
module
12851282
}
12861283
fn local_modules(&'ra self) -> std::cell::Ref<'ra, Vec<Module<'ra>>> {
@@ -1421,22 +1418,21 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
14211418
arenas: &'ra ResolverArenas<'ra>,
14221419
) -> Resolver<'ra, 'tcx> {
14231420
let root_def_id = CRATE_DEF_ID.to_def_id();
1424-
let mut module_map = FxIndexMap::default();
1421+
let mut local_module_map = FxIndexMap::default();
14251422
let graph_root = arenas.new_module(
14261423
None,
14271424
ModuleKind::Def(DefKind::Mod, root_def_id, None),
14281425
ExpnId::root(),
14291426
crate_span,
14301427
attr::contains_name(attrs, sym::no_implicit_prelude),
1431-
&mut module_map,
14321428
);
1429+
local_module_map.insert(CRATE_DEF_ID, graph_root);
14331430
let empty_module = arenas.new_module(
14341431
None,
14351432
ModuleKind::Def(DefKind::Mod, root_def_id, None),
14361433
ExpnId::root(),
14371434
DUMMY_SP,
14381435
true,
1439-
&mut Default::default(),
14401436
);
14411437

14421438
let mut node_id_to_def_id = NodeMap::default();
@@ -1497,7 +1493,8 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
14971493
trait_map: NodeMap::default(),
14981494
underscore_disambiguator: 0,
14991495
empty_module,
1500-
module_map,
1496+
local_module_map,
1497+
extern_module_map: Default::default(),
15011498
block_map: Default::default(),
15021499
binding_parent_modules: FxHashMap::default(),
15031500
ast_transform_scopes: FxHashMap::default(),
@@ -1601,16 +1598,32 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
16011598
resolver
16021599
}
16031600

1604-
fn new_module(
1601+
fn new_local_module(
1602+
&mut self,
1603+
parent: Option<Module<'ra>>,
1604+
kind: ModuleKind,
1605+
expn_id: ExpnId,
1606+
span: Span,
1607+
no_implicit_prelude: bool,
1608+
) -> Module<'ra> {
1609+
let module = self.arenas.new_module(parent, kind, expn_id, span, no_implicit_prelude);
1610+
if let Some(def_id) = module.opt_def_id() {
1611+
self.local_module_map.insert(def_id.expect_local(), module);
1612+
}
1613+
module
1614+
}
1615+
1616+
fn new_extern_module(
16051617
&mut self,
16061618
parent: Option<Module<'ra>>,
16071619
kind: ModuleKind,
16081620
expn_id: ExpnId,
16091621
span: Span,
16101622
no_implicit_prelude: bool,
16111623
) -> Module<'ra> {
1612-
let module_map = &mut self.module_map;
1613-
self.arenas.new_module(parent, kind, expn_id, span, no_implicit_prelude, module_map)
1624+
let module = self.arenas.new_module(parent, kind, expn_id, span, no_implicit_prelude);
1625+
self.extern_module_map.borrow_mut().insert(module.def_id(), module);
1626+
module
16141627
}
16151628

16161629
fn new_local_macro(&mut self, def_id: LocalDefId, macro_data: MacroData) -> &'ra MacroData {

0 commit comments

Comments
 (0)