From 38c0a15e99509b995b89cd5f7d6988d6f32ee21e Mon Sep 17 00:00:00 2001 From: Wen HU Date: Wed, 22 Jun 2022 08:50:56 -0700 Subject: [PATCH 1/4] support alias a global varialbe --- src/hir2mpl/bytecode_input/common/src/bc_function.cpp | 1 + src/hir2mpl/common/src/fe_function.cpp | 1 + src/mapleall/maple_ir/include/mir_scope.h | 1 + src/mapleall/maple_ir/src/debug_info.cpp | 4 ++++ src/mapleall/maple_ir/src/mir_scope.cpp | 3 ++- src/mapleall/maple_ir/src/parser.cpp | 10 ++++++++-- 6 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/hir2mpl/bytecode_input/common/src/bc_function.cpp b/src/hir2mpl/bytecode_input/common/src/bc_function.cpp index 4ef5f0159d..9c8b2cd341 100644 --- a/src/hir2mpl/bytecode_input/common/src/bc_function.cpp +++ b/src/hir2mpl/bytecode_input/common/src/bc_function.cpp @@ -87,6 +87,7 @@ bool BCFunction::GenerateAliasVars(const std::string &phaseName) { MIRAliasVars aliasVar; aliasVar.memPoolStrIdx = GlobalTables::GetStrTable().GetOrCreateStrIdxFromName(localVar->GetName(*mirType)); aliasVar.tyIdx = mirType->GetTypeIndex(); + aliasVar.isLocal = !localVar->IsGlobal(); if (!std::get<2>(item).empty()) { aliasVar.sigStrIdx = GlobalTables::GetStrTable().GetOrCreateStrIdxFromName(std::get<2>(item)); } diff --git a/src/hir2mpl/common/src/fe_function.cpp b/src/hir2mpl/common/src/fe_function.cpp index cef71cf810..891b1d15c9 100644 --- a/src/hir2mpl/common/src/fe_function.cpp +++ b/src/hir2mpl/common/src/fe_function.cpp @@ -829,6 +829,7 @@ void FEFunction::AddAliasInMIRScope(MIRScope *scope, const std::string &srcVarNa MIRAliasVars aliasVar; aliasVar.tyIdx = symbol->GetTyIdx(); aliasVar.memPoolStrIdx = GlobalTables::GetStrTable().GetOrCreateStrIdxFromName(symbol->GetName()); + aliasVar.isLocal = symbol->IsLocal(); scope->SetAliasVarMap(nameIdx, aliasVar); }; } // namespace maple diff --git a/src/mapleall/maple_ir/include/mir_scope.h b/src/mapleall/maple_ir/include/mir_scope.h index 974ff45d93..1215ad049d 100644 --- a/src/mapleall/maple_ir/include/mir_scope.h +++ b/src/mapleall/maple_ir/include/mir_scope.h @@ -22,6 +22,7 @@ namespace maple { struct MIRAliasVars { GStrIdx memPoolStrIdx; TyIdx tyIdx; + bool isLocal; GStrIdx sigStrIdx; }; diff --git a/src/mapleall/maple_ir/src/debug_info.cpp b/src/mapleall/maple_ir/src/debug_info.cpp index a5edf3c90d..f2ad9c15dc 100644 --- a/src/mapleall/maple_ir/src/debug_info.cpp +++ b/src/mapleall/maple_ir/src/debug_info.cpp @@ -298,6 +298,10 @@ void DebugInfo::AddAliasDies(MapleMap &aliasMap) { for (auto &i : aliasMap) { // maple var MIRSymbol *var = func->GetSymTab()->GetSymbolFromStrIdx(i.second.memPoolStrIdx); + if (!var) { + var = GlobalTables::GetGsymTable().GetSymbolFromStrIdx(i.second.memPoolStrIdx); + } + ASSERT(var, "can not find symbol"); // create alias die using maple var except name DBGDie *vdie = CreateVarDie(var, i.first); diff --git a/src/mapleall/maple_ir/src/mir_scope.cpp b/src/mapleall/maple_ir/src/mir_scope.cpp index 88ab29be32..2ed078e626 100644 --- a/src/mapleall/maple_ir/src/mir_scope.cpp +++ b/src/mapleall/maple_ir/src/mir_scope.cpp @@ -101,7 +101,8 @@ void MIRScope::Dump(int32 indent) const { for (auto it : aliasVarMap) { PrintIndentation(indent + ind); - LogInfo::MapleLogger() << "ALIAS %" << GlobalTables::GetStrTable().GetStringFromStrIdx(it.first) << " %" + LogInfo::MapleLogger() << "ALIAS %" << GlobalTables::GetStrTable().GetStringFromStrIdx(it.first) + << ((it.second.isLocal) ? " %" : " $") << GlobalTables::GetStrTable().GetStringFromStrIdx(it.second.memPoolStrIdx) << " "; GlobalTables::GetTypeTable().GetTypeFromTyIdx(it.second.tyIdx)->Dump(0); if (it.second.sigStrIdx) { diff --git a/src/mapleall/maple_ir/src/parser.cpp b/src/mapleall/maple_ir/src/parser.cpp index 4d107daa92..1089202d77 100644 --- a/src/mapleall/maple_ir/src/parser.cpp +++ b/src/mapleall/maple_ir/src/parser.cpp @@ -2515,8 +2515,13 @@ bool MIRParser::ParseOneAlias(GStrIdx &strIdx, MIRAliasVars &aliasVar) { } strIdx = GlobalTables::GetStrTable().GetOrCreateStrIdxFromName(lexer.GetName()); nameTk = lexer.NextToken(); - if (nameTk != TK_lname) { - Error("expect local in ALIAS but get "); + bool isLocal; + if (nameTk == TK_lname) { + isLocal = true; + } else if (nameTk == TK_gname) { + isLocal = false; + } else { + Error("expect name in ALIAS but get "); return false; } GStrIdx mplStrIdx = GlobalTables::GetStrTable().GetOrCreateStrIdxFromName(lexer.GetName()); @@ -2533,6 +2538,7 @@ bool MIRParser::ParseOneAlias(GStrIdx &strIdx, MIRAliasVars &aliasVar) { } aliasVar.memPoolStrIdx = mplStrIdx; aliasVar.tyIdx = tyIdx; + aliasVar.isLocal = isLocal; aliasVar.sigStrIdx = signStrIdx; return true; } -- Gitee From 8d4aaed07105ca727673aa857bd1d0892f20d4b0 Mon Sep 17 00:00:00 2001 From: Wen HU Date: Wed, 22 Jun 2022 09:01:37 -0700 Subject: [PATCH 2/4] rename memPoolStrIdx to mplStrIdx --- src/hir2mpl/bytecode_input/common/src/bc_function.cpp | 2 +- src/hir2mpl/bytecode_input/common/src/rc_setter.cpp | 2 +- src/hir2mpl/common/src/fe_function.cpp | 2 +- src/mapleall/maple_ir/include/mir_scope.h | 2 +- src/mapleall/maple_ir/src/bin_func_export.cpp | 2 +- src/mapleall/maple_ir/src/bin_func_import.cpp | 2 +- src/mapleall/maple_ir/src/debug_info.cpp | 4 ++-- src/mapleall/maple_ir/src/mir_scope.cpp | 2 +- src/mapleall/maple_ir/src/parser.cpp | 2 +- src/mapleall/mpl2mpl/src/annotation_analysis.cpp | 2 +- src/mapleall/mpl2mpl/src/retype.cpp | 6 +++--- 11 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/hir2mpl/bytecode_input/common/src/bc_function.cpp b/src/hir2mpl/bytecode_input/common/src/bc_function.cpp index 9c8b2cd341..f316a33783 100644 --- a/src/hir2mpl/bytecode_input/common/src/bc_function.cpp +++ b/src/hir2mpl/bytecode_input/common/src/bc_function.cpp @@ -85,7 +85,7 @@ bool BCFunction::GenerateAliasVars(const std::string &phaseName) { GStrIdx nameIdx = GlobalTables::GetStrTable().GetOrCreateStrIdxFromName( namemangler::EncodeName(std::get<0>(item))); MIRAliasVars aliasVar; - aliasVar.memPoolStrIdx = GlobalTables::GetStrTable().GetOrCreateStrIdxFromName(localVar->GetName(*mirType)); + aliasVar.mplStrIdx = GlobalTables::GetStrTable().GetOrCreateStrIdxFromName(localVar->GetName(*mirType)); aliasVar.tyIdx = mirType->GetTypeIndex(); aliasVar.isLocal = !localVar->IsGlobal(); if (!std::get<2>(item).empty()) { diff --git a/src/hir2mpl/bytecode_input/common/src/rc_setter.cpp b/src/hir2mpl/bytecode_input/common/src/rc_setter.cpp index b7dfda5c46..526a82ab15 100644 --- a/src/hir2mpl/bytecode_input/common/src/rc_setter.cpp +++ b/src/hir2mpl/bytecode_input/common/src/rc_setter.cpp @@ -326,7 +326,7 @@ void RCSetter::SetRCUnownedAttribute(const CallNode &callNode, MIRFunction &func const GStrIdx &strIdx = symbol->GetNameStrIdx(); // checking maple name in ALIAS for (auto als : func.GetAliasVarMap()) { - if (als.second.memPoolStrIdx != strIdx) { + if (als.second.mplStrIdx != strIdx) { continue; } for (auto sit : gStrIdx) { diff --git a/src/hir2mpl/common/src/fe_function.cpp b/src/hir2mpl/common/src/fe_function.cpp index 891b1d15c9..d92bc3cd03 100644 --- a/src/hir2mpl/common/src/fe_function.cpp +++ b/src/hir2mpl/common/src/fe_function.cpp @@ -828,7 +828,7 @@ void FEFunction::AddAliasInMIRScope(MIRScope *scope, const std::string &srcVarNa GStrIdx nameIdx = GlobalTables::GetStrTable().GetOrCreateStrIdxFromName(srcVarName); MIRAliasVars aliasVar; aliasVar.tyIdx = symbol->GetTyIdx(); - aliasVar.memPoolStrIdx = GlobalTables::GetStrTable().GetOrCreateStrIdxFromName(symbol->GetName()); + aliasVar.mplStrIdx = GlobalTables::GetStrTable().GetOrCreateStrIdxFromName(symbol->GetName()); aliasVar.isLocal = symbol->IsLocal(); scope->SetAliasVarMap(nameIdx, aliasVar); }; diff --git a/src/mapleall/maple_ir/include/mir_scope.h b/src/mapleall/maple_ir/include/mir_scope.h index 1215ad049d..1e3a7f8bc6 100644 --- a/src/mapleall/maple_ir/include/mir_scope.h +++ b/src/mapleall/maple_ir/include/mir_scope.h @@ -20,7 +20,7 @@ namespace maple { // mapping src variable to mpl variables to display debug info struct MIRAliasVars { - GStrIdx memPoolStrIdx; + GStrIdx mplStrIdx; // maple varialbe name TyIdx tyIdx; bool isLocal; GStrIdx sigStrIdx; diff --git a/src/mapleall/maple_ir/src/bin_func_export.cpp b/src/mapleall/maple_ir/src/bin_func_export.cpp index 693e7f82fe..2015da5d32 100644 --- a/src/mapleall/maple_ir/src/bin_func_export.cpp +++ b/src/mapleall/maple_ir/src/bin_func_export.cpp @@ -136,7 +136,7 @@ void BinaryMplExport::OutputAliasMap(MapleMap &aliasVarMa WriteInt(static_cast(aliasVarMap.size())); for (std::pair it : aliasVarMap) { OutputStr(it.first); - OutputStr(it.second.memPoolStrIdx); + OutputStr(it.second.mplStrIdx); OutputType(it.second.tyIdx); OutputStr(it.second.sigStrIdx); } diff --git a/src/mapleall/maple_ir/src/bin_func_import.cpp b/src/mapleall/maple_ir/src/bin_func_import.cpp index 42b76766c2..4727f8f1e9 100644 --- a/src/mapleall/maple_ir/src/bin_func_import.cpp +++ b/src/mapleall/maple_ir/src/bin_func_import.cpp @@ -151,7 +151,7 @@ void BinaryMplImport::ImportAliasMap(MIRFunction *func) { for (int32 i = 0; i < size; ++i) { MIRAliasVars aliasvars; GStrIdx strIdx = ImportStr(); - aliasvars.memPoolStrIdx = ImportStr(); + aliasvars.mplStrIdx = ImportStr(); aliasvars.tyIdx = ImportType(); (void)ImportStr(); // not assigning to mimic parser func->GetAliasVarMap()[strIdx] = aliasvars; diff --git a/src/mapleall/maple_ir/src/debug_info.cpp b/src/mapleall/maple_ir/src/debug_info.cpp index f2ad9c15dc..12f66d42e0 100644 --- a/src/mapleall/maple_ir/src/debug_info.cpp +++ b/src/mapleall/maple_ir/src/debug_info.cpp @@ -297,9 +297,9 @@ void DebugInfo::AddAliasDies(MapleMap &aliasMap) { MIRFunction *func = GetCurFunction(); for (auto &i : aliasMap) { // maple var - MIRSymbol *var = func->GetSymTab()->GetSymbolFromStrIdx(i.second.memPoolStrIdx); + MIRSymbol *var = func->GetSymTab()->GetSymbolFromStrIdx(i.second.mplStrIdx); if (!var) { - var = GlobalTables::GetGsymTable().GetSymbolFromStrIdx(i.second.memPoolStrIdx); + var = GlobalTables::GetGsymTable().GetSymbolFromStrIdx(i.second.mplStrIdx); } ASSERT(var, "can not find symbol"); diff --git a/src/mapleall/maple_ir/src/mir_scope.cpp b/src/mapleall/maple_ir/src/mir_scope.cpp index 2ed078e626..49997a494b 100644 --- a/src/mapleall/maple_ir/src/mir_scope.cpp +++ b/src/mapleall/maple_ir/src/mir_scope.cpp @@ -103,7 +103,7 @@ void MIRScope::Dump(int32 indent) const { PrintIndentation(indent + ind); LogInfo::MapleLogger() << "ALIAS %" << GlobalTables::GetStrTable().GetStringFromStrIdx(it.first) << ((it.second.isLocal) ? " %" : " $") - << GlobalTables::GetStrTable().GetStringFromStrIdx(it.second.memPoolStrIdx) << " "; + << GlobalTables::GetStrTable().GetStringFromStrIdx(it.second.mplStrIdx) << " "; GlobalTables::GetTypeTable().GetTypeFromTyIdx(it.second.tyIdx)->Dump(0); if (it.second.sigStrIdx) { LogInfo::MapleLogger() << " \"" << GlobalTables::GetStrTable().GetStringFromStrIdx(it.second.sigStrIdx) << "\""; diff --git a/src/mapleall/maple_ir/src/parser.cpp b/src/mapleall/maple_ir/src/parser.cpp index 1089202d77..d86cd2ab2a 100644 --- a/src/mapleall/maple_ir/src/parser.cpp +++ b/src/mapleall/maple_ir/src/parser.cpp @@ -2536,7 +2536,7 @@ bool MIRParser::ParseOneAlias(GStrIdx &strIdx, MIRAliasVars &aliasVar) { signStrIdx = GlobalTables::GetStrTable().GetOrCreateStrIdxFromName(lexer.GetName()); lexer.NextToken(); } - aliasVar.memPoolStrIdx = mplStrIdx; + aliasVar.mplStrIdx = mplStrIdx; aliasVar.tyIdx = tyIdx; aliasVar.isLocal = isLocal; aliasVar.sigStrIdx = signStrIdx; diff --git a/src/mapleall/mpl2mpl/src/annotation_analysis.cpp b/src/mapleall/mpl2mpl/src/annotation_analysis.cpp index 6429d07b83..aefbbe24d1 100644 --- a/src/mapleall/mpl2mpl/src/annotation_analysis.cpp +++ b/src/mapleall/mpl2mpl/src/annotation_analysis.cpp @@ -384,7 +384,7 @@ void AnnotationAnalysis::AnalysisAnnotationForFuncLocalVar(MIRFunction &func, An std::string newSig = GlobalTables::GetStrTable().GetStringFromStrIdx(aliasVar.sigStrIdx); aParser.ReplaceSignature(newSig); AnnotationType *var = ReadInGenericType(aParser, &structType); - func.AddFuncLocalGenericVar(aliasVar.memPoolStrIdx, var); + func.AddFuncLocalGenericVar(aliasVar.mplStrIdx, var); } } } diff --git a/src/mapleall/mpl2mpl/src/retype.cpp b/src/mapleall/mpl2mpl/src/retype.cpp index 8534907945..cf74288709 100644 --- a/src/mapleall/mpl2mpl/src/retype.cpp +++ b/src/mapleall/mpl2mpl/src/retype.cpp @@ -52,8 +52,8 @@ void Retype::TransmitGenericInfo(MIRFunction &func, StmtNode &stmt) { return; } MIRAliasVars aliasVar = reg2varGenericInfo[lhsNameStrIdx]; - aliasVar.memPoolStrIdx = rhsNameStrIdx; - if (map.find(rhsNameStrIdx) != map.end() && map.at(rhsNameStrIdx).memPoolStrIdx != rhsNameStrIdx) { + aliasVar.mplStrIdx = rhsNameStrIdx; + if (map.find(rhsNameStrIdx) != map.end() && map.at(rhsNameStrIdx).mplStrIdx != rhsNameStrIdx) { CHECK_FATAL(false, "must be"); } func.SetAliasVarMap(rhsNameStrIdx, aliasVar); @@ -86,7 +86,7 @@ void Retype::DoRetype() { continue; } for (auto pair : func->GetAliasVarMap()) { - GStrIdx regNameStrIdx = pair.second.memPoolStrIdx; + GStrIdx regNameStrIdx = pair.second.mplStrIdx; reg2varGenericInfo[regNameStrIdx] = pair.second; } RetypeStmt(*func); -- Gitee From efea8bf19f5128f7d3f3b661ce07a181014b1d52 Mon Sep 17 00:00:00 2001 From: Wen HU Date: Wed, 22 Jun 2022 10:44:55 -0700 Subject: [PATCH 3/4] allow code from different file as subscope --- src/mapleall/maple_ir/src/mir_scope.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/mapleall/maple_ir/src/mir_scope.cpp b/src/mapleall/maple_ir/src/mir_scope.cpp index 49997a494b..897095d253 100644 --- a/src/mapleall/maple_ir/src/mir_scope.cpp +++ b/src/mapleall/maple_ir/src/mir_scope.cpp @@ -25,8 +25,12 @@ bool MIRScope::IsSubScope(const MIRScope *scp) const { return true; } auto &l = GetRangeLow(); - auto &h = GetRangeHigh(); auto &l1 = scp->GetRangeLow(); + // allow included file + if (l.FileNum() != l1.FileNum()) { + return true; + } + auto &h = GetRangeHigh(); auto &h1 = scp->GetRangeHigh(); return l.IsBfOrEq(l1) && h1.IsBfOrEq(h); } -- Gitee From 047b22d8aabe911bee6e085b1f40efe242d0a0e5 Mon Sep 17 00:00:00 2001 From: Wen HU Date: Wed, 22 Jun 2022 11:42:31 -0700 Subject: [PATCH 4/4] assertion for redefining an existing alias --- src/mapleall/maple_ir/include/mir_scope.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mapleall/maple_ir/include/mir_scope.h b/src/mapleall/maple_ir/include/mir_scope.h index 1e3a7f8bc6..d165600ffc 100644 --- a/src/mapleall/maple_ir/include/mir_scope.h +++ b/src/mapleall/maple_ir/include/mir_scope.h @@ -59,6 +59,7 @@ class MIRScope { } void SetAliasVarMap(GStrIdx idx, const MIRAliasVars &vars) { + ASSERT(aliasVarMap.find(idx) == aliasVarMap.end(), "alias already exist"); aliasVarMap[idx] = vars; } -- Gitee