From e1ff6760049df57935131059ec176db0b31b403c Mon Sep 17 00:00:00 2001
From: wangshuo <wangshuo@kylinos.cn>
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

