[midend]修复全局数组类型问题
This commit is contained in:
@ -146,7 +146,11 @@ std::any SysYIRGenerator::visitGlobalVarDecl(SysYParser::GlobalVarDeclContext *c
|
|||||||
delete root;
|
delete root;
|
||||||
}
|
}
|
||||||
// 创建全局变量,并更新符号表
|
// 创建全局变量,并更新符号表
|
||||||
module->createGlobalValue(name, Type::getPointerType(type), dims, values);
|
Type* variableType = type;
|
||||||
|
if (!dims.empty()) { // 如果有维度,说明是数组
|
||||||
|
variableType = buildArrayType(type, dims); // 构建完整的 ArrayType
|
||||||
|
}
|
||||||
|
module->createGlobalValue(name, Type::getPointerType(variableType), dims, values);
|
||||||
}
|
}
|
||||||
return std::any();
|
return std::any();
|
||||||
}
|
}
|
||||||
@ -193,7 +197,7 @@ std::any SysYIRGenerator::visitVarDecl(SysYParser::VarDeclContext *ctx) {
|
|||||||
// 对于数组,alloca 的类型将是指针指向数组类型,例如 `int[2][3]*`
|
// 对于数组,alloca 的类型将是指针指向数组类型,例如 `int[2][3]*`
|
||||||
// 对于标量,alloca 的类型将是指针指向标量类型,例如 `int*`
|
// 对于标量,alloca 的类型将是指针指向标量类型,例如 `int*`
|
||||||
AllocaInst* alloca =
|
AllocaInst* alloca =
|
||||||
builder.createAllocaInst(Type::getPointerType(type), dims, name);
|
builder.createAllocaInst(Type::getPointerType(variableType), dims, name);
|
||||||
|
|
||||||
if (varDef->initVal() != nullptr) {
|
if (varDef->initVal() != nullptr) {
|
||||||
ValueCounter values;
|
ValueCounter values;
|
||||||
@ -1232,6 +1236,7 @@ auto SysYIRGenerator::visitLOrExp(SysYParser::LOrExpContext *ctx) -> std::any {
|
|||||||
return std::any();
|
return std::any();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// attention : 这里的type是数组元素的type
|
||||||
void Utils::tree2Array(Type *type, ArrayValueTree *root,
|
void Utils::tree2Array(Type *type, ArrayValueTree *root,
|
||||||
const std::vector<Value *> &dims, unsigned numDims,
|
const std::vector<Value *> &dims, unsigned numDims,
|
||||||
ValueCounter &result, IRBuilder *builder) {
|
ValueCounter &result, IRBuilder *builder) {
|
||||||
|
|||||||
Reference in New Issue
Block a user