gpt4 book ai didi

llvm - GEP指令: i32 vs i64

转载 作者:行者123 更新时间:2023-12-02 14:36:59 30 4
gpt4 key购买 nike

我一直在尝试理解 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 永远无法“通过”指针进行索引,但有一个明显的异常(exception),即传递给它的初始值始终是一个指针。

我还要指出,i32 0i64 0 在索引方面是相同的,两者都引用结构/数组中的第一个元素。这同样适用于您提到的常量 17

关于llvm - GEP指令: i32 vs i64,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30383342/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com