私はLLVM 3.4で作業しており、IRからソースファイルの行番号情報を取得したいと考えています。 IRは、Clangの単純なcコードから生成されます。 IR本体の行からソースcファイルの行番号を取得します。 ;.llファイルからソース行番号を取得する方法LLVM
命令BIの- 、 符号なしline =行= BI-> getDebugLoc()のgetline() -
は、私はこれを試みました。
- ループ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
ありがとう!
あなたが最適化されているので、ソース行番号の順に入力ソースを表現する出力を期待する理由はないもソースの行ごとにコードの塊があることを期待する。 llvmにそれらを埋めるライブラリがあり、それがあなたが探しているもののための行がないかもしれないとあなたが尋ねているものでしょう。おそらく最適化されていないものを試してみて、それが物事を変えるかどうかを見てください –
ありがとう!私は-O0で試しましたが、それでも0を表示します。 コマンド:〜/ llvm/build /リリース+アサルト/ bin/clang -O0 -S -emit-llvm sample.c -o sample.ll ループと命令を検出して分析できます。関数内で使用しています - runOnLoop(Loop * L、LPPassManager&LPM) –
コンパイルコマンドラインでデバッグ情報を要求していないようです。 – Mat