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
9using namespace llvm;
10
11static cl::opt<bool> Wave("wave-goodbye", cl::init(Val: false),
12 cl::desc("wave good bye"));
13
14namespace {
15
16bool runBye(Function &F) {
17 if (Wave) {
18 errs() << "Bye: ";
19 errs().write_escaped(Str: F.getName()) << '\n';
20 }
21 return false;
22}
23
24struct LegacyBye : public FunctionPass {
25 static char ID;
26 LegacyBye() : FunctionPass(ID) {}
27 bool runOnFunction(Function &F) override { return runBye(F); }
28};
29
30struct 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
40char LegacyBye::ID = 0;
41
42static RegisterPass<LegacyBye> X("goodbye", "Good Bye World Pass",
43 false /* Only looks at CFG */,
44 false /* Analysis Pass */);
45
46/* New PM Registration */
47llvm::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
67extern "C" LLVM_ATTRIBUTE_WEAK ::llvm::PassPluginLibraryInfo
68llvmGetPassPluginInfo() {
69 return getByePluginInfo();
70}
71#endif
72

source code of llvm/examples/Bye/Bye.cpp