| #include "llvm/IR/Function.h" |
| #include "llvm/IR/LegacyPassManager.h" |
| #include "llvm/Pass.h" |
| #include "llvm/Passes/PassBuilder.h" |
| #include "llvm/Passes/PassPlugin.h" |
| #include "llvm/Support/CommandLine.h" |
| #include "llvm/Support/raw_ostream.h" |
| |
| using namespace llvm; |
| |
| static cl::opt<bool> Wave("wave-goodbye", cl::init(false), |
| cl::desc("wave good bye")); |
| |
| namespace { |
| |
| bool runBye(Function &F) { |
| if (Wave) { |
| errs() << "Bye: "; |
| errs().write_escaped(F.getName()) << '\n'; |
| } |
| return false; |
| } |
| |
| struct LegacyBye : public FunctionPass { |
| static char ID; |
| LegacyBye() : FunctionPass(ID) {} |
| bool runOnFunction(Function &F) override { return runBye(F); } |
| }; |
| |
| struct Bye : PassInfoMixin<Bye> { |
| PreservedAnalyses run(Function &F, FunctionAnalysisManager &) { |
| if (!runBye(F)) |
| return PreservedAnalyses::all(); |
| return PreservedAnalyses::none(); |
| } |
| }; |
| |
| } // namespace |
| |
| char LegacyBye::ID = 0; |
| |
| static RegisterPass<LegacyBye> X("goodbye", "Good Bye World Pass", |
| false /* Only looks at CFG */, |
| false /* Analysis Pass */); |
| |
| /* New PM Registration */ |
| llvm::PassPluginLibraryInfo getByePluginInfo() { |
| return {LLVM_PLUGIN_API_VERSION, "Bye", LLVM_VERSION_STRING, |
| [](PassBuilder &PB) { |
| PB.registerVectorizerStartEPCallback( |
| [](llvm::FunctionPassManager &PM, OptimizationLevel Level) { |
| PM.addPass(Bye()); |
| }); |
| PB.registerPipelineParsingCallback( |
| [](StringRef Name, llvm::FunctionPassManager &PM, |
| ArrayRef<llvm::PassBuilder::PipelineElement>) { |
| if (Name == "goodbye") { |
| PM.addPass(Bye()); |
| return true; |
| } |
| return false; |
| }); |
| }}; |
| } |
| |
| #ifndef LLVM_BYE_LINK_INTO_TOOLS |
| extern "C" LLVM_ATTRIBUTE_WEAK ::llvm::PassPluginLibraryInfo |
| llvmGetPassPluginInfo() { |
| return getByePluginInfo(); |
| } |
| #endif |