在 llvm ir 中增加一个 ptr
incrementing a ptr in 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
我想知道在执行第二行之前是否需要先使用 "load" 加载 %0 中的值。
谢谢!
你可以把GEP指令看成是对指针进行算术运算的操作。在 LLVM IR 中,GEP 指令是您选择的指令,可以轻松地对指针执行操作。您不必进行繁琐的计算类型和偏移量的大小来手动执行此类操作。
你的情况:
%0 = getelementptr %Foo* %fooPtr, i32 0, i32 0
selects 结构中的成员。它使用指针操作数%fooPtr
来计算%0 = ((fooPtr + 0) + 0)
。 GEP 不知道 fooPtr 只是指向 Foo 的一个元素,这就是为什么两个索引用于 select 成员的原因。
%1 = getelementptr i32* %0, i8 1
如上所述,GEP 执行指针运算,在您的情况下得到 %1 = (p + 1);
由于您使用 GEP 对指针进行操作,因此不需要加载 p 的值。 GEP 会隐式地为您执行此操作。
现在您可以将新索引存储回 fooPtr
指向的 Foo
结构中 p
成员的位置。
我正在尝试理解 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
selects 结构中的成员。它使用指针操作数%fooPtr
来计算%0 = ((fooPtr + 0) + 0)
。 GEP 不知道 fooPtr 只是指向 Foo 的一个元素,这就是为什么两个索引用于 select 成员的原因。
%1 = getelementptr i32* %0, i8 1
如上所述,GEP 执行指针运算,在您的情况下得到 %1 = (p + 1);
由于您使用 GEP 对指针进行操作,因此不需要加载 p 的值。 GEP 会隐式地为您执行此操作。
现在您可以将新索引存储回 fooPtr
指向的 Foo
结构中 p
成员的位置。