我想要获取指令的行号(以及变量声明的行号- 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]);由于I->getMetadata("dbg")为false,因此结果为NULL。
有没有可能在不重建LLVM框架的情况下在LLVM中启用dbg标志,比如在编译目标程序或运行pass时使用标志(我使用的是-debug)?
用“-O3-g”编译一个程序应该会给出完整的调试信息,但我还是得到了相同的结果。我知道http://llvm.org/docs/SourceLevelDebugging.html,从那里我可以看到从元数据字段中获取源码行号非常容易。
PS:对于Allocas,我似乎不得不使用DbgInfoPrinter.cpp中的findDbgDeclare方法。
提前谢谢你!
发布于 2013-02-19 04:01:33
如果您将-g标志指定为Clang,LLVM将提供调试信息。您不需要重新构建LLVM来启用/禁用它-任何LLVM都可以(包括从二进制文件或二进制包预先构建的LLVM)。
问题可能是您试图在高度优化的代码(-O3)中包含调试信息。这不一定是可能的,因为LLVM只是在这种情况下优化了一些代码,并且调试信息没有太大的意义。LLVM试图在优化期间保留调试信息,但这并不是一项容易的任务。
首先生成带有调试信息(-O0 -g)的未优化代码,然后编写代码/通道来使用它。然后升级到优化的代码,并尝试检查具体丢失了什么。如果您认为LLVM很愚蠢,请毫不犹豫地打开一个bug。
一些随机的提示:
-emit-llvm)生成IR并查看其中的调试元数据节点。然后你可以通过opt运行优化,看看剩下的是什么。-debug选项添加到llc和其他LLVM工具中与源代码中的调试信息完全无关。https://stackoverflow.com/questions/14943447
复制相似问题