Skip to content

Commit 17e13b5

Browse files
committed
Auto merge of #85830 - bjorn3:separate_provide_extern, r=cjgillot
Avoid a branch on key being local for queries that use the same local and extern providers Currently based on #85810 as it slightly conflicts with it. Only the last two commits are new.
2 parents ffba430 + 13abc1a commit 17e13b5

File tree

12 files changed

+191
-30
lines changed

12 files changed

+191
-30
lines changed

compiler/rustc_codegen_ssa/src/back/symbol_export.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags;
1111
use rustc_middle::middle::exported_symbols::{
1212
metadata_symbol_name, ExportedSymbol, SymbolExportLevel,
1313
};
14-
use rustc_middle::ty::query::Providers;
14+
use rustc_middle::ty::query::{ExternProviders, Providers};
1515
use rustc_middle::ty::subst::{GenericArgKind, SubstsRef};
1616
use rustc_middle::ty::Instance;
1717
use rustc_middle::ty::{SymbolName, TyCtxt};
@@ -363,7 +363,7 @@ pub fn provide(providers: &mut Providers) {
363363
providers.wasm_import_module_map = wasm_import_module_map;
364364
}
365365

366-
pub fn provide_extern(providers: &mut Providers) {
366+
pub fn provide_extern(providers: &mut ExternProviders) {
367367
providers.is_reachable_non_generic = is_reachable_non_generic_provider_extern;
368368
providers.upstream_monomorphizations_for = upstream_monomorphizations_for_provider;
369369
}

compiler/rustc_codegen_ssa/src/lib.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ use rustc_hir::def_id::CrateNum;
2828
use rustc_hir::LangItem;
2929
use rustc_middle::dep_graph::WorkProduct;
3030
use rustc_middle::middle::dependency_format::Dependencies;
31-
use rustc_middle::ty::query::Providers;
31+
use rustc_middle::ty::query::{ExternProviders, Providers};
3232
use rustc_session::config::{CrateType, OutputFilenames, OutputType, RUST_CGU_EXT};
3333
use rustc_session::cstore::{self, CrateSource};
3434
use rustc_session::utils::NativeLibKind;
@@ -170,7 +170,7 @@ pub fn provide(providers: &mut Providers) {
170170
crate::target_features::provide(providers);
171171
}
172172

173-
pub fn provide_extern(providers: &mut Providers) {
173+
pub fn provide_extern(providers: &mut ExternProviders) {
174174
crate::back::symbol_export::provide_extern(providers);
175175
}
176176

compiler/rustc_codegen_ssa/src/traits/backend.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use rustc_errors::ErrorReported;
99
use rustc_metadata::EncodedMetadata;
1010
use rustc_middle::dep_graph::{WorkProduct, WorkProductId};
1111
use rustc_middle::ty::layout::{FnAbiOf, HasTyCtxt, LayoutOf, TyAndLayout};
12-
use rustc_middle::ty::query::Providers;
12+
use rustc_middle::ty::query::{ExternProviders, Providers};
1313
use rustc_middle::ty::{Ty, TyCtxt};
1414
use rustc_session::{
1515
config::{self, OutputFilenames, PrintRequest},
@@ -80,7 +80,7 @@ pub trait CodegenBackend {
8080
}
8181

8282
fn provide(&self, _providers: &mut Providers) {}
83-
fn provide_extern(&self, _providers: &mut Providers) {}
83+
fn provide_extern(&self, _providers: &mut ExternProviders) {}
8484
fn codegen_crate<'tcx>(
8585
&self,
8686
tcx: TyCtxt<'tcx>,

compiler/rustc_interface/src/interface.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ pub struct Compiler {
3838
pub(crate) output_file: Option<PathBuf>,
3939
pub(crate) register_lints: Option<Box<dyn Fn(&Session, &mut LintStore) + Send + Sync>>,
4040
pub(crate) override_queries:
41-
Option<fn(&Session, &mut ty::query::Providers, &mut ty::query::Providers)>,
41+
Option<fn(&Session, &mut ty::query::Providers, &mut ty::query::ExternProviders)>,
4242
}
4343

4444
impl Compiler {
@@ -155,7 +155,7 @@ pub struct Config {
155155
///
156156
/// The second parameter is local providers and the third parameter is external providers.
157157
pub override_queries:
158-
Option<fn(&Session, &mut ty::query::Providers, &mut ty::query::Providers)>,
158+
Option<fn(&Session, &mut ty::query::Providers, &mut ty::query::ExternProviders)>,
159159

160160
/// This is a callback from the driver that is called to create a codegen backend.
161161
pub make_codegen_backend:

compiler/rustc_interface/src/passes.rs

+3-4
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use rustc_metadata::creader::CStore;
1919
use rustc_metadata::{encode_metadata, EncodedMetadata};
2020
use rustc_middle::arena::Arena;
2121
use rustc_middle::dep_graph::DepGraph;
22-
use rustc_middle::ty::query::Providers;
22+
use rustc_middle::ty::query::{ExternProviders, Providers};
2323
use rustc_middle::ty::{self, GlobalCtxt, ResolverOutputs, TyCtxt};
2424
use rustc_mir_build as mir_build;
2525
use rustc_parse::{parse_crate_from_file, parse_crate_from_source_str, validate_attr};
@@ -764,8 +764,8 @@ pub static DEFAULT_QUERY_PROVIDERS: SyncLazy<Providers> = SyncLazy::new(|| {
764764
*providers
765765
});
766766

767-
pub static DEFAULT_EXTERN_QUERY_PROVIDERS: SyncLazy<Providers> = SyncLazy::new(|| {
768-
let mut extern_providers = *DEFAULT_QUERY_PROVIDERS;
767+
pub static DEFAULT_EXTERN_QUERY_PROVIDERS: SyncLazy<ExternProviders> = SyncLazy::new(|| {
768+
let mut extern_providers = ExternProviders::default();
769769
rustc_metadata::provide_extern(&mut extern_providers);
770770
rustc_codegen_ssa::provide_extern(&mut extern_providers);
771771
extern_providers
@@ -816,7 +816,6 @@ pub fn create_global_ctxt<'tcx>(
816816
codegen_backend.provide(&mut local_providers);
817817

818818
let mut extern_providers = *DEFAULT_EXTERN_QUERY_PROVIDERS;
819-
codegen_backend.provide(&mut extern_providers);
820819
codegen_backend.provide_extern(&mut extern_providers);
821820

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

compiler/rustc_macros/src/query.rs

+23
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ enum QueryModifier {
5555

5656
/// Always evaluate the query, ignoring its dependencies
5757
EvalAlways(Ident),
58+
59+
/// Use a separate query provider for local and extern crates
60+
SeparateProvideExtern(Ident),
5861
}
5962

6063
impl Parse for QueryModifier {
@@ -118,6 +121,8 @@ impl Parse for QueryModifier {
118121
Ok(QueryModifier::Anon(modifier))
119122
} else if modifier == "eval_always" {
120123
Ok(QueryModifier::EvalAlways(modifier))
124+
} else if modifier == "separate_provide_extern" {
125+
Ok(QueryModifier::SeparateProvideExtern(modifier))
121126
} else {
122127
Err(Error::new(modifier.span(), "unknown query modifier"))
123128
}
@@ -214,6 +219,9 @@ struct QueryModifiers {
214219

215220
// Always evaluate the query, ignoring its dependencies
216221
eval_always: Option<Ident>,
222+
223+
/// Use a separate query provider for local and extern crates
224+
separate_provide_extern: Option<Ident>,
217225
}
218226

219227
/// Process query modifiers into a struct, erroring on duplicates
@@ -227,6 +235,7 @@ fn process_modifiers(query: &mut Query) -> QueryModifiers {
227235
let mut no_hash = None;
228236
let mut anon = None;
229237
let mut eval_always = None;
238+
let mut separate_provide_extern = None;
230239
for modifier in query.modifiers.0.drain(..) {
231240
match modifier {
232241
QueryModifier::LoadCached(tcx, id, block) => {
@@ -317,6 +326,15 @@ fn process_modifiers(query: &mut Query) -> QueryModifiers {
317326
}
318327
eval_always = Some(ident);
319328
}
329+
QueryModifier::SeparateProvideExtern(ident) => {
330+
if separate_provide_extern.is_some() {
331+
panic!(
332+
"duplicate modifier `separate_provide_extern` for query `{}`",
333+
query.name
334+
);
335+
}
336+
separate_provide_extern = Some(ident);
337+
}
320338
}
321339
}
322340
let desc = desc.unwrap_or_else(|| {
@@ -332,6 +350,7 @@ fn process_modifiers(query: &mut Query) -> QueryModifiers {
332350
no_hash,
333351
anon,
334352
eval_always,
353+
separate_provide_extern,
335354
}
336355
}
337356

@@ -462,6 +481,10 @@ pub fn rustc_queries(input: TokenStream) -> TokenStream {
462481
if let Some(eval_always) = &modifiers.eval_always {
463482
attributes.push(quote! { (#eval_always) });
464483
};
484+
// Pass on the separate_provide_extern modifier
485+
if let Some(separate_provide_extern) = &modifiers.separate_provide_extern {
486+
attributes.push(quote! { (#separate_provide_extern) });
487+
}
465488

466489
// This uses the span of the query definition for the commas,
467490
// which can be important if we later encounter any ambiguity

compiler/rustc_metadata/src/rmeta/decoder/cstore_impl.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use rustc_hir::definitions::{DefKey, DefPath, DefPathHash};
1010
use rustc_middle::hir::exports::Export;
1111
use rustc_middle::middle::exported_symbols::ExportedSymbol;
1212
use rustc_middle::middle::stability::DeprecationEntry;
13-
use rustc_middle::ty::query::Providers;
13+
use rustc_middle::ty::query::{ExternProviders, Providers};
1414
use rustc_middle::ty::{self, TyCtxt, Visibility};
1515
use rustc_session::cstore::{CrateSource, CrateStore, ForeignModule};
1616
use rustc_session::utils::NativeLibKind;
@@ -26,7 +26,7 @@ use std::any::Any;
2626
macro_rules! provide {
2727
(<$lt:tt> $tcx:ident, $def_id:ident, $other:ident, $cdata:ident,
2828
$($name:ident => $compute:block)*) => {
29-
pub fn provide_extern(providers: &mut Providers) {
29+
pub fn provide_extern(providers: &mut ExternProviders) {
3030
$(fn $name<$lt>(
3131
$tcx: TyCtxt<$lt>,
3232
def_id_arg: ty::query::query_keys::$name<$lt>,
@@ -51,7 +51,7 @@ macro_rules! provide {
5151
$compute
5252
})*
5353

54-
*providers = Providers {
54+
*providers = ExternProviders {
5555
$($name,)*
5656
..*providers
5757
};

0 commit comments

Comments
 (0)