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