brintos

brintos / llvm-project-archived public Read only

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