我正在尝试使用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如果重要的话。
答案 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