Skip to content

Commit e9ab598

Browse files
committed
coverage: Add CoverageKind::BlockMarker
1 parent ffceb71 commit e9ab598

File tree

5 files changed

+23
-3
lines changed

5 files changed

+23
-3
lines changed

compiler/rustc_codegen_llvm/src/coverageinfo/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ impl<'tcx> CoverageInfoBuilderMethods<'tcx> for Builder<'_, '_, 'tcx> {
8888
match coverage.kind {
8989
// Marker statements have no effect during codegen,
9090
// so return early and don't create `func_coverage`.
91-
CoverageKind::SpanMarker => return,
91+
CoverageKind::SpanMarker | CoverageKind::BlockMarker { .. } => return,
9292
// Match exhaustively to ensure that newly-added kinds are classified correctly.
9393
CoverageKind::CounterIncrement { .. } | CoverageKind::ExpressionUsed { .. } => {}
9494
}
@@ -108,7 +108,7 @@ impl<'tcx> CoverageInfoBuilderMethods<'tcx> for Builder<'_, '_, 'tcx> {
108108

109109
let Coverage { kind } = coverage;
110110
match *kind {
111-
CoverageKind::SpanMarker => unreachable!(
111+
CoverageKind::SpanMarker | CoverageKind::BlockMarker { .. } => unreachable!(
112112
"unexpected marker statement {kind:?} should have caused an early return"
113113
),
114114
CoverageKind::CounterIncrement { id } => {

compiler/rustc_middle/src/mir/coverage.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,12 @@ pub enum CoverageKind {
8383
/// codegen.
8484
SpanMarker,
8585

86+
/// Marks its enclosing basic block with an ID that can be referred to by
87+
/// other data in the MIR body.
88+
///
89+
/// Has no effect during codegen.
90+
BlockMarker { id: BlockMarkerId },
91+
8692
/// Marks the point in MIR control flow represented by a coverage counter.
8793
///
8894
/// This is eventually lowered to `llvm.instrprof.increment` in LLVM IR.
@@ -107,6 +113,7 @@ impl Debug for CoverageKind {
107113
use CoverageKind::*;
108114
match self {
109115
SpanMarker => write!(fmt, "SpanMarker"),
116+
BlockMarker { id } => write!(fmt, "BlockMarker({:?})", id.index()),
110117
CounterIncrement { id } => write!(fmt, "CounterIncrement({:?})", id.index()),
111118
ExpressionUsed { id } => write!(fmt, "ExpressionUsed({:?})", id.index()),
112119
}
@@ -202,3 +209,10 @@ pub struct FunctionCoverageInfo {
202209
pub expressions: IndexVec<ExpressionId, Expression>,
203210
pub mappings: Vec<Mapping>,
204211
}
212+
213+
rustc_index::newtype_index! {
214+
#[derive(HashStable)]
215+
#[encodable]
216+
#[debug_format = "BlockMarkerId({})"]
217+
pub struct BlockMarkerId {}
218+
}

compiler/rustc_middle/src/ty/structural_impls.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,7 @@ TrivialTypeTraversalImpls! {
405405
::rustc_hir::HirId,
406406
::rustc_hir::MatchSource,
407407
::rustc_target::asm::InlineAsmRegOrRegClass,
408+
crate::mir::coverage::BlockMarkerId,
408409
crate::mir::coverage::CounterId,
409410
crate::mir::coverage::ExpressionId,
410411
crate::mir::Local,

compiler/rustc_mir_transform/src/coverage/query.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
use rustc_data_structures::captures::Captures;
2+
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags;
23
use rustc_middle::mir::coverage::{CounterId, CoverageKind};
34
use rustc_middle::mir::{Body, Coverage, CoverageIdsInfo, Statement, StatementKind};
45
use rustc_middle::query::TyCtxtAt;
56
use rustc_middle::ty::{self, TyCtxt};
67
use rustc_middle::util::Providers;
78
use rustc_span::def_id::LocalDefId;
8-
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags;
99

1010
/// Registers query/hook implementations related to coverage.
1111
pub(crate) fn provide(providers: &mut Providers) {

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,11 @@ fn filtered_statement_span(statement: &Statement<'_>) -> Option<Span> {
225225
Some(statement.source_info.span)
226226
}
227227

228+
StatementKind::Coverage(box mir::Coverage {
229+
// Block markers are used for branch coverage, so ignore them here.
230+
kind: CoverageKind::BlockMarker {..}
231+
}) => None,
232+
228233
StatementKind::Coverage(box mir::Coverage {
229234
// These coverage statements should not exist prior to coverage instrumentation.
230235
kind: CoverageKind::CounterIncrement { .. } | CoverageKind::ExpressionUsed { .. }

0 commit comments

Comments
 (0)