gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 04:04:29 33 4
gpt4 key购买 nike

我是 llvm 编程的新手,我正在尝试编写 cpp 来为这样的简单 C 代码生成 llvm ir:

int a[10];
a[0] = 1;

我想生成这样的东西来将 1 存储到 [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); 其中 varnum 都是 llvm::Value*

类型

但我只得到

  %1 = getelementptr inbounds [10 x i32], [10 x i32]* %0, i32 0
store i32 1, [10 x i32]* %1

google了半天,看了llvm手册,还是不知道用什么cpp api,怎么用。

如果您能提供帮助,我们将不胜感激!

最佳答案

请注意 IRBuilder::CreateInBoundsGEP (1st overload) 的第二个参数实际上是 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

关于c++ - 如何在llvm的cpp api中使用CreateInBoundsGEP来访问数组的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58989164/

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