gpt4 book ai didi

syntax - 了解最简单的 LLVM IR

转载 作者:行者123 更新时间:2023-12-03 07:34:00 27 4
gpt4 key购买 nike

我改造了最简单的C代码

#include <stdio.h>

int main()
{
return 0;
}

到它的 LLVM IR,使用

clang -emit-llvm -S hello.c 

生成的IR是:

define i32 @main() #0 {
%1 = alloca i32, align 4
store i32 0, i32* %1
ret i32 0
}

但是,我不明白这个IR。 (LLVM 文档有帮助,但对于初学者来说没有多大帮助)

  1. 为什么我们有%1 = alloca i32,align 4?它在原始代码中对应什么?
  2. 同样的问题store i32 0, i32* %1
  3. alloca 是否意味着在堆栈上分配(而不是动态分配)?
  4. “对齐 4”是什么意思?

最佳答案

 define i32 @main() #0

这定义了一个名为 main 的函数,它返回一个 32 位整数。 #0 表示为该函数使用名为 #0 的属性。例如,IR 中可能有类似 attributes #0 = { alwaysinlinealignstack=4 } 的内容,这些属性将应用于 main

%1 = alloca i32, align 4

这会在堆栈上分配一个 32 位整数。 %1 是指向堆栈上此位置的指针的名称。 align 4 确保地址是 4 的倍数

store i32 0, i32* %1

这会将 %1 指向的 32 位整数设置为 32 位值 0。这就像 C++ 中的 *x = 1

ret i32 0

该函数从 32 位返回值 0 返回

考虑到 main 中没有局部变量,分配很奇怪。 LLVM 使用BasicBlock 来表示指令组,基本 block 具有退出点和指令列表。我的猜测是编译器决定使用 return 作为基本 block 的退出,并选择将至少一条指令放入该 block 中。该分配基本上是一个空操作。

关于syntax - 了解最简单的 LLVM IR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27447865/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com