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