Skip to content

Commit 8b8889d

Browse files
committed
resolve: Split module_map into two maps for local and extern modules
1 parent 8d71939 commit 8b8889d

File tree

3 files changed

+69
-41
lines changed

3 files changed

+69
-41
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> {
@@ -758,7 +761,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
758761
if let ast::ModKind::Loaded(_, _, _, Err(_)) = mod_kind {
759762
self.r.mods_with_parse_errors.insert(def_id);
760763
}
761-
self.parent_scope.module = self.r.new_module(
764+
self.parent_scope.module = self.r.new_local_module(
762765
Some(parent),
763766
ModuleKind::Def(def_kind, def_id, Some(ident.name)),
764767
expansion.to_expn_id(),
@@ -790,7 +793,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
790793
ItemKind::Enum(ident, _, _) | ItemKind::Trait(box ast::Trait { ident, .. }) => {
791794
self.r.define(parent, ident, TypeNS, res, vis, sp, expansion);
792795

793-
self.parent_scope.module = self.r.new_module(
796+
self.parent_scope.module = self.r.new_local_module(
794797
Some(parent),
795798
ModuleKind::Def(def_kind, def_id, Some(ident.name)),
796799
expansion.to_expn_id(),
@@ -986,7 +989,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
986989
let parent = self.parent_scope.module;
987990
let expansion = self.parent_scope.expansion;
988991
if self.block_needs_anonymous_module(block) {
989-
let module = self.r.new_module(
992+
let module = self.r.new_local_module(
990993
Some(parent),
991994
ModuleKind::Block,
992995
expansion.to_expn_id(),

compiler/rustc_resolve/src/diagnostics.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2159,7 +2159,16 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
21592159
.keys()
21602160
.map(|ident| ident.name)
21612161
.chain(
2162-
self.module_map
2162+
self.local_module_map
2163+
.iter()
2164+
.filter(|(_, module)| {
2165+
current_module.is_ancestor_of(**module) && current_module != **module
2166+
})
2167+
.flat_map(|(_, module)| module.kind.name()),
2168+
)
2169+
.chain(
2170+
self.extern_module_map
2171+
.borrow()
21632172
.iter()
21642173
.filter(|(_, module)| {
21652174
current_module.is_ancestor_of(**module) && current_module != **module

compiler/rustc_resolve/src/lib.rs

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1081,7 +1081,10 @@ pub struct Resolver<'ra, 'tcx> {
10811081
/// some AST passes can generate identifiers that only resolve to local or
10821082
/// lang items.
10831083
empty_module: Module<'ra>,
1084-
module_map: FxIndexMap<DefId, Module<'ra>>,
1084+
/// Eagerly populated map of all local non-block modules.
1085+
local_module_map: FxIndexMap<LocalDefId, Module<'ra>>,
1086+
/// Lazily populated cache of modules loaded from external crates.
1087+
extern_module_map: RefCell<FxIndexMap<DefId, Module<'ra>>>,
10851088
binding_parent_modules: FxHashMap<NameBinding<'ra>, Module<'ra>>,
10861089

10871090
underscore_disambiguator: u32,
@@ -1112,8 +1115,9 @@ pub struct Resolver<'ra, 'tcx> {
11121115
builtin_macros: FxHashMap<Symbol, SyntaxExtensionKind>,
11131116
registered_tools: &'tcx RegisteredTools,
11141117
macro_use_prelude: FxIndexMap<Symbol, NameBinding<'ra>>,
1118+
/// Eagerly populated map of all local macro definitions.
11151119
local_macro_map: FxHashMap<LocalDefId, &'ra MacroData>,
1116-
/// Lazily populated cache of macros loaded from external crates.
1120+
/// Lazily populated cache of macro definitions loaded from external crates.
11171121
extern_macro_map: RefCell<FxHashMap<DefId, &'ra MacroData>>,
11181122
dummy_ext_bang: Arc<SyntaxExtension>,
11191123
dummy_ext_derive: Arc<SyntaxExtension>,
@@ -1265,7 +1269,6 @@ impl<'ra> ResolverArenas<'ra> {
12651269
expn_id: ExpnId,
12661270
span: Span,
12671271
no_implicit_prelude: bool,
1268-
module_map: &mut FxIndexMap<DefId, Module<'ra>>,
12691272
) -> Module<'ra> {
12701273
let (def_id, self_binding) = match kind {
12711274
ModuleKind::Def(def_kind, def_id, _) => (
@@ -1285,9 +1288,6 @@ impl<'ra> ResolverArenas<'ra> {
12851288
if def_id.is_none_or(|def_id| def_id.is_local()) {
12861289
self.local_modules.borrow_mut().push(module);
12871290
}
1288-
if let Some(def_id) = def_id {
1289-
module_map.insert(def_id, module);
1290-
}
12911291
module
12921292
}
12931293
fn local_modules(&'ra self) -> std::cell::Ref<'ra, Vec<Module<'ra>>> {
@@ -1428,22 +1428,21 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
14281428
arenas: &'ra ResolverArenas<'ra>,
14291429
) -> Resolver<'ra, 'tcx> {
14301430
let root_def_id = CRATE_DEF_ID.to_def_id();
1431-
let mut module_map = FxIndexMap::default();
1431+
let mut local_module_map = FxIndexMap::default();
14321432
let graph_root = arenas.new_module(
14331433
None,
14341434
ModuleKind::Def(DefKind::Mod, root_def_id, None),
14351435
ExpnId::root(),
14361436
crate_span,
14371437
attr::contains_name(attrs, sym::no_implicit_prelude),
1438-
&mut module_map,
14391438
);
1439+
local_module_map.insert(CRATE_DEF_ID, graph_root);
14401440
let empty_module = arenas.new_module(
14411441
None,
14421442
ModuleKind::Def(DefKind::Mod, root_def_id, None),
14431443
ExpnId::root(),
14441444
DUMMY_SP,
14451445
true,
1446-
&mut Default::default(),
14471446
);
14481447

14491448
let mut node_id_to_def_id = NodeMap::default();
@@ -1504,7 +1503,8 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
15041503
trait_map: NodeMap::default(),
15051504
underscore_disambiguator: 0,
15061505
empty_module,
1507-
module_map,
1506+
local_module_map,
1507+
extern_module_map: Default::default(),
15081508
block_map: Default::default(),
15091509
binding_parent_modules: FxHashMap::default(),
15101510
ast_transform_scopes: FxHashMap::default(),
@@ -1608,16 +1608,32 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
16081608
resolver
16091609
}
16101610

1611-
fn new_module(
1611+
fn new_local_module(
1612+
&mut self,
1613+
parent: Option<Module<'ra>>,
1614+
kind: ModuleKind,
1615+
expn_id: ExpnId,
1616+
span: Span,
1617+
no_implicit_prelude: bool,
1618+
) -> Module<'ra> {
1619+
let module = self.arenas.new_module(parent, kind, expn_id, span, no_implicit_prelude);
1620+
if let Some(def_id) = module.opt_def_id() {
1621+
self.local_module_map.insert(def_id.expect_local(), module);
1622+
}
1623+
module
1624+
}
1625+
1626+
fn new_extern_module(
16121627
&mut self,
16131628
parent: Option<Module<'ra>>,
16141629
kind: ModuleKind,
16151630
expn_id: ExpnId,
16161631
span: Span,
16171632
no_implicit_prelude: bool,
16181633
) -> Module<'ra> {
1619-
let module_map = &mut self.module_map;
1620-
self.arenas.new_module(parent, kind, expn_id, span, no_implicit_prelude, module_map)
1634+
let module = self.arenas.new_module(parent, kind, expn_id, span, no_implicit_prelude);
1635+
self.extern_module_map.borrow_mut().insert(module.def_id(), module);
1636+
module
16211637
}
16221638

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

0 commit comments

Comments
 (0)