C++ 如何在一个文件中注册多个LLVM过程?
我按照新的过程管理器要求,使用registerPipelineParsingCallback注册函数过程 然而,我发现我只能注册单个functionPass或ModulePass。如何在一个文件中同时注册它们 我的注册码是C++ 如何在一个文件中注册多个LLVM过程?,c++,llvm,llvm-ir,llvm-c++-api,C++,Llvm,Llvm Ir,Llvm C++ Api,我按照新的过程管理器要求,使用registerPipelineParsingCallback注册函数过程 然而,我发现我只能注册单个functionPass或ModulePass。如何在一个文件中同时注册它们 我的注册码是 extern "C" ::llvm::PassPluginLibraryInfo LLVM_ATTRIBUTE_WEAK llvmGetPassPluginInfo() { return { LLVM_PLUGIN_API_VERSION, "
extern "C" ::llvm::PassPluginLibraryInfo LLVM_ATTRIBUTE_WEAK
llvmGetPassPluginInfo() {
return {
LLVM_PLUGIN_API_VERSION, "HelloNewPMPass", "v0.1",
[](PassBuilder &PB) {
PB.registerPipelineParsingCallback(
[](StringRef PassName, FunctionPassManager &FPM,...) {
if (PassName == "fiber") {
FPM.addPass(HelloNewPMPass());
return true;
}
return false;
}
);
}
};
}
我在一个文件中包含函数过程和模块过程,如下所示:
namespace {
struct HelloNewPMPass : public PassInfoMixin<HelloNewPMPass> {
PreservedAnalyses run(Function &F, FunctionAnalysisManager &FAM) {
PreservedAnalyses pa = PreservedAnalyses::all();
return pa;
}
};
struct SecondPass: public PassInfoMixin<StringEncryptionPass> {
PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM) {
errs() << M.getName() << "\n";
PreservedAnalyses pa = PreservedAnalyses::all();
return pa;
}
};
}
我认为您可以使用PB.registerPipelineParsingCallback两次。 就像:
return {LLVM_PLUGIN_API_VERSION, "HelloNewPMPass", "v0.1",
[](PassBuilder &PB) {
PB.registerPipelineParsingCallback([](StringRef PassName, FunctionPassManager &FPM,...){
if(PassName = "hellonewpmpass"){FPM.addPass(HelloNewPMPass());return true;}
return false;
});
PB.registerPipelineParsingCallback([](StringRef PassName, ModulePassManager &MPM,...){
if(PassName = "secondpass"){MPM.addPass(SecondPass());return true;}
return false;
});
}
};
第一个registerPipelineParsingCallback接收函数PassManager,第二个接收模块PassManager
return {LLVM_PLUGIN_API_VERSION, "HelloNewPMPass", "v0.1",
[](PassBuilder &PB) {
PB.registerPipelineParsingCallback([](StringRef PassName, FunctionPassManager &FPM,...){
if(PassName = "hellonewpmpass"){FPM.addPass(HelloNewPMPass());return true;}
return false;
});
PB.registerPipelineParsingCallback([](StringRef PassName, ModulePassManager &MPM,...){
if(PassName = "secondpass"){MPM.addPass(SecondPass());return true;}
return false;
});
}
};