对LLVM数组感到困惑

时间:2016-07-24 04:14:34

标签: llvm

我对从LLVM数组创建,存储和获取值的步骤感到困惑,到目前为止我正在创建它:

auto type = llvm::ArrayType::get(<TYPE>, <SOME_UINT>);
auto array = builder.CreateAlloca(type);

有了这个,我试图将llvm :: InBoundGEP添加到每个元素并将llvm :: Value存储到它们,但这没有用......

有没有这方面的指南?

2 个答案:

答案 0 :(得分:1)

好吧,今天我发现了有限公司-march = cpp工具并且实际上帮了我很多,所以我会在这里回答我最后做的事情:

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

auto arrayType = llvm::ArrayType::get(llvm::IntegerType::get(context, 32), size);
auto arrayPtr = new llvm::AllocaInst(arrayType, "", block);

现在我们将一些值存储到数组中,因为我们需要整数(读取GetElementPtr手册以了解它们中的每一个),第二个整数将告诉索引(如在数组[index]中):< / p>

auto zero = llvm::ConstantInt::get(context, llvm::APInt(64, 0, true));
auto index = llvm::ConstantInt::get(context, llvm::APInt(32, INDEX, true));

现在我们可以指向数组中的元素并存储一些东西,(我们将存储与array [index] = index中相同的索引):

auto ptr = llvm::GetElementPtrInst::Create(arrayPtr, { zero, index }, "", block);
auto store = new llvm::StoreInst(index, ptr, false, block);

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

现在加载,假设你有一个llvm :: Value作为索引(这是我的情况,并且ExtractElementInst没有处理它,据我所知,至少......):

首先获得元素的ptr(就像之前一样):

ptr = llvm::GetElementPtrInst::Create(arrayPtr, { zero, index }, "", block);

并将值加载到某个变量:

auto value = builder.CreateLoad(ptr);

我学到了一些东西,你不能轻易创建变长数组,你将不得不使用一些我实际上并不知道如何使用的堆栈技巧,但如果你想知道,这里有使用说明:http://llvm.org/docs/LangRef.html#llvm-stacksave-intrinsic

尝试编译这个简单的代码:

int n = 5; int array [n];

clang -S -llvm-emit your-file.c

你会看到那些指示。

答案 1 :(得分:0)

在#Shello的代码之后,我也将其用于GlobalVariable数组:

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

}