Fix infinite recursion in amd64fbsd_sigcontext_addr
authorJohn Baldwin <jhb@freebsd.org>
Thu, 26 Feb 2015 11:07:57 +0000 (11:07 +0000)
committerPedro Alves <palves@redhat.com>
Thu, 26 Feb 2015 11:07:57 +0000 (11:07 +0000)
amd64fbsd_sigcontext_addr is using frame_unwind_register_unsigned to
fetch the stack pointer which results in infinite recursion.  This
patch changes it to use get_frame_register to match the
sigcontext_addr methods in the i386-bsd and amd64-linux targets
instead.

gdb/ChangeLog:
2015-02-25  John Baldwin  <jhb@freebsd.org>

* amd64fbsd-tdep.c (amd64fbsd_sigcontext_addr): Use
get_frame_register instead of frame_unwind_register_unsigned.

gdb/ChangeLog
gdb/amd64fbsd-tdep.c

index 1aa6fc1..b024d23 100644 (file)
@@ -1,3 +1,8 @@
+2015-02-25  John Baldwin  <jhb@freebsd.org>
+
+       * amd64fbsd-tdep.c (amd64fbsd_sigcontext_addr): Use
+       get_frame_register instead of frame_unwind_register_unsigned.
+
 2015-02-26  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        PR build/18033
index 2d49cdf..abb0cab 100644 (file)
 static CORE_ADDR
 amd64fbsd_sigcontext_addr (struct frame_info *this_frame)
 {
+  struct gdbarch *gdbarch = get_frame_arch (this_frame);
+  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   CORE_ADDR sp;
+  gdb_byte buf[8];
 
   /* The `struct sigcontext' (which really is an `ucontext_t' on
      FreeBSD/amd64) lives at a fixed offset in the signal frame.  See
      <machine/sigframe.h>.  */
-  sp = frame_unwind_register_unsigned (this_frame, AMD64_RSP_REGNUM);
+  get_frame_register (this_frame, AMD64_RSP_REGNUM, buf);
+  sp = extract_unsigned_integer (buf, 8, byte_order);
   return sp + 16;
 }
 \f