brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.6 KiB · 32633bb Raw
78 lines · cpp
1//===- ValueProfileCollector.cpp - determine what to value profile --------===//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// The implementation of the ValueProfileCollector via ValueProfileCollectorImpl10//11//===----------------------------------------------------------------------===//12 13#include "ValueProfileCollector.h"14#include "ValueProfilePlugins.inc"15#include "llvm/ProfileData/InstrProf.h"16 17using namespace llvm;18 19namespace {20 21/// A plugin-based class that takes an arbitrary number of Plugin types.22/// Each plugin type must satisfy the following API:23///  1) the constructor must take a `Function &f`. Typically, the plugin would24///     scan the function looking for candidates.25///  2) contain a member function with the following signature and name:26///        void run(std::vector<CandidateInfo> &Candidates);27///    such that the plugin would append its result into the vector parameter.28///29/// Plugins are defined in ValueProfilePlugins.inc30template <class... Ts> class PluginChain;31 32/// The type PluginChainFinal is the final chain of plugins that will be used by33/// ValueProfileCollectorImpl.34using PluginChainFinal = PluginChain<VP_PLUGIN_LIST>;35 36template <> class PluginChain<> {37public:38  PluginChain(Function &F, TargetLibraryInfo &TLI) {}39  void get(InstrProfValueKind K, std::vector<CandidateInfo> &Candidates) {}40};41 42template <class PluginT, class... Ts>43class PluginChain<PluginT, Ts...> : public PluginChain<Ts...> {44  PluginT Plugin;45  using Base = PluginChain<Ts...>;46 47public:48  PluginChain(Function &F, TargetLibraryInfo &TLI)49      : PluginChain<Ts...>(F, TLI), Plugin(F, TLI) {}50 51  void get(InstrProfValueKind K, std::vector<CandidateInfo> &Candidates) {52    if (K == PluginT::Kind)53      Plugin.run(Candidates);54    Base::get(K, Candidates);55  }56};57 58} // end anonymous namespace59 60/// ValueProfileCollectorImpl inherits the API of PluginChainFinal.61class ValueProfileCollector::ValueProfileCollectorImpl : public PluginChainFinal {62public:63  using PluginChainFinal::PluginChainFinal;64};65 66ValueProfileCollector::ValueProfileCollector(Function &F,67                                             TargetLibraryInfo &TLI)68    : PImpl(new ValueProfileCollectorImpl(F, TLI)) {}69 70ValueProfileCollector::~ValueProfileCollector() = default;71 72std::vector<CandidateInfo>73ValueProfileCollector::get(InstrProfValueKind Kind) const {74  std::vector<CandidateInfo> Result;75  PImpl->get(Kind, Result);76  return Result;77}78