我正在尝试了解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
选择结构内的成员。它使用指针operatort和
%fooPtr
来计算%0 = ((fooPtr + 0) + 0)
。 GEP不知道fooPtr仅指向Foo的一个元素,这就是为什么使用两个索引来选择成员的原因。%1 = getelementptr i32* %0, i8 1
如上所述,GEP执行指针算术,在您的情况下获取
%1 = (p + 1);
由于您正在使用GEP处理指针,因此不需要加载p的值。 GEP将为您隐式执行此操作。
现在,您可以将新索引存储回
p
指向的Foo
结构内fooPtr
成员的位置。进一步阅读:The Often Misunderstood GEP Instruction
关于c++ - 在llvm ir中增加ptr,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29115797/