我对从LLVM数组创建,存储和获取值的步骤感到困惑,到目前为止我正在创建它:
auto type = llvm::ArrayType::get(<TYPE>, <SOME_UINT>);
auto array = builder.CreateAlloca(type);
有了这个,我试图将llvm :: InBoundGEP添加到每个元素并将llvm :: Value存储到它们,但这没有用......
有没有这方面的指南?
答案 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");
}