llvm::DIInstruction getFilename возвращает имя файла с каталогом, я просто хочу имя файла
Я пытаюсь получить отладочные метаданные из инструкции llvm с помощью класса DILocation.
Однако, когда я запрашиваю 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
Есть ли какие-то звонки, которые я могу сделать, чтобы "нормализовать" эти данные, или мне нужно сделать это вручную?
Clang 3.1, если это имеет значение.
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