如何在 llvm 的 cpp api 中使用 CreateInBoundsGEP 来访问数组的元素?

How to use CreateInBoundsGEP in cpp api of llvm to access the element of an array?

本文关键字:访问 CreateInBoundsGEP 数组 元素 llvm cpp api      更新时间:2023-10-16

我是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

我尝试了CreateGEPauto arrayPtr = builder.CreateInBoundsGEP(var, num); varnum都是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