diff --git a/src/bin/jbc2mpl b/src/bin/jbc2mpl index d1750313c14a552a7f8e9554ccbc6ef09432bb94..7295227c10025196f1ce54907474a2b783c0bfc1 100755 Binary files a/src/bin/jbc2mpl and b/src/bin/jbc2mpl differ diff --git a/src/bin/maple b/src/bin/maple index 39659c8c4fb2ab06f27e952351a685cb3572e682..619378d0a46dd04eb3f0b99446b25b0b85d528f9 100755 Binary files a/src/bin/maple and b/src/bin/maple differ diff --git a/src/bin/mplcg b/src/bin/mplcg index 9b7f24e283415deb38d021e4488782f45da32207..7dabae693b3a4cec2a31d1e4b0c897a5c1237d27 100755 Binary files a/src/bin/mplcg and b/src/bin/mplcg differ diff --git a/src/maple_ir/include/mir_symbol.h b/src/maple_ir/include/mir_symbol.h index b09a4fe180ca0a85cc62bfcdfe9cadbe7a111a74..f93cbaca218aae162d74f62b0631dfe9aee4759d 100644 --- a/src/maple_ir/include/mir_symbol.h +++ b/src/maple_ir/include/mir_symbol.h @@ -326,6 +326,7 @@ class MIRSymbol { bool IsRegJNITab() const; bool IsRegJNIFuncTab() const; bool IsMuidTab() const; + bool IsMuidRoTab() const; bool IsCodeLayoutInfo() const; std::string GetMuidTabName() const; bool IsMuidFuncDefTab() const; @@ -339,6 +340,7 @@ class MIRSymbol { bool IsMuidFuncUndefMuidTab() const; bool IsMuidDataDefMuidTab() const; bool IsMuidDataUndefMuidTab() const; + bool IsMuidFuncMuidIdxMuidTab() const; bool IsMuidRangeTab() const; bool IsGctibSym() const; bool IsPrimordialObject() const; diff --git a/src/maple_ir/include/mir_type.h b/src/maple_ir/include/mir_type.h index 40ac9fcffc13b8a8a2d883daf7e4e0c57efa2fb7..eeceb57f1c563267c01e3a2775ed030db8bb55aa 100644 --- a/src/maple_ir/include/mir_type.h +++ b/src/maple_ir/include/mir_type.h @@ -426,11 +426,6 @@ class MIRType { typeKind = kind; } - bool IsIncomplete() const { - return typeKind == kTypeStructIncomplete || typeKind == kTypeClassIncomplete || - typeKind == kTypeInterfaceIncomplete; - } - bool IsNameIsLocal() const { return nameIsLocal; } @@ -460,6 +455,11 @@ class MIRType { return false; } + virtual bool IsIncomplete() const { + return typeKind == kTypeStructIncomplete || typeKind == kTypeClassIncomplete || + typeKind == kTypeInterfaceIncomplete; + } + bool IsMIRPtrType() const { return typeKind == kTypePointer; } diff --git a/src/maple_ir/src/mir_symbol.cpp b/src/maple_ir/src/mir_symbol.cpp index 5afe80a247ee216787636970c9b11f0b4f47a4ed..48384c619688dfe52fc538ccb4dcff99a73d60a5 100644 --- a/src/maple_ir/src/mir_symbol.cpp +++ b/src/maple_ir/src/mir_symbol.cpp @@ -88,6 +88,10 @@ bool MIRSymbol::IsMuidTab() const { return StringUtils::StartsWith(GetName(), kMuidPrefixStr); } +bool MIRSymbol::IsMuidRoTab() const { + return StringUtils::StartsWith(GetName(), kMuidRoPrefixStr); +} + bool MIRSymbol::IsCodeLayoutInfo() const { return StringUtils::StartsWith(GetName(), kFunctionLayoutStr); } @@ -144,6 +148,10 @@ bool MIRSymbol::IsMuidDataUndefMuidTab() const { return StringUtils::StartsWith(GetName(), kMuidDataUndefMuidTabPrefixStr); } +bool MIRSymbol::IsMuidFuncMuidIdxMuidTab() const { + return StringUtils::StartsWith(GetName(), kMuidFuncMuidIdxTabPrefixStr); +} + bool MIRSymbol::IsMuidRangeTab() const { return StringUtils::StartsWith(GetName(), kMuidRangeTabPrefixStr); } diff --git a/src/maple_ir/src/parser.cpp b/src/maple_ir/src/parser.cpp index 40f39d73ec62c299e2dcff85d256c48ed22a141f..6625e5258fa1de31a2e7a5b77cdae256333a2709 100644 --- a/src/maple_ir/src/parser.cpp +++ b/src/maple_ir/src/parser.cpp @@ -2680,7 +2680,7 @@ bool MIRParser::ParseMIRForImportPath() { void MIRParser::PrepareParsingMIR() { dummyFunction = CreateDummyFunction(); mod.SetCurFunction(dummyFunction); - lexer.PrepareForFile(mod.GetFileName().c_str()); + lexer.PrepareForFile(mod.GetFileName()); } bool MIRParser::ParseTypeFromString(const std::string &src, TyIdx &tyIdx) { diff --git a/src/maple_me/src/irmap.cpp b/src/maple_me/src/irmap.cpp index 26c0eb8a075b8037442ea10c3cc1b422dc554d8f..2a021eaeaf00493373df6cf866892fcd8a0dcfdb 100644 --- a/src/maple_me/src/irmap.cpp +++ b/src/maple_me/src/irmap.cpp @@ -729,13 +729,25 @@ bool IRMap::ReplaceMeExprStmt(MeStmt &meStmt, MeExpr &meExpr, MeExpr &repexpr) { } } - bool curOpndReplaced = ReplaceMeExprStmtOpnd(i, meStmt, meExpr, repexpr); - isReplaced = isReplaced || curOpndReplaced; - - if (i == 0 && curOpndReplaced && op == OP_iassign) { - auto &ivarStmt = static_cast(meStmt); - ivarStmt.SetLHSVal(BuildLHSIvar(*ivarStmt.GetOpnd(0), ivarStmt, ivarStmt.GetLHSVal()->GetFieldID())); + bool curOpndReplaced = false; + if (i == 0 && op == OP_iassign) { + IassignMeStmt &ivarStmt = static_cast(meStmt); + MeExpr *oldBase = ivarStmt.GetLHS()->GetOpnd(0); + MeExpr *newBase = nullptr; + if (oldBase == &meExpr) { + newBase = &repexpr; + curOpndReplaced = true; + } else if (!oldBase->IsLeaf()) { + newBase = ReplaceMeExprExpr(*oldBase, meExpr, repexpr); + curOpndReplaced = (newBase != oldBase); + } + if (curOpndReplaced) { + ivarStmt.SetLHSVal(BuildLHSIvar(*newBase, ivarStmt, ivarStmt.GetLHSVal()->GetFieldID())); + } + } else { + curOpndReplaced = ReplaceMeExprStmtOpnd(i, meStmt, meExpr, repexpr); } + isReplaced = isReplaced || curOpndReplaced; } return isReplaced; diff --git a/src/maple_util/include/name_mangler.h b/src/maple_util/include/name_mangler.h index 6d0c3131be9f8125528c858adb71c9ee1c14a136..63442dc4db8443f918131531162e902223c97afc 100644 --- a/src/maple_util/include/name_mangler.h +++ b/src/maple_util/include/name_mangler.h @@ -49,18 +49,19 @@ namespace NameMangler { // Names of all compiler-generated tables and accessed by runtime static constexpr const char kMuidPrefixStr[] = "__muid_"; +static constexpr const char kMuidRoPrefixStr[] = "__muid_ro"; static constexpr const char kMuidFuncDefTabPrefixStr[] = "__muid_func_def_tab"; -static constexpr const char kMuidFuncDefOrigTabPrefixStr[] = "__muid_func_def_orig_tab"; -static constexpr const char kMuidFuncInfTabPrefixStr[] = "__muid_func_inf_tab"; -static constexpr const char kMuidFuncMuidIdxTabPrefixStr[] = "__muid_func_muid_idx_tab"; +static constexpr const char kMuidFuncDefOrigTabPrefixStr[] = "__muid_ro_func_def_orig_tab"; +static constexpr const char kMuidFuncInfTabPrefixStr[] = "__muid_ro_func_inf_tab"; +static constexpr const char kMuidFuncMuidIdxTabPrefixStr[] = "__muid_ro_func_muid_idx_tab"; static constexpr const char kMuidDataDefTabPrefixStr[] = "__muid_data_def_tab"; -static constexpr const char kMuidDataDefOrigTabPrefixStr[] = "__muid_data_def_orig_tab"; +static constexpr const char kMuidDataDefOrigTabPrefixStr[] = "__muid_ro_data_def_orig_tab"; static constexpr const char kMuidFuncUndefTabPrefixStr[] = "__muid_func_undef_tab"; static constexpr const char kMuidDataUndefTabPrefixStr[] = "__muid_data_undef_tab"; -static constexpr const char kMuidFuncDefMuidTabPrefixStr[] = "__muid_func_def_muid_tab"; -static constexpr const char kMuidDataDefMuidTabPrefixStr[] = "__muid_data_def_muid_tab"; -static constexpr const char kMuidFuncUndefMuidTabPrefixStr[] = "__muid_func_undef_muid_tab"; -static constexpr const char kMuidDataUndefMuidTabPrefixStr[] = "__muid_data_undef_muid_tab"; +static constexpr const char kMuidFuncDefMuidTabPrefixStr[] = "__muid_ro_func_def_muid_tab"; +static constexpr const char kMuidDataDefMuidTabPrefixStr[] = "__muid_ro_data_def_muid_tab"; +static constexpr const char kMuidFuncUndefMuidTabPrefixStr[] = "__muid_ro_func_undef_muid_tab"; +static constexpr const char kMuidDataUndefMuidTabPrefixStr[] = "__muid_ro_data_undef_muid_tab"; static constexpr const char kMuidVtabPrefixStr[] = "__muid_vtab"; static constexpr const char kMuidItabPrefixStr[] = "__muid_itab"; static constexpr const char kMuidVtabOffsetPrefixStr[] = "__muid_vtab_offset_tab"; diff --git a/src/mpl2mpl/include/class_hierarchy.h b/src/mpl2mpl/include/class_hierarchy.h index df9084b9cc52264bdbf426ba422db193988f0be3..06214e8fe6606110474734f2bab25cbaf3f52f1e 100644 --- a/src/mpl2mpl/include/class_hierarchy.h +++ b/src/mpl2mpl/include/class_hierarchy.h @@ -51,12 +51,20 @@ class Klass { // Return true if Klass represents an interface bool IsInterface() const { - return (structType->GetKind() == kTypeInterface); + return structType->GetKind() == kTypeInterface; + } + + bool IsInterfaceIncomplete() const { + return structType->GetKind() == kTypeInterfaceIncomplete; } // Return true if Klass represents a normal java class bool IsClass() const { - return (structType->GetKind() == kTypeClass); + return structType->GetKind() == kTypeClass; + } + + bool IsClassIncomplete() const { + return structType->GetKind() == kTypeClassIncomplete; } // Return true if found in the member methods diff --git a/src/mpl2mpl/include/reflection_analysis.h b/src/mpl2mpl/include/reflection_analysis.h index 225e314f6b2b2302ced7cf5647f2fa934711df01..c506a8f626898d418008a5dede86f35885224391 100644 --- a/src/mpl2mpl/include/reflection_analysis.h +++ b/src/mpl2mpl/include/reflection_analysis.h @@ -99,7 +99,14 @@ class ReflectionAnalysis : public AnalysisResult { allocator(memPool), klassH(kh), mirBuilder(builder), - classTab(allocator.Adapter()) {} + classTab(allocator.Adapter()), + isLibcore(false), + isLazyBindingOrDecouple(false) { + Klass *objectKlass = kh->GetKlassFromLiteral(NameMangler::kJavaLangObjectStr); + if (objectKlass != nullptr && objectKlass->GetMIRStructType()->IsLocal()) { + isLibcore = true; + } + } ~ReflectionAnalysis() = default; static void GenStrTab(MIRModule &mirmodule); @@ -194,7 +201,6 @@ class ReflectionAnalysis : public AnalysisResult { bool VtableFunc(const MIRFunction &func) const; void GenPrimitiveClass(); - bool RootClassDefined(); // whether current module defines root classes void GenAllMethodHash(std::vector> &methodInfoVec, std::unordered_map &baseNameMap, std::unordered_map &fullNameMap); @@ -225,8 +231,8 @@ class ReflectionAnalysis : public AnalysisResult { KlassHierarchy *klassH; MIRBuilder &mirBuilder; MapleVector classTab; - int isLibcore = -1; - bool isLazyBindingOrDecouple = false; + bool isLibcore; + bool isLazyBindingOrDecouple; std::string reflectionMuidStr; static const char *klassPtrName; static TyIdx classMetadataTyIdx; diff --git a/src/mpl2mpl/src/class_hierarchy.cpp b/src/mpl2mpl/src/class_hierarchy.cpp index 6c8aa09274570d466e270a237b4713c172da2433..76d516c6d71cfc8018505ea27b27338869ffbec9 100644 --- a/src/mpl2mpl/src/class_hierarchy.cpp +++ b/src/mpl2mpl/src/class_hierarchy.cpp @@ -50,7 +50,8 @@ Klass::Klass(MIRStructType *type, MapleAllocator *alc) strIdx2Method(alloc->Adapter()), strIdx2CandidateMap(alloc->Adapter()) { ASSERT(type != nullptr, "type is nullptr in Klass::Klass!"); - ASSERT(type->GetKind() == kTypeClass || type->GetKind() == kTypeInterface, "type error"); + ASSERT(type->GetKind() == kTypeClass || type->GetKind() == kTypeInterface || + type->IsIncomplete(), "runtime check error"); } void Klass::DumpKlassMethods() const { @@ -502,7 +503,7 @@ void KlassHierarchy::AddKlassRelationAndMethods() { Klass *klass = pair.second; ASSERT(klass, "null ptr check"); Klass *superKlass = nullptr; - if (klass->IsInterface()) { + if (klass->IsInterface() || klass->IsInterfaceIncomplete()) { MIRInterfaceType *itype = klass->GetMIRInterfaceType(); ASSERT(itype != nullptr, "null ptr check"); // Java interface supports multiple inheritance @@ -513,7 +514,7 @@ void KlassHierarchy::AddKlassRelationAndMethods() { superKlass->AddSubKlass(klass); } } - } else { + } else if (klass->IsClass() || klass->IsClassIncomplete()) { // Class MIRClassType *classType = klass->GetMIRClassType(); ASSERT(classType != nullptr, "null ptr check"); diff --git a/src/mpl2mpl/src/reflection_analysis.cpp b/src/mpl2mpl/src/reflection_analysis.cpp index 742a75eee338b208a390053625dff09941f63329..90dc970406f80ce4bac5e8a73d5088724e4b78f2 100644 --- a/src/mpl2mpl/src/reflection_analysis.cpp +++ b/src/mpl2mpl/src/reflection_analysis.cpp @@ -493,18 +493,6 @@ uint16 GetFieldHash(const std::vector> &fieldV, con return 0; } -bool ReflectionAnalysis::RootClassDefined() { - if (isLibcore < 0) { - // Check whether this module defines root classes including Class/Object/Fields/Methods. - Klass *objectKlass = klassH->GetKlassFromLiteral(NameMangler::kJavaLangObjectStr); - isLibcore = 0; - if (objectKlass != nullptr && objectKlass->GetMIRStructType()->IsLocal()) { - isLibcore = 1; - } - } - return (isLibcore == 1); -} - MIRSymbol *ReflectionAnalysis::GetOrCreateSymbol(const std::string &name, TyIdx tyIdx, bool needInit = false) { const GStrIdx strIdx = GlobalTables::GetStrTable().GetOrCreateStrIdxFromName(name); MIRSymbol *st = GetSymbol(strIdx, tyIdx); @@ -1291,7 +1279,8 @@ int64 ReflectionAnalysis::BKDRHash(const std::string &strName, uint32 seed) { const char *name = strName.c_str(); int64 hash = 0; while (*name) { - hash = hash * seed + (*name++); + uint8_t uName = *name++; + hash = hash * seed + uName; } return hash; } @@ -1779,6 +1768,10 @@ void ReflectionAnalysis::GenStrTab(MIRModule &mirModule) { } void ReflectionAnalysis::MarkWeakMethods() { + if (!isLibcore) { + return; + } + GStrIdx classNames[] = { GetOrCreateGStrIdxFromName(NameMangler::kJavaLangClassStr), GetOrCreateGStrIdxFromName(NameMangler::kJavaLangObjectStr), GetOrCreateGStrIdxFromName(kReflectionReferencePrefixStr) }; @@ -1791,10 +1784,8 @@ void ReflectionAnalysis::MarkWeakMethods() { for (const MethodPair &methodPair : classType->GetMethods()) { MIRSymbol *funcSym = GlobalTables::GetGsymTable().GetSymbolFromStidx(methodPair.first.Idx()); MIRFunction *mirfunc = funcSym->GetFunction(); - if (RootClassDefined()) { + if (mirfunc != nullptr) { mirfunc->SetAttr(FUNCATTR_weak); // It's marked weak since RT-first. - } else { - mirfunc->SetAttr(FUNCATTR_extern); } } }