1 //===- CoverageFilters.cpp - Function coverage mapping filters ------------===//
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
7 //===----------------------------------------------------------------------===//
9 // These classes provide filtering for function coverage mapping records.
11 //===----------------------------------------------------------------------===//
13 #include "CoverageFilters.h"
14 #include "CoverageSummaryInfo.h"
15 #include "llvm/Support/Regex.h"
16 #include "llvm/Support/SpecialCaseList.h"
20 bool NameCoverageFilter::matches(
21 const coverage::CoverageMapping
&,
22 const coverage::FunctionRecord
&Function
) const {
23 StringRef FuncName
= Function
.Name
;
24 return FuncName
.contains(Name
);
27 bool NameRegexCoverageFilter::matches(
28 const coverage::CoverageMapping
&,
29 const coverage::FunctionRecord
&Function
) const {
30 return llvm::Regex(Regex
).match(Function
.Name
);
33 bool NameRegexCoverageFilter::matchesFilename(StringRef Filename
) const {
34 return llvm::Regex(Regex
).match(Filename
);
37 bool NameAllowlistCoverageFilter::matches(
38 const coverage::CoverageMapping
&,
39 const coverage::FunctionRecord
&Function
) const {
40 return Allowlist
.inSection("llvmcov", "allowlist_fun", Function
.Name
);
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());
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());
57 void CoverageFilters::push_back(std::unique_ptr
<CoverageFilter
> Filter
) {
58 Filters
.push_back(std::move(Filter
));
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
))
70 bool CoverageFilters::matchesFilename(StringRef Filename
) const {
71 for (const auto &Filter
: Filters
) {
72 if (Filter
->matchesFilename(Filename
))
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
))