2013-02-27 74 views
0

我跟着How to get variable definition line number etc. using dbg metadata?为了得到局部变量(分配)的行号定义,它工作正常。但我需要相同的全局。所以我试图从http://llvm.org/docs/doxygen/html/DbgInfoPrinter_8cpp_source.html#l00062破解findDbgGlobalDeclare()方法。但是,我的字节码中没有llvm.dbg.gv,所以没有提取dbg信息。我使用​​编译我的目标代码。从我的字节码的一些样本:llvm得到全局定义行号

@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}

谢谢!

回答

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为你想要的所有领域。

1

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

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

具体来说,看"Global variable descriptors".

您发现该代码是为了让读者支持他们的向后兼容性,支持目前仍在由dragonegg产生的旧的元数据节点。新的LLVM代码生成!llvm.dbg.cu

+0

谢谢您的建议。 – Alex 2013-03-04 12:13:29