1*65f7ebe7Sibricchi #include "llvm/IR/Function.h"
2*65f7ebe7Sibricchi #include "llvm/IR/Module.h"
3*65f7ebe7Sibricchi #include "llvm/Pass.h"
4*65f7ebe7Sibricchi #include "llvm/Passes/PassBuilder.h"
5*65f7ebe7Sibricchi #include "llvm/Passes/PassPlugin.h"
6*65f7ebe7Sibricchi #include "llvm/Support/CommandLine.h"
7*65f7ebe7Sibricchi #include "llvm/Support/raw_ostream.h"
8*65f7ebe7Sibricchi
9*65f7ebe7Sibricchi #include "llvm/Analysis/InlineOrder.h"
10*65f7ebe7Sibricchi
11*65f7ebe7Sibricchi using namespace llvm;
12*65f7ebe7Sibricchi
13*65f7ebe7Sibricchi namespace {
14*65f7ebe7Sibricchi
15*65f7ebe7Sibricchi class NoFooInlineOrder : public InlineOrder<std::pair<CallBase *, int>> {
16*65f7ebe7Sibricchi public:
NoFooInlineOrder(FunctionAnalysisManager & FAM,const InlineParams & Params,ModuleAnalysisManager & MAM,Module & M)17*65f7ebe7Sibricchi NoFooInlineOrder(FunctionAnalysisManager &FAM, const InlineParams &Params,
18*65f7ebe7Sibricchi ModuleAnalysisManager &MAM, Module &M) {
19*65f7ebe7Sibricchi DefaultInlineOrder = getDefaultInlineOrder(FAM, Params, MAM, M);
20*65f7ebe7Sibricchi }
size()21*65f7ebe7Sibricchi size_t size() override { return DefaultInlineOrder->size(); }
push(const std::pair<CallBase *,int> & Elt)22*65f7ebe7Sibricchi void push(const std::pair<CallBase *, int> &Elt) override {
23*65f7ebe7Sibricchi // We ignore calles named "foo"
24*65f7ebe7Sibricchi if (Elt.first->getCalledFunction()->getName() == "foo") {
25*65f7ebe7Sibricchi DefaultInlineOrder->push(Elt);
26*65f7ebe7Sibricchi }
27*65f7ebe7Sibricchi }
pop()28*65f7ebe7Sibricchi std::pair<CallBase *, int> pop() override {
29*65f7ebe7Sibricchi return DefaultInlineOrder->pop();
30*65f7ebe7Sibricchi }
erase_if(function_ref<bool (std::pair<CallBase *,int>)> Pred)31*65f7ebe7Sibricchi void erase_if(function_ref<bool(std::pair<CallBase *, int>)> Pred) override {
32*65f7ebe7Sibricchi DefaultInlineOrder->erase_if(Pred);
33*65f7ebe7Sibricchi }
34*65f7ebe7Sibricchi
35*65f7ebe7Sibricchi private:
36*65f7ebe7Sibricchi std::unique_ptr<InlineOrder<std::pair<CallBase *, int>>> DefaultInlineOrder;
37*65f7ebe7Sibricchi };
38*65f7ebe7Sibricchi
39*65f7ebe7Sibricchi std::unique_ptr<InlineOrder<std::pair<CallBase *, int>>>
NoFooInlineOrderFactory(FunctionAnalysisManager & FAM,const InlineParams & Params,ModuleAnalysisManager & MAM,Module & M)40*65f7ebe7Sibricchi NoFooInlineOrderFactory(FunctionAnalysisManager &FAM,
41*65f7ebe7Sibricchi const InlineParams &Params, ModuleAnalysisManager &MAM,
42*65f7ebe7Sibricchi Module &M) {
43*65f7ebe7Sibricchi return std::make_unique<NoFooInlineOrder>(FAM, Params, MAM, M);
44*65f7ebe7Sibricchi }
45*65f7ebe7Sibricchi
46*65f7ebe7Sibricchi } // namespace
47*65f7ebe7Sibricchi
48*65f7ebe7Sibricchi /* New PM Registration */
getDefaultDynamicInlineOrderPluginInfo()49*65f7ebe7Sibricchi llvm::PassPluginLibraryInfo getDefaultDynamicInlineOrderPluginInfo() {
50*65f7ebe7Sibricchi return {LLVM_PLUGIN_API_VERSION, "DynamicDefaultInlineOrder",
51*65f7ebe7Sibricchi LLVM_VERSION_STRING, [](PassBuilder &PB) {
52*65f7ebe7Sibricchi // We use the PassBuilder's callback mechanism
53*65f7ebe7Sibricchi // to register our Analysis: this will register
54*65f7ebe7Sibricchi // our PluginInlineOrderAnalysis instance with
55*65f7ebe7Sibricchi // the ModuleAnalysisManager
56*65f7ebe7Sibricchi PB.registerAnalysisRegistrationCallback(
57*65f7ebe7Sibricchi [](ModuleAnalysisManager &MAM) {
58*65f7ebe7Sibricchi MAM.registerPass([] {
59*65f7ebe7Sibricchi // defaultInlineOrderFactory will be
60*65f7ebe7Sibricchi // used to create an InlineOrder
61*65f7ebe7Sibricchi return PluginInlineOrderAnalysis(NoFooInlineOrderFactory);
62*65f7ebe7Sibricchi });
63*65f7ebe7Sibricchi });
64*65f7ebe7Sibricchi }};
65*65f7ebe7Sibricchi }
66*65f7ebe7Sibricchi
67*65f7ebe7Sibricchi extern "C" LLVM_ATTRIBUTE_WEAK ::llvm::PassPluginLibraryInfo
llvmGetPassPluginInfo()68*65f7ebe7Sibricchi llvmGetPassPluginInfo() {
69*65f7ebe7Sibricchi return getDefaultDynamicInlineOrderPluginInfo();
70*65f7ebe7Sibricchi }
71