Skip to content

Commit bf98263

Browse files
committed
Auto merge of rust-lang#116052 - oli-obk:ceci_nest_pas_une_query, r=WaffleLapkin
Add a way to decouple the implementation and the declaration of a TyCtxt method. properly addresses rust-lang#115819 accepted MCP: rust-lang/compiler-team#395
2 parents 2d08657 + 4ed4913 commit bf98263

File tree

24 files changed

+143
-72
lines changed

24 files changed

+143
-72
lines changed

compiler/rustc_codegen_gcc/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ use rustc_errors::{DiagnosticMessage, ErrorGuaranteed, Handler, SubdiagnosticMes
8080
use rustc_fluent_macro::fluent_messages;
8181
use rustc_metadata::EncodedMetadata;
8282
use rustc_middle::dep_graph::{WorkProduct, WorkProductId};
83-
use rustc_middle::query::Providers;
83+
use rustc_middle::util::Providers;
8484
use rustc_middle::ty::TyCtxt;
8585
use rustc_session::config::{Lto, OptLevel, OutputFilenames};
8686
use rustc_session::Session;

compiler/rustc_codegen_llvm/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ use rustc_errors::{DiagnosticMessage, ErrorGuaranteed, FatalError, Handler, Subd
3939
use rustc_fluent_macro::fluent_messages;
4040
use rustc_metadata::EncodedMetadata;
4141
use rustc_middle::dep_graph::{WorkProduct, WorkProductId};
42-
use rustc_middle::query::Providers;
4342
use rustc_middle::ty::TyCtxt;
43+
use rustc_middle::util::Providers;
4444
use rustc_session::config::{OptLevel, OutputFilenames, PrintKind, PrintRequest};
4545
use rustc_session::Session;
4646
use rustc_span::symbol::Symbol;

compiler/rustc_codegen_ssa/src/back/symbol_export.rs

+4-6
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@ use rustc_middle::middle::exported_symbols::{
1111
metadata_symbol_name, ExportedSymbol, SymbolExportInfo, SymbolExportKind, SymbolExportLevel,
1212
};
1313
use rustc_middle::query::LocalCrate;
14-
use rustc_middle::query::{ExternProviders, Providers};
1514
use rustc_middle::ty::Instance;
1615
use rustc_middle::ty::{self, SymbolName, TyCtxt};
1716
use rustc_middle::ty::{GenericArgKind, GenericArgsRef};
17+
use rustc_middle::util::Providers;
1818
use rustc_session::config::{CrateType, OomStrategy};
1919
use rustc_target::spec::SanitizerSet;
2020

@@ -457,11 +457,9 @@ pub fn provide(providers: &mut Providers) {
457457
providers.is_unreachable_local_definition = is_unreachable_local_definition_provider;
458458
providers.upstream_drop_glue_for = upstream_drop_glue_for_provider;
459459
providers.wasm_import_module_map = wasm_import_module_map;
460-
}
461-
462-
pub fn provide_extern(providers: &mut ExternProviders) {
463-
providers.is_reachable_non_generic = is_reachable_non_generic_provider_extern;
464-
providers.upstream_monomorphizations_for = upstream_monomorphizations_for_provider;
460+
providers.extern_queries.is_reachable_non_generic = is_reachable_non_generic_provider_extern;
461+
providers.extern_queries.upstream_monomorphizations_for =
462+
upstream_monomorphizations_for_provider;
465463
}
466464

467465
fn symbol_export_level(tcx: TyCtxt<'_>, sym_def_id: DefId) -> SymbolExportLevel {

compiler/rustc_codegen_ssa/src/lib.rs

+1-5
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ use rustc_middle::dep_graph::WorkProduct;
3131
use rustc_middle::middle::debugger_visualizer::DebuggerVisualizerFile;
3232
use rustc_middle::middle::dependency_format::Dependencies;
3333
use rustc_middle::middle::exported_symbols::SymbolExportKind;
34-
use rustc_middle::query::{ExternProviders, Providers};
34+
use rustc_middle::util::Providers;
3535
use rustc_serialize::opaque::{FileEncoder, MemDecoder};
3636
use rustc_serialize::{Decodable, Decoder, Encodable, Encoder};
3737
use rustc_session::config::{CrateType, OutputFilenames, OutputType, RUST_CGU_EXT};
@@ -190,10 +190,6 @@ pub fn provide(providers: &mut Providers) {
190190
crate::codegen_attrs::provide(providers);
191191
}
192192

193-
pub fn provide_extern(providers: &mut ExternProviders) {
194-
crate::back::symbol_export::provide_extern(providers);
195-
}
196-
197193
/// Checks if the given filename ends with the `.rcgu.o` extension that `rustc`
198194
/// uses for the object files it generates.
199195
pub fn looks_like_rust_object_file(filename: &str) -> bool {

compiler/rustc_codegen_ssa/src/traits/backend.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ use rustc_data_structures::sync::{DynSend, DynSync};
1111
use rustc_errors::ErrorGuaranteed;
1212
use rustc_metadata::EncodedMetadata;
1313
use rustc_middle::dep_graph::{WorkProduct, WorkProductId};
14-
use rustc_middle::query::{ExternProviders, Providers};
1514
use rustc_middle::ty::layout::{FnAbiOf, HasTyCtxt, LayoutOf, TyAndLayout};
1615
use rustc_middle::ty::{Ty, TyCtxt};
16+
use rustc_middle::util::Providers;
1717
use rustc_session::{
1818
config::{self, OutputFilenames, PrintRequest},
1919
cstore::MetadataLoaderDyn,
@@ -85,7 +85,6 @@ pub trait CodegenBackend {
8585
}
8686

8787
fn provide(&self, _providers: &mut Providers) {}
88-
fn provide_extern(&self, _providers: &mut ExternProviders) {}
8988
fn codegen_crate<'tcx>(
9089
&self,
9190
tcx: TyCtxt<'tcx>,

compiler/rustc_const_eval/src/const_eval/mod.rs

+4-3
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use crate::errors::MaxNumNodesInConstErr;
44
use crate::interpret::{intern_const_alloc_recursive, InternKind, InterpCx, Scalar};
55
use rustc_middle::mir;
66
use rustc_middle::mir::interpret::{EvalToValTreeResult, GlobalId};
7+
use rustc_middle::query::TyCtxtAt;
78
use rustc_middle::ty::{self, Ty, TyCtxt};
89
use rustc_span::{source_map::DUMMY_SP, symbol::Symbol};
910

@@ -86,17 +87,17 @@ pub(crate) fn eval_to_valtree<'tcx>(
8687

8788
#[instrument(skip(tcx), level = "debug")]
8889
pub(crate) fn try_destructure_mir_constant_for_diagnostics<'tcx>(
89-
tcx: TyCtxt<'tcx>,
90+
tcx: TyCtxtAt<'tcx>,
9091
val: mir::ConstValue<'tcx>,
9192
ty: Ty<'tcx>,
9293
) -> Option<mir::DestructuredConstant<'tcx>> {
9394
let param_env = ty::ParamEnv::reveal_all();
94-
let ecx = mk_eval_cx(tcx, DUMMY_SP, param_env, CanAccessStatics::No);
95+
let ecx = mk_eval_cx(tcx.tcx, tcx.span, param_env, CanAccessStatics::No);
9596
let op = ecx.const_val_to_op(val, ty, None).ok()?;
9697

9798
// We go to `usize` as we cannot allocate anything bigger anyway.
9899
let (field_count, variant, down) = match ty.kind() {
99-
ty::Array(_, len) => (len.eval_target_usize(tcx, param_env) as usize, None, op),
100+
ty::Array(_, len) => (len.eval_target_usize(tcx.tcx, param_env) as usize, None, op),
100101
ty::Adt(def, _) if def.variants().is_empty() => {
101102
return None;
102103
}

compiler/rustc_const_eval/src/lib.rs

+3-4
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,7 @@ pub use errors::ReportErrorExt;
3838

3939
use rustc_errors::{DiagnosticMessage, SubdiagnosticMessage};
4040
use rustc_fluent_macro::fluent_messages;
41-
use rustc_middle::query::Providers;
42-
use rustc_middle::ty;
41+
use rustc_middle::{ty, util::Providers};
4342

4443
fluent_messages! { "../messages.ftl" }
4544

@@ -52,8 +51,8 @@ pub fn provide(providers: &mut Providers) {
5251
let (param_env, raw) = param_env_and_value.into_parts();
5352
const_eval::eval_to_valtree(tcx, param_env, raw)
5453
};
55-
providers.try_destructure_mir_constant_for_diagnostics =
56-
|tcx, (cv, ty)| const_eval::try_destructure_mir_constant_for_diagnostics(tcx, cv, ty);
54+
providers.hooks.try_destructure_mir_constant_for_diagnostics =
55+
const_eval::try_destructure_mir_constant_for_diagnostics;
5756
providers.valtree_to_const_val = |tcx, (ty, valtree)| {
5857
const_eval::valtree_to_const_value(tcx, ty::ParamEnv::empty().and(ty), valtree)
5958
};

compiler/rustc_interface/src/interface.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use rustc_data_structures::sync::Lrc;
99
use rustc_errors::registry::Registry;
1010
use rustc_errors::{ErrorGuaranteed, Handler};
1111
use rustc_lint::LintStore;
12-
use rustc_middle::query::{ExternProviders, Providers};
12+
use rustc_middle::util::Providers;
1313
use rustc_middle::{bug, ty};
1414
use rustc_parse::maybe_new_parser_from_source_str;
1515
use rustc_query_impl::QueryCtxt;
@@ -37,7 +37,7 @@ pub struct Compiler {
3737
pub(crate) sess: Lrc<Session>,
3838
codegen_backend: Lrc<dyn CodegenBackend>,
3939
pub(crate) register_lints: Option<Box<dyn Fn(&Session, &mut LintStore) + Send + Sync>>,
40-
pub(crate) override_queries: Option<fn(&Session, &mut Providers, &mut ExternProviders)>,
40+
pub(crate) override_queries: Option<fn(&Session, &mut Providers)>,
4141
}
4242

4343
impl Compiler {
@@ -271,7 +271,7 @@ pub struct Config {
271271
/// the list of queries.
272272
///
273273
/// The second parameter is local providers and the third parameter is external providers.
274-
pub override_queries: Option<fn(&Session, &mut Providers, &mut ExternProviders)>,
274+
pub override_queries: Option<fn(&Session, &mut Providers)>,
275275

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

compiler/rustc_interface/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ pub mod util;
2525

2626
pub use callbacks::setup_callbacks;
2727
pub use interface::{run_compiler, Config};
28-
pub use passes::{DEFAULT_EXTERN_QUERY_PROVIDERS, DEFAULT_QUERY_PROVIDERS};
28+
pub use passes::DEFAULT_QUERY_PROVIDERS;
2929
pub use queries::Queries;
3030

3131
#[cfg(test)]

compiler/rustc_interface/src/passes.rs

+7-16
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ use rustc_lint::{unerased_lint_store, BufferedEarlyLint, EarlyCheckNode, LintSto
1818
use rustc_metadata::creader::CStore;
1919
use rustc_middle::arena::Arena;
2020
use rustc_middle::dep_graph::DepGraph;
21-
use rustc_middle::query::{ExternProviders, Providers};
2221
use rustc_middle::ty::{self, GlobalCtxt, RegisteredTools, TyCtxt};
22+
use rustc_middle::util::Providers;
2323
use rustc_mir_build as mir_build;
2424
use rustc_parse::{parse_crate_from_file, parse_crate_from_source_str, validate_attr};
2525
use rustc_passes::{self, abi_test, hir_stats, layout_test};
@@ -675,13 +675,6 @@ pub static DEFAULT_QUERY_PROVIDERS: LazyLock<Providers> = LazyLock::new(|| {
675675
*providers
676676
});
677677

678-
pub static DEFAULT_EXTERN_QUERY_PROVIDERS: LazyLock<ExternProviders> = LazyLock::new(|| {
679-
let mut extern_providers = ExternProviders::default();
680-
rustc_metadata::provide_extern(&mut extern_providers);
681-
rustc_codegen_ssa::provide_extern(&mut extern_providers);
682-
extern_providers
683-
});
684-
685678
pub fn create_global_ctxt<'tcx>(
686679
compiler: &'tcx Compiler,
687680
crate_types: Vec<CrateType>,
@@ -702,14 +695,11 @@ pub fn create_global_ctxt<'tcx>(
702695
let query_result_on_disk_cache = rustc_incremental::load_query_result_cache(sess);
703696

704697
let codegen_backend = compiler.codegen_backend();
705-
let mut local_providers = *DEFAULT_QUERY_PROVIDERS;
706-
codegen_backend.provide(&mut local_providers);
707-
708-
let mut extern_providers = *DEFAULT_EXTERN_QUERY_PROVIDERS;
709-
codegen_backend.provide_extern(&mut extern_providers);
698+
let mut providers = *DEFAULT_QUERY_PROVIDERS;
699+
codegen_backend.provide(&mut providers);
710700

711701
if let Some(callback) = compiler.override_queries {
712-
callback(sess, &mut local_providers, &mut extern_providers);
702+
callback(sess, &mut providers);
713703
}
714704

715705
let incremental = dep_graph.is_fully_enabled();
@@ -727,11 +717,12 @@ pub fn create_global_ctxt<'tcx>(
727717
dep_graph,
728718
rustc_query_impl::query_callbacks(arena),
729719
rustc_query_impl::query_system(
730-
local_providers,
731-
extern_providers,
720+
providers.queries,
721+
providers.extern_queries,
732722
query_result_on_disk_cache,
733723
incremental,
734724
),
725+
providers.hooks,
735726
)
736727
})
737728
})

compiler/rustc_metadata/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ extern crate rustc_middle;
2626
#[macro_use]
2727
extern crate tracing;
2828

29-
pub use rmeta::{provide, provide_extern};
29+
pub use rmeta::provide;
3030
use rustc_errors::{DiagnosticMessage, SubdiagnosticMessage};
3131
use rustc_fluent_macro::fluent_messages;
3232

compiler/rustc_metadata/src/rmeta/decoder.rs

-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ use std::sync::atomic::Ordering;
4444
use std::{io, iter, mem};
4545

4646
pub(super) use cstore_impl::provide;
47-
pub use cstore_impl::provide_extern;
4847
use rustc_span::hygiene::HygieneDecodeContext;
4948

5049
mod cstore_impl;

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

+6-4
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,11 @@ use rustc_middle::arena::ArenaAllocatable;
1414
use rustc_middle::metadata::ModChild;
1515
use rustc_middle::middle::exported_symbols::ExportedSymbol;
1616
use rustc_middle::middle::stability::DeprecationEntry;
17+
use rustc_middle::query::ExternProviders;
1718
use rustc_middle::query::LocalCrate;
18-
use rustc_middle::query::{ExternProviders, Providers};
1919
use rustc_middle::ty::fast_reject::SimplifiedType;
2020
use rustc_middle::ty::{self, TyCtxt};
21+
use rustc_middle::util::Providers;
2122
use rustc_session::cstore::CrateStore;
2223
use rustc_session::{Session, StableCrateId};
2324
use rustc_span::hygiene::{ExpnHash, ExpnId};
@@ -147,7 +148,7 @@ macro_rules! provide_one {
147148
macro_rules! provide {
148149
($tcx:ident, $def_id:ident, $other:ident, $cdata:ident,
149150
$($name:ident => { $($compute:tt)* })*) => {
150-
pub fn provide_extern(providers: &mut ExternProviders) {
151+
fn provide_extern(providers: &mut ExternProviders) {
151152
$(provide_one! {
152153
$tcx, $def_id, $other, $cdata, $name => { $($compute)* }
153154
})*
@@ -385,7 +386,7 @@ pub(in crate::rmeta) fn provide(providers: &mut Providers) {
385386
// FIXME(#44234) - almost all of these queries have no sub-queries and
386387
// therefore no actual inputs, they're just reading tables calculated in
387388
// resolve! Does this work? Unsure! That's what the issue is about
388-
*providers = Providers {
389+
providers.queries = rustc_middle::query::Providers {
389390
allocator_kind: |tcx, ()| CStore::from_tcx(tcx).allocator_kind(),
390391
alloc_error_handler_kind: |tcx, ()| CStore::from_tcx(tcx).alloc_error_handler_kind(),
391392
is_private_dep: |_tcx, LocalCrate| false,
@@ -513,8 +514,9 @@ pub(in crate::rmeta) fn provide(providers: &mut Providers) {
513514
tcx.untracked().cstore.freeze();
514515
tcx.arena.alloc_from_iter(CStore::from_tcx(tcx).iter_crate_data().map(|(cnum, _)| cnum))
515516
},
516-
..*providers
517+
..providers.queries
517518
};
519+
provide_extern(&mut providers.extern_queries);
518520
}
519521

520522
impl CStore {

compiler/rustc_metadata/src/rmeta/mod.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrs;
2121
use rustc_middle::middle::exported_symbols::{ExportedSymbol, SymbolExportInfo};
2222
use rustc_middle::middle::resolve_bound_vars::ObjectLifetimeDefault;
2323
use rustc_middle::mir;
24-
use rustc_middle::query::Providers;
2524
use rustc_middle::ty::fast_reject::SimplifiedType;
2625
use rustc_middle::ty::{self, ReprOptions, Ty, UnusedGenericParams};
2726
use rustc_middle::ty::{DeducedParamAttrs, GeneratorDiagnosticData, ParameterizedOverTcx, TyCtxt};
27+
use rustc_middle::util::Providers;
2828
use rustc_serialize::opaque::FileEncoder;
2929
use rustc_session::config::SymbolManglingVersion;
3030
use rustc_session::cstore::{CrateDepKind, ForeignModule, LinkagePreference, NativeLib};
@@ -38,7 +38,6 @@ use rustc_target::spec::{PanicStrategy, TargetTriple};
3838
use std::marker::PhantomData;
3939
use std::num::NonZeroUsize;
4040

41-
pub use decoder::provide_extern;
4241
use decoder::DecodeContext;
4342
pub(crate) use decoder::{CrateMetadata, CrateNumMap, MetadataBlob};
4443
use encoder::EncodeContext;
+65
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
use crate::mir;
2+
use crate::query::TyCtxtAt;
3+
use crate::ty::{Ty, TyCtxt};
4+
use rustc_span::DUMMY_SP;
5+
6+
macro_rules! declare_hooks {
7+
($($(#[$attr:meta])*hook $name:ident($($arg:ident: $K:ty),*) -> $V:ty;)*) => {
8+
9+
impl<'tcx> TyCtxt<'tcx> {
10+
$(
11+
$(#[$attr])*
12+
#[inline(always)]
13+
#[must_use]
14+
pub fn $name(self, $($arg: $K,)*) -> $V
15+
{
16+
self.at(DUMMY_SP).$name($($arg,)*)
17+
}
18+
)*
19+
}
20+
21+
impl<'tcx> TyCtxtAt<'tcx> {
22+
$(
23+
$(#[$attr])*
24+
#[inline(always)]
25+
#[must_use]
26+
#[instrument(level = "debug", skip(self), ret)]
27+
pub fn $name(self, $($arg: $K,)*) -> $V
28+
{
29+
(self.tcx.hooks.$name)(self, $($arg,)*)
30+
}
31+
)*
32+
}
33+
34+
pub struct Providers {
35+
$(pub $name: for<'tcx> fn(
36+
TyCtxtAt<'tcx>,
37+
$($arg: $K,)*
38+
) -> $V,)*
39+
}
40+
41+
impl Default for Providers {
42+
fn default() -> Self {
43+
Providers {
44+
$($name: |_, $($arg,)*| bug!(
45+
"`tcx.{}{:?}` cannot be called as `{}` was never assigned to a provider function.\n",
46+
stringify!($name),
47+
($($arg,)*),
48+
stringify!($name),
49+
),)*
50+
}
51+
}
52+
}
53+
54+
impl Copy for Providers {}
55+
impl Clone for Providers {
56+
fn clone(&self) -> Self { *self }
57+
}
58+
};
59+
}
60+
61+
declare_hooks! {
62+
/// Tries to destructure an `mir::Const` ADT or array into its variant index
63+
/// and its field values. This should only be used for pretty printing.
64+
hook try_destructure_mir_constant_for_diagnostics(val: mir::ConstValue<'tcx>, ty: Ty<'tcx>) -> Option<mir::DestructuredConstant<'tcx>>;
65+
}

compiler/rustc_middle/src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ mod macros;
8989
pub mod arena;
9090
pub mod error;
9191
pub mod hir;
92+
pub mod hooks;
9293
pub mod infer;
9394
pub mod lint;
9495
pub mod metadata;

compiler/rustc_middle/src/mir/pretty.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1691,7 +1691,7 @@ fn pretty_print_const_value_tcx<'tcx>(
16911691
(_, ty::Array(..) | ty::Tuple(..) | ty::Adt(..)) if !ty.has_non_region_param() => {
16921692
let ct = tcx.lift(ct).unwrap();
16931693
let ty = tcx.lift(ty).unwrap();
1694-
if let Some(contents) = tcx.try_destructure_mir_constant_for_diagnostics((ct, ty)) {
1694+
if let Some(contents) = tcx.try_destructure_mir_constant_for_diagnostics(ct, ty) {
16951695
let fields: Vec<(ConstValue<'_>, Ty<'_>)> = contents.fields.to_vec();
16961696
match *ty.kind() {
16971697
ty::Array(..) => {

0 commit comments

Comments
 (0)