Преглед на файлове

[llvm-cov] Generate "report" for given source paths if sources are specified.

Summary:
Documentation says that user can specify sources for both "show" and
"report" commands. "Show" command respects specified sources, but "report" does
not. It is useful to have both "show" and "report" generated for specified
sources. Also added tests to for both commands with sources specified.

Reviewers: vsk, kcc

Reviewed By: vsk

Differential Revision: https://reviews.llvm.org/D38860

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@315685 91177308-0d34-0410-b5e6-96231b3b80d8
Max Moroz преди 7 години
родител
ревизия
b5d60b8846

+ 5 - 0
test/tools/llvm-cov/Inputs/sources_specified/abs.h

@@ -0,0 +1,5 @@
+int abs(int x) {
+  if (x < 0)
+    return -x;
+  return x;
+}

+ 3 - 0
test/tools/llvm-cov/Inputs/sources_specified/extra/dec.h

@@ -0,0 +1,3 @@
+int dec(int x) {
+  return x + 1;
+}

+ 3 - 0
test/tools/llvm-cov/Inputs/sources_specified/extra/inc.h

@@ -0,0 +1,3 @@
+int inc(int x) {
+  return x + 1;
+}

+ 9 - 0
test/tools/llvm-cov/Inputs/sources_specified/main.cc

@@ -0,0 +1,9 @@
+#include "abs.h"
+#include "extra/dec.h"
+#include "extra/inc.h"
+
+int main() {
+  int x = 0;
+  inc(x);
+  return abs(x);
+}

BIN
test/tools/llvm-cov/Inputs/sources_specified/main.covmapping


BIN
test/tools/llvm-cov/Inputs/sources_specified/main.profdata


+ 28 - 0
test/tools/llvm-cov/sources-specified.test

@@ -0,0 +1,28 @@
+RUN: llvm-cov report -instr-profile %S/Inputs/sources_specified/main.profdata \
+RUN:   %S/Inputs/sources_specified/main.covmapping \
+RUN:   %S/Inputs/sources_specified/main.cc %S/Inputs/sources_specified/extra \
+RUN:   | FileCheck -check-prefix=REPORT %s
+
+RUN: llvm-cov show -instr-profile %S/Inputs/sources_specified/main.profdata \
+RUN:   %S/Inputs/sources_specified/main.covmapping \
+RUN:   %S/Inputs/sources_specified/main.cc %S/Inputs/sources_specified/extra \
+RUN:   | FileCheck -check-prefix=SHOW %s
+
+
+REPORT: {{^}}main.cc{{.*}}
+REPORT: {{^}}extra{{[/\\]}}{{dec|inc}}.h{{.*}}
+REPORT: {{^}}extra{{[/\\]}}{{dec|inc}}.h{{.*}}
+REPORT-NOT: {{^}}abs.h{{.*}}
+
+SHOW: {{.*}}main.cc{{.*}}
+SHOW: {{.*}}extra{{[/\\]}}{{dec|inc}}.h{{.*}}
+SHOW: {{.*}}extra{{[/\\]}}{{dec|inc}}.h{{.*}}
+SHOW-NOT: {{.*}}abs.h{{.*}}
+
+Instructions for regenerating the test:
+
+clang -mllvm -enable-name-compression=false -fprofile-instr-generate -fcoverage-mapping main.cc -o main
+
+LLVM_PROFILE_FILE="main.raw" ./main
+llvm-profdata merge main.raw -o main.profdata
+llvm-cov convert-for-testing ./main -o ./main.covmapping

+ 4 - 1
tools/llvm-cov/CodeCoverage.cpp

@@ -947,7 +947,10 @@ int CodeCoverageTool::report(int argc, const char **argv,
 
   CoverageReport Report(ViewOpts, *Coverage.get());
   if (!ShowFunctionSummaries) {
-    Report.renderFileReports(llvm::outs());
+    if (SourceFiles.empty())
+      Report.renderFileReports(llvm::outs());
+    else
+      Report.renderFileReports(llvm::outs(), SourceFiles);
   } else {
     if (SourceFiles.empty()) {
       error("Source files must be specified when -show-functions=true is "

+ 6 - 1
tools/llvm-cov/CoverageReport.cpp

@@ -364,7 +364,12 @@ void CoverageReport::renderFileReports(raw_ostream &OS) const {
   std::vector<std::string> UniqueSourceFiles;
   for (StringRef SF : Coverage.getUniqueSourceFiles())
     UniqueSourceFiles.emplace_back(SF.str());
-  renderFileReports(OS, UniqueSourceFiles, CoverageFiltersMatchAll());
+  renderFileReports(OS, UniqueSourceFiles);
+}
+
+void CoverageReport::renderFileReports(
+    raw_ostream &OS, ArrayRef<std::string> Files) const {
+  renderFileReports(OS, Files, CoverageFiltersMatchAll());
 }
 
 void CoverageReport::renderFileReports(

+ 3 - 0
tools/llvm-cov/CoverageReport.h

@@ -47,6 +47,9 @@ public:
   /// Render file reports for every unique file in the coverage mapping.
   void renderFileReports(raw_ostream &OS) const;
 
+  /// Render file reports for the files specified in \p Files.
+  void renderFileReports(raw_ostream &OS, ArrayRef<std::string> Files) const;
+
   /// Render file reports for the files specified in \p Files and the functions
   /// in \p Filters.
   void renderFileReports(raw_ostream &OS, ArrayRef<std::string> Files,