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:
commit
5bd0f32378
8 changed files with 21 additions and 38 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
);
|
);
|
||||||
|
|
|
@ -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" }
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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,)*
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue