Add #[rustc_clean(loaded_from_disk)]
to assert loading of query result
Currently, you can use `#[rustc_clean]` to assert to that a particular query (technically, a `DepNode`) is green or red. However, a green `DepNode` does not mean that the query result was actually deserialized from disk - we might have never re-run a query that needed the result. Some incremental tests are written as regression tests for ICEs that occured during query result decoding. Using `#[rustc_clean(loaded_from_disk="typeck")]`, you can now assert that the result of a particular query (e.g. `typeck`) was actually loaded from disk, in addition to being green.
This commit is contained in:
parent
e100ec5bc7
commit
f1d682334d
5 changed files with 64 additions and 3 deletions
|
@ -88,6 +88,11 @@ struct DepGraphData<K: DepKind> {
|
|||
previous_work_products: FxHashMap<WorkProductId, WorkProduct>,
|
||||
|
||||
dep_node_debug: Lock<FxHashMap<DepNode<K>, String>>,
|
||||
|
||||
/// Used by incremental compilation tests to assert that
|
||||
/// a particular query result was decoded from disk
|
||||
/// (not just marked green)
|
||||
debug_loaded_from_disk: Lock<FxHashSet<DepNode<K>>>,
|
||||
}
|
||||
|
||||
pub fn hash_result<R>(hcx: &mut StableHashingContext<'_>, result: &R) -> Fingerprint
|
||||
|
@ -135,6 +140,7 @@ impl<K: DepKind> DepGraph<K> {
|
|||
processed_side_effects: Default::default(),
|
||||
previous: prev_graph,
|
||||
colors: DepNodeColorMap::new(prev_graph_node_count),
|
||||
debug_loaded_from_disk: Default::default(),
|
||||
})),
|
||||
virtual_dep_node_index: Lrc::new(AtomicU32::new(0)),
|
||||
}
|
||||
|
@ -438,6 +444,14 @@ impl<K: DepKind> DepGraph<K> {
|
|||
&self.data.as_ref().unwrap().previous_work_products
|
||||
}
|
||||
|
||||
pub fn mark_debug_loaded_from_disk(&self, dep_node: DepNode<K>) {
|
||||
self.data.as_ref().unwrap().debug_loaded_from_disk.lock().insert(dep_node);
|
||||
}
|
||||
|
||||
pub fn debug_was_loaded_from_disk(&self, dep_node: DepNode<K>) -> bool {
|
||||
self.data.as_ref().unwrap().debug_loaded_from_disk.lock().contains(&dep_node)
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
pub fn register_dep_node_debug_str<F>(&self, dep_node: DepNode<K>, debug_str_gen: F)
|
||||
where
|
||||
|
|
|
@ -519,6 +519,10 @@ where
|
|||
prof_timer.finish_with_query_invocation_id(dep_node_index.into());
|
||||
|
||||
if let Some(result) = result {
|
||||
if unlikely!(tcx.dep_context().sess().opts.debugging_opts.query_dep_graph) {
|
||||
dep_graph.mark_debug_loaded_from_disk(*dep_node)
|
||||
}
|
||||
|
||||
let prev_fingerprint = tcx
|
||||
.dep_context()
|
||||
.dep_graph()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue