about summary refs log tree commit diff
path: root/compiler/rustc_mir/src/transform/coverage/counters.rs
diff options
context:
space:
mode:
authorRich Kadel <richkadel@google.com>2020-10-22 20:28:16 -0700
committerRich Kadel <richkadel@google.com>2020-11-05 18:24:14 -0800
commit3291d28e9ac1173f033d240bc5f3f145c9c8dd59 (patch)
tree9434df1af15a71dec68b47ed307e07a0d40efebb /compiler/rustc_mir/src/transform/coverage/counters.rs
parentb5020648fe294a1f139586e4243903d8c1a105b8 (diff)
downloadrust-3291d28e9ac1173f033d240bc5f3f145c9c8dd59.tar.gz
rust-3291d28e9ac1173f033d240bc5f3f145c9c8dd59.zip
Adds coverage graphviz
Diffstat (limited to 'compiler/rustc_mir/src/transform/coverage/counters.rs')
-rw-r--r--compiler/rustc_mir/src/transform/coverage/counters.rs37
1 files changed, 32 insertions, 5 deletions
diff --git a/compiler/rustc_mir/src/transform/coverage/counters.rs b/compiler/rustc_mir/src/transform/coverage/counters.rs
index 511ad937c24..c31f401780e 100644
--- a/compiler/rustc_mir/src/transform/coverage/counters.rs
+++ b/compiler/rustc_mir/src/transform/coverage/counters.rs
@@ -1,3 +1,7 @@
+use super::debug;
+
+use debug::DebugCounters;
+
 use rustc_middle::mir::coverage::*;
 
 /// Manages the counter and expression indexes/IDs to generate `CoverageKind` components for MIR
@@ -6,6 +10,7 @@ pub(crate) struct CoverageCounters {
     function_source_hash: u64,
     next_counter_id: u32,
     num_expressions: u32,
+    pub debug_counters: DebugCounters,
 }
 
 impl CoverageCounters {
@@ -14,24 +19,46 @@ impl CoverageCounters {
             function_source_hash,
             next_counter_id: CounterValueReference::START.as_u32(),
             num_expressions: 0,
+            debug_counters: DebugCounters::new(),
         }
     }
 
-    pub fn make_counter(&mut self) -> CoverageKind {
-        CoverageKind::Counter {
+    /// Activate the `DebugCounters` data structures, to provide additional debug formatting
+    /// features when formating `CoverageKind` (counter) values.
+    pub fn enable_debug(&mut self) {
+        self.debug_counters.enable();
+    }
+
+    pub fn make_counter<F>(&mut self, debug_block_label_fn: F) -> CoverageKind
+    where
+        F: Fn() -> Option<String>,
+    {
+        let counter = CoverageKind::Counter {
             function_source_hash: self.function_source_hash,
             id: self.next_counter(),
+        };
+        if self.debug_counters.is_enabled() {
+            self.debug_counters.add_counter(&counter, (debug_block_label_fn)());
         }
+        counter
     }
 
-    pub fn make_expression(
+    pub fn make_expression<F>(
         &mut self,
         lhs: ExpressionOperandId,
         op: Op,
         rhs: ExpressionOperandId,
-    ) -> CoverageKind {
+        debug_block_label_fn: F,
+    ) -> CoverageKind
+    where
+        F: Fn() -> Option<String>,
+    {
         let id = self.next_expression();
-        CoverageKind::Expression { id, lhs, op, rhs }
+        let expression = CoverageKind::Expression { id, lhs, op, rhs };
+        if self.debug_counters.is_enabled() {
+            self.debug_counters.add_counter(&expression, (debug_block_label_fn)());
+        }
+        expression
     }
 
     /// Counter IDs start from one and go up.