【问题标题】:Get filename and location from Function从函数获取文件名和位置
【发布时间】:2017-04-27 04:41:13
【问题描述】:

我有一个遍历 LLVM IR 代码的 LLVM 通道,我想为原始代码的函数和基本块获取目录和文件名。我知道当我有一个指令指针时,我可以使用下面的代码轻松获取信息:感谢@hailinzeng (How to get the filename and directory from a LLVM Instruction?)

const llvm::DebugLoc &location = i_iter->getDebugLoc();

if (location && debugLocationInfoOn) {
  std::string dbgInfo;
  llvm::raw_string_ostream rso(dbgInfo);
  location.print(rso);
  std::cout << rso.str();
}

但是,由于类Function 和BasicBlock 没有成员函数getDebugLoc(),所以这不起作用。我看到另一个帖子here 使用元数据,但我不知道如何从元数据中获取DILocation 或DIScope。使用

MDNode *n = inst->getMetadata("dbg");
DILocation loc(n);   `

给出下面的错误

/usr/lib/llvm-3.9/include/llvm/IR/Metadata.def:83:42: 注意:'llvm::DILocation' 的前向声明 HANDLE_SPECIALIZED_MDNODE_LEAF_UNIQUABLE(DILocation)

我使用的是 llvm 3.9。

更新:: 谢谢斯坦尼斯拉夫·潘克维奇。我没有包括正确的标题,但现在我有一个新问题。 DILocation 需要 LLVMContext、StorageType 和 unsigned Line。如何从函数指针中获取行号和存储类型? DILocation(LLVMContext &amp;C, StorageType Storage, unsigned Line,

对于那些遇到类似问题的人,您可以使用 LLVMContext 获取

llvm::MDNode * testmd = F.getMetadata("dbg");
F.getContext ()

【问题讨论】:

  • note: forward declaration ... 消息表明您缺少 #include "llvm/IR/DebugInfoMetadata.h" 并且可能缺少 #include "llvm/IR/DebugInfo.h" 导入。另请参阅:stackoverflow.com/a/41715433/598057.
  • 您确定链接主题中的方法不适合您:MDNode *metadata = function-&gt;getMetadata(0);,然后是DILocation *debugLocation = dyn_cast&lt;DILocation&gt;(metadata);?

标签: llvm clang++ llvm-clang llvm-ir llvm-3.0


【解决方案1】:

如果您查看代码的 .ll 文件,您会发现每个函数都有与之关联的 DINode,例如 !&lt;some_number&gt;。那是具有有关该功能的信息的元数据节点号。该节点的类型是DISubprogram 你可以这样访问它:

SmallVector<std::pair<unsigned, MDNode *>, 4> MDs;
F.getAllMetadata(MDs);
for (auto &MD : MDs) {
  if (MDNode *N = MD.second) {
    if (auto *subProgram = dyn_cast<DISubprogram>(N)) {
      errs() << subProgram->getLine();
    }
  }
}

您可以使用调试节点中的所有信息。

【讨论】:

  • 很好的答案。不得不进行一些更改,但效果很好
  • 你也可以简单地在llvm::Function上使用“getSubprogram”方法,直接返回DISubprogram(如果存在的话)。
【解决方案2】:

如果我们想要列详细信息,DISubprogram 无法做到这一点。 我试过这个:

DILocation *debugLocation = dyn_cast<DILocation>(N);
debugLocation->getLine();

sample.ll 文件确实包含以下几行: !10 = !DILocation(行:1,列:1,范围:!1) 但是,它会在运行时转储核心。任何建议请如何让它工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    • 2018-05-31
    • 2012-08-24
    • 1970-01-01
    相关资源
    最近更新 更多