about summary refs log tree commit diff
diff options
context:
space:
mode:
authorZalathar <Zalathar@users.noreply.github.com>2024-04-21 18:05:02 +1000
committerZalathar <Zalathar@users.noreply.github.com>2024-05-14 13:57:23 +1000
commit1a3a54c513a9032582a092f20315031f8a485aaf (patch)
tree5832b039f0d628e162865d869eb72135d99876fe
parent9105c57b7f6623310e33f3ee7e48a3114e5190a7 (diff)
downloadrust-1a3a54c513a9032582a092f20315031f8a485aaf.tar.gz
rust-1a3a54c513a9032582a092f20315031f8a485aaf.zip
coverage: Store expression operands as `BcbCounter`
-rw-r--r--compiler/rustc_mir_transform/src/coverage/counters.rs28
1 files changed, 24 insertions, 4 deletions
diff --git a/compiler/rustc_mir_transform/src/coverage/counters.rs b/compiler/rustc_mir_transform/src/coverage/counters.rs
index b98554ec00f..07a1862e5db 100644
--- a/compiler/rustc_mir_transform/src/coverage/counters.rs
+++ b/compiler/rustc_mir_transform/src/coverage/counters.rs
@@ -36,6 +36,13 @@ impl Debug for BcbCounter {
 }
 
 #[derive(Debug)]
+struct BcbExpression {
+    lhs: BcbCounter,
+    op: Op,
+    rhs: BcbCounter,
+}
+
+#[derive(Debug)]
 pub(super) enum CounterIncrementSite {
     Node { bcb: BasicCoverageBlock },
     Edge { from_bcb: BasicCoverageBlock, to_bcb: BasicCoverageBlock },
@@ -58,7 +65,7 @@ pub(super) struct CoverageCounters {
     bcb_edge_counters: FxHashMap<(BasicCoverageBlock, BasicCoverageBlock), BcbCounter>,
     /// Table of expression data, associating each expression ID with its
     /// corresponding operator (+ or -) and its LHS/RHS operands.
-    expressions: IndexVec<ExpressionId, Expression>,
+    expressions: IndexVec<ExpressionId, BcbExpression>,
 }
 
 impl CoverageCounters {
@@ -90,8 +97,7 @@ impl CoverageCounters {
     }
 
     fn make_expression(&mut self, lhs: BcbCounter, op: Op, rhs: BcbCounter) -> BcbCounter {
-        let expression = Expression { lhs: lhs.as_term(), op, rhs: rhs.as_term() };
-        let id = self.expressions.push(expression);
+        let id = self.expressions.push(BcbExpression { lhs, op, rhs });
         BcbCounter::Expression { id }
     }
 
@@ -166,7 +172,21 @@ impl CoverageCounters {
     }
 
     pub(super) fn into_expressions(self) -> IndexVec<ExpressionId, Expression> {
-        self.expressions
+        let old_len = self.expressions.len();
+        let expressions = self
+            .expressions
+            .into_iter()
+            .map(|BcbExpression { lhs, op, rhs }| Expression {
+                lhs: lhs.as_term(),
+                op,
+                rhs: rhs.as_term(),
+            })
+            .collect::<IndexVec<ExpressionId, _>>();
+
+        // Expression IDs are indexes into this vector, so make sure we didn't
+        // accidentally invalidate them by changing its length.
+        assert_eq!(old_len, expressions.len());
+        expressions
     }
 }