Use a dedicated DepKind for the forever-red node.
This commit is contained in:
parent
c168fba268
commit
e912c8dfe0
5 changed files with 23 additions and 6 deletions
|
@ -183,6 +183,9 @@ rustc_dep_node_append!([define_dep_nodes!][ <'tcx>
|
||||||
// We use this for most things when incr. comp. is turned off.
|
// We use this for most things when incr. comp. is turned off.
|
||||||
[] Null,
|
[] Null,
|
||||||
|
|
||||||
|
// We use this to create a forever-red node.
|
||||||
|
[] Red,
|
||||||
|
|
||||||
[anon] TraitSelect,
|
[anon] TraitSelect,
|
||||||
|
|
||||||
// WARNING: if `Symbol` is changed, make sure you update `make_compile_codegen_unit` below.
|
// WARNING: if `Symbol` is changed, make sure you update `make_compile_codegen_unit` below.
|
||||||
|
|
|
@ -23,6 +23,7 @@ pub type EdgeFilter = rustc_query_system::dep_graph::debug::EdgeFilter<DepKind>;
|
||||||
|
|
||||||
impl rustc_query_system::dep_graph::DepKind for DepKind {
|
impl rustc_query_system::dep_graph::DepKind for DepKind {
|
||||||
const NULL: Self = DepKind::Null;
|
const NULL: Self = DepKind::Null;
|
||||||
|
const RED: Self = DepKind::Red;
|
||||||
|
|
||||||
fn debug_node(node: &DepNode, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
fn debug_node(node: &DepNode, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
write!(f, "{:?}(", node.kind)?;
|
write!(f, "{:?}(", node.kind)?;
|
||||||
|
|
|
@ -377,6 +377,17 @@ macro_rules! define_queries {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We use this for the forever-red node.
|
||||||
|
pub fn Red() -> DepKindStruct {
|
||||||
|
DepKindStruct {
|
||||||
|
is_anon: false,
|
||||||
|
is_eval_always: false,
|
||||||
|
fingerprint_style: FingerprintStyle::Unit,
|
||||||
|
force_from_dep_node: Some(|_, dep_node| bug!("force_from_dep_node: encountered {:?}", dep_node)),
|
||||||
|
try_load_from_on_disk_cache: None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn TraitSelect() -> DepKindStruct {
|
pub fn TraitSelect() -> DepKindStruct {
|
||||||
DepKindStruct {
|
DepKindStruct {
|
||||||
is_anon: true,
|
is_anon: true,
|
||||||
|
|
|
@ -134,19 +134,19 @@ impl<K: DepKind> DepGraph<K> {
|
||||||
smallvec![],
|
smallvec![],
|
||||||
Fingerprint::ZERO,
|
Fingerprint::ZERO,
|
||||||
);
|
);
|
||||||
debug_assert_eq!(_green_node_index, DepNodeIndex::SINGLETON_DEPENDENCYLESS_ANON_NODE);
|
assert_eq!(_green_node_index, DepNodeIndex::SINGLETON_DEPENDENCYLESS_ANON_NODE);
|
||||||
|
|
||||||
// Instantiate a dependy-less red node only once for anonymous queries.
|
// Instantiate a dependy-less red node only once for anonymous queries.
|
||||||
let (_red_node_index, _prev_and_index) = current.intern_node(
|
let (_red_node_index, _prev_and_index) = current.intern_node(
|
||||||
profiler,
|
profiler,
|
||||||
&prev_graph,
|
&prev_graph,
|
||||||
DepNode { kind: DepKind::NULL, hash: Fingerprint::ZERO.into() },
|
DepNode { kind: DepKind::RED, hash: Fingerprint::ZERO.into() },
|
||||||
smallvec![],
|
smallvec![],
|
||||||
None,
|
None,
|
||||||
false,
|
false,
|
||||||
);
|
);
|
||||||
debug_assert_eq!(_red_node_index, DepNodeIndex::FOREVER_RED_NODE);
|
assert_eq!(_red_node_index, DepNodeIndex::FOREVER_RED_NODE);
|
||||||
debug_assert!(matches!(_prev_and_index, None | Some((_, DepNodeColor::Red))));
|
assert!(matches!(_prev_and_index, None | Some((_, DepNodeColor::Red))));
|
||||||
|
|
||||||
DepGraph {
|
DepGraph {
|
||||||
data: Some(Lrc::new(DepGraphData {
|
data: Some(Lrc::new(DepGraphData {
|
||||||
|
@ -981,8 +981,6 @@ impl<K: DepKind> CurrentDepGraph<K> {
|
||||||
let mut stable_hasher = StableHasher::new();
|
let mut stable_hasher = StableHasher::new();
|
||||||
nanos.hash(&mut stable_hasher);
|
nanos.hash(&mut stable_hasher);
|
||||||
let anon_id_seed = stable_hasher.finish();
|
let anon_id_seed = stable_hasher.finish();
|
||||||
// We rely on the fact that `anon_id_seed` is not zero when creating static nodes.
|
|
||||||
debug_assert_ne!(anon_id_seed, Fingerprint::ZERO);
|
|
||||||
|
|
||||||
#[cfg(debug_assertions)]
|
#[cfg(debug_assertions)]
|
||||||
let forbidden_edge = match env::var("RUST_FORBID_DEP_GRAPH_EDGE") {
|
let forbidden_edge = match env::var("RUST_FORBID_DEP_GRAPH_EDGE") {
|
||||||
|
|
|
@ -85,8 +85,12 @@ impl FingerprintStyle {
|
||||||
|
|
||||||
/// Describe the different families of dependency nodes.
|
/// Describe the different families of dependency nodes.
|
||||||
pub trait DepKind: Copy + fmt::Debug + Eq + Hash + Send + Encodable<FileEncoder> + 'static {
|
pub trait DepKind: Copy + fmt::Debug + Eq + Hash + Send + Encodable<FileEncoder> + 'static {
|
||||||
|
/// DepKind to use when incr. comp. is turned off.
|
||||||
const NULL: Self;
|
const NULL: Self;
|
||||||
|
|
||||||
|
/// DepKind to use to create the initial forever-red node.
|
||||||
|
const RED: Self;
|
||||||
|
|
||||||
/// Implementation of `std::fmt::Debug` for `DepNode`.
|
/// Implementation of `std::fmt::Debug` for `DepNode`.
|
||||||
fn debug_node(node: &DepNode<Self>, f: &mut fmt::Formatter<'_>) -> fmt::Result;
|
fn debug_node(node: &DepNode<Self>, f: &mut fmt::Formatter<'_>) -> fmt::Result;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue