From f056498d95098027801495ba1c3f998867aa578a Mon Sep 17 00:00:00 2001 From: Wen HU Date: Thu, 8 Sep 2022 11:11:33 -0700 Subject: [PATCH 1/2] dwarf handle more than 8 function parameters --- src/mapleall/maple_be/include/cg/cgfunc.h | 9 +++++---- .../maple_be/src/cg/aarch64/aarch64_cgfunc.cpp | 12 +++++++++++- .../maple_be/src/cg/aarch64/aarch64_memlayout.cpp | 4 ++-- src/mapleall/maple_be/src/cg/cgfunc.cpp | 7 ++++--- 4 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/mapleall/maple_be/include/cg/cgfunc.h b/src/mapleall/maple_be/include/cg/cgfunc.h index c32f14aab6..1d46c3e7de 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/src/cg/aarch64/aarch64_cgfunc.cpp b/src/mapleall/maple_be/src/cg/aarch64/aarch64_cgfunc.cpp index e1ead20905..5666040780 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 248010d52e..4396d6cb65 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 c590bf6b1e..0ee428420c 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 { -- Gitee From 27f9b91015ecaf1c21d22f8fe7c66cd8f223e100 Mon Sep 17 00:00:00 2001 From: Wen HU Date: Thu, 8 Sep 2022 13:34:42 -0700 Subject: [PATCH 2/2] verbose asm for DW_FORM_exprloc --- src/mapleall/maple_be/include/cg/emit.h | 1 + src/mapleall/maple_be/src/cg/emit.cpp | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/src/mapleall/maple_be/include/cg/emit.h b/src/mapleall/maple_be/include/cg/emit.h index defbad2a2c..4ae714f7b3 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/emit.cpp b/src/mapleall/maple_be/src/cg/emit.cpp index ff7e759925..fdc8f4f37c 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)); -- Gitee