5

命令 (および変数宣言 - alloca と global) の行番号を取得したい。命令は、命令の配列に保存されます。私は機能を持っています:

Constant* metadata::getLineNumber(Instruction* I){
    if (MDNode *N = I->getMetadata("dbg")) { // this if is never executed
        DILocation Loc(N);
        unsigned Line = Loc.getLineNumber();
        return ConstantInt::get(Type::getInt32Ty(I->getContext()), Line);
    }   // else {
      //  return NULL; }
}

そして私のmain()には次のものがあります:

errs()<<"\nLine number is "<<*metadata::getLineNumber(allocas[p]);

I->getMetadata("dbg")は falseであるため、結果は NULLです。

ターゲットプログラムをコンパイルするときやパスを実行するときにフラグを使用するなど、LLVMフレームワークを再構築せずにLLVMでdbgフラグを有効にする可能性はありますか(私は-debugを使用しました)?

「-O3 -g」を指定してプログラムをコンパイルすると、完全なデバッグ情報が得られるはずですが、結果は同じです。http://llvm.org/docs/SourceLevelDebugging.htmlを認識しています。ここから、メタデータ フィールドからソース行番号を簡単に取得できることがわかります。

PS: Allocas の場合、DbgInfoPrinter.cpp の findDbgDeclare メソッドを使用する必要があるようです。

前もって感謝します !

4

1 に答える 1

6

-gClangにフラグを指定すると、LLVMはデバッグ情報を提供します。LLVMを有効/無効にするために再構築する必要はありません-どのLLVMでも可能です(バイナリまたはバイナリパッケージから事前に構築されたものを含む)。

-O3問題は、高度に最適化されたコード( )でデバッグ情報を取得しようとしていることである可能性があります。LLVMはそのような場合に一部のコードを最適化するだけであり、情報をデバッグする意味があまりないため、これは必ずしも可能ではありません。LLVMは最適化中にデバッグ情報を保持しようとしますが、それは簡単な作業ではありません。

デバッグ情報(-O0 -g)を使用して最適化されていないコードを生成することから始め、それを処理するためのコード/パスを記述します。次に、最適化されたコードに進み、具体的に何が失われるかを調べてみてください。LLVMがばかげていると思われる場合は、遠慮なくバグを開いてください。

いくつかのランダムなヒント:

  • clang(-emit-llvm)からIRを生成し、その中のデバッグメタデータノードを確認します。opt次に、最適化を実行して、何が残っているかを確認できます。
  • その他のLLVMツールの-debugオプションllcは、ソースのデバッグ情報とはまったく関係ありません。
于 2013-02-18T20:01:33.283 に答える