Skip to content

Commit 3f67118

Browse files
committed
coverage: Make coverage_counters a local variable
This avoids the awkwardness of having to create it in the pass's constructor, and then mutate it later to actually create the counters.
1 parent e1a2bab commit 3f67118

File tree

3 files changed

+37
-31
lines changed

3 files changed

+37
-31
lines changed

compiler/rustc_mir_transform/src/coverage/counters.rs

+15-15
Original file line numberDiff line numberDiff line change
@@ -61,27 +61,27 @@ pub(super) struct CoverageCounters {
6161
}
6262

6363
impl CoverageCounters {
64-
pub(super) fn new(basic_coverage_blocks: &CoverageGraph) -> Self {
64+
/// Makes [`BcbCounter`] `Counter`s and `Expressions` for the `BasicCoverageBlock`s directly or
65+
/// indirectly associated with coverage spans, and accumulates additional `Expression`s
66+
/// representing intermediate values.
67+
pub(super) fn make_bcb_counters(
68+
basic_coverage_blocks: &CoverageGraph,
69+
bcb_has_coverage_spans: impl Fn(BasicCoverageBlock) -> bool,
70+
) -> Self {
6571
let num_bcbs = basic_coverage_blocks.num_nodes();
6672

67-
Self {
73+
let mut this = Self {
6874
next_counter_id: CounterId::START,
6975
bcb_counters: IndexVec::from_elem_n(None, num_bcbs),
7076
bcb_edge_counters: FxIndexMap::default(),
7177
bcb_has_incoming_edge_counters: BitSet::new_empty(num_bcbs),
7278
expressions: IndexVec::new(),
73-
}
74-
}
79+
};
7580

76-
/// Makes [`BcbCounter`] `Counter`s and `Expressions` for the `BasicCoverageBlock`s directly or
77-
/// indirectly associated with coverage spans, and accumulates additional `Expression`s
78-
/// representing intermediate values.
79-
pub fn make_bcb_counters(
80-
&mut self,
81-
basic_coverage_blocks: &CoverageGraph,
82-
bcb_has_coverage_spans: impl Fn(BasicCoverageBlock) -> bool,
83-
) {
84-
MakeBcbCounters::new(self, basic_coverage_blocks).make_bcb_counters(bcb_has_coverage_spans)
81+
MakeBcbCounters::new(&mut this, basic_coverage_blocks)
82+
.make_bcb_counters(bcb_has_coverage_spans);
83+
84+
this
8585
}
8686

8787
fn make_counter(&mut self) -> BcbCounter {
@@ -189,8 +189,8 @@ impl CoverageCounters {
189189
.map(|(&(from_bcb, to_bcb), counter_kind)| (from_bcb, to_bcb, counter_kind))
190190
}
191191

192-
pub(super) fn take_expressions(&mut self) -> IndexVec<ExpressionId, Expression> {
193-
std::mem::take(&mut self.expressions)
192+
pub(super) fn into_expressions(self) -> IndexVec<ExpressionId, Expression> {
193+
self.expressions
194194
}
195195
}
196196

compiler/rustc_mir_transform/src/coverage/mod.rs

+18-14
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ struct Instrumentor<'a, 'tcx> {
7070
mir_body: &'a mut mir::Body<'tcx>,
7171
hir_info: ExtractedHirInfo,
7272
basic_coverage_blocks: CoverageGraph,
73-
coverage_counters: CoverageCounters,
7473
}
7574

7675
impl<'a, 'tcx> Instrumentor<'a, 'tcx> {
@@ -80,9 +79,8 @@ impl<'a, 'tcx> Instrumentor<'a, 'tcx> {
8079
debug!(?hir_info, "instrumenting {:?}", mir_body.source.def_id());
8180

8281
let basic_coverage_blocks = CoverageGraph::from_mir(mir_body);
83-
let coverage_counters = CoverageCounters::new(&basic_coverage_blocks);
8482

85-
Self { tcx, mir_body, hir_info, basic_coverage_blocks, coverage_counters }
83+
Self { tcx, mir_body, hir_info, basic_coverage_blocks }
8684
}
8785

8886
fn inject_counters(&'a mut self) {
@@ -103,16 +101,18 @@ impl<'a, 'tcx> Instrumentor<'a, 'tcx> {
103101
// and all `Expression` dependencies (operands) are also generated, for any other
104102
// `BasicCoverageBlock`s not already associated with a coverage span.
105103
let bcb_has_coverage_spans = |bcb| coverage_spans.bcb_has_coverage_spans(bcb);
106-
self.coverage_counters
107-
.make_bcb_counters(&self.basic_coverage_blocks, bcb_has_coverage_spans);
104+
let coverage_counters = CoverageCounters::make_bcb_counters(
105+
&self.basic_coverage_blocks,
106+
bcb_has_coverage_spans,
107+
);
108108

109-
let mappings = self.create_mappings(&coverage_spans);
110-
self.inject_coverage_statements(bcb_has_coverage_spans);
109+
let mappings = self.create_mappings(&coverage_spans, &coverage_counters);
110+
self.inject_coverage_statements(bcb_has_coverage_spans, &coverage_counters);
111111

112112
self.mir_body.function_coverage_info = Some(Box::new(FunctionCoverageInfo {
113113
function_source_hash: self.hir_info.function_source_hash,
114-
num_counters: self.coverage_counters.num_counters(),
115-
expressions: self.coverage_counters.take_expressions(),
114+
num_counters: coverage_counters.num_counters(),
115+
expressions: coverage_counters.into_expressions(),
116116
mappings,
117117
}));
118118
}
@@ -122,7 +122,11 @@ impl<'a, 'tcx> Instrumentor<'a, 'tcx> {
122122
///
123123
/// Precondition: All BCBs corresponding to those spans have been given
124124
/// coverage counters.
125-
fn create_mappings(&self, coverage_spans: &CoverageSpans) -> Vec<Mapping> {
125+
fn create_mappings(
126+
&self,
127+
coverage_spans: &CoverageSpans,
128+
coverage_counters: &CoverageCounters,
129+
) -> Vec<Mapping> {
126130
let source_map = self.tcx.sess.source_map();
127131
let body_span = self.hir_info.body_span;
128132

@@ -135,8 +139,7 @@ impl<'a, 'tcx> Instrumentor<'a, 'tcx> {
135139
.bcbs_with_coverage_spans()
136140
// For each BCB with spans, get a coverage term for its counter.
137141
.map(|(bcb, spans)| {
138-
let term = self
139-
.coverage_counters
142+
let term = coverage_counters
140143
.bcb_counter(bcb)
141144
.expect("all BCBs with spans were given counters")
142145
.as_term();
@@ -157,9 +160,10 @@ impl<'a, 'tcx> Instrumentor<'a, 'tcx> {
157160
fn inject_coverage_statements(
158161
&mut self,
159162
bcb_has_coverage_spans: impl Fn(BasicCoverageBlock) -> bool,
163+
coverage_counters: &CoverageCounters,
160164
) {
161165
// Process the counters associated with BCB nodes.
162-
for (bcb, counter_kind) in self.coverage_counters.bcb_node_counters() {
166+
for (bcb, counter_kind) in coverage_counters.bcb_node_counters() {
163167
let do_inject = match counter_kind {
164168
// Counter-increment statements always need to be injected.
165169
BcbCounter::Counter { .. } => true,
@@ -178,7 +182,7 @@ impl<'a, 'tcx> Instrumentor<'a, 'tcx> {
178182
}
179183

180184
// Process the counters associated with BCB edges.
181-
for (from_bcb, to_bcb, counter_kind) in self.coverage_counters.bcb_edge_counters() {
185+
for (from_bcb, to_bcb, counter_kind) in coverage_counters.bcb_edge_counters() {
182186
let do_inject = match counter_kind {
183187
// Counter-increment statements always need to be injected.
184188
BcbCounter::Counter { .. } => true,

compiler/rustc_mir_transform/src/coverage/tests.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -630,8 +630,10 @@ fn test_make_bcb_counters() {
630630
// coverage spans for BCBs 1 and 2. Now we skip that step and just tell
631631
// BCB counter construction that those BCBs have spans.
632632
let bcb_has_coverage_spans = |bcb: BasicCoverageBlock| (1..=2).contains(&bcb.as_usize());
633-
let mut coverage_counters = counters::CoverageCounters::new(&basic_coverage_blocks);
634-
coverage_counters.make_bcb_counters(&basic_coverage_blocks, bcb_has_coverage_spans);
633+
let coverage_counters = counters::CoverageCounters::make_bcb_counters(
634+
&basic_coverage_blocks,
635+
bcb_has_coverage_spans,
636+
);
635637
assert_eq!(coverage_counters.num_expressions(), 0);
636638

637639
assert_eq!(

0 commit comments

Comments
 (0)