Skip to content

Commit abfe862

Browse files
committed
Reintroduce assertion.
1 parent 6032535 commit abfe862

File tree

2 files changed

+39
-0
lines changed
  • compiler

2 files changed

+39
-0
lines changed

compiler/rustc_codegen_ssa/src/base.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1056,6 +1056,13 @@ pub fn determine_cgu_reuse<'tcx>(tcx: TyCtxt<'tcx>, cgu: &CodegenUnit<'tcx>) ->
10561056
// know that later). If we are not doing LTO, there is only one optimized
10571057
// version of each module, so we re-use that.
10581058
let dep_node = cgu.codegen_dep_node(tcx);
1059+
tcx.dep_graph.assert_nonexistent_node(&dep_node, || {
1060+
format!(
1061+
"CompileCodegenUnit dep-node for CGU `{}` already exists before marking.",
1062+
cgu.name()
1063+
)
1064+
});
1065+
10591066
if tcx.try_mark_green(&dep_node) {
10601067
// We can re-use either the pre- or the post-thinlto state. If no LTO is
10611068
// being performed then we can use post-LTO artifacts, otherwise we must

compiler/rustc_query_system/src/dep_graph/graph.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,14 @@ impl<D: Deps> DepGraphData<D> {
346346
task: fn(Ctxt, A) -> R,
347347
hash_result: Option<fn(&mut StableHashingContext<'_>, &R) -> Fingerprint>,
348348
) -> (R, DepNodeIndex) {
349+
self.assert_nonexistent_node(&key, || {
350+
format!(
351+
"forcing query with already existing `DepNode`\n\
352+
- query-key: {arg:?}\n\
353+
- dep-node: {key:?}"
354+
)
355+
});
356+
349357
let with_deps = |task_deps| D::with_deps(task_deps, || task(cx, arg));
350358
let (result, edges) = if cx.dep_context().is_eval_always(key.kind) {
351359
(with_deps(TaskDepsRef::EvalAlways), EdgesVec::new())
@@ -620,6 +628,18 @@ impl<D: Deps> DepGraph<D> {
620628
}
621629

622630
impl<D: Deps> DepGraphData<D> {
631+
fn assert_nonexistent_node<S: std::fmt::Display>(
632+
&self,
633+
_dep_node: &DepNode,
634+
_msg: impl FnOnce() -> S,
635+
) {
636+
#[cfg(debug_assertions)]
637+
if let Some(seen_dep_nodes) = &self.current.seen_dep_nodes {
638+
let seen = seen_dep_nodes.lock().contains(_dep_node);
639+
assert!(!seen, "{}", _msg());
640+
}
641+
}
642+
623643
fn node_color(&self, dep_node: &DepNode) -> Option<DepNodeColor> {
624644
if let Some(prev_index) = self.previous.node_to_index_opt(dep_node) {
625645
self.colors.get(prev_index)
@@ -924,6 +944,18 @@ impl<D: Deps> DepGraph<D> {
924944
self.node_color(dep_node).is_some_and(|c| c.is_green())
925945
}
926946

947+
pub fn assert_nonexistent_node<S: std::fmt::Display>(
948+
&self,
949+
dep_node: &DepNode,
950+
msg: impl FnOnce() -> S,
951+
) {
952+
if cfg!(debug_assertions)
953+
&& let Some(data) = &self.data
954+
{
955+
data.assert_nonexistent_node(dep_node, msg)
956+
}
957+
}
958+
927959
/// This method loads all on-disk cacheable query results into memory, so
928960
/// they can be written out to the new cache file again. Most query results
929961
/// will already be in memory but in the case where we marked something as

0 commit comments

Comments
 (0)