Skip to content

Commit 2cd36f2

Browse files
committed
Generate crate loaders on the fly
1 parent 4b08fba commit 2cd36f2

File tree

7 files changed

+67
-54
lines changed

7 files changed

+67
-54
lines changed

compiler/rustc_metadata/src/creader.rs

+31-29
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,12 @@ impl std::fmt::Debug for CStore {
6868
pub struct CrateLoader<'a> {
6969
// Immutable configuration.
7070
sess: &'a Session,
71-
metadata_loader: Box<MetadataLoaderDyn>,
71+
metadata_loader: &'a MetadataLoaderDyn,
72+
definitions: &'a Definitions,
7273
local_crate_name: Symbol,
7374
// Mutable output.
74-
cstore: CStore,
75-
used_extern_options: FxHashSet<Symbol>,
75+
cstore: &'a mut CStore,
76+
used_extern_options: &'a mut FxHashSet<Symbol>,
7677
}
7778

7879
pub enum LoadedMacro {
@@ -239,47 +240,49 @@ impl CStore {
239240
);
240241
}
241242
}
243+
244+
pub fn new(sess: &Session) -> CStore {
245+
let mut stable_crate_ids = FxHashMap::default();
246+
stable_crate_ids.insert(sess.local_stable_crate_id(), LOCAL_CRATE);
247+
CStore {
248+
// We add an empty entry for LOCAL_CRATE (which maps to zero) in
249+
// order to make array indices in `metas` match with the
250+
// corresponding `CrateNum`. This first entry will always remain
251+
// `None`.
252+
metas: IndexVec::from_elem_n(None, 1),
253+
injected_panic_runtime: None,
254+
allocator_kind: None,
255+
alloc_error_handler_kind: None,
256+
has_global_allocator: false,
257+
has_alloc_error_handler: false,
258+
stable_crate_ids,
259+
unused_externs: Vec::new(),
260+
}
261+
}
242262
}
243263

244264
impl<'a> CrateLoader<'a> {
245265
pub fn new(
246266
sess: &'a Session,
247-
metadata_loader: Box<MetadataLoaderDyn>,
267+
metadata_loader: &'a MetadataLoaderDyn,
248268
local_crate_name: Symbol,
269+
cstore: &'a mut CStore,
270+
definitions: &'a Definitions,
271+
used_extern_options: &'a mut FxHashSet<Symbol>,
249272
) -> Self {
250-
let mut stable_crate_ids = FxHashMap::default();
251-
stable_crate_ids.insert(sess.local_stable_crate_id(), LOCAL_CRATE);
252-
253273
CrateLoader {
254274
sess,
255275
metadata_loader,
256276
local_crate_name,
257-
cstore: CStore {
258-
// We add an empty entry for LOCAL_CRATE (which maps to zero) in
259-
// order to make array indices in `metas` match with the
260-
// corresponding `CrateNum`. This first entry will always remain
261-
// `None`.
262-
metas: IndexVec::from_elem_n(None, 1),
263-
injected_panic_runtime: None,
264-
allocator_kind: None,
265-
alloc_error_handler_kind: None,
266-
has_global_allocator: false,
267-
has_alloc_error_handler: false,
268-
stable_crate_ids,
269-
unused_externs: Vec::new(),
270-
},
271-
used_extern_options: Default::default(),
277+
cstore,
278+
used_extern_options,
279+
definitions,
272280
}
273281
}
274-
275282
pub fn cstore(&self) -> &CStore {
276283
&self.cstore
277284
}
278285

279-
pub fn into_cstore(self) -> CStore {
280-
self.cstore
281-
}
282-
283286
fn existing_match(&self, name: Symbol, hash: Option<Svh>, kind: PathKind) -> Option<CrateNum> {
284287
for (cnum, data) in self.cstore.iter_crate_data() {
285288
if data.name() != name {
@@ -989,7 +992,6 @@ impl<'a> CrateLoader<'a> {
989992
pub fn process_extern_crate(
990993
&mut self,
991994
item: &ast::Item,
992-
definitions: &Definitions,
993995
def_id: LocalDefId,
994996
) -> Option<CrateNum> {
995997
match item.kind {
@@ -1013,7 +1015,7 @@ impl<'a> CrateLoader<'a> {
10131015

10141016
let cnum = self.resolve_crate(name, item.span, dep_kind)?;
10151017

1016-
let path_len = definitions.def_path(def_id).data.len();
1018+
let path_len = self.definitions.def_path(def_id).data.len();
10171019
self.update_extern_crate(
10181020
cnum,
10191021
ExternCrate {

compiler/rustc_resolve/src/build_reduced_graph.rs

+4-6
Original file line numberDiff line numberDiff line change
@@ -836,12 +836,10 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
836836
} else if orig_name == Some(kw::SelfLower) {
837837
Some(self.r.graph_root)
838838
} else {
839-
self.r.crate_loader.process_extern_crate(item, &self.r.definitions, local_def_id).map(
840-
|crate_id| {
841-
self.r.extern_crate_map.insert(local_def_id, crate_id);
842-
self.r.expect_module(crate_id.as_def_id())
843-
},
844-
)
839+
self.r.crate_loader().process_extern_crate(item, local_def_id).map(|crate_id| {
840+
self.r.extern_crate_map.insert(local_def_id, crate_id);
841+
self.r.expect_module(crate_id.as_def_id())
842+
})
845843
}
846844
.map(|module| {
847845
let used = self.process_macro_use_imports(item, module);

compiler/rustc_resolve/src/diagnostics.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1298,7 +1298,7 @@ impl<'a> Resolver<'a> {
12981298
// otherwise cause duplicate suggestions.
12991299
continue;
13001300
}
1301-
if let Some(crate_id) = self.crate_loader.maybe_process_path_extern(ident.name) {
1301+
if let Some(crate_id) = self.crate_loader().maybe_process_path_extern(ident.name) {
13021302
let crate_root = self.expect_module(crate_id.as_def_id());
13031303
suggestions.extend(self.lookup_import_candidates_from_module(
13041304
lookup_ident,

compiler/rustc_resolve/src/effective_visibilities.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ impl<'r, 'a> EffectiveVisibilitiesVisitor<'r, 'a> {
107107
r.effective_visibilities.update_eff_vis(
108108
r.local_def_id(node_id),
109109
eff_vis,
110-
ResolverTree(&r.definitions, r.crate_loader.cstore()),
110+
ResolverTree(&r.definitions, &r.cstore),
111111
)
112112
}
113113
}

compiler/rustc_resolve/src/late/diagnostics.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -1663,8 +1663,10 @@ impl<'a: 'ast, 'ast> LateResolutionVisitor<'a, '_, 'ast> {
16631663
if !module.no_implicit_prelude {
16641664
let extern_prelude = self.r.extern_prelude.clone();
16651665
names.extend(extern_prelude.iter().flat_map(|(ident, _)| {
1666-
self.r.crate_loader.maybe_process_path_extern(ident.name).and_then(
1667-
|crate_id| {
1666+
self.r
1667+
.crate_loader()
1668+
.maybe_process_path_extern(ident.name)
1669+
.and_then(|crate_id| {
16681670
let crate_mod =
16691671
Res::Def(DefKind::Mod, crate_id.as_def_id());
16701672

@@ -1673,8 +1675,7 @@ impl<'a: 'ast, 'ast> LateResolutionVisitor<'a, '_, 'ast> {
16731675
} else {
16741676
None
16751677
}
1676-
},
1677-
)
1678+
})
16781679
}));
16791680

16801681
if let Some(prelude) = self.r.prelude {

compiler/rustc_resolve/src/lib.rs

+24-12
Original file line numberDiff line numberDiff line change
@@ -954,7 +954,10 @@ pub struct Resolver<'a> {
954954
arenas: &'a ResolverArenas<'a>,
955955
dummy_binding: &'a NameBinding<'a>,
956956

957-
crate_loader: CrateLoader<'a>,
957+
local_crate_name: Symbol,
958+
metadata_loader: Box<MetadataLoaderDyn>,
959+
cstore: CStore,
960+
used_extern_options: FxHashSet<Symbol>,
958961
macro_names: FxHashSet<Ident>,
959962
builtin_macros: FxHashMap<Symbol, BuiltinMacroState>,
960963
/// A small map keeping true kinds of built-in macros that appear to be fn-like on
@@ -1129,7 +1132,7 @@ impl DefIdTree for ResolverTree<'_> {
11291132
impl<'a, 'b> DefIdTree for &'a Resolver<'b> {
11301133
#[inline]
11311134
fn opt_parent(self, id: DefId) -> Option<DefId> {
1132-
ResolverTree(&self.definitions, self.cstore()).opt_parent(id)
1135+
ResolverTree(&self.definitions, &self.cstore).opt_parent(id)
11331136
}
11341137
}
11351138

@@ -1311,7 +1314,10 @@ impl<'a> Resolver<'a> {
13111314
vis: ty::Visibility::Public,
13121315
}),
13131316

1314-
crate_loader: CrateLoader::new(session, metadata_loader, crate_name),
1317+
metadata_loader,
1318+
local_crate_name: crate_name,
1319+
used_extern_options: Default::default(),
1320+
cstore: CStore::new(session),
13151321
macro_names: FxHashSet::default(),
13161322
builtin_macros: Default::default(),
13171323
builtin_macro_kinds: Default::default(),
@@ -1403,7 +1409,7 @@ impl<'a> Resolver<'a> {
14031409
pub fn into_outputs(self) -> ResolverOutputs {
14041410
let proc_macros = self.proc_macros.iter().map(|id| self.local_def_id(*id)).collect();
14051411
let definitions = self.definitions;
1406-
let cstore = Box::new(self.crate_loader.into_cstore());
1412+
let cstore = Box::new(self.cstore);
14071413
let source_span = self.source_span;
14081414
let expn_that_defined = self.expn_that_defined;
14091415
let visibilities = self.visibilities;
@@ -1501,16 +1507,22 @@ impl<'a> Resolver<'a> {
15011507
}
15021508

15031509
fn create_stable_hashing_context(&self) -> StableHashingContext<'_> {
1504-
StableHashingContext::new(
1505-
self.session,
1510+
StableHashingContext::new(self.session, &self.definitions, &self.cstore, &self.source_span)
1511+
}
1512+
1513+
pub fn crate_loader(&mut self) -> CrateLoader<'_> {
1514+
CrateLoader::new(
1515+
&self.session,
1516+
&*self.metadata_loader,
1517+
self.local_crate_name,
1518+
&mut self.cstore,
15061519
&self.definitions,
1507-
self.crate_loader.cstore(),
1508-
&self.source_span,
1520+
&mut self.used_extern_options,
15091521
)
15101522
}
15111523

15121524
pub fn cstore(&self) -> &CStore {
1513-
self.crate_loader.cstore()
1525+
&self.cstore
15141526
}
15151527

15161528
fn dummy_ext(&self, macro_kind: MacroKind) -> Lrc<SyntaxExtension> {
@@ -1553,7 +1565,7 @@ impl<'a> Resolver<'a> {
15531565
self.session.time("resolve_main", || self.resolve_main());
15541566
self.session.time("resolve_check_unused", || self.check_unused(krate));
15551567
self.session.time("resolve_report_errors", || self.report_errors(krate));
1556-
self.session.time("resolve_postprocess", || self.crate_loader.postprocess(krate));
1568+
self.session.time("resolve_postprocess", || self.crate_loader().postprocess(krate));
15571569
});
15581570
}
15591571

@@ -1871,10 +1883,10 @@ impl<'a> Resolver<'a> {
18711883
} else {
18721884
let crate_id = if finalize {
18731885
let Some(crate_id) =
1874-
self.crate_loader.process_path_extern(ident.name, ident.span) else { return Some(self.dummy_binding); };
1886+
self.crate_loader().process_path_extern(ident.name, ident.span) else { return Some(self.dummy_binding); };
18751887
crate_id
18761888
} else {
1877-
self.crate_loader.maybe_process_path_extern(ident.name)?
1889+
self.crate_loader().maybe_process_path_extern(ident.name)?
18781890
};
18791891
let crate_root = self.expect_module(crate_id.as_def_id());
18801892
let vis = ty::Visibility::<LocalDefId>::Public;

compiler/rustc_resolve/src/macros.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -455,7 +455,7 @@ impl<'a> ResolverExpand for Resolver<'a> {
455455
}
456456

457457
fn get_proc_macro_quoted_span(&self, krate: CrateNum, id: usize) -> Span {
458-
self.crate_loader.cstore().get_proc_macro_quoted_span_untracked(krate, id, self.session)
458+
self.cstore.get_proc_macro_quoted_span_untracked(krate, id, self.session)
459459
}
460460

461461
fn declare_proc_macro(&mut self, id: NodeId) {

0 commit comments

Comments
 (0)