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
433500 DRD regtest faulures when libstdc++ and libgcc debuginfo are installed
433629 valgrind/README has type "abd" instead of "and"
433641 Rust std::sys::unix::fs::try_statx Syscall param fstatat(file_name)
+433898 arm64: Handle sp, lr, fp as DwReg in CfiExpr
n-i-bz helgrind: If hg_cli__realloc fails, return NULL.
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
# 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
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,
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
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;