Remove DepContext.
It's no longer needed now that we can access `TyCtxt` directly.
This commit is contained in:
parent
414be2e6ff
commit
7c877d994b
12 changed files with 138 additions and 207 deletions
|
|
@ -13,7 +13,7 @@ use std::fmt;
|
||||||
|
|
||||||
use rustc_errors::{DiagInner, TRACK_DIAGNOSTIC};
|
use rustc_errors::{DiagInner, TRACK_DIAGNOSTIC};
|
||||||
use rustc_middle::dep_graph::dep_node::default_dep_kind_debug;
|
use rustc_middle::dep_graph::dep_node::default_dep_kind_debug;
|
||||||
use rustc_middle::dep_graph::{DepContext, DepKind, DepNode, TaskDepsRef};
|
use rustc_middle::dep_graph::{DepKind, DepNode, TaskDepsRef};
|
||||||
use rustc_middle::ty::tls;
|
use rustc_middle::ty::tls;
|
||||||
|
|
||||||
fn track_span_parent(def_id: rustc_span::def_id::LocalDefId) {
|
fn track_span_parent(def_id: rustc_span::def_id::LocalDefId) {
|
||||||
|
|
|
||||||
|
|
@ -67,7 +67,7 @@ use rustc_macros::{Decodable, Encodable};
|
||||||
use rustc_query_system::ich::StableHashingContext;
|
use rustc_query_system::ich::StableHashingContext;
|
||||||
use rustc_span::Symbol;
|
use rustc_span::Symbol;
|
||||||
|
|
||||||
use super::{DepContext, FingerprintStyle, SerializedDepNodeIndex};
|
use super::{FingerprintStyle, SerializedDepNodeIndex};
|
||||||
use crate::mir::mono::MonoItem;
|
use crate::mir::mono::MonoItem;
|
||||||
use crate::ty::TyCtxt;
|
use crate::ty::TyCtxt;
|
||||||
|
|
||||||
|
|
@ -117,18 +117,14 @@ impl DepNode {
|
||||||
/// Creates a new, parameterless DepNode. This method will assert
|
/// Creates a new, parameterless DepNode. This method will assert
|
||||||
/// that the DepNode corresponding to the given DepKind actually
|
/// that the DepNode corresponding to the given DepKind actually
|
||||||
/// does not require any parameters.
|
/// does not require any parameters.
|
||||||
pub fn new_no_params<Tcx>(tcx: Tcx, kind: DepKind) -> DepNode
|
pub fn new_no_params<'tcx>(tcx: TyCtxt<'tcx>, kind: DepKind) -> DepNode {
|
||||||
where
|
|
||||||
Tcx: super::DepContext,
|
|
||||||
{
|
|
||||||
debug_assert_eq!(tcx.fingerprint_style(kind), FingerprintStyle::Unit);
|
debug_assert_eq!(tcx.fingerprint_style(kind), FingerprintStyle::Unit);
|
||||||
DepNode { kind, hash: Fingerprint::ZERO.into() }
|
DepNode { kind, hash: Fingerprint::ZERO.into() }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn construct<Tcx, Key>(tcx: Tcx, kind: DepKind, arg: &Key) -> DepNode
|
pub fn construct<'tcx, Key>(tcx: TyCtxt<'tcx>, kind: DepKind, arg: &Key) -> DepNode
|
||||||
where
|
where
|
||||||
Tcx: super::DepContext,
|
Key: DepNodeKey<'tcx>,
|
||||||
Key: DepNodeKey<Tcx>,
|
|
||||||
{
|
{
|
||||||
let hash = arg.to_fingerprint(tcx);
|
let hash = arg.to_fingerprint(tcx);
|
||||||
let dep_node = DepNode { kind, hash: hash.into() };
|
let dep_node = DepNode { kind, hash: hash.into() };
|
||||||
|
|
@ -136,10 +132,10 @@ impl DepNode {
|
||||||
#[cfg(debug_assertions)]
|
#[cfg(debug_assertions)]
|
||||||
{
|
{
|
||||||
if !tcx.fingerprint_style(kind).reconstructible()
|
if !tcx.fingerprint_style(kind).reconstructible()
|
||||||
&& (tcx.sess().opts.unstable_opts.incremental_info
|
&& (tcx.sess.opts.unstable_opts.incremental_info
|
||||||
|| tcx.sess().opts.unstable_opts.query_dep_graph)
|
|| tcx.sess.opts.unstable_opts.query_dep_graph)
|
||||||
{
|
{
|
||||||
tcx.dep_graph().register_dep_node_debug_str(dep_node, || arg.to_debug_str(tcx));
|
tcx.dep_graph.register_dep_node_debug_str(dep_node, || arg.to_debug_str(tcx));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -149,10 +145,11 @@ impl DepNode {
|
||||||
/// Construct a DepNode from the given DepKind and DefPathHash. This
|
/// Construct a DepNode from the given DepKind and DefPathHash. This
|
||||||
/// method will assert that the given DepKind actually requires a
|
/// method will assert that the given DepKind actually requires a
|
||||||
/// single DefId/DefPathHash parameter.
|
/// single DefId/DefPathHash parameter.
|
||||||
pub fn from_def_path_hash<Tcx>(tcx: Tcx, def_path_hash: DefPathHash, kind: DepKind) -> Self
|
pub fn from_def_path_hash<'tcx>(
|
||||||
where
|
tcx: TyCtxt<'tcx>,
|
||||||
Tcx: super::DepContext,
|
def_path_hash: DefPathHash,
|
||||||
{
|
kind: DepKind,
|
||||||
|
) -> Self {
|
||||||
debug_assert!(tcx.fingerprint_style(kind) == FingerprintStyle::DefPathHash);
|
debug_assert!(tcx.fingerprint_style(kind) == FingerprintStyle::DefPathHash);
|
||||||
DepNode { kind, hash: def_path_hash.0.into() }
|
DepNode { kind, hash: def_path_hash.0.into() }
|
||||||
}
|
}
|
||||||
|
|
@ -172,14 +169,14 @@ impl fmt::Debug for DepNode {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Trait for query keys as seen by dependency-node tracking.
|
/// Trait for query keys as seen by dependency-node tracking.
|
||||||
pub trait DepNodeKey<Tcx: DepContext>: fmt::Debug + Sized {
|
pub trait DepNodeKey<'tcx>: fmt::Debug + Sized {
|
||||||
fn fingerprint_style() -> FingerprintStyle;
|
fn fingerprint_style() -> FingerprintStyle;
|
||||||
|
|
||||||
/// This method turns a query key into an opaque `Fingerprint` to be used
|
/// This method turns a query key into an opaque `Fingerprint` to be used
|
||||||
/// in `DepNode`.
|
/// in `DepNode`.
|
||||||
fn to_fingerprint(&self, _: Tcx) -> Fingerprint;
|
fn to_fingerprint(&self, tcx: TyCtxt<'tcx>) -> Fingerprint;
|
||||||
|
|
||||||
fn to_debug_str(&self, tcx: Tcx) -> String;
|
fn to_debug_str(&self, tcx: TyCtxt<'tcx>) -> String;
|
||||||
|
|
||||||
/// This method tries to recover the query key from the given `DepNode`,
|
/// This method tries to recover the query key from the given `DepNode`,
|
||||||
/// something which is needed when forcing `DepNode`s during red-green
|
/// something which is needed when forcing `DepNode`s during red-green
|
||||||
|
|
@ -187,11 +184,11 @@ pub trait DepNodeKey<Tcx: DepContext>: fmt::Debug + Sized {
|
||||||
/// `fingerprint_style()` is not `FingerprintStyle::Opaque`.
|
/// `fingerprint_style()` is not `FingerprintStyle::Opaque`.
|
||||||
/// It is always valid to return `None` here, in which case incremental
|
/// It is always valid to return `None` here, in which case incremental
|
||||||
/// compilation will treat the query as having changed instead of forcing it.
|
/// compilation will treat the query as having changed instead of forcing it.
|
||||||
fn recover(tcx: Tcx, dep_node: &DepNode) -> Option<Self>;
|
fn recover(tcx: TyCtxt<'tcx>, dep_node: &DepNode) -> Option<Self>;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Blanket impl of `DepNodeKey`, which is specialized by other impls elsewhere.
|
// Blanket impl of `DepNodeKey`, which is specialized by other impls elsewhere.
|
||||||
impl<Tcx: DepContext, T> DepNodeKey<Tcx> for T
|
impl<'tcx, T> DepNodeKey<'tcx> for T
|
||||||
where
|
where
|
||||||
T: for<'a> HashStable<StableHashingContext<'a>> + fmt::Debug,
|
T: for<'a> HashStable<StableHashingContext<'a>> + fmt::Debug,
|
||||||
{
|
{
|
||||||
|
|
@ -201,7 +198,7 @@ where
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
default fn to_fingerprint(&self, tcx: Tcx) -> Fingerprint {
|
default fn to_fingerprint(&self, tcx: TyCtxt<'tcx>) -> Fingerprint {
|
||||||
tcx.with_stable_hashing_context(|mut hcx| {
|
tcx.with_stable_hashing_context(|mut hcx| {
|
||||||
let mut hasher = StableHasher::new();
|
let mut hasher = StableHasher::new();
|
||||||
self.hash_stable(&mut hcx, &mut hasher);
|
self.hash_stable(&mut hcx, &mut hasher);
|
||||||
|
|
@ -210,7 +207,7 @@ where
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
default fn to_debug_str(&self, tcx: Tcx) -> String {
|
default fn to_debug_str(&self, tcx: TyCtxt<'tcx>) -> String {
|
||||||
// Make sure to print dep node params with reduced queries since printing
|
// Make sure to print dep node params with reduced queries since printing
|
||||||
// may themselves call queries, which may lead to (possibly untracked!)
|
// may themselves call queries, which may lead to (possibly untracked!)
|
||||||
// query cycles.
|
// query cycles.
|
||||||
|
|
@ -218,7 +215,7 @@ where
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
default fn recover(_: Tcx, _: &DepNode) -> Option<Self> {
|
default fn recover(_: TyCtxt<'tcx>, _: &DepNode) -> Option<Self> {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -228,7 +225,7 @@ where
|
||||||
/// Information is retrieved by indexing the `DEP_KINDS` array using the integer value
|
/// Information is retrieved by indexing the `DEP_KINDS` array using the integer value
|
||||||
/// of the `DepKind`. Overall, this allows to implement `DepContext` using this manual
|
/// of the `DepKind`. Overall, this allows to implement `DepContext` using this manual
|
||||||
/// jump table instead of large matches.
|
/// jump table instead of large matches.
|
||||||
pub struct DepKindVTable<Tcx: DepContext> {
|
pub struct DepKindVTable<'tcx> {
|
||||||
/// Anonymous queries cannot be replayed from one compiler invocation to the next.
|
/// Anonymous queries cannot be replayed from one compiler invocation to the next.
|
||||||
/// When their result is needed, it is recomputed. They are useful for fine-grained
|
/// When their result is needed, it is recomputed. They are useful for fine-grained
|
||||||
/// dependency tracking, and caching within one compiler invocation.
|
/// dependency tracking, and caching within one compiler invocation.
|
||||||
|
|
@ -279,11 +276,12 @@ pub struct DepKindVTable<Tcx: DepContext> {
|
||||||
/// with kind `MirValidated`, we know that the GUID/fingerprint of the `DepNode`
|
/// with kind `MirValidated`, we know that the GUID/fingerprint of the `DepNode`
|
||||||
/// is actually a `DefPathHash`, and can therefore just look up the corresponding
|
/// is actually a `DefPathHash`, and can therefore just look up the corresponding
|
||||||
/// `DefId` in `tcx.def_path_hash_to_def_id`.
|
/// `DefId` in `tcx.def_path_hash_to_def_id`.
|
||||||
pub force_from_dep_node:
|
pub force_from_dep_node: Option<
|
||||||
Option<fn(tcx: Tcx, dep_node: DepNode, prev_index: SerializedDepNodeIndex) -> bool>,
|
fn(tcx: TyCtxt<'tcx>, dep_node: DepNode, prev_index: SerializedDepNodeIndex) -> bool,
|
||||||
|
>,
|
||||||
|
|
||||||
/// Invoke a query to put the on-disk cached value in memory.
|
/// Invoke a query to put the on-disk cached value in memory.
|
||||||
pub try_load_from_on_disk_cache: Option<fn(Tcx, DepNode)>,
|
pub try_load_from_on_disk_cache: Option<fn(TyCtxt<'tcx>, DepNode)>,
|
||||||
|
|
||||||
/// The name of this dep kind.
|
/// The name of this dep kind.
|
||||||
pub name: &'static &'static str,
|
pub name: &'static &'static str,
|
||||||
|
|
|
||||||
|
|
@ -3,10 +3,10 @@ use rustc_hir::def_id::{CrateNum, DefId, LOCAL_CRATE, LocalDefId, LocalModDefId,
|
||||||
use rustc_hir::definitions::DefPathHash;
|
use rustc_hir::definitions::DefPathHash;
|
||||||
use rustc_hir::{HirId, ItemLocalId, OwnerId};
|
use rustc_hir::{HirId, ItemLocalId, OwnerId};
|
||||||
|
|
||||||
use crate::dep_graph::{DepContext, DepNode, DepNodeKey, FingerprintStyle};
|
use crate::dep_graph::{DepNode, DepNodeKey, FingerprintStyle};
|
||||||
use crate::ty::TyCtxt;
|
use crate::ty::TyCtxt;
|
||||||
|
|
||||||
impl<'tcx> DepNodeKey<TyCtxt<'tcx>> for () {
|
impl<'tcx> DepNodeKey<'tcx> for () {
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn fingerprint_style() -> FingerprintStyle {
|
fn fingerprint_style() -> FingerprintStyle {
|
||||||
FingerprintStyle::Unit
|
FingerprintStyle::Unit
|
||||||
|
|
@ -23,7 +23,7 @@ impl<'tcx> DepNodeKey<TyCtxt<'tcx>> for () {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> DepNodeKey<TyCtxt<'tcx>> for DefId {
|
impl<'tcx> DepNodeKey<'tcx> for DefId {
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn fingerprint_style() -> FingerprintStyle {
|
fn fingerprint_style() -> FingerprintStyle {
|
||||||
FingerprintStyle::DefPathHash
|
FingerprintStyle::DefPathHash
|
||||||
|
|
@ -45,7 +45,7 @@ impl<'tcx> DepNodeKey<TyCtxt<'tcx>> for DefId {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> DepNodeKey<TyCtxt<'tcx>> for LocalDefId {
|
impl<'tcx> DepNodeKey<'tcx> for LocalDefId {
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn fingerprint_style() -> FingerprintStyle {
|
fn fingerprint_style() -> FingerprintStyle {
|
||||||
FingerprintStyle::DefPathHash
|
FingerprintStyle::DefPathHash
|
||||||
|
|
@ -67,7 +67,7 @@ impl<'tcx> DepNodeKey<TyCtxt<'tcx>> for LocalDefId {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> DepNodeKey<TyCtxt<'tcx>> for OwnerId {
|
impl<'tcx> DepNodeKey<'tcx> for OwnerId {
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn fingerprint_style() -> FingerprintStyle {
|
fn fingerprint_style() -> FingerprintStyle {
|
||||||
FingerprintStyle::DefPathHash
|
FingerprintStyle::DefPathHash
|
||||||
|
|
@ -89,7 +89,7 @@ impl<'tcx> DepNodeKey<TyCtxt<'tcx>> for OwnerId {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> DepNodeKey<TyCtxt<'tcx>> for CrateNum {
|
impl<'tcx> DepNodeKey<'tcx> for CrateNum {
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn fingerprint_style() -> FingerprintStyle {
|
fn fingerprint_style() -> FingerprintStyle {
|
||||||
FingerprintStyle::DefPathHash
|
FingerprintStyle::DefPathHash
|
||||||
|
|
@ -112,7 +112,7 @@ impl<'tcx> DepNodeKey<TyCtxt<'tcx>> for CrateNum {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> DepNodeKey<TyCtxt<'tcx>> for (DefId, DefId) {
|
impl<'tcx> DepNodeKey<'tcx> for (DefId, DefId) {
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn fingerprint_style() -> FingerprintStyle {
|
fn fingerprint_style() -> FingerprintStyle {
|
||||||
FingerprintStyle::Opaque
|
FingerprintStyle::Opaque
|
||||||
|
|
@ -139,7 +139,7 @@ impl<'tcx> DepNodeKey<TyCtxt<'tcx>> for (DefId, DefId) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> DepNodeKey<TyCtxt<'tcx>> for HirId {
|
impl<'tcx> DepNodeKey<'tcx> for HirId {
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn fingerprint_style() -> FingerprintStyle {
|
fn fingerprint_style() -> FingerprintStyle {
|
||||||
FingerprintStyle::HirId
|
FingerprintStyle::HirId
|
||||||
|
|
@ -182,7 +182,7 @@ impl<'tcx> DepNodeKey<TyCtxt<'tcx>> for HirId {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> DepNodeKey<TyCtxt<'tcx>> for ModDefId {
|
impl<'tcx> DepNodeKey<'tcx> for ModDefId {
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn fingerprint_style() -> FingerprintStyle {
|
fn fingerprint_style() -> FingerprintStyle {
|
||||||
FingerprintStyle::DefPathHash
|
FingerprintStyle::DefPathHash
|
||||||
|
|
@ -204,7 +204,7 @@ impl<'tcx> DepNodeKey<TyCtxt<'tcx>> for ModDefId {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> DepNodeKey<TyCtxt<'tcx>> for LocalModDefId {
|
impl<'tcx> DepNodeKey<'tcx> for LocalModDefId {
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn fingerprint_style() -> FingerprintStyle {
|
fn fingerprint_style() -> FingerprintStyle {
|
||||||
FingerprintStyle::DefPathHash
|
FingerprintStyle::DefPathHash
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@ use {super::debug::EdgeFilter, std::env};
|
||||||
|
|
||||||
use super::query::DepGraphQuery;
|
use super::query::DepGraphQuery;
|
||||||
use super::serialized::{GraphEncoder, SerializedDepGraph, SerializedDepNodeIndex};
|
use super::serialized::{GraphEncoder, SerializedDepGraph, SerializedDepNodeIndex};
|
||||||
use super::{DepContext, DepKind, DepNode, DepsType, HasDepContext, WorkProductId};
|
use super::{DepKind, DepNode, DepsType, HasDepContext, WorkProductId};
|
||||||
use crate::dep_graph::edges::EdgesVec;
|
use crate::dep_graph::edges::EdgesVec;
|
||||||
use crate::ty::TyCtxt;
|
use crate::ty::TyCtxt;
|
||||||
use crate::verify_ich::incremental_verify_ich;
|
use crate::verify_ich::incremental_verify_ich;
|
||||||
|
|
@ -62,7 +62,7 @@ impl From<DepNodeIndex> for QueryInvocationId {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct MarkFrame<'a> {
|
pub(crate) struct MarkFrame<'a> {
|
||||||
index: SerializedDepNodeIndex,
|
index: SerializedDepNodeIndex,
|
||||||
parent: Option<&'a MarkFrame<'a>>,
|
parent: Option<&'a MarkFrame<'a>>,
|
||||||
}
|
}
|
||||||
|
|
@ -252,7 +252,7 @@ impl DepGraph {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub fn with_task<Ctxt: HasDepContext, A: Debug, R>(
|
pub fn with_task<'tcx, Ctxt: HasDepContext<'tcx>, A: Debug, R>(
|
||||||
&self,
|
&self,
|
||||||
key: DepNode,
|
key: DepNode,
|
||||||
cx: Ctxt,
|
cx: Ctxt,
|
||||||
|
|
@ -266,9 +266,9 @@ impl DepGraph {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn with_anon_task<Tcx: DepContext, OP, R>(
|
pub fn with_anon_task<'tcx, OP, R>(
|
||||||
&self,
|
&self,
|
||||||
cx: Tcx,
|
cx: TyCtxt<'tcx>,
|
||||||
dep_kind: DepKind,
|
dep_kind: DepKind,
|
||||||
op: OP,
|
op: OP,
|
||||||
) -> (R, DepNodeIndex)
|
) -> (R, DepNodeIndex)
|
||||||
|
|
@ -315,7 +315,7 @@ impl DepGraphData {
|
||||||
///
|
///
|
||||||
/// [rustc dev guide]: https://rustc-dev-guide.rust-lang.org/queries/incremental-compilation.html
|
/// [rustc dev guide]: https://rustc-dev-guide.rust-lang.org/queries/incremental-compilation.html
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub fn with_task<Ctxt: HasDepContext, A: Debug, R>(
|
pub fn with_task<'tcx, Ctxt: HasDepContext<'tcx>, A: Debug, R>(
|
||||||
&self,
|
&self,
|
||||||
key: DepNode,
|
key: DepNode,
|
||||||
cx: Ctxt,
|
cx: Ctxt,
|
||||||
|
|
@ -329,7 +329,7 @@ impl DepGraphData {
|
||||||
// 2. Two distinct query keys get mapped to the same `DepNode`
|
// 2. Two distinct query keys get mapped to the same `DepNode`
|
||||||
// (see for example #48923).
|
// (see for example #48923).
|
||||||
self.assert_dep_node_not_yet_allocated_in_current_session(
|
self.assert_dep_node_not_yet_allocated_in_current_session(
|
||||||
cx.dep_context().sess(),
|
cx.dep_context().sess,
|
||||||
&key,
|
&key,
|
||||||
|| {
|
|| {
|
||||||
format!(
|
format!(
|
||||||
|
|
@ -352,8 +352,8 @@ impl DepGraphData {
|
||||||
(with_deps(TaskDepsRef::Allow(&task_deps)), task_deps.into_inner().reads)
|
(with_deps(TaskDepsRef::Allow(&task_deps)), task_deps.into_inner().reads)
|
||||||
};
|
};
|
||||||
|
|
||||||
let dcx = cx.dep_context();
|
let dep_node_index =
|
||||||
let dep_node_index = self.hash_result_and_alloc_node(dcx, key, edges, &result, hash_result);
|
self.hash_result_and_alloc_node(cx.dep_context(), key, edges, &result, hash_result);
|
||||||
|
|
||||||
(result, dep_node_index)
|
(result, dep_node_index)
|
||||||
}
|
}
|
||||||
|
|
@ -369,9 +369,9 @@ impl DepGraphData {
|
||||||
/// FIXME: This could perhaps return a `WithDepNode` to ensure that the
|
/// FIXME: This could perhaps return a `WithDepNode` to ensure that the
|
||||||
/// user of this function actually performs the read; we'll have to see
|
/// user of this function actually performs the read; we'll have to see
|
||||||
/// how to make that work with `anon` in `execute_job_incr`, though.
|
/// how to make that work with `anon` in `execute_job_incr`, though.
|
||||||
pub fn with_anon_task_inner<Tcx: DepContext, OP, R>(
|
pub fn with_anon_task_inner<'tcx, OP, R>(
|
||||||
&self,
|
&self,
|
||||||
cx: Tcx,
|
cx: TyCtxt<'tcx>,
|
||||||
dep_kind: DepKind,
|
dep_kind: DepKind,
|
||||||
op: OP,
|
op: OP,
|
||||||
) -> (R, DepNodeIndex)
|
) -> (R, DepNodeIndex)
|
||||||
|
|
@ -438,17 +438,17 @@ impl DepGraphData {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Intern the new `DepNode` with the dependencies up-to-now.
|
/// Intern the new `DepNode` with the dependencies up-to-now.
|
||||||
fn hash_result_and_alloc_node<Ctxt: DepContext, R>(
|
fn hash_result_and_alloc_node<'tcx, R>(
|
||||||
&self,
|
&self,
|
||||||
cx: &Ctxt,
|
tcx: TyCtxt<'tcx>,
|
||||||
node: DepNode,
|
node: DepNode,
|
||||||
edges: EdgesVec,
|
edges: EdgesVec,
|
||||||
result: &R,
|
result: &R,
|
||||||
hash_result: Option<fn(&mut StableHashingContext<'_>, &R) -> Fingerprint>,
|
hash_result: Option<fn(&mut StableHashingContext<'_>, &R) -> Fingerprint>,
|
||||||
) -> DepNodeIndex {
|
) -> DepNodeIndex {
|
||||||
let hashing_timer = cx.profiler().incr_result_hashing();
|
let hashing_timer = tcx.prof.incr_result_hashing();
|
||||||
let current_fingerprint = hash_result.map(|hash_result| {
|
let current_fingerprint = hash_result.map(|hash_result| {
|
||||||
cx.with_stable_hashing_context(|mut hcx| hash_result(&mut hcx, result))
|
tcx.with_stable_hashing_context(|mut hcx| hash_result(&mut hcx, result))
|
||||||
});
|
});
|
||||||
let dep_node_index = self.alloc_and_color_node(node, edges, current_fingerprint);
|
let dep_node_index = self.alloc_and_color_node(node, edges, current_fingerprint);
|
||||||
hashing_timer.finish_with_query_invocation_id(dep_node_index.into());
|
hashing_timer.finish_with_query_invocation_id(dep_node_index.into());
|
||||||
|
|
@ -553,10 +553,10 @@ impl DepGraph {
|
||||||
/// FIXME: If the code is changed enough for this node to be marked before requiring the
|
/// FIXME: If the code is changed enough for this node to be marked before requiring the
|
||||||
/// caller's node, we suppose that those changes will be enough to mark this node red and
|
/// caller's node, we suppose that those changes will be enough to mark this node red and
|
||||||
/// force a recomputation using the "normal" way.
|
/// force a recomputation using the "normal" way.
|
||||||
pub fn with_feed_task<Ctxt: DepContext, R>(
|
pub fn with_feed_task<'tcx, R>(
|
||||||
&self,
|
&self,
|
||||||
node: DepNode,
|
node: DepNode,
|
||||||
cx: Ctxt,
|
tcx: TyCtxt<'tcx>,
|
||||||
result: &R,
|
result: &R,
|
||||||
hash_result: Option<fn(&mut StableHashingContext<'_>, &R) -> Fingerprint>,
|
hash_result: Option<fn(&mut StableHashingContext<'_>, &R) -> Fingerprint>,
|
||||||
format_value_fn: fn(&R) -> String,
|
format_value_fn: fn(&R) -> String,
|
||||||
|
|
@ -572,7 +572,7 @@ impl DepGraph {
|
||||||
let dep_node_index = data.colors.current(prev_index);
|
let dep_node_index = data.colors.current(prev_index);
|
||||||
if let Some(dep_node_index) = dep_node_index {
|
if let Some(dep_node_index) = dep_node_index {
|
||||||
incremental_verify_ich(
|
incremental_verify_ich(
|
||||||
cx,
|
tcx,
|
||||||
data,
|
data,
|
||||||
result,
|
result,
|
||||||
prev_index,
|
prev_index,
|
||||||
|
|
@ -605,7 +605,7 @@ impl DepGraph {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
data.hash_result_and_alloc_node(&cx, node, edges, result, hash_result)
|
data.hash_result_and_alloc_node(tcx, node, edges, result, hash_result)
|
||||||
} else {
|
} else {
|
||||||
// Incremental compilation is turned off. We just execute the task
|
// Incremental compilation is turned off. We just execute the task
|
||||||
// without tracking. We still provide a dep-node index that uniquely
|
// without tracking. We still provide a dep-node index that uniquely
|
||||||
|
|
@ -1051,8 +1051,8 @@ impl DepGraph {
|
||||||
///
|
///
|
||||||
/// This method will only load queries that will end up in the disk cache.
|
/// This method will only load queries that will end up in the disk cache.
|
||||||
/// Other queries will not be executed.
|
/// Other queries will not be executed.
|
||||||
pub fn exec_cache_promotions<Tcx: DepContext>(&self, tcx: Tcx) {
|
pub fn exec_cache_promotions<'tcx>(&self, tcx: TyCtxt<'tcx>) {
|
||||||
let _prof_timer = tcx.profiler().generic_activity("incr_comp_query_cache_promotion");
|
let _prof_timer = tcx.prof.generic_activity("incr_comp_query_cache_promotion");
|
||||||
|
|
||||||
let data = self.data.as_ref().unwrap();
|
let data = self.data.as_ref().unwrap();
|
||||||
for prev_index in data.colors.values.indices() {
|
for prev_index in data.colors.values.indices() {
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,10 @@
|
||||||
use std::panic;
|
use std::panic;
|
||||||
|
|
||||||
use rustc_data_structures::profiling::SelfProfilerRef;
|
|
||||||
use rustc_query_system::ich::StableHashingContext;
|
|
||||||
use rustc_session::Session;
|
|
||||||
use tracing::instrument;
|
use tracing::instrument;
|
||||||
|
|
||||||
pub use self::dep_node::{
|
pub use self::dep_node::{
|
||||||
DepKind, DepNode, DepNodeKey, WorkProductId, dep_kind_from_label, dep_kinds, label_strs,
|
DepKind, DepKindVTable, DepNode, DepNodeKey, WorkProductId, dep_kind_from_label, dep_kinds,
|
||||||
|
label_strs,
|
||||||
};
|
};
|
||||||
pub use self::graph::{
|
pub use self::graph::{
|
||||||
DepGraph, DepGraphData, DepNodeIndex, TaskDepsRef, WorkProduct, WorkProductMap, hash_result,
|
DepGraph, DepGraphData, DepNodeIndex, TaskDepsRef, WorkProduct, WorkProductMap, hash_result,
|
||||||
|
|
@ -26,91 +24,18 @@ mod graph;
|
||||||
mod query;
|
mod query;
|
||||||
mod serialized;
|
mod serialized;
|
||||||
|
|
||||||
pub trait DepContext: Copy {
|
pub trait HasDepContext<'tcx>: Copy {
|
||||||
/// Create a hashing context for hashing new results.
|
fn dep_context(&self) -> TyCtxt<'tcx>;
|
||||||
fn with_stable_hashing_context<R>(self, f: impl FnOnce(StableHashingContext<'_>) -> R) -> R;
|
|
||||||
|
|
||||||
/// Access the DepGraph.
|
|
||||||
fn dep_graph(&self) -> &DepGraph;
|
|
||||||
|
|
||||||
/// Access the profiler.
|
|
||||||
fn profiler(&self) -> &SelfProfilerRef;
|
|
||||||
|
|
||||||
/// Access the compiler session.
|
|
||||||
fn sess(&self) -> &Session;
|
|
||||||
|
|
||||||
fn dep_kind_vtable(&self, dep_node: DepKind) -> &dep_node::DepKindVTable<Self>;
|
|
||||||
|
|
||||||
#[inline(always)]
|
|
||||||
fn fingerprint_style(self, kind: DepKind) -> FingerprintStyle {
|
|
||||||
self.dep_kind_vtable(kind).fingerprint_style
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline(always)]
|
|
||||||
/// Return whether this kind always require evaluation.
|
|
||||||
// FIXME: remove this in favour of the version on `TyCtxt`.
|
|
||||||
fn is_eval_always(self, kind: DepKind) -> bool {
|
|
||||||
self.dep_kind_vtable(kind).is_eval_always
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Try to force a dep node to execute and see if it's green.
|
|
||||||
///
|
|
||||||
/// Returns true if the query has actually been forced. It is valid that a query
|
|
||||||
/// fails to be forced, e.g. when the query key cannot be reconstructed from the
|
|
||||||
/// dep-node or when the query kind outright does not support it.
|
|
||||||
#[inline]
|
|
||||||
#[instrument(skip(self, frame), level = "debug")]
|
|
||||||
fn try_force_from_dep_node(
|
|
||||||
self,
|
|
||||||
dep_node: DepNode,
|
|
||||||
prev_index: SerializedDepNodeIndex,
|
|
||||||
frame: &MarkFrame<'_>,
|
|
||||||
) -> bool {
|
|
||||||
if let Some(force_fn) = self.dep_kind_vtable(dep_node.kind).force_from_dep_node {
|
|
||||||
match panic::catch_unwind(panic::AssertUnwindSafe(|| {
|
|
||||||
force_fn(self, dep_node, prev_index)
|
|
||||||
})) {
|
|
||||||
Err(value) => {
|
|
||||||
if !value.is::<rustc_errors::FatalErrorMarker>() {
|
|
||||||
print_markframe_trace(self.dep_graph(), frame);
|
|
||||||
}
|
|
||||||
panic::resume_unwind(value)
|
|
||||||
}
|
|
||||||
Ok(query_has_been_forced) => query_has_been_forced,
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Load data from the on-disk cache.
|
|
||||||
fn try_load_from_on_disk_cache(self, dep_node: &DepNode) {
|
|
||||||
if let Some(try_load_fn) = self.dep_kind_vtable(dep_node.kind).try_load_from_on_disk_cache {
|
|
||||||
try_load_fn(self, *dep_node)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn with_reduced_queries<T>(self, _: impl FnOnce() -> T) -> T;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait HasDepContext: Copy {
|
impl<'tcx> HasDepContext<'tcx> for TyCtxt<'tcx> {
|
||||||
type DepContext: self::DepContext;
|
fn dep_context(&self) -> TyCtxt<'tcx> {
|
||||||
|
*self
|
||||||
fn dep_context(&self) -> &Self::DepContext;
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<T: DepContext> HasDepContext for T {
|
|
||||||
type DepContext = Self;
|
|
||||||
|
|
||||||
fn dep_context(&self) -> &Self::DepContext {
|
|
||||||
self
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: HasDepContext, Q: Copy> HasDepContext for (T, Q) {
|
impl<'tcx, T: HasDepContext<'tcx>, Q: Copy> HasDepContext<'tcx> for (T, Q) {
|
||||||
type DepContext = T::DepContext;
|
fn dep_context(&self) -> TyCtxt<'tcx> {
|
||||||
|
|
||||||
fn dep_context(&self) -> &Self::DepContext {
|
|
||||||
self.0.dep_context()
|
self.0.dep_context()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -143,8 +68,6 @@ impl FingerprintStyle {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub type DepKindVTable<'tcx> = dep_node::DepKindVTable<TyCtxt<'tcx>>;
|
|
||||||
|
|
||||||
pub struct DepsType;
|
pub struct DepsType;
|
||||||
|
|
||||||
impl DepsType {
|
impl DepsType {
|
||||||
|
|
@ -192,33 +115,55 @@ impl DepsType {
|
||||||
const DEP_KIND_MAX: u16 = dep_node::DEP_KIND_VARIANTS - 1;
|
const DEP_KIND_MAX: u16 = dep_node::DEP_KIND_VARIANTS - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> DepContext for TyCtxt<'tcx> {
|
impl<'tcx> TyCtxt<'tcx> {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn with_stable_hashing_context<R>(self, f: impl FnOnce(StableHashingContext<'_>) -> R) -> R {
|
pub fn dep_kind_vtable(self, dk: DepKind) -> &'tcx DepKindVTable<'tcx> {
|
||||||
TyCtxt::with_stable_hashing_context(self, f)
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
fn dep_graph(&self) -> &DepGraph {
|
|
||||||
&self.dep_graph
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline(always)]
|
|
||||||
fn profiler(&self) -> &SelfProfilerRef {
|
|
||||||
&self.prof
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline(always)]
|
|
||||||
fn sess(&self) -> &Session {
|
|
||||||
self.sess
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
fn dep_kind_vtable(&self, dk: DepKind) -> &DepKindVTable<'tcx> {
|
|
||||||
&self.dep_kind_vtables[dk.as_usize()]
|
&self.dep_kind_vtables[dk.as_usize()]
|
||||||
}
|
}
|
||||||
|
|
||||||
fn with_reduced_queries<T>(self, f: impl FnOnce() -> T) -> T {
|
fn with_reduced_queries<T>(self, f: impl FnOnce() -> T) -> T {
|
||||||
with_reduced_queries!(f())
|
with_reduced_queries!(f())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline(always)]
|
||||||
|
pub fn fingerprint_style(self, kind: DepKind) -> FingerprintStyle {
|
||||||
|
self.dep_kind_vtable(kind).fingerprint_style
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Try to force a dep node to execute and see if it's green.
|
||||||
|
///
|
||||||
|
/// Returns true if the query has actually been forced. It is valid that a query
|
||||||
|
/// fails to be forced, e.g. when the query key cannot be reconstructed from the
|
||||||
|
/// dep-node or when the query kind outright does not support it.
|
||||||
|
#[inline]
|
||||||
|
#[instrument(skip(self, frame), level = "debug")]
|
||||||
|
fn try_force_from_dep_node(
|
||||||
|
self,
|
||||||
|
dep_node: DepNode,
|
||||||
|
prev_index: SerializedDepNodeIndex,
|
||||||
|
frame: &MarkFrame<'_>,
|
||||||
|
) -> bool {
|
||||||
|
if let Some(force_fn) = self.dep_kind_vtable(dep_node.kind).force_from_dep_node {
|
||||||
|
match panic::catch_unwind(panic::AssertUnwindSafe(|| {
|
||||||
|
force_fn(self, dep_node, prev_index)
|
||||||
|
})) {
|
||||||
|
Err(value) => {
|
||||||
|
if !value.is::<rustc_errors::FatalErrorMarker>() {
|
||||||
|
print_markframe_trace(&self.dep_graph, frame);
|
||||||
|
}
|
||||||
|
panic::resume_unwind(value)
|
||||||
|
}
|
||||||
|
Ok(query_has_been_forced) => query_has_been_forced,
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Load data from the on-disk cache.
|
||||||
|
fn try_load_from_on_disk_cache(self, dep_node: &DepNode) {
|
||||||
|
if let Some(try_load_fn) = self.dep_kind_vtable(dep_node.kind).try_load_from_on_disk_cache {
|
||||||
|
try_load_fn(self, *dep_node)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -105,7 +105,7 @@ pub(crate) fn query_feed<'tcx, Cache>(
|
||||||
value: Cache::Value,
|
value: Cache::Value,
|
||||||
) where
|
) where
|
||||||
Cache: QueryCache,
|
Cache: QueryCache,
|
||||||
Cache::Key: DepNodeKey<TyCtxt<'tcx>>,
|
Cache::Key: DepNodeKey<'tcx>,
|
||||||
{
|
{
|
||||||
let format_value = query_vtable.format_value;
|
let format_value = query_vtable.format_value;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,20 +4,19 @@ use rustc_data_structures::fingerprint::Fingerprint;
|
||||||
use rustc_query_system::ich::StableHashingContext;
|
use rustc_query_system::ich::StableHashingContext;
|
||||||
use tracing::instrument;
|
use tracing::instrument;
|
||||||
|
|
||||||
use crate::dep_graph::{DepContext, DepGraphData, SerializedDepNodeIndex};
|
use crate::dep_graph::{DepGraphData, SerializedDepNodeIndex};
|
||||||
|
use crate::ty::TyCtxt;
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
#[instrument(skip(tcx, dep_graph_data, result, hash_result, format_value), level = "debug")]
|
#[instrument(skip(tcx, dep_graph_data, result, hash_result, format_value), level = "debug")]
|
||||||
pub fn incremental_verify_ich<Tcx, V>(
|
pub fn incremental_verify_ich<'tcx, V>(
|
||||||
tcx: Tcx,
|
tcx: TyCtxt<'tcx>,
|
||||||
dep_graph_data: &DepGraphData,
|
dep_graph_data: &DepGraphData,
|
||||||
result: &V,
|
result: &V,
|
||||||
prev_index: SerializedDepNodeIndex,
|
prev_index: SerializedDepNodeIndex,
|
||||||
hash_result: Option<fn(&mut StableHashingContext<'_>, &V) -> Fingerprint>,
|
hash_result: Option<fn(&mut StableHashingContext<'_>, &V) -> Fingerprint>,
|
||||||
format_value: fn(&V) -> String,
|
format_value: fn(&V) -> String,
|
||||||
) where
|
) {
|
||||||
Tcx: DepContext,
|
|
||||||
{
|
|
||||||
if !dep_graph_data.is_index_green(prev_index) {
|
if !dep_graph_data.is_index_green(prev_index) {
|
||||||
incremental_verify_ich_not_green(tcx, prev_index)
|
incremental_verify_ich_not_green(tcx, prev_index)
|
||||||
}
|
}
|
||||||
|
|
@ -35,13 +34,10 @@ pub fn incremental_verify_ich<Tcx, V>(
|
||||||
|
|
||||||
#[cold]
|
#[cold]
|
||||||
#[inline(never)]
|
#[inline(never)]
|
||||||
fn incremental_verify_ich_not_green<Tcx>(tcx: Tcx, prev_index: SerializedDepNodeIndex)
|
fn incremental_verify_ich_not_green<'tcx>(tcx: TyCtxt<'tcx>, prev_index: SerializedDepNodeIndex) {
|
||||||
where
|
|
||||||
Tcx: DepContext,
|
|
||||||
{
|
|
||||||
panic!(
|
panic!(
|
||||||
"fingerprint for green query instance not loaded from cache: {:?}",
|
"fingerprint for green query instance not loaded from cache: {:?}",
|
||||||
tcx.dep_graph().data().unwrap().prev_node_of(prev_index)
|
tcx.dep_graph.data().unwrap().prev_node_of(prev_index)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -50,13 +46,11 @@ where
|
||||||
// chew on (and filling up the final binary, too).
|
// chew on (and filling up the final binary, too).
|
||||||
#[cold]
|
#[cold]
|
||||||
#[inline(never)]
|
#[inline(never)]
|
||||||
fn incremental_verify_ich_failed<Tcx>(
|
fn incremental_verify_ich_failed<'tcx>(
|
||||||
tcx: Tcx,
|
tcx: TyCtxt<'tcx>,
|
||||||
prev_index: SerializedDepNodeIndex,
|
prev_index: SerializedDepNodeIndex,
|
||||||
result: &dyn Fn() -> String,
|
result: &dyn Fn() -> String,
|
||||||
) where
|
) {
|
||||||
Tcx: DepContext,
|
|
||||||
{
|
|
||||||
// When we emit an error message and panic, we try to debug-print the `DepNode`
|
// When we emit an error message and panic, we try to debug-print the `DepNode`
|
||||||
// and query result. Unfortunately, this can cause us to run additional queries,
|
// and query result. Unfortunately, this can cause us to run additional queries,
|
||||||
// which may result in another fingerprint mismatch while we're in the middle
|
// which may result in another fingerprint mismatch while we're in the middle
|
||||||
|
|
@ -70,16 +64,16 @@ fn incremental_verify_ich_failed<Tcx>(
|
||||||
let old_in_panic = INSIDE_VERIFY_PANIC.replace(true);
|
let old_in_panic = INSIDE_VERIFY_PANIC.replace(true);
|
||||||
|
|
||||||
if old_in_panic {
|
if old_in_panic {
|
||||||
tcx.sess().dcx().emit_err(crate::error::Reentrant);
|
tcx.dcx().emit_err(crate::error::Reentrant);
|
||||||
} else {
|
} else {
|
||||||
let run_cmd = if let Some(crate_name) = &tcx.sess().opts.crate_name {
|
let run_cmd = if let Some(crate_name) = &tcx.sess.opts.crate_name {
|
||||||
format!("`cargo clean -p {crate_name}` or `cargo clean`")
|
format!("`cargo clean -p {crate_name}` or `cargo clean`")
|
||||||
} else {
|
} else {
|
||||||
"`cargo clean`".to_string()
|
"`cargo clean`".to_string()
|
||||||
};
|
};
|
||||||
|
|
||||||
let dep_node = tcx.dep_graph().data().unwrap().prev_node_of(prev_index);
|
let dep_node = tcx.dep_graph.data().unwrap().prev_node_of(prev_index);
|
||||||
tcx.sess().dcx().emit_err(crate::error::IncrementCompilation {
|
tcx.dcx().emit_err(crate::error::IncrementCompilation {
|
||||||
run_cmd,
|
run_cmd,
|
||||||
dep_node: format!("{dep_node:?}"),
|
dep_node: format!("{dep_node:?}"),
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
use rustc_middle::bug;
|
use rustc_middle::bug;
|
||||||
use rustc_middle::dep_graph::{DepKindVTable, DepNodeKey, FingerprintStyle};
|
use rustc_middle::dep_graph::{DepKindVTable, DepNodeKey, FingerprintStyle};
|
||||||
use rustc_middle::query::QueryCache;
|
use rustc_middle::query::QueryCache;
|
||||||
use rustc_middle::ty::TyCtxt;
|
|
||||||
|
|
||||||
use crate::plumbing::{force_from_dep_node_inner, try_load_from_on_disk_cache_inner};
|
use crate::plumbing::{force_from_dep_node_inner, try_load_from_on_disk_cache_inner};
|
||||||
use crate::{QueryDispatcherUnerased, QueryFlags};
|
use crate::{QueryDispatcherUnerased, QueryFlags};
|
||||||
|
|
@ -122,7 +121,7 @@ where
|
||||||
let fingerprint_style = if is_anon {
|
let fingerprint_style = if is_anon {
|
||||||
FingerprintStyle::Opaque
|
FingerprintStyle::Opaque
|
||||||
} else {
|
} else {
|
||||||
<Cache::Key as DepNodeKey<TyCtxt<'tcx>>>::fingerprint_style()
|
<Cache::Key as DepNodeKey<'tcx>>::fingerprint_style()
|
||||||
};
|
};
|
||||||
|
|
||||||
if is_anon || !fingerprint_style.reconstructible() {
|
if is_anon || !fingerprint_style.reconstructible() {
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ use rustc_middle::ty::TyCtxt;
|
||||||
use rustc_middle::verify_ich::incremental_verify_ich;
|
use rustc_middle::verify_ich::incremental_verify_ich;
|
||||||
use rustc_span::{DUMMY_SP, Span};
|
use rustc_span::{DUMMY_SP, Span};
|
||||||
|
|
||||||
use crate::dep_graph::{DepContext, DepNode, DepNodeIndex};
|
use crate::dep_graph::{DepNode, DepNodeIndex};
|
||||||
use crate::job::{QueryJobInfo, QueryJobMap, find_cycle_in_stack, report_cycle};
|
use crate::job::{QueryJobInfo, QueryJobMap, find_cycle_in_stack, report_cycle};
|
||||||
use crate::{QueryCtxt, QueryFlags, SemiDynamicQueryDispatcher};
|
use crate::{QueryCtxt, QueryFlags, SemiDynamicQueryDispatcher};
|
||||||
|
|
||||||
|
|
@ -535,7 +535,7 @@ fn try_load_from_disk_and_cache_in_memory<'tcx, C: QueryCache, const FLAGS: Quer
|
||||||
// can be forced from `DepNode`.
|
// can be forced from `DepNode`.
|
||||||
debug_assert!(
|
debug_assert!(
|
||||||
!query.will_cache_on_disk_for_key(qcx.tcx, key)
|
!query.will_cache_on_disk_for_key(qcx.tcx, key)
|
||||||
|| !qcx.dep_context().fingerprint_style(dep_node.kind).reconstructible(),
|
|| !qcx.tcx.fingerprint_style(dep_node.kind).reconstructible(),
|
||||||
"missing on-disk cache entry for {dep_node:?}"
|
"missing on-disk cache entry for {dep_node:?}"
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,6 @@ use rustc_session::Session;
|
||||||
use rustc_span::{DUMMY_SP, Span};
|
use rustc_span::{DUMMY_SP, Span};
|
||||||
|
|
||||||
use crate::QueryCtxt;
|
use crate::QueryCtxt;
|
||||||
use crate::dep_graph::DepContext;
|
|
||||||
|
|
||||||
/// Map from query job IDs to job information collected by
|
/// Map from query job IDs to job information collected by
|
||||||
/// `collect_active_jobs_from_all_queries`.
|
/// `collect_active_jobs_from_all_queries`.
|
||||||
|
|
|
||||||
|
|
@ -15,8 +15,7 @@ use rustc_middle::bug;
|
||||||
#[expect(unused_imports, reason = "used by doc comments")]
|
#[expect(unused_imports, reason = "used by doc comments")]
|
||||||
use rustc_middle::dep_graph::DepKindVTable;
|
use rustc_middle::dep_graph::DepKindVTable;
|
||||||
use rustc_middle::dep_graph::{
|
use rustc_middle::dep_graph::{
|
||||||
self, DepContext, DepNode, DepNodeIndex, DepNodeKey, HasDepContext, SerializedDepNodeIndex,
|
self, DepNode, DepNodeIndex, DepNodeKey, HasDepContext, SerializedDepNodeIndex, dep_kinds,
|
||||||
dep_kinds,
|
|
||||||
};
|
};
|
||||||
use rustc_middle::query::on_disk_cache::{
|
use rustc_middle::query::on_disk_cache::{
|
||||||
AbsoluteBytePos, CacheDecoder, CacheEncoder, EncodedDepNodeIndex,
|
AbsoluteBytePos, CacheDecoder, CacheEncoder, EncodedDepNodeIndex,
|
||||||
|
|
@ -141,12 +140,10 @@ impl<'tcx> QueryCtxt<'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> HasDepContext for QueryCtxt<'tcx> {
|
impl<'tcx> HasDepContext<'tcx> for QueryCtxt<'tcx> {
|
||||||
type DepContext = TyCtxt<'tcx>;
|
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn dep_context(&self) -> &Self::DepContext {
|
fn dep_context(&self) -> TyCtxt<'tcx> {
|
||||||
&self.tcx
|
self.tcx
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -165,7 +162,7 @@ pub(super) fn encode_all_query_results<'tcx>(
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn query_key_hash_verify_all<'tcx>(tcx: TyCtxt<'tcx>) {
|
pub fn query_key_hash_verify_all<'tcx>(tcx: TyCtxt<'tcx>) {
|
||||||
if tcx.sess().opts.unstable_opts.incremental_verify_ich || cfg!(debug_assertions) {
|
if tcx.sess.opts.unstable_opts.incremental_verify_ich || cfg!(debug_assertions) {
|
||||||
tcx.sess.time("query_key_hash_verify_all", || {
|
tcx.sess.time("query_key_hash_verify_all", || {
|
||||||
for verify in super::QUERY_KEY_HASH_VERIFY.iter() {
|
for verify in super::QUERY_KEY_HASH_VERIFY.iter() {
|
||||||
verify(tcx);
|
verify(tcx);
|
||||||
|
|
|
||||||
|
|
@ -60,7 +60,6 @@ use rustc_hir::lang_items::LangItem;
|
||||||
use rustc_hir::{self as hir};
|
use rustc_hir::{self as hir};
|
||||||
use rustc_macros::extension;
|
use rustc_macros::extension;
|
||||||
use rustc_middle::bug;
|
use rustc_middle::bug;
|
||||||
use rustc_middle::dep_graph::DepContext;
|
|
||||||
use rustc_middle::traits::PatternOriginExpr;
|
use rustc_middle::traits::PatternOriginExpr;
|
||||||
use rustc_middle::ty::error::{ExpectedFound, TypeError, TypeErrorToStringExt};
|
use rustc_middle::ty::error::{ExpectedFound, TypeError, TypeErrorToStringExt};
|
||||||
use rustc_middle::ty::print::{PrintTraitRefExt as _, WrapBinderMode, with_forced_trimmed_paths};
|
use rustc_middle::ty::print::{PrintTraitRefExt as _, WrapBinderMode, with_forced_trimmed_paths};
|
||||||
|
|
@ -1757,7 +1756,7 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
|
||||||
// containing a single ASCII character, perhaps the user meant to write `b'c'` to
|
// containing a single ASCII character, perhaps the user meant to write `b'c'` to
|
||||||
// specify a byte literal
|
// specify a byte literal
|
||||||
(ty::Uint(ty::UintTy::U8), ty::Char) => {
|
(ty::Uint(ty::UintTy::U8), ty::Char) => {
|
||||||
if let Ok(code) = self.tcx.sess().source_map().span_to_snippet(span)
|
if let Ok(code) = self.tcx.sess.source_map().span_to_snippet(span)
|
||||||
&& let Some(code) = code.strip_circumfix('\'', '\'')
|
&& let Some(code) = code.strip_circumfix('\'', '\'')
|
||||||
// forbid all Unicode escapes
|
// forbid all Unicode escapes
|
||||||
&& !code.starts_with("\\u")
|
&& !code.starts_with("\\u")
|
||||||
|
|
@ -1774,7 +1773,7 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
|
||||||
// containing a single character, perhaps the user meant to write `'c'` to
|
// containing a single character, perhaps the user meant to write `'c'` to
|
||||||
// specify a character literal (issue #92479)
|
// specify a character literal (issue #92479)
|
||||||
(ty::Char, ty::Ref(_, r, _)) if r.is_str() => {
|
(ty::Char, ty::Ref(_, r, _)) if r.is_str() => {
|
||||||
if let Ok(code) = self.tcx.sess().source_map().span_to_snippet(span)
|
if let Ok(code) = self.tcx.sess.source_map().span_to_snippet(span)
|
||||||
&& let Some(code) = code.strip_circumfix('"', '"')
|
&& let Some(code) = code.strip_circumfix('"', '"')
|
||||||
&& code.chars().count() == 1
|
&& code.chars().count() == 1
|
||||||
{
|
{
|
||||||
|
|
@ -1787,7 +1786,7 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
|
||||||
// If a string was expected and the found expression is a character literal,
|
// If a string was expected and the found expression is a character literal,
|
||||||
// perhaps the user meant to write `"s"` to specify a string literal.
|
// perhaps the user meant to write `"s"` to specify a string literal.
|
||||||
(ty::Ref(_, r, _), ty::Char) if r.is_str() => {
|
(ty::Ref(_, r, _), ty::Char) if r.is_str() => {
|
||||||
if let Ok(code) = self.tcx.sess().source_map().span_to_snippet(span)
|
if let Ok(code) = self.tcx.sess.source_map().span_to_snippet(span)
|
||||||
&& code.starts_with("'")
|
&& code.starts_with("'")
|
||||||
&& code.ends_with("'")
|
&& code.ends_with("'")
|
||||||
{
|
{
|
||||||
|
|
@ -1928,7 +1927,7 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
let Ok(code) = self.tcx.sess().source_map().span_to_snippet(span) else { return None };
|
let Ok(code) = self.tcx.sess.source_map().span_to_snippet(span) else { return None };
|
||||||
|
|
||||||
let sugg = if code.starts_with('(') && code.ends_with(')') {
|
let sugg = if code.starts_with('(') && code.ends_with(')') {
|
||||||
let before_close = span.hi() - BytePos::from_u32(1);
|
let before_close = span.hi() - BytePos::from_u32(1);
|
||||||
|
|
@ -2005,7 +2004,7 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
|
||||||
// Use the terminal width as the basis to determine when to compress the printed
|
// Use the terminal width as the basis to determine when to compress the printed
|
||||||
// out type, but give ourselves some leeway to avoid ending up creating a file for
|
// out type, but give ourselves some leeway to avoid ending up creating a file for
|
||||||
// a type that is somewhat shorter than the path we'd write to.
|
// a type that is somewhat shorter than the path we'd write to.
|
||||||
let len = self.tcx.sess().diagnostic_width() + 40;
|
let len = self.tcx.sess.diagnostic_width() + 40;
|
||||||
let exp_s = exp.content();
|
let exp_s = exp.content();
|
||||||
let fnd_s = fnd.content();
|
let fnd_s = fnd.content();
|
||||||
if exp_s.len() > len {
|
if exp_s.len() > len {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue