diff --git a/src/hir2mpl/bytecode_input/common/src/bc_function.cpp b/src/hir2mpl/bytecode_input/common/src/bc_function.cpp index 4ef5f0159d10461cdcf43a6f49a4398dd39bac67..f316a33783bbcce49bbec4cfca2142f2757c4387 100644 --- a/src/hir2mpl/bytecode_input/common/src/bc_function.cpp +++ b/src/hir2mpl/bytecode_input/common/src/bc_function.cpp @@ -85,8 +85,9 @@ 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()) { aliasVar.sigStrIdx = GlobalTables::GetStrTable().GetOrCreateStrIdxFromName(std::get<2>(item)); } diff --git a/src/hir2mpl/bytecode_input/common/src/rc_setter.cpp b/src/hir2mpl/bytecode_input/common/src/rc_setter.cpp index b7dfda5c4625c7bb49ac397b508d695f4767d836..526a82ab154937be12cc99fa4706de01416efa7c 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 cef71cf81014c8df1f397e6bdf23335f7cc598d7..d92bc3cd03ad0793163df9ef2645a91351f4cc7f 100644 --- a/src/hir2mpl/common/src/fe_function.cpp +++ b/src/hir2mpl/common/src/fe_function.cpp @@ -828,7 +828,8 @@ 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); }; } // namespace maple diff --git a/src/mapleall/maple_ir/include/mir_scope.h b/src/mapleall/maple_ir/include/mir_scope.h index 974ff45d939468fe0f432cb3ea9bc86ea0298fd5..d165600ffcf2e3b71fbec2b4723e08c69bc2facc 100644 --- a/src/mapleall/maple_ir/include/mir_scope.h +++ b/src/mapleall/maple_ir/include/mir_scope.h @@ -20,8 +20,9 @@ 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; }; @@ -58,6 +59,7 @@ class MIRScope { } void SetAliasVarMap(GStrIdx idx, const MIRAliasVars &vars) { + ASSERT(aliasVarMap.find(idx) == aliasVarMap.end(), "alias already exist"); aliasVarMap[idx] = vars; } diff --git a/src/mapleall/maple_ir/src/bin_func_export.cpp b/src/mapleall/maple_ir/src/bin_func_export.cpp index 693e7f82feb95b55f0aa39972db1b98593034e74..2015da5d32f34c251e4d802e3be384e49a22ec35 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 42b76766c2b092067b52651f80f0bd91f406ca3f..4727f8f1e960cb3e80e6160cb80052d0ec51a9e9 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 a5edf3c90db05d3fb64e436556e1aa1e0729e28f..12f66d42e0e2d73088efa958b16eb7ce2716c016 100644 --- a/src/mapleall/maple_ir/src/debug_info.cpp +++ b/src/mapleall/maple_ir/src/debug_info.cpp @@ -297,7 +297,11 @@ 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.mplStrIdx); + } + 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 88ab29be3241eff1e450606e0375db6859e67060..897095d2532e843ca620203da038cfa5cf9862fe 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); } @@ -101,8 +105,9 @@ void MIRScope::Dump(int32 indent) const { for (auto it : aliasVarMap) { PrintIndentation(indent + ind); - LogInfo::MapleLogger() << "ALIAS %" << GlobalTables::GetStrTable().GetStringFromStrIdx(it.first) << " %" - << GlobalTables::GetStrTable().GetStringFromStrIdx(it.second.memPoolStrIdx) << " "; + LogInfo::MapleLogger() << "ALIAS %" << GlobalTables::GetStrTable().GetStringFromStrIdx(it.first) + << ((it.second.isLocal) ? " %" : " $") + << 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 4d107daa9230b38aaf76b2e01d36c8d2086a56b4..d86cd2ab2aaa1f09a8e033829a2016cf67472814 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()); @@ -2531,8 +2536,9 @@ 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; return true; } diff --git a/src/mapleall/mpl2mpl/src/annotation_analysis.cpp b/src/mapleall/mpl2mpl/src/annotation_analysis.cpp index 6429d07b832fc5e7921e41d5e71a9e6b42e7a8c8..aefbbe24d1e7c167aa3da7e9ff3cd62dee8816b7 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 8534907945f906a20bce98eb6cbd6bd49cc1b3bd..cf74288709c78fc5c16525be826560bb1ba874f8 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);