[lldb] AArch64 register 33 is not cpsr (#183860)

I have an unwind failure where the eh_frame for a
trap handler states that the caller's return address is in eh_frame
register 33, which lldb treats as cpsr.
https://github.com/ARM-software/abi-aa/blob/main/aadwarf64/aadwarf64.rst#dwarf-register-names
Register 33 is ELR_mode, which isn't defined as a register in any of the
AArch64 register definition files in lldb today, so I'm not adding it to
the header files.

rdar://170602999
This commit is contained in:
Jason Molenda 2026-03-03 14:28:00 -08:00 committed by GitHub
parent 685a65a7f0
commit f4e64ceb4b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 39 additions and 27 deletions

View File

@ -71,8 +71,6 @@ std::pair<uint32_t, uint32_t>
ABIAArch64::GetEHAndDWARFNums(llvm::StringRef name) {
if (name == "pc")
return {arm64_ehframe::pc, arm64_dwarf::pc};
if (name == "cpsr")
return {arm64_ehframe::cpsr, arm64_dwarf::cpsr};
return MCBasedABI::GetEHAndDWARFNums(name);
}

View File

@ -768,8 +768,6 @@ uint32_t RegisterContextDarwin_arm64::ConvertRegisterKindToRegisterNumber(
return gpr_lr;
case arm64_dwarf::pc:
return gpr_pc;
case arm64_dwarf::cpsr:
return gpr_cpsr;
case arm64_dwarf::v0:
return fpu_v0;
@ -907,8 +905,6 @@ uint32_t RegisterContextDarwin_arm64::ConvertRegisterKindToRegisterNumber(
return gpr_lr;
case arm64_ehframe::pc:
return gpr_pc;
case arm64_ehframe::cpsr:
return gpr_cpsr;
}
} else if (kind == eRegisterKindLLDB) {
return reg;

View File

@ -486,9 +486,6 @@ static uint32_t g_d31_invalidates[] = {fpu_v31, fpu_s31, LLDB_INVALID_REGNUM};
// Generates register kinds array for vector registers
#define GPR64_KIND(reg, generic_kind) MISC_KIND(reg, gpr, generic_kind)
#define VREG_KIND(reg) MISC_KIND(reg, fpu, LLDB_INVALID_REGNUM)
#define MISC_GPR_KIND(lldb_kind) MISC_KIND(cpsr, gpr, LLDB_REGNUM_GENERIC_FLAGS)
#define MISC_FPU_KIND(lldb_kind) LLDB_KIND(lldb_kind)
#define MISC_EXC_KIND(lldb_kind) LLDB_KIND(lldb_kind)
// Defines a 64-bit general purpose register
#define DEFINE_GPR64(reg, generic_kind) \
@ -538,6 +535,15 @@ static uint32_t g_d31_invalidates[] = {fpu_v31, fpu_s31, LLDB_INVALID_REGNUM};
nullptr, \
}
// Defines miscellaneous status and control registers like cpsr, fpsr etc
// that have no DWARF/eh_frame register numbers.
#define DEFINE_MISC_LLDB_REGS(reg, size, TYPE, lldb_kind) \
{ \
#reg, nullptr, size, TYPE##_OFFSET_NAME(reg), lldb::eEncodingUint, \
lldb::eFormatHex, LLDB_KIND(lldb_kind), nullptr, nullptr, \
nullptr, \
}
// Defines pointer authentication mask registers
#define DEFINE_EXTENSION_REG(reg) \
{ \
@ -588,8 +594,8 @@ static lldb_private::RegisterInfo g_register_infos_arm64_le[] = {
DEFINE_GPR64_ALT(sp, x31, LLDB_REGNUM_GENERIC_SP),
DEFINE_GPR64(pc, LLDB_REGNUM_GENERIC_PC),
// DEFINE_MISC_REGS(name, size, TYPE, lldb kind)
DEFINE_MISC_REGS(cpsr, 4, GPR, gpr_cpsr),
// DEFINE_MISC_LLDB_REGS(name, size, TYPE, lldb kind)
DEFINE_MISC_LLDB_REGS(cpsr, 4, GPR, gpr_cpsr),
// DEFINE_GPR32(name, parent name)
DEFINE_GPR32(w0, x0),
@ -723,12 +729,12 @@ static lldb_private::RegisterInfo g_register_infos_arm64_le[] = {
DEFINE_FPU_PSEUDO(d30, 8, FPU_D_PSEUDO_REG_ENDIAN_OFFSET, v30),
DEFINE_FPU_PSEUDO(d31, 8, FPU_D_PSEUDO_REG_ENDIAN_OFFSET, v31),
// DEFINE_MISC_REGS(name, size, TYPE, lldb kind)
DEFINE_MISC_REGS(fpsr, 4, FPU, fpu_fpsr),
DEFINE_MISC_REGS(fpcr, 4, FPU, fpu_fpcr),
DEFINE_MISC_REGS(far, 8, EXC, exc_far),
DEFINE_MISC_REGS(esr, 4, EXC, exc_esr),
DEFINE_MISC_REGS(exception, 4, EXC, exc_exception),
// DEFINE_MISC_LLDB_REGS(name, size, TYPE, lldb kind)
DEFINE_MISC_LLDB_REGS(fpsr, 4, FPU, fpu_fpsr),
DEFINE_MISC_LLDB_REGS(fpcr, 4, FPU, fpu_fpcr),
DEFINE_MISC_LLDB_REGS(far, 8, EXC, exc_far),
DEFINE_MISC_LLDB_REGS(esr, 4, EXC, exc_esr),
DEFINE_MISC_LLDB_REGS(exception, 4, EXC, exc_exception),
{DEFINE_DBG(bvr, 0)},
{DEFINE_DBG(bvr, 1)},

View File

@ -373,8 +373,8 @@ static lldb_private::RegisterInfo g_register_infos_arm64_sve_le[] = {
DEFINE_GPR64_ALT(sp, x31, LLDB_REGNUM_GENERIC_SP),
DEFINE_GPR64(pc, LLDB_REGNUM_GENERIC_PC),
// DEFINE_MISC_REGS(name, size, TYPE, lldb kind)
DEFINE_MISC_REGS(cpsr, 4, GPR, gpr_cpsr),
// DEFINE_MISC_LLDB_REGS(name, size, TYPE, lldb kind)
DEFINE_MISC_LLDB_REGS(cpsr, 4, GPR, gpr_cpsr),
// DEFINE_GPR32(name, parent name)
DEFINE_GPR32(w0, x0),
@ -508,9 +508,9 @@ static lldb_private::RegisterInfo g_register_infos_arm64_sve_le[] = {
DEFINE_FPU_PSEUDO_SVE(d30, 8, z30),
DEFINE_FPU_PSEUDO_SVE(d31, 8, z31),
// DEFINE_MISC_REGS(name, size, TYPE, lldb kind)
DEFINE_MISC_REGS(fpsr, 4, FPU, fpu_fpsr),
DEFINE_MISC_REGS(fpcr, 4, FPU, fpu_fpcr),
// DEFINE_MISC_LLDB_REGS(name, size, TYPE, lldb kind)
DEFINE_MISC_LLDB_REGS(fpsr, 4, FPU, fpu_fpsr),
DEFINE_MISC_LLDB_REGS(fpcr, 4, FPU, fpu_fpcr),
DEFINE_MISC_REGS(vg, 8, VG, sve_vg),
// DEFINE_ZREG(name)

View File

@ -398,7 +398,7 @@ static RegisterInfo g_reg_infos[] = {
OFFSET(cpsr),
eEncodingUint,
eFormatHex,
{INV, arm64_dwarf::cpsr, LLDB_REGNUM_GENERIC_FLAGS, INV, reg_cpsr},
{INV, INV, LLDB_REGNUM_GENERIC_FLAGS, INV, reg_cpsr},
nullptr,
nullptr,
nullptr,

View File

@ -50,8 +50,14 @@ enum {
x31 = 31,
sp = x31,
pc = 32,
cpsr = 33,
// 34-45 reserved
elr_mode = 33,
ra_sign_state = 34,
tpidrr0_el0 = 35,
tpidr_el0 = 36,
tpidr_el1 = 37,
tpidr_el2 = 38,
tpidr_el3 = 39,
// 40-45 Reserved
// 64-bit SVE Vector granule pseudo register
vg = 46,

View File

@ -49,8 +49,14 @@ enum {
lr, // aka x30
sp, // aka x31 aka wzr
pc, // value is 32
cpsr,
// 34-45 reserved
elr_mode = 33,
ra_sign_state = 34,
tpidrr0_el0 = 35,
tpidr_el0 = 36,
tpidr_el1 = 37,
tpidr_el2 = 38,
tpidr_el3 = 39,
// 40-45 Reserved
// 64-bit SVE Vector granule pseudo register
vg = 46,