Skip to content

Commit 56a3e06

Browse files
committed
!! (WIP) Per-function coverage table
1 parent 6074487 commit 56a3e06

File tree

8 files changed

+36
-41
lines changed

8 files changed

+36
-41
lines changed

compiler/rustc_codegen_llvm/src/coverageinfo/map_data.rs

+7-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use crate::coverageinfo::ffi::{Counter, CounterExpression, ExprKind};
33
use rustc_data_structures::fx::{FxHashMap, FxIndexSet};
44
use rustc_index::bit_set::BitSet;
55
use rustc_index::IndexVec;
6+
use rustc_middle::mir;
67
use rustc_middle::mir::coverage::{CodeRegion, CounterId, CovTerm, ExpressionId, Op};
78
use rustc_middle::ty::Instance;
89
use rustc_middle::ty::TyCtxt;
@@ -129,7 +130,7 @@ impl<'tcx> FunctionCoverage<'tcx> {
129130
self.add_mappings(CovTerm::Zero, std::slice::from_ref(code_region));
130131
}
131132

132-
pub(crate) fn add_mappings(&mut self, kind: CovTerm, code_regions: &[CodeRegion]) {
133+
fn add_mappings(&mut self, kind: CovTerm, code_regions: &[CodeRegion]) {
133134
// There's no need to sort the regions by filename before grouping here,
134135
// because the result is the same either way.
135136
for regions_for_file in code_regions.group_by(|a, b| a.file_name == b.file_name) {
@@ -140,7 +141,11 @@ impl<'tcx> FunctionCoverage<'tcx> {
140141
}
141142
}
142143

143-
pub(crate) fn finalize(&mut self) {
144+
pub(crate) fn finalize(&mut self, coverage_info: &mir::coverage::FunctionCoverageInfo) {
145+
for &(mapping_kind, ref code_region) in &coverage_info.mappings {
146+
self.add_mappings(mapping_kind, std::slice::from_ref(code_region));
147+
}
148+
144149
let zero_expressions = self.simplify_expressions_and_get_zero_expressions();
145150

146151
let mapping_kind_sort_key = |mapping_kind: &CovTerm| match mapping_kind {

compiler/rustc_codegen_llvm/src/coverageinfo/mapgen.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,10 @@ pub fn finalize(cx: &CodegenCx<'_, '_>) {
6161
let mut function_data = Vec::new();
6262
for (instance, mut function_coverage) in function_coverage_map {
6363
debug!("Generate function coverage for {}, {:?}", cx.codegen_unit.name(), instance);
64-
function_coverage.finalize();
64+
let Some(coverage_info) = tcx.instance_mir(instance.def).coverage_info.as_ref() else {
65+
continue;
66+
};
67+
function_coverage.finalize(coverage_info);
6568
let function_coverage = function_coverage;
6669

6770
let mangled_function_name = tcx.symbol_name(instance).name;

compiler/rustc_codegen_llvm/src/coverageinfo/mod.rs

-3
Original file line numberDiff line numberDiff line change
@@ -137,9 +137,6 @@ impl<'tcx> CoverageInfoBuilderMethods<'tcx> for Builder<'_, '_, 'tcx> {
137137
CoverageKind::Expression { id, lhs, op, rhs } => {
138138
func_coverage.add_expression_data(id, lhs, op, rhs);
139139
}
140-
CoverageKind::Mappings { kind, ref code_regions } => {
141-
func_coverage.add_mappings(kind, code_regions);
142-
}
143140
}
144141
}
145142
}

compiler/rustc_middle/src/mir/coverage.rs

+3-10
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,6 @@ pub enum CoverageKind {
7575
op: Op,
7676
rhs: CovTerm,
7777
},
78-
Mappings {
79-
kind: CovTerm,
80-
code_regions: Vec<CodeRegion>,
81-
},
8278
}
8379

8480
impl Debug for CoverageKind {
@@ -97,11 +93,6 @@ impl Debug for CoverageKind {
9793
},
9894
rhs,
9995
),
100-
Mappings { kind, code_regions } => fmt
101-
.debug_struct("Mappings")
102-
.field("kind", kind)
103-
.field("code_regions", code_regions)
104-
.finish(),
10596
}
10697
}
10798
}
@@ -144,4 +135,6 @@ impl Op {
144135
}
145136

146137
#[derive(Clone, Debug, TyEncodable, TyDecodable, Hash, HashStable, TypeFoldable, TypeVisitable)]
147-
pub struct FunctionCoverageInfo {}
138+
pub struct FunctionCoverageInfo {
139+
pub mappings: Vec<(CovTerm, CodeRegion)>,
140+
}

compiler/rustc_mir_transform/src/coverage/mod.rs

+12-13
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ struct Instrumentor<'a, 'tcx> {
107107
function_source_hash: u64,
108108
basic_coverage_blocks: CoverageGraph,
109109
coverage_counters: CoverageCounters,
110+
mappings: Vec<(CovTerm, CodeRegion)>,
110111
}
111112

112113
impl<'a, 'tcx> Instrumentor<'a, 'tcx> {
@@ -148,6 +149,7 @@ impl<'a, 'tcx> Instrumentor<'a, 'tcx> {
148149
function_source_hash,
149150
basic_coverage_blocks,
150151
coverage_counters,
152+
mappings: Vec::new(),
151153
}
152154
}
153155

@@ -276,6 +278,9 @@ impl<'a, 'tcx> Instrumentor<'a, 'tcx> {
276278
self.make_mir_coverage_kind(intermediate_expression),
277279
);
278280
}
281+
282+
self.mir_body.coverage_info =
283+
Some(Box::new(FunctionCoverageInfo { mappings: std::mem::take(&mut self.mappings) }));
279284
}
280285

281286
/// Injects a single [`StatementKind::Coverage`] for each BCB that has one
@@ -305,20 +310,14 @@ impl<'a, 'tcx> Instrumentor<'a, 'tcx> {
305310
debug_used_expressions.add_expression_operands(&counter_kind);
306311
graphviz_data.add_bcb_coverage_spans_with_counter(bcb, bcb_spans, &counter_kind);
307312

308-
// Convert the coverage spans into a vector of code regions to be
309-
// associated with this BCB's coverage statement.
310-
let code_regions = bcb_spans
311-
.iter()
312-
.map(|coverage_span| {
313-
make_code_region(source_map, file_name, coverage_span.span, body_span)
314-
})
315-
.collect::<Vec<_>>();
313+
let mapping_kind = counter_kind.as_term();
314+
self.mappings.extend(bcb_spans.iter().map(|coverage_span| {
315+
(
316+
mapping_kind,
317+
make_code_region(source_map, file_name, coverage_span.span, body_span),
318+
)
319+
}));
316320

317-
inject_statement(
318-
self.mir_body,
319-
CoverageKind::Mappings { kind: counter_kind.as_term(), code_regions },
320-
mir::START_BLOCK,
321-
);
322321
inject_statement(
323322
self.mir_body,
324323
self.make_mir_coverage_kind(&counter_kind),

compiler/rustc_mir_transform/src/coverage/query.rs

+10-7
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,12 @@ impl CoverageVisitor {
5858
for coverage in all_coverage_in_mir_body(body) {
5959
self.visit_coverage(coverage);
6060
}
61+
62+
for (mapping_kind, _code_region) in
63+
body.coverage_info.iter().flat_map(|coverage_info| &coverage_info.mappings)
64+
{
65+
self.update_from_term(*mapping_kind);
66+
}
6167
}
6268

6369
fn visit_coverage(&mut self, coverage: &Coverage) {
@@ -68,7 +74,6 @@ impl CoverageVisitor {
6874
self.update_from_term(lhs);
6975
self.update_from_term(rhs);
7076
}
71-
CoverageKind::Mappings { kind, .. } => self.update_from_term(kind),
7277
}
7378
}
7479
}
@@ -92,12 +97,10 @@ fn coverageinfo<'tcx>(tcx: TyCtxt<'tcx>, instance_def: ty::InstanceDef<'tcx>) ->
9297

9398
fn covered_code_regions(tcx: TyCtxt<'_>, def_id: DefId) -> Vec<&CodeRegion> {
9499
let body = mir_body(tcx, def_id);
95-
all_coverage_in_mir_body(body)
96-
// Only `Mappings` statements have a list of code regions.
97-
.flat_map(|coverage| match coverage.kind {
98-
CoverageKind::Mappings { ref code_regions, .. } => code_regions.as_slice(),
99-
_ => &[],
100-
})
100+
body.coverage_info
101+
.iter()
102+
.flat_map(|coverage_info| &coverage_info.mappings)
103+
.map(|(_mapping_kind, code_region)| code_region)
101104
.collect()
102105
}
103106

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

-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66

77
bb0: {
88
+ Coverage::Counter(0);
9-
+ Coverage::Mappings { kind: Counter(0), code_regions: [/the/src/instrument_coverage.rs:20:1 - 22:2] };
109
_0 = const true;
1110
return;
1211
}

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

-4
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,7 @@
88
let mut _3: !;
99

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

0 commit comments

Comments
 (0)