Assembly LLVM访问变量

Assembly LLVM访问变量,assembly,llvm,llvm-ir,Assembly,Llvm,Llvm Ir,我知道如何在LLVM代码中存储int变量“x”,我会使用以下命令: store i32 1, i32* %x 如果我想将“%x”拉出并在命令(如add)中使用它,我该如何做 %Temp1 = add i32 1, %x 基本上,当一位评论员回答如何引用存储时,解决方案是使用load指令。 当您在LLVM中使用store指令时,您会写入某个内存地址 要读取所述变量并将其保存到虚拟寄存器中,请使用load指令 例如,考虑添加两个整数的以下函数。 define i32 @add(i32, i3

我知道如何在LLVM代码中存储int变量“x”,我会使用以下命令:

  store i32 1, i32* %x
如果我想将“%x”拉出并在命令(如
add
)中使用它,我该如何做

%Temp1 = add i32 1, %x

基本上,当一位评论员回答如何引用存储时,解决方案是使用load指令。 当您在LLVM中使用store指令时,您会写入某个内存地址

要读取所述变量并将其保存到虚拟寄存器中,请使用load指令

例如,考虑添加两个整数的以下函数。

define i32 @add(i32, i32) {
  %3 = alloca i32
  %4 = alloca i32
  store i32 %0, i32* %3
  store i32 %1, i32* %4
  %5 = load i32, i32* %3
  %6 = load i32, i32* %4
  %7 = add i32 %5, %6
  ret i32 %7
}
前两行在堆栈上为大小为四个字节的两个整数分配内存。然后,我们将函数参数的值写入这些位置。 在使用add之前,我们将这两个变量从内存加载到虚拟寄存器%5和%6中。然后执行add指令,并将结果分配给虚拟寄存器%7


然后,我们使用ret指令返回计算结果,ret指令也是构成此示例函数的单个基本块的唯一终止符

。我可能把它弄混了,但是
i32*%x
不是使用
%x
作为指针吗?因此,它不是将值存储在
%x
中,而是存储在
*%x
中,
%x
指向的内存中。如果您只需要局部变量,可以使用赋值,而不是存储/加载,并让编译器选择溢出/加载(如果需要)。@PeterCordes通常将局部变量表示为指向
alloca
ed内存的指针,然后让编译器决定是否使用寄存器替换
alloca
。这样,您就不必自己将作业转换为SSA形式,也不必费心处理phi节点。@sepp2k:谢谢,这很有意义。我还没有玩过LLVM-IR@BillyBBOB2:如果使用正确的选项编译,您可以看到编译器为C函数生成的LLVM-IR。使用
clang-O0
,可以为本地人提供LLVM-IR加载和存储说明: