递增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
选择结构内部的成员。它使用指针运算符和%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指令
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- .cpp和.h文件中的模板专用化声明
- 反向给定链表中的K节点
- 正在查找文档以获得PS4平台的C++中的设备信息
- enum是C++中的宏变量还是整数变量
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 将字符串存储在c++中的稳定内存中
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- C++中的指针否定 (!ptr == NULL)
- C++中的大小释放:全局运算符delete的正确行为是什么(void*ptr,std::size_t size)
- std::哈希表示无序映射中的唯一 PTR
- 为什么asm中的这种差异对性能很重要(在未优化的ptr++与++ptr循环中)
- 递增llvm-ir中的ptr
- 为什么非常量ptr不能隐式地将ptr转换为常量作为模板中的参数
- 非ptr新声明符中的错误表达式
- 为什么这个显式析构函数会导致共享ptr中的内存损坏
- 此指令中的错误 C2415 "MOV Incoming_Packet_Length,DWORD PTR SS:[EBP-14]"
- Linux中的c++运行时错误::glibc检测到free():无效的下一个大小(快速):堆栈具有void ptr元素
- char*中的C++错误PTR(无法计算表达式)
- 共享 PTR - shared_ptr 和 unique_ptr Lippman C++入门中的构造函数