[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:
Eli Friedman 2017-09-11 22:56:20 +00:00
parent b9b6025328
commit 50479f60c4
7 changed files with 78 additions and 51 deletions

View File

@ -1,8 +1,8 @@
RUN: llvm-profdata merge %S/Inputs/hideUnexecutedSubviews.proftext -o %t.profdata 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 RUN: FileCheck -check-prefix=FILE %s -input-file %t.html.dir/coverage/tmp/showTemplateInstantiations.cpp.html
FILE: Unexecuted instantiation: _Z4funcIbEiT_ FILE: Unexecuted instantiation: _Z4funcIbEiT_

View File

@ -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 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 // 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

View File

@ -80,14 +80,11 @@ int main() { // TEXT: [[@LINE]]| 161|int main(
// HTML-INDEX-LABEL: <table> // HTML-INDEX-LABEL: <table>
// HTML-INDEX: <td class='column-entry-left'>Filename</td> // HTML-INDEX: <td class='column-entry-left'>Filename</td>
// HTML-INDEX: <td class='column-entry'>Function Coverage</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'>Line Coverage</td>
// HTML-INDEX: <td class='column-entry'>Region Coverage</td> // HTML-INDEX: <td class='column-entry'>Region Coverage</td>
// HTML-INDEX: <a href='coverage{{.*}}showLineExecutionCounts.cpp.html'{{.*}}showLineExecutionCounts.cpp</a> // HTML-INDEX: <a href='coverage{{.*}}showLineExecutionCounts.cpp.html'{{.*}}showLineExecutionCounts.cpp</a>
// HTML-INDEX: <td class='column-entry-green'> // HTML-INDEX: <td class='column-entry-green'>
// HTML-INDEX: 100.00% (1/1) // 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: <td class='column-entry-yellow'>
// HTML-INDEX: 80.00% (16/20) // HTML-INDEX: 80.00% (16/20)
// HTML-INDEX: <td class='column-entry-red'> // HTML-INDEX: <td class='column-entry-red'>

View File

@ -608,6 +608,15 @@ int CodeCoverageTool::run(Command Cmd, int argc, const char **argv) {
cl::list<std::string> DemanglerOpts( cl::list<std::string> DemanglerOpts(
"Xdemangler", cl::desc("<demangler-path>|<demangler-option>")); "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 { auto commandLineParser = [&, this](int argc, const char **argv) -> int {
cl::ParseCommandLineOptions(argc, argv, "LLVM code coverage tool\n"); cl::ParseCommandLineOptions(argc, argv, "LLVM code coverage tool\n");
ViewOpts.Debug = DebugDump; ViewOpts.Debug = DebugDump;
@ -718,6 +727,9 @@ int CodeCoverageTool::run(Command Cmd, int argc, const char **argv) {
::exit(0); ::exit(0);
} }
ViewOpts.ShowRegionSummary = RegionSummary;
ViewOpts.ShowInstantiationSummary = InstantiationSummary;
return 0; return 0;
}; };

View File

@ -181,18 +181,22 @@ void CoverageReport::render(const FileCoverageSummary &File,
SmallString<256> FileName = File.Name; SmallString<256> FileName = File.Name;
sys::path::remove_dots(FileName, /*remove_dot_dots=*/true); sys::path::remove_dots(FileName, /*remove_dot_dots=*/true);
sys::path::native(FileName); sys::path::native(FileName);
OS << column(FileName, FileReportColumns[0], Column::NoTrim) OS << column(FileName, FileReportColumns[0], Column::NoTrim);
<< format("%*u", FileReportColumns[1],
(unsigned)File.RegionCoverage.NumRegions); if (Options.ShowRegionSummary) {
Options.colored_ostream(OS, FileCoverageColor) << format( OS << format("%*u", FileReportColumns[1],
"%*u", FileReportColumns[2], (unsigned)File.RegionCoverage.NotCovered); (unsigned)File.RegionCoverage.NumRegions);
if (File.RegionCoverage.NumRegions) Options.colored_ostream(OS, FileCoverageColor) << format(
Options.colored_ostream(OS, FileCoverageColor) "%*u", FileReportColumns[2], (unsigned)File.RegionCoverage.NotCovered);
<< format("%*.2f", FileReportColumns[3] - 1, if (File.RegionCoverage.NumRegions)
File.RegionCoverage.getPercentCovered()) Options.colored_ostream(OS, FileCoverageColor)
<< '%'; << format("%*.2f", FileReportColumns[3] - 1,
else File.RegionCoverage.getPercentCovered())
OS << column("-", FileReportColumns[3], Column::RightAlignment); << '%';
else
OS << column("-", FileReportColumns[3], Column::RightAlignment);
}
OS << format("%*u", FileReportColumns[4], OS << format("%*u", FileReportColumns[4],
(unsigned)File.FunctionCoverage.NumFunctions); (unsigned)File.FunctionCoverage.NumFunctions);
OS << format("%*u", FileReportColumns[5], OS << format("%*u", FileReportColumns[5],
@ -205,18 +209,22 @@ void CoverageReport::render(const FileCoverageSummary &File,
<< '%'; << '%';
else else
OS << column("-", FileReportColumns[6], Column::RightAlignment); OS << column("-", FileReportColumns[6], Column::RightAlignment);
OS << format("%*u", FileReportColumns[7],
(unsigned)File.InstantiationCoverage.NumFunctions); if (Options.ShowInstantiationSummary) {
OS << format("%*u", FileReportColumns[8], OS << format("%*u", FileReportColumns[7],
(unsigned)(File.InstantiationCoverage.NumFunctions - (unsigned)File.InstantiationCoverage.NumFunctions);
File.InstantiationCoverage.Executed)); OS << format("%*u", FileReportColumns[8],
if (File.InstantiationCoverage.NumFunctions) (unsigned)(File.InstantiationCoverage.NumFunctions -
Options.colored_ostream(OS, InstantiationCoverageColor) File.InstantiationCoverage.Executed));
<< format("%*.2f", FileReportColumns[9] - 1, if (File.InstantiationCoverage.NumFunctions)
File.InstantiationCoverage.getPercentCovered()) Options.colored_ostream(OS, InstantiationCoverageColor)
<< '%'; << format("%*.2f", FileReportColumns[9] - 1,
else File.InstantiationCoverage.getPercentCovered())
OS << column("-", FileReportColumns[9], Column::RightAlignment); << '%';
else
OS << column("-", FileReportColumns[9], Column::RightAlignment);
}
OS << format("%*u", FileReportColumns[10], OS << format("%*u", FileReportColumns[10],
(unsigned)File.LineCoverage.NumLines); (unsigned)File.LineCoverage.NumLines);
Options.colored_ostream(OS, LineCoverageColor) << format( Options.colored_ostream(OS, LineCoverageColor) << format(
@ -359,17 +367,19 @@ void CoverageReport::renderFileReports(raw_ostream &OS,
Filenames.emplace_back(FCS.Name); Filenames.emplace_back(FCS.Name);
adjustColumnWidths(Filenames, {}); adjustColumnWidths(Filenames, {});
OS << column("Filename", FileReportColumns[0]) OS << column("Filename", FileReportColumns[0]);
<< column("Regions", FileReportColumns[1], Column::RightAlignment) if (Options.ShowRegionSummary)
<< column("Missed Regions", FileReportColumns[2], Column::RightAlignment) OS << column("Regions", FileReportColumns[1], Column::RightAlignment)
<< column("Cover", FileReportColumns[3], Column::RightAlignment) << column("Missed Regions", FileReportColumns[2], Column::RightAlignment)
<< column("Functions", FileReportColumns[4], Column::RightAlignment) << column("Cover", FileReportColumns[3], Column::RightAlignment);
OS << column("Functions", FileReportColumns[4], Column::RightAlignment)
<< column("Missed Functions", FileReportColumns[5], Column::RightAlignment) << column("Missed Functions", FileReportColumns[5], Column::RightAlignment)
<< column("Executed", FileReportColumns[6], Column::RightAlignment) << column("Executed", FileReportColumns[6], Column::RightAlignment);
<< column("Instantiations", FileReportColumns[7], Column::RightAlignment) if (Options.ShowInstantiationSummary)
<< column("Missed Insts.", FileReportColumns[8], Column::RightAlignment) OS << column("Instantiations", FileReportColumns[7], Column::RightAlignment)
<< column("Executed", FileReportColumns[9], Column::RightAlignment) << column("Missed Insts.", FileReportColumns[8], Column::RightAlignment)
<< column("Lines", FileReportColumns[10], Column::RightAlignment) << column("Executed", FileReportColumns[9], Column::RightAlignment);
OS << column("Lines", FileReportColumns[10], Column::RightAlignment)
<< column("Missed Lines", FileReportColumns[11], Column::RightAlignment) << column("Missed Lines", FileReportColumns[11], Column::RightAlignment)
<< column("Cover", FileReportColumns[12], Column::RightAlignment) << "\n"; << column("Cover", FileReportColumns[12], Column::RightAlignment) << "\n";
renderDivider(FileReportColumns, OS); renderDivider(FileReportColumns, OS);

View File

@ -30,6 +30,8 @@ struct CoverageViewOptions {
bool ShowExpandedRegions; bool ShowExpandedRegions;
bool ShowFunctionInstantiations; bool ShowFunctionInstantiations;
bool ShowFullFilenames; bool ShowFullFilenames;
bool ShowRegionSummary;
bool ShowInstantiationSummary;
OutputFormat Format; OutputFormat Format;
std::string ShowOutputDirectory; std::string ShowOutputDirectory;
std::vector<std::string> DemanglerOpts; std::vector<std::string> DemanglerOpts;

View File

@ -285,12 +285,16 @@ void CoveragePrinterHTML::closeViewFile(OwnedStream OS) {
} }
/// Emit column labels for the table in the index. /// 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; SmallVector<std::string, 4> Columns;
Columns.emplace_back(tag("td", "Filename", "column-entry-left")); Columns.emplace_back(tag("td", "Filename", "column-entry-left"));
for (const char *Label : {"Function Coverage", "Instantiation Coverage", Columns.emplace_back(tag("td", "Function Coverage", "column-entry"));
"Line Coverage", "Region Coverage"}) if (Opts.ShowInstantiationSummary)
Columns.emplace_back(tag("td", Label, "column-entry")); 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(), "")); OS << tag("tr", join(Columns.begin(), Columns.end(), ""));
} }
@ -345,14 +349,16 @@ void CoveragePrinterHTML::emitFileSummary(raw_ostream &OS, StringRef SF,
AddCoverageTripleToColumn(FCS.FunctionCoverage.Executed, AddCoverageTripleToColumn(FCS.FunctionCoverage.Executed,
FCS.FunctionCoverage.NumFunctions, FCS.FunctionCoverage.NumFunctions,
FCS.FunctionCoverage.getPercentCovered()); FCS.FunctionCoverage.getPercentCovered());
AddCoverageTripleToColumn(FCS.InstantiationCoverage.Executed, if (Opts.ShowInstantiationSummary)
FCS.InstantiationCoverage.NumFunctions, AddCoverageTripleToColumn(FCS.InstantiationCoverage.Executed,
FCS.InstantiationCoverage.getPercentCovered()); FCS.InstantiationCoverage.NumFunctions,
FCS.InstantiationCoverage.getPercentCovered());
AddCoverageTripleToColumn(FCS.LineCoverage.Covered, FCS.LineCoverage.NumLines, AddCoverageTripleToColumn(FCS.LineCoverage.Covered, FCS.LineCoverage.NumLines,
FCS.LineCoverage.getPercentCovered()); FCS.LineCoverage.getPercentCovered());
AddCoverageTripleToColumn(FCS.RegionCoverage.Covered, if (Opts.ShowRegionSummary)
FCS.RegionCoverage.NumRegions, AddCoverageTripleToColumn(FCS.RegionCoverage.Covered,
FCS.RegionCoverage.getPercentCovered()); FCS.RegionCoverage.NumRegions,
FCS.RegionCoverage.getPercentCovered());
OS << tag("tr", join(Columns.begin(), Columns.end(), ""), "light-row"); 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. // Emit a table containing links to reports for each file in the covmapping.
// Exclude files which don't contain any regions. // Exclude files which don't contain any regions.
OSRef << BeginCenteredDiv << BeginTable; OSRef << BeginCenteredDiv << BeginTable;
emitColumnLabelsForIndex(OSRef); emitColumnLabelsForIndex(OSRef, Opts);
FileCoverageSummary Totals("TOTALS"); FileCoverageSummary Totals("TOTALS");
auto FileReports = auto FileReports =
CoverageReport::prepareFileReports(Coverage, Totals, SourceFiles, Opts); CoverageReport::prepareFileReports(Coverage, Totals, SourceFiles, Opts);