Skip to content

Commit

Permalink
[llvm-cov] Allow branch coverage to be skipped when exporting for LCOV
Browse files Browse the repository at this point in the history
This small patch adds a '--skip-branches' option to the llvm-cov export
options. This option allows branch coverage information to be skipped from the
exported LCOV directives if it's not needed. For now, this only works when
exporting LCOV (which is noted in the option description), but it can be
extended for JSON later if it makes sense.

Differential Revision: https://reviews.llvm.org/D135986
  • Loading branch information
evodius96 committed Oct 14, 2022
1 parent 705e77a commit a921d6e
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 6 deletions.
7 changes: 7 additions & 0 deletions llvm/test/tools/llvm-cov/branch-export-lcov.test
@@ -1,6 +1,7 @@

// RUN: llvm-profdata merge %S/Inputs/branch-showBranchPercentage.proftext -o %t.profdata
// RUN: llvm-cov export --format=lcov %S/Inputs/branch-showBranchPercentage.o32l -instr-profile %t.profdata | FileCheck %s
// RUN: llvm-cov export --format=lcov --skip-branches %S/Inputs/branch-showBranchPercentage.o32l -instr-profile %t.profdata | FileCheck %s --check-prefix=NOBRANCH

// CHECK-DAG: BRDA:14,0,0,1
// CHECK-DAG: BRDA:14,0,1,5
Expand Down Expand Up @@ -39,6 +40,7 @@
// Check recursive macro-expansions.
// RUN: llvm-profdata merge %S/Inputs/branch-macros.proftext -o %t.profdata
// RUN: llvm-cov export --format=lcov %S/Inputs/branch-macros.o32l -instr-profile %t.profdata | FileCheck %s -check-prefix=MACROS
// RUN: llvm-cov export --format=lcov --skip-branches %S/Inputs/branch-macros.o32l -instr-profile %t.profdata | FileCheck %s -check-prefix=NOBRANCH

// MACROS-COUNT-4: BRDA:17
// MACROS-NOT: BRDA:17
Expand Down Expand Up @@ -71,3 +73,8 @@
// MACROS-NOT: BRDA
// MACROS: BRF:40
// MACROS: BRH:24

// NOBRANCH-NOT: BRDA
// NOBRANCH-NOT: BRF
// NOBRANCH-NOT: BRH

5 changes: 5 additions & 0 deletions llvm/tools/llvm-cov/CodeCoverage.cpp
Expand Up @@ -1192,12 +1192,17 @@ int CodeCoverageTool::doExport(int argc, const char **argv,
cl::desc("Don't export per-function data"),
cl::cat(ExportCategory));

cl::opt<bool> SkipBranches("skip-branches", cl::Optional,
cl::desc("Don't export branch data (LCOV)"),
cl::cat(ExportCategory));

auto Err = commandLineParser(argc, argv);
if (Err)
return Err;

ViewOpts.SkipExpansions = SkipExpansions;
ViewOpts.SkipFunctions = SkipFunctions;
ViewOpts.SkipBranches = SkipBranches;

if (ViewOpts.Format != CoverageViewOptions::OutputFormat::Text &&
ViewOpts.Format != CoverageViewOptions::OutputFormat::Lcov) {
Expand Down
15 changes: 9 additions & 6 deletions llvm/tools/llvm-cov/CoverageExporterLcov.cpp
Expand Up @@ -173,7 +173,7 @@ void renderBranchSummary(raw_ostream &OS, const FileCoverageSummary &Summary) {
void renderFile(raw_ostream &OS, const coverage::CoverageMapping &Coverage,
const std::string &Filename,
const FileCoverageSummary &FileReport, bool ExportSummaryOnly,
bool SkipFunctions) {
bool SkipFunctions, bool SkipBranches) {
OS << "SF:" << Filename << '\n';

if (!ExportSummaryOnly && !SkipFunctions) {
Expand All @@ -185,9 +185,11 @@ void renderFile(raw_ostream &OS, const coverage::CoverageMapping &Coverage,
// Calculate and render detailed coverage information for given file.
auto FileCoverage = Coverage.getCoverageForFile(Filename);
renderLineExecutionCounts(OS, FileCoverage);
renderBranchExecutionCounts(OS, Coverage, FileCoverage);
if (!SkipBranches)
renderBranchExecutionCounts(OS, Coverage, FileCoverage);
}
renderBranchSummary(OS, FileReport);
if (!SkipBranches)
renderBranchSummary(OS, FileReport);
renderLineSummary(OS, FileReport);

OS << "end_of_record\n";
Expand All @@ -196,10 +198,11 @@ void renderFile(raw_ostream &OS, const coverage::CoverageMapping &Coverage,
void renderFiles(raw_ostream &OS, const coverage::CoverageMapping &Coverage,
ArrayRef<std::string> SourceFiles,
ArrayRef<FileCoverageSummary> FileReports,
bool ExportSummaryOnly, bool SkipFunctions) {
bool ExportSummaryOnly, bool SkipFunctions,
bool SkipBranches) {
for (unsigned I = 0, E = SourceFiles.size(); I < E; ++I)
renderFile(OS, Coverage, SourceFiles[I], FileReports[I], ExportSummaryOnly,
SkipFunctions);
SkipFunctions, SkipBranches);
}

} // end anonymous namespace
Expand All @@ -218,5 +221,5 @@ void CoverageExporterLcov::renderRoot(ArrayRef<std::string> SourceFiles) {
auto FileReports = CoverageReport::prepareFileReports(Coverage, Totals,
SourceFiles, Options);
renderFiles(OS, Coverage, SourceFiles, FileReports, Options.ExportSummaryOnly,
Options.SkipFunctions);
Options.SkipFunctions, Options.SkipBranches);
}
1 change: 1 addition & 0 deletions llvm/tools/llvm-cov/CoverageViewOptions.h
Expand Up @@ -41,6 +41,7 @@ struct CoverageViewOptions {
bool ExportSummaryOnly;
bool SkipExpansions;
bool SkipFunctions;
bool SkipBranches;
OutputFormat Format;
BranchOutputType ShowBranches;
std::string ShowOutputDirectory;
Expand Down

0 comments on commit a921d6e

Please sign in to comment.