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

如何使用LLVM 17编译依赖PassManagerBuilder的程序?

问题解答:LLVM 17移除PassManagerBuilder.h后的编译方案

完全可以用LLVM 17完成编译,不需要退回到旧版本,只需对代码做适配,替换掉原PassManagerBuilder的用法即可。

核心背景

LLVM 17正式移除了PassManagerBuilder.h头文件,因为它属于旧版Pass管理器(Legacy Pass Manager)的组件,LLVM早已全面转向新的Pass管理器(New Pass Manager,NPM),原组件的功能完全可以用新API替代。

错误原因

你遇到的编译错误直接源于该头文件被移除:

llvm-pass.so.cc:46:10: fatal error: 'llvm/Transforms/IPO/PassManagerBuilder.h' file not found
46 | #include "llvm/Transforms/IPO/PassManagerBuilder.h"

适配步骤(针对常见场景)

原PassManagerBuilder主要用于配置优化管线、将自定义Pass插入默认优化流程,对应新Pass管理器的替代方案分两种情况:

1. 给LLVM默认优化管线添加自定义Pass

  • 移除#include "llvm/Transforms/IPO/PassManagerBuilder.h"
  • 改用新的PassPipelineRegistration机制,或直接在创建优化管线时手动添加Pass,示例代码(简化版):
    #include "llvm/Passes/PassPlugin.h"
    #include "llvm/Passes/PassBuilder.h"
    
    // 自定义Pass类
    struct MyCustomPass : public llvm::PassInfoMixin<MyCustomPass> {
      llvm::PreservedAnalyses run(llvm::Function &F, llvm::FunctionAnalysisManager &AM) {
        // 你的Pass逻辑代码
        return llvm::PreservedAnalyses::all();
      }
    };
    
    // 注册Pass到优化管线
    extern "C" LLVM_ATTRIBUTE_WEAK llvm::PassPluginLibraryInfo llvmGetPassPluginInfo() {
      return {
        LLVM_PLUGIN_API_VERSION, "MyCustomPass", "v0.1",
        [](llvm::PassBuilder &PB) {
          // 在O2优化级别下将自定义Pass加入函数优化管线
          PB.registerPipelineStartEPCallback(
            [](llvm::ModulePassManager &MPM, llvm::PassBuilder::OptimizationLevel Level) {
              if (Level == llvm::PassBuilder::OptimizationLevel::O2) {
                MPM.addPass(llvm::createModuleToFunctionPassAdaptor(MyCustomPass()));
              }
            }
          );
        }
      };
    }
    

2. 手动构建自定义优化管线

  • 直接使用llvm::PassBuilder构建管线,替代原PassManagerBuilder的配置逻辑,示例代码(简化版):
    #include "llvm/Passes/PassBuilder.h"
    #include "llvm/Transforms/InstCombine/InstCombine.h"
    #include "llvm/Transforms/Scalar/GVN.h"
    
    // 构建自定义优化管线
    llvm::FunctionPassManager buildOptimizationPipeline() {
      llvm::PassBuilder PB;
      llvm::FunctionPassManager FPM;
    
      // 添加常用优化Pass
      FPM.addPass(llvm::InstCombinePass());
      FPM.addPass(llvm::GVNPass());
      // 添加你的自定义Pass
      FPM.addPass(MyCustomPass());
    
      return FPM;
    }
    

关键提示

  • 新Pass管理器的核心是分析与Pass分离,每个Pass需要明确声明依赖的分析以及保留的分析,这和旧版的依赖机制不同。
  • 如果不确定原代码中PassManagerBuilder的具体作用,可以先提取原代码中相关逻辑片段,对应查找新API的替代方法:比如原代码用addExtension添加Pass,就对应新PassBuilder的回调注册;原代码设置优化级别,就对应PassBuilder的OptimizationLevel枚举。

内容的提问来源于stack exchange,提问作者John213214214

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 00:21:20