Skip to content

Commit 2a0290a

Browse files
committedDec 20, 2023
coverage: Pass around &ExtractedHirInfo instead of individual fields
This reduces the risk of mixing up `fn_source_span` and `body_span`, and makes it easier to pass along additional fields as needed.
1 parent 4ae7920 commit 2a0290a

File tree

3 files changed

+16
-29
lines changed

3 files changed

+16
-29
lines changed
 

‎compiler/rustc_mir_transform/src/coverage/mod.rs

+6-18
Original file line numberDiff line numberDiff line change
@@ -68,41 +68,29 @@ impl<'tcx> MirPass<'tcx> for InstrumentCoverage {
6868
struct Instrumentor<'a, 'tcx> {
6969
tcx: TyCtxt<'tcx>,
7070
mir_body: &'a mut mir::Body<'tcx>,
71-
fn_sig_span: Span,
72-
body_span: Span,
73-
function_source_hash: u64,
71+
hir_info: ExtractedHirInfo,
7472
basic_coverage_blocks: CoverageGraph,
7573
coverage_counters: CoverageCounters,
7674
}
7775

7876
impl<'a, 'tcx> Instrumentor<'a, 'tcx> {
7977
fn new(tcx: TyCtxt<'tcx>, mir_body: &'a mut mir::Body<'tcx>) -> Self {
80-
let hir_info @ ExtractedHirInfo { function_source_hash, fn_sig_span, body_span } =
81-
extract_hir_info(tcx, mir_body.source.def_id().expect_local());
78+
let hir_info = extract_hir_info(tcx, mir_body.source.def_id().expect_local());
8279

8380
debug!(?hir_info, "instrumenting {:?}", mir_body.source.def_id());
8481

8582
let basic_coverage_blocks = CoverageGraph::from_mir(mir_body);
8683
let coverage_counters = CoverageCounters::new(&basic_coverage_blocks);
8784

88-
Self {
89-
tcx,
90-
mir_body,
91-
fn_sig_span,
92-
body_span,
93-
function_source_hash,
94-
basic_coverage_blocks,
95-
coverage_counters,
96-
}
85+
Self { tcx, mir_body, hir_info, basic_coverage_blocks, coverage_counters }
9786
}
9887

9988
fn inject_counters(&'a mut self) {
10089
////////////////////////////////////////////////////
10190
// Compute coverage spans from the `CoverageGraph`.
10291
let Some(coverage_spans) = CoverageSpans::generate_coverage_spans(
10392
self.mir_body,
104-
self.fn_sig_span,
105-
self.body_span,
93+
&self.hir_info,
10694
&self.basic_coverage_blocks,
10795
) else {
10896
// No relevant spans were found in MIR, so skip instrumenting this function.
@@ -121,7 +109,7 @@ impl<'a, 'tcx> Instrumentor<'a, 'tcx> {
121109
let mappings = self.create_mappings_and_inject_coverage_statements(&coverage_spans);
122110

123111
self.mir_body.function_coverage_info = Some(Box::new(FunctionCoverageInfo {
124-
function_source_hash: self.function_source_hash,
112+
function_source_hash: self.hir_info.function_source_hash,
125113
num_counters: self.coverage_counters.num_counters(),
126114
expressions: self.coverage_counters.take_expressions(),
127115
mappings,
@@ -136,7 +124,7 @@ impl<'a, 'tcx> Instrumentor<'a, 'tcx> {
136124
coverage_spans: &CoverageSpans,
137125
) -> Vec<Mapping> {
138126
let source_map = self.tcx.sess.source_map();
139-
let body_span = self.body_span;
127+
let body_span = self.hir_info.body_span;
140128

141129
let source_file = source_map.lookup_source_file(body_span.lo());
142130
use rustc_session::RemapFileNameExt;

‎compiler/rustc_mir_transform/src/coverage/spans.rs

+6-9
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use rustc_middle::mir;
66
use rustc_span::{BytePos, ExpnKind, MacroKind, Span, Symbol, DUMMY_SP};
77

88
use super::graph::{BasicCoverageBlock, CoverageGraph, START_BCB};
9+
use crate::coverage::ExtractedHirInfo;
910

1011
mod from_mir;
1112

@@ -21,14 +22,12 @@ impl CoverageSpans {
2122
/// Returns `None` if no coverage-relevant spans could be extracted.
2223
pub(super) fn generate_coverage_spans(
2324
mir_body: &mir::Body<'_>,
24-
fn_sig_span: Span,
25-
body_span: Span,
25+
hir_info: &ExtractedHirInfo,
2626
basic_coverage_blocks: &CoverageGraph,
2727
) -> Option<Self> {
2828
let coverage_spans = CoverageSpansGenerator::generate_coverage_spans(
2929
mir_body,
30-
fn_sig_span,
31-
body_span,
30+
hir_info,
3231
basic_coverage_blocks,
3332
);
3433

@@ -230,19 +229,17 @@ impl<'a> CoverageSpansGenerator<'a> {
230229
/// to be).
231230
pub(super) fn generate_coverage_spans(
232231
mir_body: &mir::Body<'_>,
233-
fn_sig_span: Span, // Ensured to be same SourceFile and SyntaxContext as `body_span`
234-
body_span: Span,
232+
hir_info: &ExtractedHirInfo,
235233
basic_coverage_blocks: &'a CoverageGraph,
236234
) -> Vec<CoverageSpan> {
237235
let sorted_spans = from_mir::mir_to_initial_sorted_coverage_spans(
238236
mir_body,
239-
fn_sig_span,
240-
body_span,
237+
hir_info,
241238
basic_coverage_blocks,
242239
);
243240

244241
let coverage_spans = Self {
245-
body_span,
242+
body_span: hir_info.body_span,
246243
basic_coverage_blocks,
247244
sorted_spans_iter: sorted_spans.into_iter(),
248245
some_curr: None,

‎compiler/rustc_mir_transform/src/coverage/spans/from_mir.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,15 @@ use rustc_span::Span;
77

88
use crate::coverage::graph::{BasicCoverageBlock, BasicCoverageBlockData, CoverageGraph};
99
use crate::coverage::spans::CoverageSpan;
10+
use crate::coverage::ExtractedHirInfo;
1011

1112
pub(super) fn mir_to_initial_sorted_coverage_spans(
1213
mir_body: &mir::Body<'_>,
13-
fn_sig_span: Span,
14-
body_span: Span,
14+
hir_info: &ExtractedHirInfo,
1515
basic_coverage_blocks: &CoverageGraph,
1616
) -> Vec<CoverageSpan> {
17+
let &ExtractedHirInfo { fn_sig_span, body_span, .. } = hir_info;
18+
1719
let mut initial_spans = Vec::with_capacity(mir_body.basic_blocks.len() * 2);
1820
for (bcb, bcb_data) in basic_coverage_blocks.iter_enumerated() {
1921
initial_spans.extend(bcb_to_initial_coverage_spans(mir_body, body_span, bcb, bcb_data));

0 commit comments

Comments
 (0)