* i386-tdep.c (i386_get_longjmp_target): Make usable on x86-64.
authorMark Kettenis <kettenis@gnu.org>
Sun, 5 Jan 2003 14:07:03 +0000 (14:07 +0000)
committerMark Kettenis <kettenis@gnu.org>
Sun, 5 Jan 2003 14:07:03 +0000 (14:07 +0000)
* x86-64-tdep.c (x86_64_init_abi): Remove FIXME about
i386_get_longjmp_target.

gdb/ChangeLog
gdb/i386-tdep.c
gdb/x86-64-tdep.c

index 703f654c08e7bd131339e0507526ed143345cefb..89c2f4481786e4e3e4f402271f938a894b42baa4 100644 (file)
@@ -1,3 +1,9 @@
+2003-01-05  Mark Kettenis  <kettenis@gnu.org>
+
+       * i386-tdep.c (i386_get_longjmp_target): Make usable on x86-64.
+       * x86-64-tdep.c (x86_64_init_abi): Remove FIXME about
+       i386_get_longjmp_target.
+
 2003-01-05  Andrew Cagney  <ac131313@redhat.com>
 
        * arm-tdep.c (prologue_cache): Change to a pointer.
index 9b4cf0286b058023a174a1b8ed51dc4b10af84d4..f4a7df0bb41196d8e9f20a24399f9cff1a22d135 100644 (file)
@@ -891,15 +891,16 @@ i386_pop_frame (void)
 /* Figure out where the longjmp will land.  Slurp the args out of the
    stack.  We expect the first arg to be a pointer to the jmp_buf
    structure from which we extract the address that we will land at.
-   This address is copied into PC.  This routine returns true on
+   This address is copied into PC.  This routine returns non-zero on
    success.  */
 
 static int
 i386_get_longjmp_target (CORE_ADDR *pc)
 {
-  char buf[4];
+  char buf[8];
   CORE_ADDR sp, jb_addr;
   int jb_pc_offset = gdbarch_tdep (current_gdbarch)->jb_pc_offset;
+  int len = TARGET_PTR_BIT / TARGET_CHAR_BIT;
 
   /* If JB_PC_OFFSET is -1, we have no way to find out where the
      longjmp will land.  */
@@ -907,14 +908,14 @@ i386_get_longjmp_target (CORE_ADDR *pc)
     return 0;
 
   sp = read_register (SP_REGNUM);
-  if (target_read_memory (sp + 4, buf, 4))
+  if (target_read_memory (sp + len, buf, len))
     return 0;
 
-  jb_addr = extract_address (buf, 4);
-  if (target_read_memory (jb_addr + jb_pc_offset, buf, 4))
+  jb_addr = extract_address (buf, len);
+  if (target_read_memory (jb_addr + jb_pc_offset, buf, len))
     return 0;
 
-  *pc = extract_address (buf, 4);
+  *pc = extract_address (buf, len);
   return 1;
 }
 \f
index 2cf005eca1c33e8cc3171f46943fac9c4984faab..a47ef171878e14b445c07b7b5f171ad7c85242b5 100644 (file)
@@ -967,10 +967,6 @@ x86_64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
   set_gdbarch_register_byte (gdbarch, x86_64_register_byte);
   set_gdbarch_register_virtual_type (gdbarch, x86_64_register_virtual_type);
 
-  /* FIXME: kettenis/20021026: As long as we don't support longjmp,
-     that is, as long as we have `tdep->jb_pc_offset == -1', using
-     i386_get_longjmp_target is fine.  */
-
   set_gdbarch_register_convertible (gdbarch, x86_64_register_convertible);
   set_gdbarch_register_convert_to_virtual (gdbarch,
                                           x86_64_register_convert_to_virtual);