1 #include "llvm/IR/Function.h"
2 #include "llvm/IR/LegacyPassManager.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"
12 static cl::opt
<bool> Wave("wave-goodbye", cl::init(false),
13 cl::desc("wave good bye"));
17 bool runBye(Function
&F
) {
20 errs().write_escaped(F
.getName()) << '\n';
25 struct LegacyBye
: public FunctionPass
{
27 LegacyBye() : FunctionPass(ID
) {}
28 bool runOnFunction(Function
&F
) override
{ return runBye(F
); }
31 struct Bye
: PassInfoMixin
<Bye
> {
32 PreservedAnalyses
run(Function
&F
, FunctionAnalysisManager
&) {
34 return PreservedAnalyses::all();
35 return PreservedAnalyses::none();
41 char LegacyBye::ID
= 0;
43 static RegisterPass
<LegacyBye
> X("goodbye", "Good Bye World Pass",
44 false /* Only looks at CFG */,
45 false /* Analysis Pass */);
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()); });
53 static llvm::RegisterStandardPasses
RegisterByeLTO(
54 llvm::PassManagerBuilder::EP_ModuleOptimizerEarly
,
55 [](const llvm::PassManagerBuilder
&Builder
,
56 llvm::legacy::PassManagerBase
&PM
) { PM
.add(new LegacyBye()); });
58 /* New PM Registration */
59 llvm::PassPluginLibraryInfo
getByePluginInfo() {
60 return {LLVM_PLUGIN_API_VERSION
, "Bye", LLVM_VERSION_STRING
,
62 PB
.registerVectorizerStartEPCallback(
63 [](llvm::FunctionPassManager
&PM
, OptimizationLevel Level
) {
66 PB
.registerPipelineParsingCallback(
67 [](StringRef Name
, llvm::FunctionPassManager
&PM
,
68 ArrayRef
<llvm::PassBuilder::PipelineElement
>) {
69 if (Name
== "goodbye") {
78 #ifndef LLVM_BYE_LINK_INTO_TOOLS
79 extern "C" LLVM_ATTRIBUTE_WEAK ::llvm::PassPluginLibraryInfo
80 llvmGetPassPluginInfo() {
81 return getByePluginInfo();