From d3822e422b1fbdfe171a35c9091e0417fd390bfc 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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@312969 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../llvm-cov/hideUnexecutedSubviews.test | 4 +- test/tools/llvm-cov/report.cpp | 2 +- .../llvm-cov/showLineExecutionCounts.cpp | 3 - tools/llvm-cov/CodeCoverage.cpp | 12 +++ tools/llvm-cov/CoverageReport.cpp | 78 +++++++++++-------- tools/llvm-cov/CoverageViewOptions.h | 2 + tools/llvm-cov/SourceCoverageViewHTML.cpp | 28 ++++--- 7 files changed, 78 insertions(+), 51 deletions(-) diff --git a/test/tools/llvm-cov/hideUnexecutedSubviews.test b/test/tools/llvm-cov/hideUnexecutedSubviews.test index f97c0ff176a..20f0a43fc02 100644 --- a/test/tools/llvm-cov/hideUnexecutedSubviews.test +++ b/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/test/tools/llvm-cov/report.cpp b/test/tools/llvm-cov/report.cpp index 92f8158db58..af2ef98d687 100644 --- a/test/tools/llvm-cov/report.cpp +++ b/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/test/tools/llvm-cov/showLineExecutionCounts.cpp b/test/tools/llvm-cov/showLineExecutionCounts.cpp index ab0987ee756..39d31d20dd1 100644 --- a/test/tools/llvm-cov/showLineExecutionCounts.cpp +++ b/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/tools/llvm-cov/CodeCoverage.cpp b/tools/llvm-cov/CodeCoverage.cpp index 0e3d67e5691..5aa27e0181b 100644 --- a/tools/llvm-cov/CodeCoverage.cpp +++ b/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/tools/llvm-cov/CoverageReport.cpp b/tools/llvm-cov/CoverageReport.cpp index 29440f43308..e21d74b8fab 100644 --- a/tools/llvm-cov/CoverageReport.cpp +++ b/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/tools/llvm-cov/CoverageViewOptions.h b/tools/llvm-cov/CoverageViewOptions.h index 144b373dc63..a071c0aca9e 100644 --- a/tools/llvm-cov/CoverageViewOptions.h +++ b/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/tools/llvm-cov/SourceCoverageViewHTML.cpp b/tools/llvm-cov/SourceCoverageViewHTML.cpp index 03f7a70cd8f..eeb2a961ee1 100644 --- a/tools/llvm-cov/SourceCoverageViewHTML.cpp +++ b/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); -- 2.50.1