137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//===- CoverageFilters.cpp - Function coverage mapping filters ------------===//
237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//
337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//                     The LLVM Compiler Infrastructure
437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//
537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines// This file is distributed under the University of Illinois Open Source
637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines// License. See LICENSE.TXT for details.
737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//
837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//===----------------------------------------------------------------------===//
937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//
1037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines// These classes provide filtering for function coverage mapping records.
1137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//
1237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//===----------------------------------------------------------------------===//
1337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
1437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "CoverageFilters.h"
1537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "CoverageSummaryInfo.h"
1637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/Support/Regex.h"
1737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
1837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesusing namespace llvm;
1937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
2037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesbool NameCoverageFilter::matches(const coverage::FunctionRecord &Function) {
2137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  StringRef FuncName = Function.Name;
2237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  return FuncName.find(Name) != StringRef::npos;
2337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}
2437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
2537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesbool
2637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen HinesNameRegexCoverageFilter::matches(const coverage::FunctionRecord &Function) {
2737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  return llvm::Regex(Regex).match(Function.Name);
2837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}
2937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
3037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesbool RegionCoverageFilter::matches(const coverage::FunctionRecord &Function) {
3137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  return PassesThreshold(FunctionCoverageSummary::get(Function)
3237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                             .RegionCoverage.getPercentCovered());
3337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}
3437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
3537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesbool LineCoverageFilter::matches(const coverage::FunctionRecord &Function) {
3637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  return PassesThreshold(
3737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      FunctionCoverageSummary::get(Function).LineCoverage.getPercentCovered());
3837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}
3937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
4037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesvoid CoverageFilters::push_back(std::unique_ptr<CoverageFilter> Filter) {
4137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  Filters.push_back(std::move(Filter));
4237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}
4337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
4437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesbool CoverageFilters::matches(const coverage::FunctionRecord &Function) {
4537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  for (const auto &Filter : Filters) {
4637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    if (Filter->matches(Function))
4737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      return true;
4837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
4937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  return false;
5037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}
5137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
5237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesbool
5337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen HinesCoverageFiltersMatchAll::matches(const coverage::FunctionRecord &Function) {
5437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  for (const auto &Filter : Filters) {
5537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    if (!Filter->matches(Function))
5637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      return false;
5737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
5837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  return true;
5937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}
60