Skip to content

Commit

Permalink
coverage. Refactor MCDCInfoBuilder for pattern matching implementatio…
Browse files Browse the repository at this point in the history
…n and change the way to calculate decision depth
  • Loading branch information
ZhuUx committed Jul 15, 2024
1 parent d97f328 commit 6e70bea
Show file tree
Hide file tree
Showing 8 changed files with 784 additions and 144 deletions.
15 changes: 15 additions & 0 deletions compiler/rustc_middle/src/mir/coverage.rs
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,15 @@ rustc_index::newtype_index! {
pub struct ExpressionId {}
}

rustc_index::newtype_index! {
/// ID of a mcdc decision. Used to identify decision in a function.
#[derive(HashStable)]
#[encodable]
#[orderable]
#[debug_format = "DecisionId({})"]
pub struct DecisionId {}
}

rustc_index::newtype_index! {
/// ID of a mcdc condition. Used by llvm to check mcdc coverage.
///
Expand Down Expand Up @@ -345,3 +354,9 @@ pub struct MCDCDecisionSpan {
pub end_markers: Vec<BlockMarkerId>,
pub decision_depth: u16,
}

impl MCDCDecisionSpan {
pub fn new(span: Span) -> Self {
Self { span, num_conditions: 0, end_markers: Vec::new(), decision_depth: 0 }
}
}
11 changes: 8 additions & 3 deletions compiler/rustc_mir_build/src/build/coverageinfo.rs
Original file line number Diff line number Diff line change
Expand Up @@ -144,10 +144,10 @@ impl CoverageInfoBuilder {
// Separate path for handling branches when MC/DC is enabled.
if let Some(mcdc_info) = self.mcdc_info.as_mut() {
let inject_block_marker =
|source_info, block| self.markers.inject_block_marker(cfg, source_info, block);
|block| self.markers.inject_block_marker(cfg, source_info, block);
mcdc_info.visit_evaluated_condition(
tcx,
source_info,
source_info.span,
true_block,
false_block,
inject_block_marker,
Expand Down Expand Up @@ -175,8 +175,13 @@ impl CoverageInfoBuilder {
let branch_spans =
branch_info.map(|branch_info| branch_info.branch_spans).unwrap_or_default();

let (mcdc_decision_spans, mcdc_branch_spans) =
let (mut mcdc_branch_spans, mcdc_spans) =
mcdc_info.map(MCDCInfoBuilder::into_done).unwrap_or_default();
let mut mcdc_decision_spans = Vec::with_capacity(mcdc_spans.len());
for (decision, conditions) in mcdc_spans {
mcdc_branch_spans.extend(conditions);
mcdc_decision_spans.push(decision);
}

// For simplicity, always return an info struct (without Option), even
// if there's nothing interesting in it.
Expand Down
Loading

0 comments on commit 6e70bea

Please sign in to comment.