Skip to content

Commit e56269d

Browse files
committed
!! (WIP) Use CoverageKind::Mappings
Can we get spans printed in graphviz?
1 parent b7ff7a4 commit e56269d

File tree

6 files changed

+34
-12
lines changed

6 files changed

+34
-12
lines changed

compiler/rustc_codegen_llvm/src/coverageinfo/map_data.rs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -152,14 +152,22 @@ impl<'tcx> FunctionCoverage<'tcx> {
152152
}
153153

154154
pub(crate) fn finalize(&mut self) {
155-
self.simplify_expressions();
155+
let zero_expressions = self.simplify_expressions_and_get_zero_expressions();
156156

157157
let mapping_kind_sort_key = |mapping_kind: &CovTerm| match mapping_kind {
158158
CovTerm::Counter(_) => 0,
159159
CovTerm::Expression(_) => 1,
160160
CovTerm::Zero => u8::MAX,
161161
};
162162
for mappings in self.mappings_per_file.values_mut() {
163+
for mapping in mappings.iter_mut().filter_map(|(mapping_kind, _)| match *mapping_kind {
164+
CovTerm::Expression(id) if zero_expressions.contains(&id) => Some(mapping_kind),
165+
CovTerm::Counter(id) if !self.counters_seen.contains(id) => Some(mapping_kind),
166+
_ => None,
167+
}) {
168+
*mapping = CovTerm::Zero;
169+
}
170+
163171
mappings.sort_by(|(a, a_region), (b, b_region)| {
164172
Ord::cmp(a_region, b_region)
165173
.then_with(|| Ord::cmp(&mapping_kind_sort_key(a), &mapping_kind_sort_key(b)))
@@ -171,12 +179,13 @@ impl<'tcx> FunctionCoverage<'tcx> {
171179
}
172180

173181
/// Perform some simplifications to make the final coverage mappings
174-
/// slightly smaller.
182+
/// slightly smaller. Returns the set of expression IDs that are guaranteed
183+
/// to have a value of zero.
175184
///
176185
/// This method mainly exists to preserve the simplifications that were
177186
/// already being performed by the Rust-side expression renumbering, so that
178187
/// the resulting coverage mappings don't get worse.
179-
fn simplify_expressions(&mut self) {
188+
fn simplify_expressions_and_get_zero_expressions(&mut self) -> FxIndexSet<ExpressionId> {
180189
// The set of expressions that either were optimized out entirely, or
181190
// have zero as both of their operands, and will therefore always have
182191
// a value of zero. Other expressions that refer to these as operands
@@ -220,6 +229,8 @@ impl<'tcx> FunctionCoverage<'tcx> {
220229
zero_expressions.insert(id);
221230
}
222231
}
232+
233+
zero_expressions
223234
}
224235

225236
/// Return the source hash, generated from the HIR node structure, and used to indicate whether

compiler/rustc_mir_transform/src/coverage/mod.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -314,11 +314,17 @@ impl<'a, 'tcx> Instrumentor<'a, 'tcx> {
314314
})
315315
.collect::<Vec<_>>();
316316

317+
inject_statement(
318+
self.mir_body,
319+
CoverageKind::Mappings { kind: counter_kind.as_term() },
320+
mir::START_BLOCK,
321+
code_regions,
322+
);
317323
inject_statement(
318324
self.mir_body,
319325
self.make_mir_coverage_kind(&counter_kind),
320326
self.bcb_leader_bb(bcb),
321-
code_regions,
327+
Vec::new(),
322328
);
323329
}
324330
}

tests/mir-opt/coverage_graphviz.bar.InstrumentCoverage.0.dot

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@ digraph Cov_0_4 {
22
graph [fontname="Courier, monospace"];
33
node [fontname="Courier, monospace"];
44
edge [fontname="Courier, monospace"];
5-
bcb0__Cov_0_4 [shape="none", label=<<table border="0" cellborder="1" cellspacing="0"><tr><td bgcolor="gray" align="center" colspan="1">bcb0</td></tr><tr><td align="left" balign="left"></td></tr><tr><td align="left" balign="left">Counter(bcb0) at 18:1-20:2<br align="left"/> 19:5-19:9: @0[0]: Coverage::Counter(0) for [$DIR/coverage_graphviz.rs:18:1 - 20:2]<br align="left"/> 20:2-20:2: @0.Return: return</td></tr><tr><td align="left" balign="left">bb0: Return</td></tr></table>>];
5+
bcb0__Cov_0_4 [shape="none", label=<<table border="0" cellborder="1" cellspacing="0"><tr><td bgcolor="gray" align="center" colspan="1">bcb0</td></tr><tr><td align="left" balign="left"></td></tr><tr><td align="left" balign="left">Counter(bcb0) at 18:1-20:2<br align="left"/> 19:5-19:9: @0[0]: Coverage::Counter(0)<br align="left"/> 20:2-20:2: @0.Return: return</td></tr><tr><td align="left" balign="left">bb0: Return</td></tr></table>>];
66
}

tests/mir-opt/coverage_graphviz.main.InstrumentCoverage.0.dot

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ digraph Cov_0_3 {
22
graph [fontname="Courier, monospace"];
33
node [fontname="Courier, monospace"];
44
edge [fontname="Courier, monospace"];
5-
bcb3__Cov_0_3 [shape="none", label=<<table border="0" cellborder="1" cellspacing="0"><tr><td bgcolor="gray" align="center" colspan="1">bcb3</td></tr><tr><td align="left" balign="left">Counter(bcb3) at 13:10-13:10<br align="left"/> 13:10-13:10: @5[0]: Coverage::Counter(1) for [$DIR/coverage_graphviz.rs:13:10 - 13:11]</td></tr><tr><td align="left" balign="left">bb5: Goto</td></tr></table>>];
6-
bcb2__Cov_0_3 [shape="none", label=<<table border="0" cellborder="1" cellspacing="0"><tr><td bgcolor="gray" align="center" colspan="1">bcb2</td></tr><tr><td align="left" balign="left">Expression(bcb1:(bcb0 + bcb3) - bcb3) at 12:13-12:18<br align="left"/> 12:13-12:18: @4[0]: Coverage::Expression(1) = Expression(0) - Counter(1) for [$DIR/coverage_graphviz.rs:12:13 - 12:18, $DIR/coverage_graphviz.rs:15:1 - 15:2]<br align="left"/>Expression(bcb1:(bcb0 + bcb3) - bcb3) at 15:2-15:2<br align="left"/> 15:2-15:2: @4.Return: return</td></tr><tr><td align="left" balign="left">bb4: Return</td></tr></table>>];
5+
bcb3__Cov_0_3 [shape="none", label=<<table border="0" cellborder="1" cellspacing="0"><tr><td bgcolor="gray" align="center" colspan="1">bcb3</td></tr><tr><td align="left" balign="left">Counter(bcb3) at 13:10-13:10<br align="left"/> 13:10-13:10: @5[0]: Coverage::Counter(1)</td></tr><tr><td align="left" balign="left">bb5: Goto</td></tr></table>>];
6+
bcb2__Cov_0_3 [shape="none", label=<<table border="0" cellborder="1" cellspacing="0"><tr><td bgcolor="gray" align="center" colspan="1">bcb2</td></tr><tr><td align="left" balign="left">Expression(bcb1:(bcb0 + bcb3) - bcb3) at 12:13-12:18<br align="left"/> 12:13-12:18: @4[0]: Coverage::Expression(1) = Expression(0) - Counter(1)<br align="left"/>Expression(bcb1:(bcb0 + bcb3) - bcb3) at 15:2-15:2<br align="left"/> 15:2-15:2: @4.Return: return</td></tr><tr><td align="left" balign="left">bb4: Return</td></tr></table>>];
77
bcb1__Cov_0_3 [shape="none", label=<<table border="0" cellborder="1" cellspacing="0"><tr><td bgcolor="gray" align="center" colspan="1">bcb1</td></tr><tr><td align="left" balign="left">Expression(bcb0 + bcb3) at 10:5-11:17<br align="left"/> 11:12-11:17: @2.Call: _2 = bar() -&gt; [return: bb3, unwind: bb6]</td></tr><tr><td align="left" balign="left">bb1: FalseUnwind<br align="left"/>bb2: Call</td></tr><tr><td align="left" balign="left">bb3: SwitchInt</td></tr></table>>];
88
bcb0__Cov_0_3 [shape="none", label=<<table border="0" cellborder="1" cellspacing="0"><tr><td bgcolor="gray" align="center" colspan="1">bcb0</td></tr><tr><td align="left" balign="left"></td></tr><tr><td align="left" balign="left">Counter(bcb0) at 9:1-9:11<br align="left"/> </td></tr><tr><td align="left" balign="left">bb0: Goto</td></tr></table>>];
99
bcb3__Cov_0_3 -> bcb1__Cov_0_3 [label=<>];

tests/mir-opt/instrument_coverage.bar.InstrumentCoverage.diff

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
let mut _0: bool;
66

77
bb0: {
8-
+ Coverage::Counter(0) for [/the/src/instrument_coverage.rs:20:1 - 22:2];
8+
+ Coverage::Counter(0);
9+
+ Coverage::Mappings { kind: Counter(0) } for [/the/src/instrument_coverage.rs:20:1 - 22:2];
910
_0 = const true;
1011
return;
1112
}

tests/mir-opt/instrument_coverage.main.InstrumentCoverage.diff

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,16 @@
88
let mut _3: !;
99

1010
bb0: {
11-
+ Coverage::Counter(0) for [/the/src/instrument_coverage.rs:11:1 - 11:11];
11+
+ Coverage::Mappings { kind: Counter(1) } for [/the/src/instrument_coverage.rs:15:10 - 15:11];
12+
+ Coverage::Mappings { kind: Expression(1) } for [/the/src/instrument_coverage.rs:14:13 - 14:18, /the/src/instrument_coverage.rs:17:1 - 17:2];
13+
+ Coverage::Mappings { kind: Expression(0) } for [/the/src/instrument_coverage.rs:12:5 - 13:17];
14+
+ Coverage::Counter(0);
15+
+ Coverage::Mappings { kind: Counter(0) } for [/the/src/instrument_coverage.rs:11:1 - 11:11];
1216
goto -> bb1;
1317
}
1418

1519
bb1: {
16-
+ Coverage::Expression(0) = Counter(0) + Counter(1) for [/the/src/instrument_coverage.rs:12:5 - 13:17];
20+
+ Coverage::Expression(0) = Counter(0) + Counter(1);
1721
falseUnwind -> [real: bb2, unwind: bb6];
1822
}
1923

@@ -27,14 +31,14 @@
2731
}
2832

2933
bb4: {
30-
+ Coverage::Expression(1) = Expression(0) - Counter(1) for [/the/src/instrument_coverage.rs:14:13 - 14:18, /the/src/instrument_coverage.rs:17:1 - 17:2];
34+
+ Coverage::Expression(1) = Expression(0) - Counter(1);
3135
_0 = const ();
3236
StorageDead(_2);
3337
return;
3438
}
3539

3640
bb5: {
37-
+ Coverage::Counter(1) for [/the/src/instrument_coverage.rs:15:10 - 15:11];
41+
+ Coverage::Counter(1);
3842
_1 = const ();
3943
StorageDead(_2);
4044
goto -> bb1;

0 commit comments

Comments
 (0)