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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 05:53:18