2013-02-27 77 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