2017-08-04 23 views
3

私のおもちゃコンパイラ用のIR(赤外線IRなど)を設計したいと思いますが、 命令の今後の分析目的は何か分かりません。どの最適化情報でallocaの情報が使用されていますか?LLVM IR alloca命令

答えて

3

「のalloca」命令は、この 関数が呼び出し元に戻るときに自動的に解放されるように、 現在実行中の関数のスタックフレームにメモリを割り当てます。オブジェクトは常に、データレイアウトに指定されたアロケータのアドレス空間の に割り当てられます。

'alloca'命令は、アドレスが利用可能でなければならない自動 変数を表すためによく使用されます。

More you can find here

LLVMのIR帳からいくつかの注意:

全体LLVMファイルの内容を、アセンブリまたはビットコードのいずれかが、LLVMモジュールを定義すると言われています。モジュールは、LLVM IRのトップレベルのデータ構造です。各モジュールには一連の関数が含まれています。一連の関数には一連の命令を含む一連の基本ブロックが含まれています。 モジュールには、グローバル変数、ターゲットデータレイアウト、外部関数プロトタイプ、データ構造宣言など、このモデルをサポートする周辺エンティティも含まれています。

alloca命令は、IRをサポートするためのものです。

たとえば以下のコード:IRの意志で

int sum(int a, int b) { 
    return a+b; 
} 

がどのように見える:

; Function Attrs: noinline nounwind uwtable 
define i32 @sum(int, int)(i32, i32) #0 !dbg !6 { 
    %3 = alloca i32, align 4 
    %4 = alloca i32, align 4 
    store i32 %0, i32* %3, align 4 
    call void @llvm.dbg.declare(metadata i32* %3, metadata !10, metadata !11), !dbg !12 
    store i32 %1, i32* %4, align 4 
    call void @llvm.dbg.declare(metadata i32* %4, metadata !13, metadata !11), !dbg !14 
    %5 = load i32, i32* %3, align 4, !dbg !15 
    %6 = load i32, i32* %4, align 4, !dbg !16 
    %7 = add nsw i32 %5, %6, !dbg !17 
    ret i32 %7, !dbg !18 
} 

現在の関数のスタックフレーム上のalloca命令準備空間。スペースの量は、要素タイプ のサイズによって決定され、指定された配置を尊重します。最初の命令は、 %a.addr = alloca i32、4を揃えて、4バイトのスタック要素を割り当てます。 は、4バイトの境界線を考慮しています。スタック要素へのポインタはローカル識別子%a.addrに と格納されています。 alloca命令は、通常ローカル(自動)変数を表すために使用される です。

+0

ありがとう、私はそれを見ましたが、その指示がIRに明示的に存在しなければならない理由はわかりません。 – temp01m7

+0

私はあなたに 'LLVM中間表現の紹介'をお勧めします、私は答えを更新しました – Arseniy

関連する問題