xref: /llvm-project/llvm/unittests/Analysis/InlineOrderPlugin/InlineOrderPlugin.cpp (revision 65f7ebe72e4ca1b788e13dfbd2f71b5beeffba7d)
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