43
43
#include " CoverageReport.h"
44
44
45
45
using namespace llvm ;
46
- using namespace coverage ;
47
46
48
47
namespace {
49
48
50
- struct NestedCountedRegion : public coverage ::CountedRegion {
51
- // Contains the path to default and expanded branches.
52
- // Size is 1 for default branches and greater 1 for expanded branches.
53
- std::vector<LineColPair> NestedPath;
54
- // Indicates whether this item should be ignored at rendering.
55
- bool Ignore = false ;
56
-
57
- NestedCountedRegion (llvm::coverage::CountedRegion Region,
58
- std::vector<LineColPair> NestedPath)
59
- : llvm::coverage::CountedRegion(std::move(Region)),
60
- NestedPath (std::move(NestedPath)) {}
61
-
62
- // Returns the root line of the branch.
63
- unsigned getEffectiveLine () const { return NestedPath.front ().first ; }
64
- };
65
-
66
49
void renderFunctionSummary (raw_ostream &OS,
67
50
const FileCoverageSummary &Summary) {
68
51
OS << " FNF:" << Summary.FunctionCoverage .getNumFunctions () << ' \n '
@@ -92,121 +75,71 @@ void renderLineExecutionCounts(raw_ostream &OS,
92
75
}
93
76
}
94
77
95
- std::vector<NestedCountedRegion >
78
+ std::vector<llvm::coverage::CountedRegion >
96
79
collectNestedBranches (const coverage::CoverageMapping &Coverage,
97
80
ArrayRef<llvm::coverage::ExpansionRecord> Expansions,
98
- std::vector<LineColPair> &NestedPath ) {
99
- std::vector<NestedCountedRegion > Branches;
81
+ int ViewDepth = 0 , int SrcLine = 0 ) {
82
+ std::vector<llvm::coverage::CountedRegion > Branches;
100
83
for (const auto &Expansion : Expansions) {
101
84
auto ExpansionCoverage = Coverage.getCoverageForExpansion (Expansion);
102
85
103
- // Track the path to the nested expansions.
104
- NestedPath.push_back (Expansion.Region .startLoc ());
86
+ // If we're at the top level, set the corresponding source line.
87
+ if (ViewDepth == 0 )
88
+ SrcLine = Expansion.Region .LineStart ;
105
89
106
90
// Recursively collect branches from nested expansions.
107
91
auto NestedExpansions = ExpansionCoverage.getExpansions ();
108
- auto NestedExBranches =
109
- collectNestedBranches (Coverage, NestedExpansions, NestedPath );
92
+ auto NestedExBranches = collectNestedBranches (Coverage, NestedExpansions,
93
+ ViewDepth + 1 , SrcLine );
110
94
append_range (Branches, NestedExBranches);
111
95
112
96
// Add branches from this level of expansion.
113
97
auto ExBranches = ExpansionCoverage.getBranches ();
114
- for (auto & B : ExBranches)
98
+ for (auto B : ExBranches)
115
99
if (B.FileID == Expansion.FileID ) {
116
- Branches.push_back (NestedCountedRegion (B, NestedPath));
100
+ B.LineStart = SrcLine;
101
+ Branches.push_back (B);
117
102
}
118
-
119
- NestedPath.pop_back ();
120
103
}
121
104
122
105
return Branches;
123
106
}
124
107
125
- void appendNestedCountedRegions (const std::vector<CountedRegion> &Src,
126
- std::vector<NestedCountedRegion> &Dst) {
127
- auto Unfolded = make_filter_range (Src, [](auto &Region) {
128
- return !Region.TrueFolded || !Region.FalseFolded ;
129
- });
130
- Dst.reserve (Dst.size () + Src.size ());
131
- std::transform (Unfolded.begin (), Unfolded.end (), std::back_inserter (Dst),
132
- [=](auto &Region) {
133
- return NestedCountedRegion (Region, {Region.startLoc ()});
134
- });
135
- }
136
-
137
- void appendNestedCountedRegions (const std::vector<NestedCountedRegion> &Src,
138
- std::vector<NestedCountedRegion> &Dst) {
139
- auto Unfolded = make_filter_range (Src, [](auto &NestedRegion) {
140
- return !NestedRegion.TrueFolded || !NestedRegion.FalseFolded ;
141
- });
142
- Dst.reserve (Dst.size () + Src.size ());
143
- std::copy (Unfolded.begin (), Unfolded.end (), std::back_inserter (Dst));
144
- }
145
-
146
- bool sortNested (const NestedCountedRegion &I, const NestedCountedRegion &J) {
147
- // This sorts each element by line and column.
148
- // Implies that all elements are first sorted by getEffectiveLine().
149
- return I.NestedPath < J.NestedPath ;
150
- }
151
-
152
- void combineInstanceCounts (std::vector<NestedCountedRegion> &Branches) {
153
- auto NextBranch = Branches.begin ();
154
- auto EndBranch = Branches.end ();
155
-
156
- while (NextBranch != EndBranch) {
157
- auto SumBranch = NextBranch++;
158
-
159
- // Ensure that only branches with the same NestedPath are summed up.
160
- while (NextBranch != EndBranch &&
161
- SumBranch->NestedPath == NextBranch->NestedPath ) {
162
- SumBranch->ExecutionCount += NextBranch->ExecutionCount ;
163
- SumBranch->FalseExecutionCount += NextBranch->FalseExecutionCount ;
164
- // Mark this branch as ignored.
165
- NextBranch->Ignore = true ;
166
-
167
- NextBranch++;
168
- }
169
- }
108
+ bool sortLine (llvm::coverage::CountedRegion I,
109
+ llvm::coverage::CountedRegion J) {
110
+ return (I.LineStart < J.LineStart ) ||
111
+ ((I.LineStart == J.LineStart ) && (I.ColumnStart < J.ColumnStart ));
170
112
}
171
113
172
114
void renderBranchExecutionCounts (raw_ostream &OS,
173
115
const coverage::CoverageMapping &Coverage,
174
- const coverage::CoverageData &FileCoverage,
175
- bool UnifyInstances) {
176
-
177
- std::vector<NestedCountedRegion> Branches;
178
-
179
- appendNestedCountedRegions (FileCoverage.getBranches (), Branches);
116
+ const coverage::CoverageData &FileCoverage) {
117
+ std::vector<llvm::coverage::CountedRegion> Branches =
118
+ FileCoverage.getBranches ();
180
119
181
120
// Recursively collect branches for all file expansions.
182
- std::vector<LineColPair> NestedPath;
183
- std::vector<NestedCountedRegion> ExBranches =
184
- collectNestedBranches (Coverage, FileCoverage.getExpansions (), NestedPath);
121
+ std::vector<llvm::coverage::CountedRegion> ExBranches =
122
+ collectNestedBranches (Coverage, FileCoverage.getExpansions ());
185
123
186
124
// Append Expansion Branches to Source Branches.
187
- appendNestedCountedRegions (ExBranches, Branches );
125
+ append_range (Branches, ExBranches );
188
126
189
127
// Sort branches based on line number to ensure branches corresponding to the
190
128
// same source line are counted together.
191
- llvm::sort (Branches, sortNested);
192
-
193
- if (UnifyInstances) {
194
- combineInstanceCounts (Branches);
195
- }
129
+ llvm::sort (Branches, sortLine);
196
130
197
131
auto NextBranch = Branches.begin ();
198
132
auto EndBranch = Branches.end ();
199
133
200
134
// Branches with the same source line are enumerated individually
201
135
// (BranchIndex) as well as based on True/False pairs (PairIndex).
202
136
while (NextBranch != EndBranch) {
203
- unsigned CurrentLine = NextBranch->getEffectiveLine () ;
137
+ unsigned CurrentLine = NextBranch->LineStart ;
204
138
unsigned PairIndex = 0 ;
205
139
unsigned BranchIndex = 0 ;
206
140
207
- while (NextBranch != EndBranch &&
208
- CurrentLine == NextBranch->getEffectiveLine ()) {
209
- if (!NextBranch->Ignore ) {
141
+ while (NextBranch != EndBranch && CurrentLine == NextBranch->LineStart ) {
142
+ if (!NextBranch->TrueFolded || !NextBranch->FalseFolded ) {
210
143
unsigned BC1 = NextBranch->ExecutionCount ;
211
144
unsigned BC2 = NextBranch->FalseExecutionCount ;
212
145
bool BranchNotExecuted = (BC1 == 0 && BC2 == 0 );
@@ -240,7 +173,7 @@ void renderBranchSummary(raw_ostream &OS, const FileCoverageSummary &Summary) {
240
173
void renderFile (raw_ostream &OS, const coverage::CoverageMapping &Coverage,
241
174
const std::string &Filename,
242
175
const FileCoverageSummary &FileReport, bool ExportSummaryOnly,
243
- bool SkipFunctions, bool SkipBranches, bool UnifyInstances ) {
176
+ bool SkipFunctions, bool SkipBranches) {
244
177
OS << " SF:" << Filename << ' \n ' ;
245
178
246
179
if (!ExportSummaryOnly && !SkipFunctions) {
@@ -253,7 +186,7 @@ void renderFile(raw_ostream &OS, const coverage::CoverageMapping &Coverage,
253
186
auto FileCoverage = Coverage.getCoverageForFile (Filename);
254
187
renderLineExecutionCounts (OS, FileCoverage);
255
188
if (!SkipBranches)
256
- renderBranchExecutionCounts (OS, Coverage, FileCoverage, UnifyInstances );
189
+ renderBranchExecutionCounts (OS, Coverage, FileCoverage);
257
190
}
258
191
if (!SkipBranches)
259
192
renderBranchSummary (OS, FileReport);
@@ -265,11 +198,11 @@ void renderFile(raw_ostream &OS, const coverage::CoverageMapping &Coverage,
265
198
void renderFiles (raw_ostream &OS, const coverage::CoverageMapping &Coverage,
266
199
ArrayRef<std::string> SourceFiles,
267
200
ArrayRef<FileCoverageSummary> FileReports,
268
- bool ExportSummaryOnly, bool SkipFunctions, bool SkipBranches,
269
- bool UnifyInstances ) {
201
+ bool ExportSummaryOnly, bool SkipFunctions,
202
+ bool SkipBranches ) {
270
203
for (unsigned I = 0 , E = SourceFiles.size (); I < E; ++I)
271
204
renderFile (OS, Coverage, SourceFiles[I], FileReports[I], ExportSummaryOnly,
272
- SkipFunctions, SkipBranches, UnifyInstances );
205
+ SkipFunctions, SkipBranches);
273
206
}
274
207
275
208
} // end anonymous namespace
@@ -288,6 +221,5 @@ void CoverageExporterLcov::renderRoot(ArrayRef<std::string> SourceFiles) {
288
221
auto FileReports = CoverageReport::prepareFileReports (Coverage, Totals,
289
222
SourceFiles, Options);
290
223
renderFiles (OS, Coverage, SourceFiles, FileReports, Options.ExportSummaryOnly ,
291
- Options.SkipFunctions , Options.SkipBranches ,
292
- Options.UnifyFunctionInstantiations );
224
+ Options.SkipFunctions , Options.SkipBranches );
293
225
}
0 commit comments