Skip to content

Commit dceafac

Browse files
authored
Rollup merge of rust-lang#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 rust-lang#74283 without the perf hit. r? @eddyb
2 parents bee2899 + f6764c4 commit dceafac

File tree

2 files changed

+16
-10
lines changed

2 files changed

+16
-10
lines changed

src/librustc_interface/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ mod queries;
1414
pub mod util;
1515

1616
pub use interface::{run_compiler, Config};
17+
pub use passes::{DEFAULT_EXTERN_QUERY_PROVIDERS, DEFAULT_QUERY_PROVIDERS};
1718
pub use queries::Queries;
1819

1920
#[cfg(test)]

src/librustc_interface/passes.rs

+15-10
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use crate::proc_macro_decls;
33
use crate::util;
44

55
use log::{info, log_enabled, warn};
6+
use once_cell::sync::Lazy;
67
use rustc_ast::mut_visit::MutVisitor;
78
use rustc_ast::{self, ast, visit};
89
use rustc_codegen_ssa::back::link::emit_metadata;
@@ -19,6 +20,7 @@ use rustc_middle::arena::Arena;
1920
use rustc_middle::dep_graph::DepGraph;
2021
use rustc_middle::middle;
2122
use rustc_middle::middle::cstore::{CrateStore, MetadataLoader, MetadataLoaderDyn};
23+
use rustc_middle::ty::query::Providers;
2224
use rustc_middle::ty::steal::Steal;
2325
use rustc_middle::ty::{self, GlobalCtxt, ResolverOutputs, TyCtxt};
2426
use rustc_mir as mir;
@@ -719,7 +721,8 @@ pub fn prepare_outputs(
719721
Ok(outputs)
720722
}
721723

722-
pub fn default_provide(providers: &mut ty::query::Providers) {
724+
pub static DEFAULT_QUERY_PROVIDERS: Lazy<Providers> = Lazy::new(|| {
725+
let providers = &mut Providers::default();
723726
providers.analysis = analysis;
724727
proc_macro_decls::provide(providers);
725728
plugin::build::provide(providers);
@@ -738,12 +741,15 @@ pub fn default_provide(providers: &mut ty::query::Providers) {
738741
rustc_lint::provide(providers);
739742
rustc_symbol_mangling::provide(providers);
740743
rustc_codegen_ssa::provide(providers);
741-
}
744+
*providers
745+
});
742746

743-
pub fn default_provide_extern(providers: &mut ty::query::Providers) {
744-
rustc_metadata::provide_extern(providers);
745-
rustc_codegen_ssa::provide_extern(providers);
746-
}
747+
pub static DEFAULT_EXTERN_QUERY_PROVIDERS: Lazy<Providers> = Lazy::new(|| {
748+
let mut extern_providers = *DEFAULT_QUERY_PROVIDERS;
749+
rustc_metadata::provide_extern(&mut extern_providers);
750+
rustc_codegen_ssa::provide_extern(&mut extern_providers);
751+
extern_providers
752+
});
747753

748754
pub struct QueryContext<'tcx>(&'tcx GlobalCtxt<'tcx>);
749755

@@ -780,12 +786,11 @@ pub fn create_global_ctxt<'tcx>(
780786
let query_result_on_disk_cache = rustc_incremental::load_query_result_cache(sess);
781787

782788
let codegen_backend = compiler.codegen_backend();
783-
let mut local_providers = ty::query::Providers::default();
784-
default_provide(&mut local_providers);
789+
let mut local_providers = *DEFAULT_QUERY_PROVIDERS;
785790
codegen_backend.provide(&mut local_providers);
786791

787-
let mut extern_providers = local_providers;
788-
default_provide_extern(&mut extern_providers);
792+
let mut extern_providers = *DEFAULT_EXTERN_QUERY_PROVIDERS;
793+
codegen_backend.provide(&mut extern_providers);
789794
codegen_backend.provide_extern(&mut extern_providers);
790795

791796
if let Some(callback) = compiler.override_queries {

0 commit comments

Comments
 (0)