Rollup merge of #136464 - nnethercote:rm-TyCtxtAt-for-hooks, r=oli-obk

Remove hook calling via `TyCtxtAt`.

All hooks receive a `TyCtxtAt` argument.

Currently hooks can be called through `TyCtxtAt` or `TyCtxt`. In the latter case, a `TyCtxtAt` is constructed with a dummy span and passed to the hook.

However, in practice hooks are never called through `TyCtxtAt`, and always receive a dummy span. (I confirmed this via code inspection, and double-checked it by temporarily making the `TyCtxtAt` code path panic and running all the tests.)

This commit removes all the `TyCtxtAt` machinery for hooks. All hooks now receive `TyCtxt` instead of `TyCtxtAt`. There are two existing hooks that use `TyCtxtAt::span`: `const_caller_location_provider` and `try_destructure_mir_constant_for_user_output`. For both hooks the span is always a dummy span, probably unintentionally. This dummy span use is now explicit. If a non-dummy span is needed for these two hooks it would be easy to add it as an extra argument because hooks are less constrained than queries.

r? `@oli-obk`
This commit is contained in:
许杰友 Jieyou Xu (Joe) 2025-02-03 19:13:29 +08:00 committed by GitHub
commit 5bd0f32378
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 21 additions and 38 deletions

View file

@ -1,7 +1,7 @@
// Not in interpret to make sure we do not use private implementation details // Not in interpret to make sure we do not use private implementation details
use rustc_abi::VariantIdx; use rustc_abi::VariantIdx;
use rustc_middle::query::{Key, TyCtxtAt}; use rustc_middle::query::Key;
use rustc_middle::ty::layout::LayoutOf; use rustc_middle::ty::layout::LayoutOf;
use rustc_middle::ty::{self, Ty, TyCtxt}; use rustc_middle::ty::{self, Ty, TyCtxt};
use rustc_middle::{bug, mir}; use rustc_middle::{bug, mir};
@ -35,16 +35,17 @@ pub(crate) type ValTreeCreationResult<'tcx> = Result<ty::ValTree<'tcx>, ValTreeC
#[instrument(skip(tcx), level = "debug")] #[instrument(skip(tcx), level = "debug")]
pub(crate) fn try_destructure_mir_constant_for_user_output<'tcx>( pub(crate) fn try_destructure_mir_constant_for_user_output<'tcx>(
tcx: TyCtxtAt<'tcx>, tcx: TyCtxt<'tcx>,
val: mir::ConstValue<'tcx>, val: mir::ConstValue<'tcx>,
ty: Ty<'tcx>, ty: Ty<'tcx>,
) -> Option<mir::DestructuredConstant<'tcx>> { ) -> Option<mir::DestructuredConstant<'tcx>> {
let typing_env = ty::TypingEnv::fully_monomorphized(); let typing_env = ty::TypingEnv::fully_monomorphized();
let (ecx, op) = mk_eval_cx_for_const_val(tcx, typing_env, val, ty)?; // FIXME: use a proper span here?
let (ecx, op) = mk_eval_cx_for_const_val(tcx.at(rustc_span::DUMMY_SP), typing_env, val, ty)?;
// We go to `usize` as we cannot allocate anything bigger anyway. // We go to `usize` as we cannot allocate anything bigger anyway.
let (field_count, variant, down) = match ty.kind() { let (field_count, variant, down) = match ty.kind() {
ty::Array(_, len) => (len.try_to_target_usize(tcx.tcx)? as usize, None, op), ty::Array(_, len) => (len.try_to_target_usize(tcx)? as usize, None, op),
ty::Adt(def, _) if def.variants().is_empty() => { ty::Adt(def, _) if def.variants().is_empty() => {
return None; return None;
} }

View file

@ -1,7 +1,6 @@
use rustc_hir::LangItem; use rustc_hir::LangItem;
use rustc_middle::query::TyCtxtAt;
use rustc_middle::ty::layout::LayoutOf; use rustc_middle::ty::layout::LayoutOf;
use rustc_middle::ty::{self}; use rustc_middle::ty::{self, TyCtxt};
use rustc_middle::{bug, mir}; use rustc_middle::{bug, mir};
use rustc_span::Symbol; use rustc_span::Symbol;
use tracing::trace; use tracing::trace;
@ -48,15 +47,15 @@ fn alloc_caller_location<'tcx>(
} }
pub(crate) fn const_caller_location_provider( pub(crate) fn const_caller_location_provider(
tcx: TyCtxtAt<'_>, tcx: TyCtxt<'_>,
file: Symbol, file: Symbol,
line: u32, line: u32,
col: u32, col: u32,
) -> mir::ConstValue<'_> { ) -> mir::ConstValue<'_> {
trace!("const_caller_location: {}:{}:{}", file, line, col); trace!("const_caller_location: {}:{}:{}", file, line, col);
let mut ecx = mk_eval_cx_to_read_const_val( let mut ecx = mk_eval_cx_to_read_const_val(
tcx.tcx, tcx,
tcx.span, rustc_span::DUMMY_SP, // FIXME: use a proper span here?
ty::TypingEnv::fully_monomorphized(), ty::TypingEnv::fully_monomorphized(),
CanAccessMutGlobal::No, CanAccessMutGlobal::No,
); );

View file

@ -24,7 +24,7 @@ use rustc_middle::util::Providers;
#[allow(missing_docs)] #[allow(missing_docs)]
pub fn provide(providers: &mut Providers) { pub fn provide(providers: &mut Providers) {
providers.hooks.save_dep_graph = providers.hooks.save_dep_graph =
|tcx| tcx.sess.time("serialize_dep_graph", || persist::save_dep_graph(tcx.tcx)); |tcx| tcx.sess.time("serialize_dep_graph", || persist::save_dep_graph(tcx));
} }
rustc_fluent_macro::fluent_messages! { "../messages.ftl" } rustc_fluent_macro::fluent_messages! { "../messages.ftl" }

View file

@ -689,7 +689,7 @@ fn provide_cstore_hooks(providers: &mut Providers) {
providers.hooks.def_path_hash_to_def_id_extern = |tcx, hash, stable_crate_id| { providers.hooks.def_path_hash_to_def_id_extern = |tcx, hash, stable_crate_id| {
// If this is a DefPathHash from an upstream crate, let the CrateStore map // If this is a DefPathHash from an upstream crate, let the CrateStore map
// it to a DefId. // it to a DefId.
let cstore = CStore::from_tcx(tcx.tcx); let cstore = CStore::from_tcx(tcx);
let cnum = *tcx let cnum = *tcx
.untracked() .untracked()
.stable_crate_ids .stable_crate_ids
@ -702,11 +702,11 @@ fn provide_cstore_hooks(providers: &mut Providers) {
}; };
providers.hooks.expn_hash_to_expn_id = |tcx, cnum, index_guess, hash| { providers.hooks.expn_hash_to_expn_id = |tcx, cnum, index_guess, hash| {
let cstore = CStore::from_tcx(tcx.tcx); let cstore = CStore::from_tcx(tcx);
cstore.get_crate_data(cnum).expn_hash_to_expn_id(tcx.sess, index_guess, hash) cstore.get_crate_data(cnum).expn_hash_to_expn_id(tcx.sess, index_guess, hash)
}; };
providers.hooks.import_source_files = |tcx, cnum| { providers.hooks.import_source_files = |tcx, cnum| {
let cstore = CStore::from_tcx(tcx.tcx); let cstore = CStore::from_tcx(tcx);
let cdata = cstore.get_crate_data(cnum); let cdata = cstore.get_crate_data(cnum);
for file_index in 0..cdata.root.source_map.size() { for file_index in 0..cdata.root.source_map.size() {
cdata.imported_source_file(file_index as u32, tcx.sess); cdata.imported_source_file(file_index as u32, tcx.sess);

View file

@ -6,11 +6,9 @@
use rustc_hir::def_id::{DefId, DefPathHash}; use rustc_hir::def_id::{DefId, DefPathHash};
use rustc_session::StableCrateId; use rustc_session::StableCrateId;
use rustc_span::def_id::{CrateNum, LocalDefId}; use rustc_span::def_id::{CrateNum, LocalDefId};
use rustc_span::{DUMMY_SP, ExpnHash, ExpnId}; use rustc_span::{ExpnHash, ExpnId};
use tracing::instrument;
use crate::mir; use crate::mir;
use crate::query::TyCtxtAt;
use crate::ty::{Ty, TyCtxt}; use crate::ty::{Ty, TyCtxt};
macro_rules! declare_hooks { macro_rules! declare_hooks {
@ -22,26 +20,14 @@ macro_rules! declare_hooks {
#[inline(always)] #[inline(always)]
pub fn $name(self, $($arg: $K,)*) -> $V pub fn $name(self, $($arg: $K,)*) -> $V
{ {
self.at(DUMMY_SP).$name($($arg,)*) (self.hooks.$name)(self, $($arg,)*)
}
)*
}
impl<'tcx> TyCtxtAt<'tcx> {
$(
$(#[$attr])*
#[inline(always)]
#[instrument(level = "debug", skip(self), ret)]
pub fn $name(self, $($arg: $K,)*) -> $V
{
(self.tcx.hooks.$name)(self, $($arg,)*)
} }
)* )*
} }
pub struct Providers { pub struct Providers {
$(pub $name: for<'tcx> fn( $(pub $name: for<'tcx> fn(
TyCtxtAt<'tcx>, TyCtxt<'tcx>,
$($arg: $K,)* $($arg: $K,)*
) -> $V,)* ) -> $V,)*
} }

View file

@ -6,7 +6,6 @@ use rustc_middle::mir::coverage::{
FunctionCoverageInfo, MappingKind, Op, FunctionCoverageInfo, MappingKind, Op,
}; };
use rustc_middle::mir::{Body, Statement, StatementKind}; use rustc_middle::mir::{Body, Statement, StatementKind};
use rustc_middle::query::TyCtxtAt;
use rustc_middle::ty::{self, TyCtxt}; use rustc_middle::ty::{self, TyCtxt};
use rustc_middle::util::Providers; use rustc_middle::util::Providers;
use rustc_span::def_id::LocalDefId; use rustc_span::def_id::LocalDefId;
@ -15,8 +14,7 @@ use tracing::trace;
/// Registers query/hook implementations related to coverage. /// Registers query/hook implementations related to coverage.
pub(crate) fn provide(providers: &mut Providers) { pub(crate) fn provide(providers: &mut Providers) {
providers.hooks.is_eligible_for_coverage = providers.hooks.is_eligible_for_coverage = is_eligible_for_coverage;
|TyCtxtAt { tcx, .. }, def_id| is_eligible_for_coverage(tcx, def_id);
providers.queries.coverage_attr_on = coverage_attr_on; providers.queries.coverage_attr_on = coverage_attr_on;
providers.queries.coverage_ids_info = coverage_ids_info; providers.queries.coverage_ids_info = coverage_ids_info;
} }

View file

@ -953,7 +953,7 @@ fn visit_instance_use<'tcx>(
/// Returns `true` if we should codegen an instance in the local crate, or returns `false` if we /// Returns `true` if we should codegen an instance in the local crate, or returns `false` if we
/// can just link to the upstream crate and therefore don't need a mono item. /// can just link to the upstream crate and therefore don't need a mono item.
fn should_codegen_locally<'tcx>(tcx: TyCtxtAt<'tcx>, instance: Instance<'tcx>) -> bool { fn should_codegen_locally<'tcx>(tcx: TyCtxt<'tcx>, instance: Instance<'tcx>) -> bool {
let Some(def_id) = instance.def.def_id_if_not_guaranteed_local_codegen() else { let Some(def_id) = instance.def.def_id_if_not_guaranteed_local_codegen() else {
return true; return true;
}; };
@ -976,7 +976,7 @@ fn should_codegen_locally<'tcx>(tcx: TyCtxtAt<'tcx>, instance: Instance<'tcx>) -
return true; return true;
} }
if tcx.is_reachable_non_generic(def_id) || instance.upstream_monomorphization(*tcx).is_some() { if tcx.is_reachable_non_generic(def_id) || instance.upstream_monomorphization(tcx).is_some() {
// We can link to the item in question, no instance needed in this crate. // We can link to the item in question, no instance needed in this crate.
return false; return false;
} }

View file

@ -224,7 +224,6 @@ pub fn query_system<'a>(
rustc_middle::rustc_query_append! { define_queries! } rustc_middle::rustc_query_append! { define_queries! }
pub fn provide(providers: &mut rustc_middle::util::Providers) { pub fn provide(providers: &mut rustc_middle::util::Providers) {
providers.hooks.alloc_self_profile_query_strings = providers.hooks.alloc_self_profile_query_strings = alloc_self_profile_query_strings;
|tcx| alloc_self_profile_query_strings(tcx.tcx); providers.hooks.query_key_hash_verify_all = query_key_hash_verify_all;
providers.hooks.query_key_hash_verify_all = |tcx| query_key_hash_verify_all(tcx.tcx);
} }