CoverageFilters.h revision 303975
1//===- CoverageFilters.h - 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#ifndef LLVM_COV_COVERAGEFILTERS_H
15#define LLVM_COV_COVERAGEFILTERS_H
16
17#include "llvm/ProfileData/CoverageMapping.h"
18#include <memory>
19#include <vector>
20
21namespace llvm {
22
23/// \brief Matches specific functions that pass the requirement of this filter.
24class CoverageFilter {
25public:
26  virtual ~CoverageFilter() {}
27
28  /// \brief Return true if the function passes the requirements of this filter.
29  virtual bool matches(const coverage::FunctionRecord &Function) {
30    return true;
31  }
32};
33
34/// \brief Matches functions that contain a specific string in their name.
35class NameCoverageFilter : public CoverageFilter {
36  StringRef Name;
37
38public:
39  NameCoverageFilter(StringRef Name) : Name(Name) {}
40
41  bool matches(const coverage::FunctionRecord &Function) override;
42};
43
44/// \brief Matches functions whose name matches a certain regular expression.
45class NameRegexCoverageFilter : public CoverageFilter {
46  StringRef Regex;
47
48public:
49  NameRegexCoverageFilter(StringRef Regex) : Regex(Regex) {}
50
51  bool matches(const coverage::FunctionRecord &Function) override;
52};
53
54/// \brief Matches numbers that pass a certain threshold.
55template <typename T> class StatisticThresholdFilter {
56public:
57  enum Operation { LessThan, GreaterThan };
58
59protected:
60  Operation Op;
61  T Threshold;
62
63  StatisticThresholdFilter(Operation Op, T Threshold)
64      : Op(Op), Threshold(Threshold) {}
65
66  /// \brief Return true if the given number is less than
67  /// or greater than the certain threshold.
68  bool PassesThreshold(T Value) const {
69    switch (Op) {
70    case LessThan:
71      return Value < Threshold;
72    case GreaterThan:
73      return Value > Threshold;
74    }
75    return false;
76  }
77};
78
79/// \brief Matches functions whose region coverage percentage
80/// is above/below a certain percentage.
81class RegionCoverageFilter : public CoverageFilter,
82                             public StatisticThresholdFilter<double> {
83public:
84  RegionCoverageFilter(Operation Op, double Threshold)
85      : StatisticThresholdFilter(Op, Threshold) {}
86
87  bool matches(const coverage::FunctionRecord &Function) override;
88};
89
90/// \brief Matches functions whose line coverage percentage
91/// is above/below a certain percentage.
92class LineCoverageFilter : public CoverageFilter,
93                           public StatisticThresholdFilter<double> {
94public:
95  LineCoverageFilter(Operation Op, double Threshold)
96      : StatisticThresholdFilter(Op, Threshold) {}
97
98  bool matches(const coverage::FunctionRecord &Function) override;
99};
100
101/// \brief A collection of filters.
102/// Matches functions that match any filters contained
103/// in an instance of this class.
104class CoverageFilters : public CoverageFilter {
105protected:
106  std::vector<std::unique_ptr<CoverageFilter>> Filters;
107
108public:
109  /// \brief Append a filter to this collection.
110  void push_back(std::unique_ptr<CoverageFilter> Filter);
111
112  bool empty() const { return Filters.empty(); }
113
114  bool matches(const coverage::FunctionRecord &Function) override;
115};
116
117/// \brief A collection of filters.
118/// Matches functions that match all of the filters contained
119/// in an instance of this class.
120class CoverageFiltersMatchAll : public CoverageFilters {
121public:
122  bool matches(const coverage::FunctionRecord &Function) override;
123};
124
125} // namespace llvm
126
127#endif // LLVM_COV_COVERAGEFILTERS_H
128