Я регистрирую функцию Pass, используя registerPipelineParsingCallback, следуя новым требованиям Pass Manager.
Однако я обнаружил, что могу зарегистрировать только один functionPass или ModulePass. Как я могу зарегистрировать их обоих в одном файле?
мой регистрационный код
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;
}
);
}
};
}
У меня есть функции Pass и Module pass в одном файле, как показано ниже:
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;
}
};
}
Погружаясь в интерфейс registerPipelineParsingCallback, я обнаружил, что параметр функции lamda, который нужен registerPipelineParsingCallback, может быть использован либо FunctionPassManager
, либо ModulePassManager
.
Интересно, как я могу одновременно зарегистрировать Module & Function PassManager? , Использование лямбда-функции, как показано ниже, не работает
PB.registerPipelineParsingCallback(
[](StringRef PassName, FunctionPassManager &FPM, ModulePassManager &MPM) {
...
return false;
}
);