diff --git a/src/bin/jbc2mpl b/src/bin/jbc2mpl index 3afa3e8786d3b0bb111c0fd480ed71f5a3080481..15c8d1af1876e38793f77a8556ff743209dcd0c7 100755 Binary files a/src/bin/jbc2mpl and b/src/bin/jbc2mpl differ diff --git a/src/bin/maple b/src/bin/maple index 8470a48470ea9e897df890931676b43170341217..f49494976a191bccfe97a5a419304cfd341cb4e8 100755 Binary files a/src/bin/maple and b/src/bin/maple differ diff --git a/src/deplibs/libmplphase.a b/src/deplibs/libmplphase.a index dbe5c974020e89e8671a46d3e2335b17d4ee7c02..a75aedde6f3cffa44eb0c0c83d8cca2a17e35c09 100644 Binary files a/src/deplibs/libmplphase.a and b/src/deplibs/libmplphase.a differ diff --git a/src/deplibs/libmplutil.a b/src/deplibs/libmplutil.a index 4dd33a87cbb6b3fed325d08939c28f7bebc38e2d..a5552ca88ff23b13f9e2389c545485b5e5d3bab2 100644 Binary files a/src/deplibs/libmplutil.a and b/src/deplibs/libmplutil.a differ diff --git a/src/maple_be/include/be/becommon.h b/src/maple_be/include/be/becommon.h index 0181d849ec419ca115c667dc11ac2c6f1dd068f3..fd069d0d135827ca61bfa3ba60d6d4fd4235632c 100644 --- a/src/maple_be/include/be/becommon.h +++ b/src/maple_be/include/be/becommon.h @@ -163,6 +163,15 @@ class BECommon { typeSizeTable.push_back(value); } + void AddTypeSizeAndAlign(TyIdx tyIdx, uint64 value) { + if (typeSizeTable.size() == tyIdx) { + typeSizeTable.push_back(value); + tableAlignTable.push_back(value); + } else { + CHECK_FATAL(typeSizeTable.size() > tyIdx, "there are some types haven't set type size and align, %d"); + } + } + uint8 GetTypeAlign(uint32 idx) const { return tableAlignTable.at(idx); } diff --git a/src/maple_be/include/be/lower.h b/src/maple_be/include/be/lower.h index 5b8267cd8a30cb91e909fa57c114f390a6989250..4572d5c1773a745652bb30bc0ef38d6e31d66c31 100644 --- a/src/maple_be/include/be/lower.h +++ b/src/maple_be/include/be/lower.h @@ -34,7 +34,7 @@ class CGLowerer { enum Option : uint64 { kUndefined = 0, kGenEh = 1ULL << 0, - kVerboseAsm = 1ULL << 1, + kVerboseCG = 1ULL << 1, }; using BuiltinFunctionID = uint32; @@ -49,15 +49,15 @@ class CGLowerer { SetCurrentFunc(func); } - CGLowerer(MIRModule &mod, BECommon &common, bool genEh, bool verboseAsm) + CGLowerer(MIRModule &mod, BECommon &common, bool genEh, bool verboseCG) : mirModule(mod), beCommon(common) { OptionFlag option = 0; if (genEh) { option |= kGenEh; } - if (verboseAsm) { - option |= kVerboseAsm; + if (verboseCG) { + option |= kVerboseCG; } SetOptions(option); mirBuilder = mod.GetMIRBuilder(); @@ -226,7 +226,7 @@ class CGLowerer { } bool ShouldAddAdditionalComment() const { - return (options & kVerboseAsm) != 0; + return (options & kVerboseCG) != 0; } bool GenerateExceptionHandlingCode() const { diff --git a/src/maple_be/include/cg/aarch64/aarch64_cg.h b/src/maple_be/include/cg/aarch64/aarch64_cg.h index 09ed286994f23ba53660eb32f7b6a16951ad7d1e..5fb7dad36895094bc357c92f552fba28ad66237b 100644 --- a/src/maple_be/include/cg/aarch64/aarch64_cg.h +++ b/src/maple_be/include/cg/aarch64/aarch64_cg.h @@ -119,8 +119,8 @@ class AArch64CG : public CG { ~AArch64CG() override = default; CGFunc *CreateCGFunc(MIRModule &mod, MIRFunction &mirFunc, BECommon &bec, MemPool &memPool, - MapleAllocator &mallocator) override { - return memPool.New(mod, *this, mirFunc, bec, memPool, mallocator); + MapleAllocator &mallocator, uint32 funcId) override { + return memPool.New(mod, *this, mirFunc, bec, memPool, mallocator, funcId); } const std::unordered_map> &GetCyclePatternMap() const { diff --git a/src/maple_be/include/cg/aarch64/aarch64_cgfunc.h b/src/maple_be/include/cg/aarch64/aarch64_cgfunc.h index 84aaf981c8bba37e81908354d64e10b43b36a337..faab49b6388ede0b0472d4a63b9c1739914f48dc 100644 --- a/src/maple_be/include/cg/aarch64/aarch64_cgfunc.h +++ b/src/maple_be/include/cg/aarch64/aarch64_cgfunc.h @@ -26,8 +26,9 @@ namespace maplebe { class AArch64CGFunc : public CGFunc { public: - AArch64CGFunc(MIRModule &mod, CG &c, MIRFunction &f, BECommon &b, MemPool &memPool, MapleAllocator &mallocator) - : CGFunc(mod, c, f, b, memPool, mallocator), + AArch64CGFunc(MIRModule &mod, CG &c, MIRFunction &f, BECommon &b, + MemPool &memPool, MapleAllocator &mallocator, uint32 funcId) + : CGFunc(mod, c, f, b, memPool, mallocator, funcId), calleeSavedRegs(mallocator.Adapter()), formalRegList(mallocator.Adapter()), phyRegOperandTable(std::less(), mallocator.Adapter()), diff --git a/src/maple_be/include/cg/aarch64/aarch64_insn.h b/src/maple_be/include/cg/aarch64/aarch64_insn.h index 0127e84295b945ce447cf557f68f6dbae4aef491..5c36c0405707946a58cab350f30b8f65f79094c4 100644 --- a/src/maple_be/include/cg/aarch64/aarch64_insn.h +++ b/src/maple_be/include/cg/aarch64/aarch64_insn.h @@ -84,7 +84,7 @@ class AArch64Insn : public Insn { Operand *opnd1 = opnds[1]; CHECK_FATAL(opnd1 != nullptr, "opnd1 is null!"); auto *stImmOpnd = static_cast(opnd1); - return StringUtils::StartsWith(stImmOpnd->GetName(), NameMangler::kDecoupleStaticValueStr); + return StringUtils::StartsWith(stImmOpnd->GetName(), namemangler::kDecoupleStaticValueStr); } return false; } diff --git a/src/maple_be/include/cg/cfi.def b/src/maple_be/include/cg/cfi.def index 85ede3e259877dc2b1e54c61b05111d936896081..2c361aa64d2d69f53b53af4067d51cbf8d2da196 100644 --- a/src/maple_be/include/cg/cfi.def +++ b/src/maple_be/include/cg/cfi.def @@ -49,5 +49,5 @@ CFI_DEFINE( val_encoded_addr, , 3, Register, Immediate, StImmediate ) ARM_DIRECTIVES_DEFINE( save, , 1, List, Undef, Undef ) ARM_DIRECTIVES_DEFINE( vsave, , 1, List, Undef, Undef ) -ARM_DIRECTIVES_DEFINE( setfp, , 2, Register, Immediate, Undef ) +ARM_DIRECTIVES_DEFINE( setfp, , 3, Register, Register, Immediate ) ARM_DIRECTIVES_DEFINE( pad, , 1, Immediate, Undef, Undef ) diff --git a/src/maple_be/include/cg/cfi.h b/src/maple_be/include/cg/cfi.h index 697efd6e1548ef7a1c97b42f9063b4dab9da10c0..35bf6dc1c2d364004a276416eba83acbf29cc1d1 100644 --- a/src/maple_be/include/cg/cfi.h +++ b/src/maple_be/include/cg/cfi.h @@ -63,6 +63,10 @@ class CfiInsn : public maplebe::Insn { CfiInsn(MemPool &memPool, maplebe::MOperator op, maplebe::Operand &opnd0, maplebe::Operand &opnd1) : Insn(memPool, op, opnd0, opnd1) {} + CfiInsn(MemPool &memPool, maplebe::MOperator op, maplebe::Operand &opnd0, maplebe::Operand &opnd1, + maplebe::Operand &opnd2) + : Insn(memPool, op, opnd0, opnd1, opnd2) {} + CfiInsn(const CfiInsn &originalInsn, MemPool &memPool) : Insn(memPool, originalInsn.mOp) { InitWithOriginalInsn(originalInsn, memPool); } diff --git a/src/maple_be/include/cg/cg.h b/src/maple_be/include/cg/cg.h index 4a95620af6039f1053828666c471f5a4c05f21af..2a3e7805b30998c476261ff49e0786cc35e9df10 100644 --- a/src/maple_be/include/cg/cg.h +++ b/src/maple_be/include/cg/cg.h @@ -104,7 +104,7 @@ class CG { labelOrderCnt(0), cgOption(cgOptions), instrumentationFunction(nullptr) { - const std::string &internalNameLiteral = NameMangler::GetInternalNameLiteral(NameMangler::kJavaLangObjectStr); + const std::string &internalNameLiteral = namemangler::GetInternalNameLiteral(namemangler::kJavaLangObjectStr); GStrIdx strIdxFromName = GlobalTables::GetStrTable().GetStrIdxFromName(internalNameLiteral); isLibcore = (GlobalTables::GetGsymTable().GetSymbolFromStrIdx(strIdxFromName) != nullptr); DefineDebugTraceFunctions(); @@ -113,6 +113,7 @@ class CG { virtual ~CG(); void GenExtraTypeMetadata(const std::string &classListFileName, const std::string &outputBaseName); void GenPrimordialObjectList(const std::string &outputBaseName); + const std::string ExtractFuncName(const std::string &str); template Insn &BuildInstruction(MOperator opCode) { @@ -189,7 +190,7 @@ class CG { return *insn; } - virtual CGFunc *CreateCGFunc(MIRModule &mod, MIRFunction&, BECommon&, MemPool&, MapleAllocator&) = 0; + virtual CGFunc *CreateCGFunc(MIRModule &mod, MIRFunction&, BECommon&, MemPool&, MapleAllocator&, uint32) = 0; bool IsExclusiveEH() const { return CGOptions::IsExclusiveEH(); @@ -211,6 +212,10 @@ class CG { return cgOption.GenerateVerboseAsm(); } + bool GenerateVerboseCG() const { + return cgOption.GenerateVerboseCG(); + } + bool DoPrologueEpilogue() const { return cgOption.DoPrologueEpilogue(); } diff --git a/src/maple_be/include/cg/cg_option.h b/src/maple_be/include/cg/cg_option.h index 05a5e55b8b3c5c12e44ba89a70c84047134fdbfb..2339424f483ff5b0a213430c2e94c05e22664b27 100644 --- a/src/maple_be/include/cg/cg_option.h +++ b/src/maple_be/include/cg/cg_option.h @@ -45,6 +45,7 @@ class CGOptions : public MapleDriverOptionBase { kGenYieldPoint = 1ULL << 9, kGenLocalRc = 1ULL << 10, kProEpilogueOpt = 1ULL << 11, + kVerboseCG = 1ULL << 12, kDebugFriendly = 1ULL << 20, kWithLoc = 1ULL << 21, kWithDwarf = 1ULL << 22, @@ -193,6 +194,10 @@ class CGOptions : public MapleDriverOptionBase { return (options & kVerboseAsm) != 0; } + bool GenerateVerboseCG() const { + return (options & kVerboseCG) != 0; + } + bool GenerateDebugFriendlyCode() const { return true; } diff --git a/src/maple_be/include/cg/cg_phases.def b/src/maple_be/include/cg/cg_phases.def index 64801d456f00ada544a2abe0e8a8354e9ccaccce..f2205fedce53cdf4645f21ea7551c2119fbdf101 100644 --- a/src/maple_be/include/cg/cg_phases.def +++ b/src/maple_be/include/cg/cg_phases.def @@ -13,6 +13,9 @@ * See the Mulan PSL v1 for more details. */ FUNCAPHASE(kCGFuncPhaseLIVE, CgDoLiveAnalysis) +#ifdef TARGARM32 +FUNCAPHASE(kCGFuncPhaseLIVERANGE, CgDoLrAnalysis) +#endif /* TARGARM32 */ FUNCAPHASE(kCGFuncPhaseREACHDEF, CgDoReachingDefinition) FUNCAPHASE(kCGFuncPhaseCLEARRDINFO, CgDoClearRDInfo) FUNCAPHASE(kCGFuncPhaseLOOP, CgDoLoopAnalysis) diff --git a/src/maple_be/include/cg/cgfunc.h b/src/maple_be/include/cg/cgfunc.h index 31f90329af438b67821c2d059634887caa2083af..cda973749246e22308c139eae5728420e6c19651 100644 --- a/src/maple_be/include/cg/cgfunc.h +++ b/src/maple_be/include/cg/cgfunc.h @@ -71,6 +71,9 @@ class SpillMemOperandSet { MapleSet reuseSpillLocMem; }; +#if TARGARM32 +class LiveRange; +#endif /* TARGARM32 */ constexpr uint32 kVRegisterNumber = 80; class CGFunc { public: @@ -81,7 +84,7 @@ class CGFunc { }; CGFunc(MIRModule &mod, CG &cg, MIRFunction &mirFunc, BECommon &beCommon, MemPool &memPool, - MapleAllocator &mallocator); + MapleAllocator &mallocator, uint32 funcId); virtual ~CGFunc(); const std::string &GetName() const { @@ -649,6 +652,32 @@ class CGFunc { loops.push_back(&loop); } +#if TARGARM32 + MapleVector &GetSortedBBs() { + return sortedBBs; + } + + const MapleVector &GetSortedBBs() const { + return sortedBBs; + } + + void SetSortedBBs(MapleVector &bbVec) { + sortedBBs = bbVec; + } + + MapleVector &GetLrVec() { + return lrVec; + } + + const MapleVector &GetLrVec() const { + return lrVec; + } + + void SetLrVec(MapleVector &newLrVec) { + lrVec = newLrVec; + } +#endif /* TARGARM32 */ + CGCFG *GetTheCFG() { return theCFG; } @@ -745,6 +774,10 @@ class CGFunc { volReleaseInsn = insn; } + const MapleString &GetShortFuncName() const { + return shortFuncName; + } + virtual InsnVisitor *NewInsnModifier() = 0; protected: @@ -839,10 +872,15 @@ class CGFunc { MemLayout *memLayout = nullptr; MapleAllocator *funcScopeAllocator; MapleVector emitStVec; /* symbol that needs to be emit as a local symbol. i.e, switch table */ +#if TARGARM32 + MapleVector sortedBBs; + MapleVector lrVec; +#endif /* TARGARM32 */ MapleVector loops; CGCFG *theCFG = nullptr; uint32 nextSpillLocation = 0; static constexpr int kRegIncrStepLen = 80; /* reg number increate step length */ + const MapleString shortFuncName; }; /* class CGFunc */ CGFUNCPHASE(CgDoLayoutSF, "layoutstackframe") diff --git a/src/maple_be/include/cg/operand.h b/src/maple_be/include/cg/operand.h index 6330c9c8d95ed1265c5abef0f246b6ceee69a026..d029d14d874e1203f976cb5846c50cc0660ba756 100644 --- a/src/maple_be/include/cg/operand.h +++ b/src/maple_be/include/cg/operand.h @@ -614,6 +614,7 @@ class LabelOperand : public Operand { LabelIdx GetLabelIndex() const { return labelIndex; } + const std::string GetParentFunc() const { return parentFunc; } @@ -673,6 +674,10 @@ class ListOperand : public Operand { ~ListOperand() override = default; + void PopOpnd() { + opndList.pop_back(); + } + void PushOpnd(RegOperand &opnd) { opndList.push_back(&opnd); } diff --git a/src/maple_be/src/be/lower.cpp b/src/maple_be/src/be/lower.cpp index 510fff18ebd01b8834b16266553d478b522aadf1..627704202467c44ccb2d26955295b5bdb88f20b1 100644 --- a/src/maple_be/src/be/lower.cpp +++ b/src/maple_be/src/be/lower.cpp @@ -110,8 +110,8 @@ void CGLowerer::RegisterExternalLibraryFunctions() { if (retTy->GetPrimType() == PTY_dynany) { retTy = GlobalTables::GetTypeTable().GetPtr(); } - func->SetReturnTyIdx(retTy->GetTypeIndex()); + std::vector formals; for (uint32 j = 0; extFnDescrs[i].argTypes[j] != kPtyInvalid; ++j) { PrimType primTy = extFnDescrs[i].argTypes[j]; MIRType *argTy = GlobalTables::GetTypeTable().GetPrimType(primTy); @@ -132,8 +132,12 @@ void CGLowerer::RegisterExternalLibraryFunctions() { argSt->SetStorageClass(kScFormal); argSt->SetSKind(kStVar); func->GetSymTab()->AddToStringSymbolMap(*argSt); - func->AddArgument(argSt); + formals.push_back(argSt); } + func->UpdateFuncTypeAndFormalsAndReturnType(formals, retTy->GetTypeIndex(), false); + auto *funcType = func->GetMIRFuncType(); + ASSERT(funcType != nullptr, "null ptr check"); + beCommon.AddTypeSizeAndAlign(funcType->GetTypeIndex(), GetPrimTypeSize(funcType->GetPrimType())); extFuncs.push_back(std::pair(id, func->GetPuidx())); } } @@ -307,11 +311,11 @@ BaseNode *CGLowerer::LowerArrayForLazyBiding(BaseNode &baseNode, BaseNode &offse if (parent.GetOpCode() == OP_iread && (baseNode.GetOpCode() == maple::OP_addrof)) { const MIRSymbol *st = mirModule.CurFunction()->GetLocalOrGlobalSymbol(static_cast(baseNode).GetStIdx()); - if (StringUtils::StartsWith(st->GetName(), NameMangler::kDecoupleStaticValueStr) || - ((StringUtils::StartsWith(st->GetName(), NameMangler::kMuidFuncUndefTabPrefixStr) || - StringUtils::StartsWith(st->GetName(), NameMangler::kMuidFuncDefTabPrefixStr) || - StringUtils::StartsWith(st->GetName(), NameMangler::kMuidDataDefTabPrefixStr) || - StringUtils::StartsWith(st->GetName(), NameMangler::kMuidDataUndefTabPrefixStr)) && + if (StringUtils::StartsWith(st->GetName(), namemangler::kDecoupleStaticValueStr) || + ((StringUtils::StartsWith(st->GetName(), namemangler::kMuidFuncUndefTabPrefixStr) || + StringUtils::StartsWith(st->GetName(), namemangler::kMuidFuncDefTabPrefixStr) || + StringUtils::StartsWith(st->GetName(), namemangler::kMuidDataDefTabPrefixStr) || + StringUtils::StartsWith(st->GetName(), namemangler::kMuidDataUndefTabPrefixStr)) && CGOptions::IsLazyBinding())) { /* for decouple static or lazybinding def/undef tables, replace it with intrinsic */ MapleVector args(mirBuilder->GetCurrentFuncCodeMpAllocator()->Adapter()); @@ -829,7 +833,7 @@ BlockNode *CGLowerer::GenBlockNode(StmtNode &newCall, const CallReturnVector &p2 } } blk->ResetBlock(); - /* if VerboseAsm, insert a comment */ + /* if VerboseCG, insert a comment */ if (ShouldAddAdditionalComment()) { CommentNode *cmnt = mirModule.CurFuncCodeMemPool()->New(mirModule); cmnt->SetComment(kOpcodeInfo.GetName(opcode)); @@ -868,9 +872,19 @@ BlockNode *CGLowerer::LowerCallAssignedStmt(StmtNode &stmt) { } case OP_intrinsiccallassigned: case OP_xintrinsiccallassigned: { - auto &origCall = static_cast(stmt); - newCall = GenIntrinsiccallNode(stmt, funcCalled, handledAtLowerLevel, origCall); - p2nRets = &origCall.GetReturnVec(); + IntrinsiccallNode &intrincall = static_cast(stmt); + if (intrincall.GetIntrinsic() == INTRN_JAVA_POLYMORPHIC_CALL) { + BaseNode *contextClassArg = GetBaseNodeFromCurFunc(*mirModule.CurFunction(), false); + constexpr int kContextIdx = 4; /* stable index in MCC_DexPolymorphicCall, never out of range */ + intrincall.InsertOpnd(contextClassArg, kContextIdx); + + BaseNode *firstArg = intrincall.GetNopndAt(0); + BaseNode *baseVal = mirBuilder->CreateExprBinary(OP_add, *GlobalTables::GetTypeTable().GetPtr(), firstArg, + mirBuilder->CreateIntConst(1, PTY_ref)); + intrincall.SetNOpndAt(0, baseVal); + } + newCall = GenIntrinsiccallNode(stmt, funcCalled, handledAtLowerLevel, intrincall); + p2nRets = &intrincall.GetReturnVec(); break; } case OP_intrinsiccallwithtypeassigned: { @@ -1215,17 +1229,17 @@ void CGLowerer::LowerEntry(MIRFunction &func) { MIRType *pointType = beCommon.BeGetOrCreatePointerType(*func.GetReturnType()); retSt->SetTyIdx(pointType->GetTypeIndex()); - MapleVector formals(mirModule.GetMPAllocator().Adapter()); + std::vector formals; formals.push_back(retSt); for (uint32 i = 0; i < func.GetFormalCount(); ++i) { auto formal = func.GetFormal(i); formals.push_back(formal); } - func.ClearArguments(); - for (MapleVector::iterator it = formals.begin(); it != formals.end(); ++it) { - func.AddArgument(*it); - } - func.SetReturnTyIdx(GlobalTables::GetTypeTable().GetTypeTable().at(static_cast(PTY_void))->GetTypeIndex()); + + func.UpdateFuncTypeAndFormalsAndReturnType(formals, TyIdx(PTY_void), true); + auto *funcType = func.GetMIRFuncType(); + ASSERT(funcType != nullptr, "null ptr check"); + beCommon.AddTypeSizeAndAlign(funcType->GetTypeIndex(), GetPrimTypeSize(funcType->GetPrimType())); } } @@ -1420,7 +1434,8 @@ MIRFunction *CGLowerer::RegisterFunctionVoidStarToVoid(BuiltinFunctionID id, con argSt->SetStorageClass(kScFormal); argSt->SetSKind(kStVar); func->GetSymTab()->AddToStringSymbolMap(*argSt); - func->AddArgument(argSt); + std::vector formals; + formals.push_back(argSt); if ((name == "MCC_SyncEnterFast0") || (name == "MCC_SyncEnterFast1") || (name == "MCC_SyncEnterFast2") || (name == "MCC_SyncEnterFast3") || (name == "MCC_SyncExitFast")) { @@ -1430,8 +1445,13 @@ MIRFunction *CGLowerer::RegisterFunctionVoidStarToVoid(BuiltinFunctionID id, con argStMatch->SetStorageClass(kScFormal); argStMatch->SetSKind(kStVar); func->GetSymTab()->AddToStringSymbolMap(*argStMatch); - func->AddArgument(argStMatch); + formals.push_back(argStMatch); } + func->UpdateFuncTypeAndFormalsAndReturnType(formals, GlobalTables::GetTypeTable().GetVoid()->GetTypeIndex(), + false); + auto *funcType = func->GetMIRFuncType(); + ASSERT(funcType != nullptr, "null ptr check"); + beCommon.AddTypeSizeAndAlign(funcType->GetTypeIndex(), GetPrimTypeSize(funcType->GetPrimType())); builtinFuncIDs.push_back(std::pair(id, func->GetPuidx())); return func; @@ -1446,7 +1466,6 @@ void CGLowerer::RegisterBuiltIns() { GlobalTables::GetTypeTable().GetVoid()->GetTypeIndex()); MIRSymbol *funcSym = func->GetFuncSymbol(); funcSym->SetStorageClass(kScExtern); - /* return type */ MIRType *retTy = desc.GetReturnType(); CHECK_FATAL(retTy != nullptr, "retTy should not be nullptr"); @@ -1454,8 +1473,8 @@ void CGLowerer::RegisterBuiltIns() { if (retTy->GetPrimType() == PTY_dynany) { retTy = GlobalTables::GetTypeTable().GetPtr(); } - func->SetReturnTyIdx(retTy->GetTypeIndex()); + std::vector formals; const std::string params[IntrinDesc::kMaxArgsNum] = { "p0", "p1", "p2", "p3", "p4", "p5" }; for (uint32 j = 0; j < IntrinDesc::kMaxArgsNum; ++j) { MIRType *argTy = desc.GetArgType(j); @@ -1472,8 +1491,12 @@ void CGLowerer::RegisterBuiltIns() { argSt->SetStorageClass(kScFormal); argSt->SetSKind(kStVar); func->GetSymTab()->AddToStringSymbolMap(*argSt); - func->AddArgument(argSt); + formals.push_back(argSt); } + func->UpdateFuncTypeAndFormalsAndReturnType(formals, retTy->GetTypeIndex(), false); + auto *funcType = func->GetMIRFuncType(); + ASSERT(funcType != nullptr, "null ptr check"); + beCommon.AddTypeSizeAndAlign(funcType->GetTypeIndex(), GetPrimTypeSize(funcType->GetPrimType())); builtinFuncIDs.push_back(std::pair(id, func->GetPuidx())); } @@ -2178,7 +2201,7 @@ BaseNode *CGLowerer::GetClassInfoExprFromRuntime(const std::string &classInfo) { BaseNode *arg1 = nullptr; /* classname */ std::string klassJavaDescriptor; - NameMangler::DecodeMapleNameToJavaDescriptor(classInfo, klassJavaDescriptor); + namemangler::DecodeMapleNameToJavaDescriptor(classInfo, klassJavaDescriptor); UStrIdx classNameStrIdx = GlobalTables::GetUStrTable().GetOrCreateStrIdxFromName(klassJavaDescriptor); arg1 = mirModule.GetMemPool()->New(classNameStrIdx); arg1->SetPrimType(PTY_ptr); @@ -2649,7 +2672,7 @@ void CGLowerer::LowerJarrayMalloc(const StmtNode &stmt, const JarrayMallocNode & args.push_back(mirBuilder->CreateIntConst(elemSize, PTY_u32)); /* elem_size */ args.push_back(node.Opnd(0)); /* n_elems */ std::string klassJavaDescriptor; - NameMangler::DecodeMapleNameToJavaDescriptor(klassName, klassJavaDescriptor); + namemangler::DecodeMapleNameToJavaDescriptor(klassName, klassJavaDescriptor); UStrIdx classNameStrIdx = GlobalTables::GetUStrTable().GetOrCreateStrIdxFromName(klassJavaDescriptor); ConststrNode *classNameExpr = mirModule.GetMemPool()->New(classNameStrIdx); classNameExpr->SetPrimType(PTY_ptr); diff --git a/src/maple_be/src/cg/aarch64/aarch64_args.cpp b/src/maple_be/src/cg/aarch64/aarch64_args.cpp index 87784959bfc78ee632d6b738e55d9b41c4df3fd2..9f1ea5517e098590d976fe0750c46184876c5715 100644 --- a/src/maple_be/src/cg/aarch64/aarch64_args.cpp +++ b/src/maple_be/src/cg/aarch64/aarch64_args.cpp @@ -111,7 +111,7 @@ void AArch64MoveRegArgs::GenerateStpInsn(const ArgInfo &firstArgInfo, const ArgI *baseOpnd, nullptr, &offsetOpnd, firstArgInfo.sym); } Insn &pushInsn = aarchCGFunc->GetCG()->BuildInstruction(mOp, regOpnd, regOpnd2, *memOpnd); - if (aarchCGFunc->GetCG()->GenerateVerboseAsm()) { + if (aarchCGFunc->GetCG()->GenerateVerboseCG()) { std::string argName = firstArgInfo.sym->GetName() + " " + secondArgInfo.sym->GetName(); pushInsn.SetComment(std::string("store param: ").append(argName)); } @@ -147,7 +147,7 @@ void AArch64MoveRegArgs::GenerateStrInsn(ArgInfo &argInfo) { MOperator mOp = aarchCGFunc->PickStInsn(argInfo.symSize * kBitsPerByte, argInfo.mirTy->GetPrimType()); Insn &insn = aarchCGFunc->GetCG()->BuildInstruction(mOp, regOpnd, *memOpnd); - if (aarchCGFunc->GetCG()->GenerateVerboseAsm()) { + if (aarchCGFunc->GetCG()->GenerateVerboseCG()) { insn.SetComment(std::string("store param: ").append(argInfo.sym->GetName())); } aarchCGFunc->GetCurBB()->AppendInsn(insn); @@ -222,7 +222,7 @@ void AArch64MoveRegArgs::LoadStackArgsToVReg(MIRSymbol &mirSym) { Insn &insn = aarchCGFunc->GetCG()->BuildInstruction( aarchCGFunc->PickLdInsn(GetPrimTypeBitSize(stype), stype), dstRegOpnd, memOpnd); - if (aarchCGFunc->GetCG()->GenerateVerboseAsm()) { + if (aarchCGFunc->GetCG()->GenerateVerboseCG()) { std::string key = "param: %%"; key += std::to_string(mirSym.GetPreg()->GetPregNo()); ASSERT(mirSym.GetStorageClass() == kScFormal, "vreg parameters should be kScFormal type."); @@ -247,7 +247,7 @@ void AArch64MoveRegArgs::MoveArgsToVReg(const PLocInfo &ploc, MIRSymbol &mirSym) MOperator mOp = aarchCGFunc->PickMovInsn(srcBitSize, regType); Insn &insn = aarchCGFunc->GetCG()->BuildInstruction(mOp, dstRegOpnd, srcRegOpnd); - if (aarchCGFunc->GetCG()->GenerateVerboseAsm()) { + if (aarchCGFunc->GetCG()->GenerateVerboseCG()) { std::string key = "param: %%"; key += std::to_string(mirSym.GetPreg()->GetPregNo()); insn.SetComment(key); diff --git a/src/maple_be/src/cg/aarch64/aarch64_cg.cpp b/src/maple_be/src/cg/aarch64/aarch64_cg.cpp index b16e16b32cda9503d251e17e102e89970a095f80..6d6f6ae18ba113f991192ee49a8de67822efa32f 100644 --- a/src/maple_be/src/cg/aarch64/aarch64_cg.cpp +++ b/src/maple_be/src/cg/aarch64/aarch64_cg.cpp @@ -167,7 +167,7 @@ void AArch64CG::FindOrCreateRepresentiveSym(std::vector &bitmapWords, ui GCTIBKey *key = memPool->New(allocator, rcHeader, bitmapWords); const std::string &gcTIBName = GCTIB_PREFIX_STR + name; MapleUnorderedMap::const_iterator iter = keyPatternMap.find(key); - if (iter == keyPatternMap.end()) { + if (iter == keyPatternMap.end() || gcTIBName.compare("MCC_GCTIB__Ljava_2Flang_2FObject_3B") == 0) { /* Emit the GCTIB label for the class */ GCTIBPattern *ptn = memPool->New(*key, *memPool); @@ -181,7 +181,7 @@ void AArch64CG::FindOrCreateRepresentiveSym(std::vector &bitmapWords, ui std::string ptnString = "\t.type " + ptn->GetName() + ", %object\n" + "\t.data\n" + "\t.align 3\n"; MIRSymbol *gcTIBSymbol = GlobalTables::GetGsymTable().GetSymbolFromStrIdx( - GlobalTables::GetStrTable().GetStrIdxFromName(NameMangler::GetInternalNameLiteral(gcTIBName))); + GlobalTables::GetStrTable().GetStrIdxFromName(namemangler::GetInternalNameLiteral(gcTIBName))); if (gcTIBSymbol != nullptr && gcTIBSymbol->GetStorageClass() == kScFstatic) { ptnString += "\t.local "; } else { diff --git a/src/maple_be/src/cg/aarch64/aarch64_cgfunc.cpp b/src/maple_be/src/cg/aarch64/aarch64_cgfunc.cpp index 6bd0b759985759a80333e7fc44f0953bb3079a1b..eb0ad3c398604570ea4fc628af390e2fb2aad545 100644 --- a/src/maple_be/src/cg/aarch64/aarch64_cgfunc.cpp +++ b/src/maple_be/src/cg/aarch64/aarch64_cgfunc.cpp @@ -201,7 +201,7 @@ void AArch64CGFunc::SelectLoadAcquire(Operand &dest, PrimType dtype, Operand &sr } std::string key; - if (isDirect && GetCG()->GenerateVerboseAsm()) { + if (isDirect && GetCG()->GenerateVerboseCG()) { const MIRSymbol *sym = static_cast(&src)->GetSymbol(); if (sym != nullptr) { MIRStorageClass sc = sym->GetStorageClass(); @@ -219,7 +219,7 @@ void AArch64CGFunc::SelectLoadAcquire(Operand &dest, PrimType dtype, Operand &sr /* Check if the right load-acquire instruction is available. */ if (mOp != MOP_undef) { Insn &insn = GetCG()->BuildInstruction(mOp, dest, *newSrc); - if (isDirect && GetCG()->GenerateVerboseAsm()) { + if (isDirect && GetCG()->GenerateVerboseCG()) { insn.SetComment(key); } GetCurBB()->AppendInsn(insn); @@ -230,7 +230,7 @@ void AArch64CGFunc::SelectLoadAcquire(Operand &dest, PrimType dtype, Operand &sr PrimType itype = (stype == PTY_f32) ? PTY_i32 : PTY_i64; RegOperand ®Opnd = CreateRegisterOperandOfType(itype); Insn &insn = GetCG()->BuildInstruction(PickLdInsn(ssize, itype, memOrd), regOpnd, *newSrc); - if (isDirect && GetCG()->GenerateVerboseAsm()) { + if (isDirect && GetCG()->GenerateVerboseCG()) { insn.SetComment(key); } GetCurBB()->AppendInsn(insn); @@ -241,7 +241,7 @@ void AArch64CGFunc::SelectLoadAcquire(Operand &dest, PrimType dtype, Operand &sr ASSERT((ssize == k8BitSize) || (ssize == k16BitSize), "Just checking"); PrimType utype = (ssize == k8BitSize) ? PTY_u8 : PTY_u16; Insn &insn = GetCG()->BuildInstruction(PickLdInsn(ssize, utype, memOrd), dest, *newSrc); - if (isDirect && GetCG()->GenerateVerboseAsm()) { + if (isDirect && GetCG()->GenerateVerboseCG()) { insn.SetComment(key); } GetCurBB()->AppendInsn(insn); @@ -272,7 +272,7 @@ void AArch64CGFunc::SelectStoreRelease(Operand &dest, PrimType dtype, Operand &s } std::string key; - if (isDirect && GetCG()->GenerateVerboseAsm()) { + if (isDirect && GetCG()->GenerateVerboseCG()) { const MIRSymbol *sym = static_cast(&dest)->GetSymbol(); if (sym != nullptr) { MIRStorageClass sc = sym->GetStorageClass(); @@ -290,7 +290,7 @@ void AArch64CGFunc::SelectStoreRelease(Operand &dest, PrimType dtype, Operand &s /* Check if the right store-release instruction is available. */ if (mOp != MOP_undef) { Insn &insn = GetCG()->BuildInstruction(mOp, src, *newDest); - if (isDirect && GetCG()->GenerateVerboseAsm()) { + if (isDirect && GetCG()->GenerateVerboseCG()) { insn.SetComment(key); } GetCurBB()->AppendInsn(insn); @@ -303,7 +303,7 @@ void AArch64CGFunc::SelectStoreRelease(Operand &dest, PrimType dtype, Operand &s mOp = (stype == PTY_f32) ? MOP_xvmovrs : MOP_xvmovrd; GetCurBB()->AppendInsn(GetCG()->BuildInstruction(mOp, regOpnd, src)); Insn &insn = GetCG()->BuildInstruction(PickStInsn(dsize, itype, memOrd), regOpnd, *newDest); - if (isDirect && GetCG()->GenerateVerboseAsm()) { + if (isDirect && GetCG()->GenerateVerboseCG()) { insn.SetComment(key); } GetCurBB()->AppendInsn(insn); @@ -435,7 +435,7 @@ void AArch64CGFunc::SelectCopyMemOpnd(Operand &dest, PrimType dtype, uint32 dsiz insn = &GetCG()->BuildInstruction(PickLdInsn(ssize, stype), dest, src); } - if (GetCG()->GenerateVerboseAsm()) { + if (GetCG()->GenerateVerboseCG()) { const MIRSymbol *symSecond = static_cast(&src)->GetSymbol(); if (symSecond != nullptr) { std::string key; @@ -864,7 +864,7 @@ void AArch64CGFunc::SelectDassign(StIdx stIdx, FieldID fieldId, PrimType rhsPTyp mOp = PickStInsn(GetPrimTypeBitSize(ptyp), ptyp); Insn &insn = GetCG()->BuildInstruction(mOp, stOpnd, *memOpnd); - if (GetCG()->GenerateVerboseAsm()) { + if (GetCG()->GenerateVerboseCG()) { const MIRSymbol *symSecond = static_cast(memOpnd)->GetSymbol(); if (symSecond != nullptr) { std::string key; @@ -893,7 +893,7 @@ void AArch64CGFunc::SelectAssertNull(UnaryStmtNode &stmt) { auto &mem = CreateMemOpnd(baseReg, 0, k32BitSize); Insn &loadRef = GetCG()->BuildInstruction(MOP_wldr, zwr, mem); loadRef.SetDoNotRemove(true); - if (GetCG()->GenerateVerboseAsm()) { + if (GetCG()->GenerateVerboseCG()) { loadRef.SetComment("null pointer check"); } GetCurBB()->AppendInsn(loadRef); @@ -1362,7 +1362,7 @@ void AArch64CGFunc::SelectAddrof(Operand &result, StImmOperand &stImm) { } SelectAdd(result, *GetBaseReg(*symLoc), *offset, PTY_u64); - if (GetCG()->GenerateVerboseAsm()) { + if (GetCG()->GenerateVerboseCG()) { /* Add a comment */ Insn *insn = GetCurBB()->GetLastInsn(); std::string comm = "local/formal var: "; @@ -1413,7 +1413,7 @@ Operand *AArch64CGFunc::SelectAddrof(AddrofNode &expr) { * adrp x1, _PTR__cinf_Ljava_2Flang_2FSystem_3B * ldr x1, [x1, #:lo12:_PTR__cinf_Ljava_2Flang_2FSystem_3B] */ - std::string ptrName = NameMangler::kPtrPrefixStr + symbol->GetName(); + std::string ptrName = namemangler::kPtrPrefixStr + symbol->GetName(); MIRType *ptrType = GlobalTables::GetTypeTable().GetPtr(); symbol = GetMirModule().GetMIRBuilder()->GetOrCreateGlobalDecl(ptrName, *ptrType); symbol->SetStorageClass(kScFstatic); @@ -2827,18 +2827,15 @@ void AArch64CGFunc::SelectMinOrMax(bool isMin, Operand &resOpnd, Operand &opnd0, bool is64Bits = (dsize == k64BitSize); if (IsPrimitiveInteger(primType)) { RegOperand ®Opnd0 = LoadIntoRegister(opnd0, primType); - Operand *newOpnd1 = &opnd1; - if ((opnd1.GetKind() != Operand::kOpdImmediate) && (opnd1.GetKind() != Operand::kOpdOffset)) { - newOpnd1 = &LoadIntoRegister(opnd1, primType); - } - SelectAArch64Cmp(regOpnd0, *newOpnd1, true, dsize); + Operand ®Opnd1 = LoadIntoRegister(opnd1, primType); + SelectAArch64Cmp(regOpnd0, regOpnd1, true, dsize); Operand &newResOpnd = LoadIntoRegister(resOpnd, primType); if (isMin) { CondOperand &cc = IsSignedInteger(primType) ? GetCondOperand(CC_LT) : GetCondOperand(CC_LO); - SelectAArch64Select(newResOpnd, regOpnd0, *newOpnd1, cc, true, dsize); + SelectAArch64Select(newResOpnd, regOpnd0, regOpnd1, cc, true, dsize); } else { CondOperand &cc = IsSignedInteger(primType) ? GetCondOperand(CC_GT) : GetCondOperand(CC_HI); - SelectAArch64Select(newResOpnd, regOpnd0, *newOpnd1, cc, true, dsize); + SelectAArch64Select(newResOpnd, regOpnd0, regOpnd1, cc, true, dsize); } } else if (IsPrimitiveFloat(primType)) { RegOperand ®Opnd0 = LoadIntoRegister(opnd0, primType); @@ -3945,7 +3942,7 @@ void AArch64CGFunc::GenerateYieldpoint(BB &bb) { auto &wzr = AArch64RegOperand::Get32bitZeroRegister(); auto &pollingPage = CreateMemOpnd(RYP, 0, k32BitSize); auto &yieldPoint = GetCG()->BuildInstruction(MOP_wldr, wzr, pollingPage); - if (GetCG()->GenerateVerboseAsm()) { + if (GetCG()->GenerateVerboseCG()) { yieldPoint.SetComment("yieldpoint"); } bb.AppendInsn(yieldPoint); @@ -4624,7 +4621,7 @@ Operand *AArch64CGFunc::SelectClearStackCallParam(const AddrofNode &expr, int64 } offsetValue = offset->GetValue(); SelectAdd(result, *GetBaseReg(*symLoc), *offset, PTY_u64); - if (GetCG()->GenerateVerboseAsm()) { + if (GetCG()->GenerateVerboseCG()) { /* Add a comment */ Insn *insn = GetCurBB()->GetLastInsn(); std::string comm = "local/formal var: "; @@ -4885,7 +4882,7 @@ void AArch64CGFunc::IntrinsifyStringIndexOf(AArch64ListOperand &srcOpnds, const auto iter = opnds.begin(); RegOperand *srcString = *iter; RegOperand *patternString = *(++iter); - GStrIdx gStrIdx = GlobalTables::GetStrTable().GetStrIdxFromName(NameMangler::kJavaLangStringStr); + GStrIdx gStrIdx = GlobalTables::GetStrTable().GetStrIdxFromName(namemangler::kJavaLangStringStr); MIRType *type = GlobalTables::GetTypeTable().GetTypeFromTyIdx(GlobalTables::GetTypeNameTable().GetTyIdxFromGStrIdx(gStrIdx)); auto stringType = static_cast(type); @@ -4936,7 +4933,7 @@ void AArch64CGFunc::SelectCall(CallNode &callNode) { MIRSymbol *fsym = GetFunction().GetLocalOrGlobalSymbol(fn->GetStIdx(), false); MIRType *retType = fn->GetReturnType(); - if (GetCG()->GenerateVerboseAsm()) { + if (GetCG()->GenerateVerboseCG()) { const std::string &comment = fsym->GetName(); GetCurBB()->AppendInsn(CreateCommentInsn(comment)); } @@ -5149,8 +5146,7 @@ LabelOperand &AArch64CGFunc::GetOrCreateLabelOperand(LabelIdx labIdx) { if (it != hashLabelOpndTable.end()) { return *(it->second); } - MIRSymbol *funcSt = GlobalTables::GetGsymTable().GetSymbolFromStidx(GetFunction().GetStIdx().Idx()); - const char *funcName = MapleString(funcSt->GetName(), memPool).c_str(); + const char *funcName = GetShortFuncName().c_str(); LabelOperand *res = memPool->New(funcName, labIdx); hashLabelOpndTable[labIdx] = res; return *res; @@ -5431,7 +5427,7 @@ void AArch64CGFunc::SelectLibCall(const std::string &funcName, std::vector(primType)); st->SetTyIdx(GetBecommon().BeGetOrCreateFunctionType(retType->GetTypeIndex(), vec, vecAt)->GetTypeIndex()); - if (GetCG()->GenerateVerboseAsm()) { + if (GetCG()->GenerateVerboseCG()) { const std::string &comment = "lib call : " + funcName; GetCurBB()->AppendInsn(CreateCommentInsn(comment)); } @@ -5948,7 +5944,7 @@ void AArch64CGFunc::SelectMPLProfCounterInc(IntrinsiccallNode &intrnNode) { vReg1.SetRegNotBBLocal(); static MIRSymbol *bbProfileTab = nullptr; if (!bbProfileTab) { - std::string bbProfileName = NameMangler::kBBProfileTabPrefixStr + GetMirModule().GetFileNameAsPostfix(); + std::string bbProfileName = namemangler::kBBProfileTabPrefixStr + GetMirModule().GetFileNameAsPostfix(); bbProfileTab = GetMirModule().GetMIRBuilder()->GetGlobalDecl(bbProfileName); CHECK_FATAL(bbProfileTab != nullptr, "expect bb profile tab"); } @@ -5979,7 +5975,7 @@ void AArch64CGFunc::SelectMPLClinitCheck(IntrinsiccallNode &intrnNode) { ASSERT(symbol->GetName().find(CLASSINFO_PREFIX_STR) == 0, "must be a symbol with __classinfo__"); if (!symbol->IsMuidDataUndefTab()) { - std::string ptrName = NameMangler::kPtrPrefixStr + symbol->GetName(); + std::string ptrName = namemangler::kPtrPrefixStr + symbol->GetName(); MIRType *ptrType = GlobalTables::GetTypeTable().GetPtr(); symbol = GetMirModule().GetMIRBuilder()->GetOrCreateGlobalDecl(ptrName, *ptrType); bClinitSeperate = true; @@ -6024,7 +6020,7 @@ void AArch64CGFunc::SelectMPLClinitCheck(IntrinsiccallNode &intrnNode) { void AArch64CGFunc::SelectIntrinCall(IntrinsiccallNode &intrinsiccallNode) { MIRIntrinsicID intrinsic = intrinsiccallNode.GetIntrinsic(); - if (GetCG()->GenerateVerboseAsm()) { + if (GetCG()->GenerateVerboseCG()) { std::string comment = GetIntrinsicName(intrinsic); GetCurBB()->AppendInsn(CreateCommentInsn(comment)); } diff --git a/src/maple_be/src/cg/aarch64/aarch64_ebo.cpp b/src/maple_be/src/cg/aarch64/aarch64_ebo.cpp index 9fd8f0fef8ee834893e4d4104f6ea6e11b369599..d740650cb60e4f4207a1342cc69fd68a0ecf09e9 100644 --- a/src/maple_be/src/cg/aarch64/aarch64_ebo.cpp +++ b/src/maple_be/src/cg/aarch64/aarch64_ebo.cpp @@ -440,21 +440,6 @@ bool AArch64Ebo::SimplifyConstOperand(Insn &insn, const MapleVector &o if (op->IsMemoryAccessOperand()) { op = &(insn.GetOperand(kInsnSecondOpnd)); } - } else if (bothConstant) { - /* special orr insn : - * orr resOp, imm1, 0 - * =======> - * mov resOp, #0 */ - if ((insn.GetMachineOpcode() == MOP_wiorrri12) || (insn.GetMachineOpcode() == MOP_xiorrri13) || - (insn.GetMachineOpcode() == MOP_xiorri13r) || (insn.GetMachineOpcode() == MOP_wiorri12r)) { - immOpnd = static_cast(op1); - op = op0; - if (op->IsMemoryAccessOperand()) { - op = &(insn.GetOperand(kInsnSecondOpnd)); - } - } else { - return false; - } } else if (bothConstant) { /* i) special orr insn, one of imm is 0: * orr resOp, imm1, #0 | orr resOp, #0, imm1 @@ -469,21 +454,16 @@ bool AArch64Ebo::SimplifyConstOperand(Insn &insn, const MapleVector &o (insn.GetMachineOpcode() == MOP_xiorri13r) || (insn.GetMachineOpcode() == MOP_wiorri12r)) { AArch64ImmOperand *immOpnd0 = static_cast(op0); AArch64ImmOperand *immOpnd1 = static_cast(op1); - if (immOpnd0->IsZero() && immOpnd1->IsZero()) { - immOpnd = immOpnd0; - op = op0; - } else if (immOpnd0->IsZero()) { - immOpnd = immOpnd0; + immOpnd = immOpnd1; + op = op0; + if (immOpnd0->IsZero()) { op = op1; - } else if (immOpnd1->IsZero()) { - immOpnd = immOpnd1; - op = op0; - } else { - return false; - } - if (op->IsMemoryAccessOperand()) { - op = &(insn.GetOperand(kInsnSecondOpnd)); + immOpnd = immOpnd0; } + MOperator mOp = opndSize == k64BitSize ? MOP_xmovri64 : MOP_xmovri32; + Insn &newInsn = cgFunc->GetCG()->BuildInstruction(mOp, *res, *op); + bb->ReplaceInsn(insn, newInsn); + return true; } else { return false; } diff --git a/src/maple_be/src/cg/aarch64/aarch64_emitter.cpp b/src/maple_be/src/cg/aarch64/aarch64_emitter.cpp index 17e14810da9c3d09cfb3dffdafff73b17c938c31..9c3f22b58173450e8ec8ac36e1d9aca7027c92d1 100644 --- a/src/maple_be/src/cg/aarch64/aarch64_emitter.cpp +++ b/src/maple_be/src/cg/aarch64/aarch64_emitter.cpp @@ -81,20 +81,20 @@ void AArch64Emitter::EmitFastLSDA() { CG *currCG = cgFunc->GetCG(); Emitter *emitter = currCG->GetEmitter(); - const std::string &funcName = cgFunc->GetFunction().GetName(); + const std::string &funcName = std::string(cgFunc->GetShortFuncName().c_str()); /* * .word 0xFFFFFFFF * .word .Label.LTest_3B_7C_3Cinit_3E_7C_28_29V3-func_start_label */ emitter->Emit("\t.word 0xFFFFFFFF\n"); - emitter->Emit("\t.word .Label." + funcName + "."); + emitter->Emit("\t.word .L." + funcName + "."); if (aarchCGFunc->NeedCleanup()) { emitter->Emit(cgFunc->GetCleanupLabel()->GetLabelIdx()); } else { ASSERT(!cgFunc->GetExitBBsVec().empty(), "exitbbsvec is empty in AArch64Emitter::EmitFastLSDA"); emitter->Emit(cgFunc->GetExitBB(0)->GetLabIdx()); } - emitter->Emit("-.Label." + funcName + ".") + emitter->Emit("-.L." + funcName + ".") .Emit(cgFunc->GetStartLabel()->GetLabelIdx()) .Emit("\n"); emitter->IncreaseJavaInsnCount(); @@ -112,7 +112,7 @@ void AArch64Emitter::EmitFullLSDA() { emitter->Emit("\t.align 2\n"); /* emit LSDA header */ LSDAHeader *lsdaHeader = ehFunc->GetLSDAHeader(); - const std::string &funcName = cgFunc->GetFunction().GetName(); + const std::string &funcName = std::string(cgFunc->GetShortFuncName().c_str()); emitter->EmitStmtLabel(funcName, lsdaHeader->GetLSDALabel()->GetLabelIdx()); emitter->Emit("\t.byte ").Emit(lsdaHeader->GetLPStartEncoding()).Emit("\n"); emitter->Emit("\t.byte ").Emit(lsdaHeader->GetTTypeEncoding()).Emit("\n"); @@ -159,8 +159,8 @@ void AArch64Emitter::EmitFullLSDA() { emitter->EmitLabelPair(funcName, cleaupCode); } else if (cgFunc->GetFunction().IsJava()) { ASSERT(!cgFunc->GetExitBBsVec().empty(), "exitbbsvec is empty in AArch64Emitter::EmitFullLSDA"); - emitter->Emit(".Label." + funcName).Emit(".").Emit(cgFunc->GetExitBB(0)->GetLabIdx()); - emitter->Emit(" - .Label." + funcName).Emit(".").Emit(cgFunc->GetStartLabel()->GetLabelIdx()).Emit("\n"); + emitter->Emit(".L." + funcName).Emit(".").Emit(cgFunc->GetExitBB(0)->GetLabIdx()); + emitter->Emit(" - .L." + funcName).Emit(".").Emit(cgFunc->GetStartLabel()->GetLabelIdx()).Emit("\n"); } else { emitter->Emit("0\n"); } @@ -196,8 +196,8 @@ void AArch64Emitter::EmitFullLSDA() { emitter->EmitLabelPair(funcName, cleaupCode); } else { ASSERT(!cgFunc->GetExitBBsVec().empty(), "exitbbsvec is empty in AArch64Emitter::EmitFullLSDA"); - emitter->Emit(".Label." + funcName).Emit(".").Emit(cgFunc->GetExitBB(0)->GetLabIdx()); - emitter->Emit(" - .Label." + funcName).Emit(".").Emit(cgFunc->GetStartLabel()->GetLabelIdx()).Emit("\n"); + emitter->Emit(".L." + funcName).Emit(".").Emit(cgFunc->GetExitBB(0)->GetLabIdx()); + emitter->Emit(" - .L." + funcName).Emit(".").Emit(cgFunc->GetStartLabel()->GetLabelIdx()).Emit("\n"); } emitter->Emit("\t.uleb128 0\n"); if (!cgFunc->GetFunction().IsJava()) { @@ -255,11 +255,11 @@ void AArch64Emitter::EmitBBHeaderLabel(const std::string &name, LabelIdx labIdx) label.SetLabelOrder(currCG->GetLabelOrderCnt()); currCG->IncreaseLabelOrderCnt(); } - if (currCG->GenerateVerboseAsm()) { - emitter.Emit(".Label.").Emit(name).Emit(".").Emit(labIdx).Emit(":\t//label order ").Emit(label.GetLabelOrder()); + if (currCG->GenerateVerboseCG()) { + emitter.Emit(".L.").Emit(name).Emit(".").Emit(labIdx).Emit(":\t//label order ").Emit(label.GetLabelOrder()); emitter.Emit("\n"); } else { - emitter.Emit(".Label.").Emit(name).Emit(".").Emit(labIdx).Emit(":\n"); + emitter.Emit(".L.").Emit(name).Emit(".").Emit(labIdx).Emit(":\n"); } } @@ -287,13 +287,14 @@ void AArch64Emitter::Run() { EmitMethodDesc(emitter); /* emit java code to the java section. */ if (cgFunc->GetFunction().IsJava()) { - std::string sectionName = NameMangler::kMuidJavatextPrefixStr; + std::string sectionName = namemangler::kMuidJavatextPrefixStr; emitter.Emit("\t.section ." + sectionName + ",\"ax\"\n"); } else { emitter.Emit("\t.text\n"); } emitter.Emit("\t.align 2\n"); MIRSymbol *funcSt = GlobalTables::GetGsymTable().GetSymbolFromStidx(cgFunc->GetFunction().GetStIdx().Idx()); + const std::string &funcName = std::string(cgFunc->GetShortFuncName().c_str()); if (funcSt->GetFunction()->GetAttr(FUNCATTR_weak)) { @@ -328,12 +329,12 @@ void AArch64Emitter::Run() { } /* emit instructions */ FOR_ALL_BB(bb, aarchCGFunc) { - if (currCG->GenerateVerboseAsm()) { + if (currCG->GenerateVerboseCG()) { emitter.Emit("# freq:").Emit(bb->GetFrequency()).Emit("\n"); } /* emit bb headers */ if (bb->GetLabIdx() != 0) { - EmitBBHeaderLabel(funcSt->GetName(), bb->GetLabIdx()); + EmitBBHeaderLabel(funcName, bb->GetLabIdx()); } FOR_BB_INSNS(insn, bb) { @@ -354,11 +355,9 @@ void AArch64Emitter::Run() { emitter.IncreaseJavaInsnCount(); } else if (ehFunc->NeedFullLSDA()) { LSDAHeader *lsdaHeader = ehFunc->GetLSDAHeader(); - MIRSymbol *funcSymbol = GlobalTables::GetGsymTable().GetSymbolFromStidx(cgFunc->GetFunction().GetStIdx().Idx()); - const std::string &funcName = funcSymbol->GetName(); /* .word .Label.lsda_label-func_start_label */ - emitter.Emit("\t.word .Label." + funcName).Emit(".").Emit(lsdaHeader->GetLSDALabel()->GetLabelIdx()); - emitter.Emit("-.Label." + funcName).Emit(".").Emit(cgFunc->GetStartLabel()->GetLabelIdx()).Emit("\n"); + emitter.Emit("\t.word .L." + funcName).Emit(".").Emit(lsdaHeader->GetLSDALabel()->GetLabelIdx()); + emitter.Emit("-.L." + funcName).Emit(".").Emit(cgFunc->GetStartLabel()->GetLabelIdx()).Emit("\n"); emitter.IncreaseJavaInsnCount(); } else if (ehFunc->NeedFastLSDA()) { EmitFastLSDA(); @@ -427,7 +426,7 @@ void AArch64Emitter::Run() { for (size_t i = 0; i < arrayConst->GetConstVec().size(); i++) { MIRLblConst *lblConst = safe_cast(arrayConst->GetConstVecItem(i)); CHECK_FATAL(lblConst != nullptr, "null ptr check"); - emitter.Emit("\t.quad\t.Label." + funcSt->GetName()).Emit(".").Emit(lblConst->GetValue()); + emitter.Emit("\t.quad\t.L." + funcName).Emit(".").Emit(lblConst->GetValue()); emitter.Emit(" - " + st->GetName() + "\n"); emitter.IncreaseJavaInsnCount(kQuadInsnCount); } diff --git a/src/maple_be/src/cg/aarch64/aarch64_insn.cpp b/src/maple_be/src/cg/aarch64/aarch64_insn.cpp index be41bcc1c0d1a967fb1af767d7b452ef8cdc2085..4a2e79ac4f5f0f7ce92ffe51733928b8e48f8810 100644 --- a/src/maple_be/src/cg/aarch64/aarch64_insn.cpp +++ b/src/maple_be/src/cg/aarch64/aarch64_insn.cpp @@ -650,7 +650,7 @@ void AArch64Insn::EmitClinit(const CG &cg, Emitter &emitter) const { emitter.Emit("\tadrp\t"); opnd0->Emit(emitter, prop0); emitter.Emit(","); - emitter.Emit(NameMangler::kPtrPrefixStr + stImmOpnd->GetName()); + emitter.Emit(namemangler::kPtrPrefixStr + stImmOpnd->GetName()); emitter.Emit("\n"); /* ldr x3, [x3, #:lo12:_PTR__cinf_Ljava_2Futil_2Fconcurrent_2Fatomic_2FAtomicInteger_3B] */ @@ -659,7 +659,7 @@ void AArch64Insn::EmitClinit(const CG &cg, Emitter &emitter) const { emitter.Emit(", ["); opnd0->Emit(emitter, prop0); emitter.Emit(", #:lo12:"); - emitter.Emit(NameMangler::kPtrPrefixStr + stImmOpnd->GetName()); + emitter.Emit(namemangler::kPtrPrefixStr + stImmOpnd->GetName()); emitter.Emit("]\n"); } /* emit "ldr x0,[x0,#48]" */ @@ -871,7 +871,7 @@ void AArch64Insn::Emit(const CG &cg, Emitter &emitter) const { emitter.SetCurrentMOP(mOp); const AArch64MD *md = &AArch64CG::kMd[mOp]; - if (!cg.GenerateVerboseAsm() && mOp == MOP_comment) { + if (!cg.GenerateVerboseAsm() && !cg.GenerateVerboseCG() && mOp == MOP_comment) { return; } @@ -1023,10 +1023,10 @@ void AArch64Insn::Emit(const CG &cg, Emitter &emitter) const { emitter.IncreaseJavaInsnCount(kLazyBindingRoutineInsnCount); } } - if (cg.GenerateVerboseAsm()) { - MapleString comment = GetComment(); - if (comment.c_str() != nullptr && strlen(comment.c_str()) > 0) { - emitter.Emit("\t\t// ").Emit(comment.c_str()); + if (cg.GenerateVerboseCG() || (cg.GenerateVerboseAsm() && mOp == MOP_comment)) { + const char *comment = GetComment().c_str(); + if (comment != nullptr && strlen(comment) > 0) { + emitter.Emit("\t\t// ").Emit(comment); } } diff --git a/src/maple_be/src/cg/aarch64/aarch64_proepilog.cpp b/src/maple_be/src/cg/aarch64/aarch64_proepilog.cpp index 444ad8b2ba32b237237fa23eef9814d8c142c298..074ef4585c6fde07f44984f38d6de1755ec2b1b9 100644 --- a/src/maple_be/src/cg/aarch64/aarch64_proepilog.cpp +++ b/src/maple_be/src/cg/aarch64/aarch64_proepilog.cpp @@ -325,7 +325,7 @@ Insn &AArch64GenProEpilog::CreateAndAppendInstructionForAllocateCallFrame(int64 void AArch64GenProEpilog::AppendInstructionAllocateCallFrame(AArch64reg reg0, AArch64reg reg1, RegType rty) { auto &aarchCGFunc = static_cast(cgFunc); CG *currCG = cgFunc.GetCG(); - if (currCG->GenerateVerboseAsm()) { + if (currCG->GenerateVerboseCG()) { cgFunc.GetCurBB()->AppendInsn(aarchCGFunc.CreateCommentInsn("allocate activation frame")); } @@ -413,7 +413,7 @@ void AArch64GenProEpilog::AppendInstructionAllocateCallFrame(AArch64reg reg0, AA void AArch64GenProEpilog::AppendInstructionAllocateCallFrameDebug(AArch64reg reg0, AArch64reg reg1, RegType rty) { auto &aarchCGFunc = static_cast(cgFunc); CG *currCG = cgFunc.GetCG(); - if (currCG->GenerateVerboseAsm()) { + if (currCG->GenerateVerboseCG()) { cgFunc.GetCurBB()->AppendInsn(aarchCGFunc.CreateCommentInsn("allocate activation frame for debugging")); } @@ -502,7 +502,7 @@ void AArch64GenProEpilog::GeneratePushRegs() { AArch64reg intRegFirstHalf = kRinvalid; AArch64reg fpRegFirstHalf = kRinvalid; - if (currCG->GenerateVerboseAsm()) { + if (currCG->GenerateVerboseCG()) { cgFunc.GetCurBB()->AppendInsn(aarchCGFunc.CreateCommentInsn("save callee-saved registers")); } @@ -517,7 +517,7 @@ void AArch64GenProEpilog::GeneratePushRegs() { AppendInstructionAllocateCallFrameDebug(RFP, RLR, kRegTyInt); } - if (currCG->GenerateVerboseAsm()) { + if (currCG->GenerateVerboseCG()) { cgFunc.GetCurBB()->AppendInsn(aarchCGFunc.CreateCommentInsn("copy SP to FP")); } Operand &spOpnd = aarchCGFunc.GetOrCreatePhysicalRegisterOperand(RSP, k64BitSize, kRegTyInt); @@ -596,7 +596,7 @@ void AArch64GenProEpilog::AppendInstructionStackCheck(AArch64reg reg, RegType rt auto &wzr = AArch64RegOperand::Get32bitZeroRegister(); auto &refX16 = aarchCGFunc.CreateMemOpnd(reg, 0, k64BitSize); auto &soeInstr = currCG->BuildInstruction(MOP_wldr, wzr, refX16); - if (currCG->GenerateVerboseAsm()) { + if (currCG->GenerateVerboseCG()) { soeInstr.SetComment("soerror"); } soeInstr.SetDoNotRemove(true); @@ -627,7 +627,7 @@ void AArch64GenProEpilog::GenerateProlog(BB &bb) { } else { int32 stackFrameSize = static_cast(cgFunc.GetMemlayout())->RealStackFrameSize(); if (stackFrameSize > 0) { - if (currCG->GenerateVerboseAsm()) { + if (currCG->GenerateVerboseCG()) { cgFunc.GetCurBB()->AppendInsn(aarchCGFunc.CreateCommentInsn("allocate activation frame")); } Operand &immOpnd = aarchCGFunc.CreateImmOperand(stackFrameSize, k32BitSize, true); @@ -636,7 +636,7 @@ void AArch64GenProEpilog::GenerateProlog(BB &bb) { int32 offset = stackFrameSize; (void)InsertCFIDefCfaOffset(offset, *(cgFunc.GetCurBB()->GetLastInsn())); } - if (currCG->GenerateVerboseAsm()) { + if (currCG->GenerateVerboseCG()) { cgFunc.GetCurBB()->AppendInsn(aarchCGFunc.CreateCommentInsn("copy SP to FP")); } int64 argsToStkPassSize = cgFunc.GetMemlayout()->SizeOfArgsToStackPass(); @@ -859,7 +859,7 @@ void AArch64GenProEpilog::GeneratePopRegs() { AArch64reg intRegFirstHalf = kRinvalid; AArch64reg fpRegFirstHalf = kRinvalid; - if (currCG->GenerateVerboseAsm()) { + if (currCG->GenerateVerboseCG()) { cgFunc.GetCurBB()->AppendInsn(aarchCGFunc.CreateCommentInsn("restore callee-saved registers")); } @@ -980,7 +980,7 @@ void AArch64GenProEpilog::GenerateEpilog(BB &bb) { } else { int32 stackFrameSize = static_cast(cgFunc.GetMemlayout())->RealStackFrameSize(); if (stackFrameSize > 0) { - if (currCG->GenerateVerboseAsm()) { + if (currCG->GenerateVerboseCG()) { cgFunc.GetCurBB()->AppendInsn(aarchCGFunc.CreateCommentInsn("pop up activation frame")); } diff --git a/src/maple_be/src/cg/aarch64/aarch64_yieldpoint.cpp b/src/maple_be/src/cg/aarch64/aarch64_yieldpoint.cpp index d78a3609632ddb8d072bb58070f62c37a41343af..e1f9564dd7a6f1c04dde9cb6784c2fccd40e4209 100644 --- a/src/maple_be/src/cg/aarch64/aarch64_yieldpoint.cpp +++ b/src/maple_be/src/cg/aarch64/aarch64_yieldpoint.cpp @@ -52,49 +52,11 @@ void AArch64YieldPointInsertion::InsertYieldPoint() { * for BBs after firstbb. */ for (BB *bb = aarchCGFunc->GetFirstBB()->GetNext(); bb != nullptr; bb = bb->GetNext()) { - if (Globals::GetInstance()->GetOptimLevel() > 0) { - /* insert a yieldpoint before the last jump instruction of a goto BB. */ - if (bb->IsBackEdgeDest()) { - aarchCGFunc->GetDummyBB()->ClearInsns(); - aarchCGFunc->GenerateYieldpoint(*aarchCGFunc->GetDummyBB()); - bb->InsertAtBeginning(*aarchCGFunc->GetDummyBB()); - continue; - } - } else { - /* when -O0, there is no backedge info available. */ - if ((bb->GetKind() == BB::kBBGoto) && (bb->GetLastInsn() != nullptr) && bb->GetLastInsn()->IsBranch()) { - aarchCGFunc->GetDummyBB()->ClearInsns(); - aarchCGFunc->GenerateYieldpoint(*aarchCGFunc->GetDummyBB()); - bb->InsertAtBeginning(*aarchCGFunc->GetDummyBB()); - continue; - } - /* - * insert yieldpoint for empty loop (CondGoto backward), - * aka. last instruction jump to the top of the BB. - */ - if (bb->GetLastInsn() != nullptr && bb->GetLastInsn()->IsBranch()) { - /* the jump instruction. */ - Insn *jump = bb->GetLastInsn(); - /* skip if no jump target. */ - if (jump->GetOpndNum() == 0) { - continue; - } - /* get the jump target operand. */ - Operand *op = jump->GetOpnd(jump->GetOpndNum() - 1); - /* last operand not found or not a label operand. */ - if (op == nullptr || !op->IsLabel() || !op->IsLabelOpnd()) { - continue; - } - /* the label operand of the jump instruction. */ - LabelOperand *label = static_cast(op); - if (label->GetLabelIndex() != bb->GetLabIdx()) { - continue; - } - /* insert yieldpoint before jump instruction. */ - aarchCGFunc->GetDummyBB()->ClearInsns(); - aarchCGFunc->GenerateYieldpoint(*aarchCGFunc->GetDummyBB()); - bb->InsertAtBeginning(*aarchCGFunc->GetDummyBB()); - } + /* insert a yieldpoint at beginning if BB is BackEdgeDest. */ + if (bb->IsBackEdgeDest()) { + aarchCGFunc->GetDummyBB()->ClearInsns(); + aarchCGFunc->GenerateYieldpoint(*aarchCGFunc->GetDummyBB()); + bb->InsertAtBeginning(*aarchCGFunc->GetDummyBB()); } } } diff --git a/src/maple_be/src/cg/cg.cpp b/src/maple_be/src/cg/cg.cpp index af4cf45d2dc1931ad9420f65592683070f9d6825..64cc3a34411434c6532a020c77f082535abf407a 100644 --- a/src/maple_be/src/cg/cg.cpp +++ b/src/maple_be/src/cg/cg.cpp @@ -256,4 +256,30 @@ std::vector CG::GetReferenceOffsets64(const BECommon &beCommon, MIRStruct return result; } + + +const std::string CG::ExtractFuncName(const std::string &str) { + /* 3: length of "_7C" */ + size_t offset = 3; + size_t pos1 = str.find("_7C"); + if (pos1 == std::string::npos) { + return str; + } + size_t pos2 = str.find("_7C", pos1 + offset); + if (pos2 == std::string::npos) { + return str; + } + std::string funcName = str.substr(pos1 + offset, pos2 - pos1 - offset); + /* avoid funcName like __LINE__ and __FILE__ which will be resolved by assembler */ + if (funcName.find("__") != std::string::npos) { + return str; + } + if (funcName == "_3Cinit_3E") { + return "init"; + } + if (funcName == "_3Cclinit_3E") { + return "clinit"; + } + return funcName; +} } /* namespace maplebe */ diff --git a/src/maple_be/src/cg/cg_option.cpp b/src/maple_be/src/cg/cg_option.cpp index 7395c1cdbde07a2091076ee2aef4b3bae6893037..c5a87b6cd8ff8a96045d8da57e0c26ada650a3bb 100644 --- a/src/maple_be/src/cg/cg_option.cpp +++ b/src/maple_be/src/cg/cg_option.cpp @@ -84,6 +84,7 @@ enum OptionIndex : uint64 { kPie, kPic, kCGVerbose, + kCGVerboseCG, kCGMapleLinker, kCgen, kEbo, @@ -175,6 +176,16 @@ const Descriptor kUsage[] = { " --no-verbose-asm\n", "mplcg", {} }, + { kCGVerboseCG, + kEnable, + "", + "verbose-cg", + kBuildTypeProduct, + kArgCheckPolicyBool, + " --verbose-cg \tAdd comments to cg output\n" + " --no-verbose-cg\n", + "mplcg", + {} }, { kCGMapleLinker, kEnable, "", @@ -800,6 +811,10 @@ bool CGOptions::SolveOptions(const std::vector