Make QueryEngine opaque to TyCtxt.
This commit is contained in:
parent
3f868b1791
commit
5d71b99690
12 changed files with 99 additions and 63 deletions
|
@ -30,6 +30,7 @@ rustc_codegen_ssa = { path = "../rustc_codegen_ssa" }
|
|||
rustc_symbol_mangling = { path = "../rustc_symbol_mangling" }
|
||||
rustc_codegen_llvm = { path = "../rustc_codegen_llvm", optional = true }
|
||||
rustc_hir = { path = "../rustc_hir" }
|
||||
rustc_index = { path = "../rustc_index" }
|
||||
rustc_metadata = { path = "../rustc_metadata" }
|
||||
rustc_mir = { path = "../rustc_mir" }
|
||||
rustc_mir_build = { path = "../rustc_mir_build" }
|
||||
|
|
|
@ -15,11 +15,13 @@ use rustc_expand::base::ExtCtxt;
|
|||
use rustc_hir::def_id::{CrateNum, LOCAL_CRATE};
|
||||
use rustc_hir::definitions::Definitions;
|
||||
use rustc_hir::Crate;
|
||||
use rustc_index::vec::IndexVec;
|
||||
use rustc_lint::LintStore;
|
||||
use rustc_middle::arena::Arena;
|
||||
use rustc_middle::dep_graph::DepGraph;
|
||||
use rustc_middle::middle;
|
||||
use rustc_middle::middle::cstore::{CrateStore, MetadataLoader, MetadataLoaderDyn};
|
||||
use rustc_middle::ty::query;
|
||||
use rustc_middle::ty::query::Providers;
|
||||
use rustc_middle::ty::{self, GlobalCtxt, ResolverOutputs, TyCtxt};
|
||||
use rustc_mir as mir;
|
||||
|
@ -738,20 +740,18 @@ pub static DEFAULT_EXTERN_QUERY_PROVIDERS: SyncLazy<Providers> = SyncLazy::new(|
|
|||
extern_providers
|
||||
});
|
||||
|
||||
pub struct QueryContext<'tcx>(&'tcx GlobalCtxt<'tcx>);
|
||||
pub struct QueryContext<'tcx> {
|
||||
gcx: &'tcx GlobalCtxt<'tcx>,
|
||||
}
|
||||
|
||||
impl<'tcx> QueryContext<'tcx> {
|
||||
pub fn enter<F, R>(&mut self, f: F) -> R
|
||||
where
|
||||
F: FnOnce(TyCtxt<'tcx>) -> R,
|
||||
{
|
||||
let icx = ty::tls::ImplicitCtxt::new(self.0);
|
||||
let icx = ty::tls::ImplicitCtxt::new(self.gcx);
|
||||
ty::tls::enter_context(&icx, |_| f(icx.tcx))
|
||||
}
|
||||
|
||||
pub fn print_stats(&mut self) {
|
||||
self.enter(ty::query::print_stats)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn create_global_ctxt<'tcx>(
|
||||
|
@ -762,6 +762,7 @@ pub fn create_global_ctxt<'tcx>(
|
|||
mut resolver_outputs: ResolverOutputs,
|
||||
outputs: OutputFilenames,
|
||||
crate_name: &str,
|
||||
queries: &'tcx OnceCell<query::Queries<'tcx>>,
|
||||
global_ctxt: &'tcx OnceCell<GlobalCtxt<'tcx>>,
|
||||
arena: &'tcx WorkerLocal<Arena<'tcx>>,
|
||||
) -> QueryContext<'tcx> {
|
||||
|
@ -785,26 +786,33 @@ pub fn create_global_ctxt<'tcx>(
|
|||
callback(sess, &mut local_providers, &mut extern_providers);
|
||||
}
|
||||
|
||||
let queries = {
|
||||
let crates = resolver_outputs.cstore.crates_untracked();
|
||||
let max_cnum = crates.iter().map(|c| c.as_usize()).max().unwrap_or(0);
|
||||
let mut providers = IndexVec::from_elem_n(extern_providers, max_cnum + 1);
|
||||
providers[LOCAL_CRATE] = local_providers;
|
||||
queries.get_or_init(|| query::Queries::new(providers, extern_providers))
|
||||
};
|
||||
|
||||
let gcx = sess.time("setup_global_ctxt", || {
|
||||
global_ctxt.get_or_init(|| {
|
||||
TyCtxt::create_global_ctxt(
|
||||
sess,
|
||||
lint_store,
|
||||
local_providers,
|
||||
extern_providers,
|
||||
arena,
|
||||
resolver_outputs,
|
||||
krate,
|
||||
defs,
|
||||
dep_graph,
|
||||
query_result_on_disk_cache,
|
||||
queries,
|
||||
&crate_name,
|
||||
&outputs,
|
||||
)
|
||||
})
|
||||
});
|
||||
|
||||
QueryContext(gcx)
|
||||
QueryContext { gcx }
|
||||
}
|
||||
|
||||
/// Runs the resolution, type-checking, region checking and other
|
||||
|
|
|
@ -13,6 +13,7 @@ use rustc_incremental::DepGraphFuture;
|
|||
use rustc_lint::LintStore;
|
||||
use rustc_middle::arena::Arena;
|
||||
use rustc_middle::dep_graph::DepGraph;
|
||||
use rustc_middle::ty::query;
|
||||
use rustc_middle::ty::{GlobalCtxt, ResolverOutputs, TyCtxt};
|
||||
use rustc_serialize::json;
|
||||
use rustc_session::config::{self, OutputFilenames, OutputType};
|
||||
|
@ -71,6 +72,7 @@ impl<T> Default for Query<T> {
|
|||
pub struct Queries<'tcx> {
|
||||
compiler: &'tcx Compiler,
|
||||
gcx: OnceCell<GlobalCtxt<'tcx>>,
|
||||
queries: OnceCell<query::Queries<'tcx>>,
|
||||
|
||||
arena: WorkerLocal<Arena<'tcx>>,
|
||||
hir_arena: WorkerLocal<rustc_ast_lowering::Arena<'tcx>>,
|
||||
|
@ -92,6 +94,7 @@ impl<'tcx> Queries<'tcx> {
|
|||
Queries {
|
||||
compiler,
|
||||
gcx: OnceCell::new(),
|
||||
queries: OnceCell::new(),
|
||||
arena: WorkerLocal::new(|_| Arena::default()),
|
||||
hir_arena: WorkerLocal::new(|_| rustc_ast_lowering::Arena::default()),
|
||||
dep_graph_future: Default::default(),
|
||||
|
@ -265,6 +268,7 @@ impl<'tcx> Queries<'tcx> {
|
|||
resolver_outputs.steal(),
|
||||
outputs,
|
||||
&crate_name,
|
||||
&self.queries,
|
||||
&self.gcx,
|
||||
&self.arena,
|
||||
))
|
||||
|
@ -429,7 +433,7 @@ impl Compiler {
|
|||
}
|
||||
|
||||
if self.session().opts.debugging_opts.query_stats {
|
||||
gcx.print_stats();
|
||||
gcx.enter(query::print_stats);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue