Skip to content

Commit

Permalink
Always run incremental_verify_ich when re-computing query results
Browse files Browse the repository at this point in the history
Issue rust-lang#82920 showed that the kind of bugs caught by this flag have
soundness implications.

This causes performance regressions of up to 15.2% during incremental
compilation, but this is necessary to catch miscompilations caused by
bugs in query implementations.
  • Loading branch information
Aaron1011 committed Mar 13, 2021
1 parent 066f01d commit 7d7c81a
Showing 1 changed file with 18 additions and 11 deletions.
29 changes: 18 additions & 11 deletions compiler/rustc_query_system/src/query/plumbing.rs
Original file line number Diff line number Diff line change
Expand Up @@ -533,7 +533,13 @@ where
None
};

let result = if let Some(result) = result {
if let Some(result) = result {
// If `-Zincremental-verify-ich` is specified, re-hash results from
// the cache and make sure that they have the expected fingerprint.
if unlikely!(tcx.dep_context().sess().opts.debugging_opts.incremental_verify_ich) {
incremental_verify_ich(*tcx.dep_context(), &result, dep_node, dep_node_index, query);
}

result
} else {
// We could not load a result from the on-disk cache, so
Expand All @@ -545,20 +551,21 @@ where

prof_timer.finish_with_query_invocation_id(dep_node_index.into());

result
};

// If `-Zincremental-verify-ich` is specified, re-hash results from
// the cache and make sure that they have the expected fingerprint.
if unlikely!(tcx.dep_context().sess().opts.debugging_opts.incremental_verify_ich) {
// Verify that re-running the query produced a result with the expected hash
// This catches bugs in query implementations, turning them into ICEs.
// For example, a query might sort its result by `DefId` - since `DefId`s are
// not stable across compilation sessions, the result could get up getting sorted
// in a different order when the query is re-run, even though all of the inputs
// (e.g. `DefPathHash` values) were green.
//
// See issue #82920 for an example of a miscompilation that would get turned into
// an ICE by this check
incremental_verify_ich(*tcx.dep_context(), &result, dep_node, dep_node_index, query);
}

result
result
}
}

#[inline(never)]
#[cold]
fn incremental_verify_ich<CTX, K, V: Debug>(
tcx: CTX::DepContext,
result: &V,
Expand Down

0 comments on commit 7d7c81a

Please sign in to comment.