Skip to content

Commit a21f13b

Browse files
authored
llvm-cov: Refactor CoverageSummaryInfo. NFC. (#121189)
- Let subfunctions return `CoverageInfo` objects w/o accumulating reference values. - Introduce `CoverageDataSummary` for handling `CoverageData`-oriented metrics.
1 parent ee6f10d commit a21f13b

File tree

2 files changed

+50
-46
lines changed

2 files changed

+50
-46
lines changed

llvm/tools/llvm-cov/CoverageSummaryInfo.cpp

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,9 @@
1616
using namespace llvm;
1717
using namespace coverage;
1818

19-
static void sumBranches(size_t &NumBranches, size_t &CoveredBranches,
20-
const ArrayRef<CountedRegion> &Branches) {
19+
static auto sumBranches(const ArrayRef<CountedRegion> &Branches) {
20+
size_t NumBranches = 0;
21+
size_t CoveredBranches = 0;
2122
for (const auto &BR : Branches) {
2223
if (!BR.TrueFolded) {
2324
// "True" Condition Branches.
@@ -32,20 +33,22 @@ static void sumBranches(size_t &NumBranches, size_t &CoveredBranches,
3233
++CoveredBranches;
3334
}
3435
}
36+
return BranchCoverageInfo(CoveredBranches, NumBranches);
3537
}
3638

37-
static void sumBranchExpansions(size_t &NumBranches, size_t &CoveredBranches,
38-
const CoverageMapping &CM,
39-
ArrayRef<ExpansionRecord> Expansions) {
39+
static BranchCoverageInfo
40+
sumBranchExpansions(const CoverageMapping &CM,
41+
ArrayRef<ExpansionRecord> Expansions) {
42+
BranchCoverageInfo BranchCoverage;
4043
for (const auto &Expansion : Expansions) {
4144
auto CE = CM.getCoverageForExpansion(Expansion);
42-
sumBranches(NumBranches, CoveredBranches, CE.getBranches());
43-
sumBranchExpansions(NumBranches, CoveredBranches, CM, CE.getExpansions());
45+
BranchCoverage += sumBranches(CE.getBranches());
46+
BranchCoverage += sumBranchExpansions(CM, CE.getExpansions());
4447
}
48+
return BranchCoverage;
4549
}
4650

47-
static std::pair<size_t, size_t>
48-
sumMCDCPairs(const ArrayRef<MCDCRecord> &Records) {
51+
auto sumMCDCPairs(const ArrayRef<MCDCRecord> &Records) {
4952
size_t NumPairs = 0, CoveredPairs = 0;
5053
for (const auto &Record : Records) {
5154
const auto NumConditions = Record.getNumConditions();
@@ -56,7 +59,7 @@ sumMCDCPairs(const ArrayRef<MCDCRecord> &Records) {
5659
++CoveredPairs;
5760
}
5861
}
59-
return {NumPairs, CoveredPairs};
62+
return MCDCCoverageInfo(CoveredPairs, NumPairs);
6063
}
6164

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

91+
CoverageDataSummary::CoverageDataSummary(const CoverageData &CD,
92+
ArrayRef<CountedRegion> CodeRegions) {
93+
std::tie(RegionCoverage, LineCoverage) = sumRegions(CodeRegions, CD);
94+
BranchCoverage = sumBranches(CD.getBranches());
95+
MCDCCoverage = sumMCDCPairs(CD.getMCDCRecords());
96+
}
97+
8898
FunctionCoverageSummary
8999
FunctionCoverageSummary::get(const CoverageMapping &CM,
90100
const coverage::FunctionRecord &Function) {
91101
CoverageData CD = CM.getCoverageForFunction(Function);
92-
auto [RegionCoverage, LineCoverage] = sumRegions(Function.CountedRegions, CD);
93102

94-
// Compute the branch coverage, including branches from expansions.
95-
size_t NumBranches = 0, CoveredBranches = 0;
96-
sumBranches(NumBranches, CoveredBranches, CD.getBranches());
97-
sumBranchExpansions(NumBranches, CoveredBranches, CM, CD.getExpansions());
103+
auto Summary =
104+
FunctionCoverageSummary(Function.Name, Function.ExecutionCount);
98105

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

102-
return FunctionCoverageSummary(
103-
Function.Name, Function.ExecutionCount, RegionCoverage, LineCoverage,
104-
BranchCoverageInfo(CoveredBranches, NumBranches),
105-
MCDCCoverageInfo(CoveredPairs, NumPairs));
108+
// Compute the branch coverage, including branches from expansions.
109+
Summary.BranchCoverage += sumBranchExpansions(CM, CD.getExpansions());
110+
111+
return Summary;
106112
}
107113

108114
FunctionCoverageSummary
@@ -117,8 +123,7 @@ FunctionCoverageSummary::get(const InstantiationGroup &Group,
117123
<< Group.getColumn();
118124
}
119125

120-
FunctionCoverageSummary Summary(Name);
121-
Summary.ExecutionCount = Group.getTotalExecutionCount();
126+
FunctionCoverageSummary Summary(Name, Group.getTotalExecutionCount());
122127
Summary.RegionCoverage = Summaries[0].RegionCoverage;
123128
Summary.LineCoverage = Summaries[0].LineCoverage;
124129
Summary.BranchCoverage = Summaries[0].BranchCoverage;

llvm/tools/llvm-cov/CoverageSummaryInfo.h

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -223,26 +223,32 @@ class FunctionCoverageInfo {
223223
}
224224
};
225225

226-
/// A summary of function's code coverage.
227-
struct FunctionCoverageSummary {
228-
std::string Name;
229-
uint64_t ExecutionCount;
226+
struct CoverageDataSummary {
230227
RegionCoverageInfo RegionCoverage;
231228
LineCoverageInfo LineCoverage;
232229
BranchCoverageInfo BranchCoverage;
233230
MCDCCoverageInfo MCDCCoverage;
234231

235-
FunctionCoverageSummary(const std::string &Name)
236-
: Name(Name), ExecutionCount(0) {}
232+
CoverageDataSummary() = default;
233+
CoverageDataSummary(const coverage::CoverageData &CD,
234+
ArrayRef<coverage::CountedRegion> CodeRegions);
237235

238-
FunctionCoverageSummary(const std::string &Name, uint64_t ExecutionCount,
239-
const RegionCoverageInfo &RegionCoverage,
240-
const LineCoverageInfo &LineCoverage,
241-
const BranchCoverageInfo &BranchCoverage,
242-
const MCDCCoverageInfo &MCDCCoverage)
243-
: Name(Name), ExecutionCount(ExecutionCount),
244-
RegionCoverage(RegionCoverage), LineCoverage(LineCoverage),
245-
BranchCoverage(BranchCoverage), MCDCCoverage(MCDCCoverage) {}
236+
auto &operator+=(const CoverageDataSummary &RHS) {
237+
RegionCoverage += RHS.RegionCoverage;
238+
LineCoverage += RHS.LineCoverage;
239+
BranchCoverage += RHS.BranchCoverage;
240+
MCDCCoverage += RHS.MCDCCoverage;
241+
return *this;
242+
}
243+
};
244+
245+
/// A summary of function's code coverage.
246+
struct FunctionCoverageSummary : CoverageDataSummary {
247+
std::string Name;
248+
uint64_t ExecutionCount;
249+
250+
FunctionCoverageSummary(const std::string &Name, uint64_t ExecutionCount = 0)
251+
: Name(Name), ExecutionCount(ExecutionCount) {}
246252

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

259265
/// A summary of file's code coverage.
260-
struct FileCoverageSummary {
266+
struct FileCoverageSummary : CoverageDataSummary {
261267
StringRef Name;
262-
RegionCoverageInfo RegionCoverage;
263-
LineCoverageInfo LineCoverage;
264-
BranchCoverageInfo BranchCoverage;
265-
MCDCCoverageInfo MCDCCoverage;
266268
FunctionCoverageInfo FunctionCoverage;
267269
FunctionCoverageInfo InstantiationCoverage;
268270

269271
FileCoverageSummary() = default;
270272
FileCoverageSummary(StringRef Name) : Name(Name) {}
271273

272274
FileCoverageSummary &operator+=(const FileCoverageSummary &RHS) {
273-
RegionCoverage += RHS.RegionCoverage;
274-
LineCoverage += RHS.LineCoverage;
275+
*static_cast<CoverageDataSummary *>(this) += RHS;
275276
FunctionCoverage += RHS.FunctionCoverage;
276-
BranchCoverage += RHS.BranchCoverage;
277-
MCDCCoverage += RHS.MCDCCoverage;
278277
InstantiationCoverage += RHS.InstantiationCoverage;
279278
return *this;
280279
}

0 commit comments

Comments
 (0)