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);