本文介绍了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 0
和i64 0
是相同的,它们都引用结构/数组中的第一个元素。您提到的常量17
也是如此。 这篇关于GEP指令:i32与i64的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!