[llvm-cov] Allow hiding instantiation/region coverage from summary tables
Region coverage is difficult to explain without going deep into how coverage is implemented. Instantiation coverage is easier to explain, but probably not useful in most cases (templates don't exist in C, and most C++ code contains relatively few templates). This patch adds the options "-show-region-summary" and "-show-instantiation-summary" to allow hiding those columns. "-show-instantiation-summary" is turned off by default. llvm-svn: 312969
This commit is contained in:
parent
b9b6025328
commit
50479f60c4
|
@ -1,8 +1,8 @@
|
|||
RUN: llvm-profdata merge %S/Inputs/hideUnexecutedSubviews.proftext -o %t.profdata
|
||||
|
||||
RUN: llvm-cov show %S/Inputs/templateInstantiations.covmapping -instr-profile %t.profdata -path-equivalence=/tmp,%S %S/showTemplateInstantiations.cpp | FileCheck -check-prefix=FILE %s
|
||||
RUN: llvm-cov show %S/Inputs/templateInstantiations.covmapping -instr-profile %t.profdata -show-region-summary -show-instantiation-summary -path-equivalence=/tmp,%S %S/showTemplateInstantiations.cpp | FileCheck -check-prefix=FILE %s
|
||||
|
||||
RUN: llvm-cov show %S/Inputs/templateInstantiations.covmapping -instr-profile %t.profdata -format html -o %t.html.dir -path-equivalence=/tmp,%S %S/showTemplateInstantiations.cpp
|
||||
RUN: llvm-cov show %S/Inputs/templateInstantiations.covmapping -instr-profile %t.profdata -format html -show-region-summary -show-instantiation-summary -o %t.html.dir -path-equivalence=/tmp,%S %S/showTemplateInstantiations.cpp
|
||||
RUN: FileCheck -check-prefix=FILE %s -input-file %t.html.dir/coverage/tmp/showTemplateInstantiations.cpp.html
|
||||
|
||||
FILE: Unexecuted instantiation: _Z4funcIbEiT_
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
// RUN: llvm-cov report %S/Inputs/report.covmapping -instr-profile %S/Inputs/report.profdata -path-equivalence=,%S 2>&1 | FileCheck %s
|
||||
// RUN: llvm-cov report %S/Inputs/report.covmapping -instr-profile %S/Inputs/report.profdata -path-equivalence=,%S 2>&1 -show-region-summary -show-instantiation-summary | FileCheck %s
|
||||
// RUN: llvm-cov report -show-functions %S/Inputs/report.covmapping -instr-profile %S/Inputs/report.profdata -path-equivalence=,%S %s 2>&1 | FileCheck -check-prefix=FILT %s
|
||||
// RUN: llvm-cov report -show-functions %S/Inputs/report.covmapping -instr-profile %S/Inputs/report.profdata -path-equivalence=,%S %s does-not-exist.cpp 2>&1 | FileCheck -check-prefix=FILT %s
|
||||
|
||||
|
|
|
@ -80,14 +80,11 @@ int main() { // TEXT: [[@LINE]]| 161|int main(
|
|||
// HTML-INDEX-LABEL: <table>
|
||||
// HTML-INDEX: <td class='column-entry-left'>Filename</td>
|
||||
// HTML-INDEX: <td class='column-entry'>Function Coverage</td>
|
||||
// HTML-INDEX: <td class='column-entry'>Instantiation Coverage</td>
|
||||
// HTML-INDEX: <td class='column-entry'>Line Coverage</td>
|
||||
// HTML-INDEX: <td class='column-entry'>Region Coverage</td>
|
||||
// HTML-INDEX: <a href='coverage{{.*}}showLineExecutionCounts.cpp.html'{{.*}}showLineExecutionCounts.cpp</a>
|
||||
// HTML-INDEX: <td class='column-entry-green'>
|
||||
// HTML-INDEX: 100.00% (1/1)
|
||||
// HTML-INDEX: <td class='column-entry-green'>
|
||||
// HTML-INDEX: 100.00% (1/1)
|
||||
// HTML-INDEX: <td class='column-entry-yellow'>
|
||||
// HTML-INDEX: 80.00% (16/20)
|
||||
// HTML-INDEX: <td class='column-entry-red'>
|
||||
|
|
|
@ -608,6 +608,15 @@ int CodeCoverageTool::run(Command Cmd, int argc, const char **argv) {
|
|||
cl::list<std::string> DemanglerOpts(
|
||||
"Xdemangler", cl::desc("<demangler-path>|<demangler-option>"));
|
||||
|
||||
cl::opt<bool> RegionSummary(
|
||||
"show-region-summary", cl::Optional,
|
||||
cl::desc("Show region statistics in summary table"),
|
||||
cl::init(true));
|
||||
|
||||
cl::opt<bool> InstantiationSummary(
|
||||
"show-instantiation-summary", cl::Optional,
|
||||
cl::desc("Show instantiation statistics in summary table"));
|
||||
|
||||
auto commandLineParser = [&, this](int argc, const char **argv) -> int {
|
||||
cl::ParseCommandLineOptions(argc, argv, "LLVM code coverage tool\n");
|
||||
ViewOpts.Debug = DebugDump;
|
||||
|
@ -718,6 +727,9 @@ int CodeCoverageTool::run(Command Cmd, int argc, const char **argv) {
|
|||
::exit(0);
|
||||
}
|
||||
|
||||
ViewOpts.ShowRegionSummary = RegionSummary;
|
||||
ViewOpts.ShowInstantiationSummary = InstantiationSummary;
|
||||
|
||||
return 0;
|
||||
};
|
||||
|
||||
|
|
|
@ -181,18 +181,22 @@ void CoverageReport::render(const FileCoverageSummary &File,
|
|||
SmallString<256> FileName = File.Name;
|
||||
sys::path::remove_dots(FileName, /*remove_dot_dots=*/true);
|
||||
sys::path::native(FileName);
|
||||
OS << column(FileName, FileReportColumns[0], Column::NoTrim)
|
||||
<< format("%*u", FileReportColumns[1],
|
||||
(unsigned)File.RegionCoverage.NumRegions);
|
||||
Options.colored_ostream(OS, FileCoverageColor) << format(
|
||||
"%*u", FileReportColumns[2], (unsigned)File.RegionCoverage.NotCovered);
|
||||
if (File.RegionCoverage.NumRegions)
|
||||
Options.colored_ostream(OS, FileCoverageColor)
|
||||
<< format("%*.2f", FileReportColumns[3] - 1,
|
||||
File.RegionCoverage.getPercentCovered())
|
||||
<< '%';
|
||||
else
|
||||
OS << column("-", FileReportColumns[3], Column::RightAlignment);
|
||||
OS << column(FileName, FileReportColumns[0], Column::NoTrim);
|
||||
|
||||
if (Options.ShowRegionSummary) {
|
||||
OS << format("%*u", FileReportColumns[1],
|
||||
(unsigned)File.RegionCoverage.NumRegions);
|
||||
Options.colored_ostream(OS, FileCoverageColor) << format(
|
||||
"%*u", FileReportColumns[2], (unsigned)File.RegionCoverage.NotCovered);
|
||||
if (File.RegionCoverage.NumRegions)
|
||||
Options.colored_ostream(OS, FileCoverageColor)
|
||||
<< format("%*.2f", FileReportColumns[3] - 1,
|
||||
File.RegionCoverage.getPercentCovered())
|
||||
<< '%';
|
||||
else
|
||||
OS << column("-", FileReportColumns[3], Column::RightAlignment);
|
||||
}
|
||||
|
||||
OS << format("%*u", FileReportColumns[4],
|
||||
(unsigned)File.FunctionCoverage.NumFunctions);
|
||||
OS << format("%*u", FileReportColumns[5],
|
||||
|
@ -205,18 +209,22 @@ void CoverageReport::render(const FileCoverageSummary &File,
|
|||
<< '%';
|
||||
else
|
||||
OS << column("-", FileReportColumns[6], Column::RightAlignment);
|
||||
OS << format("%*u", FileReportColumns[7],
|
||||
(unsigned)File.InstantiationCoverage.NumFunctions);
|
||||
OS << format("%*u", FileReportColumns[8],
|
||||
(unsigned)(File.InstantiationCoverage.NumFunctions -
|
||||
File.InstantiationCoverage.Executed));
|
||||
if (File.InstantiationCoverage.NumFunctions)
|
||||
Options.colored_ostream(OS, InstantiationCoverageColor)
|
||||
<< format("%*.2f", FileReportColumns[9] - 1,
|
||||
File.InstantiationCoverage.getPercentCovered())
|
||||
<< '%';
|
||||
else
|
||||
OS << column("-", FileReportColumns[9], Column::RightAlignment);
|
||||
|
||||
if (Options.ShowInstantiationSummary) {
|
||||
OS << format("%*u", FileReportColumns[7],
|
||||
(unsigned)File.InstantiationCoverage.NumFunctions);
|
||||
OS << format("%*u", FileReportColumns[8],
|
||||
(unsigned)(File.InstantiationCoverage.NumFunctions -
|
||||
File.InstantiationCoverage.Executed));
|
||||
if (File.InstantiationCoverage.NumFunctions)
|
||||
Options.colored_ostream(OS, InstantiationCoverageColor)
|
||||
<< format("%*.2f", FileReportColumns[9] - 1,
|
||||
File.InstantiationCoverage.getPercentCovered())
|
||||
<< '%';
|
||||
else
|
||||
OS << column("-", FileReportColumns[9], Column::RightAlignment);
|
||||
}
|
||||
|
||||
OS << format("%*u", FileReportColumns[10],
|
||||
(unsigned)File.LineCoverage.NumLines);
|
||||
Options.colored_ostream(OS, LineCoverageColor) << format(
|
||||
|
@ -359,17 +367,19 @@ void CoverageReport::renderFileReports(raw_ostream &OS,
|
|||
Filenames.emplace_back(FCS.Name);
|
||||
adjustColumnWidths(Filenames, {});
|
||||
|
||||
OS << column("Filename", FileReportColumns[0])
|
||||
<< column("Regions", FileReportColumns[1], Column::RightAlignment)
|
||||
<< column("Missed Regions", FileReportColumns[2], Column::RightAlignment)
|
||||
<< column("Cover", FileReportColumns[3], Column::RightAlignment)
|
||||
<< column("Functions", FileReportColumns[4], Column::RightAlignment)
|
||||
OS << column("Filename", FileReportColumns[0]);
|
||||
if (Options.ShowRegionSummary)
|
||||
OS << column("Regions", FileReportColumns[1], Column::RightAlignment)
|
||||
<< column("Missed Regions", FileReportColumns[2], Column::RightAlignment)
|
||||
<< column("Cover", FileReportColumns[3], Column::RightAlignment);
|
||||
OS << column("Functions", FileReportColumns[4], Column::RightAlignment)
|
||||
<< column("Missed Functions", FileReportColumns[5], Column::RightAlignment)
|
||||
<< column("Executed", FileReportColumns[6], Column::RightAlignment)
|
||||
<< column("Instantiations", FileReportColumns[7], Column::RightAlignment)
|
||||
<< column("Missed Insts.", FileReportColumns[8], Column::RightAlignment)
|
||||
<< column("Executed", FileReportColumns[9], Column::RightAlignment)
|
||||
<< column("Lines", FileReportColumns[10], Column::RightAlignment)
|
||||
<< column("Executed", FileReportColumns[6], Column::RightAlignment);
|
||||
if (Options.ShowInstantiationSummary)
|
||||
OS << column("Instantiations", FileReportColumns[7], Column::RightAlignment)
|
||||
<< column("Missed Insts.", FileReportColumns[8], Column::RightAlignment)
|
||||
<< column("Executed", FileReportColumns[9], Column::RightAlignment);
|
||||
OS << column("Lines", FileReportColumns[10], Column::RightAlignment)
|
||||
<< column("Missed Lines", FileReportColumns[11], Column::RightAlignment)
|
||||
<< column("Cover", FileReportColumns[12], Column::RightAlignment) << "\n";
|
||||
renderDivider(FileReportColumns, OS);
|
||||
|
|
|
@ -30,6 +30,8 @@ struct CoverageViewOptions {
|
|||
bool ShowExpandedRegions;
|
||||
bool ShowFunctionInstantiations;
|
||||
bool ShowFullFilenames;
|
||||
bool ShowRegionSummary;
|
||||
bool ShowInstantiationSummary;
|
||||
OutputFormat Format;
|
||||
std::string ShowOutputDirectory;
|
||||
std::vector<std::string> DemanglerOpts;
|
||||
|
|
|
@ -285,12 +285,16 @@ void CoveragePrinterHTML::closeViewFile(OwnedStream OS) {
|
|||
}
|
||||
|
||||
/// Emit column labels for the table in the index.
|
||||
static void emitColumnLabelsForIndex(raw_ostream &OS) {
|
||||
static void emitColumnLabelsForIndex(raw_ostream &OS,
|
||||
const CoverageViewOptions &Opts) {
|
||||
SmallVector<std::string, 4> Columns;
|
||||
Columns.emplace_back(tag("td", "Filename", "column-entry-left"));
|
||||
for (const char *Label : {"Function Coverage", "Instantiation Coverage",
|
||||
"Line Coverage", "Region Coverage"})
|
||||
Columns.emplace_back(tag("td", Label, "column-entry"));
|
||||
Columns.emplace_back(tag("td", "Function Coverage", "column-entry"));
|
||||
if (Opts.ShowInstantiationSummary)
|
||||
Columns.emplace_back(tag("td", "Instantiation Coverage", "column-entry"));
|
||||
Columns.emplace_back(tag("td", "Line Coverage", "column-entry"));
|
||||
if (Opts.ShowRegionSummary)
|
||||
Columns.emplace_back(tag("td", "Region Coverage", "column-entry"));
|
||||
OS << tag("tr", join(Columns.begin(), Columns.end(), ""));
|
||||
}
|
||||
|
||||
|
@ -345,14 +349,16 @@ void CoveragePrinterHTML::emitFileSummary(raw_ostream &OS, StringRef SF,
|
|||
AddCoverageTripleToColumn(FCS.FunctionCoverage.Executed,
|
||||
FCS.FunctionCoverage.NumFunctions,
|
||||
FCS.FunctionCoverage.getPercentCovered());
|
||||
AddCoverageTripleToColumn(FCS.InstantiationCoverage.Executed,
|
||||
FCS.InstantiationCoverage.NumFunctions,
|
||||
FCS.InstantiationCoverage.getPercentCovered());
|
||||
if (Opts.ShowInstantiationSummary)
|
||||
AddCoverageTripleToColumn(FCS.InstantiationCoverage.Executed,
|
||||
FCS.InstantiationCoverage.NumFunctions,
|
||||
FCS.InstantiationCoverage.getPercentCovered());
|
||||
AddCoverageTripleToColumn(FCS.LineCoverage.Covered, FCS.LineCoverage.NumLines,
|
||||
FCS.LineCoverage.getPercentCovered());
|
||||
AddCoverageTripleToColumn(FCS.RegionCoverage.Covered,
|
||||
FCS.RegionCoverage.NumRegions,
|
||||
FCS.RegionCoverage.getPercentCovered());
|
||||
if (Opts.ShowRegionSummary)
|
||||
AddCoverageTripleToColumn(FCS.RegionCoverage.Covered,
|
||||
FCS.RegionCoverage.NumRegions,
|
||||
FCS.RegionCoverage.getPercentCovered());
|
||||
|
||||
OS << tag("tr", join(Columns.begin(), Columns.end(), ""), "light-row");
|
||||
}
|
||||
|
@ -395,7 +401,7 @@ Error CoveragePrinterHTML::createIndexFile(
|
|||
// Emit a table containing links to reports for each file in the covmapping.
|
||||
// Exclude files which don't contain any regions.
|
||||
OSRef << BeginCenteredDiv << BeginTable;
|
||||
emitColumnLabelsForIndex(OSRef);
|
||||
emitColumnLabelsForIndex(OSRef, Opts);
|
||||
FileCoverageSummary Totals("TOTALS");
|
||||
auto FileReports =
|
||||
CoverageReport::prepareFileReports(Coverage, Totals, SourceFiles, Opts);
|
||||
|
|
Loading…
Reference in New Issue