diff --git a/src/bin/jbc2mpl b/src/bin/jbc2mpl index f663f9658e66d0e692881f3d1012df2ca22e6bbc..f90bee432eb5403cfa699018ac060b63ca18c677 100755 Binary files a/src/bin/jbc2mpl and b/src/bin/jbc2mpl differ diff --git a/src/bin/maple b/src/bin/maple index d017892872e8cba213582e42bce07ae2c4278466..2048892b27c40933dc00dae2d23e60ce6fe3e121 100755 Binary files a/src/bin/maple and b/src/bin/maple differ diff --git a/src/maple_be/src/be/becommon.cpp b/src/maple_be/src/be/becommon.cpp index 5e6932ed845e1130287587e323a2dff7bb344dec..f7d9e2dcd9a4fb3933d811e5d180794ffe5b6651 100644 --- a/src/maple_be/src/be/becommon.cpp +++ b/src/maple_be/src/be/becommon.cpp @@ -26,7 +26,8 @@ using namespace maple; BECommon::BECommon(MIRModule &mod) : mirModule(mod), typeSizeTable(GlobalTables::GetTypeTable().GetTypeTable().size(), 0, mirModule.GetMPAllocator().Adapter()), - tableAlignTable(GlobalTables::GetTypeTable().GetTypeTable().size(), 0, mirModule.GetMPAllocator().Adapter()), + tableAlignTable(GlobalTables::GetTypeTable().GetTypeTable().size(), mirModule.IsCModule(), + mirModule.GetMPAllocator().Adapter()), structFieldCountTable(GlobalTables::GetTypeTable().GetTypeTable().size(), 0, mirModule.GetMPAllocator().Adapter()), jClassLayoutTable(mirModule.GetMPAllocator().Adapter()) { @@ -586,7 +587,7 @@ bool BECommon::TyIsInSizeAlignTable(const MIRType &ty) const { void BECommon::AddAndComputeSizeAlign(MIRType &ty) { CHECK_FATAL(ty.GetTypeIndex() == typeSizeTable.size(), "make sure the ty idx is exactly the table size"); - tableAlignTable.push_back(0); + tableAlignTable.push_back(mirModule.IsCModule()); typeSizeTable.push_back(0); ComputeTypeSizesAligns(ty); } diff --git a/src/maple_be/src/cg/aarch64/aarch64_emitter.cpp b/src/maple_be/src/cg/aarch64/aarch64_emitter.cpp index 9c3f22b58173450e8ec8ac36e1d9aca7027c92d1..3f9e47ab5a210987a142b61791ed7b16305c4f2c 100644 --- a/src/maple_be/src/cg/aarch64/aarch64_emitter.cpp +++ b/src/maple_be/src/cg/aarch64/aarch64_emitter.cpp @@ -297,19 +297,23 @@ void AArch64Emitter::Run() { const std::string &funcName = std::string(cgFunc->GetShortFuncName().c_str()); + std::string funcStName = funcSt->GetName(); if (funcSt->GetFunction()->GetAttr(FUNCATTR_weak)) { - emitter.Emit("\t.weak\t" + funcSt->GetName() + "\n"); - emitter.Emit("\t.hidden\t" + funcSt->GetName() + "\n"); + emitter.Emit("\t.weak\t" + funcStName + "\n"); + emitter.Emit("\t.hidden\t" + funcStName + "\n"); } else if (funcSt->GetFunction()->GetAttr(FUNCATTR_local)) { - emitter.Emit("\t.local\t" + funcSt->GetName() + "\n"); + emitter.Emit("\t.local\t" + funcStName + "\n"); } else { - emitter.Emit("\t.globl\t" + funcSt->GetName() + "\n"); - emitter.Emit("\t.hidden\t" + funcSt->GetName() + "\n"); + bool isExternFunction = false; + emitter.Emit("\t.globl\t").Emit(funcSt->GetName()).Emit("\n"); + if (!currCG->GetMIRModule()->IsCModule() || !isExternFunction) { + emitter.Emit("\t.hidden\t").Emit(funcSt->GetName()).Emit("\n"); + } } - emitter.Emit("\t.type\t" + funcSt->GetName() + ", %function\n"); + emitter.Emit("\t.type\t" + funcStName + ", %function\n"); /* add these messege , solve the simpleperf tool error */ EmitRefToMethodDesc(emitter); - emitter.Emit(funcSt->GetName() + ":\n"); + emitter.Emit(funcStName + ":\n"); /* if the last insn is call, then insert nop */ bool found = false; FOR_ALL_BB_REV(bb, aarchCGFunc) { @@ -343,9 +347,9 @@ void AArch64Emitter::Run() { } if (CGOptions::IsMapleLinker()) { /* Emit a label for calculating method size */ - emitter.Emit(".Label.end." + funcSt->GetName() + ":\n"); + emitter.Emit(".Label.end." + funcStName + ":\n"); } - emitter.Emit("\t.size\t" + funcSt->GetName() + ", .-").Emit(funcSt->GetName() + "\n"); + emitter.Emit("\t.size\t" + funcStName + ", .-").Emit(funcStName + "\n"); EHFunc *ehFunc = cgFunc->GetEHFunc(); /* emit LSDA */ diff --git a/src/maple_ir/src/mir_builder.cpp b/src/maple_ir/src/mir_builder.cpp index 2b90e91257ad91beb8fc9c6afb37698067f49c2b..68deef642b827c17f697fe1f13b796c83151ddbd 100644 --- a/src/maple_ir/src/mir_builder.cpp +++ b/src/maple_ir/src/mir_builder.cpp @@ -147,6 +147,9 @@ bool MIRBuilder::TraverseToNamedFieldWithTypeAndMatchStyle(MIRStructType &struct unsigned int style = matchStyle & kMatchAnyField; if (fieldType->IsStructType()) { auto *subStructType = static_cast(fieldType); + if (subStructType->GetKind() == kTypeUnion) { + continue; + } if (TraverseToNamedFieldWithTypeAndMatchStyle(*subStructType, nameIdx, typeIdx, fieldID, style)) { return true; } diff --git a/src/maple_me/src/me_rename2preg.cpp b/src/maple_me/src/me_rename2preg.cpp index 5867539c8c4860d2aaeaeb30cd162fe185f95ba7..261ded04473db89406b71edf88ac9261ba1f1f83 100755 --- a/src/maple_me/src/me_rename2preg.cpp +++ b/src/maple_me/src/me_rename2preg.cpp @@ -190,6 +190,43 @@ class SSARename2Preg { return name; } + void CollectRefedOst(MeExpr &meExpr) { + MeExprOp op = meExpr.GetMeOp(); + switch (op) { + case kMeOpOp: { + OpMeExpr &expr = static_cast(meExpr); + for (uint32 i = 0; i < kOperandNumTernary; ++i) { + MeExpr *opnd = expr.GetOpnd(i); + if (opnd != nullptr) { + CollectRefedOst(*opnd); + } + } + break; + } + case kMeOpNary: { + NaryMeExpr &expr = static_cast(meExpr); + MapleVector &opnds = expr.GetOpnds(); + for (MapleVector::iterator it = opnds.begin(); it != opnds.end(); ++it) { + CollectRefedOst(*(*it)); + } + break; + } + case kMeOpIvar: { + IvarMeExpr &expr = static_cast(meExpr); + CollectRefedOst(*(expr.GetBase())); + break; + } + case kMeOpAddrof: { + AddrofMeExpr &expr = static_cast(meExpr); + referencedOst[expr.GetOstIdx().GetIdx()] = true; + break; + } + default: + break; + } + return; + } + void Run(MeFunction &func, MeFuncResultMgr *pFuncRst) { bool emptyFunc = func.empty(); if (!emptyFunc) { @@ -198,6 +235,16 @@ class SSARename2Preg { const AliasClass &aliasClass = utils::ToRef(GetAnalysisResult(func, funcRst)); cacheProxy.Init(utils::ToRef(ssaTab), irMap); + // first pass: collect var that is referenced + for (auto it = func.valid_begin(), eIt = func.valid_end(); it != eIt; ++it) { + BB &bb = utils::ToRef(*it); + for (MeStmt &stmt : bb.GetMeStmts()) { + for (size_t i = 0; i < stmt.NumMeStmtOpnds(); ++i) { + CollectRefedOst(*stmt.GetOpnd(i)); + } + } + } + for (auto it = func.valid_begin(), eIt = func.valid_end(); it != eIt; ++it) { BB &bb = utils::ToRef(*it); @@ -364,10 +411,18 @@ class SSARename2Preg { return nullptr; } + if (varExpr.GetPrimType() == PTY_agg) { + return nullptr; + } + if (ost.GetIndirectLev() != 0) { return nullptr; } + if (referencedOst[ost.GetIndex().GetIdx()]) { + return nullptr; + } + CHECK_FATAL(ost.IsRealSymbol(), "NYI"); const MIRSymbol &irSymbol = utils::ToRef(ost.GetMIRSymbol()); if (irSymbol.GetAttr(ATTR_localrefvar)) { @@ -420,6 +475,7 @@ class SSARename2Preg { CacheProxy cacheProxy; FormalRenaming formal; + std::unordered_map referencedOst; }; } diff --git a/src/mpl2mpl/src/native_stub_func.cpp b/src/mpl2mpl/src/native_stub_func.cpp index ca6d4265938d337f5d946b525bc8442ecdf8d6b2..437fced020ec92ea8e086c3f375b3a11c0fe7530 100644 --- a/src/mpl2mpl/src/native_stub_func.cpp +++ b/src/mpl2mpl/src/native_stub_func.cpp @@ -549,13 +549,13 @@ void NativeStubFuncGeneration::GenerateHelperFuncDecl() { MRTCheckThrowPendingExceptionFunc->SetBody(nullptr); // MRT_PreNativeCall ArgVector preArgs(GetMIRModule().GetMPAllocator().Adapter()); - MRTPreNativeFunc = builder->CreateFunction(namemangler::kPreNativeFunc, *voidPointerType, preArgs); + MRTPreNativeFunc = builder->GetOrCreateFunction(namemangler::kPreNativeFunc, voidType->GetTypeIndex()); CHECK_FATAL(MRTPreNativeFunc != nullptr, "MRTPreNativeFunc is null."); MRTPreNativeFunc->SetBody(nullptr); // MRT_PostNativeCall ArgVector postArgs(GetMIRModule().GetMPAllocator().Adapter()); postArgs.push_back(ArgPair("env", voidPointerType)); - MRTPostNativeFunc = builder->CreateFunction(namemangler::kPostNativeFunc, *voidType, postArgs); + MRTPostNativeFunc = builder->GetOrCreateFunction(namemangler::kPostNativeFunc, voidType->GetTypeIndex()); CHECK_FATAL(MRTPostNativeFunc != nullptr, "MRTPostNativeFunc is null."); MRTPostNativeFunc->SetBody(nullptr); // MRT_DecodeReference