4

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

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

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

例如,我最终得到 pbg/XMain_0.c 而不是 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

我可以打电话来“规范化”这些数据还是我需要手动完成?

如果重要的话,Clang 3.1。

4

1 回答 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    
于 2013-01-05T13:36:56.920 回答