1//===- CoverageFilters.cpp - Function coverage mapping filters ------------===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8// 9// These classes provide filtering for function coverage mapping records. 10// 11//===----------------------------------------------------------------------===// 12 13#include "CoverageFilters.h" 14#include "CoverageSummaryInfo.h" 15#include "llvm/Support/Regex.h" 16#include "llvm/Support/SpecialCaseList.h" 17 18using namespace llvm; 19 20bool NameCoverageFilter::matches( 21 const coverage::CoverageMapping &, 22 const coverage::FunctionRecord &Function) const { 23 StringRef FuncName = Function.Name; 24 return FuncName.contains(Name); 25} 26 27bool NameRegexCoverageFilter::matches( 28 const coverage::CoverageMapping &, 29 const coverage::FunctionRecord &Function) const { 30 return llvm::Regex(Regex).match(Function.Name); 31} 32 33bool NameRegexCoverageFilter::matchesFilename(StringRef Filename) const { 34 return llvm::Regex(Regex).match(Filename); 35} 36 37bool NameAllowlistCoverageFilter::matches( 38 const coverage::CoverageMapping &, 39 const coverage::FunctionRecord &Function) const { 40 return Allowlist.inSection("llvmcov", "allowlist_fun", Function.Name); 41} 42 43bool 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 50bool 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 57void CoverageFilters::push_back(std::unique_ptr<CoverageFilter> Filter) { 58 Filters.push_back(std::move(Filter)); 59} 60 61bool 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 70bool 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 78bool 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