llvm获取全局定义行号

时间:2013-02-27 10:32:33

标签: llvm

我按照How to get variable definition line number etc. using dbg metadata?来获取局部变量(allocas)的行号定义,这很好。但我对全局变量需要相同的东西。所以我试图从http://llvm.org/docs/doxygen/html/DbgInfoPrinter_8cpp_source.html#l00062破解findDbgGlobalDeclare()方法。但是,我的字节码中没有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]

!0是间接依赖的,!llvm.dbg.cu = !{!0}

谢谢!

2 个答案:

答案 0 :(得分:1)

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

  

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

具体来说,请参阅"Global variable descriptors".

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

答案 1 :(得分: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#c-c-front-end-specific-debug-information您想要的所有字段。