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