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    
Другие вопросы по тегам