2013-01-04 102 views
2

我試圖從使用DILocation類的llvm指令調試元數據。llvm :: DIInstruction getFilename返回一個目錄的文件名,我只想要文件名

但是,當我查詢指令來自的文件名的DILocation時,我得到一個帶有 目錄的文件名。

雖然它只會返回文件 ,並且應該通過調用getDirectory()來檢索整個目錄路徑。

例如,而不是XMain_0.c的我結束了PBG/XMain_0.c

我編譯位碼是這樣的:

XMain_0.o: pbg/XMain_0.c 
    $(CC) <snip> -c pbg/XMain_0.c 

請問,我在我的源代碼通過用事實目錄 是指元數據保存源文件名作爲輸入?

這裏有一個砍下例如:

const llvm::Instruction* inst //passed in 
    MDNode *n = inst->getMetadata("dbg"); 
    DILocation loc(n); 

    file = loc.getFilename().str(); // => pbg/XMain_0.c 
    dir = loc.getDirectory().str(); // => /projects/pbg/pbg-m/DIR 

是否有電話,我可以做出「正常化」這個數據還是做我需要做手工嗎?

鏗鏘3.1如果那件事。

回答

3

我認爲這取決於編譯器的調用。如果你運行:

clang -c somedir/somefile.c 

然後全部somedir/somefile.c將是文件名。

你的調用是怎樣的?


沒有什麼奇怪的了。調試器將查找與某個項目根目錄相關的源文件,如果您編譯的文件喜歡這樣,這就是它們將被找到的方式。 gcc做同樣的事情:

/tmp$ pwd 
/tmp 
/tmp$ cat subdir/test.c 
int foo() { 
    return 42; 
} 

/tmp$ gcc -g -O0 -c subdir/test.c -o test.o 
/tmp$ readelf --debug-dump=info test.o | grep -A4 compile_unit 
<0><b>: Abbrev Number: 1 (DW_TAG_compile_unit) 
    <c> DW_AT_producer : (indirect string, offset: 0x0): GNU C 4.6.3 
    <10> DW_AT_language : 1 (ANSI C) 
    <11> DW_AT_name  : (indirect string, offset: 0xc): subdir/test.c  
    <15> DW_AT_comp_dir : (indirect string, offset: 0x1a): /tmp  
+0

正如你可以在上面的Makefile中看到的那樣,我按照你的說法編譯了,給它一個子目錄和文件。這種行爲看起來很奇怪。 –

+0

@PaulRubel:看到我的更新 –

+0

我可以看到這個決定對調試器編寫者有什麼幫助,但是在過去的一天思考這個問題,似乎getFilename()有點誤導性地命名了。我可以接受目前的情況,我不確定什麼是更好的名字,但是在完美的世界中,似乎會有另一個調用,像getFilenameRelativeToProjectPath(),它會執行getFilename當前的操作。好吧。 –

相關問題