我想得到一条指令的行号(以及一个变量声明的行号 - 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方法。
提前谢谢!
答案 0 :(得分:6)
如果为Clang指定-g
标志,LLVM会提供调试信息。您不需要重建LLVM来启用/禁用它 - 任何LLVM都可以(包括从二进制文件或二进制包中预先构建的一个)。
问题可能在于您尝试在高度优化的代码(-O3
)中获取调试信息。这不一定是可能的,因为在这种情况下LLVM只是简化了一些代码,调试信息的意义不大。 LLVM尝试在优化期间保留调试信息,但这不是一件容易的事。
首先使用调试信息(-O0 -g
)生成未经优化的代码,并编写代码/传递以使用它。然后毕业于优化代码,并尝试检查具体丢失的内容。如果您认为LLVM是愚蠢的,请不要犹豫,打开一个错误。
一些随机提示:
-emit-llvm
)生成IR并查看其中的调试元数据节点。然后,您可以通过优化运行opt
并查看剩余的内容。-debug
和其他LLVM工具的llc
选项与源中的调试信息完全无关。