You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 00:30:01