//===- ValueProfileCollector.cpp - determine what to value profile --------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // The implementation of the ValueProfileCollector via ValueProfileCollectorImpl // //===----------------------------------------------------------------------===// #include "ValueProfileCollector.h" #include "ValueProfilePlugins.inc" #include "llvm/ProfileData/InstrProf.h" usingnamespacellvm; namespace { /// A plugin-based class that takes an arbitrary number of Plugin types. /// Each plugin type must satisfy the following API: /// 1) the constructor must take a `Function &f`. Typically, the plugin would /// scan the function looking for candidates. /// 2) contain a member function with the following signature and name: /// void run(std::vector<CandidateInfo> &Candidates); /// such that the plugin would append its result into the vector parameter. /// /// Plugins are defined in ValueProfilePlugins.inc template <class... Ts> class PluginChain; /// The type PluginChainFinal is the final chain of plugins that will be used by /// ValueProfileCollectorImpl. PluginChainFinal; template <> class PluginChain<> { … }; PluginChain<PluginT, Ts...>; } // end anonymous namespace /// ValueProfileCollectorImpl inherits the API of PluginChainFinal. class ValueProfileCollector::ValueProfileCollectorImpl : public PluginChainFinal { … }; ValueProfileCollector::ValueProfileCollector(Function &F, TargetLibraryInfo &TLI) : … { … } ValueProfileCollector::~ValueProfileCollector() = default; std::vector<CandidateInfo> ValueProfileCollector::get(InstrProfValueKind Kind) const { … }