首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指令的llvm行号

指令的llvm行号
EN

Stack Overflow用户
提问于 2013-02-19 02:58:31
回答 1查看 3.7K关注 0票数 5

我想要获取指令的行号(以及变量声明的行号- alloca和global)。指令被保存在指令数组中。我有一个函数:

代码语言:javascript
复制
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()中,我有:

代码语言:javascript
复制
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方法。

提前谢谢你!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-19 04:01:33

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

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

首先生成带有调试信息(-O0 -g)的未优化代码,然后编写代码/通道来使用它。然后升级到优化的代码,并尝试检查具体丢失了什么。如果您认为LLVM很愚蠢,请毫不犹豫地打开一个bug。

一些随机的提示:

  • 从clang (-emit-llvm)生成IR并查看其中的调试元数据节点。然后你可以通过opt运行优化,看看剩下的是什么。
  • -debug选项添加到llc和其他LLVM工具中与源代码中的调试信息完全无关。
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14943447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档