【发布时间】:2015-05-21 20:04:34
【问题描述】:
我一直在尝试理解 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 个整数数组的指针。这很清楚。我知道%MyVar 之后的参数是其中的索引,但我不明白为什么其中一些被声明为i64 而另一些被声明为i32。
我的理解是这段代码是为 64 位机器编写的,并且指针被假定为 64 位宽。 %MyVar 指向的数组内容为 32 位宽。那为什么最后一个索引是i64 17 而不是i32 17?
我还应该指出,这个例子说明了 GEP 的非法使用(必须取消引用结构中的指针才能索引到 40 个整数的数组),我试图很好地理解为什么会这样案例。
【问题讨论】: