*** empty log message ***
authorMatthew Gretton-Dann <matthew.gretton-dann@arm.com>
Thu, 29 Apr 2010 16:34:25 +0000 (16:34 +0000)
committerMatthew Gretton-Dann <matthew.gretton-dann@arm.com>
Thu, 29 Apr 2010 16:34:25 +0000 (16:34 +0000)
gdb/ChangeLog
gdb/arm-linux-tdep.c

index 86384a8..d45b162 100644 (file)
@@ -1,3 +1,12 @@
+2010-04-29  Matthew Gretton-Dann  <matthew.gretton-dann@arm.com>
+
+       * 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  <pedro@codesourcery.com>
 
        PR gdb/11557
index af409f6..fa85199 100644 (file)
@@ -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