]> git.lizzy.rs Git - rust.git/blobdiff - src/librustc_interface/passes.rs
Have Queries own the GlobalCtxt.
[rust.git] / src / librustc_interface / passes.rs
index a745d63426b7ac0cfcc8176a75d8e63eca93b715..99945ebf8c4cfdfa7a838c31e8473aa09d98f122 100644 (file)
@@ -22,7 +22,7 @@
 use rustc_codegen_utils::codegen_backend::CodegenBackend;
 use rustc_codegen_utils::link::filename_for_metadata;
 use rustc_data_structures::{box_region_allow_access, declare_box_region_type, parallel};
-use rustc_data_structures::sync::{Lrc, ParallelIterator, par_iter};
+use rustc_data_structures::sync::{Lrc, Once, ParallelIterator, par_iter};
 use rustc_errors::PResult;
 use rustc_incremental;
 use rustc_metadata::cstore;
@@ -740,44 +740,41 @@ pub fn default_provide_extern(providers: &mut ty::query::Providers<'_>) {
     rustc_codegen_ssa::provide_extern(providers);
 }
 
-declare_box_region_type!(
-    pub BoxedGlobalCtxt,
-    for('tcx),
-    (&'tcx GlobalCtxt<'tcx>) -> ((), ())
-);
+pub struct BoxedGlobalCtxt<'tcx>(&'tcx GlobalCtxt<'tcx>);
 
-impl BoxedGlobalCtxt {
+impl<'gcx> BoxedGlobalCtxt<'gcx> {
     pub fn enter<F, R>(&mut self, f: F) -> R
     where
         F: for<'tcx> FnOnce(TyCtxt<'tcx>) -> R,
     {
-        self.access(|gcx| ty::tls::enter_global(gcx, |tcx| f(tcx)))
+        ty::tls::enter_global(self.0, |tcx| f(tcx))
+    }
+
+    pub fn print_stats(&self) {
+        self.0.queries.print_stats()
     }
 }
 
-pub fn create_global_ctxt(
-    compiler: &Compiler,
+pub fn create_global_ctxt<'gcx>(
+    compiler: &'gcx Compiler,
     lint_store: Lrc<lint::LintStore>,
-    mut hir_forest: hir::map::Forest,
+    hir_forest: &'gcx hir::map::Forest,
     mut resolver_outputs: ResolverOutputs,
     outputs: OutputFilenames,
     crate_name: &str,
-) -> BoxedGlobalCtxt {
-    let sess = compiler.session().clone();
+    global_ctxt: &'gcx Once<GlobalCtxt<'gcx>>,
+    arenas: &'gcx Once<AllArenas>,
+) -> BoxedGlobalCtxt<'gcx> {
+    let sess = &compiler.session();
     let codegen_backend = compiler.codegen_backend().clone();
-    let crate_name = crate_name.to_string();
     let defs = mem::take(&mut resolver_outputs.definitions);
     let override_queries = compiler.override_queries;
 
-    let ((), result) = BoxedGlobalCtxt::new(static move || {
-        let sess = &*sess;
-
-        let global_ctxt: Option<GlobalCtxt<'_>>;
-        let arenas = AllArenas::new();
+        let arenas = arenas.init_locking(|| AllArenas::new());
 
         // Construct the HIR map.
         let hir_map = time(sess, "indexing HIR", || {
-            hir::map::map_crate(sess, &*resolver_outputs.cstore, &mut hir_forest, &defs)
+            hir::map::map_crate(sess, &*resolver_outputs.cstore, &hir_forest, defs)
         });
 
         let query_result_on_disk_cache = time(sess, "load query result cache", || {
@@ -796,7 +793,7 @@ pub fn create_global_ctxt(
             callback(sess, &mut local_providers, &mut extern_providers);
         }
 
-        let gcx = TyCtxt::create_global_ctxt(
+        let gcx = global_ctxt.init_locking(move || TyCtxt::create_global_ctxt(
             sess,
             lint_store,
             local_providers,
@@ -807,26 +804,15 @@ pub fn create_global_ctxt(
             query_result_on_disk_cache,
             &crate_name,
             &outputs
-        );
+        ));
 
-        global_ctxt = Some(gcx);
-        let gcx = global_ctxt.as_ref().unwrap();
-
-        ty::tls::enter_global(gcx, |tcx| {
+        ty::tls::enter_global(&gcx, |tcx| {
             // Do some initialization of the DepGraph that can only be done with the
             // tcx available.
             time(tcx.sess, "dep graph tcx init", || rustc_incremental::dep_graph_tcx_init(tcx));
         });
 
-        yield BoxedGlobalCtxt::initial_yield(());
-        box_region_allow_access!(for('tcx), (&'tcx GlobalCtxt<'tcx>), (gcx));
-
-        if sess.opts.debugging_opts.query_stats {
-            gcx.queries.print_stats();
-        }
-    });
-
-    result
+    BoxedGlobalCtxt(gcx)
 }
 
 /// Runs the resolution, type-checking, region checking and other