我一直在尝试理解LLVM的GetElementPtr(GEP)指令,并找到了这篇文档:http://llvm.org/docs/GetElementPtr.html。它非常有帮助,但有一些我觉得很困惑的地方。特别是在“GEP解引用的内容是什么?”部分(http://llvm.org/docs/GetElementPtr.html#id6),讨论了以下代码:
%MyVar = uninitialized global { [40 x i32 ]* }
...
%idx = getelementptr { [40 x i32]* }, { [40 x i32]* }* %MyVar, i64 0, i32 0, i64 0, i64 17
%MyVar
是一个全局变量,它是指向一个包含指向40个int数组的指针的结构体的指针。这很清楚。我理解在%MyVar
之后的参数是对它的索引,但我不明白为什么有些声明为i64
,而其他一些声明为i32
。
我的理解是,这段代码是为64位机器编写的,并且假定指针的宽度为64位。由%MyVar
指向的数组的内容宽度为32位。那么,为什么最后一个索引是i64 17
而不是i32 17
?
我还应该指出,这个例子说明了GEP的非法使用(必须解除结构体中的指针引用才能索引到40个int数组),我正在努力深入理解为什么会这样。