- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在尝试理解 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 0
和 i64 0
在索引方面是相同的,两者都引用结构/数组中的第一个元素。这同样适用于您提到的常量 17
。
关于llvm - GEP指令: i32 vs i64,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30383342/
我有一个类型定义为 %Colour = type { { i32, i32, i32 }, %RED*, %GREEN*, %BLUE*, %RGB* },我使用第一个存储 RTTI 的字段,我将字段
我正在编写一个 LLVM IR pass,它在运行时更改 GetElementPtr 指令的索引操作数。 我成功地用常数整数替换了 GEP 索引。例如,下面的代码会将 GEP 指令的每个最后索引替换为
我正在尝试使用 GEP 从数组中获取 i32 的指针。 但问题是:我不知道数组的大小。 llvm.org 上的 IR 文档说 GEP 只是将偏移量添加到基地址,并使用静默包装二进制补码算法。 所以,我
getelementptr有什么区别和 store对比 load和 insertvalue将值存储到指向聚合类型的指针时?在某些情况下是首选吗?如果是这样,为什么?还是我完全走错了方向? 例子: ;
我是一名优秀的程序员,十分优秀!