llvm::DIInstruction getFilename返回带有目录的文件名,我只需要文件名

llvm::DIInstruction getFilename返回带有目录的文件名,我只需要文件名,llvm,clang,Llvm,Clang,我正在尝试使用DILocation类从llvm指令获取调试元数据 但是,当我查询指令来自的文件名的位置时,我得到一个带有 目录标记在前面 我想它只会返回文件 并且应该通过调用getDirectory()来检索整个目录路径 例如,我没有使用XMain_0.c,而是使用pbg/XMain_0.c 我像这样编译我的位代码: XMain_0.o: pbg/XMain_0.c $(CC) <snip> -c pbg/XMain_0.c 我是否可以打电话“规范化”这些数据,还是需要手工

我正在尝试使用DILocation类从llvm指令获取调试元数据

但是,当我查询指令来自的文件名的位置时,我得到一个带有 目录标记在前面

我想它只会返回文件 并且应该通过调用getDirectory()来检索整个目录路径

例如,我没有使用XMain_0.c,而是使用pbg/XMain_0.c

我像这样编译我的位代码:

XMain_0.o: pbg/XMain_0.c
    $(CC) <snip> -c pbg/XMain_0.c
我是否可以打电话“规范化”这些数据,还是需要手工操作


Clang3.1,如果这很重要的话。

我认为这取决于编译器的调用。如果您运行:

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    
/tmp$pwd
/tmp
/tmp$cat细分/test.c
int foo(){
返回42;
}
/tmp$gcc-g-O0-c subdir/test.c-o test.o
/tmp$readelf--debug dump=info test.o | grep-A4编译单元
:Abbrev编号:1(DW_标记_编译_单元)
DW_AT_producer:(间接字符串,偏移量:0x0):GNU C 4.6.3
DW_AT_语言:1(ANSI C)
DW_AT_name:(间接字符串,偏移量:0xc):subdir/test.c
DW_AT_comp_dir:(间接字符串,偏移量:0x1a):/tmp

正如您在上面的Makefile中所看到的,我确实按照您所说的进行了编译,为它提供了一个子目录和文件。这种行为似乎很奇怪。我可以看出这个决定对调试器编写人员有多大帮助,但在过去的一天里,考虑到这一点,getFilename()的命名似乎有点误导。我可以接受当前的情况,我不确定什么是更好的名称,但在一个完美的世界中,似乎会有另一个调用,比如getFilenameRelativeToProjectPath(),它将执行getFilename当前所做的操作。哦,好吧。@PaulRubel:IIRC这符合矮人标准
/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