如何在 llvm 的 cpp api 中使用 CreateInBoundsGEP 来访问数组的元素?
How to use CreateInBoundsGEP in cpp api of llvm to access the element of an array?
我是llvm编程的新手,我正在尝试编写cpp来为一个简单的C代码生成llvm ir,如下所示:
int a[10];
a[0] = 1;
我想生成这样的东西来存储 1 到 a[0] 中
%3 = getelementptr inbounds [10 x i32], [10 x i32]* %2, i64 0, i64 0
store i32 1, i32* %3, align 16
我尝试了CreateGEP
:auto arrayPtr = builder.CreateInBoundsGEP(var, num);
var
和 num
都是llvm::Value*
型
但我只得到
%1 = getelementptr inbounds [10 x i32], [10 x i32]* %0, i32 0
store i32 1, [10 x i32]* %1
我在谷歌上搜索了很长时间,查看了llvm手册,但仍然不知道要使用什么Cpp api以及如何使用它。
如果你能帮忙,真的很感激!
请注意,要IRBuilder::CreateInBoundsGEP
的第二个参数(第一个重载(实际上是ArrayRef<Value *>
的,这意味着它接受一个Value *
值数组(包括 C 样式数组、std::vector<Value *>
和 std::array<Value *, LEN>
等(。
要生成具有多个(子(地址的 GEP 指令,请将Value *
数组传递给第二个参数:
Value *i32zero = ConstantInt::get(contexet, APInt(32, 0));
Value *indices[2] = {i32zero, i32zero};
builder.CreateInBoundsGEP(var, ArrayRef<Value *>(indices, 2));
这将产生
%1 = getelementptr inbounds [10 x i32], [10 x i32]* %0, i32 0, i32 0
您可以正确识别%1
的类型为 i32*
,指向 %0
指向的数组中的第一项。
关于 GEP 指令的 LLVM 文档:https://llvm.org/docs/GetElementPtr.html
相关文章:
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 用于访问容器<T>数据成员的正确 API
- 访问者访问变体并返回不同类型时出错
- 尝试通过多个向量访问变量时,向量下标超出范围
- 无法访问嵌套类.类的使用无效
- 写入位置0x0000000C时发生访问冲突
- 我们可以访问一个不存在的联盟的成员吗
- C++从另一个类访问公共静态向量的正确方法是什么
- 我的简单if-else语句是如何无法访问的代码
- 从C++dll访问C#中的一行主要参数
- 概念TS检查忽略私有访问修饰符
- 访问被拒绝后,c++中的故障保护代码
- 在c++中访问int到类对象的映射时出错
- 我想访问std::unique_ptr中的一个特定元素
- 为什么示例代码访问IUnknown中已删除的内存
- C++:无法访问声明的受保护成员
- 通过指向指针数组的指针访问子类的属性
- 如何使用单独文件中的派生类访问友元函数对象