如何从函数中获取调试信息?

Oak*_*Oak 5 llvm llvm-ir

我已经使用Clang来编译一个启用了调试信息的函数.对于Instructions来说,这是方便的getDebugLoc(),但对于s来说没有这样的东西Function.给定一个Function实例,我如何才能获得调试信息(我在猜测DISubProgram形式)?

我已经看到指南条目解释了如何表示调试信息,元数据确实包含一个返回函数的链接,但显然没有回链接.我应该迭代模块中的所有元数据吗?

Kyr*_*kos 10

我认为你需要使用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";
                }
            }
Run Code Online (Sandbox Code Playgroud)

其中F是您正在寻找的功能.


小智 6

您可以按照doxygen中的描述使用getSubprogram():函数类


Eli*_*sky 3

我认为目前没有更简单的方法。曾经有一个全局元数据节点收集所有函数元数据条目 ( llvm.dbg.sp),但不久前它被删除了,以llvm.dbg.cu更紧密地反映 DWARF 结构。

我认为调试元数据的常见用途不需要按功能查找,并且任何可以删除的额外信息都删除了,因为节省空间很重要,而且 IR 中的元数据已经太大了。