1
Fork 0

Run the resolver after TyCtxt construction

This commit is contained in:
Oli Scherer 2023-02-15 17:19:38 +00:00
parent 6924e3c374
commit 8f132d8549
6 changed files with 68 additions and 56 deletions

View file

@ -4180,6 +4180,7 @@ dependencies = [
"rustc_hir_analysis", "rustc_hir_analysis",
"rustc_hir_typeck", "rustc_hir_typeck",
"rustc_incremental", "rustc_incremental",
"rustc_index",
"rustc_lint", "rustc_lint",
"rustc_macros", "rustc_macros",
"rustc_metadata", "rustc_metadata",

View file

@ -24,6 +24,7 @@ rustc_middle = { path = "../rustc_middle" }
rustc_ast_lowering = { path = "../rustc_ast_lowering" } rustc_ast_lowering = { path = "../rustc_ast_lowering" }
rustc_ast_passes = { path = "../rustc_ast_passes" } rustc_ast_passes = { path = "../rustc_ast_passes" }
rustc_incremental = { path = "../rustc_incremental" } rustc_incremental = { path = "../rustc_incremental" }
rustc_index = { path = "../rustc_index" }
rustc_traits = { path = "../rustc_traits" } rustc_traits = { path = "../rustc_traits" }
rustc_data_structures = { path = "../rustc_data_structures" } rustc_data_structures = { path = "../rustc_data_structures" }
rustc_codegen_ssa = { path = "../rustc_codegen_ssa" } rustc_codegen_ssa = { path = "../rustc_codegen_ssa" }

View file

@ -7,16 +7,20 @@ use rustc_codegen_ssa::traits::CodegenBackend;
use rustc_codegen_ssa::CodegenResults; use rustc_codegen_ssa::CodegenResults;
use rustc_data_structures::steal::Steal; use rustc_data_structures::steal::Steal;
use rustc_data_structures::svh::Svh; use rustc_data_structures::svh::Svh;
use rustc_data_structures::sync::{Lrc, OnceCell, WorkerLocal}; use rustc_data_structures::sync::{Lrc, OnceCell, RwLock, WorkerLocal};
use rustc_hir::def_id::LOCAL_CRATE; use rustc_hir::def_id::{CRATE_DEF_ID, LOCAL_CRATE};
use rustc_hir::definitions::Definitions;
use rustc_incremental::DepGraphFuture; use rustc_incremental::DepGraphFuture;
use rustc_index::vec::IndexVec;
use rustc_lint::LintStore; use rustc_lint::LintStore;
use rustc_metadata::creader::CStore;
use rustc_middle::arena::Arena; use rustc_middle::arena::Arena;
use rustc_middle::dep_graph::DepGraph; use rustc_middle::dep_graph::DepGraph;
use rustc_middle::ty::{self, GlobalCtxt, TyCtxt}; use rustc_middle::ty::{self, GlobalCtxt, TyCtxt};
use rustc_query_impl::Queries as TcxQueries; use rustc_query_impl::Queries as TcxQueries;
use rustc_resolve::Resolver; use rustc_resolve::Resolver;
use rustc_session::config::{self, OutputFilenames, OutputType}; use rustc_session::config::{self, OutputFilenames, OutputType};
use rustc_session::cstore::Untracked;
use rustc_session::{output::find_crate_name, Session}; use rustc_session::{output::find_crate_name, Session};
use rustc_span::symbol::sym; use rustc_span::symbol::sym;
use rustc_span::Symbol; use rustc_span::Symbol;
@ -187,40 +191,20 @@ impl<'tcx> Queries<'tcx> {
self.gcx.compute(|| { self.gcx.compute(|| {
let crate_name = *self.crate_name()?.borrow(); let crate_name = *self.crate_name()?.borrow();
let (krate, lint_store) = self.register_plugins()?.steal(); let (krate, lint_store) = self.register_plugins()?.steal();
let (krate, resolver_outputs) = {
let _timer = self.session().timer("configure_and_expand");
let sess = self.session();
let arenas = Resolver::arenas(); let sess = self.session();
let mut resolver = Resolver::new(
sess,
&krate,
crate_name,
self.codegen_backend().metadata_loader(),
&arenas,
);
let krate = passes::configure_and_expand(
sess,
&lint_store,
krate,
crate_name,
&mut resolver,
)?;
(Lrc::new(krate), resolver.into_outputs())
};
let ty::ResolverOutputs { let cstore = RwLock::new(Box::new(CStore::new(sess)) as _);
untracked, let definitions = RwLock::new(Definitions::new(sess.local_stable_crate_id()));
global_ctxt: untracked_resolutions, let mut source_span = IndexVec::default();
ast_lowering: untracked_resolver_for_lowering, let _id = source_span.push(krate.spans.inner_span);
} = resolver_outputs; debug_assert_eq!(_id, CRATE_DEF_ID);
let source_span = RwLock::new(source_span);
let untracked = Untracked { cstore, source_span, definitions };
// Make sure we don't mutate the cstore from here on. let qcx = passes::create_global_ctxt(
std::mem::forget(untracked.cstore.read());
let gcx = passes::create_global_ctxt(
self.compiler, self.compiler,
lint_store, lint_store.clone(),
self.dep_graph()?.steal(), self.dep_graph()?.steal(),
untracked, untracked,
&self.queries, &self.queries,
@ -229,17 +213,48 @@ impl<'tcx> Queries<'tcx> {
&self.hir_arena, &self.hir_arena,
); );
gcx.enter(|tcx| { qcx.enter(|tcx| {
let feed = tcx.feed_local_crate();
feed.crate_name(crate_name);
let (krate, resolver_outputs) = {
let _timer = sess.timer("configure_and_expand");
let arenas = Resolver::arenas();
let mut resolver = Resolver::new(
sess,
&krate,
crate_name,
self.codegen_backend().metadata_loader(),
&arenas,
tcx.untracked(),
);
let krate = passes::configure_and_expand(
sess,
&lint_store,
krate,
crate_name,
&mut resolver,
)?;
// Make sure we don't mutate the cstore from here on.
tcx.untracked().cstore.leak();
(Lrc::new(krate), resolver.into_outputs())
};
let ty::ResolverOutputs {
global_ctxt: untracked_resolutions,
ast_lowering: untracked_resolver_for_lowering,
} = resolver_outputs;
let feed = tcx.feed_unit_query(); let feed = tcx.feed_unit_query();
feed.resolver_for_lowering( feed.resolver_for_lowering(
tcx.arena.alloc(Steal::new((untracked_resolver_for_lowering, krate))), tcx.arena.alloc(Steal::new((untracked_resolver_for_lowering, krate))),
); );
feed.resolutions(tcx.arena.alloc(untracked_resolutions)); feed.resolutions(tcx.arena.alloc(untracked_resolutions));
feed.features_query(tcx.sess.features_untracked()); feed.features_query(tcx.sess.features_untracked());
let feed = tcx.feed_local_crate(); Ok(())
feed.crate_name(crate_name); })?;
}); Ok(qcx)
Ok(gcx)
}) })
} }

View file

@ -1015,6 +1015,10 @@ impl<'tcx> TyCtxt<'tcx> {
ReadGuard::map(self.untracked.cstore.read(), |c| &**c) ReadGuard::map(self.untracked.cstore.read(), |c| &**c)
} }
/// Give out access to the untracked data without any sanity checks.
pub fn untracked(self) -> &'tcx Untracked {
&self.untracked
}
/// Note that this is *untracked* and should only be used within the query /// Note that this is *untracked* and should only be used within the query
/// system if the result is otherwise tracked through queries /// system if the result is otherwise tracked through queries
#[inline] #[inline]

View file

@ -43,7 +43,6 @@ use rustc_index::vec::IndexVec;
use rustc_macros::HashStable; use rustc_macros::HashStable;
use rustc_query_system::ich::StableHashingContext; use rustc_query_system::ich::StableHashingContext;
use rustc_serialize::{Decodable, Encodable}; use rustc_serialize::{Decodable, Encodable};
use rustc_session::cstore::Untracked;
use rustc_span::hygiene::MacroKind; use rustc_span::hygiene::MacroKind;
use rustc_span::symbol::{kw, sym, Ident, Symbol}; use rustc_span::symbol::{kw, sym, Ident, Symbol};
use rustc_span::{ExpnId, ExpnKind, Span}; use rustc_span::{ExpnId, ExpnKind, Span};
@ -157,7 +156,6 @@ pub type RegisteredTools = FxHashSet<Ident>;
pub struct ResolverOutputs { pub struct ResolverOutputs {
pub global_ctxt: ResolverGlobalCtxt, pub global_ctxt: ResolverGlobalCtxt,
pub ast_lowering: ResolverAstLowering, pub ast_lowering: ResolverAstLowering,
pub untracked: Untracked,
} }
#[derive(Debug)] #[derive(Debug)]

View file

@ -27,14 +27,14 @@ use rustc_ast::{self as ast, NodeId, CRATE_NODE_ID};
use rustc_ast::{AngleBracketedArg, Crate, Expr, ExprKind, GenericArg, GenericArgs, LitKind, Path}; use rustc_ast::{AngleBracketedArg, Crate, Expr, ExprKind, GenericArg, GenericArgs, LitKind, Path};
use rustc_data_structures::fx::{FxHashMap, FxHashSet, FxIndexMap, FxIndexSet}; use rustc_data_structures::fx::{FxHashMap, FxHashSet, FxIndexMap, FxIndexSet};
use rustc_data_structures::intern::Interned; use rustc_data_structures::intern::Interned;
use rustc_data_structures::sync::{Lrc, MappedReadGuard, ReadGuard, RwLock}; use rustc_data_structures::sync::{Lrc, MappedReadGuard, ReadGuard};
use rustc_errors::{Applicability, DiagnosticBuilder, ErrorGuaranteed}; use rustc_errors::{Applicability, DiagnosticBuilder, ErrorGuaranteed};
use rustc_expand::base::{DeriveResolutions, SyntaxExtension, SyntaxExtensionKind}; use rustc_expand::base::{DeriveResolutions, SyntaxExtension, SyntaxExtensionKind};
use rustc_hir::def::Namespace::{self, *}; use rustc_hir::def::Namespace::{self, *};
use rustc_hir::def::{self, CtorOf, DefKind, DocLinkResMap, LifetimeRes, PartialRes, PerNS}; use rustc_hir::def::{self, CtorOf, DefKind, DocLinkResMap, LifetimeRes, PartialRes, PerNS};
use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, LocalDefId}; use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, LocalDefId};
use rustc_hir::def_id::{CRATE_DEF_ID, LOCAL_CRATE}; use rustc_hir::def_id::{CRATE_DEF_ID, LOCAL_CRATE};
use rustc_hir::definitions::{DefPathData, Definitions}; use rustc_hir::definitions::DefPathData;
use rustc_hir::TraitCandidate; use rustc_hir::TraitCandidate;
use rustc_index::vec::IndexVec; use rustc_index::vec::IndexVec;
use rustc_metadata::creader::{CStore, CrateLoader}; use rustc_metadata::creader::{CStore, CrateLoader};
@ -962,7 +962,7 @@ pub struct Resolver<'a, 'tcx> {
local_crate_name: Symbol, local_crate_name: Symbol,
metadata_loader: Box<MetadataLoaderDyn>, metadata_loader: Box<MetadataLoaderDyn>,
untracked: Untracked, untracked: &'tcx Untracked,
used_extern_options: FxHashSet<Symbol>, used_extern_options: FxHashSet<Symbol>,
macro_names: FxHashSet<Ident>, macro_names: FxHashSet<Ident>,
builtin_macros: FxHashMap<Symbol, BuiltinMacroState>, builtin_macros: FxHashMap<Symbol, BuiltinMacroState>,
@ -1211,6 +1211,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
crate_name: Symbol, crate_name: Symbol,
metadata_loader: Box<MetadataLoaderDyn>, metadata_loader: Box<MetadataLoaderDyn>,
arenas: &'a ResolverArenas<'a>, arenas: &'a ResolverArenas<'a>,
untracked: &'tcx Untracked,
) -> Resolver<'a, 'tcx> { ) -> Resolver<'a, 'tcx> {
let tcx = TyCtxt { sess: session }; let tcx = TyCtxt { sess: session };
@ -1233,8 +1234,6 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
&mut FxHashMap::default(), &mut FxHashMap::default(),
); );
let definitions = Definitions::new(session.local_stable_crate_id());
let mut visibilities = FxHashMap::default(); let mut visibilities = FxHashMap::default();
visibilities.insert(CRATE_DEF_ID, ty::Visibility::Public); visibilities.insert(CRATE_DEF_ID, ty::Visibility::Public);
@ -1246,10 +1245,6 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
let mut invocation_parents = FxHashMap::default(); let mut invocation_parents = FxHashMap::default();
invocation_parents.insert(LocalExpnId::ROOT, (CRATE_DEF_ID, ImplTraitContext::Existential)); invocation_parents.insert(LocalExpnId::ROOT, (CRATE_DEF_ID, ImplTraitContext::Existential));
let mut source_span = IndexVec::default();
let _id = source_span.push(krate.spans.inner_span);
debug_assert_eq!(_id, CRATE_DEF_ID);
let mut extern_prelude: FxHashMap<Ident, ExternPreludeEntry<'_>> = session let mut extern_prelude: FxHashMap<Ident, ExternPreludeEntry<'_>> = session
.opts .opts
.externs .externs
@ -1327,11 +1322,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
metadata_loader, metadata_loader,
local_crate_name: crate_name, local_crate_name: crate_name,
used_extern_options: Default::default(), used_extern_options: Default::default(),
untracked: Untracked { untracked,
cstore: RwLock::new(Box::new(CStore::new(session))),
source_span: RwLock::new(source_span),
definitions: RwLock::new(definitions),
},
macro_names: FxHashSet::default(), macro_names: FxHashSet::default(),
builtin_macros: Default::default(), builtin_macros: Default::default(),
builtin_macro_kinds: Default::default(), builtin_macro_kinds: Default::default(),
@ -1436,7 +1427,6 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
let main_def = self.main_def; let main_def = self.main_def;
let confused_type_with_std_module = self.confused_type_with_std_module; let confused_type_with_std_module = self.confused_type_with_std_module;
let effective_visibilities = self.effective_visibilities; let effective_visibilities = self.effective_visibilities;
let untracked = self.untracked;
let global_ctxt = ResolverGlobalCtxt { let global_ctxt = ResolverGlobalCtxt {
expn_that_defined, expn_that_defined,
visibilities, visibilities,
@ -1475,11 +1465,11 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
builtin_macro_kinds: self.builtin_macro_kinds, builtin_macro_kinds: self.builtin_macro_kinds,
lifetime_elision_allowed: self.lifetime_elision_allowed, lifetime_elision_allowed: self.lifetime_elision_allowed,
}; };
ResolverOutputs { global_ctxt, ast_lowering, untracked } ResolverOutputs { global_ctxt, ast_lowering }
} }
fn create_stable_hashing_context(&self) -> StableHashingContext<'_> { fn create_stable_hashing_context(&self) -> StableHashingContext<'_> {
StableHashingContext::new(self.tcx.sess, &self.untracked) StableHashingContext::new(self.tcx.sess, self.untracked)
} }
fn crate_loader<T>(&mut self, f: impl FnOnce(&mut CrateLoader<'_>) -> T) -> T { fn crate_loader<T>(&mut self, f: impl FnOnce(&mut CrateLoader<'_>) -> T) -> T {
@ -1543,6 +1533,9 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
.sess .sess
.time("resolve_postprocess", || self.crate_loader(|c| c.postprocess(krate))); .time("resolve_postprocess", || self.crate_loader(|c| c.postprocess(krate)));
}); });
// Make sure we don't mutate the cstore from here on.
self.untracked.cstore.leak();
} }
fn traits_in_scope( fn traits_in_scope(