LLVM:指针操作的值(llvm: value of pointer operation)

2019-11-05 02:08发布

我尝试learm LLVM汇编语言。 因为我没有找到任何教程,我的办法是学习编写简单的C函数,并让铛揭示与相应的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. 这是什么代码的实际逻辑是什么? 为什么一个存储指令和123-132 **类型的参与? 有没有更简单的实现在LLVM操作“的获得价值”的方式?

Answer 1:

  1. 什么是0%,即存储操作所指? 这是否指的是函数的参数? 我遇到了1%,而不是0%开始他们的变量的所有其他职能。 什么是这里的区别?

在LLVM函数定义包含可任选与标签开始basicBlocks的名单。 并且如果未然后被提供显式标签的隐含编号的标记是从相同的计数器设置为在未命名的临时使用。

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

为0%时隐用于论证和1%用于标记basicBlock,请如果你正面临着的任何问题发布错误消息此代码是有效的。

  1. 这是什么代码的实际逻辑是什么? 为什么一个存储指令和123-132 **类型的参与? 有没有更简单的实现在LLVM操作“的获得价值”的方式?

我不是一个铛,专家说,但优化LLVM的责任。 你可以用更简单的方法,

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

有可用的,如果你想了解更多关于LLVM郎一个非常漂亮的文档。 LLVM郎参考

我也有列出的几点,你可以在功能方面,标识符部分找到。



文章来源: llvm: value of pointer operation
标签: llvm