2013-02-18 17 views
5

命令の行番号(および変数宣言 - allocaおよびglobal)も取得したいと考えています。命令は命令のアレイに保存されます。llvm命令の行番号

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; } 
} 

と(私のメインで)私が持っている:I->getMetadata("dbg")がfalseであるため、

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

結果はNULLである私が機能を持っています。

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

"-O3 -g"でプログラムをコンパイルすると完全なデバッグ情報が得られますが、同じ結果が得られます。私はhttp://llvm.org/docs/SourceLevelDebugging.htmlを知っています。そこから、メタデータフィールドからソース行番号を取得するのは簡単です。

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

ありがとうございます!

答えて

6

LLVMは、-gフラグをClangに指定すると、デバッグ情報を提供します。それを有効/無効にするためにLLVMを再構築する必要はありません - LLVMはこれを行います(バイナリまたはバイナリパッケージからあらかじめ構築されたものを含みます)。

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

デバッグ情報(-O0 -g)で最適化されていないコードを生成し、そのコード/パスを使って作業します。その後、最適化されたコードに卒業し、具体的に何が失われているのかを調べます。 LLVMが愚かであると思うならば、バグを開くのをためらってください。

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

  • が打ち鳴らす(-emit-llvm)からIRを生成し、それにデバッグメタデータノードを参照してください。その後、最適化を使用してoptを実行し、残っているものを確認することができます。
  • -debugllcと他のLLVMツールのオプションは、ソースのデバッグ情報とはまったく関係ありません。
+0

llvm passesから命令の行番号を変更することはできますか? – user