diff --git a/src/mapleall/maple_be/include/cg/cgfunc.h b/src/mapleall/maple_be/include/cg/cgfunc.h index c32f14aab663a8b639984978044651845c7d545c..1d46c3e7de070b9326ea66790f27977eb4e5c6dd 100644 --- a/src/mapleall/maple_be/include/cg/cgfunc.h +++ b/src/mapleall/maple_be/include/cg/cgfunc.h @@ -575,7 +575,7 @@ class CGFunc { debugInfo = dbgInfo; } - void AddDIESymbolLocation(const MIRSymbol *sym, SymbolAlloc *loc); + void AddDIESymbolLocation(const MIRSymbol *sym, SymbolAlloc *loc, bool isParam); virtual void DBGFixCallFrameLocationOffsets() {}; @@ -1157,8 +1157,8 @@ class CGFunc { virtual InsnVisitor *NewInsnModifier() = 0; - MapleVector &GetDbgCallFrameLocations() { - return dbgCallFrameLocations; + MapleVector &GetDbgCallFrameLocations(bool isParam) { + return isParam ? dbgParamCallFrameLocations : dbgLocalCallFrameLocations; } bool HasAsm() const { @@ -1248,7 +1248,8 @@ class CGFunc { bool hasTakenLabel = false; uint32 frequency = 0; DebugInfo *debugInfo = nullptr; /* debugging info */ - MapleVector dbgCallFrameLocations; + MapleVector dbgParamCallFrameLocations; + MapleVector dbgLocalCallFrameLocations; RegOperand *aggParamReg = nullptr; ReachingDefinition *reachingDef = nullptr; diff --git a/src/mapleall/maple_be/include/cg/emit.h b/src/mapleall/maple_be/include/cg/emit.h index defbad2a2cf9bf0111aff2e9eecf52668b096870..4ae714f7b36c1f5cc59f100718c702aea93381c2 100644 --- a/src/mapleall/maple_be/include/cg/emit.h +++ b/src/mapleall/maple_be/include/cg/emit.h @@ -38,6 +38,7 @@ namespace maple { const char *GetDwTagName(unsigned n); const char *GetDwFormName(unsigned n); const char *GetDwAtName(unsigned n); +const char *GetDwOpName(unsigned n); } /* namespace maple */ #if TARGRISCV64 diff --git a/src/mapleall/maple_be/src/cg/aarch64/aarch64_cgfunc.cpp b/src/mapleall/maple_be/src/cg/aarch64/aarch64_cgfunc.cpp index e1ead2090574aed2bb2b781c9fae643005724350..5666040780207cb31238907dbd1de6f5afe37430 100644 --- a/src/mapleall/maple_be/src/cg/aarch64/aarch64_cgfunc.cpp +++ b/src/mapleall/maple_be/src/cg/aarch64/aarch64_cgfunc.cpp @@ -9843,8 +9843,18 @@ void AArch64CGFunc::AppendCall(const MIRSymbol &funcSymbol) { AppendCall(funcSymbol, *srcOpnds); } +#define PARAMCOPYSIZE 8 void AArch64CGFunc::DBGFixCallFrameLocationOffsets() { - for (DBGExprLoc *el : GetDbgCallFrameLocations()) { + unsigned idx = 0; + for (DBGExprLoc *el : GetDbgCallFrameLocations(/* isParam */ true)) { + if (el && el->GetSimpLoc() && el->GetSimpLoc()->GetDwOp() == DW_OP_fbreg) { + SymbolAlloc *symloc = static_cast(el->GetSymLoc()); + int32 offset = GetBaseOffset(*symloc) - ((idx < PARAMCOPYSIZE) ? GetDbgCallFrameOffset() : 0); + el->SetFboffset(offset); + } + idx++; + } + for (DBGExprLoc *el : GetDbgCallFrameLocations(/* isParam */ false)) { if (el->GetSimpLoc()->GetDwOp() == DW_OP_fbreg) { SymbolAlloc *symloc = static_cast(el->GetSymLoc()); int32 offset = GetBaseOffset(*symloc) - GetDbgCallFrameOffset(); diff --git a/src/mapleall/maple_be/src/cg/aarch64/aarch64_memlayout.cpp b/src/mapleall/maple_be/src/cg/aarch64/aarch64_memlayout.cpp index 248010d52e0f42a1f44f20b8bc50b25e6f707884..4396d6cb6577e1ccfb2b9581edf6594b95475f82 100644 --- a/src/mapleall/maple_be/src/cg/aarch64/aarch64_memlayout.cpp +++ b/src/mapleall/maple_be/src/cg/aarch64/aarch64_memlayout.cpp @@ -274,7 +274,7 @@ void AArch64MemLayout::LayoutFormalParams() { } } if (cgFunc->GetCG()->GetCGOptions().WithDwarf() && (symLoc->GetMemSegment() != nullptr)) { - cgFunc->AddDIESymbolLocation(sym, symLoc); + cgFunc->AddDIESymbolLocation(sym, symLoc, /* isParam */ true); } } } @@ -330,7 +330,7 @@ void AArch64MemLayout::LayoutLocalVariables(std::vector &tempVar, st segLocals.SetSize(segLocals.GetSize() + be.GetTypeSize(tyIdx)); } if (cgFunc->GetCG()->GetCGOptions().WithDwarf()) { - cgFunc->AddDIESymbolLocation(sym, symLoc); + cgFunc->AddDIESymbolLocation(sym, symLoc, /* isParam */ false); } } } diff --git a/src/mapleall/maple_be/src/cg/cgfunc.cpp b/src/mapleall/maple_be/src/cg/cgfunc.cpp index c590bf6b1ec8724629b4b6dc3d9a27a54b7e4fdb..0ee428420c5c020fa9f66d96209f1dafe05afaff 100644 --- a/src/mapleall/maple_be/src/cg/cgfunc.cpp +++ b/src/mapleall/maple_be/src/cg/cgfunc.cpp @@ -1420,7 +1420,8 @@ CGFunc::CGFunc(MIRModule &mod, CG &cg, MIRFunction &mirFunc, BECommon &beCommon, labelMap(std::less(), allocator.Adapter()), vregsToPregsMap(std::less(), allocator.Adapter()), hasVLAOrAlloca(mirFunc.HasVlaOrAlloca()), - dbgCallFrameLocations(allocator.Adapter()), + dbgParamCallFrameLocations(allocator.Adapter()), + dbgLocalCallFrameLocations(allocator.Adapter()), cg(&cg), mirModule(mod), memPool(&memPool), @@ -2180,7 +2181,7 @@ void CGFunc::HandleFunction() { NeedStackProtect(); } -void CGFunc::AddDIESymbolLocation(const MIRSymbol *sym, SymbolAlloc *loc) { +void CGFunc::AddDIESymbolLocation(const MIRSymbol *sym, SymbolAlloc *loc, bool isParam) { ASSERT(debugInfo != nullptr, "debugInfo is null!"); ASSERT(loc->GetMemSegment() != nullptr, "only support those variable that locate at stack now"); DBGDie *sdie = debugInfo->GetLocalDie(&func, sym->GetNameStrIdx()); @@ -2192,7 +2193,7 @@ void CGFunc::AddDIESymbolLocation(const MIRSymbol *sym, SymbolAlloc *loc) { CHECK_FATAL(exprloc != nullptr, "exprloc is null in CGFunc::AddDIESymbolLocation"); exprloc->SetSymLoc(loc); - GetDbgCallFrameLocations().push_back(exprloc); + GetDbgCallFrameLocations(isParam).push_back(exprloc); } void CGFunc::DumpCFG() const { diff --git a/src/mapleall/maple_be/src/cg/emit.cpp b/src/mapleall/maple_be/src/cg/emit.cpp index ff7e7599255b8b7a37a79537149c0aa3dd7f284a..fdc8f4f37cd115548109750691664d46d8cbbe42 100644 --- a/src/mapleall/maple_be/src/cg/emit.cpp +++ b/src/mapleall/maple_be/src/cg/emit.cpp @@ -3309,23 +3309,33 @@ void Emitter::EmitDIAttrValue(DBGDie *die, DBGDieAttr *attr, DwAt attrName, DwTa switch (elp->GetOp()) { case DW_OP_call_frame_cfa: EmitHexUnsigned(1); + Emit(CMNT "size"); Emit("\n\t.byte "); EmitHexUnsigned(elp->GetOp()); + Emit(CMNT); + Emit(maple::GetDwOpName(elp->GetOp())); break; case DW_OP_addr: EmitHexUnsigned(k9ByteSize); + Emit(CMNT "size"); Emit("\n\t.byte "); EmitHexUnsigned(elp->GetOp()); + Emit(CMNT); + Emit(maple::GetDwOpName(elp->GetOp())); Emit("\n\t.8byte "); (void)Emit(GlobalTables::GetStrTable().GetStringFromStrIdx( static_cast(elp->GetGvarStridx())).c_str()); break; case DW_OP_fbreg: EmitHexUnsigned(1 + namemangler::GetSleb128Size(elp->GetFboffset())); + Emit(CMNT "uleb128 size"); Emit("\n\t.byte "); EmitHexUnsigned(elp->GetOp()); + Emit(CMNT); + Emit(maple::GetDwOpName(elp->GetOp())); Emit("\n\t.sleb128 "); EmitDecSigned(elp->GetFboffset()); + Emit(CMNT "fboffset"); break; default: EmitHexUnsigned(uintptr_t(elp));