基于LLVM新Pass管理器的Hello World Pass编译动态库报错求助
问题根源与解决办法
咱们先从编译错误的核心说起——你在passHook函数里犯了一个很容易忽略的小错误:
FPM.addPass(passHook);
你这里试图把**passHook这个函数本身**加到函数 Pass 管理器里,但 LLVM 新 Pass 管理器的addPass方法,要求传入的是一个符合 Pass 接口的类实例(也就是你定义的PassTest,它继承了PassInfoMixin),而不是一个普通函数。
编译器在处理这段代码时,会把函数类型当成 Pass 类型去实例化模板,然后尝试调用这个"Pass"的run和name方法——但函数本身不是结构体或类,根本没有这些成员,这就是你看到那两条报错信息的直接原因。
第一步:修正代码错误
把passHook里的错误代码改成添加PassTest的实例就好:
bool passHook(StringRef Name, FunctionPassManager &FPM, ArrayRef<PassBuilder::PipelineElement>) { if (Name != "pass_test") return false; // 替换成PassTest的实例,而不是passHook函数 FPM.addPass(PassTest()); return true; }
第二步:解决编译链接问题
你之前用clang直接编译的命令缺少必要的链接选项,仅包含头文件是不够的,必须链接 LLVM 的相关库。对于通过apt安装的 LLVM 13,你可以试试这个编译命令(库名可能需要根据你的系统微调):
clang -shared -fPIC -I/usr/include/llvm-13 -I/usr/include/llvm-c-13 -L/usr/lib/llvm-13/lib -lllvmPasses -lllvmCore -o libpass_test.so pass_test.cpp
当然更推荐用 CMake 来构建,它能自动处理 LLVM 的依赖和链接逻辑,给你一个简单的 CMakeLists.txt 示例:
cmake_minimum_required(VERSION 3.13) project(pass_test) find_package(LLVM 13 REQUIRED CONFIG) include_directories(${LLVM_INCLUDE_DIRS}) add_definitions(${LLVM_DEFINITIONS}) add_library(pass_test SHARED pass_test.cpp) target_link_libraries(pass_test PRIVATE ${LLVM_LIBRARIES})
修正完成后,你就可以用opt加载这个插件测试了,比如:
opt -load-pass-plugin=./libpass_test.so -passes="pass_test" -disable-output test.ll
内容的提问来源于stack exchange,提问作者ht332932
相关产品推荐
相关产品推荐

