mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-30 02:46:06 +00:00

This is the orignal patch + a check that LLVM_BUILD_EXAMPLES is enabled before adding a dependency on the 'Bye' example pass. Original summary: Add cli options for new passmanager plugin support to lld. Currently it is not possible to load dynamic NewPM plugins with lld. This is an incremental update to D76866. While that patch only added cli options for llvm-lto2, this adds them for lld as well. This is especially useful for running dynamic plugins on the linux kernel with LTO. Reviewed By: MaskRay Differential Revision: https://reviews.llvm.org/D120490
84 lines
2.5 KiB
C++
84 lines
2.5 KiB
C++
#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"
|
|
#include "llvm/Transforms/IPO/PassManagerBuilder.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 */);
|
|
|
|
/* Legacy PM Registration */
|
|
static llvm::RegisterStandardPasses RegisterBye(
|
|
llvm::PassManagerBuilder::EP_VectorizerStart,
|
|
[](const llvm::PassManagerBuilder &Builder,
|
|
llvm::legacy::PassManagerBase &PM) { PM.add(new LegacyBye()); });
|
|
|
|
static llvm::RegisterStandardPasses RegisterByeLTO(
|
|
llvm::PassManagerBuilder::EP_ModuleOptimizerEarly,
|
|
[](const llvm::PassManagerBuilder &Builder,
|
|
llvm::legacy::PassManagerBase &PM) { PM.add(new LegacyBye()); });
|
|
|
|
/* 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
|