diff --git a/src/mapleall/maple_be/src/be/lower.cpp b/src/mapleall/maple_be/src/be/lower.cpp index ea07f8115593da4991387ba1c619eefb61a5975a..b0dea6a1cc9c58530491d3243a255d6e91474401 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 6d8e497b2d3c7ca786c1a8f40805aab9ac6510d7..fe69c5867cfdfd760c6e478cd4f7941d353e2701 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())) { @@ -1469,19 +1481,26 @@ 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"); } } + 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"); @@ -1535,7 +1554,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 {