From 20bc9e87746f57c2162ca7de2653027869d2a78b Mon Sep 17 00:00:00 2001 From: William Chen Date: Mon, 15 Mar 2021 15:05:07 -0700 Subject: [PATCH 1/2] lower should go thru BeGetOrCreateType() to create new types If not, it will trigger the assertion in BECommon::AddAndComputeSizeAlign() --- src/mapleall/maple_be/src/be/lower.cpp | 24 ++++++++++++++---------- src/mapleall/maple_be/src/cg/emit.cpp | 7 +++++-- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/mapleall/maple_be/src/be/lower.cpp b/src/mapleall/maple_be/src/be/lower.cpp index ea07f81155..b0dea6a1cc 100644 --- a/src/mapleall/maple_be/src/be/lower.cpp +++ b/src/mapleall/maple_be/src/be/lower.cpp @@ -567,8 +567,9 @@ BaseNode *CGLowerer::LowerDreadBitfield(DreadNode &dread) { ireadNode->SetOpnd(addNode, 0); MIRType pointedType(kTypeScalar, fType->GetPrimType()); TyIdx pointedTyIdx = GlobalTables::GetTypeTable().GetOrCreateMIRType(&pointedType); - MIRPtrType pointType(pointedTyIdx); - ireadNode->SetTyIdx(GlobalTables::GetTypeTable().GetOrCreateMIRType(&pointType)); + const MIRType *pointToType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(pointedTyIdx); + MIRType *pointType = beCommon.BeGetOrCreatePointerType(*pointToType); + ireadNode->SetTyIdx(pointType->GetTypeIndex()); ExtractbitsNode *extrBitsNode = mirModule.CurFuncCodeMemPool()->New(OP_extractbits); extrBitsNode->SetPrimType(GetRegPrimType(fType->GetPrimType())); @@ -622,8 +623,9 @@ BaseNode *CGLowerer::LowerIreadBitfield(IreadNode &iread) { ireadNode->SetOpnd(addNode, 0); MIRType pointedType(kTypeScalar, fType->GetPrimType()); TyIdx pointedTyIdx = GlobalTables::GetTypeTable().GetOrCreateMIRType(&pointedType); - MIRPtrType pointType(pointedTyIdx); - ireadNode->SetTyIdx(GlobalTables::GetTypeTable().GetOrCreateMIRType(&pointType)); + const MIRType *pointToType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(pointedTyIdx); + MIRType *pointType = beCommon.BeGetOrCreatePointerType(*pointToType); + ireadNode->SetTyIdx(pointType->GetTypeIndex()); ExtractbitsNode *extrBitsNode = mirModule.CurFuncCodeMemPool()->New(OP_extractbits); extrBitsNode->SetPrimType(GetRegPrimType(fType->GetPrimType())); @@ -754,8 +756,9 @@ StmtNode *CGLowerer::LowerDassignBitfield(DassignNode &dassign, BlockNode &newBl ireadNode->SetOpnd(addNode, 0); MIRType pointedType(kTypeScalar, fType->GetPrimType()); TyIdx pointedTyIdx = GlobalTables::GetTypeTable().GetOrCreateMIRType(&pointedType); - MIRPtrType pointType(pointedTyIdx); - ireadNode->SetTyIdx(GlobalTables::GetTypeTable().GetOrCreateMIRType(&pointType)); + const MIRType *pointToType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(pointedTyIdx); + MIRType *pointType = beCommon.BeGetOrCreatePointerType(*pointToType); + ireadNode->SetTyIdx(pointType->GetTypeIndex()); DepositbitsNode *depositBits = mirModule.CurFuncCodeMemPool()->New(); depositBits->SetPrimType(GetRegPrimType(fType->GetPrimType())); @@ -765,7 +768,7 @@ StmtNode *CGLowerer::LowerDassignBitfield(DassignNode &dassign, BlockNode &newBl depositBits->SetBOpnd(dassign.GetRHS(), 1); IassignNode *iassignStmt = mirModule.CurFuncCodeMemPool()->New(); - iassignStmt->SetTyIdx(GlobalTables::GetTypeTable().GetOrCreateMIRType(&pointType)); + iassignStmt->SetTyIdx(pointType->GetTypeIndex()); iassignStmt->SetOpnd(addNode->CloneTree(mirModule.GetCurFuncCodeMPAllocator()), 0); iassignStmt->SetRHS(depositBits); @@ -823,8 +826,9 @@ StmtNode *CGLowerer::LowerIassignBitfield(IassignNode &iassign, BlockNode &newBl ireadNode->SetOpnd(addNode, 0); MIRType pointedType(kTypeScalar, fType->GetPrimType()); TyIdx pointedTyIdx = GlobalTables::GetTypeTable().GetOrCreateMIRType(&pointedType); - MIRPtrType pointType(pointedTyIdx); - ireadNode->SetTyIdx(GlobalTables::GetTypeTable().GetOrCreateMIRType(&pointType)); + const MIRType *pointToType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(pointedTyIdx); + MIRType *pointType = beCommon.BeGetOrCreatePointerType(*pointToType); + ireadNode->SetTyIdx(pointType->GetTypeIndex()); DepositbitsNode *depositBits = mirModule.CurFuncCodeMemPool()->New(); depositBits->SetPrimType(GetRegPrimType(fType->GetPrimType())); @@ -834,7 +838,7 @@ StmtNode *CGLowerer::LowerIassignBitfield(IassignNode &iassign, BlockNode &newBl depositBits->SetBOpnd(iassign.GetRHS(), 1); IassignNode *iassignStmt = mirModule.CurFuncCodeMemPool()->New(); - iassignStmt->SetTyIdx(GlobalTables::GetTypeTable().GetOrCreateMIRType(&pointType)); + iassignStmt->SetTyIdx(pointType->GetTypeIndex()); iassignStmt->SetOpnd(addNode->CloneTree(mirModule.GetCurFuncCodeMPAllocator()), 0); iassignStmt->SetRHS(depositBits); diff --git a/src/mapleall/maple_be/src/cg/emit.cpp b/src/mapleall/maple_be/src/cg/emit.cpp index 6d8e497b2d..85f6329ff2 100644 --- a/src/mapleall/maple_be/src/cg/emit.cpp +++ b/src/mapleall/maple_be/src/cg/emit.cpp @@ -1469,7 +1469,8 @@ void Emitter::EmitArrayConstant(MIRConst &mirConst) { } } else if (elemConst->GetType().GetKind() == kTypeArray) { EmitArrayConstant(*elemConst); - } else if (elemConst->GetType().GetKind() == kTypeStruct || elemConst->GetType().GetKind() == kTypeClass) { + } else if (elemConst->GetType().GetKind() == kTypeStruct || elemConst->GetType().GetKind() == kTypeClass || + elemConst->GetType().GetKind() == kTypeUnion) { EmitStructConstant(*elemConst); } else { ASSERT(false, "should not run here"); @@ -1535,7 +1536,9 @@ void Emitter::EmitStructConstant(MIRConst &mirConst) { if (IsPrimitiveScalar(elemType.GetPrimType())) { EmitScalarConstant(*elemConst, true, false, true); } else if (elemType.GetKind() == kTypeArray) { - EmitArrayConstant(*elemConst); + if (elemType.GetSize() != 0) { + EmitArrayConstant(*elemConst); + } } else if ((elemType.GetKind() == kTypeStruct) || (elemType.GetKind() == kTypeClass)) { EmitStructConstant(*elemConst); } else { -- Gitee From 434bc150884cc6b9696834d8dd15e7f5dfe997b0 Mon Sep 17 00:00:00 2001 From: William Chen Date: Mon, 15 Mar 2021 16:19:30 -0700 Subject: [PATCH 2/2] support multiple dimension array in emitArrayConstant --- src/mapleall/maple_be/src/cg/emit.cpp | 28 ++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/src/mapleall/maple_be/src/cg/emit.cpp b/src/mapleall/maple_be/src/cg/emit.cpp index 85f6329ff2..fe69c5867c 100644 --- a/src/mapleall/maple_be/src/cg/emit.cpp +++ b/src/mapleall/maple_be/src/cg/emit.cpp @@ -1451,7 +1451,19 @@ void Emitter::EmitArrayConstant(MIRConst &mirConst) { MIRAggConst &arrayCt = static_cast(mirConst); MIRArrayType &arrayType = static_cast(mirType); size_t uNum = arrayCt.GetConstVec().size(); - int64 iNum = (arrayType.GetSizeArrayItem(0) > 0) ? (static_cast(arrayType.GetSizeArrayItem(0))) - uNum : 0; + uint32 dim = arrayType.GetSizeArrayItem(0); + TyIdx scalarIdx = arrayType.GetElemTyIdx(); + if (uNum == 0 && dim) { + MIRType *subTy = GlobalTables::GetTypeTable().GetTypeFromTyIdx(scalarIdx); + while (subTy->GetKind() == kTypeArray) { + MIRArrayType *aSubTy = static_cast(subTy); + if (aSubTy->GetSizeArrayItem(0) > 0) { + dim *= (aSubTy->GetSizeArrayItem(0)); + } + scalarIdx = aSubTy->GetElemTyIdx(); + subTy = GlobalTables::GetTypeTable().GetTypeFromTyIdx(scalarIdx); + } + } for (size_t i = 0; i < uNum; ++i) { MIRConst *elemConst = arrayCt.GetConstVecItem(i); if (IsPrimitiveScalar(elemConst->GetType().GetPrimType())) { @@ -1476,13 +1488,19 @@ void Emitter::EmitArrayConstant(MIRConst &mirConst) { ASSERT(false, "should not run here"); } } + int64 iNum = (arrayType.GetSizeArrayItem(0) > 0) ? (static_cast(arrayType.GetSizeArrayItem(0))) - uNum : 0; if (iNum > 0) { CHECK_FATAL(!Globals::GetInstance()->GetBECommon()->IsEmptyOfTypeSizeTable(), "container empty check"); CHECK_FATAL(!arrayCt.GetConstVec().empty(), "container empty check"); - uint64 unInSizeInByte = static_cast(iNum) * static_cast( - Globals::GetInstance()->GetBECommon()->GetTypeSize(arrayCt.GetConstVecItem(0)->GetType().GetTypeIndex())); - if (unInSizeInByte != 0) { - EmitNullConstant(unInSizeInByte); + if (uNum > 0) { + uint64 unInSizeInByte = static_cast(iNum) * static_cast( + Globals::GetInstance()->GetBECommon()->GetTypeSize(arrayCt.GetConstVecItem(0)->GetType().GetTypeIndex())); + if (unInSizeInByte != 0) { + EmitNullConstant(unInSizeInByte); + } + } else { + uint32 size = Globals::GetInstance()->GetBECommon()->GetTypeSize(scalarIdx.GetIdx()) * dim; + Emit("\t.zero\t").Emit(size).Emit("\n"); } } Emit("\n"); -- Gitee