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

时间:2013-01-04 22:25:02

标签: llvm clang

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

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

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

例如,而不是XMain_0.c我最终得到了pbg / XMain_0.c

我编译了我的bitcode:

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

我是否可以通过电话对这些数据进行“规范化”,还是需要手工完成?

Clang 3.1如果重要的话。

1 个答案:

答案 0 :(得分: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