brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.8 KiB · 3cee23a Raw
162 lines · c
1//===- CoverageFilters.h - 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-exception6//7//===----------------------------------------------------------------------===//8//9// These classes provide filtering for function coverage mapping records.10//11//===----------------------------------------------------------------------===//12 13#ifndef LLVM_COV_COVERAGEFILTERS_H14#define LLVM_COV_COVERAGEFILTERS_H15 16#include "llvm/ADT/StringRef.h"17#include <memory>18#include <vector>19 20namespace llvm {21class SpecialCaseList;22 23namespace coverage {24class CoverageMapping;25struct FunctionRecord;26} // namespace coverage27 28/// Matches specific functions that pass the requirement of this filter.29class CoverageFilter {30public:31  virtual ~CoverageFilter() = default;32 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 {36    return true;37  }38 39  /// Return true if the filename passes the requirements of this filter.40  virtual bool matchesFilename(StringRef Filename) const {41    return true;42  }43};44 45/// Matches functions that contain a specific string in their name.46class NameCoverageFilter : public CoverageFilter {47  StringRef Name;48 49public:50  NameCoverageFilter(StringRef Name) : Name(Name) {}51 52  bool matches(const coverage::CoverageMapping &CM,53               const coverage::FunctionRecord &Function) const override;54};55 56/// Matches functions whose name matches a certain regular expression.57class NameRegexCoverageFilter : public CoverageFilter {58  StringRef Regex;59 60public:61  NameRegexCoverageFilter(StringRef Regex) : Regex(Regex) {}62 63  bool matches(const coverage::CoverageMapping &CM,64               const coverage::FunctionRecord &Function) const override;65 66  bool matchesFilename(StringRef Filename) const override;67};68 69/// Matches functions whose name appears in a SpecialCaseList in the70/// allowlist_fun section.71class NameAllowlistCoverageFilter : public CoverageFilter {72  const SpecialCaseList &Allowlist;73 74public:75  NameAllowlistCoverageFilter(const SpecialCaseList &Allowlist)76      : Allowlist(Allowlist) {}77 78  bool matches(const coverage::CoverageMapping &CM,79               const coverage::FunctionRecord &Function) const override;80};81 82/// Matches numbers that pass a certain threshold.83template <typename T> class StatisticThresholdFilter {84public:85  enum Operation { LessThan, GreaterThan };86 87protected:88  Operation Op;89  T Threshold;90 91  StatisticThresholdFilter(Operation Op, T Threshold)92      : Op(Op), Threshold(Threshold) {}93 94  /// Return true if the given number is less than95  /// or greater than the certain threshold.96  bool PassesThreshold(T Value) const {97    switch (Op) {98    case LessThan:99      return Value < Threshold;100    case GreaterThan:101      return Value > Threshold;102    }103    return false;104  }105};106 107/// Matches functions whose region coverage percentage108/// is above/below a certain percentage.109class RegionCoverageFilter : public CoverageFilter,110                             public StatisticThresholdFilter<double> {111public:112  RegionCoverageFilter(Operation Op, double Threshold)113      : StatisticThresholdFilter(Op, Threshold) {}114 115  bool matches(const coverage::CoverageMapping &CM,116               const coverage::FunctionRecord &Function) const override;117};118 119/// Matches functions whose line coverage percentage120/// is above/below a certain percentage.121class LineCoverageFilter : public CoverageFilter,122                           public StatisticThresholdFilter<double> {123public:124  LineCoverageFilter(Operation Op, double Threshold)125      : StatisticThresholdFilter(Op, Threshold) {}126 127  bool matches(const coverage::CoverageMapping &CM,128               const coverage::FunctionRecord &Function) const override;129};130 131/// A collection of filters.132/// Matches functions that match any filters contained133/// in an instance of this class.134class CoverageFilters : public CoverageFilter {135protected:136  std::vector<std::unique_ptr<CoverageFilter>> Filters;137 138public:139  /// Append a filter to this collection.140  void push_back(std::unique_ptr<CoverageFilter> Filter);141 142  bool empty() const { return Filters.empty(); }143 144  bool matches(const coverage::CoverageMapping &CM,145               const coverage::FunctionRecord &Function) const override;146 147  bool matchesFilename(StringRef Filename) const override;148};149 150/// A collection of filters.151/// Matches functions that match all of the filters contained152/// in an instance of this class.153class CoverageFiltersMatchAll : public CoverageFilters {154public:155  bool matches(const coverage::CoverageMapping &CM,156               const coverage::FunctionRecord &Function) const override;157};158 159} // namespace llvm160 161#endif // LLVM_COV_COVERAGEFILTERS_H162