Skip to content

llvm-cov: Refactor CoverageSummaryInfo. NFC. #121189

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Dec 28, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 28 additions & 23 deletions llvm/tools/llvm-cov/CoverageSummaryInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,9 @@
using namespace llvm;
using namespace coverage;

static void sumBranches(size_t &NumBranches, size_t &CoveredBranches,
const ArrayRef<CountedRegion> &Branches) {
static auto sumBranches(const ArrayRef<CountedRegion> &Branches) {
size_t NumBranches = 0;
size_t CoveredBranches = 0;
for (const auto &BR : Branches) {
if (!BR.TrueFolded) {
// "True" Condition Branches.
Expand All @@ -32,20 +33,22 @@ static void sumBranches(size_t &NumBranches, size_t &CoveredBranches,
++CoveredBranches;
}
}
return BranchCoverageInfo(CoveredBranches, NumBranches);
}

static void sumBranchExpansions(size_t &NumBranches, size_t &CoveredBranches,
const CoverageMapping &CM,
ArrayRef<ExpansionRecord> Expansions) {
static BranchCoverageInfo
sumBranchExpansions(const CoverageMapping &CM,
ArrayRef<ExpansionRecord> Expansions) {
BranchCoverageInfo BranchCoverage;
for (const auto &Expansion : Expansions) {
auto CE = CM.getCoverageForExpansion(Expansion);
sumBranches(NumBranches, CoveredBranches, CE.getBranches());
sumBranchExpansions(NumBranches, CoveredBranches, CM, CE.getExpansions());
BranchCoverage += sumBranches(CE.getBranches());
BranchCoverage += sumBranchExpansions(CM, CE.getExpansions());
}
return BranchCoverage;
}

static std::pair<size_t, size_t>
sumMCDCPairs(const ArrayRef<MCDCRecord> &Records) {
auto sumMCDCPairs(const ArrayRef<MCDCRecord> &Records) {
size_t NumPairs = 0, CoveredPairs = 0;
for (const auto &Record : Records) {
const auto NumConditions = Record.getNumConditions();
Expand All @@ -56,7 +59,7 @@ sumMCDCPairs(const ArrayRef<MCDCRecord> &Records) {
++CoveredPairs;
}
}
return {NumPairs, CoveredPairs};
return MCDCCoverageInfo(CoveredPairs, NumPairs);
}

static std::pair<RegionCoverageInfo, LineCoverageInfo>
Expand Down Expand Up @@ -85,24 +88,27 @@ sumRegions(ArrayRef<CountedRegion> CodeRegions, const CoverageData &CD) {
LineCoverageInfo(CoveredLines, NumLines)};
}

CoverageDataSummary::CoverageDataSummary(const CoverageData &CD,
ArrayRef<CountedRegion> CodeRegions) {
std::tie(RegionCoverage, LineCoverage) = sumRegions(CodeRegions, CD);
BranchCoverage = sumBranches(CD.getBranches());
MCDCCoverage = sumMCDCPairs(CD.getMCDCRecords());
}

FunctionCoverageSummary
FunctionCoverageSummary::get(const CoverageMapping &CM,
const coverage::FunctionRecord &Function) {
CoverageData CD = CM.getCoverageForFunction(Function);
auto [RegionCoverage, LineCoverage] = sumRegions(Function.CountedRegions, CD);

// Compute the branch coverage, including branches from expansions.
size_t NumBranches = 0, CoveredBranches = 0;
sumBranches(NumBranches, CoveredBranches, CD.getBranches());
sumBranchExpansions(NumBranches, CoveredBranches, CM, CD.getExpansions());
auto Summary =
FunctionCoverageSummary(Function.Name, Function.ExecutionCount);

size_t NumPairs = 0, CoveredPairs = 0;
std::tie(NumPairs, CoveredPairs) = sumMCDCPairs(CD.getMCDCRecords());
Summary += CoverageDataSummary(CD, Function.CountedRegions);

return FunctionCoverageSummary(
Function.Name, Function.ExecutionCount, RegionCoverage, LineCoverage,
BranchCoverageInfo(CoveredBranches, NumBranches),
MCDCCoverageInfo(CoveredPairs, NumPairs));
// Compute the branch coverage, including branches from expansions.
Summary.BranchCoverage += sumBranchExpansions(CM, CD.getExpansions());

return Summary;
}

FunctionCoverageSummary
Expand All @@ -117,8 +123,7 @@ FunctionCoverageSummary::get(const InstantiationGroup &Group,
<< Group.getColumn();
}

FunctionCoverageSummary Summary(Name);
Summary.ExecutionCount = Group.getTotalExecutionCount();
FunctionCoverageSummary Summary(Name, Group.getTotalExecutionCount());
Summary.RegionCoverage = Summaries[0].RegionCoverage;
Summary.LineCoverage = Summaries[0].LineCoverage;
Summary.BranchCoverage = Summaries[0].BranchCoverage;
Expand Down
45 changes: 22 additions & 23 deletions llvm/tools/llvm-cov/CoverageSummaryInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -223,26 +223,32 @@ class FunctionCoverageInfo {
}
};

/// A summary of function's code coverage.
struct FunctionCoverageSummary {
std::string Name;
uint64_t ExecutionCount;
struct CoverageDataSummary {
RegionCoverageInfo RegionCoverage;
LineCoverageInfo LineCoverage;
BranchCoverageInfo BranchCoverage;
MCDCCoverageInfo MCDCCoverage;

FunctionCoverageSummary(const std::string &Name)
: Name(Name), ExecutionCount(0) {}
CoverageDataSummary() = default;
CoverageDataSummary(const coverage::CoverageData &CD,
ArrayRef<coverage::CountedRegion> CodeRegions);

FunctionCoverageSummary(const std::string &Name, uint64_t ExecutionCount,
const RegionCoverageInfo &RegionCoverage,
const LineCoverageInfo &LineCoverage,
const BranchCoverageInfo &BranchCoverage,
const MCDCCoverageInfo &MCDCCoverage)
: Name(Name), ExecutionCount(ExecutionCount),
RegionCoverage(RegionCoverage), LineCoverage(LineCoverage),
BranchCoverage(BranchCoverage), MCDCCoverage(MCDCCoverage) {}
auto &operator+=(const CoverageDataSummary &RHS) {
RegionCoverage += RHS.RegionCoverage;
LineCoverage += RHS.LineCoverage;
BranchCoverage += RHS.BranchCoverage;
MCDCCoverage += RHS.MCDCCoverage;
return *this;
}
};

/// A summary of function's code coverage.
struct FunctionCoverageSummary : CoverageDataSummary {
std::string Name;
uint64_t ExecutionCount;

FunctionCoverageSummary(const std::string &Name, uint64_t ExecutionCount = 0)
: Name(Name), ExecutionCount(ExecutionCount) {}

/// Compute the code coverage summary for the given function coverage
/// mapping record.
Expand All @@ -257,24 +263,17 @@ struct FunctionCoverageSummary {
};

/// A summary of file's code coverage.
struct FileCoverageSummary {
struct FileCoverageSummary : CoverageDataSummary {
StringRef Name;
RegionCoverageInfo RegionCoverage;
LineCoverageInfo LineCoverage;
BranchCoverageInfo BranchCoverage;
MCDCCoverageInfo MCDCCoverage;
FunctionCoverageInfo FunctionCoverage;
FunctionCoverageInfo InstantiationCoverage;

FileCoverageSummary() = default;
FileCoverageSummary(StringRef Name) : Name(Name) {}

FileCoverageSummary &operator+=(const FileCoverageSummary &RHS) {
RegionCoverage += RHS.RegionCoverage;
LineCoverage += RHS.LineCoverage;
*static_cast<CoverageDataSummary *>(this) += RHS;
FunctionCoverage += RHS.FunctionCoverage;
BranchCoverage += RHS.BranchCoverage;
MCDCCoverage += RHS.MCDCCoverage;
InstantiationCoverage += RHS.InstantiationCoverage;
return *this;
}
Expand Down
Loading