Skip to content

Commit 1f57500

Browse files
committed
Add executed MC/DC TestVectors to llvm-cov export
1 parent 7e5fe3e commit 1f57500

File tree

2 files changed

+42
-18
lines changed

2 files changed

+42
-18
lines changed

llvm/test/tools/llvm-cov/Inputs/binary-formats.canonical.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,4 @@ CHECk-SAME: "mcdc":{"count":0,"covered":0,"notcovered":0,"percent":0},
3333
CHECK-SAME: "regions":{"count":1,"covered":1,"notcovered":0,"percent":100}}}
3434
CHECK-SAME: ],
3535
CHECK-SAME: "type":"llvm.coverage.json.export"
36-
CHECK-SAME: "version":"2.0.1"
36+
CHECK-SAME: "version":"2.1.0"

llvm/tools/llvm-cov/CoverageExporterJson.cpp

Lines changed: 41 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@
6262
#include <utility>
6363

6464
/// The semantic version combined as a string.
65-
#define LLVM_COVERAGE_EXPORT_JSON_STR "2.0.1"
65+
#define LLVM_COVERAGE_EXPORT_JSON_STR "2.1.0"
6666

6767
/// Unique type identifier for JSON coverage export.
6868
#define LLVM_COVERAGE_EXPORT_JSON_TYPE_STR "llvm.coverage.json.export"
@@ -108,11 +108,40 @@ json::Array gatherConditions(const coverage::MCDCRecord &Record) {
108108
return Conditions;
109109
}
110110

111+
json::Value renderCondState(const coverage::MCDCRecord::CondState CondState) {
112+
switch (CondState) {
113+
case coverage::MCDCRecord::MCDC_DontCare:
114+
return json::Value(nullptr);
115+
case coverage::MCDCRecord::MCDC_True:
116+
return json::Value(true);
117+
case coverage::MCDCRecord::MCDC_False:
118+
return json::Value(false);
119+
}
120+
}
121+
122+
json::Array gatherTestVectors(coverage::MCDCRecord &Record) {
123+
json::Array TestVectors;
124+
unsigned NumConditions = Record.getNumConditions();
125+
for (unsigned tv = 0; tv < Record.getNumTestVectors(); tv++) {
126+
127+
json::Array TVConditions;
128+
for (unsigned c = 0; c < NumConditions; c++)
129+
TVConditions.push_back(renderCondState(Record.getTVCondition(tv, c)));
130+
131+
TestVectors.push_back(
132+
json::Object({{"executed", json::Value(true)},
133+
{"result", renderCondState(Record.getTVResult(tv))},
134+
{"conditions", std::move(TVConditions)}}));
135+
}
136+
return TestVectors;
137+
}
138+
111139
json::Array renderMCDCRecord(const coverage::MCDCRecord &Record) {
112140
const llvm::coverage::CounterMappingRegion &CMR = Record.getDecisionRegion();
113-
return json::Array({CMR.LineStart, CMR.ColumnStart, CMR.LineEnd,
114-
CMR.ColumnEnd, CMR.ExpandedFileID, int64_t(CMR.Kind),
115-
gatherConditions(Record)});
141+
return json::Array(
142+
{CMR.LineStart, CMR.ColumnStart, CMR.LineEnd, CMR.ColumnEnd,
143+
CMR.ExpandedFileID, int64_t(CMR.Kind), gatherConditions(Record),
144+
gatherTestVectors(const_cast<coverage::MCDCRecord &>(Record))});
116145
}
117146

118147
json::Array renderRegions(ArrayRef<coverage::CountedRegion> Regions) {
@@ -214,32 +243,28 @@ json::Object renderSummary(const FileCoverageSummary &Summary) {
214243
}
215244

216245
json::Array renderFileExpansions(const coverage::CoverageMapping &Coverage,
217-
const coverage::CoverageData &FileCoverage,
218-
const FileCoverageSummary &FileReport) {
246+
const coverage::CoverageData &FileCoverage) {
219247
json::Array ExpansionArray;
220248
for (const auto &Expansion : FileCoverage.getExpansions())
221249
ExpansionArray.push_back(renderExpansion(Coverage, Expansion));
222250
return ExpansionArray;
223251
}
224252

225-
json::Array renderFileSegments(const coverage::CoverageData &FileCoverage,
226-
const FileCoverageSummary &FileReport) {
253+
json::Array renderFileSegments(const coverage::CoverageData &FileCoverage) {
227254
json::Array SegmentArray;
228255
for (const auto &Segment : FileCoverage)
229256
SegmentArray.push_back(renderSegment(Segment));
230257
return SegmentArray;
231258
}
232259

233-
json::Array renderFileBranches(const coverage::CoverageData &FileCoverage,
234-
const FileCoverageSummary &FileReport) {
260+
json::Array renderFileBranches(const coverage::CoverageData &FileCoverage) {
235261
json::Array BranchArray;
236262
for (const auto &Branch : FileCoverage.getBranches())
237263
BranchArray.push_back(renderBranch(Branch));
238264
return BranchArray;
239265
}
240266

241-
json::Array renderFileMCDC(const coverage::CoverageData &FileCoverage,
242-
const FileCoverageSummary &FileReport) {
267+
json::Array renderFileMCDC(const coverage::CoverageData &FileCoverage) {
243268
json::Array MCDCRecordArray;
244269
for (const auto &Record : FileCoverage.getMCDCRecords())
245270
MCDCRecordArray.push_back(renderMCDCRecord(Record));
@@ -254,12 +279,11 @@ json::Object renderFile(const coverage::CoverageMapping &Coverage,
254279
if (!Options.ExportSummaryOnly) {
255280
// Calculate and render detailed coverage information for given file.
256281
auto FileCoverage = Coverage.getCoverageForFile(Filename);
257-
File["segments"] = renderFileSegments(FileCoverage, FileReport);
258-
File["branches"] = renderFileBranches(FileCoverage, FileReport);
259-
File["mcdc_records"] = renderFileMCDC(FileCoverage, FileReport);
282+
File["segments"] = renderFileSegments(FileCoverage);
283+
File["branches"] = renderFileBranches(FileCoverage);
284+
File["mcdc_records"] = renderFileMCDC(FileCoverage);
260285
if (!Options.SkipExpansions) {
261-
File["expansions"] =
262-
renderFileExpansions(Coverage, FileCoverage, FileReport);
286+
File["expansions"] = renderFileExpansions(Coverage, FileCoverage);
263287
}
264288
}
265289
File["summary"] = renderSummary(FileReport);

0 commit comments

Comments
 (0)