Skip to content

Commit 1135cd3

Browse files
zhuyunxingZalathar
zhuyunxing
authored andcommitted
Add MC/DC support to coverage test tools
1 parent 7a495cc commit 1135cd3

File tree

2 files changed

+57
-2
lines changed

2 files changed

+57
-2
lines changed

src/tools/compiletest/src/runtest.rs

+13
Original file line numberDiff line numberDiff line change
@@ -752,6 +752,19 @@ impl<'test> TestCx<'test> {
752752
Lazy::new(|| Regex::new(r"(?m:^)(?<prefix>(?: \|)+ Branch \()[0-9]+:").unwrap());
753753
let coverage = BRANCH_LINE_NUMBER_RE.replace_all(&coverage, "${prefix}LL:");
754754

755+
// ` |---> MC/DC Decision Region (1:30) to (2:` => ` |---> MC/DC Decision Region (LL:30) to (LL:`
756+
static MCDC_DECISION_LINE_NUMBER_RE: Lazy<Regex> = Lazy::new(|| {
757+
Regex::new(r"(?m:^)(?<prefix>(?: \|)+---> MC/DC Decision Region \()[0-9]+:(?<middle>[0-9]+\) to \()[0-9]+:").unwrap()
758+
});
759+
let coverage =
760+
MCDC_DECISION_LINE_NUMBER_RE.replace_all(&coverage, "${prefix}LL:${middle}LL:");
761+
762+
// ` | Condition C1 --> (1:` => ` | Condition C1 --> (LL:`
763+
static MCDC_CONDITION_LINE_NUMBER_RE: Lazy<Regex> = Lazy::new(|| {
764+
Regex::new(r"(?m:^)(?<prefix>(?: \|)+ Condition C[0-9]+ --> \()[0-9]+:").unwrap()
765+
});
766+
let coverage = MCDC_CONDITION_LINE_NUMBER_RE.replace_all(&coverage, "${prefix}LL:");
767+
755768
coverage.into_owned()
756769
}
757770

src/tools/coverage-dump/src/covfun.rs

+44-2
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,8 @@ pub(crate) fn dump_covfun_mappings(
7070
}
7171
// If the mapping is a branch region, print both of its arms
7272
// in resolved form (even if they aren't expressions).
73-
MappingKind::Branch { r#true, r#false } => {
73+
MappingKind::Branch { r#true, r#false }
74+
| MappingKind::MCDCBranch { r#true, r#false, .. } => {
7475
println!(" true = {}", expression_resolver.format_term(r#true));
7576
println!(" false = {}", expression_resolver.format_term(r#false));
7677
}
@@ -164,6 +165,26 @@ impl<'a> Parser<'a> {
164165
let r#false = self.read_simple_term()?;
165166
Ok(MappingKind::Branch { r#true, r#false })
166167
}
168+
5 => {
169+
let bitmap_idx = self.read_uleb128_u32()?;
170+
let conditions_num = self.read_uleb128_u32()?;
171+
Ok(MappingKind::MCDCDecision { bitmap_idx, conditions_num })
172+
}
173+
6 => {
174+
let r#true = self.read_simple_term()?;
175+
let r#false = self.read_simple_term()?;
176+
let condition_id = self.read_uleb128_u32()?;
177+
let true_next_id = self.read_uleb128_u32()?;
178+
let false_next_id = self.read_uleb128_u32()?;
179+
Ok(MappingKind::MCDCBranch {
180+
r#true,
181+
r#false,
182+
condition_id,
183+
true_next_id,
184+
false_next_id,
185+
})
186+
}
187+
167188
_ => Err(anyhow!("unknown mapping kind: {raw_mapping_kind:#x}")),
168189
}
169190
}
@@ -224,7 +245,28 @@ enum MappingKind {
224245
// Using raw identifiers here makes the dump output a little bit nicer
225246
// (via the derived Debug), at the expense of making this tool's source
226247
// code a little bit uglier.
227-
Branch { r#true: CovTerm, r#false: CovTerm },
248+
Branch {
249+
r#true: CovTerm,
250+
r#false: CovTerm,
251+
},
252+
MCDCBranch {
253+
r#true: CovTerm,
254+
r#false: CovTerm,
255+
// These attributes are printed in Debug but not used directly.
256+
#[allow(dead_code)]
257+
condition_id: u32,
258+
#[allow(dead_code)]
259+
true_next_id: u32,
260+
#[allow(dead_code)]
261+
false_next_id: u32,
262+
},
263+
MCDCDecision {
264+
// These attributes are printed in Debug but not used directly.
265+
#[allow(dead_code)]
266+
bitmap_idx: u32,
267+
#[allow(dead_code)]
268+
conditions_num: u32,
269+
},
228270
}
229271

230272
struct MappingRegion {

0 commit comments

Comments
 (0)