Skip to content

Commit 27dbb3c

Browse files
committed
!! (WIP) Only CoverageKind::Mappings can have code regions
1 parent ab4838c commit 27dbb3c

File tree

9 files changed

+35
-60
lines changed

9 files changed

+35
-60
lines changed

compiler/rustc_codegen_llvm/src/coverageinfo/map_data.rs

+6-17
Original file line numberDiff line numberDiff line change
@@ -71,28 +71,20 @@ impl<'tcx> FunctionCoverage<'tcx> {
7171
}
7272
}
7373

74-
/// Adds code regions to be counted by an injected counter intrinsic.
74+
/// Notes that a counter increment has been encountered with the given ID.
7575
#[instrument(level = "debug", skip(self))]
76-
pub(crate) fn add_counter(&mut self, id: CounterId, code_regions: &[CodeRegion]) {
77-
if self.counters_seen.insert(id) {
78-
self.add_mappings(CovTerm::Counter(id), code_regions);
79-
}
76+
pub(crate) fn counter_seen(&mut self, id: CounterId) {
77+
self.counters_seen.insert(id);
8078
}
8179

82-
/// Adds information about a coverage expression, along with zero or more
83-
/// code regions mapped to that expression.
84-
///
85-
/// Both counters and "counter expressions" (or simply, "expressions") can be operands in other
86-
/// expressions. These are tracked as separate variants of `CovTerm`, so there is no ambiguity
87-
/// between operands that are counter IDs and operands that are expression IDs.
80+
/// Adds information about a coverage expression.
8881
#[instrument(level = "debug", skip(self))]
89-
pub(crate) fn add_counter_expression(
82+
pub(crate) fn add_expression_data(
9083
&mut self,
9184
expression_id: ExpressionId,
9285
lhs: CovTerm,
9386
op: Op,
9487
rhs: CovTerm,
95-
code_regions: &[CodeRegion],
9688
) {
9789
debug_assert!(
9890
expression_id.as_usize() < self.expressions.len(),
@@ -106,10 +98,7 @@ impl<'tcx> FunctionCoverage<'tcx> {
10698
let expression = Expression { lhs, op, rhs };
10799
let slot = &mut self.expressions[expression_id];
108100
match slot {
109-
None => {
110-
*slot = Some(expression);
111-
self.add_mappings(CovTerm::Expression(expression_id), code_regions);
112-
}
101+
None => *slot = Some(expression),
113102
// If this expression ID slot has already been filled, it should
114103
// contain identical information.
115104
Some(ref previous_expression) => assert_eq!(

compiler/rustc_codegen_llvm/src/coverageinfo/mod.rs

+4-7
Original file line numberDiff line numberDiff line change
@@ -110,15 +110,15 @@ impl<'tcx> CoverageInfoBuilderMethods<'tcx> for Builder<'_, '_, 'tcx> {
110110
.entry(instance)
111111
.or_insert_with(|| FunctionCoverage::new(bx.tcx(), instance));
112112

113-
let Coverage { kind, code_regions } = coverage;
113+
let Coverage { kind } = coverage;
114114
match *kind {
115115
CoverageKind::Counter { function_source_hash, id } => {
116116
debug!(
117117
"ensuring function source hash is set for instance={:?}; function_source_hash={}",
118118
instance, function_source_hash,
119119
);
120120
func_coverage.set_function_source_hash(function_source_hash);
121-
func_coverage.add_counter(id, code_regions);
121+
func_coverage.counter_seen(id);
122122
// We need to explicitly drop the `RefMut` before calling into `instrprof_increment`,
123123
// as that needs an exclusive borrow.
124124
drop(coverage_map);
@@ -136,12 +136,9 @@ impl<'tcx> CoverageInfoBuilderMethods<'tcx> for Builder<'_, '_, 'tcx> {
136136
bx.instrprof_increment(fn_name, hash, num_counters, index);
137137
}
138138
CoverageKind::Expression { id, lhs, op, rhs } => {
139-
func_coverage.add_counter_expression(id, lhs, op, rhs, code_regions);
139+
func_coverage.add_expression_data(id, lhs, op, rhs);
140140
}
141-
CoverageKind::Unreachable => {
142-
func_coverage.add_unreachable_regions(code_regions);
143-
}
144-
CoverageKind::Mappings { term } => {
141+
CoverageKind::Mappings { term, ref code_regions } => {
145142
func_coverage.add_mappings(term, code_regions);
146143
}
147144
}

compiler/rustc_middle/src/mir/coverage.rs

+6-3
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,9 @@ pub enum CoverageKind {
7676
op: Op,
7777
rhs: CovTerm,
7878
},
79-
Unreachable,
8079
Mappings {
8180
term: CovTerm,
81+
code_regions: Vec<CodeRegion>,
8282
},
8383
}
8484

@@ -98,8 +98,11 @@ impl Debug for CoverageKind {
9898
},
9999
rhs,
100100
),
101-
Unreachable => write!(fmt, "Unreachable"),
102-
Mappings { term } => fmt.debug_struct("Mappings").field("term", term).finish(),
101+
Mappings { term, code_regions } => fmt
102+
.debug_struct("Mappings")
103+
.field("term", term)
104+
.field("code_regions", code_regions)
105+
.finish(),
103106
}
104107
}
105108
}

compiler/rustc_middle/src/mir/mod.rs

+2-6
Original file line numberDiff line numberDiff line change
@@ -1473,12 +1473,8 @@ impl Debug for Statement<'_> {
14731473
AscribeUserType(box (ref place, ref c_ty), ref variance) => {
14741474
write!(fmt, "AscribeUserType({place:?}, {variance:?}, {c_ty:?})")
14751475
}
1476-
Coverage(box self::Coverage { ref kind, ref code_regions }) => {
1477-
if code_regions.is_empty() {
1478-
write!(fmt, "Coverage::{kind:?}")
1479-
} else {
1480-
write!(fmt, "Coverage::{kind:?} for {code_regions:?}")
1481-
}
1476+
Coverage(box self::Coverage { ref kind }) => {
1477+
write!(fmt, "Coverage::{kind:?}")
14821478
}
14831479
Intrinsic(box ref intrinsic) => write!(fmt, "{intrinsic}"),
14841480
ConstEvalCounter => write!(fmt, "ConstEvalCounter"),

compiler/rustc_middle/src/mir/syntax.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
66
use super::{BasicBlock, Constant, Local, SwitchTargets, UserTypeProjection};
77

8-
use crate::mir::coverage::{CodeRegion, CoverageKind};
8+
use crate::mir::coverage::CoverageKind;
99
use crate::traits::Reveal;
1010
use crate::ty::adjustment::PointerCoercion;
1111
use crate::ty::GenericArgsRef;
@@ -523,7 +523,6 @@ pub enum FakeReadCause {
523523
#[derive(TypeFoldable, TypeVisitable)]
524524
pub struct Coverage {
525525
pub kind: CoverageKind,
526-
pub code_regions: Vec<CodeRegion>,
527526
}
528527

529528
#[derive(Clone, Debug, PartialEq, TyEncodable, TyDecodable, Hash, HashStable)]

compiler/rustc_mir_transform/src/coverage/mod.rs

+5-16
Original file line numberDiff line numberDiff line change
@@ -316,15 +316,13 @@ impl<'a, 'tcx> Instrumentor<'a, 'tcx> {
316316

317317
inject_statement(
318318
self.mir_body,
319-
CoverageKind::Mappings { term: counter_kind.as_term() },
319+
CoverageKind::Mappings { term: counter_kind.as_term(), code_regions },
320320
mir::START_BLOCK,
321-
code_regions,
322321
);
323322
inject_statement(
324323
self.mir_body,
325324
self.make_mir_coverage_kind(&counter_kind),
326325
self.bcb_leader_bb(bcb),
327-
Vec::new(),
328326
);
329327
}
330328
}
@@ -407,7 +405,6 @@ impl<'a, 'tcx> Instrumentor<'a, 'tcx> {
407405
self.mir_body,
408406
self.make_mir_coverage_kind(&counter_kind),
409407
inject_to_bb,
410-
Vec::new(),
411408
);
412409
}
413410
BcbCounter::Expression { .. } => inject_intermediate_expression(
@@ -473,18 +470,13 @@ fn inject_edge_counter_basic_block(
473470
new_bb
474471
}
475472

476-
fn inject_statement(
477-
mir_body: &mut mir::Body<'_>,
478-
counter_kind: CoverageKind,
479-
bb: BasicBlock,
480-
code_regions: Vec<CodeRegion>,
481-
) {
482-
debug!(" injecting statement {counter_kind:?} for {bb:?} at code regions: {code_regions:?}");
473+
fn inject_statement(mir_body: &mut mir::Body<'_>, counter_kind: CoverageKind, bb: BasicBlock) {
474+
debug!(" injecting statement {counter_kind:?} for {bb:?}");
483475
let data = &mut mir_body[bb];
484476
let source_info = data.terminator().source_info;
485477
let statement = Statement {
486478
source_info,
487-
kind: StatementKind::Coverage(Box::new(Coverage { kind: counter_kind, code_regions })),
479+
kind: StatementKind::Coverage(Box::new(Coverage { kind: counter_kind })),
488480
};
489481
data.statements.insert(0, statement);
490482
}
@@ -498,10 +490,7 @@ fn inject_intermediate_expression(mir_body: &mut mir::Body<'_>, expression: Cove
498490
let source_info = data.terminator().source_info;
499491
let statement = Statement {
500492
source_info,
501-
kind: StatementKind::Coverage(Box::new(Coverage {
502-
kind: expression,
503-
code_regions: Vec::new(),
504-
})),
493+
kind: StatementKind::Coverage(Box::new(Coverage { kind: expression })),
505494
};
506495
data.statements.push(statement);
507496
}

compiler/rustc_mir_transform/src/coverage/query.rs

+6-4
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,7 @@ impl CoverageVisitor {
6868
self.update_from_term(lhs);
6969
self.update_from_term(rhs);
7070
}
71-
CoverageKind::Unreachable => {}
72-
CoverageKind::Mappings { term } => self.update_from_term(term),
71+
CoverageKind::Mappings { term, .. } => self.update_from_term(term),
7372
}
7473
}
7574
}
@@ -94,8 +93,11 @@ fn coverageinfo<'tcx>(tcx: TyCtxt<'tcx>, instance_def: ty::InstanceDef<'tcx>) ->
9493
fn covered_code_regions(tcx: TyCtxt<'_>, def_id: DefId) -> Vec<&CodeRegion> {
9594
let body = mir_body(tcx, def_id);
9695
all_coverage_in_mir_body(body)
97-
// Coverage statements have a list of code regions (possibly empty).
98-
.flat_map(|coverage| coverage.code_regions.as_slice())
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+
})
99101
.collect()
100102
}
101103

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

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

77
bb0: {
88
+ Coverage::Counter(0);
9-
+ Coverage::Mappings { term: Counter(0) } for [/the/src/instrument_coverage.rs:20:1 - 22:2];
9+
+ Coverage::Mappings { term: Counter(0), code_regions: [/the/src/instrument_coverage.rs:20:1 - 22:2] };
1010
_0 = const true;
1111
return;
1212
}

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

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

1010
bb0: {
11-
+ Coverage::Mappings { term: Counter(1) } for [/the/src/instrument_coverage.rs:15:10 - 15:11];
12-
+ Coverage::Mappings { term: Expression(1) } for [/the/src/instrument_coverage.rs:14:13 - 14:18, /the/src/instrument_coverage.rs:17:1 - 17:2];
13-
+ Coverage::Mappings { term: Expression(0) } for [/the/src/instrument_coverage.rs:12:5 - 13:17];
11+
+ Coverage::Mappings { term: Counter(1), code_regions: [/the/src/instrument_coverage.rs:15:10 - 15:11] };
12+
+ Coverage::Mappings { term: 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 { term: Expression(0), code_regions: [/the/src/instrument_coverage.rs:12:5 - 13:17] };
1414
+ Coverage::Counter(0);
15-
+ Coverage::Mappings { term: Counter(0) } for [/the/src/instrument_coverage.rs:11:1 - 11:11];
15+
+ Coverage::Mappings { term: Counter(0), code_regions: [/the/src/instrument_coverage.rs:11:1 - 11:11] };
1616
goto -> bb1;
1717
}
1818

0 commit comments

Comments
 (0)