我正在努力想出如何使用LLVM C++ API分配数组元素。考虑以下C代码:
int main()
{
int aa[68];
aa[56] = 7;
return 0;
}
使用
clang -S -emit-llvm main.c
我得到了以下IR(为简化起见,属性和其他内容被略去):
define dso_local i32 @main() #0 {
%1 = alloca i32, align 4
%2 = alloca [68 x i32], align 16
store i32 0, i32* %1, align 4
%3 = getelementptr inbounds [68 x i32], [68 x i32]* %2, i64 0, i64 56
store i32 7, i32* %3, align 16
ret i32 0
}
我已经知道如何创建一个入站的GEP,但是当将一个值(7)存储到数组中时,类型是指向 i32 的指针。
我的语言非常类似于C,这就是为什么我使用C作为示例(到目前为止它只是具有不同语法的C)。 生成的IR代码如下:
define i32 @main() {
%0 = alloca [2 x i32], align 4
%1 = getelementptr [2 x i32], [2 x i32]* %0, i32 1
store i32 1, [2 x i32]* %1, align 4
ret i32 0
}
我如何将 [2 x i32]* 转换为 i32* 在创建存储时?这是我创建存储的方式:
llvm::AllocaInst *stored = symbol_table[arr_name];
llvm::Value *result = ir_builder->CreateGEP(stored->getAllocatedType(), stored, idx_vals);
// idx_vals contains the index
ir_builder->CreateStore(val, result); // here val is a value stored in a symbol table
// and it's type is llvm::Value *
[2 x i32]
存储到[2 x i32]*
中。使用%A = insertvalue [2 x i32] undef, i32 7, 0
和%B = insertvalue [2 x i32] %A, i32 8, 1
构建一个[2 x i32]
。您可以在任何值或类型上调用thing->dump()
以查看它是什么(对于值,它包括类型)。您应该能够看到您的%1
是一个[2 x i32]*
而不是i32*
,并且我示例中的%B
是一个[2 x i32]
数组。 - Nick Lewycky