4

DILocationクラスを使用してllvm命令からデバッグメタデータを取得しようとしています。

ただし、命令の送信元のファイル名を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

このデータを「正規化」するために呼び出すことができる呼び出しはありますか、それとも手動で行う必要がありますか?

それが重要な場合はClang3.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 に答える