// CHECK-SAME: "totals":{
// CHECK-SAME: "lines":{"count":1,"covered":1,"percent":100,"noncode":0},
// CHECK-SAME: "functions":{"count":1,"covered":1,"percent":100},
+// CHECK-SAME: "instantiations":{"count":1,"covered":1,"percent":100},
// CHECK-SAME: "regions":{"count":1,"covered":1,"notcovered":0,"percent":100}}
// Close the export object, data array, and root object
// CHECK-SAME: "totals":{
// CHECK-SAME: "lines":{"count":40,"covered":26,"percent":65,"noncode":0},
// CHECK-SAME: "functions":{"count":4,"covered":4,"percent":100},
+// CHECK-SAME: "instantiations":{"count":4,"covered":4,"percent":100},
// CHECK-SAME: "regions":{"count":19,"covered":11,"notcovered":8,"percent":57}}
// Close the export object, data array, and root object
// CHECK-SAME: "totals":{
// CHECK-SAME: "lines":{"count":20,"covered":16,"percent":80,"noncode":0},
// CHECK-SAME: "functions":{"count":1,"covered":1,"percent":100},
+// CHECK-SAME: "instantiations":{"count":1,"covered":1,"percent":100},
// CHECK-SAME: "regions":{"count":10,"covered":7,"notcovered":3,"percent":70}}
// Close the export object, data array, and root object
// CHECK-SAME: "totals":{
// CHECK-SAME: "lines":{"count":21,"covered":17,"percent":80,"noncode":0},
// CHECK-SAME: "functions":{"count":1,"covered":1,"percent":100},
+// CHECK-SAME: "instantiations":{"count":1,"covered":1,"percent":100},
// CHECK-SAME: "regions":{"count":10,"covered":7,"notcovered":3,"percent":70}}
// Close the export object, data array, and root object
// CHECK-SAME: "totals":{
// CHECK-SAME: "lines":{"count":17,"covered":15,"percent":88,"noncode":0},
// CHECK-SAME: "functions":{"count":1,"covered":1,"percent":100},
+// CHECK-SAME: "instantiations":{"count":1,"covered":1,"percent":100},
// CHECK-SAME: "regions":{"count":13,"covered":12,"notcovered":1,"percent":92}}
// Close the export object, data array, and root object
// CHECK-SAME: "totals":{
// CHECK-SAME: "lines":{"count":1,"covered":1,"percent":100,"noncode":0},
// CHECK-SAME: "functions":{"count":1,"covered":1,"percent":100},
+// CHECK-SAME: "instantiations":{"count":1,"covered":1,"percent":100},
// CHECK-SAME: "regions":{"count":1,"covered":1,"notcovered":0,"percent":100}
// Close the export object, data array, and root object
// ---- Summary: dict => Object summarizing the coverage for the entire binary
// ------ LineCoverage: dict => Object summarizing line coverage
// ------ FunctionCoverage: dict => Object summarizing function coverage
+// ------ InstantiationCoverage: dict => Object summarizing inst. coverage
// ------ RegionCoverage: dict => Object summarizing region coverage
//
//===----------------------------------------------------------------------===//
+#include "CoverageReport.h"
#include "CoverageSummaryInfo.h"
#include "CoverageViewOptions.h"
#include "llvm/ProfileData/Coverage/CoverageMapping.h"
emitDictElement("object", getObjectFilename());
emitDictKey("files");
+
FileCoverageSummary Totals = FileCoverageSummary("Totals");
- renderFiles(Coverage.getUniqueSourceFiles(), Totals);
+ std::vector<StringRef> SourceFiles = Coverage.getUniqueSourceFiles();
+ auto FileReports =
+ CoverageReport::prepareFileReports(Coverage, Totals, SourceFiles);
+ renderFiles(SourceFiles, FileReports);
emitDictKey("functions");
renderFunctions(Coverage.getCoveredFunctions());
/// \brief Render an array of all the source files, also pass back a Summary.
void renderFiles(ArrayRef<StringRef> SourceFiles,
- FileCoverageSummary &Summary) {
+ ArrayRef<FileCoverageSummary> FileReports) {
// Start List of Files.
emitArrayStart();
- for (const auto &SourceFile : SourceFiles) {
- // Render the file.
- auto FileCoverage = Coverage.getCoverageForFile(SourceFile);
- renderFile(FileCoverage);
- for (const auto &F : Coverage.getCoveredFunctions(SourceFile))
- Summary.addFunction(FunctionCoverageSummary::get(F));
+ for (unsigned I = 0, E = SourceFiles.size(); I < E; ++I) {
+ // Render the file.
+ auto FileCoverage = Coverage.getCoverageForFile(SourceFiles[I]);
+ renderFile(FileCoverage, FileReports[I]);
}
// End List of Files.
}
/// \brief Render a single file.
- void renderFile(const CoverageData &FileCoverage) {
+ void renderFile(const CoverageData &FileCoverage,
+ const FileCoverageSummary &FileReport) {
// Start File.
emitDictStart();
// End List of Expansions.
emitArrayEnd();
- FileCoverageSummary Summary =
- FileCoverageSummary(FileCoverage.getFilename());
- for (const auto &F :
- Coverage.getCoveredFunctions(FileCoverage.getFilename()))
- Summary.addFunction(FunctionCoverageSummary::get(F));
-
emitDictKey("summary");
- renderSummary(Summary);
+ renderSummary(FileReport);
// End File.
emitDictEnd();
// End Function Coverage Summary.
emitDictEnd();
+ emitDictKey("instantiations");
+
+ // Start Instantiation Coverage Summary.
+ emitDictStart();
+ emitDictElement("count", Summary.InstantiationCoverage.NumFunctions);
+ emitDictElement("covered", Summary.InstantiationCoverage.Executed);
+ emitDictElement("percent",
+ Summary.InstantiationCoverage.getPercentCovered());
+ // End Function Coverage Summary.
+ emitDictEnd();
+
emitDictKey("regions");
// Start Region Coverage Summary.