首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取LLVM-IR中调试信息的名称(或编号)

获取LLVM-IR中调试信息的名称(或编号)
EN

Stack Overflow用户
提问于 2017-03-14 23:46:06
回答 2查看 543关注 0票数 2

我想在IR中打印调试信息的确切数量,我该怎么做呢?

例如,考虑如下所示的IR块,

代码语言:javascript
复制
call void @llvm.dbg.declare(metadata i32* %a, metadata !10, metadata !11), !dbg !12!
!12 = !DILocation(line: 19, column: 7, scope: !6)

出于调试目的,我想将!12打印为字符串。我可以通过执行以下操作来获取DILocation的对象

代码语言:javascript
复制
Instruction::getDebugLoc()->get()

但我得到的只是一个指针,并且没有这样的接口来获取数字。我可以假设LLVM在实际生成位码时给出了这个数字,因为转储DILocation会得到类似如下的结果

代码语言:javascript
复制
<0x7342628> = !DILocation(line: 23, column: 3, scope: <0x733e5f8>)

这。但是当我使用Instruction::dump()时,它给出的结果如下所示

代码语言:javascript
复制
call void @llvm.dbg.declare(metadata i32* %a, metadata !10, metadata !11), !dbg !12

这一点,所以我搞不懂它在运行时是否有debug-info的编号信息。

它有没有编号信息?如果是这样的话,我如何获取这些信息?如果没有,我应该在哪里检查LLVM中的位码生成?

EN

回答 2

Stack Overflow用户

发布于 2017-03-15 00:26:20

您是在谈论行/列号吗?如果是这样,那么您可以直接从debugLoc轻松地访问它们

代码语言:javascript
复制
instruction->getDebugLoc()->getLine()
instruction->getDebugLoc()->getColumn()

请参阅DebugInfoMetadata上的定义

代码语言:javascript
复制
unsigned getLine() const { return SubclassData32; }
unsigned getColumn() const { return SubclassData16; }
票数 2
EN

Stack Overflow用户

发布于 2017-05-06 05:00:20

现在回答这个问题可能还不算太晚。

代码语言:javascript
复制
if (instruction->hasMetadata()) {
  instruction->dump();

  // one way
  SmallVector<std::pair<unsigned, MDNode *>, 4> MDs;
  instruction->getAllMetadata(MDs);
  for (auto &MD : MDs) {
    if (MDNode *N = MD.second) {
      N->printAsOperand(errs(), instruction->getModule());
      errs() << "\n";
    }
  }

  // second way
  instruction->getDebugLoc()->printAsOperand(errs(), instruction->getModule());
  errs() << "\n";

  // third way
  int debugInfoKindID = 0;
  MDNode *debug = instruction->getMetadata(debugInfoKindID);
  debug->printAsOperand(errs(), instruction->getModule());
  errs() << "\n";
}

输出为:

代码语言:javascript
复制
%11 = add nsw i32 %9, %10, !dbg !29
!29
!29
!29

我通过查看它的测试TEST_F(MDNodeTest, PrintFromMetadataAsValue) llvm//unittests/IR/MetadataTest.cpp找到了这一点。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42790506

复制
相关文章

相似问题

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