diff options
| author | Manish Goregaokar <manishsmail@gmail.com> | 2020-07-15 11:01:29 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-07-15 11:01:29 -0700 |
| commit | dceafac96dd857031bd11a0c3078cde9a75ccd86 (patch) | |
| tree | af428986997b645ecdf10a16e2cf56df254e868e | |
| parent | bee28990d3d3c43f1c6dd83e4623cfa3e5f65caf (diff) | |
| parent | f6764c42ab3a7d8875680536ec1e8df7d0ed3100 (diff) | |
| download | rust-dceafac96dd857031bd11a0c3078cde9a75ccd86.tar.gz rust-dceafac96dd857031bd11a0c3078cde9a75ccd86.zip | |
Rollup merge of #74347 - jyn514:ive-got-a-small-query-for-you, r=eddyb
Initialize default providers only once This avoids copying a new `Providers` struct for each downstream crate that wants to use it. Follow-up to https://github.com/rust-lang/rust/pull/74283 without the perf hit. r? @eddyb
| -rw-r--r-- | src/librustc_interface/lib.rs | 1 | ||||
| -rw-r--r-- | src/librustc_interface/passes.rs | 25 |
2 files changed, 16 insertions, 10 deletions
diff --git a/src/librustc_interface/lib.rs b/src/librustc_interface/lib.rs index 0650d090034..fe40c615f79 100644 --- a/src/librustc_interface/lib.rs +++ b/src/librustc_interface/lib.rs @@ -14,6 +14,7 @@ mod queries; pub mod util; pub use interface::{run_compiler, Config}; +pub use passes::{DEFAULT_EXTERN_QUERY_PROVIDERS, DEFAULT_QUERY_PROVIDERS}; pub use queries::Queries; #[cfg(test)] diff --git a/src/librustc_interface/passes.rs b/src/librustc_interface/passes.rs index 533d0a6d383..af4397075bb 100644 --- a/src/librustc_interface/passes.rs +++ b/src/librustc_interface/passes.rs @@ -3,6 +3,7 @@ use crate::proc_macro_decls; use crate::util; use log::{info, log_enabled, warn}; +use once_cell::sync::Lazy; use rustc_ast::mut_visit::MutVisitor; use rustc_ast::{self, ast, visit}; use rustc_codegen_ssa::back::link::emit_metadata; @@ -19,6 +20,7 @@ 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::Providers; use rustc_middle::ty::steal::Steal; use rustc_middle::ty::{self, GlobalCtxt, ResolverOutputs, TyCtxt}; use rustc_mir as mir; @@ -719,7 +721,8 @@ pub fn prepare_outputs( Ok(outputs) } -pub fn default_provide(providers: &mut ty::query::Providers) { +pub static DEFAULT_QUERY_PROVIDERS: Lazy<Providers> = Lazy::new(|| { + let providers = &mut Providers::default(); providers.analysis = analysis; proc_macro_decls::provide(providers); plugin::build::provide(providers); @@ -738,12 +741,15 @@ pub fn default_provide(providers: &mut ty::query::Providers) { rustc_lint::provide(providers); rustc_symbol_mangling::provide(providers); rustc_codegen_ssa::provide(providers); -} + *providers +}); -pub fn default_provide_extern(providers: &mut ty::query::Providers) { - rustc_metadata::provide_extern(providers); - rustc_codegen_ssa::provide_extern(providers); -} +pub static DEFAULT_EXTERN_QUERY_PROVIDERS: Lazy<Providers> = Lazy::new(|| { + let mut extern_providers = *DEFAULT_QUERY_PROVIDERS; + rustc_metadata::provide_extern(&mut extern_providers); + rustc_codegen_ssa::provide_extern(&mut extern_providers); + extern_providers +}); pub struct QueryContext<'tcx>(&'tcx GlobalCtxt<'tcx>); @@ -780,12 +786,11 @@ pub fn create_global_ctxt<'tcx>( let query_result_on_disk_cache = rustc_incremental::load_query_result_cache(sess); let codegen_backend = compiler.codegen_backend(); - let mut local_providers = ty::query::Providers::default(); - default_provide(&mut local_providers); + let mut local_providers = *DEFAULT_QUERY_PROVIDERS; codegen_backend.provide(&mut local_providers); - let mut extern_providers = local_providers; - default_provide_extern(&mut extern_providers); + let mut extern_providers = *DEFAULT_EXTERN_QUERY_PROVIDERS; + codegen_backend.provide(&mut extern_providers); codegen_backend.provide_extern(&mut extern_providers); if let Some(callback) = compiler.override_queries { |
