我想为我的玩具编译器设计一个IR(如LLVM IR),我不知道 alloca
指令在进一步分析中的用途是什么。在哪些优化alloca
信息被使用?LLVM IR alloca指令
3
A
回答
3
在“ALLOCA”指令分配 当前正在执行的函数的堆栈帧存储器,当该 函数返回到其调用者被自动释放。该对象始终在数据布局中指示的地址空间中分配用于分配的 地址空间。
'alloca'指令通常用于表示必须具有可用地址的自动变量 。
一些从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指令通常是用来表示本地(自动)变量的 。
相关问题
- 1. LLVM IR指令插入
- 2. LLVM擦除指令IR
- 3. 如何llvm红外订单alloca指令
- 4. 插入GetElementpointer指令在LLVM IR
- 5. 替换LLVM IR中的指令
- 6. LLVM IR插入
- 7. LLVM IR浮点数铸造
- 8. 调试LLVM IR
- 9. 单声道LLVM和LLVM-IR
- 10. 复制llvm指令
- 11. 错误而在LLVM IR
- 12. LLVM-IR数组指针赋值
- 13. 如何比较LLVM-IR中的指针?
- 14. llvm alloca依赖关系
- 15. LLVM IR指令和源代码行之间的映射关系
- 16. 从LLVM IR中清除基本块中的第一条指令?
- 17. 如何获得LLVM IR指令的文本表示?
- 18. 的指令集的下一个节点在LLVM IR
- 19. LLVM IR:带有变量BasicBlock目标的分支指令?
- 20. LLVM IR Lambda函数
- 21. 预评估LLVM IR
- 22. LLVM不能从IR
- 23. GCC IR与LLVM IR有何不同?
- 24. 将GCC IR转换为LLVM IR
- 25. llvm ir没有按预期运行
- 26. 如何解析LLVM IR
- 27. LLVM IR getelementptr LLVM C API等效
- 28. 在LLVM IR中,我想复制一组指令,并通过LLVM传递将这些指令粘贴到IR中的另一个位置。这个怎么做?
- 29. 如何使用call和alloca指令定位llvm字节码中的类名?
- 30. 在LLVM IR中递增变量
谢谢你,我看到了,但我不清楚为什么该指令必须在IR中明确存在。 – temp01m7
我会推荐你一本书'介绍LLVM中间代表',我已经更新了我的答案 – Arseniy