LLVM-C中如何获取数组元素类型并生成正确的store指令
在LLVM-C中获取数组元素类型并生成正确的GEP指针用于Store指令
1. 获取数组元素类型
LLVM-C提供了LLVMGetElementType函数,可直接从数组类型中提取元素类型。对于你的[2 x i32]数组类型,调用该函数就能得到i32类型:
LLVMTypeRef arrty = LLVMArrayType(LLVMIntTypeInContext(context, 32), 2); LLVMTypeRef elem_ty = LLVMGetElementType(arrty); // elem_ty 即为i32类型
2. 修正GEP指令生成i32*指针
你当前的GEP仅传入一个索引,导致生成的是[2 x i32]*类型指针——这是因为对数组指针来说,单个索引是对指针进行数组级偏移(指向内存中相邻的另一个同类型数组)。要访问数组内部元素,需要传入两个索引:
- 第一个索引设为0:表示访问当前alloca分配的数组本身(而非内存中其他数组)
- 第二个索引设为目标元素的下标(比如1对应数组的第二个元素)
修正后的完整代码:
LLVMTypeRef arrty = LLVMArrayType(LLVMIntTypeInContext(context, 32), 2); LLVMValueRef alloca = LLVMBuildAlloca(builder, arrty, ""); // 定义GEP所需的两个索引 LLVMValueRef indices[] = { LLVMConstInt(LLVMInt32TypeInContext(context), 0, 0), LLVMConstInt(LLVMInt32TypeInContext(context), 1, 0) }; // 调用GEP时传入两个索引,索引数量指定为2 LLVMValueRef gep = LLVMBuildGEP2( builder, LLVMGetAllocatedType(alloca), alloca, indices, 2, "" ); LLVMValueRef x = LLVMConstInt(LLVMIntTypeInContext(context, 32), 2, 0); LLVMBuildStore(builder, x, gep); // 此时gep类型为i32*,可直接用于store
执行这段代码后,会生成你期望的IR:
%1 = alloca [2 x i32] %2 = gep [2 x i32], [2 x i32]* %1, i32 0, i32 1 store i32 2, i32* %2
内容的提问来源于stack exchange,提问作者user14590156
相关产品推荐
相关产品推荐

