From 50479f60c40106de3fc5a54b572ccc806f79958a Mon Sep 17 00:00:00 2001 From: Eli Friedman Date: Mon, 11 Sep 2017 22:56:20 +0000 Subject: [PATCH] [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 --- .../llvm-cov/hideUnexecutedSubviews.test | 4 +- llvm/test/tools/llvm-cov/report.cpp | 2 +- .../llvm-cov/showLineExecutionCounts.cpp | 3 - llvm/tools/llvm-cov/CodeCoverage.cpp | 12 +++ llvm/tools/llvm-cov/CoverageReport.cpp | 78 +++++++++++-------- llvm/tools/llvm-cov/CoverageViewOptions.h | 2 + .../tools/llvm-cov/SourceCoverageViewHTML.cpp | 28 ++++--- 7 files changed, 78 insertions(+), 51 deletions(-) diff --git a/llvm/test/tools/llvm-cov/hideUnexecutedSubviews.test b/llvm/test/tools/llvm-cov/hideUnexecutedSubviews.test index f97c0ff176a5..20f0a43fc022 100644 --- a/llvm/test/tools/llvm-cov/hideUnexecutedSubviews.test +++ b/llvm/test/tools/llvm-cov/hideUnexecutedSubviews.test @@ -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_ diff --git a/llvm/test/tools/llvm-cov/report.cpp b/llvm/test/tools/llvm-cov/report.cpp index 92f8158db584..af2ef98d6877 100644 --- a/llvm/test/tools/llvm-cov/report.cpp +++ b/llvm/test/tools/llvm-cov/report.cpp @@ -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 diff --git a/llvm/test/tools/llvm-cov/showLineExecutionCounts.cpp b/llvm/test/tools/llvm-cov/showLineExecutionCounts.cpp index ab0987ee7568..39d31d20dd18 100644 --- a/llvm/test/tools/llvm-cov/showLineExecutionCounts.cpp +++ b/llvm/test/tools/llvm-cov/showLineExecutionCounts.cpp @@ -80,14 +80,11 @@ int main() { // TEXT: [[@LINE]]| 161|int main( // HTML-INDEX-LABEL: // HTML-INDEX: // HTML-INDEX: -// HTML-INDEX: // HTML-INDEX: // HTML-INDEX: // HTML-INDEX: // HTML-INDEX:
FilenameFunction CoverageInstantiation CoverageLine CoverageRegion Coverage // HTML-INDEX: 100.00% (1/1) -// HTML-INDEX: -// HTML-INDEX: 100.00% (1/1) // HTML-INDEX: // HTML-INDEX: 80.00% (16/20) // HTML-INDEX: diff --git a/llvm/tools/llvm-cov/CodeCoverage.cpp b/llvm/tools/llvm-cov/CodeCoverage.cpp index 0e3d67e5691f..5aa27e0181bc 100644 --- a/llvm/tools/llvm-cov/CodeCoverage.cpp +++ b/llvm/tools/llvm-cov/CodeCoverage.cpp @@ -608,6 +608,15 @@ int CodeCoverageTool::run(Command Cmd, int argc, const char **argv) { cl::list DemanglerOpts( "Xdemangler", cl::desc("|")); + cl::opt RegionSummary( + "show-region-summary", cl::Optional, + cl::desc("Show region statistics in summary table"), + cl::init(true)); + + cl::opt 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; }; diff --git a/llvm/tools/llvm-cov/CoverageReport.cpp b/llvm/tools/llvm-cov/CoverageReport.cpp index 29440f433086..e21d74b8fab1 100644 --- a/llvm/tools/llvm-cov/CoverageReport.cpp +++ b/llvm/tools/llvm-cov/CoverageReport.cpp @@ -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); diff --git a/llvm/tools/llvm-cov/CoverageViewOptions.h b/llvm/tools/llvm-cov/CoverageViewOptions.h index 144b373dc634..a071c0aca9e8 100644 --- a/llvm/tools/llvm-cov/CoverageViewOptions.h +++ b/llvm/tools/llvm-cov/CoverageViewOptions.h @@ -30,6 +30,8 @@ struct CoverageViewOptions { bool ShowExpandedRegions; bool ShowFunctionInstantiations; bool ShowFullFilenames; + bool ShowRegionSummary; + bool ShowInstantiationSummary; OutputFormat Format; std::string ShowOutputDirectory; std::vector DemanglerOpts; diff --git a/llvm/tools/llvm-cov/SourceCoverageViewHTML.cpp b/llvm/tools/llvm-cov/SourceCoverageViewHTML.cpp index 03f7a70cd8f3..eeb2a961ee18 100644 --- a/llvm/tools/llvm-cov/SourceCoverageViewHTML.cpp +++ b/llvm/tools/llvm-cov/SourceCoverageViewHTML.cpp @@ -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 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);