diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 86384a8817..d45b162b9f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2010-04-29 Matthew Gretton-Dann + + * arm-linux-tdep.c (ARM_LINUX_JB_PC): Remove. + (ARM_LINUX_JB_PC_FPA): Add, offset of PC in longjmp buffer for FPA. + (ARM_LINUX_JB_PC_EABI): Add, offset of PC in longjmp buffer for + EABI. + (arm_linux_init_abi): Set up JB_PC field dependent on FP model in + use. + 2010-04-29 Pedro Alves PR gdb/11557 diff --git a/gdb/arm-linux-tdep.c b/gdb/arm-linux-tdep.c index af409f6ca1..fa851990db 100644 --- a/gdb/arm-linux-tdep.c +++ b/gdb/arm-linux-tdep.c @@ -82,9 +82,20 @@ static const char arm_linux_thumb2_be_breakpoint[] = { 0xf7, 0xf0, 0xa0, 0x00 }; static const char arm_linux_thumb2_le_breakpoint[] = { 0xf0, 0xf7, 0x00, 0xa0 }; -/* Description of the longjmp buffer. */ +/* Description of the longjmp buffer. The buffer is treated as an array of + elements of size ARM_LINUX_JB_ELEMENT_SIZE. + + The location of saved registers in this buffer (in particular the PC + to use after longjmp is called) varies depending on the ABI (in + particular the FP model) and also (possibly) the C Library. + + For glibc, eglibc, and uclibc the following holds: If the FP model is + SoftVFP or VFP (which implies EABI) then the PC is at offset 9 in the + buffer. This is also true for the SoftFPA model. However, for the FPA + model the PC is at offset 21 in the buffer. */ #define ARM_LINUX_JB_ELEMENT_SIZE INT_REGISTER_SIZE -#define ARM_LINUX_JB_PC 21 +#define ARM_LINUX_JB_PC_FPA 21 +#define ARM_LINUX_JB_PC_EABI 9 /* Dynamic Linking on ARM GNU/Linux @@ -877,7 +888,22 @@ arm_linux_init_abi (struct gdbarch_info info, if (tdep->fp_model == ARM_FLOAT_AUTO) tdep->fp_model = ARM_FLOAT_FPA; - tdep->jb_pc = ARM_LINUX_JB_PC; + switch (tdep->fp_model) + { + case ARM_FLOAT_FPA: + tdep->jb_pc = ARM_LINUX_JB_PC_FPA; + break; + case ARM_FLOAT_SOFT_FPA: + case ARM_FLOAT_SOFT_VFP: + case ARM_FLOAT_VFP: + tdep->jb_pc = ARM_LINUX_JB_PC_EABI; + break; + default: + internal_error + (__FILE__, __LINE__, + _("arm_linux_init_abi: Floating point model not supported")); + break; + } tdep->jb_elt_size = ARM_LINUX_JB_ELEMENT_SIZE; set_solib_svr4_fetch_link_map_offsets