本文介绍了GEP指令:i32与i64的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直试图理解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个整数的数组中),我试图很好地理解为什么会出现这种情况。

推荐答案

问题的答案,"gep取消了什么引用?"。这意味着GEP永远不会取消引用指针:它只根据您传递给它的指针计算新地址。它从不读取任何内存。

请看示例:

%idx = getelementptr { [40 x i32]* }, { [40 x i32]* }* %MyVar, i64 0, i32 0, i64 0, i64 17

我们从%MyVar开始,它是一个{ [40 x i32]* }*指针,指向包含指向数组的指针的结构。

使用i64 0索引后,我们有一个对结构{ [40 x i32]* }的引用。%MyVar已指向此,不需要取消引用。

在使用第二个i32 0进行索引之后,我们现在引用该结构的唯一成员[40 x i32]*。它与结构本身具有相同的内存位置,即%MyVar

第三个索引i64 0现在将引用[40 x i32]数组本身。这是非法的。GEP需要取消引用上一步中获取的指针才能获取此内存地址。通常,GEP永远不能"通过"指针进行索引,但明显的例外是您传递给它的初始值始终是指针。

我还将指出,出于索引目的,i32 0i64 0是相同的,它们都引用结构/数组中的第一个元素。您提到的常量17也是如此。

这篇关于GEP指令:i32与i64的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

06-04 00:50