2017-08-04 153 views
3

我想爲我的玩具編譯器設計一個IR(如LLVM IR),我不知道 alloca指令在進一步分析中的用途是什麼。在哪些優化alloca信息被使用?LLVM IR alloca指令

回答

3

在「ALLOCA」指令分配 當前正在執行的函數的堆棧幀存儲器,當該 函數返回到其調用者被自動釋放。該對象始終在數據佈局中指示的地址空間中分配用於分配的 地址空間。

'alloca'指令通常用於表示必須具有可用地址的自動變量 。

More you can find here

一些從LLVM IR書說明:

整個LLVM文件的內容,用匯編語言或位碼,被說成限定LLVM模塊。該模塊是LLVM IR頂級數據結構。每個模塊都包含一系列函數,其中包含一系列包含一系列指令的基本塊。 該模塊還包含支持此模型的外圍實體,如全局變量,目標數據佈局,外部函數原型以及數據結構聲明。

所以alloca指令(在我的說明中)只是爲了支持IR。

例如以下代碼:

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

在IR意願看起來像:

; 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,align 4,分配一個4字節的堆棧元素,其中 代表一個4字節的對齊方式。指向堆棧元素的指針在本地標識符%a.addr中存儲爲 。 alloca指令通常是用來表示本地(自動)變量的 。

+0

謝謝你,我看到了,但我不清楚爲什麼該指令必須在IR中明確存在。 – temp01m7

+0

我會推薦你​​一本書'介紹LLVM中間代表',我已經更新了我的答案 – Arseniy