From e1ff6760049df57935131059ec176db0b31b403c Mon Sep 17 00:00:00 2001 From: wangshuo Date: Fri, 23 Jun 2023 10:07:12 +0800 Subject: [PATCH] arm64: Handle sp, lr, fp as DwReg in CfiExpr When copy_convert_CfiExpr_tree sees a DwReg on arm64 we simply call I_die_here; This causes an issue in the case we really do have to handle that case (see https://bugzilla.redhat.com/show_bug.cgi?id=1923493). Handle the stack pointer (sp), link register (x30) and frame pointer (x29), which we already keep in D3UnwindRegs, like we do for other architectures in evalCfiExpr and copy_convert_CfiExpr_tree. https://bugs.kde.org/show_bug.cgi?id=433898 https://bugzilla.redhat.com/show_bug.cgi?id=1923493 https://sourceware.org/git/?p=valgrind.git;a=commit;h=b92d30bb6de3aec40be9ad368f10f881e2b84ca7 --- NEWS | 16 ++++++++++++++++ coregrind/m_debuginfo/d3basics.c | 1 + coregrind/m_debuginfo/debuginfo.c | 2 ++ coregrind/m_debuginfo/priv_storage.h | 2 ++ coregrind/m_debuginfo/readdwarf.c | 7 ++++++- coregrind/m_debuginfo/storage.c | 2 ++ 6 files changed, 29 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 71a7a01..2314773 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,19 @@ +* ==================== FIXED BUGS ==================== + +The following bugs have been fixed or resolved. Note that "n-i-bz" +stands for "not in bugzilla" -- that is, a bug that was reported to us +but never got a bugzilla entry. We encourage you to file bugs in +bugzilla (https://bugs.kde.org/enter_bug.cgi?product=valgrind) rather +than mailing the developers (or mailing lists) directly -- bugs that +are not entered into bugzilla tend to get forgotten about or ignored. + +To see details of a given bug, visit + https://bugs.kde.org/show_bug.cgi?id=XXXXXX +where XXXXXX is the bug number as listed below. + +433898 arm64: Handle sp, lr, fp as DwReg in CfiExpr + + Release 3.16.0 (27 May 2020) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/coregrind/m_debuginfo/d3basics.c b/coregrind/m_debuginfo/d3basics.c index b6d13c1..9787b63 100644 --- a/coregrind/m_debuginfo/d3basics.c +++ b/coregrind/m_debuginfo/d3basics.c @@ -424,6 +424,7 @@ static Bool get_Dwarf_Reg( /*OUT*/Addr* a, Word regno, const RegSummary* regs ) if (regno == 30) { *a = regs->fp; return True; } # elif defined(VGP_arm64_linux) if (regno == 31) { *a = regs->sp; return True; } + if (regno == 29) { *a = regs->fp; return True; } # else # error "Unknown platform" # endif diff --git a/coregrind/m_debuginfo/debuginfo.c b/coregrind/m_debuginfo/debuginfo.c index 13e528e..0697640 100644 --- a/coregrind/m_debuginfo/debuginfo.c +++ b/coregrind/m_debuginfo/debuginfo.c @@ -2875,7 +2875,9 @@ UWord evalCfiExpr ( const XArray* exprs, Int ix, # elif defined(VGA_ppc32) || defined(VGA_ppc64be) \ || defined(VGA_ppc64le) # elif defined(VGP_arm64_linux) + case Creg_ARM64_SP: return eec->uregs->sp; case Creg_ARM64_X30: return eec->uregs->x30; + case Creg_ARM64_X29: return eec->uregs->x29; # else # error "Unsupported arch" # endif diff --git a/coregrind/m_debuginfo/priv_storage.h b/coregrind/m_debuginfo/priv_storage.h index 39456ec..ae44ca3 100644 --- a/coregrind/m_debuginfo/priv_storage.h +++ b/coregrind/m_debuginfo/priv_storage.h @@ -415,7 +415,9 @@ typedef Creg_ARM_R15, Creg_ARM_R14, Creg_ARM_R7, + Creg_ARM64_SP, Creg_ARM64_X30, + Creg_ARM64_X29, Creg_S390_IA, Creg_S390_SP, Creg_S390_FP, diff --git a/coregrind/m_debuginfo/readdwarf.c b/coregrind/m_debuginfo/readdwarf.c index 5701c50..511b854 100644 --- a/coregrind/m_debuginfo/readdwarf.c +++ b/coregrind/m_debuginfo/readdwarf.c @@ -2541,7 +2541,12 @@ static Int copy_convert_CfiExpr_tree ( XArray* dstxa, if (dwreg == srcuc->ra_reg) return ML_(CfiExpr_CfiReg)( dstxa, Creg_IA_IP ); # elif defined(VGA_arm64) - I_die_here; + if (dwreg == SP_REG) + return ML_(CfiExpr_CfiReg)( dstxa, Creg_ARM64_SP ); + if (dwreg == FP_REG) + return ML_(CfiExpr_CfiReg)( dstxa, Creg_ARM64_X29 ); + if (dwreg == srcuc->ra_reg) + return ML_(CfiExpr_CfiReg)( dstxa, Creg_ARM64_X30 ); # elif defined(VGA_ppc32) || defined(VGA_ppc64be) \ || defined(VGA_ppc64le) # else diff --git a/coregrind/m_debuginfo/storage.c b/coregrind/m_debuginfo/storage.c index 2a975dc..0b05c12 100644 --- a/coregrind/m_debuginfo/storage.c +++ b/coregrind/m_debuginfo/storage.c @@ -1002,7 +1002,9 @@ static void ppCfiReg ( CfiReg reg ) case Creg_ARM_R15: VG_(printf)("R15"); break; case Creg_ARM_R14: VG_(printf)("R14"); break; case Creg_ARM_R7: VG_(printf)("R7"); break; + case Creg_ARM64_SP: VG_(printf)("SP"); break; case Creg_ARM64_X30: VG_(printf)("X30"); break; + case Creg_ARM64_X29: VG_(printf)("X29"); break; case Creg_MIPS_RA: VG_(printf)("RA"); break; case Creg_S390_IA: VG_(printf)("IA"); break; case Creg_S390_SP: VG_(printf)("SP"); break; -- 2.33.0