在llvm ir中增加一个ptr

时间:2015-03-18 06:52:28

标签: c++ llvm llvm-ir

我试图了解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

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

谢谢!

1 个答案:

答案 0 :(得分:3)

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

在你的情况下:

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

选择结构内的成员。它使用指针operatand %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