2013-01-04 54 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当前的操作。好吧。 –

相关问题