[sparc] inferior SEGV while calling Ada subprogram
authorJoel Brobecker <brobecker@gnat.com>
Fri, 1 Oct 2010 15:55:14 +0000 (15:55 +0000)
committerJoel Brobecker <brobecker@gnat.com>
Fri, 1 Oct 2010 15:55:14 +0000 (15:55 +0000)
gdb/ChangeLog:

        * sparc-tdep.c (sparc32_frame_align): New function.
        (sparc32_gdbarch_init): Set the frame_align gdbarch method.
        * sparc64-tdep.c (sparc64_frame_align): New function.
        (sparc64_gdbarch_init): Set the frame_align gdbarch method.

gdb/ChangeLog
gdb/sparc-tdep.c
gdb/sparc64-tdep.c

index 7e7ceb317dacf7061d0e0385c3c0cba38fa4129b..316271747efa82e70e3dd1bd05d1a02d119103de 100644 (file)
@@ -1,3 +1,10 @@
+2010-10-01  Joel Brobecker  <brobecker@adacore.com>
+
+       * sparc-tdep.c (sparc32_frame_align): New function.
+       (sparc32_gdbarch_init): Set the frame_align gdbarch method.
+       * sparc64-tdep.c (sparc64_frame_align): New function.
+       (sparc64_gdbarch_init): Set the frame_align gdbarch method.
+
 2010-09-30  H.J. Lu  <hongjiu.lu@intel.com>
 
        * defs.h (MAX_REGISTER_SIZE): Set to 64.
index 29a12cf5d65545b1e3a841aa980e71270e834744..fd7078366de17dfe5dff86fc06dda1114a631bab 100644 (file)
@@ -398,6 +398,13 @@ sparc32_pseudo_register_write (struct gdbarch *gdbarch,
 }
 \f
 
+static CORE_ADDR
+sparc32_frame_align (struct gdbarch *gdbarch, CORE_ADDR address)
+{
+  /* The ABI requires double-word alignment.  */
+  return address & ~0x7;
+}
+
 static CORE_ADDR
 sparc32_push_dummy_code (struct gdbarch *gdbarch, CORE_ADDR sp,
                         CORE_ADDR funcaddr,
@@ -1407,6 +1414,7 @@ sparc32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   set_gdbarch_fp0_regnum (gdbarch, SPARC_F0_REGNUM); /* %f0 */
 
   /* Call dummy code.  */
+  set_gdbarch_frame_align (gdbarch, sparc32_frame_align);
   set_gdbarch_call_dummy_location (gdbarch, ON_STACK);
   set_gdbarch_push_dummy_code (gdbarch, sparc32_push_dummy_code);
   set_gdbarch_push_dummy_call (gdbarch, sparc32_push_dummy_call);
index 3cd6109f90a7d3977127e190fe82bedd6eaf659a..ca89b8c9fd393ecc28b7e0b1778db641a74f6788 100644 (file)
@@ -937,6 +937,13 @@ sparc64_store_arguments (struct regcache *regcache, int nargs,
   return sp;
 }
 
+static CORE_ADDR
+sparc64_frame_align (struct gdbarch *gdbarch, CORE_ADDR address)
+{
+  /* The ABI requires 16-byte alignment.  */
+  return address & ~0xf;
+}
+
 static CORE_ADDR
 sparc64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
                         struct regcache *regcache, CORE_ADDR bp_addr,
@@ -1136,6 +1143,7 @@ sparc64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
   set_gdbarch_pc_regnum (gdbarch, SPARC64_PC_REGNUM); /* %pc */
 
   /* Call dummy code.  */
+  set_gdbarch_frame_align (gdbarch, sparc64_frame_align);
   set_gdbarch_call_dummy_location (gdbarch, AT_ENTRY_POINT);
   set_gdbarch_push_dummy_code (gdbarch, NULL);
   set_gdbarch_push_dummy_call (gdbarch, sparc64_push_dummy_call);