5

我想获取指令的行号(以及变量声明的行号 - alloca 和 global)。该指令保存在指令数组中。我有这个功能:

Constant* metadata::getLineNumber(Instruction* I){
    if (MDNode *N = I->getMetadata("dbg")) { // this if is never executed
        DILocation Loc(N);
        unsigned Line = Loc.getLineNumber();
        return ConstantInt::get(Type::getInt32Ty(I->getContext()), Line);
    }   // else {
      //  return NULL; }
}

在我的 main() 中,我有:

errs()<<"\nLine number is "<<*metadata::getLineNumber(allocas[p]);

结果为 NULL,因为I->getMetadata("dbg")它是假的。

是否有可能在不重建 LLVM 框架的情况下在 LLVM 中启用 dbg 标志,例如在编译目标程序或运行我的通行证时使用标志(我使用了 -debug)?

使用“-O3 -g”编译程序应该会提供完整的调试信息,但我仍然得到相同的结果。我知道http://llvm.org/docs/SourceLevelDebugging.html,从中我可以看到从元数据字段中获取源代码行号非常容易。

PS:对于 Allocas,看来我必须使用 DbgInfoPrinter.cpp 中的 findDbgDeclare 方法。

先感谢您 !

4

1 回答 1

6

如果您-g为 Clang 指定标志,LLVM 会提供调试信息。您无需重新构建 LLVM 即可启用/禁用它 - 任何 LLVM 都可以(包括从二进制文件或二进制包中预先构建的一个)。

问题可能是您试图在高度优化的代码中包含调试信息 ( -O3)。这不一定是可能的,因为 LLVM 只是在这种情况下优化了一些代码,并且调试信息没有太大意义。LLVM 尝试在优化期间保留调试信息,但这不是一件容易的事。

首先使用调试信息 ( -O0 -g) 生成未优化的代码,然后编写代码/传递来处理它。然后毕业优化代码,并尝试检查具体丢失了什么。如果您认为 LLVM 很愚蠢,请不要犹豫,打开一个错误。

一些随机提示:

  • 从 clang ( -emit-llvm) 生成 IR 并查看其中的调试元数据节点。然后,您可以进行opt优化并查看剩下的内容。
  • 其他 LLVM 工具的-debug选项llc与源中的调试信息完全无关。
于 2013-02-18T20:01:33.283 回答