2009-06-29 Tristan Gingold <gingold@adacore.com>
authorTristan Gingold <gingold@adacore.com>
Fri, 3 Jul 2009 12:06:36 +0000 (12:06 +0000)
committerTristan Gingold <gingold@adacore.com>
Fri, 3 Jul 2009 12:06:36 +0000 (12:06 +0000)
* i386-darwin-tdep.c (amd64_darwin_thread_state_reg_offset)
(amd64_darwin_thread_state_num_regs)
(amd64_darwin_sigcontext_addr, x86_darwin_init_abi_64): Moved to
amd64-darwin-tdep.c
(_initialize_i386_darwin_tdep): Remove 64 bits parts.
(darwin_dwarf_signal_frame_p): Make public.
* amd64-darwin-tdep.c: New file with most chunks from
i386-darwin-tdep.c
* i386-darwin-tdep.h: Add a prototype for darwin_dwarf_signal_frame_p.
(amd64_darwin_thread_state_reg_offset)
(amd64_darwin_thread_state_num_regs): Moved to amd64-darwin-tdep.h
* amd64-darwin-tdep.h: New file.
* i386-darwin-nat.c: Only includes amd64-nat.h and amd64-darwin-tdep.h
if BFD64 is defined.
(i386_darwin_fetch_inferior_registers): Add #ifdef BFD64/#endif around
64 bits parts.
(i386_darwin_store_inferior_registers): Ditto.
(darwin_set_sstep): Ditto.
(darwin_complete_target): Ditto.
(amd64_darwin_sstep_at_sigreturn): Ditto.
* configure.tgt: Create a separate entry for x86_64-*-darwin.
Add 64 bits support for i386-*-darwin if --enable-64-bit-bfd.
* Makefile.in (ALLDEPFILES): Add amd64-darwin-tdep.c, darwin-nat.c,
i386-darwin-tdep.c i386-darwin-nat.c
(ALL_64_TARGET_OBS): Add amd64-darwin-tdep.o

gdb/ChangeLog
gdb/Makefile.in
gdb/amd64-darwin-tdep.c [new file with mode: 0644]
gdb/amd64-darwin-tdep.h [new file with mode: 0644]
gdb/configure.tgt
gdb/i386-darwin-nat.c
gdb/i386-darwin-tdep.c
gdb/i386-darwin-tdep.h

index 9f4c730ed412354b5cd348a8f2925d6fa77564d4..92534d9aa36464eeb2a67c65407d5c5b62cc18f5 100644 (file)
@@ -1,3 +1,31 @@
+2009-06-29  Tristan Gingold  <gingold@adacore.com>
+
+       * i386-darwin-tdep.c (amd64_darwin_thread_state_reg_offset)
+       (amd64_darwin_thread_state_num_regs)
+       (amd64_darwin_sigcontext_addr, x86_darwin_init_abi_64): Moved to
+       amd64-darwin-tdep.c
+       (_initialize_i386_darwin_tdep): Remove 64 bits parts.
+       (darwin_dwarf_signal_frame_p): Make public.
+       * amd64-darwin-tdep.c: New file with most chunks from
+       i386-darwin-tdep.c      
+       * i386-darwin-tdep.h: Add a prototype for darwin_dwarf_signal_frame_p.
+       (amd64_darwin_thread_state_reg_offset)
+       (amd64_darwin_thread_state_num_regs): Moved to amd64-darwin-tdep.h
+       * amd64-darwin-tdep.h: New file.
+       * i386-darwin-nat.c: Only includes amd64-nat.h and amd64-darwin-tdep.h
+       if BFD64 is defined.
+       (i386_darwin_fetch_inferior_registers): Add #ifdef BFD64/#endif around
+       64 bits parts.
+       (i386_darwin_store_inferior_registers): Ditto.
+       (darwin_set_sstep): Ditto.
+       (darwin_complete_target): Ditto.
+       (amd64_darwin_sstep_at_sigreturn): Ditto.
+       * configure.tgt: Create a separate entry for x86_64-*-darwin.
+       Add 64 bits support for i386-*-darwin if --enable-64-bit-bfd.
+       * Makefile.in (ALLDEPFILES): Add amd64-darwin-tdep.c, darwin-nat.c,
+       i386-darwin-tdep.c i386-darwin-nat.c
+       (ALL_64_TARGET_OBS): Add amd64-darwin-tdep.o
+       
 2009-07-02  Pedro Alves  <pedro@codesourcery.com>
 
        * linux-fork.c (forks_exist_p): Drop unnecessary extern.
index 903bbaac2435a132346360bd4eaff051fa26034a..7659a8fb481db2ced46fb58db6fe431f8468faa5 100644 (file)
@@ -466,7 +466,8 @@ TARGET_OBS = @TARGET_OBS@
 ALL_64_TARGET_OBS = \
        alphabsd-tdep.o alphafbsd-tdep.o alpha-linux-tdep.o alpha-mdebug-tdep.o \
        alphanbsd-tdep.o alphaobsd-tdep.o alpha-osf1-tdep.o alpha-tdep.o \
-       amd64fbsd-tdep.o amd64-dicos-tdep.o amd64-linux-tdep.o amd64nbsd-tdep.o \
+       amd64fbsd-tdep.o amd64-darwin-tdep.o amd64-dicos-tdep.o \
+       amd64-linux-tdep.o amd64nbsd-tdep.o \
        amd64obsd-tdep.o amd64-sol2-tdep.o amd64-tdep.o amd64-windows-tdep.o \
        ia64-linux-tdep.o ia64-tdep.o \
        mips64obsd-tdep.o \
@@ -1290,6 +1291,7 @@ ALLDEPFILES = \
        amd64bsd-nat.c amd64fbsd-nat.c amd64fbsd-tdep.c \
        amd64nbsd-nat.c amd64nbsd-tdep.c \
        amd64obsd-nat.c amd64obsd-tdep.c \
+       amd64-darwin-tdep.c \
        amd64-dicos-tdep.c \
        amd64-linux-nat.c amd64-linux-tdep.c \
        amd64-sol2-tdep.c \
@@ -1298,7 +1300,7 @@ ALLDEPFILES = \
        avr-tdep.c \
        bsd-uthread.c bsd-kvm.c \
        core-regset.c corelow.c \
-       dcache.c dicos-tdep.c \
+       dcache.c dicos-tdep.c darwin-nat.c \
        exec.c \
        fbsd-nat.c \
        fork-child.c \
@@ -1314,6 +1316,7 @@ ALLDEPFILES = \
        i386bsd-nat.c i386bsd-tdep.c i386fbsd-nat.c i386fbsd-tdep.c \
        i386nbsd-nat.c i386nbsd-tdep.c i386obsd-nat.c i386obsd-tdep.c \
        i387-tdep.c \
+       i386-darwin-tdep.c i386-darwin-nat.c \
        i386-dicos-tdep.c \
        i386-linux-tdep.c i386-nat.c \
        i386-sol2-nat.c i386-sol2-tdep.c \
diff --git a/gdb/amd64-darwin-tdep.c b/gdb/amd64-darwin-tdep.c
new file mode 100644 (file)
index 0000000..69fd756
--- /dev/null
@@ -0,0 +1,129 @@
+/* Darwin support for GDB, the GNU debugger.
+   Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2005, 2008, 2009
+   Free Software Foundation, Inc.
+
+   Contributed by Apple Computer, Inc.
+
+   This file is part of GDB.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "defs.h"
+#include "frame.h"
+#include "inferior.h"
+#include "gdbcore.h"
+#include "target.h"
+#include "floatformat.h"
+#include "symtab.h"
+#include "regcache.h"
+#include "libbfd.h"
+#include "objfiles.h"
+
+#include "i387-tdep.h"
+#include "amd64-tdep.h"
+#include "osabi.h"
+#include "ui-out.h"
+#include "symtab.h"
+#include "frame.h"
+#include "gdb_assert.h"
+#include "amd64-darwin-tdep.h"
+#include "i386-darwin-tdep.h"
+#include "solib.h"
+#include "solib-darwin.h"
+#include "dwarf2-frame.h"
+
+/* Offsets into the struct x86_thread_state64 where we'll find the saved regs.
+   From <mach/i386/thread_status.h> and amd64-tdep.h.  */
+int amd64_darwin_thread_state_reg_offset[] =
+{
+  0 * 8,                       /* %rax */
+  1 * 8,                       /* %rbx */
+  2 * 8,                       /* %rcx */
+  3 * 8,                       /* %rdx */
+  5 * 8,                       /* %rsi */
+  4 * 8,                       /* %rdi */
+  6 * 8,                       /* %rbp */
+  7 * 8,                       /* %rsp */
+  8 * 8,                       /* %r8 ... */
+  9 * 8,
+  10 * 8,
+  11 * 8,
+  12 * 8,
+  13 * 8,
+  14 * 8,
+  15 * 8,                      /* ... %r15 */
+  16 * 8,                      /* %rip */
+  17 * 8,                      /* %rflags */
+  18 * 8,                      /* %cs */
+  -1,                          /* %ss */
+  -1,                          /* %ds */
+  -1,                          /* %es */
+  19 * 8,                      /* %fs */
+  20 * 8                       /* %gs */
+};
+
+const int amd64_darwin_thread_state_num_regs = 
+  ARRAY_SIZE (amd64_darwin_thread_state_reg_offset);
+
+/* Assuming THIS_FRAME is a Darwin sigtramp routine, return the
+   address of the associated sigcontext structure.  */
+
+static CORE_ADDR
+amd64_darwin_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 rbx;
+  CORE_ADDR si;
+  gdb_byte buf[8];
+
+  /* A pointer to the ucontext is passed as the fourth argument
+     to the signal handler, which is saved in rbx.  */
+  get_frame_register (this_frame, AMD64_RBX_REGNUM, buf);
+  rbx = extract_unsigned_integer (buf, 8, byte_order);
+
+  /* The pointer to mcontext is at offset 48.  */
+  read_memory (rbx + 48, buf, 8);
+
+  /* First register (rax) is at offset 16.  */
+  return extract_unsigned_integer (buf, 8, byte_order) + 16;
+}
+
+static void
+x86_darwin_init_abi_64 (struct gdbarch_info info, struct gdbarch *gdbarch)
+{
+  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+
+  amd64_init_abi (info, gdbarch);
+
+  tdep->struct_return = reg_struct_return;
+
+  dwarf2_frame_set_signal_frame_p (gdbarch, darwin_dwarf_signal_frame_p);
+
+  tdep->sigtramp_p = i386_sigtramp_p;
+  tdep->sigcontext_addr = amd64_darwin_sigcontext_addr;
+  tdep->sc_reg_offset = amd64_darwin_thread_state_reg_offset;
+  tdep->sc_num_regs = amd64_darwin_thread_state_num_regs;
+
+  tdep->jb_pc_offset = 148;
+
+  set_solib_ops (gdbarch, &darwin_so_ops);
+}
+
+void
+_initialize_amd64_darwin_tdep (void)
+{
+  gdbarch_register_osabi (bfd_arch_i386, bfd_mach_x86_64,
+                          GDB_OSABI_DARWIN, x86_darwin_init_abi_64);
+}
diff --git a/gdb/amd64-darwin-tdep.h b/gdb/amd64-darwin-tdep.h
new file mode 100644 (file)
index 0000000..c3a4bea
--- /dev/null
@@ -0,0 +1,28 @@
+/* Target-dependent code for Darwin x86-64.
+
+   Copyright (C) 2009 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+#ifndef __AMD64_DARWIN_TDEP_H__
+#define __AMD64_DARWIN_TDEP_H__
+
+/* Mapping between the general-purpose registers in Darwin x86-64 thread
+   state and GDB's register cache layout.
+   Indexed by amd64_regnum.  */
+extern int amd64_darwin_thread_state_reg_offset[];
+extern const int amd64_darwin_thread_state_num_regs;
+
+#endif /* __AMD64_DARWIN_TDEP_H__ */
index b704842077ce671d046efc56af2c44138a48b0a0..c76e316e56fefdde92092745ff50adc70ba27cfa 100644 (file)
@@ -151,10 +151,14 @@ hppa*-*-*)
        gdb_target_obs="hppa-tdep.o"
        ;;
 
-i[34567]86-*-darwin* | x86_64-*-darwin*)
+i[34567]86-*-darwin*)
        # Target: Darwin/i386
-       gdb_target_obs="amd64-tdep.o i386-tdep.o i387-tdep.o \
+       gdb_target_obs="i386-tdep.o i387-tdep.o \
                        i386-darwin-tdep.o solib.o solib-darwin.o"
+       if test "x$enable_64_bit_bfd" = "xyes"; then
+           # Target: GNU/Linux x86-64
+           gdb_target_obs="amd64-tdep.o amd64-darwin-tdep.o ${gdb_target_obs}"
+       fi
        ;;
 i[34567]86-*-dicos*)
        # Target: DICOS/i386
@@ -524,6 +528,13 @@ vax-*-*)
        gdb_target_obs="vax-tdep.o"
        ;;
 
+x86_64-*-darwin*)
+       # Target: Darwin/x86-64
+       gdb_target_obs="amd64-tdep.o i386-tdep.o i387-tdep.o \
+                       i386-darwin-tdep.o amd64-darwin-tdep.o \
+                        solib.o solib-darwin.o"
+       ;;
+
 x86_64-*-dicos*)
        # Target: DICOS/x86-64
        gdb_target_obs="amd64-tdep.o i386-tdep.o i387-tdep.o \
index df029bcfa02cb5fec82a48a3b2b56cc0d48ef47e..328372357a926e9b9659255fb34f825e823b76a0 100644 (file)
@@ -30,7 +30,6 @@
 #include "regcache.h"
 #include "gdb_assert.h"
 #include "i386-tdep.h"
-#include "amd64-nat.h"
 #include "i387-tdep.h"
 #include "gdbarch.h"
 #include "arch-utils.h"
 #include "darwin-nat.h"
 #include "i386-darwin-tdep.h"
 
+#ifdef BFD64
+#include "amd64-nat.h"
+#include "amd64-darwin-tdep.h"
+#endif
+
 /* Read register values from the inferior process.
    If REGNO is -1, do this for all registers.
    Otherwise, REGNO specifies which register (so we can save time).  */
@@ -50,6 +54,7 @@ i386_darwin_fetch_inferior_registers (struct target_ops *ops,
   int fetched = 0;
   struct gdbarch *gdbarch = get_regcache_arch (regcache);
 
+#ifdef BFD64
   if (gdbarch_ptr_bit (gdbarch) == 64)
     {
       if (regno == -1 || amd64_native_gregset_supplies_p (gdbarch, regno))
@@ -89,6 +94,7 @@ i386_darwin_fetch_inferior_registers (struct target_ops *ops,
         }
     }
   else
+#endif
     {
       if (regno == -1 || regno < I386_NUM_GREGS)
         {
@@ -151,6 +157,7 @@ i386_darwin_store_inferior_registers (struct target_ops *ops,
   thread_t current_thread = ptid_get_tid (inferior_ptid);
   struct gdbarch *gdbarch = get_regcache_arch (regcache);
 
+#ifdef BFD64
   if (gdbarch_ptr_bit (gdbarch) == 64)
     {
       if (regno == -1 || amd64_native_gregset_supplies_p (gdbarch, regno))
@@ -196,6 +203,7 @@ i386_darwin_store_inferior_registers (struct target_ops *ops,
         }
     }
   else
+#endif
     {
       if (regno == -1 || regno < I386_NUM_GREGS)
         {
@@ -475,6 +483,7 @@ i386_darwin_sstep_at_sigreturn (x86_thread_state_t *regs)
   return 0;
 }
 
+#ifdef BFD64
 static int
 amd64_darwin_sstep_at_sigreturn (x86_thread_state_t *regs)
 {
@@ -504,6 +513,7 @@ amd64_darwin_sstep_at_sigreturn (x86_thread_state_t *regs)
     }
   return 0;
 }
+#endif
 
 void
 darwin_set_sstep (thread_t thread, int enable)
@@ -537,6 +547,7 @@ darwin_set_sstep (thread_t thread, int enable)
        MACH_CHECK_ERROR (kret);
       }
       break;
+#ifdef BFD64
     case x86_THREAD_STATE64:
       {
        __uint64_t bit = enable ? X86_EFLAGS_T : 0;
@@ -551,6 +562,7 @@ darwin_set_sstep (thread_t thread, int enable)
        MACH_CHECK_ERROR (kret);
       }
       break;
+#endif
     default:
       error (_("darwin_set_sstep: unknown flavour: %d\n"), regs.tsh.flavor);
     }
@@ -559,10 +571,12 @@ darwin_set_sstep (thread_t thread, int enable)
 void
 darwin_complete_target (struct target_ops *target)
 {
+#ifdef BFD64
   amd64_native_gregset64_reg_offset = amd64_darwin_thread_state_reg_offset;
   amd64_native_gregset64_num_regs = amd64_darwin_thread_state_num_regs;
   amd64_native_gregset32_reg_offset = i386_darwin_thread_state_reg_offset;
   amd64_native_gregset32_num_regs = i386_darwin_thread_state_num_regs;
+#endif
 
   target->to_fetch_registers = i386_darwin_fetch_inferior_registers;
   target->to_store_registers = i386_darwin_store_inferior_registers;
index fd53e791fa0c89ed66a2568625d283e5b6a3247e..0cd9403ba62b8c41e25524ddeb6c35eb339b7609 100644 (file)
@@ -32,7 +32,6 @@
 
 #include "i387-tdep.h"
 #include "i386-tdep.h"
-#include "amd64-tdep.h"
 #include "osabi.h"
 #include "ui-out.h"
 #include "symtab.h"
@@ -68,39 +67,6 @@ int i386_darwin_thread_state_reg_offset[] =
 const int i386_darwin_thread_state_num_regs = 
   ARRAY_SIZE (i386_darwin_thread_state_reg_offset);
 
-/* Offsets into the struct x86_thread_state64 where we'll find the saved regs.
-   From <mach/i386/thread_status.h> and amd64-tdep.h.  */
-int amd64_darwin_thread_state_reg_offset[] =
-{
-  0 * 8,                       /* %rax */
-  1 * 8,                       /* %rbx */
-  2 * 8,                       /* %rcx */
-  3 * 8,                       /* %rdx */
-  5 * 8,                       /* %rsi */
-  4 * 8,                       /* %rdi */
-  6 * 8,                       /* %rbp */
-  7 * 8,                       /* %rsp */
-  8 * 8,                       /* %r8 ... */
-  9 * 8,
-  10 * 8,
-  11 * 8,
-  12 * 8,
-  13 * 8,
-  14 * 8,
-  15 * 8,                      /* ... %r15 */
-  16 * 8,                      /* %rip */
-  17 * 8,                      /* %rflags */
-  18 * 8,                      /* %cs */
-  -1,                          /* %ss */
-  -1,                          /* %ds */
-  -1,                          /* %es */
-  19 * 8,                      /* %fs */
-  20 * 8                       /* %gs */
-};
-
-const int amd64_darwin_thread_state_num_regs = 
-  ARRAY_SIZE (amd64_darwin_thread_state_reg_offset);
-
 /* Assuming THIS_FRAME is a Darwin sigtramp routine, return the
    address of the associated sigcontext structure.  */
 
@@ -128,27 +94,6 @@ i386_darwin_sigcontext_addr (struct frame_info *this_frame)
   return extract_unsigned_integer (buf, 4, byte_order) + 12;
 }
 
-static CORE_ADDR
-amd64_darwin_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 rbx;
-  CORE_ADDR si;
-  gdb_byte buf[8];
-
-  /* A pointer to the ucontext is passed as the fourth argument
-     to the signal handler, which is saved in rbx.  */
-  get_frame_register (this_frame, AMD64_RBX_REGNUM, buf);
-  rbx = extract_unsigned_integer (buf, 8, byte_order);
-
-  /* The pointer to mcontext is at offset 48.  */
-  read_memory (rbx + 48, buf, 8);
-
-  /* First register (rax) is at offset 16.  */
-  return extract_unsigned_integer (buf, 8, byte_order) + 16;
-}
-
 /* Return true if the PC of THIS_FRAME is in a signal trampoline which
    may have DWARF-2 CFI.
 
@@ -157,7 +102,7 @@ amd64_darwin_sigcontext_addr (struct frame_info *this_frame)
    Without this function, the frame is recognized as a normal frame which is
    not expected.  */
 
-static int
+int
 darwin_dwarf_signal_frame_p (struct gdbarch *gdbarch,
                             struct frame_info *this_frame)
 {
@@ -187,27 +132,6 @@ i386_darwin_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
   set_solib_ops (gdbarch, &darwin_so_ops);
 }
 
-static void
-x86_darwin_init_abi_64 (struct gdbarch_info info, struct gdbarch *gdbarch)
-{
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
-
-  amd64_init_abi (info, gdbarch);
-
-  tdep->struct_return = reg_struct_return;
-
-  dwarf2_frame_set_signal_frame_p (gdbarch, darwin_dwarf_signal_frame_p);
-
-  tdep->sigtramp_p = i386_sigtramp_p;
-  tdep->sigcontext_addr = amd64_darwin_sigcontext_addr;
-  tdep->sc_reg_offset = amd64_darwin_thread_state_reg_offset;
-  tdep->sc_num_regs = amd64_darwin_thread_state_num_regs;
-
-  tdep->jb_pc_offset = 148;
-
-  set_solib_ops (gdbarch, &darwin_so_ops);
-}
-
 static enum gdb_osabi
 i386_mach_o_osabi_sniffer (bfd *abfd)
 {
@@ -228,7 +152,4 @@ _initialize_i386_darwin_tdep (void)
 
   gdbarch_register_osabi (bfd_arch_i386, bfd_mach_i386_i386,
                          GDB_OSABI_DARWIN, i386_darwin_init_abi);
-
-  gdbarch_register_osabi (bfd_arch_i386, bfd_mach_x86_64,
-                          GDB_OSABI_DARWIN, x86_darwin_init_abi_64);
 }
index 4d16ceff17f644ae1bde98788addd589cea0ab0a..d0de560d61b89d9a8d8554cd9cd209bce39f8b4c 100644 (file)
 #ifndef __I386_DARWIN_TDEP_H__
 #define __I386_DARWIN_TDEP_H__
 
+#include "defs.h"
+#include "frame.h"
+
 /* Mapping between the general-purpose registers in Darwin x86 thread_state
    struct and GDB's register cache layout.  */
 extern int i386_darwin_thread_state_reg_offset[];
 extern const int i386_darwin_thread_state_num_regs;
 
-/* Mapping between the general-purpose registers in Darwin x86-64 thread
-   state and GDB's register cache layout.
-   Indexed by amd64_regnum.  */
-extern int amd64_darwin_thread_state_reg_offset[];
-extern const int amd64_darwin_thread_state_num_regs;
+int darwin_dwarf_signal_frame_p (struct gdbarch *, struct frame_info *);
 
 #endif /* __I386_DARWIN_TDEP_H__ */