llvm指令的行号

5 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; }
}
Run Code Online (Sandbox Code Playgroud)

在我的主要()我有:

errs()<<"\nLine number is "<<*metadata::getLineNumber(allocas[p]);
Run Code Online (Sandbox Code Playgroud)

结果为NULL,因为它I->getMetadata("dbg")是false.

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

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

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

先感谢您 !

Eli*_*sky 6

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

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

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

一些随机提示:

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