Skip to content

Commit 19d3827

Browse files
authored
Rollup merge of #122937 - Zalathar:unbox, r=oli-obk
Unbox and unwrap the contents of `StatementKind::Coverage` The payload of coverage statements was historically a structure with several fields, so it was boxed to avoid bloating `StatementKind`. Now that the payload is a single relatively-small enum, we can replace `Box<Coverage>` with just `CoverageKind`. This patch also adds a size assertion for `StatementKind`, to avoid accidentally bloating it in the future. ``@rustbot`` label +A-code-coverage
2 parents 702261d + ab92699 commit 19d3827

File tree

15 files changed

+44
-68
lines changed

15 files changed

+44
-68
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
use rustc_codegen_ssa::traits::CoverageInfoBuilderMethods;
2-
use rustc_middle::mir::Coverage;
2+
use rustc_middle::mir::coverage::CoverageKind;
33
use rustc_middle::ty::Instance;
44

55
use crate::builder::Builder;
66

77
impl<'a, 'gcc, 'tcx> CoverageInfoBuilderMethods<'tcx> for Builder<'a, 'gcc, 'tcx> {
8-
fn add_coverage(&mut self, _instance: Instance<'tcx>, _coverage: &Coverage) {
8+
fn add_coverage(&mut self, _instance: Instance<'tcx>, _kind: &CoverageKind) {
99
// TODO(antoyo)
1010
}
1111
}

compiler/rustc_codegen_llvm/src/coverageinfo/mod.rs

+1-3
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ use rustc_data_structures::fx::{FxHashMap, FxIndexMap};
1414
use rustc_llvm::RustString;
1515
use rustc_middle::bug;
1616
use rustc_middle::mir::coverage::CoverageKind;
17-
use rustc_middle::mir::Coverage;
1817
use rustc_middle::ty::layout::HasTyCtxt;
1918
use rustc_middle::ty::Instance;
2019

@@ -75,7 +74,7 @@ impl<'ll, 'tcx> CodegenCx<'ll, 'tcx> {
7574

7675
impl<'tcx> CoverageInfoBuilderMethods<'tcx> for Builder<'_, '_, 'tcx> {
7776
#[instrument(level = "debug", skip(self))]
78-
fn add_coverage(&mut self, instance: Instance<'tcx>, coverage: &Coverage) {
77+
fn add_coverage(&mut self, instance: Instance<'tcx>, kind: &CoverageKind) {
7978
// Our caller should have already taken care of inlining subtleties,
8079
// so we can assume that counter/expression IDs in this coverage
8180
// statement are meaningful for the given instance.
@@ -98,7 +97,6 @@ impl<'tcx> CoverageInfoBuilderMethods<'tcx> for Builder<'_, '_, 'tcx> {
9897
.entry(instance)
9998
.or_insert_with(|| FunctionCoverageCollector::new(instance, function_coverage_info));
10099

101-
let Coverage { kind } = coverage;
102100
match *kind {
103101
CoverageKind::SpanMarker | CoverageKind::BlockMarker { .. } => unreachable!(
104102
"marker statement {kind:?} should have been removed by CleanupPostBorrowck"
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
use crate::traits::*;
22

3-
use rustc_middle::mir::Coverage;
3+
use rustc_middle::mir::coverage::CoverageKind;
44
use rustc_middle::mir::SourceScope;
55

66
use super::FunctionCx;
77

88
impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
9-
pub fn codegen_coverage(&self, bx: &mut Bx, coverage: &Coverage, scope: SourceScope) {
9+
pub fn codegen_coverage(&self, bx: &mut Bx, kind: &CoverageKind, scope: SourceScope) {
1010
// Determine the instance that coverage data was originally generated for.
1111
let instance = if let Some(inlined) = scope.inlined_instance(&self.mir.source_scopes) {
1212
self.monomorphize(inlined)
@@ -15,6 +15,6 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
1515
};
1616

1717
// Handle the coverage info in a backend-specific way.
18-
bx.add_coverage(instance, coverage);
18+
bx.add_coverage(instance, kind);
1919
}
2020
}

compiler/rustc_codegen_ssa/src/mir/statement.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
6464
cg_indirect_place.storage_dead(bx);
6565
}
6666
}
67-
mir::StatementKind::Coverage(box ref coverage) => {
68-
self.codegen_coverage(bx, coverage, statement.source_info.scope);
67+
mir::StatementKind::Coverage(ref kind) => {
68+
self.codegen_coverage(bx, kind, statement.source_info.scope);
6969
}
7070
mir::StatementKind::Intrinsic(box NonDivergingIntrinsic::Assume(ref op)) => {
7171
if !matches!(bx.tcx().sess.opts.optimize, OptLevel::No | OptLevel::Less) {
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
use super::BackendTypes;
2-
use rustc_middle::mir::Coverage;
2+
use rustc_middle::mir::coverage::CoverageKind;
33
use rustc_middle::ty::Instance;
44

55
pub trait CoverageInfoBuilderMethods<'tcx>: BackendTypes {
66
/// Handle the MIR coverage info in a backend-specific way.
77
///
88
/// This can potentially be a no-op in backends that don't support
99
/// coverage instrumentation.
10-
fn add_coverage(&mut self, instance: Instance<'tcx>, coverage: &Coverage);
10+
fn add_coverage(&mut self, instance: Instance<'tcx>, kind: &CoverageKind);
1111
}

compiler/rustc_const_eval/src/transform/validate.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -346,8 +346,7 @@ impl<'a, 'tcx> Visitor<'tcx> for CfgChecker<'a, 'tcx> {
346346
self.fail(location, format!("explicit `{kind:?}` is forbidden"));
347347
}
348348
}
349-
StatementKind::Coverage(coverage) => {
350-
let kind = &coverage.kind;
349+
StatementKind::Coverage(kind) => {
351350
if self.mir_phase >= MirPhase::Analysis(AnalysisPhase::PostCleanup)
352351
&& let CoverageKind::BlockMarker { .. } | CoverageKind::SpanMarker { .. } = kind
353352
{

compiler/rustc_middle/src/mir/pretty.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use rustc_middle::mir::interpret::{
1313
Provenance,
1414
};
1515
use rustc_middle::mir::visit::Visitor;
16-
use rustc_middle::mir::{self, *};
16+
use rustc_middle::mir::*;
1717
use rustc_target::abi::Size;
1818

1919
const INDENT: &str = " ";
@@ -711,7 +711,7 @@ impl Debug for Statement<'_> {
711711
AscribeUserType(box (ref place, ref c_ty), ref variance) => {
712712
write!(fmt, "AscribeUserType({place:?}, {variance:?}, {c_ty:?})")
713713
}
714-
Coverage(box mir::Coverage { ref kind }) => write!(fmt, "Coverage::{kind:?}"),
714+
Coverage(ref kind) => write!(fmt, "Coverage::{kind:?}"),
715715
Intrinsic(box ref intrinsic) => write!(fmt, "{intrinsic}"),
716716
ConstEvalCounter => write!(fmt, "ConstEvalCounter"),
717717
Nop => write!(fmt, "nop"),

compiler/rustc_middle/src/mir/syntax.rs

+2-7
Original file line numberDiff line numberDiff line change
@@ -373,7 +373,7 @@ pub enum StatementKind<'tcx> {
373373
///
374374
/// Interpreters and codegen backends that don't support coverage instrumentation
375375
/// can usually treat this as a no-op.
376-
Coverage(Box<Coverage>),
376+
Coverage(CoverageKind),
377377

378378
/// Denotes a call to an intrinsic that does not require an unwind path and always returns.
379379
/// This avoids adding a new block and a terminator for simple intrinsics.
@@ -517,12 +517,6 @@ pub enum FakeReadCause {
517517
ForIndex,
518518
}
519519

520-
#[derive(Clone, Debug, PartialEq, TyEncodable, TyDecodable, Hash, HashStable)]
521-
#[derive(TypeFoldable, TypeVisitable)]
522-
pub struct Coverage {
523-
pub kind: CoverageKind,
524-
}
525-
526520
#[derive(Clone, Debug, PartialEq, TyEncodable, TyDecodable, Hash, HashStable)]
527521
#[derive(TypeFoldable, TypeVisitable)]
528522
pub struct CopyNonOverlapping<'tcx> {
@@ -1458,5 +1452,6 @@ mod size_asserts {
14581452
static_assert_size!(Place<'_>, 16);
14591453
static_assert_size!(PlaceElem<'_>, 24);
14601454
static_assert_size!(Rvalue<'_>, 40);
1455+
static_assert_size!(StatementKind<'_>, 16);
14611456
// tidy-alphabetical-end
14621457
}

compiler/rustc_middle/src/mir/visit.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -156,10 +156,10 @@ macro_rules! make_mir_visitor {
156156

157157
fn visit_coverage(
158158
&mut self,
159-
coverage: & $($mutability)? Coverage,
159+
kind: & $($mutability)? coverage::CoverageKind,
160160
location: Location,
161161
) {
162-
self.super_coverage(coverage, location);
162+
self.super_coverage(kind, location);
163163
}
164164

165165
fn visit_retag(
@@ -803,7 +803,7 @@ macro_rules! make_mir_visitor {
803803
}
804804

805805
fn super_coverage(&mut self,
806-
_coverage: & $($mutability)? Coverage,
806+
_kind: & $($mutability)? coverage::CoverageKind,
807807
_location: Location) {
808808
}
809809

compiler/rustc_mir_build/src/build/cfg.rs

+1-3
Original file line numberDiff line numberDiff line change
@@ -107,9 +107,7 @@ impl<'tcx> CFG<'tcx> {
107107
/// This results in more accurate coverage reports for certain kinds of
108108
/// syntax (e.g. `continue` or `if !`) that would otherwise not appear in MIR.
109109
pub(crate) fn push_coverage_span_marker(&mut self, block: BasicBlock, source_info: SourceInfo) {
110-
let kind = StatementKind::Coverage(Box::new(Coverage {
111-
kind: coverage::CoverageKind::SpanMarker,
112-
}));
110+
let kind = StatementKind::Coverage(coverage::CoverageKind::SpanMarker);
113111
let stmt = Statement { source_info, kind };
114112
self.push(block, stmt);
115113
}

compiler/rustc_mir_build/src/build/coverageinfo.rs

+1-3
Original file line numberDiff line numberDiff line change
@@ -127,9 +127,7 @@ impl Builder<'_, '_> {
127127

128128
let marker_statement = mir::Statement {
129129
source_info,
130-
kind: mir::StatementKind::Coverage(Box::new(mir::Coverage {
131-
kind: CoverageKind::BlockMarker { id },
132-
})),
130+
kind: mir::StatementKind::Coverage(CoverageKind::BlockMarker { id }),
133131
};
134132
self.cfg.push(block, marker_statement);
135133

compiler/rustc_mir_transform/src/cleanup_post_borrowck.rs

+4-5
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
1919
use crate::MirPass;
2020
use rustc_middle::mir::coverage::CoverageKind;
21-
use rustc_middle::mir::{Body, BorrowKind, Coverage, Rvalue, StatementKind, TerminatorKind};
21+
use rustc_middle::mir::{Body, BorrowKind, Rvalue, StatementKind, TerminatorKind};
2222
use rustc_middle::ty::TyCtxt;
2323

2424
pub struct CleanupPostBorrowck;
@@ -30,12 +30,11 @@ impl<'tcx> MirPass<'tcx> for CleanupPostBorrowck {
3030
match statement.kind {
3131
StatementKind::AscribeUserType(..)
3232
| StatementKind::Assign(box (_, Rvalue::Ref(_, BorrowKind::Fake, _)))
33-
| StatementKind::Coverage(box Coverage {
33+
| StatementKind::Coverage(
3434
// These kinds of coverage statements are markers inserted during
3535
// MIR building, and are not needed after InstrumentCoverage.
36-
kind: CoverageKind::BlockMarker { .. } | CoverageKind::SpanMarker { .. },
37-
..
38-
})
36+
CoverageKind::BlockMarker { .. } | CoverageKind::SpanMarker { .. },
37+
)
3938
| StatementKind::FakeRead(..) => statement.make_nop(),
4039
_ => (),
4140
}

compiler/rustc_mir_transform/src/coverage/mod.rs

+2-5
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use crate::MirPass;
1515

1616
use rustc_middle::mir::coverage::*;
1717
use rustc_middle::mir::{
18-
self, BasicBlock, BasicBlockData, Coverage, SourceInfo, Statement, StatementKind, Terminator,
18+
self, BasicBlock, BasicBlockData, SourceInfo, Statement, StatementKind, Terminator,
1919
TerminatorKind,
2020
};
2121
use rustc_middle::ty::TyCtxt;
@@ -230,10 +230,7 @@ fn inject_statement(mir_body: &mut mir::Body<'_>, counter_kind: CoverageKind, bb
230230
debug!(" injecting statement {counter_kind:?} for {bb:?}");
231231
let data = &mut mir_body[bb];
232232
let source_info = data.terminator().source_info;
233-
let statement = Statement {
234-
source_info,
235-
kind: StatementKind::Coverage(Box::new(Coverage { kind: counter_kind })),
236-
};
233+
let statement = Statement { source_info, kind: StatementKind::Coverage(counter_kind) };
237234
data.statements.insert(0, statement);
238235
}
239236

compiler/rustc_mir_transform/src/coverage/query.rs

+4-6
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use rustc_data_structures::captures::Captures;
22
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags;
33
use rustc_middle::mir::coverage::{CounterId, CoverageKind};
4-
use rustc_middle::mir::{Body, Coverage, CoverageIdsInfo, Statement, StatementKind};
4+
use rustc_middle::mir::{Body, CoverageIdsInfo, Statement, StatementKind};
55
use rustc_middle::query::TyCtxtAt;
66
use rustc_middle::ty::{self, TyCtxt};
77
use rustc_middle::util::Providers;
@@ -54,7 +54,7 @@ fn coverage_ids_info<'tcx>(
5454
let mir_body = tcx.instance_mir(instance_def);
5555

5656
let max_counter_id = all_coverage_in_mir_body(mir_body)
57-
.filter_map(|coverage| match coverage.kind {
57+
.filter_map(|kind| match *kind {
5858
CoverageKind::CounterIncrement { id } => Some(id),
5959
_ => None,
6060
})
@@ -66,12 +66,10 @@ fn coverage_ids_info<'tcx>(
6666

6767
fn all_coverage_in_mir_body<'a, 'tcx>(
6868
body: &'a Body<'tcx>,
69-
) -> impl Iterator<Item = &'a Coverage> + Captures<'tcx> {
69+
) -> impl Iterator<Item = &'a CoverageKind> + Captures<'tcx> {
7070
body.basic_blocks.iter().flat_map(|bb_data| &bb_data.statements).filter_map(|statement| {
7171
match statement.kind {
72-
StatementKind::Coverage(box ref coverage) if !is_inlined(body, statement) => {
73-
Some(coverage)
74-
}
72+
StatementKind::Coverage(ref kind) if !is_inlined(body, statement) => Some(kind),
7573
_ => None,
7674
}
7775
})

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

+14-20
Original file line numberDiff line numberDiff line change
@@ -187,9 +187,7 @@ fn filtered_statement_span(statement: &Statement<'_>) -> Option<Span> {
187187
// for their parent `BasicBlock`.
188188
StatementKind::StorageLive(_)
189189
| StatementKind::StorageDead(_)
190-
// Ignore `ConstEvalCounter`s
191190
| StatementKind::ConstEvalCounter
192-
// Ignore `Nop`s
193191
| StatementKind::Nop => None,
194192

195193
// FIXME(#78546): MIR InstrumentCoverage - Can the source_info.span for `FakeRead`
@@ -211,30 +209,28 @@ fn filtered_statement_span(statement: &Statement<'_>) -> Option<Span> {
211209
StatementKind::FakeRead(box (FakeReadCause::ForGuardBinding, _)) => None,
212210

213211
// Retain spans from most other statements.
214-
StatementKind::FakeRead(box (_, _)) // Not including `ForGuardBinding`
212+
StatementKind::FakeRead(_)
215213
| StatementKind::Intrinsic(..)
216-
| StatementKind::Coverage(box mir::Coverage {
214+
| StatementKind::Coverage(
217215
// The purpose of `SpanMarker` is to be matched and accepted here.
218-
kind: CoverageKind::SpanMarker
219-
})
216+
CoverageKind::SpanMarker,
217+
)
220218
| StatementKind::Assign(_)
221219
| StatementKind::SetDiscriminant { .. }
222220
| StatementKind::Deinit(..)
223221
| StatementKind::Retag(_, _)
224222
| StatementKind::PlaceMention(..)
225-
| StatementKind::AscribeUserType(_, _) => {
226-
Some(statement.source_info.span)
227-
}
223+
| StatementKind::AscribeUserType(_, _) => Some(statement.source_info.span),
228224

229-
StatementKind::Coverage(box mir::Coverage {
230-
// Block markers are used for branch coverage, so ignore them here.
231-
kind: CoverageKind::BlockMarker {..}
232-
}) => None,
225+
// Block markers are used for branch coverage, so ignore them here.
226+
StatementKind::Coverage(CoverageKind::BlockMarker { .. }) => None,
233227

234-
StatementKind::Coverage(box mir::Coverage {
235-
// These coverage statements should not exist prior to coverage instrumentation.
236-
kind: CoverageKind::CounterIncrement { .. } | CoverageKind::ExpressionUsed { .. }
237-
}) => bug!("Unexpected coverage statement found during coverage instrumentation: {statement:?}"),
228+
// These coverage statements should not exist prior to coverage instrumentation.
229+
StatementKind::Coverage(
230+
CoverageKind::CounterIncrement { .. } | CoverageKind::ExpressionUsed { .. },
231+
) => bug!(
232+
"Unexpected coverage statement found during coverage instrumentation: {statement:?}"
233+
),
238234
}
239235
}
240236

@@ -382,9 +378,7 @@ pub(super) fn extract_branch_mappings(
382378
// Fill out the mapping from block marker IDs to their enclosing blocks.
383379
for (bb, data) in mir_body.basic_blocks.iter_enumerated() {
384380
for statement in &data.statements {
385-
if let StatementKind::Coverage(coverage) = &statement.kind
386-
&& let CoverageKind::BlockMarker { id } = coverage.kind
387-
{
381+
if let StatementKind::Coverage(CoverageKind::BlockMarker { id }) = statement.kind {
388382
block_markers[id] = Some(bb);
389383
}
390384
}

0 commit comments

Comments
 (0)