如何解决LLVM Pass中ModulePassManager适配函数Pass的编译错误
错误原因
你混淆了LLVM的两套PassManager体系:
- 当前你编写的
DBogusFlow属于**新PassManager(New PM)**体系下的ModulePass,createModuleToFunctionPassAdaptor是新PM提供的适配接口,要求传入新PM的FunctionPass实例(值类型,非指针) - 你调用的
createAggressiveDCEPass()、createInstructionCombiningPass()、createCFGSimplificationPass()都是旧Legacy PassManager的接口,返回的是llvm::FunctionPass*指针类型,这就导致适配层拿到指针后尝试调用.run()方法触发编译错误。
修正方案
替换为新PM对应的Pass构造方式即可,修改后的代码如下:
// 先引入新PM对应Pass的头文件 #include "llvm/Transforms/Scalar/ADCE.h" #include "llvm/Transforms/Scalar/InstCombine.h" #include "llvm/Transforms/Scalar/SimplifyCFG.h" llvm::PreservedAnalyses DBogusFlow::run(llvm::Module &M, llvm::ModuleAnalysisManager &MAM) { bool Changed = runOnModule(M); llvm::ModulePassManager MPM; MPM.addPass(createModuleToFunctionPassAdaptor(llvm::ADCEPass())); MPM.addPass(createModuleToFunctionPassAdaptor(llvm::InstCombinePass())); MPM.addPass(createModuleToFunctionPassAdaptor(llvm::SimplifyCFGPass())); MPM.run(M, MAM); return (Changed ? llvm::PreservedAnalyses::none() : llvm::PreservedAnalyses::all()); }
注意事项
- 需要在对应CMakeLists.txt的LLVM链接组件中添加
LLVMScalarOpts,否则会出现链接错误 - 如果你确实需要在新PM中复用旧Legacy PM的自定义Pass,可以用
createLegacyPassManagerWrapper做适配,非必要场景优先使用原生新PM的Pass即可。
内容的提问来源于stack exchange,提问作者pwnnnn
相关产品推荐
相关产品推荐

