1 #include "llvm/IR/Function.h" 2 #include "llvm/IR/LegacyPassManager.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 #include "llvm/Transforms/IPO/PassManagerBuilder.h" 9 10 using namespace llvm; 11 12 static cl::opt<bool> Wave("wave-goodbye", cl::init(false), 13 cl::desc("wave good bye")); 14 15 namespace { 16 17 bool runBye(Function &F) { 18 if (Wave) { 19 errs() << "Bye: "; 20 errs().write_escaped(F.getName()) << '\n'; 21 } 22 return false; 23 } 24 25 struct LegacyBye : public FunctionPass { 26 static char ID; 27 LegacyBye() : FunctionPass(ID) {} 28 bool runOnFunction(Function &F) override { return runBye(F); } 29 }; 30 31 struct Bye : PassInfoMixin<Bye> { 32 PreservedAnalyses run(Function &F, FunctionAnalysisManager &) { 33 if (!runBye(F)) 34 return PreservedAnalyses::all(); 35 return PreservedAnalyses::none(); 36 } 37 }; 38 39 } // namespace 40 41 char LegacyBye::ID = 0; 42 43 static RegisterPass<LegacyBye> X("goodbye", "Good Bye World Pass", 44 false /* Only looks at CFG */, 45 false /* Analysis Pass */); 46 47 /* Legacy PM Registration */ 48 static llvm::RegisterStandardPasses RegisterBye( 49 llvm::PassManagerBuilder::EP_VectorizerStart, 50 [](const llvm::PassManagerBuilder &Builder, 51 llvm::legacy::PassManagerBase &PM) { PM.add(new LegacyBye()); }); 52 53 /* New PM Registration */ 54 llvm::PassPluginLibraryInfo getByePluginInfo() { 55 return {LLVM_PLUGIN_API_VERSION, "Bye", LLVM_VERSION_STRING, 56 [](PassBuilder &PB) { 57 PB.registerVectorizerStartEPCallback( 58 [](llvm::FunctionPassManager &PM, 59 llvm::PassBuilder::OptimizationLevel Level) { 60 PM.addPass(Bye()); 61 }); 62 PB.registerPipelineParsingCallback( 63 [](StringRef Name, llvm::FunctionPassManager &PM, 64 ArrayRef<llvm::PassBuilder::PipelineElement>) { 65 if (Name == "goodbye") { 66 PM.addPass(Bye()); 67 return true; 68 } 69 return false; 70 }); 71 }}; 72 } 73 74 #ifndef LLVM_BYE_LINK_INTO_TOOLS 75 extern "C" LLVM_ATTRIBUTE_WEAK ::llvm::PassPluginLibraryInfo 76 llvmGetPassPluginInfo() { 77 return getByePluginInfo(); 78 } 79 #endif 80