[llvm] r312227 - [llvm-cov] Read in function names for filtering from a text file.

Sean Eveson via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 31 02:11:31 PDT 2017


Author: seaneveson
Date: Thu Aug 31 02:11:31 2017
New Revision: 312227

URL: http://llvm.org/viewvc/llvm-project?rev=312227&view=rev
Log:
[llvm-cov] Read in function names for filtering from a text file.

Summary: Add a -name-whitelist option, which behaves in the same way as -name, but it reads in multiple function names from the given input file(s).

Reviewers: vsk

Reviewed By: vsk

Subscribers: llvm-commits

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

Added:
    llvm/trunk/test/tools/llvm-cov/Inputs/name_whitelist.covmapping   (with props)
    llvm/trunk/test/tools/llvm-cov/Inputs/name_whitelist.cpp
    llvm/trunk/test/tools/llvm-cov/Inputs/name_whitelist.proftext
    llvm/trunk/test/tools/llvm-cov/Inputs/whitelist1.txt
    llvm/trunk/test/tools/llvm-cov/Inputs/whitelist2.txt
    llvm/trunk/test/tools/llvm-cov/name_whitelist.test
Modified:
    llvm/trunk/docs/CommandGuide/llvm-cov.rst
    llvm/trunk/tools/llvm-cov/CodeCoverage.cpp
    llvm/trunk/tools/llvm-cov/CoverageFilters.cpp
    llvm/trunk/tools/llvm-cov/CoverageFilters.h

Modified: llvm/trunk/docs/CommandGuide/llvm-cov.rst
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/CommandGuide/llvm-cov.rst?rev=312227&r1=312226&r2=312227&view=diff
==============================================================================
--- llvm/trunk/docs/CommandGuide/llvm-cov.rst (original)
+++ llvm/trunk/docs/CommandGuide/llvm-cov.rst Thu Aug 31 02:11:31 2017
@@ -235,6 +235,12 @@ OPTIONS
 
  Show code coverage only for functions with the given name.
 
+.. option:: -name-whitelist=<FILE>
+
+ Show code coverage only for functions listed in the given file. Each line in
+ the file should start with `whitelist_fun:`, immediately followed by the name
+ of the function to accept. This name can be a wildcard expression.
+
 .. option:: -name-regex=<PATTERN>
 
  Show code coverage only for functions that match the given regular expression.

Added: llvm/trunk/test/tools/llvm-cov/Inputs/name_whitelist.covmapping
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-cov/Inputs/name_whitelist.covmapping?rev=312227&view=auto
==============================================================================
Binary file - no diff available.

Propchange: llvm/trunk/test/tools/llvm-cov/Inputs/name_whitelist.covmapping
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: llvm/trunk/test/tools/llvm-cov/Inputs/name_whitelist.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-cov/Inputs/name_whitelist.cpp?rev=312227&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-cov/Inputs/name_whitelist.cpp (added)
+++ llvm/trunk/test/tools/llvm-cov/Inputs/name_whitelist.cpp Thu Aug 31 02:11:31 2017
@@ -0,0 +1,18 @@
+int func1() {
+    return 1;
+}
+int func2() {
+    return 1;
+}
+int func3() {
+    return 1;
+}
+int func4() {
+    return 1;
+}
+int func5() {
+    return 1;
+}
+int func6() {
+    return 1;
+}

Added: llvm/trunk/test/tools/llvm-cov/Inputs/name_whitelist.proftext
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-cov/Inputs/name_whitelist.proftext?rev=312227&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-cov/Inputs/name_whitelist.proftext (added)
+++ llvm/trunk/test/tools/llvm-cov/Inputs/name_whitelist.proftext Thu Aug 31 02:11:31 2017
@@ -0,0 +1,56 @@
+_Z5func1v
+# Func Hash:
+0
+# Num Counters:
+1
+# Counter Values:
+0
+
+_Z5func2v
+# Func Hash:
+0
+# Num Counters:
+1
+# Counter Values:
+0
+
+_Z5func3v
+# Func Hash:
+0
+# Num Counters:
+1
+# Counter Values:
+0
+
+_Z5func4v
+# Func Hash:
+0
+# Num Counters:
+1
+# Counter Values:
+0
+
+main
+# Func Hash:
+0
+# Num Counters:
+1
+# Counter Values:
+1
+
+_Z5func5v
+# Func Hash:
+0
+# Num Counters:
+1
+# Counter Values:
+0
+
+_Z5func6v
+# Func Hash:
+0
+# Num Counters:
+1
+# Counter Values:
+0
+

Added: llvm/trunk/test/tools/llvm-cov/Inputs/whitelist1.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-cov/Inputs/whitelist1.txt?rev=312227&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-cov/Inputs/whitelist1.txt (added)
+++ llvm/trunk/test/tools/llvm-cov/Inputs/whitelist1.txt Thu Aug 31 02:11:31 2017
@@ -0,0 +1,4 @@
+# Comment
+
+whitelist_fun:*func1*
+whitelist_fun:*func2*

Added: llvm/trunk/test/tools/llvm-cov/Inputs/whitelist2.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-cov/Inputs/whitelist2.txt?rev=312227&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-cov/Inputs/whitelist2.txt (added)
+++ llvm/trunk/test/tools/llvm-cov/Inputs/whitelist2.txt Thu Aug 31 02:11:31 2017
@@ -0,0 +1,2 @@
+whitelist_fun:*func3*
+whitelist_fun:*func4*

Added: llvm/trunk/test/tools/llvm-cov/name_whitelist.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-cov/name_whitelist.test?rev=312227&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-cov/name_whitelist.test (added)
+++ llvm/trunk/test/tools/llvm-cov/name_whitelist.test Thu Aug 31 02:11:31 2017
@@ -0,0 +1,21 @@
+RUN: llvm-profdata merge %S/Inputs/name_whitelist.proftext -o %t.profdata
+
+RUN: llvm-cov show %S/Inputs/name_whitelist.covmapping -instr-profile=%t.profdata -path-equivalence=/tmp,%S/Inputs -name-whitelist=%S/Inputs/whitelist1.txt %S/Inputs/name_whitelist.cpp > %t.one_list
+RUN: FileCheck -input-file=%t.one_list -check-prefix=ONE_WHITELIST %s
+RUN: FileCheck -input-file=%t.one_list -check-prefix=ONE_WHITELIST_NEG %s
+ONE_WHITELIST: _Z5func1v:
+ONE_WHITELIST: _Z5func2v:
+ONE_WHITELIST_NEG-NOT: _Z5func3v:
+ONE_WHITELIST_NEG-NOT: _Z5func4v:
+ONE_WHITELIST_NEG-NOT: _Z5func5v:
+ONE_WHITELIST_NEG-NOT: _Z5func6v:
+
+RUN: llvm-cov show %S/Inputs/name_whitelist.covmapping -instr-profile=%t.profdata -path-equivalence=/tmp,%S/Inputs -name-whitelist=%S/Inputs/whitelist1.txt -name-whitelist=%S/Inputs/whitelist2.txt %S/Inputs/name_whitelist.cpp  > %t.two_list
+RUN: FileCheck -input-file=%t.two_list -check-prefix=TWO_WHITELIST %s
+RUN: FileCheck -input-file=%t.two_list -check-prefix=TWO_WHITELIST_NEG %s
+TWO_WHITELIST: _Z5func1v:
+TWO_WHITELIST: _Z5func2v:
+TWO_WHITELIST: _Z5func3v:
+TWO_WHITELIST: _Z5func4v:
+TWO_WHITELIST_NEG-NOT: _Z5func5v:
+TWO_WHITELIST_NEG-NOT: _Z5func6v:

Modified: llvm/trunk/tools/llvm-cov/CodeCoverage.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-cov/CodeCoverage.cpp?rev=312227&r1=312226&r2=312227&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-cov/CodeCoverage.cpp (original)
+++ llvm/trunk/tools/llvm-cov/CodeCoverage.cpp Thu Aug 31 02:11:31 2017
@@ -150,6 +150,9 @@ private:
   std::mutex LoadedSourceFilesLock;
   std::vector<std::pair<std::string, std::unique_ptr<MemoryBuffer>>>
       LoadedSourceFiles;
+
+  /// Whitelist from -name-whitelist to be used for filtering.
+  std::unique_ptr<SpecialCaseList> NameWhitelist;
 };
 }
 
@@ -561,6 +564,12 @@ int CodeCoverageTool::run(Command Cmd, i
       cl::desc("Show code coverage only for functions with the given name"),
       cl::ZeroOrMore, cl::cat(FilteringCategory));
 
+  cl::list<std::string> NameFilterFiles(
+      "name-whitelist", cl::Optional,
+      cl::desc("Show code coverage only for functions listed in the given "
+               "file"),
+      cl::ZeroOrMore, cl::cat(FilteringCategory));
+
   cl::list<std::string> NameRegexFilters(
       "name-regex", cl::Optional,
       cl::desc("Show code coverage only for functions that match the given "
@@ -643,11 +652,23 @@ int CodeCoverageTool::run(Command Cmd, i
       ViewOpts.DemanglerOpts.swap(DemanglerOpts);
     }
 
+    // Read in -name-whitelist files.
+    if (!NameFilterFiles.empty()) {
+      std::string SpecialCaseListErr;
+      NameWhitelist =
+          SpecialCaseList::create(NameFilterFiles, SpecialCaseListErr);
+      if (!NameWhitelist)
+        error(SpecialCaseListErr);
+    }
+
     // Create the function filters
-    if (!NameFilters.empty() || !NameRegexFilters.empty()) {
+    if (!NameFilters.empty() || NameWhitelist || !NameRegexFilters.empty()) {
       auto NameFilterer = llvm::make_unique<CoverageFilters>();
       for (const auto &Name : NameFilters)
         NameFilterer->push_back(llvm::make_unique<NameCoverageFilter>(Name));
+      if (NameWhitelist)
+        NameFilterer->push_back(
+            llvm::make_unique<NameWhitelistCoverageFilter>(*NameWhitelist));
       for (const auto &Regex : NameRegexFilters)
         NameFilterer->push_back(
             llvm::make_unique<NameRegexCoverageFilter>(Regex));

Modified: llvm/trunk/tools/llvm-cov/CoverageFilters.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-cov/CoverageFilters.cpp?rev=312227&r1=312226&r2=312227&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-cov/CoverageFilters.cpp (original)
+++ llvm/trunk/tools/llvm-cov/CoverageFilters.cpp Thu Aug 31 02:11:31 2017
@@ -27,6 +27,11 @@ NameRegexCoverageFilter::matches(const c
   return llvm::Regex(Regex).match(Function.Name);
 }
 
+bool NameWhitelistCoverageFilter::matches(
+    const coverage::FunctionRecord &Function) {
+  return Whitelist.inSection("whitelist_fun", Function.Name);
+}
+
 bool RegionCoverageFilter::matches(const coverage::FunctionRecord &Function) {
   return PassesThreshold(FunctionCoverageSummary::get(Function)
                              .RegionCoverage.getPercentCovered());

Modified: llvm/trunk/tools/llvm-cov/CoverageFilters.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-cov/CoverageFilters.h?rev=312227&r1=312226&r2=312227&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-cov/CoverageFilters.h (original)
+++ llvm/trunk/tools/llvm-cov/CoverageFilters.h Thu Aug 31 02:11:31 2017
@@ -15,6 +15,7 @@
 #define LLVM_COV_COVERAGEFILTERS_H
 
 #include "llvm/ProfileData/Coverage/CoverageMapping.h"
+#include "llvm/Support/SpecialCaseList.h"
 #include <memory>
 #include <vector>
 
@@ -50,6 +51,18 @@ public:
 
   bool matches(const coverage::FunctionRecord &Function) override;
 };
+
+/// \brief Matches functions whose name appears in a SpecialCaseList in the
+/// whitelist_fun section.
+class NameWhitelistCoverageFilter : public CoverageFilter {
+  const SpecialCaseList &Whitelist;
+
+public:
+  NameWhitelistCoverageFilter(const SpecialCaseList &Whitelist)
+      : Whitelist(Whitelist) {}
+
+  bool matches(const coverage::FunctionRecord &Function) override;
+};
 
 /// \brief Matches numbers that pass a certain threshold.
 template <typename T> class StatisticThresholdFilter {




More information about the llvm-commits mailing list