我对从 LLVM 数组创建、存储和获取值的步骤有些困惑,到目前为止,我正在创建它:
auto type = llvm::ArrayType::get(<TYPE>, <SOME_UINT>);
auto array = builder.CreateAlloca(type);
Run Code Online (Sandbox Code Playgroud)
有了这个,我试图让 llvm::InBoundGEP 到每个元素并将 llvm::Value 存储到他们,但这没有用......
是否有一些指南可以做到这一点?
好吧,今天我发现了 llc -march=cpp 工具,实际上对我帮助很大,所以我将在这里回答我最后做了什么:
创建数组(为此我们首先需要类型):
auto arrayType = llvm::ArrayType::get(llvm::IntegerType::get(context, 32), size);
auto arrayPtr = new llvm::AllocaInst(arrayType, "", block);
Run Code Online (Sandbox Code Playgroud)
现在我们将一些值存储到数组中,为此我们需要整数(阅读 GetElementPtr 手册以了解它们中的每一个都这样做),第二个整数将告诉索引(如 array[index]):
auto zero = llvm::ConstantInt::get(context, llvm::APInt(64, 0, true));
auto index = llvm::ConstantInt::get(context, llvm::APInt(32, INDEX, true));
Run Code Online (Sandbox Code Playgroud)
现在我们可以指向数组中的元素并向其存储一些内容(我们将存储与 array[index] = index 相同的索引):
auto ptr = llvm::GetElementPtrInst::Create(arrayPtr, { zero, index }, "", block);
auto store = new llvm::StoreInst(index, ptr, false, block);
Run Code Online (Sandbox Code Playgroud)
对数组的每个元素执行此操作。
现在加载,假设你有一个 llvm::Value 作为索引(这是我的情况,而 ExtractElementInst 没有处理,至少据我所知......):
首先获取元素的ptr(就像以前一样):
ptr = llvm::GetElementPtrInst::Create(arrayPtr, { zero, index }, "", block);
Run Code Online (Sandbox Code Playgroud)
并将值加载到某个变量:
auto value = builder.CreateLoad(ptr);
Run Code Online (Sandbox Code Playgroud)
我学到了一件事,你不能轻易地创建变长数组,你必须使用一些我目前还不知道如何使用的堆栈技巧,但如果你想知道,这里是使用说明:http: //llvm.org/docs/LangRef.html#llvm-stacksave-intrinsic
尝试编译这个简单的代码:
整数 n = 5; 整数数组[n];
和 clang -S -llvm-emit your-file.c
你会看到这些说明。