LLVM:指针操作的值

  • 本文关键字:操作 指针 LLVM llvm
  • 更新时间 :
  • 英文 :


我尝试使用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 代码的问题:

  1. 存储操作所引用的 %0 是什么?这是指函数参数吗?我遇到的所有其他函数都以 %1 而不是 %0 开头。这里有什么区别?
  2. 我看到正在定义的下一个变量是 %2,这意味着跳过了 %1。而且我注意到这样做(跳过(会导致编译错误。那么这段代码是如何有效的呢?
  3. 这段代码的实际逻辑是什么?为什么涉及商店指令和 i32** 类型?有没有更简单的方法在 llvm 中实现"获取值"操作?
  1. 存储操作所引用的 %0 是什么?这是指函数参数吗?我遇到的所有其他函数都以 %1 而不是 %0 开头。这里有什么区别?

在LLVM函数定义中包含basicBlocks的列表,可以选择以标签开头。 如果未提供显式标签,则隐式编号标记来自未命名临时中使用的同一计数器。

  1. 我看到定义的下一个变量是 %2,这意味着跳过 %1。而且我注意到这样做(跳过(会导致编译错误。那么这段代码是如何有效的呢?

此代码有效,因为 %0 隐式用于参数,%1 用于标记 basicBlock,如果您遇到任何问题,请发布错误消息。

  1. 这段代码的实际逻辑是什么?为什么涉及商店指令和 i32** 类型?有没有更简单的方法在 llvm 中实现"获取值"操作?

我不是专家,但优化是llvm的责任。 对于更简单的使用方式,

define i32 @getVal(i32*) #0 {
%2 = load i32, i32* %0
ret i32 %2
}

如果你想了解更多关于LLVM lang的信息,有一个非常好的文档可用。 LLVM Lang Ref

还有我列出的要点,您可以在功能,标识符部分找到。

最新更新