LLVM opt无法识别自定义Function Pass的问题求助
解决opt无法找到自定义LLVM Function Pass的问题
针对你在macOS上用Homebrew安装LLVM后,自定义Pass无法被opt识别的问题,主要有以下几个可能的原因和对应的解决办法:
1. LLVM版本不匹配(最常见诱因)
Homebrew安装的LLVM和你编译Pass时依赖的LLVM版本不一致,是导致这个问题的头号原因。macOS系统自带了一套旧版LLVM,如果你的llvm-config指向的是系统自带版本,而运行的opt是Homebrew安装的新版,两者不兼容就会导致Pass无法被识别。
解决办法:
- 先确认Homebrew LLVM的安装路径:Intel芯片通常是
/usr/local/opt/llvm/,M系列芯片是/opt/homebrew/opt/llvm/。 - 修改Makefile,将
llvm-config替换为Homebrew版本的绝对路径,确保编译Pass时用的是和运行opt相同的LLVM版本:# Intel芯片版本 CXXFLAGS = -rdynamic $(shell /usr/local/opt/llvm/bin/llvm-config --cxxflags) -g -O0 -std=c++0x # M系列芯片版本 # CXXFLAGS = -rdynamic $(shell /opt/homebrew/opt/llvm/bin/llvm-config --cxxflags) -g -O0 -std=c++0x all: p34.so %.so: %.o $(CXX) $(CXXFLAGS) -dylib -shared -fPIC $^ -o $@ clean: rm -f *.o *~ *.so - 重新编译Pass:
make clean && make - 运行opt时也要用Homebrew的版本,比如Intel芯片的完整命令:
/usr/local/opt/llvm/bin/opt -load p34.so -defpass < test1.bc > /dev/null
2. 新旧Pass Manager不兼容
你的代码使用的是旧版RegisterPass(Legacy Pass Manager),而Homebrew安装的新版LLVM默认启用了新的Pass Manager(New Pass Manager),新PM无法识别旧的Pass注册方式,因此会提示找不到-defpass参数。
解决办法:
运行opt时显式禁用新Pass Manager,加上-enable-new-pm=0参数,以Intel芯片为例:
/usr/local/opt/llvm/bin/opt -enable-new-pm=0 -load p34.so -defpass < test1.bc > /dev/null
如果想长期解决,建议将Pass迁移到新的Pass Manager注册方式,比如使用PassPlugin和REGISTER_PASS_PLUGIN等API。
3. 动态库加载验证(辅助排查)
如果上面两个方法都无效,可以检查Pass动态库的依赖是否正确:
# Intel芯片 otool -L p34.so | grep llvm # M系列芯片 otool -L p34.so | grep llvm
输出应该显示Homebrew LLVM的库路径,而非系统自带的/usr/lib/下的LLVM库。如果显示系统库,说明编译时确实用错了llvm-config,回到第一步修改Makefile即可。
内容的提问来源于stack exchange,提问作者eager2learn
相关产品推荐
相关产品推荐

