递增llvm-ir中的ptr

incrementing a ptr in llvm ir

本文关键字:ptr 中的 llvm-ir 递增      更新时间:2023-10-16

我试图理解llvm IR中的getelementptr指令,但没有完全理解。

我有一个结构如下-

struct Foo {
    int32_t* p;
}

我想做这个-

foo.p++;

什么是正确的代码?

%0 = getelementptr %Foo* %fooPtr, i32 0, i32 0
%1 = getelementptr i32* %0, i8 1
store i32* %1, i32* %0

我想知道在执行第二行之前是否需要首先使用"load"加载%0中的值。

谢谢!

您可以将GEP指令视为对指针执行算术运算的操作。在LLVM IR中,GEP指令是您选择的指令,可以轻松地对指针执行操作。您不必繁琐地计算类型和偏移量的大小来手动执行此类操作。

在您的情况下:

%0 = getelementptr %Foo* %fooPtr, i32 0, i32 0

选择结构内部的成员。它使用指针运算符和%fooPtr来计算%0 = ((fooPtr + 0) + 0)。GEP不知道fooPtr只是指向Foo的一个元素,这就是为什么使用两个索引来选择成员的原因。

%1 = getelementptr i32* %0, i8 1

如上所述,GEP执行指针运算,在您的情况下获得%1 = (p + 1);

由于您使用GEP操作指针,因此不需要加载p的值。GEP将为您隐式地执行此操作。

现在,您可以将新索引存储回fooPtr指向的Foo结构中p成员的位置。

进一步阅读:经常被误解的GEP指令