1 //===- CoverageFilters.h - 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 #ifndef LLVM_COV_COVERAGEFILTERS_H
14 #define LLVM_COV_COVERAGEFILTERS_H
16 #include "llvm/ADT/StringRef.h"
21 class SpecialCaseList
;
24 class CoverageMapping
;
25 struct FunctionRecord
;
26 } // namespace coverage
28 /// Matches specific functions that pass the requirement of this filter.
29 class CoverageFilter
{
31 virtual ~CoverageFilter() {}
33 /// Return true if the function passes the requirements of this filter.
34 virtual bool matches(const coverage::CoverageMapping
&CM
,
35 const coverage::FunctionRecord
&Function
) const {
39 /// Return true if the filename passes the requirements of this filter.
40 virtual bool matchesFilename(StringRef Filename
) const {
45 /// Matches functions that contain a specific string in their name.
46 class NameCoverageFilter
: public CoverageFilter
{
50 NameCoverageFilter(StringRef Name
) : Name(Name
) {}
52 bool matches(const coverage::CoverageMapping
&CM
,
53 const coverage::FunctionRecord
&Function
) const override
;
56 /// Matches functions whose name matches a certain regular expression.
57 class NameRegexCoverageFilter
: public CoverageFilter
{
61 NameRegexCoverageFilter(StringRef Regex
) : Regex(Regex
) {}
63 bool matches(const coverage::CoverageMapping
&CM
,
64 const coverage::FunctionRecord
&Function
) const override
;
66 bool matchesFilename(StringRef Filename
) const override
;
69 /// Matches functions whose name appears in a SpecialCaseList in the
70 /// allowlist_fun section.
71 class NameAllowlistCoverageFilter
: public CoverageFilter
{
72 const SpecialCaseList
&Allowlist
;
75 NameAllowlistCoverageFilter(const SpecialCaseList
&Allowlist
)
76 : Allowlist(Allowlist
) {}
78 bool matches(const coverage::CoverageMapping
&CM
,
79 const coverage::FunctionRecord
&Function
) const override
;
82 /// Matches numbers that pass a certain threshold.
83 template <typename T
> class StatisticThresholdFilter
{
85 enum Operation
{ LessThan
, GreaterThan
};
91 StatisticThresholdFilter(Operation Op
, T Threshold
)
92 : Op(Op
), Threshold(Threshold
) {}
94 /// Return true if the given number is less than
95 /// or greater than the certain threshold.
96 bool PassesThreshold(T Value
) const {
99 return Value
< Threshold
;
101 return Value
> Threshold
;
107 /// Matches functions whose region coverage percentage
108 /// is above/below a certain percentage.
109 class RegionCoverageFilter
: public CoverageFilter
,
110 public StatisticThresholdFilter
<double> {
112 RegionCoverageFilter(Operation Op
, double Threshold
)
113 : StatisticThresholdFilter(Op
, Threshold
) {}
115 bool matches(const coverage::CoverageMapping
&CM
,
116 const coverage::FunctionRecord
&Function
) const override
;
119 /// Matches functions whose line coverage percentage
120 /// is above/below a certain percentage.
121 class LineCoverageFilter
: public CoverageFilter
,
122 public StatisticThresholdFilter
<double> {
124 LineCoverageFilter(Operation Op
, double Threshold
)
125 : StatisticThresholdFilter(Op
, Threshold
) {}
127 bool matches(const coverage::CoverageMapping
&CM
,
128 const coverage::FunctionRecord
&Function
) const override
;
131 /// A collection of filters.
132 /// Matches functions that match any filters contained
133 /// in an instance of this class.
134 class CoverageFilters
: public CoverageFilter
{
136 std::vector
<std::unique_ptr
<CoverageFilter
>> Filters
;
139 /// Append a filter to this collection.
140 void push_back(std::unique_ptr
<CoverageFilter
> Filter
);
142 bool empty() const { return Filters
.empty(); }
144 bool matches(const coverage::CoverageMapping
&CM
,
145 const coverage::FunctionRecord
&Function
) const override
;
147 bool matchesFilename(StringRef Filename
) const override
;
150 /// A collection of filters.
151 /// Matches functions that match all of the filters contained
152 /// in an instance of this class.
153 class CoverageFiltersMatchAll
: public CoverageFilters
{
155 bool matches(const coverage::CoverageMapping
&CM
,
156 const coverage::FunctionRecord
&Function
) const override
;
161 #endif // LLVM_COV_COVERAGEFILTERS_H