0

我遵循如何使用 dbg 元数据获取变量定义行号等?为了获得局部变量(allocas)的行号定义,它工作正常。但我需要同样的全局变量。所以我试图破解findDbgGlobalDeclare()来自http://llvm.org/docs/doxygen/html/DbgInfoPrinter_8cpp_source.html#l00062的方法。但是,我llvm.dbg.gv的字节码中没有,因此没有要提取的 dbg 信息。我使用clang++ -O0 -g -emit-llvm Test.cpp -c -o Test.bc. 我的字节码中的一些示例:

@r = global i32 3, align 4
%4 = load i32* @r, align 4, !dbg !942
...
%a = alloca i32, align 4
%1 = load i32* %a, align 4, !dbg !939

但是,我确实有:

!924 = metadata !{i32 786484, i32 0, null, metadata !"r", metadata !"r", metadata !"", metadata !841, i32 19, metadata !56, i32 0, i32 1, i32* @r} ; [ DW_TAG_variable ] [r] [line 19] [def]

with!0是间接依赖的,并且存在!llvm.dbg.cu = !{!0}

谢谢 !

4

2 回答 2

1

是的,!llvm.dbg.cu现在是正确的地方。引用源代码级调试文档:

编译单元描述符为在特定编译单元中声明的对象提供根上下文。文件描述符是使用此上下文定义的。这些描述符由命名元数据 !llvm.dbg.cu 收集。它们跟踪子程序、全局变量和类型信息。

具体请参见“全局变量描述符”。

您找到的代码是支持仍然由 dragonegg 生成的旧元数据节点,因此读者支持它们以实现向后兼容性。新的 LLVM 代码生成!llvm.dbg.cu.

于 2013-02-28T13:28:21.103 回答
0

步骤如下:

1. NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.cu");

然后进入元数据节点链,直到所需的全局声明。

2. DIDescriptor DIG(cast<MDNode>(NMD->getOperand(i)));
3. DIDescriptor DIGG(cast<MDNode>(NMD->getOperand(NMD->getNumOperands()-1)));
4. DIDescriptor DIGF(cast<MDNode>(DIGG->getOperand(0)));
5. Value* VV = cast<Value>(DIGF->getOperand(i));
6. DIDescriptor DIGS(cast<MDNode>(VV));

此时,请执行以下操作:

7. DIGS->getOperand(j) 

并检查您想要的所有字段的http://llvm.org/docs/SourceLevelDebugging.html#cc-front-end-specific-debug-information

于 2013-03-06T09:03:15.263 回答