【发布时间】: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 &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->getMetadata(0);,然后是DILocation *debugLocation = dyn_cast<DILocation>(metadata);?
标签: llvm clang++ llvm-clang llvm-ir llvm-3.0