对LLVM阵列感到困惑

对LLVM阵列感到困惑,llvm,Llvm,我对从LLVM阵列创建、存储和获取值的步骤有点困惑,到目前为止,我使用以下方法创建它: auto type = llvm::ArrayType::get(<TYPE>, <SOME_UINT>); auto array = builder.CreateAlloca(type); auto-type=llvm::ArrayType::get(,); 自动数组=builder.CreateAlloca(类型); 有了它,我尝试将llvm::InBoundGEP添加到每个元

我对从LLVM阵列创建、存储和获取值的步骤有点困惑,到目前为止,我使用以下方法创建它:

auto type = llvm::ArrayType::get(<TYPE>, <SOME_UINT>);
auto array = builder.CreateAlloca(type);
auto-type=llvm::ArrayType::get(,);
自动数组=builder.CreateAlloca(类型);
有了它,我尝试将llvm::InBoundGEP添加到每个元素并将llvm::Value存储到元素中,但没有成功


有什么指导吗?

好吧,今天我发现了llc-march=cpp工具,实际上对我帮助很大,所以我将在这里回答我最后做了什么:

创建数组(为此,我们首先需要类型):

现在我们将把一些值存储到数组中,为此我们需要使用整数(阅读GetElementPtr手册以了解它们中的每一个都是整数),第二个整数将告诉索引(如array[index]):

现在我们可以指向数组中的元素并向其存储某些内容(我们将存储与数组[index]=index中相同的索引):

对数组的每个元素执行此操作

现在加载,假设您有一个llvm::Value作为索引(这是我的情况,ExtractElementInst没有处理这个问题,至少据我所知…):

首先获取元素的ptr(与前面一样):

并将值加载到某个变量:

auto value = builder.CreateLoad(ptr);

我学到了一件事,你无法轻松创建可变长度数组,你必须使用一些堆栈技巧,我现在还不知道如何使用,但如果你想知道,以下是使用说明:

请尝试编译以下简单代码:

int n=5; 整数数组[n]

使用
clang-S-llvm发出文件.c


您将看到这些说明。

好吧,今天我发现了llc-march=cpp工具,实际上帮助了我很多,所以我将在这里回答我最后做了什么:

创建数组(为此,我们首先需要类型):

现在我们将把一些值存储到数组中,为此我们需要使用整数(阅读GetElementPtr手册以了解它们中的每一个都是整数),第二个整数将告诉索引(如array[index]):

现在我们可以指向数组中的元素并向其存储某些内容(我们将存储与数组[index]=index中相同的索引):

对数组的每个元素执行此操作

现在加载,假设您有一个llvm::Value作为索引(这是我的情况,ExtractElementInst没有处理这个问题,至少据我所知…):

首先获取元素的ptr(与前面一样):

并将值加载到某个变量:

auto value = builder.CreateLoad(ptr);

我学到了一件事,你无法轻松创建可变长度数组,你必须使用一些堆栈技巧,我现在还不知道如何使用,但如果你想知道,以下是使用说明:

请尝试编译以下简单代码:

int n=5; 整数数组[n]

使用
clang-S-llvm发出文件.c

您将看到这些说明。

下面是Shello的代码,我也将其用于全局变量数组:

Value *index_pointer(GlobalVariable *array, Value *index) {
  return Builder.CreateGEP(
    array, {ConstantInt::get(Context, APInt(64, 0, true)), index}, "tmp");
}

以下是Shello的代码,我也将其用于GlobalVariable数组:

Value *index_pointer(GlobalVariable *array, Value *index) {
  return Builder.CreateGEP(
    array, {ConstantInt::get(Context, APInt(64, 0, true)), index}, "tmp");

}

请具体说明您尝试了什么,以及它以什么方式不起作用。好吧,就是这样,我真的不知道该怎么做,如何才能获得指向数组元素的指针?,然后读取/存储到它?对于使用extractelement的arraytype和load,请参见,对于GetElementPointer,请具体说明您尝试了什么,以及它以什么方式不起作用。好吧,就是这样,我真的不知道该怎么做,如何才能获得指向数组元素的指针?,然后读取/存储到它?对于arraytype和使用extractelement加载,请参见;对于GetElementPointer,如果有人发现代码有什么奇怪的地方,请告诉我,我在这里学习,欢迎任何反馈。令人惊讶的解释,你修复了我的核心问题,我在索引数组上犯了一个错误,因为我确实理解了语义。谢谢如果有人发现代码有什么奇怪的地方,请告诉我,我在这里学习,欢迎任何反馈。令人惊讶的解释,你修复了我的核心哑巴,我在索引数组上犯了一个错误,因为我理解了语义。谢谢
auto value = builder.CreateLoad(ptr);
Value *index_pointer(GlobalVariable *array, Value *index) {
  return Builder.CreateGEP(
    array, {ConstantInt::get(Context, APInt(64, 0, true)), index}, "tmp");