LLVM代码编译报错:无对象调用非静态成员函数问题求助
解决LLVM DebugLoc::get编译错误:非静态成员函数调用问题
错误原因
你遇到的编译错误核心是:LLVM的DebugLoc::get()是非静态成员函数,但你试图通过类名直接调用(llvm::DebugLoc::get(...)),这违反了C++语法规则——非静态成员函数必须通过类的实例对象调用,不能直接用类名调用。
正确的代码修正方案
根据你的任务需求(对比基本块源码行号范围、标记函数属性),不需要手动构造完整的DebugLoc实例,直接用行号数值对比更简洁可靠。
步骤1:替换DebugLoc范围定义
把原来的DebugLoc数组改成纯行号范围的数值数组:
// 存储需要检查的源码行号范围(起始行,结束行) std::vector<std::pair<unsigned, unsigned>> SourceRanges = { {1, 5}, {10, 15} };
步骤2:遍历基本块并对比行号
遍历函数的每个基本块,提取其调试信息的行号,和预设范围对比:
for (auto &Func : M) { bool isFragile = false; llvm::DebugLoc targetLoc; // 存储匹配的调试信息 for (auto &BB : Func) { // 获取基本块中第一条非PHI指令的调试信息 llvm::DebugLoc BBLoc = BB.getFirstNonPHI()->getDebugLoc(); if (!BBLoc) continue; // 跳过无调试信息的基本块 unsigned BBLine = BBLoc.getLine(); for (auto &Range : SourceRanges) { if (BBLine >= Range.first && BBLine <= Range.second) { isFragile = true; targetLoc = BBLoc; break; } } if (isFragile) break; } if (isFragile) { // 为函数添加自定义IsFragile属性 Func.addFnAttr("IsFragile"); // 输出函数详情 llvm::outs() << "被标记函数:\n"; llvm::outs() << " 签名: " << Func.getSignature() << "\n"; llvm::outs() << " 定义文件: " << targetLoc.getFilename() << "\n"; llvm::outs() << " 定义行号: " << targetLoc.getLine() << "\n\n"; } }
额外编译提示
如果使用LLVM 14及以上版本,编译命令建议添加--system-libs参数,避免系统库链接问题:
clang++ -g -O3 -std=c++11 `llvm-config --cxxflags --ldflags --libs --system-libs` MyLLVMPass.cpp -o MyLLVMPass
内容的提问来源于stack exchange,提问作者Dumbledore
相关产品推荐
相关产品推荐

