Skip to content

Commit

Permalink
summary decision coverage
Browse files Browse the repository at this point in the history
  • Loading branch information
whentojump committed Apr 4, 2024
1 parent 2270e77 commit 5b6538d
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 10 deletions.
30 changes: 30 additions & 0 deletions llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h
Original file line number Diff line number Diff line change
Expand Up @@ -532,6 +532,36 @@ struct MCDCRecord {
return OS.str();
}

size_t getDecisionCovered() {
unsigned NumTestVectors = getNumTestVectors();
if (!NumTestVectors)
return 0;
bool TrueBranchTaken = false;
bool FalseBranchTaken = false;
for (unsigned i = 0; i < NumTestVectors; i++) {
switch (getTVResult(i)) {
case MCDC_True:
TrueBranchTaken = true;
break;
case MCDC_False:
FalseBranchTaken = true;
break;
case MCDC_DontCare:
llvm_unreachable("Test vector result should be either true or false.");
}
}
if (TrueBranchTaken)
if (FalseBranchTaken)
return 2;
else
return 1;
else
if (FalseBranchTaken)
return 1;
else
return 0;
}

float getDecisionPercentCovered() {
unsigned NumTestVectors = getNumTestVectors();
if (!NumTestVectors)
Expand Down
20 changes: 13 additions & 7 deletions llvm/tools/llvm-cov/CoverageSummaryInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,15 @@ static void sumBranchExpansions(size_t &NumBranches, size_t &CoveredBranches,
}
}

static std::pair<size_t, size_t>
sumMCDCPairs(const ArrayRef<MCDCRecord> &Records) {
size_t NumPairs = 0, CoveredPairs = 0;
for (const auto &Record : Records) {
void
sumMCDCPairs(const ArrayRef<MCDCRecord> &Records,
size_t &NumPairs, size_t &CoveredPairs,
size_t &NumDecisions, size_t &CoveredDecisions) {
for (auto Record : Records) {

NumDecisions += 2;
CoveredDecisions += Record.getDecisionCovered();

const auto NumConditions = Record.getNumConditions();
for (unsigned C = 0; C < NumConditions; C++) {
if (!Record.isCondFolded(C))
Expand All @@ -56,7 +61,6 @@ sumMCDCPairs(const ArrayRef<MCDCRecord> &Records) {
++CoveredPairs;
}
}
return {NumPairs, CoveredPairs};
}

FunctionCoverageSummary
Expand Down Expand Up @@ -89,14 +93,16 @@ FunctionCoverageSummary::get(const CoverageMapping &CM,
sumBranchExpansions(NumBranches, CoveredBranches, CM, CD.getExpansions());

size_t NumPairs = 0, CoveredPairs = 0;
std::tie(NumPairs, CoveredPairs) = sumMCDCPairs(CD.getMCDCRecords());
size_t NumDecisions = 0, CoveredDecisions = 0;
sumMCDCPairs(CD.getMCDCRecords(),
NumPairs, CoveredPairs, NumDecisions, CoveredDecisions);

return FunctionCoverageSummary(
Function.Name, Function.ExecutionCount,
RegionCoverageInfo(CoveredRegions, NumCodeRegions),
LineCoverageInfo(CoveredLines, NumLines),
BranchCoverageInfo(CoveredBranches, NumBranches),
MCDCCoverageInfo(CoveredPairs, NumPairs));
MCDCCoverageInfo(CoveredPairs, NumPairs, CoveredDecisions, NumDecisions));
}

FunctionCoverageSummary
Expand Down
27 changes: 24 additions & 3 deletions llvm/tools/llvm-cov/CoverageSummaryInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -150,37 +150,58 @@ class MCDCCoverageInfo {
/// The total number of Independence Pairs in a function/file.
size_t NumPairs;

size_t CoveredDecisions;
size_t NumDecisions;

public:
MCDCCoverageInfo() : CoveredPairs(0), NumPairs(0) {}
MCDCCoverageInfo() : CoveredPairs(0), NumPairs(0), CoveredDecisions(0), NumDecisions(0) {}

MCDCCoverageInfo(size_t CoveredPairs, size_t NumPairs)
: CoveredPairs(CoveredPairs), NumPairs(NumPairs) {
MCDCCoverageInfo(size_t CoveredPairs, size_t NumPairs, size_t CoveredDecisions, size_t NumDecisions)
: CoveredPairs(CoveredPairs), NumPairs(NumPairs), CoveredDecisions(CoveredDecisions), NumDecisions(NumDecisions) {
assert(CoveredPairs <= NumPairs && "Covered pairs over-counted");
assert(CoveredDecisions <= NumDecisions && "Covered decisions over-counted");
}

MCDCCoverageInfo &operator+=(const MCDCCoverageInfo &RHS) {
CoveredPairs += RHS.CoveredPairs;
NumPairs += RHS.NumPairs;
CoveredDecisions += RHS.CoveredDecisions;
NumDecisions += RHS.NumDecisions;
return *this;
}

void merge(const MCDCCoverageInfo &RHS) {
CoveredPairs = std::max(CoveredPairs, RHS.CoveredPairs);
NumPairs = std::max(NumPairs, RHS.NumPairs);
CoveredDecisions = std::max(CoveredDecisions, RHS.CoveredDecisions);
NumDecisions = std::max(NumDecisions, RHS.NumDecisions);
}

size_t getCoveredPairs() const { return CoveredPairs; }

size_t getNumPairs() const { return NumPairs; }

size_t getCoveredDecisions() const { return CoveredDecisions; }

size_t getNumDecisions() const { return NumDecisions; }

bool isFullyCovered() const { return CoveredPairs == NumPairs; }

bool isDecisionFullyCovered() const { return CoveredDecisions == NumDecisions; }

double getPercentCovered() const {
assert(CoveredPairs <= NumPairs && "Covered pairs over-counted");
if (NumPairs == 0)
return 0.0;
return double(CoveredPairs) / double(NumPairs) * 100.0;
}

double getDecisionPercentCovered() const {
assert(CoveredDecisions <= NumDecisions && "Covered decisions over-counted");
if (NumDecisions == 0)
return 0.0;
return double(CoveredDecisions) / double(NumDecisions) * 100.0;
}
};

/// Provides information about function coverage for a file.
Expand Down
6 changes: 6 additions & 0 deletions llvm/tools/llvm-cov/SourceCoverageViewHTML.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -358,6 +358,10 @@ void emitTableRow(raw_ostream &OS, const CoverageViewOptions &Opts,
AddCoverageTripleToColumn(FCS.MCDCCoverage.getCoveredPairs(),
FCS.MCDCCoverage.getNumPairs(),
FCS.MCDCCoverage.getPercentCovered());
if (Opts.ShowMCDCSummary)
AddCoverageTripleToColumn(FCS.MCDCCoverage.getCoveredDecisions(),
FCS.MCDCCoverage.getNumDecisions(),
FCS.MCDCCoverage.getDecisionPercentCovered());

if (IsTotals)
OS << tag("tr", join(Columns.begin(), Columns.end(), ""), "light-row-bold");
Expand Down Expand Up @@ -410,6 +414,8 @@ static void emitColumnLabelsForIndex(raw_ostream &OS,
Columns.emplace_back(tag("td", "Branch Coverage", "column-entry-bold"));
if (Opts.ShowMCDCSummary)
Columns.emplace_back(tag("td", "MC/DC", "column-entry-bold"));
if (Opts.ShowMCDCSummary)
Columns.emplace_back(tag("td", "Decision", "column-entry-bold"));
OS << tag("tr", join(Columns.begin(), Columns.end(), ""));
}

Expand Down

0 comments on commit 5b6538d

Please sign in to comment.