Implement query ensure
`$query::ensure()` guarantees that one of two things is true after it returns: - The query has all green inputs. - The query has been executed. and counts as a read from the source query
This commit is contained in:
parent
d6d711dd8f
commit
67b3e7cc43
@ -344,6 +344,48 @@ macro_rules! define_maps {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Ensure that either this query has all green inputs or been executed.
|
||||||
|
/// Executing query::ensure(D) is considered a read of the dep-node D.
|
||||||
|
///
|
||||||
|
/// This function is particularly useful when executing passes for their
|
||||||
|
/// side-effects -- e.g., in order to report errors for erroneous programs.
|
||||||
|
///
|
||||||
|
/// Note: The optimization is only available during incr. comp.
|
||||||
|
pub fn ensure(tcx: TyCtxt<'a, $tcx, 'lcx>, key: $K) -> () {
|
||||||
|
let dep_node = Self::to_dep_node(tcx, &key);
|
||||||
|
|
||||||
|
// Ensuring an "input" or anonymous query makes no sense
|
||||||
|
assert!(!dep_node.kind.is_anon());
|
||||||
|
assert!(!dep_node.kind.is_input());
|
||||||
|
use dep_graph::DepNodeColor;
|
||||||
|
match tcx.dep_graph.node_color(&dep_node) {
|
||||||
|
Some(DepNodeColor::Green(dep_node_index)) => {
|
||||||
|
profq_msg!(tcx, ProfileQueriesMsg::CacheHit);
|
||||||
|
tcx.dep_graph.read_index(dep_node_index);
|
||||||
|
}
|
||||||
|
Some(DepNodeColor::Red) => {
|
||||||
|
let _ = tcx.$name(key);
|
||||||
|
}
|
||||||
|
None => {
|
||||||
|
// Huh
|
||||||
|
if !tcx.dep_graph.is_fully_enabled() {
|
||||||
|
let _ = tcx.$name(key);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
match tcx.dep_graph.try_mark_green(tcx, &dep_node) {
|
||||||
|
Some(dep_node_index) => {
|
||||||
|
debug_assert!(tcx.dep_graph.is_green(dep_node_index));
|
||||||
|
profq_msg!(tcx, ProfileQueriesMsg::CacheHit);
|
||||||
|
tcx.dep_graph.read_index(dep_node_index);
|
||||||
|
}
|
||||||
|
None => {
|
||||||
|
let _ = tcx.$name(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn compute_result(tcx: TyCtxt<'a, $tcx, 'lcx>, key: $K) -> $V {
|
fn compute_result(tcx: TyCtxt<'a, $tcx, 'lcx>, key: $K) -> $V {
|
||||||
let provider = tcx.maps.providers[key.map_crate()].$name;
|
let provider = tcx.maps.providers[key.map_crate()].$name;
|
||||||
provider(tcx.global_tcx(), key)
|
provider(tcx.global_tcx(), key)
|
||||||
|
Loading…
Reference in New Issue
Block a user