2016-07-12 25 views
5

私はLLVM 3.4で作業しており、IRからソースファイルの行番号情報を取得したいと考えています。 IRは、Clangの単純なcコードから生成されます。 IR本体の行からソースcファイルの行番号を取得します。 ;.llファイルからソース行番号を取得する方法LLVM

命令BIの
  1. 、 符号なしline =行= BI-> getDebugLoc()のgetline() -

    は、私はこれを試みました。

  2. ループLの場合、std :: cout < < L-> getStartLoc()。getLine();

しかし、結果は常に0です。LLVM IRからソースの行番号を取得する方法はわかりません。

マイソースCファイルがある -

#include <stdio.h> 

int main() 
{ 

int i; 

int inbuf[100]; 
int outbuf[100]; 

for(i = 0; i < 100; ++i)   
     inbuf[i] ^= outbuf[i]; 

inbuf[1] += 402; 
inbuf[6] += 107; 
inbuf[97] += 231; 

for(i = 0; i < 100; ++i)  
{ 
     inbuf[i] += outbuf[i]; 
} 

inbuf[47] += 312; 

    //print-statements 
for (i=0;i<100;i++) { 
     printf("inbuf[%d] = %d\n",i,inbuf[i]);    
} 

return 0; 

コマンドUsed- 〜/ LLVM /ビルド/リリース+がアサート/ binに/打ち鳴らす-O3 -fnoアンロールループ-fno-ベクトル化-fno -slp-vectorize -S -emit -llvm sample.c -o sample.ll

ありがとう!

+0

あなたが最適化されているので、ソース行番号の順に入力ソースを表現する出力を期待する理由はないもソースの行ごとにコードの塊があることを期待する。 llvmにそれらを埋めるライブラリがあり、それがあなたが探しているもののための行がないかもしれないとあなたが尋ねているものでしょう。おそらく最適化されていないものを試してみて、それが物事を変えるかどうかを見てください –

+0

ありがとう!私は-O0で試しましたが、それでも0を表示します。 コマンド:〜/ llvm/build /リリース+アサルト/ bin/clang -O0 -S -emit-llvm sample.c -o sample.ll ループと命令を検出して分析できます。関数内で使用しています - runOnLoop(Loop * L、LPPassManager&LPM) –

+0

コンパイルコマンドラインでデバッグ情報を要求していないようです。 – Mat

答えて

3

.llファイルに行番号情報を取得するには、-O0-gフラグをclangに指定する必要があります。

http://llvm.org/docs/SourceLevelDebugging.html#debugging-optimized-code

行番号は、特殊なメタデータ・ノードに格納されています。

http://llvm.org/docs/LangRef.html#specialized-metadata-nodes

だから、完全なコマンドラインは次のようになります。

~/llvm/build/Release+Asserts/bin/clang -O0 -g -S -emit-llvm sample.c -o sample.ll

+0

ありがとう! -gを追加すると動作します。最初にflag -fstandalone-debugを追加しました。 しかし、-gを追加すると、-O0と-O3の両方が働きました。どうもありがとう! :) –

+2

あなたは間違いなく-O0は必要ありません。列情報が必要な場合は、おそらく-g、おそらく-gcolumn-infoが必要になります。 -fstandalone-debugは、型がデバッグ情報に送出されるかどうかを制御するだけです。通常は、クラスの主要な関数を発行したときにキー関数を発行していない場合、デバッグ情報がそこにあることを確認します。 – echristo

+0

まさに!すべての情報をありがとう@echristo。 –

関連する問題