Skip to content

Commit 3534ca8

Browse files
committed
Turn crate store into a resolver output
1 parent 5fd796a commit 3534ca8

File tree

14 files changed

+102
-100
lines changed

14 files changed

+102
-100
lines changed

src/librustc/hir/lowering.rs

+5-7
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,6 @@ pub struct LoweringContext<'a> {
8383
/// Used to assign IDs to HIR nodes that do not directly correspond to AST nodes.
8484
sess: &'a Session,
8585

86-
cstore: &'a dyn CrateStore,
87-
8886
resolver: &'a mut dyn Resolver,
8987

9088
/// HACK(Centril): there is a cyclic dependency between the parser and lowering
@@ -160,6 +158,8 @@ pub struct LoweringContext<'a> {
160158
}
161159

162160
pub trait Resolver {
161+
fn cstore(&self) -> &dyn CrateStore;
162+
163163
/// Obtains resolution for a `NodeId` with a single resolution.
164164
fn get_partial_res(&mut self, id: NodeId) -> Option<PartialRes>;
165165

@@ -240,7 +240,6 @@ impl<'a> ImplTraitContext<'a> {
240240

241241
pub fn lower_crate(
242242
sess: &Session,
243-
cstore: &dyn CrateStore,
244243
dep_graph: &DepGraph,
245244
krate: &Crate,
246245
resolver: &mut dyn Resolver,
@@ -256,7 +255,6 @@ pub fn lower_crate(
256255
LoweringContext {
257256
crate_root: sess.parse_sess.injected_crate_name.try_get().copied(),
258257
sess,
259-
cstore,
260258
resolver,
261259
nt_to_tokenstream,
262260
items: BTreeMap::new(),
@@ -980,7 +978,7 @@ impl<'a> LoweringContext<'a> {
980978
if id.is_local() {
981979
self.resolver.definitions().def_key(id.index)
982980
} else {
983-
self.cstore.def_key(id)
981+
self.resolver.cstore().def_key(id)
984982
}
985983
}
986984

@@ -1727,8 +1725,8 @@ impl<'a> LoweringContext<'a> {
17271725
return n;
17281726
}
17291727
assert!(!def_id.is_local());
1730-
let item_generics =
1731-
self.cstore.item_generics_cloned_untracked(def_id, self.sess);
1728+
let item_generics = self.resolver.cstore()
1729+
.item_generics_cloned_untracked(def_id, self.sess);
17321730
let n = item_generics.own_counts().lifetimes;
17331731
self.type_def_lifetime_params.insert(def_id, n);
17341732
n

src/librustc/ty/context.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -1027,7 +1027,7 @@ pub struct GlobalCtxt<'tcx> {
10271027

10281028
interners: CtxtInterners<'tcx>,
10291029

1030-
cstore: &'tcx CrateStoreDyn,
1030+
cstore: Box<CrateStoreDyn>,
10311031

10321032
pub sess: &'tcx Session,
10331033

@@ -1195,7 +1195,6 @@ impl<'tcx> TyCtxt<'tcx> {
11951195
pub fn create_global_ctxt(
11961196
s: &'tcx Session,
11971197
lint_store: Lrc<lint::LintStore>,
1198-
cstore: &'tcx CrateStoreDyn,
11991198
local_providers: ty::query::Providers<'tcx>,
12001199
extern_providers: ty::query::Providers<'tcx>,
12011200
arenas: &'tcx AllArenas,
@@ -1213,6 +1212,7 @@ impl<'tcx> TyCtxt<'tcx> {
12131212
let common_lifetimes = CommonLifetimes::new(&interners);
12141213
let common_consts = CommonConsts::new(&interners, &common_types);
12151214
let dep_graph = hir.dep_graph.clone();
1215+
let cstore = resolutions.cstore;
12161216
let max_cnum = cstore.crates_untracked().iter().map(|c| c.as_usize()).max().unwrap_or(0);
12171217
let mut providers = IndexVec::from_elem_n(extern_providers, max_cnum + 1);
12181218
providers[LOCAL_CRATE] = local_providers;
@@ -1428,7 +1428,7 @@ impl<'tcx> TyCtxt<'tcx> {
14281428
StableHashingContext::new(self.sess,
14291429
krate,
14301430
self.hir().definitions(),
1431-
self.cstore)
1431+
&*self.cstore)
14321432
}
14331433

14341434
// This method makes sure that we have a DepNode and a Fingerprint for

src/librustc/ty/mod.rs

+2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ use rustc_macros::HashStable;
1515
use crate::ich::Fingerprint;
1616
use crate::ich::StableHashingContext;
1717
use crate::infer::canonical::Canonical;
18+
use crate::middle::cstore::CrateStoreDyn;
1819
use crate::middle::lang_items::{FnTraitLangItem, FnMutTraitLangItem, FnOnceTraitLangItem};
1920
use crate::middle::resolve_lifetime::ObjectLifetimeDefault;
2021
use crate::mir::Body;
@@ -121,6 +122,7 @@ mod sty;
121122

122123
pub struct ResolverOutputs {
123124
pub definitions: hir_map::Definitions,
125+
pub cstore: Box<CrateStoreDyn>,
124126
pub extern_crate_map: NodeMap<CrateNum>,
125127
pub trait_map: TraitMap,
126128
pub maybe_unused_trait_imports: NodeSet,

src/librustc_interface/interface.rs

-8
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ use rustc_codegen_utils::codegen_backend::CodegenBackend;
1111
use rustc_data_structures::OnDrop;
1212
use rustc_data_structures::sync::Lrc;
1313
use rustc_data_structures::fx::{FxHashSet, FxHashMap};
14-
use rustc_metadata::cstore::CStore;
1514
use std::path::PathBuf;
1615
use std::result;
1716
use std::sync::{Arc, Mutex};
@@ -37,7 +36,6 @@ pub struct Compiler {
3736
pub(crate) output_dir: Option<PathBuf>,
3837
pub(crate) output_file: Option<PathBuf>,
3938
pub(crate) queries: Queries,
40-
pub(crate) cstore: Lrc<CStore>,
4139
pub(crate) crate_name: Option<String>,
4240
pub(crate) register_lints: Option<Box<dyn Fn(&Session, &mut lint::LintStore) + Send + Sync>>,
4341
}
@@ -49,9 +47,6 @@ impl Compiler {
4947
pub fn codegen_backend(&self) -> &Lrc<Box<dyn CodegenBackend>> {
5048
&self.codegen_backend
5149
}
52-
pub fn cstore(&self) -> &Lrc<CStore> {
53-
&self.cstore
54-
}
5550
pub fn source_map(&self) -> &Lrc<SourceMap> {
5651
&self.source_map
5752
}
@@ -160,13 +155,10 @@ where
160155
config.lint_caps,
161156
);
162157

163-
let cstore = Lrc::new(CStore::new(codegen_backend.metadata_loader()));
164-
165158
let compiler = Compiler {
166159
sess,
167160
codegen_backend,
168161
source_map,
169-
cstore,
170162
input: config.input,
171163
input_path: config.input_path,
172164
output_dir: config.output_dir,

src/librustc_interface/passes.rs

+29-31
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use rustc::hir::lowering::lower_crate;
99
use rustc::hir::def_id::{CrateNum, LOCAL_CRATE};
1010
use rustc::lint;
1111
use rustc::middle::{self, reachable, resolve_lifetime, stability};
12-
use rustc::middle::cstore::{CrateStore, MetadataLoader};
12+
use rustc::middle::cstore::{CrateStore, MetadataLoader, MetadataLoaderDyn};
1313
use rustc::ty::{self, AllArenas, ResolverOutputs, TyCtxt, GlobalCtxt};
1414
use rustc::ty::steal::Steal;
1515
use rustc::traits;
@@ -23,8 +23,7 @@ use rustc_codegen_utils::link::filename_for_metadata;
2323
use rustc_data_structures::{box_region_allow_access, declare_box_region_type, parallel};
2424
use rustc_data_structures::sync::{Lrc, ParallelIterator, par_iter};
2525
use rustc_incremental;
26-
use rustc_metadata::creader::CrateLoader;
27-
use rustc_metadata::cstore::{self, CStore};
26+
use rustc_metadata::cstore;
2827
use rustc_mir as mir;
2928
use rustc_passes::{self, ast_validation, hir_stats, layout_test};
3029
use rustc_plugin as plugin;
@@ -116,7 +115,7 @@ declare_box_region_type!(
116115
pub fn configure_and_expand(
117116
sess: Lrc<Session>,
118117
lint_store: Lrc<lint::LintStore>,
119-
cstore: Lrc<CStore>,
118+
metadata_loader: Box<MetadataLoaderDyn>,
120119
krate: ast::Crate,
121120
crate_name: &str,
122121
plugin_info: PluginInfo,
@@ -129,16 +128,14 @@ pub fn configure_and_expand(
129128
let crate_name = crate_name.to_string();
130129
let (result, resolver) = BoxedResolver::new(static move || {
131130
let sess = &*sess;
132-
let crate_loader = CrateLoader::new(sess, &*cstore, &crate_name);
133131
let resolver_arenas = Resolver::arenas();
134132
let res = configure_and_expand_inner(
135133
sess,
136134
&lint_store,
137-
&*cstore,
138135
krate,
139136
&crate_name,
140137
&resolver_arenas,
141-
&crate_loader,
138+
&*metadata_loader,
142139
plugin_info,
143140
);
144141
let mut resolver = match res {
@@ -275,11 +272,10 @@ pub fn register_plugins<'a>(
275272
fn configure_and_expand_inner<'a>(
276273
sess: &'a Session,
277274
lint_store: &'a lint::LintStore,
278-
cstore: &'a CStore,
279275
mut krate: ast::Crate,
280276
crate_name: &str,
281277
resolver_arenas: &'a ResolverArenas<'a>,
282-
crate_loader: &'a CrateLoader<'a>,
278+
metadata_loader: &'a MetadataLoaderDyn,
283279
plugin_info: PluginInfo,
284280
) -> Result<(ast::Crate, Resolver<'a>)> {
285281
time(sess, "pre-AST-expansion lint checks", || {
@@ -293,10 +289,9 @@ fn configure_and_expand_inner<'a>(
293289

294290
let mut resolver = Resolver::new(
295291
sess,
296-
cstore,
297292
&krate,
298293
crate_name,
299-
crate_loader,
294+
metadata_loader,
300295
&resolver_arenas,
301296
);
302297
syntax_ext::register_builtin_macros(&mut resolver, sess.edition());
@@ -496,15 +491,14 @@ fn configure_and_expand_inner<'a>(
496491
pub fn lower_to_hir(
497492
sess: &Session,
498493
lint_store: &lint::LintStore,
499-
cstore: &CStore,
500494
resolver: &mut Resolver<'_>,
501495
dep_graph: &DepGraph,
502496
krate: &ast::Crate,
503497
) -> Result<hir::map::Forest> {
504498
// Lower AST to HIR.
505499
let hir_forest = time(sess, "lowering AST -> HIR", || {
506500
let nt_to_tokenstream = syntax::parse::nt_to_tokenstream;
507-
let hir_crate = lower_crate(sess, cstore, &dep_graph, &krate, resolver, nt_to_tokenstream);
501+
let hir_crate = lower_crate(sess, &dep_graph, &krate, resolver, nt_to_tokenstream);
508502

509503
if sess.opts.debugging_opts.hir_stats {
510504
hir_stats::print_hir_stats(&hir_crate);
@@ -610,8 +604,12 @@ fn escape_dep_filename(filename: &FileName) -> String {
610604
filename.to_string().replace(" ", "\\ ")
611605
}
612606

613-
fn write_out_deps(compiler: &Compiler, outputs: &OutputFilenames, out_filenames: &[PathBuf]) {
614-
let sess = &compiler.sess;
607+
fn write_out_deps(
608+
sess: &Session,
609+
boxed_resolver: &Steal<Rc<RefCell<BoxedResolver>>>,
610+
outputs: &OutputFilenames,
611+
out_filenames: &[PathBuf],
612+
) {
615613
// Write out dependency rules to the dep-info file if requested
616614
if !sess.opts.output_types.contains_key(&OutputType::DepInfo) {
617615
return;
@@ -630,18 +628,20 @@ fn write_out_deps(compiler: &Compiler, outputs: &OutputFilenames, out_filenames:
630628
.collect();
631629

632630
if sess.binary_dep_depinfo() {
633-
for cnum in compiler.cstore.crates_untracked() {
634-
let source = compiler.cstore.crate_source_untracked(cnum);
635-
if let Some((path, _)) = source.dylib {
636-
files.push(escape_dep_filename(&FileName::Real(path)));
637-
}
638-
if let Some((path, _)) = source.rlib {
639-
files.push(escape_dep_filename(&FileName::Real(path)));
631+
boxed_resolver.borrow().borrow_mut().access(|resolver| {
632+
for cnum in resolver.cstore().crates_untracked() {
633+
let source = resolver.cstore().crate_source_untracked(cnum);
634+
if let Some((path, _)) = source.dylib {
635+
files.push(escape_dep_filename(&FileName::Real(path)));
636+
}
637+
if let Some((path, _)) = source.rlib {
638+
files.push(escape_dep_filename(&FileName::Real(path)));
639+
}
640+
if let Some((path, _)) = source.rmeta {
641+
files.push(escape_dep_filename(&FileName::Real(path)));
642+
}
640643
}
641-
if let Some((path, _)) = source.rmeta {
642-
files.push(escape_dep_filename(&FileName::Real(path)));
643-
}
644-
}
644+
});
645645
}
646646

647647
let mut file = fs::File::create(&deps_filename)?;
@@ -679,6 +679,7 @@ pub fn prepare_outputs(
679679
sess: &Session,
680680
compiler: &Compiler,
681681
krate: &ast::Crate,
682+
boxed_resolver: &Steal<Rc<RefCell<BoxedResolver>>>,
682683
crate_name: &str
683684
) -> Result<OutputFilenames> {
684685
// FIXME: rustdoc passes &[] instead of &krate.attrs here
@@ -720,7 +721,7 @@ pub fn prepare_outputs(
720721
}
721722
}
722723

723-
write_out_deps(compiler, &outputs, &output_paths);
724+
write_out_deps(sess, boxed_resolver, &outputs, &output_paths);
724725

725726
let only_dep_info = sess.opts.output_types.contains_key(&OutputType::DepInfo)
726727
&& sess.opts.output_types.len() == 1;
@@ -790,21 +791,19 @@ pub fn create_global_ctxt(
790791
crate_name: &str,
791792
) -> BoxedGlobalCtxt {
792793
let sess = compiler.session().clone();
793-
let cstore = compiler.cstore.clone();
794794
let codegen_backend = compiler.codegen_backend().clone();
795795
let crate_name = crate_name.to_string();
796796
let defs = mem::take(&mut resolver_outputs.definitions);
797797

798798
let ((), result) = BoxedGlobalCtxt::new(static move || {
799799
let sess = &*sess;
800-
let cstore = &*cstore;
801800

802801
let global_ctxt: Option<GlobalCtxt<'_>>;
803802
let arenas = AllArenas::new();
804803

805804
// Construct the HIR map.
806805
let hir_map = time(sess, "indexing HIR", || {
807-
hir::map::map_crate(sess, cstore, &mut hir_forest, &defs)
806+
hir::map::map_crate(sess, &*resolver_outputs.cstore, &mut hir_forest, &defs)
808807
});
809808

810809
let query_result_on_disk_cache = time(sess, "load query result cache", || {
@@ -822,7 +821,6 @@ pub fn create_global_ctxt(
822821
let gcx = TyCtxt::create_global_ctxt(
823822
sess,
824823
lint_store,
825-
cstore,
826824
local_providers,
827825
extern_providers,
828826
&arenas,

src/librustc_interface/queries.rs

+4-5
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ impl Compiler {
164164
passes::configure_and_expand(
165165
self.sess.clone(),
166166
lint_store.clone(),
167-
self.cstore().clone(),
167+
self.codegen_backend().metadata_loader(),
168168
krate,
169169
&crate_name,
170170
plugin_info,
@@ -202,7 +202,6 @@ impl Compiler {
202202
passes::lower_to_hir(
203203
self.session(),
204204
lint_store,
205-
self.cstore(),
206205
resolver,
207206
&*self.dep_graph()?.peek(),
208207
&krate
@@ -214,11 +213,11 @@ impl Compiler {
214213

215214
pub fn prepare_outputs(&self) -> Result<&Query<OutputFilenames>> {
216215
self.queries.prepare_outputs.compute(|| {
217-
let krate = self.expansion()?;
218-
let krate = krate.peek();
216+
let expansion_result = self.expansion()?;
217+
let (krate, boxed_resolver) = &*expansion_result.peek();
219218
let crate_name = self.crate_name()?;
220219
let crate_name = crate_name.peek();
221-
passes::prepare_outputs(self.session(), self, &krate.0, &*crate_name)
220+
passes::prepare_outputs(self.session(), self, &krate, &boxed_resolver, &crate_name)
222221
})
223222
}
224223

0 commit comments

Comments
 (0)