Home | History | Annotate | Download | only in llvm-cov
      1 //===- CoverageFilters.cpp - Function coverage mapping filters ------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // These classes provide filtering for function coverage mapping records.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #include "CoverageFilters.h"
     15 #include "CoverageSummaryInfo.h"
     16 #include "llvm/Support/Regex.h"
     17 
     18 using namespace llvm;
     19 
     20 bool NameCoverageFilter::matches(
     21     const coverage::CoverageMapping &,
     22     const coverage::FunctionRecord &Function) const {
     23   StringRef FuncName = Function.Name;
     24   return FuncName.find(Name) != StringRef::npos;
     25 }
     26 
     27 bool NameRegexCoverageFilter::matches(
     28     const coverage::CoverageMapping &,
     29     const coverage::FunctionRecord &Function) const {
     30   return llvm::Regex(Regex).match(Function.Name);
     31 }
     32 
     33 bool NameRegexCoverageFilter::matchesFilename(StringRef Filename) const {
     34   return llvm::Regex(Regex).match(Filename);
     35 }
     36 
     37 bool NameWhitelistCoverageFilter::matches(
     38     const coverage::CoverageMapping &,
     39     const coverage::FunctionRecord &Function) const {
     40   return Whitelist.inSection("llvmcov", "whitelist_fun", Function.Name);
     41 }
     42 
     43 bool RegionCoverageFilter::matches(
     44     const coverage::CoverageMapping &CM,
     45     const coverage::FunctionRecord &Function) const {
     46   return PassesThreshold(FunctionCoverageSummary::get(CM, Function)
     47                              .RegionCoverage.getPercentCovered());
     48 }
     49 
     50 bool LineCoverageFilter::matches(
     51     const coverage::CoverageMapping &CM,
     52     const coverage::FunctionRecord &Function) const {
     53   return PassesThreshold(FunctionCoverageSummary::get(CM, Function)
     54                              .LineCoverage.getPercentCovered());
     55 }
     56 
     57 void CoverageFilters::push_back(std::unique_ptr<CoverageFilter> Filter) {
     58   Filters.push_back(std::move(Filter));
     59 }
     60 
     61 bool CoverageFilters::matches(const coverage::CoverageMapping &CM,
     62                               const coverage::FunctionRecord &Function) const {
     63   for (const auto &Filter : Filters) {
     64     if (Filter->matches(CM, Function))
     65       return true;
     66   }
     67   return false;
     68 }
     69 
     70 bool CoverageFilters::matchesFilename(StringRef Filename) const {
     71   for (const auto &Filter : Filters) {
     72     if (Filter->matchesFilename(Filename))
     73       return true;
     74   }
     75   return false;
     76 }
     77 
     78 bool CoverageFiltersMatchAll::matches(
     79     const coverage::CoverageMapping &CM,
     80     const coverage::FunctionRecord &Function) const {
     81   for (const auto &Filter : Filters) {
     82     if (!Filter->matches(CM, Function))
     83       return false;
     84   }
     85   return true;
     86 }
     87