From 2de33a22ca317277dcad474d1137643634400f18 Mon Sep 17 00:00:00 2001 From: William Chen Date: Tue, 30 Mar 2021 09:01:31 -0700 Subject: [PATCH 1/3] fix struct return in vec for mem layout --- .../src/cg/aarch64/aarch64_memlayout.cpp | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/mapleall/maple_be/src/cg/aarch64/aarch64_memlayout.cpp b/src/mapleall/maple_be/src/cg/aarch64/aarch64_memlayout.cpp index c5faf5aeea..8c8fb1531b 100644 --- a/src/mapleall/maple_be/src/cg/aarch64/aarch64_memlayout.cpp +++ b/src/mapleall/maple_be/src/cg/aarch64/aarch64_memlayout.cpp @@ -175,13 +175,24 @@ void AArch64MemLayout::LayoutFormalParams() { PLocInfo ploc; for (size_t i = 0; i < mirFunction->GetFormalCount(); ++i) { MIRSymbol *sym = mirFunction->GetFormal(i); + uint32 stIndex = sym->GetStIndex(); + AArch64SymbolAlloc *symLoc = memAllocator->GetMemPool()->New(); + SetSymAllocInfo(stIndex, *symLoc); + if (i == 0) { + if (be.HasFuncReturnType(*mirFunction)) { + symLoc->SetMemSegment(GetSegArgsRegPassed()); + symLoc->SetOffset(GetSegArgsRegPassed().GetSize()); + TyIdx tidx = be.GetFuncReturnType(*mirFunction); + if (be.GetTypeSize(tidx.GetIdx()) > k16ByteSize) { + segArgsRegPassed.SetSize(segArgsRegPassed.GetSize() + kSizeOfPtr); + } + continue; + } + } bool noStackPara = false; MIRType *ty = mirFunction->GetNthParamType(i); uint32 ptyIdx = ty->GetTypeIndex(); parmLocator.LocateNextParm(*ty, ploc, i == 0); - uint32 stIndex = sym->GetStIndex(); - AArch64SymbolAlloc *symLoc = memAllocator->GetMemPool()->New(); - SetSymAllocInfo(stIndex, *symLoc); if (ploc.reg0 != kRinvalid) { /* register */ symLoc->SetRegisters(ploc.reg0, ploc.reg1, ploc.reg2, ploc.reg3); if (mirFunction->GetNthParamAttr(i).GetAttr(ATTR_localrefvar)) { @@ -300,6 +311,11 @@ void AArch64MemLayout::LayoutReturnRef(std::vector &returnDelays, void AArch64MemLayout::LayoutActualParams() { for (size_t i = 0; i < mirFunction->GetFormalCount(); ++i) { + if (i == 0) { + if (be.HasFuncReturnType(*mirFunction)) { + continue; + } + } MIRSymbol *sym = mirFunction->GetFormal(i); if (sym->IsPreg()) { continue; -- Gitee From d3b56cf25a7508855aaf42421aea1e9238e493b9 Mon Sep 17 00:00:00 2001 From: William Chen Date: Tue, 30 Mar 2021 09:02:30 -0700 Subject: [PATCH 2/3] fix compare code using comparison's primtype for sign/unsign --- .../maple_be/include/cg/aarch64/aarch64_cgfunc.h | 2 +- .../maple_be/src/cg/aarch64/aarch64_cgfunc.cpp | 11 +++++++---- .../maple_be/src/cg/aarch64/aarch64_proepilog.cpp | 2 +- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/mapleall/maple_be/include/cg/aarch64/aarch64_cgfunc.h b/src/mapleall/maple_be/include/cg/aarch64/aarch64_cgfunc.h index 1944235a3e..247ff2e2c4 100644 --- a/src/mapleall/maple_be/include/cg/aarch64/aarch64_cgfunc.h +++ b/src/mapleall/maple_be/include/cg/aarch64/aarch64_cgfunc.h @@ -99,7 +99,7 @@ class AArch64CGFunc : public CGFunc { void SelectIgoto(Operand *opnd0) override; void SelectCondGoto(CondGotoNode &stmt, Operand &opnd0, Operand &opnd1) override; void SelectCondGoto(LabelOperand &targetOpnd, Opcode jmpOp, Opcode cmpOp, Operand &opnd0, Operand &opnd1, - PrimType primType); + PrimType primType, bool signedCond); void SelectCondSpecialCase1(CondGotoNode &stmt, BaseNode &opnd0) override; void SelectCondSpecialCase2(const CondGotoNode &stmt, BaseNode &opnd0) override; void SelectGoto(GotoNode &stmt) override; diff --git a/src/mapleall/maple_be/src/cg/aarch64/aarch64_cgfunc.cpp b/src/mapleall/maple_be/src/cg/aarch64/aarch64_cgfunc.cpp index bf465a808d..fd7b28415d 100644 --- a/src/mapleall/maple_be/src/cg/aarch64/aarch64_cgfunc.cpp +++ b/src/mapleall/maple_be/src/cg/aarch64/aarch64_cgfunc.cpp @@ -2200,7 +2200,7 @@ void AArch64CGFunc::SelectIgoto(Operand *opnd0) { } void AArch64CGFunc::SelectCondGoto(LabelOperand &targetOpnd, Opcode jmpOp, Opcode cmpOp, Operand &origOpnd0, - Operand &origOpnd1, PrimType primType) { + Operand &origOpnd1, PrimType primType, bool signedCond) { Operand *opnd0 = &origOpnd0; Operand *opnd1 = &origOpnd1; opnd0 = &LoadIntoRegister(origOpnd0, primType); @@ -2246,7 +2246,8 @@ void AArch64CGFunc::SelectCondGoto(LabelOperand &targetOpnd, Opcode jmpOp, Opcod GetCurBB()->AppendInsn(GetCG()->BuildInstruction(mOp, rflag, *opnd0, *opnd1)); } - MOperator jmpOperator = PickJmpInsn(jmpOp, cmpOp, isFloat, IsSignedInteger(primType)); + bool isSigned = IsPrimitiveInteger(primType) ? IsSignedInteger(primType) : (signedCond ? true : false); + MOperator jmpOperator = PickJmpInsn(jmpOp, cmpOp, isFloat, isSigned); GetCurBB()->AppendInsn(GetCG()->BuildInstruction(jmpOperator, rflag, targetOpnd)); } @@ -2283,7 +2284,9 @@ void AArch64CGFunc::SelectCondSpecialCase1(CondGotoNode &stmt, BaseNode &expr) { PrimType pType = static_cast(condNode)->GetOpndType(); isFloat = IsPrimitiveFloat(pType); Operand &rflag = GetOrCreateRflag(); - MOperator jmpOp = PickJmpInsn(stmt.GetOpCode(), cmpOp, isFloat, IsSignedInteger(pType)); + bool isSigned = IsPrimitiveInteger(pType) ? IsSignedInteger(pType) : + (IsSignedInteger(condNode->GetPrimType()) ? true : false); + MOperator jmpOp = PickJmpInsn(stmt.GetOpCode(), cmpOp, isFloat, isSigned); GetCurBB()->AppendInsn(GetCG()->BuildInstruction(jmpOp, rflag, targetOpnd)); } @@ -2352,7 +2355,7 @@ void AArch64CGFunc::SelectCondGoto(CondGotoNode &stmt, Operand &opnd0, Operand & pType = condNode->GetPrimType(); } - SelectCondGoto(targetOpnd, stmt.GetOpCode(), cmpOp, opnd0, opnd1, pType); + SelectCondGoto(targetOpnd, stmt.GetOpCode(), cmpOp, opnd0, opnd1, pType, IsSignedInteger(condNode->GetPrimType())); } void AArch64CGFunc::SelectGoto(GotoNode &stmt) { diff --git a/src/mapleall/maple_be/src/cg/aarch64/aarch64_proepilog.cpp b/src/mapleall/maple_be/src/cg/aarch64/aarch64_proepilog.cpp index 94261a1e35..7a23605f83 100644 --- a/src/mapleall/maple_be/src/cg/aarch64/aarch64_proepilog.cpp +++ b/src/mapleall/maple_be/src/cg/aarch64/aarch64_proepilog.cpp @@ -331,7 +331,7 @@ BB &AArch64GenProEpilog::GenStackGuardCheckInsn(BB &bb) { cgFunc.SelectBxor(stAddrOpnd, stAddrOpnd, checkOp, PTY_u64); LabelIdx failLable = aarchCGFunc.CreateLabel(); aarchCGFunc.SelectCondGoto(aarchCGFunc.GetOrCreateLabelOperand(failLable), OP_brtrue, OP_eq, - stAddrOpnd, aarchCGFunc.CreateImmOperand(0, k64BitSize, false), PTY_u64); + stAddrOpnd, aarchCGFunc.CreateImmOperand(0, k64BitSize, false), PTY_u64, false); MIRSymbol *failFunc = GlobalTables::GetGsymTable().GetSymbolFromStrIdx( GlobalTables::GetStrTable().GetStrIdxFromName(std::string("__stack_chk_fail"))); -- Gitee From 7c43471e197bd71ee2f887a7d45974e33cf73512 Mon Sep 17 00:00:00 2001 From: William Chen Date: Tue, 30 Mar 2021 09:03:11 -0700 Subject: [PATCH 3/3] fix uninitialized value in ClassifyAggregate --- src/mapleall/maple_be/src/cg/aarch64/aarch64_abi.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mapleall/maple_be/src/cg/aarch64/aarch64_abi.cpp b/src/mapleall/maple_be/src/cg/aarch64/aarch64_abi.cpp index 8721114891..418313c5d6 100644 --- a/src/mapleall/maple_be/src/cg/aarch64/aarch64_abi.cpp +++ b/src/mapleall/maple_be/src/cg/aarch64/aarch64_abi.cpp @@ -331,7 +331,7 @@ int32 ParmLocator::LocateRetVal(MIRType &retType, PLocInfo &pLoc) { if (retSize <= k16ByteSize) { /* For return struct size less or equal to 16 bytes, the values */ /* are returned in register pairs. */ - AArch64ArgumentClass classes[kMaxRegCount]; /* Max of four floats. */ + AArch64ArgumentClass classes[kMaxRegCount] = { kAArch64NoClass }; /* Max of four floats. */ uint32 fpSize; uint32 numRegs = static_cast(ClassifyAggregate(beCommon, retType, classes, sizeof(classes), fpSize)); if (classes[0] == kAArch64FloatClass) { @@ -389,7 +389,7 @@ int32 ParmLocator::LocateNextParm(MIRType &mirType, PLocInfo &pLoc, bool isFirst * are returned in register pairs. * Check for pure float struct. */ - AArch64ArgumentClass classes[kMaxRegCount]; + AArch64ArgumentClass classes[kMaxRegCount] = { kAArch64NoClass }; uint32 fpSize; MIRType *retType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(beCommon.GetFuncReturnType(*func)); uint32 numRegs = static_cast(ClassifyAggregate(beCommon, *retType, classes, sizeof(classes), fpSize)); @@ -663,7 +663,7 @@ ReturnMechanism::ReturnMechanism(MIRType &retTy, const BECommon &be) return; } uint32 fpSize; - AArch64ArgumentClass classes[kMaxRegCount]; + AArch64ArgumentClass classes[kMaxRegCount] = { kAArch64NoClass }; regCount = static_cast(ClassifyAggregate(be, retTy, classes, sizeof(classes) / sizeof(AArch64ArgumentClass), fpSize)); if (classes[0] == kAArch64FloatClass) { -- Gitee