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

时间:2013-08-21 07:27:31

标签: llvm llvm-ir

我已经使用Clang来编译启用了调试信息的函数。对于Instruction,有方便的getDebugLoc(),但Function没有这样的东西。给定Function实例,如何获取调试信息(我猜是DISubProgram形式)?

我见过the guide entry explaining how that debug information is represented,元数据确实包含一个返回该函数的链接,但显然没有回链接。我是否应该迭代模块中的所有元数据?

3 个答案:

答案 0 :(得分: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";
                }
            }

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

答案 1 :(得分:6)

您可以使用doxygen: Function class

中描述的getSubprogram()

答案 2 :(得分:3)

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

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