1
Fork 0

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.
This commit is contained in:
Nicholas Nethercote 2025-01-31 16:52:39 +11:00
parent e08cd3cf05
commit e661514bda
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);
} }