1f6c34de1SBardia Mahjour //===- ValueProfileCollector.cpp - determine what to value profile --------===//
2f6c34de1SBardia Mahjour //
3f6c34de1SBardia Mahjour // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4f6c34de1SBardia Mahjour // See https://llvm.org/LICENSE.txt for license information.
5f6c34de1SBardia Mahjour // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6f6c34de1SBardia Mahjour //
7f6c34de1SBardia Mahjour //===----------------------------------------------------------------------===//
8f6c34de1SBardia Mahjour //
9f6c34de1SBardia Mahjour // The implementation of the ValueProfileCollector via ValueProfileCollectorImpl
10f6c34de1SBardia Mahjour //
11f6c34de1SBardia Mahjour //===----------------------------------------------------------------------===//
12f6c34de1SBardia Mahjour
13*ed98c1b3Sserge-sans-paille #include "ValueProfileCollector.h"
14f6c34de1SBardia Mahjour #include "ValueProfilePlugins.inc"
15*ed98c1b3Sserge-sans-paille #include "llvm/ProfileData/InstrProf.h"
16f6c34de1SBardia Mahjour
17f6c34de1SBardia Mahjour using namespace llvm;
18f6c34de1SBardia Mahjour
19f6c34de1SBardia Mahjour namespace {
20f6c34de1SBardia Mahjour
21f6c34de1SBardia Mahjour /// A plugin-based class that takes an arbitrary number of Plugin types.
22f6c34de1SBardia Mahjour /// Each plugin type must satisfy the following API:
23f6c34de1SBardia Mahjour /// 1) the constructor must take a `Function &f`. Typically, the plugin would
24f6c34de1SBardia Mahjour /// scan the function looking for candidates.
25f6c34de1SBardia Mahjour /// 2) contain a member function with the following signature and name:
26f6c34de1SBardia Mahjour /// void run(std::vector<CandidateInfo> &Candidates);
27f6c34de1SBardia Mahjour /// such that the plugin would append its result into the vector parameter.
28f6c34de1SBardia Mahjour ///
29f6c34de1SBardia Mahjour /// Plugins are defined in ValueProfilePlugins.inc
30f6c34de1SBardia Mahjour template <class... Ts> class PluginChain;
31f6c34de1SBardia Mahjour
32f6c34de1SBardia Mahjour /// The type PluginChainFinal is the final chain of plugins that will be used by
33f6c34de1SBardia Mahjour /// ValueProfileCollectorImpl.
34f6c34de1SBardia Mahjour using PluginChainFinal = PluginChain<VP_PLUGIN_LIST>;
35f6c34de1SBardia Mahjour
36f6c34de1SBardia Mahjour template <> class PluginChain<> {
37f6c34de1SBardia Mahjour public:
PluginChain(Function & F,TargetLibraryInfo & TLI)38106ec64fSHiroshi Yamauchi PluginChain(Function &F, TargetLibraryInfo &TLI) {}
get(InstrProfValueKind K,std::vector<CandidateInfo> & Candidates)39f6c34de1SBardia Mahjour void get(InstrProfValueKind K, std::vector<CandidateInfo> &Candidates) {}
40f6c34de1SBardia Mahjour };
41f6c34de1SBardia Mahjour
42f6c34de1SBardia Mahjour template <class PluginT, class... Ts>
43f6c34de1SBardia Mahjour class PluginChain<PluginT, Ts...> : public PluginChain<Ts...> {
44f6c34de1SBardia Mahjour PluginT Plugin;
45f6c34de1SBardia Mahjour using Base = PluginChain<Ts...>;
46f6c34de1SBardia Mahjour
47f6c34de1SBardia Mahjour public:
PluginChain(Function & F,TargetLibraryInfo & TLI)48106ec64fSHiroshi Yamauchi PluginChain(Function &F, TargetLibraryInfo &TLI)
49106ec64fSHiroshi Yamauchi : PluginChain<Ts...>(F, TLI), Plugin(F, TLI) {}
50f6c34de1SBardia Mahjour
get(InstrProfValueKind K,std::vector<CandidateInfo> & Candidates)51f6c34de1SBardia Mahjour void get(InstrProfValueKind K, std::vector<CandidateInfo> &Candidates) {
52f6c34de1SBardia Mahjour if (K == PluginT::Kind)
53f6c34de1SBardia Mahjour Plugin.run(Candidates);
54f6c34de1SBardia Mahjour Base::get(K, Candidates);
55f6c34de1SBardia Mahjour }
56f6c34de1SBardia Mahjour };
57f6c34de1SBardia Mahjour
58f6c34de1SBardia Mahjour } // end anonymous namespace
59f6c34de1SBardia Mahjour
60f6c34de1SBardia Mahjour /// ValueProfileCollectorImpl inherits the API of PluginChainFinal.
61f6c34de1SBardia Mahjour class ValueProfileCollector::ValueProfileCollectorImpl : public PluginChainFinal {
62f6c34de1SBardia Mahjour public:
63f6c34de1SBardia Mahjour using PluginChainFinal::PluginChainFinal;
64f6c34de1SBardia Mahjour };
65f6c34de1SBardia Mahjour
ValueProfileCollector(Function & F,TargetLibraryInfo & TLI)66106ec64fSHiroshi Yamauchi ValueProfileCollector::ValueProfileCollector(Function &F,
67106ec64fSHiroshi Yamauchi TargetLibraryInfo &TLI)
68106ec64fSHiroshi Yamauchi : PImpl(new ValueProfileCollectorImpl(F, TLI)) {}
69f6c34de1SBardia Mahjour
70f6c34de1SBardia Mahjour ValueProfileCollector::~ValueProfileCollector() = default;
71f6c34de1SBardia Mahjour
72f6c34de1SBardia Mahjour std::vector<CandidateInfo>
get(InstrProfValueKind Kind) const73f6c34de1SBardia Mahjour ValueProfileCollector::get(InstrProfValueKind Kind) const {
74f6c34de1SBardia Mahjour std::vector<CandidateInfo> Result;
75f6c34de1SBardia Mahjour PImpl->get(Kind, Result);
76f6c34de1SBardia Mahjour return Result;
77f6c34de1SBardia Mahjour }
78