* spu-tdep.c (spu_get_longjmp_target): New function.
authorUlrich Weigand <uweigand@de.ibm.com>
Mon, 22 Jun 2009 17:14:43 +0000 (17:14 +0000)
committerUlrich Weigand <uweigand@de.ibm.com>
Mon, 22 Jun 2009 17:14:43 +0000 (17:14 +0000)
(spu_gdbarch_init): Install it.

gdb/ChangeLog
gdb/spu-tdep.c

index 0ef577e..6dbd41d 100644 (file)
@@ -1,3 +1,8 @@
+2009-06-22  Ulrich Weigand  <uweigand@de.ibm.com>
+
+       * spu-tdep.c (spu_get_longjmp_target): New function.
+       (spu_gdbarch_init): Install it.
+
 2009-06-22  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR server/10306
index 949b4fd..d7c482b 100644 (file)
@@ -1329,6 +1329,26 @@ spu_software_single_step (struct frame_info *frame)
   return 1;
 }
 
+
+/* Longjmp support.  */
+
+static int
+spu_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
+{
+  gdb_byte buf[4];
+  CORE_ADDR jb_addr;
+
+  /* Jump buffer is pointed to by the argument register $r3.  */
+  get_frame_register_bytes (frame, SPU_ARG1_REGNUM, 0, 4, buf);
+  jb_addr = extract_unsigned_integer (buf, 4);
+  if (target_read_memory (jb_addr, buf, 4))
+    return 0;
+
+  *pc = extract_unsigned_integer (buf, 4);
+  return 1;
+}
+
+
 /* Target overlays for the SPU overlay manager.
 
    See the documentation of simple_overlay_update for how the
@@ -2148,6 +2168,7 @@ spu_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   set_gdbarch_breakpoint_from_pc (gdbarch, spu_breakpoint_from_pc);
   set_gdbarch_cannot_step_breakpoint (gdbarch, 1);
   set_gdbarch_software_single_step (gdbarch, spu_software_single_step);
+  set_gdbarch_get_longjmp_target (gdbarch, spu_get_longjmp_target);
 
   /* Overlays.  */
   set_gdbarch_overlay_update (gdbarch, spu_overlay_update);