如何使用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
相关产品推荐
相关产品推荐

