【发布时间】:2019-01-18 11:44:50
【问题描述】:
我尝试学习 llvm 汇编语言。 由于我没有找到任何教程,我的学习方式是编写简单的 C 函数,并让 clang 显示相应的 llvm 代码:
clang -S -emit-llvm simple.c
我现在正在尝试学习如何使用指针。于是我测试了以下C函数:
int getVal(int* ptr) { return *ptr; }
它生成了以下 llvm:
define i32 @getVal(i32*) #0 {
%2 = alloca i32*, align 8
store i32* %0, i32** %2, align 8
%3 = load i32*, i32** %2, align 8
%4 = load i32, i32* %3, align 4
ret i32 %4
}
关于 llvm 代码的问题:
- 存储操作所指的 %0 是什么?这是指函数参数吗?我遇到的所有其他函数都以 %1 开头,而不是 %0。这里有什么区别?
- 我看到定义的下一个变量是 %2,这意味着 %1 被跳过。而且我注意到这样做(跳过)会导致编译错误。那么这段代码是如何有效的呢?
- 这段代码的实际逻辑是什么?为什么会涉及到 store 指令和 i32** 类型?有没有更简单的方法在 llvm 中实现“get value of”操作?
【问题讨论】:
标签: llvm