Rename tcx.ensure_with_value()
to tcx.ensure_done()
This commit is contained in:
parent
24cdaa146a
commit
9e4f10db65
8 changed files with 37 additions and 25 deletions
|
@ -418,10 +418,10 @@ fn compute_hir_hash(
|
||||||
pub fn lower_to_hir(tcx: TyCtxt<'_>, (): ()) -> hir::Crate<'_> {
|
pub fn lower_to_hir(tcx: TyCtxt<'_>, (): ()) -> hir::Crate<'_> {
|
||||||
let sess = tcx.sess;
|
let sess = tcx.sess;
|
||||||
// Queries that borrow `resolver_for_lowering`.
|
// Queries that borrow `resolver_for_lowering`.
|
||||||
tcx.ensure_with_value().output_filenames(());
|
tcx.ensure_done().output_filenames(());
|
||||||
tcx.ensure_with_value().early_lint_checks(());
|
tcx.ensure_done().early_lint_checks(());
|
||||||
tcx.ensure_with_value().debugger_visualizers(LOCAL_CRATE);
|
tcx.ensure_done().debugger_visualizers(LOCAL_CRATE);
|
||||||
tcx.ensure_with_value().get_lang_items(());
|
tcx.ensure_done().get_lang_items(());
|
||||||
let (mut resolver, krate) = tcx.resolver_for_lowering().steal();
|
let (mut resolver, krate) = tcx.resolver_for_lowering().steal();
|
||||||
|
|
||||||
let ast_index = index_crate(&resolver.node_id_to_def_id, &krate);
|
let ast_index = index_crate(&resolver.node_id_to_def_id, &krate);
|
||||||
|
|
|
@ -868,7 +868,7 @@ fn run_required_analyses(tcx: TyCtxt<'_>) {
|
||||||
sess.time("MIR_coroutine_by_move_body", || {
|
sess.time("MIR_coroutine_by_move_body", || {
|
||||||
tcx.hir().par_body_owners(|def_id| {
|
tcx.hir().par_body_owners(|def_id| {
|
||||||
if tcx.needs_coroutine_by_move_body_def_id(def_id.to_def_id()) {
|
if tcx.needs_coroutine_by_move_body_def_id(def_id.to_def_id()) {
|
||||||
tcx.ensure_with_value().coroutine_by_move_body_def_id(def_id);
|
tcx.ensure_done().coroutine_by_move_body_def_id(def_id);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -2191,13 +2191,13 @@ fn prefetch_mir(tcx: TyCtxt<'_>) {
|
||||||
let (encode_const, encode_opt) = should_encode_mir(tcx, reachable_set, def_id);
|
let (encode_const, encode_opt) = should_encode_mir(tcx, reachable_set, def_id);
|
||||||
|
|
||||||
if encode_const {
|
if encode_const {
|
||||||
tcx.ensure_with_value().mir_for_ctfe(def_id);
|
tcx.ensure_done().mir_for_ctfe(def_id);
|
||||||
}
|
}
|
||||||
if encode_opt {
|
if encode_opt {
|
||||||
tcx.ensure_with_value().optimized_mir(def_id);
|
tcx.ensure_done().optimized_mir(def_id);
|
||||||
}
|
}
|
||||||
if encode_opt || encode_const {
|
if encode_opt || encode_const {
|
||||||
tcx.ensure_with_value().promoted_mir(def_id);
|
tcx.ensure_done().promoted_mir(def_id);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -91,7 +91,7 @@ pub use keys::{AsLocalKey, Key, LocalCrate};
|
||||||
pub mod on_disk_cache;
|
pub mod on_disk_cache;
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
pub mod plumbing;
|
pub mod plumbing;
|
||||||
pub use plumbing::{IntoQueryParam, TyCtxtAt, TyCtxtEnsureOk, TyCtxtEnsureWithValue};
|
pub use plumbing::{IntoQueryParam, TyCtxtAt, TyCtxtEnsureDone, TyCtxtEnsureOk};
|
||||||
|
|
||||||
// Each of these queries corresponds to a function pointer field in the
|
// Each of these queries corresponds to a function pointer field in the
|
||||||
// `Providers` struct for requesting a value of that type, and a method
|
// `Providers` struct for requesting a value of that type, and a method
|
||||||
|
|
|
@ -93,7 +93,7 @@ pub struct TyCtxtEnsureOk<'tcx> {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone)]
|
#[derive(Copy, Clone)]
|
||||||
pub struct TyCtxtEnsureWithValue<'tcx> {
|
pub struct TyCtxtEnsureDone<'tcx> {
|
||||||
pub tcx: TyCtxt<'tcx>,
|
pub tcx: TyCtxt<'tcx>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -123,13 +123,25 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||||
TyCtxtEnsureOk { tcx: self }
|
TyCtxtEnsureOk { tcx: self }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns a transparent wrapper for `TyCtxt`, which ensures queries
|
/// Wrapper that calls queries in a special "ensure done" mode, for callers
|
||||||
/// are executed instead of just returning their results.
|
/// that don't need the return value and just want to guarantee that the
|
||||||
|
/// query won't be executed in the future, by executing it now if necessary.
|
||||||
///
|
///
|
||||||
/// This version verifies that the computed result exists in the cache before returning.
|
/// This is useful for queries that read from a [`Steal`] value, to ensure
|
||||||
|
/// that they are executed before the query that will steal the value.
|
||||||
|
///
|
||||||
|
/// Unlike [`Self::ensure_ok`], a query with all-green inputs will only be
|
||||||
|
/// skipped if its return value is stored in the disk-cache. This is still
|
||||||
|
/// more efficient than a regular query, because in that situation the
|
||||||
|
/// return value doesn't necessarily need to be decoded.
|
||||||
|
///
|
||||||
|
/// (As with all query calls, execution is also skipped if the query result
|
||||||
|
/// is already cached in memory.)
|
||||||
|
///
|
||||||
|
/// [`Steal`]: rustc_data_structures::steal::Steal
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub fn ensure_with_value(self) -> TyCtxtEnsureWithValue<'tcx> {
|
pub fn ensure_done(self) -> TyCtxtEnsureDone<'tcx> {
|
||||||
TyCtxtEnsureWithValue { tcx: self }
|
TyCtxtEnsureDone { tcx: self }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns a transparent wrapper for `TyCtxt` which uses
|
/// Returns a transparent wrapper for `TyCtxt` which uses
|
||||||
|
@ -419,7 +431,7 @@ macro_rules! define_callbacks {
|
||||||
})*
|
})*
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> TyCtxtEnsureWithValue<'tcx> {
|
impl<'tcx> TyCtxtEnsureDone<'tcx> {
|
||||||
$($(#[$attr])*
|
$($(#[$attr])*
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub fn $name(self, key: query_helper_param_ty!($($K)*)) {
|
pub fn $name(self, key: query_helper_param_ty!($($K)*)) {
|
||||||
|
|
|
@ -47,7 +47,7 @@ pub(crate) fn closure_saved_names_of_captured_variables<'tcx>(
|
||||||
/// Create the MIR for a given `DefId`, including unreachable code. Do not call
|
/// Create the MIR for a given `DefId`, including unreachable code. Do not call
|
||||||
/// this directly; instead use the cached version via `mir_built`.
|
/// this directly; instead use the cached version via `mir_built`.
|
||||||
pub fn build_mir<'tcx>(tcx: TyCtxt<'tcx>, def: LocalDefId) -> Body<'tcx> {
|
pub fn build_mir<'tcx>(tcx: TyCtxt<'tcx>, def: LocalDefId) -> Body<'tcx> {
|
||||||
tcx.ensure_with_value().thir_abstract_const(def);
|
tcx.ensure_done().thir_abstract_const(def);
|
||||||
if let Err(e) = tcx.check_match(def) {
|
if let Err(e) = tcx.check_match(def) {
|
||||||
return construct_error(tcx, def, e);
|
return construct_error(tcx, def, e);
|
||||||
}
|
}
|
||||||
|
|
|
@ -200,7 +200,7 @@ impl<'tcx> UnsafetyVisitor<'_, 'tcx> {
|
||||||
fn visit_inner_body(&mut self, def: LocalDefId) {
|
fn visit_inner_body(&mut self, def: LocalDefId) {
|
||||||
if let Ok((inner_thir, expr)) = self.tcx.thir_body(def) {
|
if let Ok((inner_thir, expr)) = self.tcx.thir_body(def) {
|
||||||
// Runs all other queries that depend on THIR.
|
// Runs all other queries that depend on THIR.
|
||||||
self.tcx.ensure_with_value().mir_built(def);
|
self.tcx.ensure_done().mir_built(def);
|
||||||
let inner_thir = &inner_thir.steal();
|
let inner_thir = &inner_thir.steal();
|
||||||
let hir_context = self.tcx.local_def_id_to_hir_id(def);
|
let hir_context = self.tcx.local_def_id_to_hir_id(def);
|
||||||
let safety_context = mem::replace(&mut self.safety_context, SafetyContext::Safe);
|
let safety_context = mem::replace(&mut self.safety_context, SafetyContext::Safe);
|
||||||
|
@ -1112,7 +1112,7 @@ pub(crate) fn check_unsafety(tcx: TyCtxt<'_>, def: LocalDefId) {
|
||||||
|
|
||||||
let Ok((thir, expr)) = tcx.thir_body(def) else { return };
|
let Ok((thir, expr)) = tcx.thir_body(def) else { return };
|
||||||
// Runs all other queries that depend on THIR.
|
// Runs all other queries that depend on THIR.
|
||||||
tcx.ensure_with_value().mir_built(def);
|
tcx.ensure_done().mir_built(def);
|
||||||
let thir = &thir.steal();
|
let thir = &thir.steal();
|
||||||
|
|
||||||
let hir_id = tcx.local_def_id_to_hir_id(def);
|
let hir_id = tcx.local_def_id_to_hir_id(def);
|
||||||
|
|
|
@ -421,11 +421,11 @@ fn mir_promoted(
|
||||||
};
|
};
|
||||||
|
|
||||||
// the `has_ffi_unwind_calls` query uses the raw mir, so make sure it is run.
|
// the `has_ffi_unwind_calls` query uses the raw mir, so make sure it is run.
|
||||||
tcx.ensure_with_value().has_ffi_unwind_calls(def);
|
tcx.ensure_done().has_ffi_unwind_calls(def);
|
||||||
|
|
||||||
// the `by_move_body` query uses the raw mir, so make sure it is run.
|
// the `by_move_body` query uses the raw mir, so make sure it is run.
|
||||||
if tcx.needs_coroutine_by_move_body_def_id(def.to_def_id()) {
|
if tcx.needs_coroutine_by_move_body_def_id(def.to_def_id()) {
|
||||||
tcx.ensure_with_value().coroutine_by_move_body_def_id(def);
|
tcx.ensure_done().coroutine_by_move_body_def_id(def);
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut body = tcx.mir_built(def).steal();
|
let mut body = tcx.mir_built(def).steal();
|
||||||
|
@ -488,7 +488,7 @@ fn inner_mir_for_ctfe(tcx: TyCtxt<'_>, def: LocalDefId) -> Body<'_> {
|
||||||
/// end up missing the source MIR due to stealing happening.
|
/// end up missing the source MIR due to stealing happening.
|
||||||
fn mir_drops_elaborated_and_const_checked(tcx: TyCtxt<'_>, def: LocalDefId) -> &Steal<Body<'_>> {
|
fn mir_drops_elaborated_and_const_checked(tcx: TyCtxt<'_>, def: LocalDefId) -> &Steal<Body<'_>> {
|
||||||
if tcx.is_coroutine(def.to_def_id()) {
|
if tcx.is_coroutine(def.to_def_id()) {
|
||||||
tcx.ensure_with_value().mir_coroutine_witnesses(def);
|
tcx.ensure_done().mir_coroutine_witnesses(def);
|
||||||
}
|
}
|
||||||
|
|
||||||
// We only need to borrowck non-synthetic MIR.
|
// We only need to borrowck non-synthetic MIR.
|
||||||
|
@ -501,7 +501,7 @@ fn mir_drops_elaborated_and_const_checked(tcx: TyCtxt<'_>, def: LocalDefId) -> &
|
||||||
if pm::should_run_pass(tcx, &inline::Inline, pm::Optimizations::Allowed)
|
if pm::should_run_pass(tcx, &inline::Inline, pm::Optimizations::Allowed)
|
||||||
|| inline::ForceInline::should_run_pass_for_callee(tcx, def.to_def_id())
|
|| inline::ForceInline::should_run_pass_for_callee(tcx, def.to_def_id())
|
||||||
{
|
{
|
||||||
tcx.ensure_with_value().mir_inliner_callees(ty::InstanceKind::Item(def.to_def_id()));
|
tcx.ensure_done().mir_inliner_callees(ty::InstanceKind::Item(def.to_def_id()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -733,7 +733,7 @@ fn inner_optimized_mir(tcx: TyCtxt<'_>, did: LocalDefId) -> Body<'_> {
|
||||||
// Run the `mir_for_ctfe` query, which depends on `mir_drops_elaborated_and_const_checked`
|
// Run the `mir_for_ctfe` query, which depends on `mir_drops_elaborated_and_const_checked`
|
||||||
// which we are going to steal below. Thus we need to run `mir_for_ctfe` first, so it
|
// which we are going to steal below. Thus we need to run `mir_for_ctfe` first, so it
|
||||||
// computes and caches its result.
|
// computes and caches its result.
|
||||||
Some(hir::ConstContext::ConstFn) => tcx.ensure_with_value().mir_for_ctfe(did),
|
Some(hir::ConstContext::ConstFn) => tcx.ensure_done().mir_for_ctfe(did),
|
||||||
None => {}
|
None => {}
|
||||||
Some(other) => panic!("do not use `optimized_mir` for constants: {other:?}"),
|
Some(other) => panic!("do not use `optimized_mir` for constants: {other:?}"),
|
||||||
}
|
}
|
||||||
|
@ -772,7 +772,7 @@ fn promoted_mir(tcx: TyCtxt<'_>, def: LocalDefId) -> &IndexVec<Promoted, Body<'_
|
||||||
}
|
}
|
||||||
|
|
||||||
if !tcx.is_synthetic_mir(def) {
|
if !tcx.is_synthetic_mir(def) {
|
||||||
tcx.ensure_with_value().mir_borrowck(def);
|
tcx.ensure_done().mir_borrowck(def);
|
||||||
}
|
}
|
||||||
let mut promoted = tcx.mir_promoted(def).1.steal();
|
let mut promoted = tcx.mir_promoted(def).1.steal();
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue