[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-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_
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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'>
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue