llvm指令的行号

时间:2013-02-18 18:58:31

标签: llvm

我想得到一条指令的行号(以及一个变量声明的行号 - 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; }
}

在我的主要()中我有:

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

结果为NULL,因为I->getMetadata("dbg")为false。

是否有可能在LLVM中启用dbg标志而无需重建LLVM框架,例如在编译目标程序时使用标志或运行my pass时(我使用了-debug)?

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

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

提前谢谢!

1 个答案:

答案 0 :(得分:6)

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

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

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

一些随机提示:

  • 从clang(-emit-llvm)生成IR并查看其中的调试元数据节点。然后,您可以通过优化运行opt并查看剩余的内容。
  • -debug和其他LLVM工具的llc选项与源中的调试信息完全无关。