从函数中获取文件名和位置
Get filename and location from Function
我有一个遍历 LLVM IR 代码的 LLVM pass,我想为原始代码的函数和基本块获取目录和文件名。我知道当我有一个指令指针时,我可以使用下面的代码轻松获取信息:感谢@hailinzeng
()
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();
}
但是,由于 class Function
和 BasicBlock
没有成员函数 getDebugLoc()
,所以这不起作用。我看到另一个 post here 使用元数据,但我不知道如何从元数据中获取 DILocation
或 DIScope
。使用
MDNode *n = inst->getMetadata("dbg");
DILocation loc(n); `
给出以下错误
/usr/lib/llvm-3.9/include/llvm/IR/Metadata.def:83:42: note: forward declaration of 'llvm::DILocation'
HANDLE_SPECIALIZED_MDNODE_LEAF_UNIQUABLE(DILocation)
我正在使用 llvm 3.9。
更新::
谢谢斯坦尼斯拉夫·潘克维奇。我没有包括正确的 headers 但现在我有一个新问题。 DILocation 需要 LLVMContext、StorageType 和 unsigned Line。如何从函数指针获取行号和存储类型?
DILocation(LLVMContext &C, StorageType Storage, unsigned Line,
对于那些处理类似问题的人,您可以使用
获取 LLVMContext
llvm::MDNode * testmd = F.getMetadata("dbg");
F.getContext ()
如果您查看代码的 .ll 文件,您会发现每个函数都有与其关联的 DINode,类似于 !<some_number>
。这是具有有关该功能的信息的元数据节点号。该节点的类型是 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();
}
}
}
您可以使用调试节点中的所有信息。
如果我们想要列的详细信息,这对于 DISubprogram 是不可能的。
我试过这个:
DILocation *debugLocation = dyn_cast<DILocation>(N);
debugLocation->getLine();
sample.ll 文件确实包含这些行:
!10 = !DILocation(行:1,列:1,范围:!1)
但是,它在 运行 时间给出了核心转储。任何建议请如何让它工作。
我有一个遍历 LLVM IR 代码的 LLVM pass,我想为原始代码的函数和基本块获取目录和文件名。我知道当我有一个指令指针时,我可以使用下面的代码轻松获取信息:感谢@hailinzeng
(
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();
}
但是,由于 class Function
和 BasicBlock
没有成员函数 getDebugLoc()
,所以这不起作用。我看到另一个 post here 使用元数据,但我不知道如何从元数据中获取 DILocation
或 DIScope
。使用
MDNode *n = inst->getMetadata("dbg");
DILocation loc(n); `
给出以下错误
/usr/lib/llvm-3.9/include/llvm/IR/Metadata.def:83:42: note: forward declaration of 'llvm::DILocation' HANDLE_SPECIALIZED_MDNODE_LEAF_UNIQUABLE(DILocation)
我正在使用 llvm 3.9。
更新::
谢谢斯坦尼斯拉夫·潘克维奇。我没有包括正确的 headers 但现在我有一个新问题。 DILocation 需要 LLVMContext、StorageType 和 unsigned Line。如何从函数指针获取行号和存储类型?
DILocation(LLVMContext &C, StorageType Storage, unsigned Line,
对于那些处理类似问题的人,您可以使用
获取 LLVMContextllvm::MDNode * testmd = F.getMetadata("dbg");
F.getContext ()
如果您查看代码的 .ll 文件,您会发现每个函数都有与其关联的 DINode,类似于 !<some_number>
。这是具有有关该功能的信息的元数据节点号。该节点的类型是 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();
}
}
}
您可以使用调试节点中的所有信息。
如果我们想要列的详细信息,这对于 DISubprogram 是不可能的。 我试过这个:
DILocation *debugLocation = dyn_cast<DILocation>(N);
debugLocation->getLine();
sample.ll 文件确实包含这些行: !10 = !DILocation(行:1,列:1,范围:!1) 但是,它在 运行 时间给出了核心转储。任何建议请如何让它工作。