2017-08-04 152 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