我使用 Clang 编译了一个启用了调试信息的函数。对于Instruction
s 来说有方便的getDebugLoc()
,但对于 s 没有这样的东西Function
。给定一个Function
实例,我怎样才能得到它的调试信息(我猜是DISubProgram
形式)?
我已经看到指南条目解释了如何表示调试信息,并且元数据确实包含返回该函数的链接,但显然没有返回链接。我应该遍历模块中的所有元数据吗?
我使用 Clang 编译了一个启用了调试信息的函数。对于Instruction
s 来说有方便的getDebugLoc()
,但对于 s 没有这样的东西Function
。给定一个Function
实例,我怎样才能得到它的调试信息(我猜是DISubProgram
形式)?
我已经看到指南条目解释了如何表示调试信息,并且元数据确实包含返回该函数的链接,但显然没有返回链接。我应该遍历模块中的所有元数据吗?
我认为您需要使用 DebugInfoFinder。这是一个示例代码:
DebugInfoFinder Finder;
Finder.processModule(M);
for (DebugInfoFinder::iterator i = Finder.subprogram_begin(),
e = Finder.subprogram_end();
i != e; ++i) {
DISubprogram S(*i);
if (S.getFunction() == F) {
errs() << S.getLineNumber(); << "\n";
}
}
其中 F 是您要查找的函数。
您可以使用 doxygen 中描述的 getSubprogram() :函数类
我认为目前没有更简单的方法。曾经有一个全局元数据节点收集所有函数元数据llvm.dbg.sp
条目llvm.dbg.cu
(
我想调试元数据的常见用途不需要按功能查找,并且任何可以删除的额外信息都被删除了,因为节省空间很重要,而且 IR 中的元数据已经太大了。