Auto merge of #83774 - richkadel:zero-based-counters, r=tmandry
Translate counters from Rust 1-based to LLVM 0-based counter ids A colleague contacted me and asked why Rust's counters start at 1, when Clangs appear to start at 0. There is a reason why Rust's internal counters start at 1 (see the docs), and I tried to keep them consistent when codegenned to LLVM's coverage mapping format. LLVM should be tolerant of missing counters, but as my colleague pointed out, `llvm-cov` will silently fail to generate a coverage report for a function based on LLVM's assumption that the counters are 0-based. See: https://github.com/llvm/llvm-project/blob/main/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp#L170 Apparently, if, for example, a function has no branches, it would have exactly 1 counter. `CounterValues.size()` would be 1, and (with the 1-based index), the counter ID would be 1. This would fail the check and abort reporting coverage for the function. It turns out that by correcting for this during coverage map generation, by subtracting 1 from the Rust Counter ID (both when generating the counter increment intrinsic call, and when adding counters to the map), some uncovered functions (including in tests) now appear covered! This corrects the coverage for a few tests! r? `@tmandry` FYI: `@wesleywiser`
This commit is contained in:
commit
836c317426
11 changed files with 212 additions and 96 deletions
|
@ -41,8 +41,16 @@ rustc_index::newtype_index! {
|
|||
}
|
||||
|
||||
impl CounterValueReference {
|
||||
// Counters start at 1 to reserve 0 for ExpressionOperandId::ZERO.
|
||||
/// Counters start at 1 to reserve 0 for ExpressionOperandId::ZERO.
|
||||
pub const START: Self = Self::from_u32(1);
|
||||
|
||||
/// Returns explicitly-requested zero-based version of the counter id, used
|
||||
/// during codegen. LLVM expects zero-based indexes.
|
||||
pub fn zero_based_index(&self) -> u32 {
|
||||
let one_based_index = self.as_u32();
|
||||
debug_assert!(one_based_index > 0);
|
||||
one_based_index - 1
|
||||
}
|
||||
}
|
||||
|
||||
rustc_index::newtype_index! {
|
||||
|
@ -175,3 +183,13 @@ pub enum Op {
|
|||
Subtract,
|
||||
Add,
|
||||
}
|
||||
|
||||
impl Op {
|
||||
pub fn is_add(&self) -> bool {
|
||||
matches!(self, Self::Add)
|
||||
}
|
||||
|
||||
pub fn is_subtract(&self) -> bool {
|
||||
matches!(self, Self::Subtract)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue