* ia64-tdep.c: Include "osabi.h".
authorAndreas Schwab <schwab@linux-m68k.org>
Wed, 5 Jan 2005 22:51:47 +0000 (22:51 +0000)
committerAndreas Schwab <schwab@linux-m68k.org>
Wed, 5 Jan 2005 22:51:47 +0000 (22:51 +0000)
(native_find_global_pointer): Delete.
(ia64_find_global_pointer): Renamed from
generic_elf_find_global_pointer.
(FIND_GLOBAL_POINTER): Delete.  Change all users to call
ia64_find_global_pointer instead.
(ia64_gdbarch_init): Call gdbarch_init_osabi.  Remove references
to ia64_linux_sigcontext_register_address and
ia64_linux_write_pc.  Don't set tdep->find_global_pointer.
(_initialize_ia64_tdep): Call gdbarch_register instead of
deprecated register_gdbarch_init.
(struct gdbarch_tdep): Remove find_global_pointer field and move
to ...
* ia64-tdep.h (struct gdbarch_tdep): ... here.
(ia64_linux_sigcontext_register_address): Remove declaration.
(ia64_linux_getunwind_table): Likewise.
(ia64_linux_write_pc): Likewise.
* ia64-linux-tdep.c: Include "osabi.h".
(ia64_linux_sigcontext_register_address): Make static.
(ia64_linux_write_pc): Likewise.
(ia64_linux_init_abi): New.
(_initialize_ia64_linux_tdep): New.
* Makefile.in (ia64-tdep.o, ia64-linux-tdep.o): Depend on
$(osabi_h).

gdb/ChangeLog
gdb/Makefile.in
gdb/ia64-linux-tdep.c
gdb/ia64-tdep.c
gdb/ia64-tdep.h

index 7ca80e142c1f06126e53178ad45fe81fbfdb8832..6fcfc44c95c3fcdac324e56d33823a1271ac8ff0 100644 (file)
@@ -1,3 +1,30 @@
+2005-01-05  Andreas Schwab  <schwab@suse.de>
+
+       * ia64-tdep.c: Include "osabi.h".
+       (native_find_global_pointer): Delete.
+       (ia64_find_global_pointer): Renamed from
+       generic_elf_find_global_pointer.
+       (FIND_GLOBAL_POINTER): Delete.  Change all users to call
+       ia64_find_global_pointer instead.
+       (ia64_gdbarch_init): Call gdbarch_init_osabi.  Remove references
+       to ia64_linux_sigcontext_register_address and
+       ia64_linux_write_pc.  Don't set tdep->find_global_pointer.
+       (_initialize_ia64_tdep): Call gdbarch_register instead of
+       deprecated register_gdbarch_init.
+       (struct gdbarch_tdep): Remove find_global_pointer field and move
+       to ...
+       * ia64-tdep.h (struct gdbarch_tdep): ... here.
+       (ia64_linux_sigcontext_register_address): Remove declaration.
+       (ia64_linux_getunwind_table): Likewise.
+       (ia64_linux_write_pc): Likewise.
+       * ia64-linux-tdep.c: Include "osabi.h".
+       (ia64_linux_sigcontext_register_address): Make static.
+       (ia64_linux_write_pc): Likewise.
+       (ia64_linux_init_abi): New.
+       (_initialize_ia64_linux_tdep): New.
+       * Makefile.in (ia64-tdep.o, ia64-linux-tdep.o): Depend on
+       $(osabi_h).
+
 2005-01-05  Kevin Buettner  <kevinb@redhat.com>
 
        * ia64-tdep.c (ia64_gdbarch_init): Eliminate dependency on 
index f5e065d910a7f0c8a562ba82c4eef64aefdaee9a..77f5e6296c3e90e97931e307614d487b6e7c66c1 100644 (file)
@@ -1,5 +1,5 @@
 # Copyright 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
-# 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation,
+# 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation,
 # Inc.
 
 # This file is part of GDB.
@@ -2054,13 +2054,13 @@ i387-tdep.o: i387-tdep.c $(defs_h) $(doublest_h) $(floatformat_h) $(frame_h) \
 ia64-linux-nat.o: ia64-linux-nat.c $(defs_h) $(gdb_string_h) $(inferior_h) \
        $(target_h) $(gdbcore_h) $(regcache_h) $(gdb_wait_h) $(gregset_h)
 ia64-linux-tdep.o: ia64-linux-tdep.c $(defs_h) $(ia64_tdep_h) \
-       $(arch_utils_h) $(gdbcore_h) $(regcache_h)
+       $(arch_utils_h) $(gdbcore_h) $(regcache_h) $(osabi_h)
 ia64-tdep.o: ia64-tdep.c $(defs_h) $(inferior_h) $(gdbcore_h) \
        $(arch_utils_h) $(floatformat_h) $(regcache_h) $(reggroups_h) \
        $(frame_h) $(frame_base_h) $(frame_unwind_h) $(doublest_h) \
        $(value_h) $(gdb_assert_h) $(objfiles_h) $(elf_common_h) \
        $(elf_bfd_h) $(dis_asm_h) $(infcall_h) $(ia64_tdep_h) $(elf_ia64_h) \
-       $(libunwind_frame_h) $(libunwind_ia64_h)
+       $(libunwind_frame_h) $(libunwind_ia64_h) $(osabi_h)
 infcall.o: infcall.c $(defs_h) $(breakpoint_h) $(target_h) $(regcache_h) \
        $(inferior_h) $(gdb_assert_h) $(block_h) $(gdbcore_h) $(language_h) \
        $(objfiles_h) $(gdbcmd_h) $(command_h) $(gdb_string_h) $(infcall_h) \
index c3fa443a3655deef6ae344f7d4bc219a3c195f39..b7173cc71ab3ba40288156b81dd8d745c8a651b5 100644 (file)
@@ -1,6 +1,6 @@
 /* Target-dependent code for the IA-64 for GDB, the GNU debugger.
 
-   Copyright 2000, 2004 Free Software Foundation, Inc.
+   Copyright 2000, 2004, 2005 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -24,6 +24,7 @@
 #include "arch-utils.h"
 #include "gdbcore.h"
 #include "regcache.h"
+#include "osabi.h"
 
 /* The sigtramp code is in a non-readable (executable-only) region
    of memory called the ``gate page''.  The addresses in question
@@ -47,7 +48,7 @@ ia64_linux_in_sigtramp (CORE_ADDR pc, char *func_name)
    found.  0 is returned for registers which aren't stored in the the
    sigcontext structure. */
 
-CORE_ADDR
+static CORE_ADDR
 ia64_linux_sigcontext_register_address (CORE_ADDR sp, int regno)
 {
   char buf[8];
@@ -96,7 +97,7 @@ ia64_linux_sigcontext_register_address (CORE_ADDR sp, int regno)
       }
 }
 
-void
+static void
 ia64_linux_write_pc (CORE_ADDR pc, ptid_t ptid)
 {
   ia64_write_pc (pc, ptid);
@@ -112,3 +113,22 @@ ia64_linux_write_pc (CORE_ADDR pc, ptid_t ptid)
      called as part of setting up an inferior call.  */
   write_register_pid (IA64_GR10_REGNUM, 0, ptid);
 }
+
+static void
+ia64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
+{
+  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+
+  /* Set the method of obtaining the sigcontext addresses at which
+     registers are saved.  */
+  tdep->sigcontext_register_address = ia64_linux_sigcontext_register_address;
+
+  set_gdbarch_write_pc (gdbarch, ia64_linux_write_pc);
+}
+
+void
+_initialize_ia64_linux_tdep (void)
+{
+  gdbarch_register_osabi (bfd_arch_ia64, 0, GDB_OSABI_LINUX,
+                         ia64_linux_init_abi);
+}
index d5d7d7235fb3d30a5d18c52040e503b3d5134063..065356ae804c50aa263d66ccd780d1875c0f850e 100644 (file)
@@ -38,6 +38,7 @@
 #include "elf-bfd.h"
 #include "dis-asm.h"
 #include "infcall.h"
+#include "osabi.h"
 #include "ia64-tdep.h"
 
 #ifdef HAVE_LIBUNWIND_IA64_H
 #include "libunwind-ia64.h"
 #endif
 
-/* Hook for determining the global pointer when calling functions in
-   the inferior under AIX.  The initialization code in ia64-aix-nat.c
-   sets this hook to the address of a function which will find the
-   global pointer for a given address.  
-   
-   The generic code which uses the dynamic section in the inferior for
-   finding the global pointer is not of much use on AIX since the
-   values obtained from the inferior have not been relocated.  */
-
-CORE_ADDR (*native_find_global_pointer) (CORE_ADDR) = 0;
-
 /* An enumeration of the different IA-64 instruction types.  */
 
 typedef enum instruction_type
@@ -100,6 +90,7 @@ static gdbarch_breakpoint_from_pc_ftype ia64_breakpoint_from_pc;
 static gdbarch_skip_prologue_ftype ia64_skip_prologue;
 static gdbarch_extract_return_value_ftype ia64_extract_return_value;
 static struct type *is_float_or_hfa_type (struct type *t);
+static CORE_ADDR ia64_find_global_pointer (CORE_ADDR faddr);
 
 static struct type *builtin_type_ia64_ext;
 
@@ -256,19 +247,8 @@ struct ia64_frame_cache
 
 };
 
-struct gdbarch_tdep
-  {
-    CORE_ADDR (*sigcontext_register_address) (CORE_ADDR, int);
-                       /* OS specific function which, given a frame address
-                          and register number, returns the offset to the
-                          given register from the start of the frame. */
-    CORE_ADDR (*find_global_pointer) (CORE_ADDR);
-  };
-
 #define SIGCONTEXT_REGISTER_ADDRESS \
   (gdbarch_tdep (current_gdbarch)->sigcontext_register_address)
-#define FIND_GLOBAL_POINTER \
-  (gdbarch_tdep (current_gdbarch)->find_global_pointer)
 
 int
 ia64_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
@@ -2421,7 +2401,7 @@ ia64_find_unwind_table (struct objfile *objfile, unw_word_t ip,
 
   dip->start_ip = segbase;
   dip->end_ip = dip->start_ip + p_text->p_memsz;
-  dip->gp = FIND_GLOBAL_POINTER (ip);
+  dip->gp = ia64_find_global_pointer (ip);
   dip->format = UNW_INFO_FORMAT_REMOTE_TABLE;
   dip->u.rti.name_ptr = (unw_word_t) bfd_get_filename (bfd);
   dip->u.rti.segbase = segbase;
@@ -2863,7 +2843,7 @@ slot_alignment_is_next_even (struct type *t)
    d_un.d_ptr value is the global pointer.  */
 
 static CORE_ADDR
-generic_elf_find_global_pointer (CORE_ADDR faddr)
+ia64_find_global_pointer (CORE_ADDR faddr)
 {
   struct obj_section *faddr_sect;
      
@@ -2984,7 +2964,7 @@ find_func_descr (CORE_ADDR faddr, CORE_ADDR *fdaptr)
       fdesc = *fdaptr;
       *fdaptr += 16;
 
-      global_pointer = FIND_GLOBAL_POINTER (faddr);
+      global_pointer = ia64_find_global_pointer (faddr);
 
       if (global_pointer == 0)
        global_pointer = read_register (IA64_GR1_REGNUM);
@@ -3168,7 +3148,7 @@ ia64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
       regcache_cooked_write_unsigned (regcache, IA64_GR8_REGNUM, (ULONGEST)struct_addr);
     }
 
-  global_pointer = FIND_GLOBAL_POINTER (func_addr);
+  global_pointer = ia64_find_global_pointer (func_addr);
 
   if (global_pointer != 0)
     write_register (IA64_GR1_REGNUM, global_pointer);
@@ -3261,29 +3241,7 @@ ia64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   tdep = xmalloc (sizeof (struct gdbarch_tdep));
   gdbarch = gdbarch_alloc (&info, tdep);
 
-  /* Set the method of obtaining the sigcontext addresses at which
-     registers are saved.  The method of checking to see if
-     native_find_global_pointer is nonzero to indicate that we're
-     on AIX is kind of hokey, but I can't think of a better way
-     to do it.  */
-  if (info.osabi == GDB_OSABI_LINUX)
-    tdep->sigcontext_register_address = ia64_linux_sigcontext_register_address;
-  else
-    tdep->sigcontext_register_address = 0;
-
-  /* We know that GNU/Linux won't have to resort to the
-     native_find_global_pointer hackery.  But that's the only one we
-     know about so far, so if native_find_global_pointer is set to
-     something non-zero, then use it.  Otherwise fall back to using
-     generic_elf_find_global_pointer.  This arrangement should (in
-     theory) allow us to cross debug GNU/Linux binaries from an AIX
-     machine.  */
-  if (info.osabi == GDB_OSABI_LINUX)
-    tdep->find_global_pointer = generic_elf_find_global_pointer;
-  else if (native_find_global_pointer != 0)
-    tdep->find_global_pointer = native_find_global_pointer;
-  else
-    tdep->find_global_pointer = generic_elf_find_global_pointer;
+  tdep->sigcontext_register_address = 0;
 
   /* Define the ia64 floating-point format to gdb.  */
   builtin_type_ia64_ext =
@@ -3341,10 +3299,7 @@ ia64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   set_gdbarch_memory_remove_breakpoint (gdbarch, ia64_memory_remove_breakpoint);
   set_gdbarch_breakpoint_from_pc (gdbarch, ia64_breakpoint_from_pc);
   set_gdbarch_read_pc (gdbarch, ia64_read_pc);
-  if (info.osabi == GDB_OSABI_LINUX)
-    set_gdbarch_write_pc (gdbarch, ia64_linux_write_pc);
-  else
-    set_gdbarch_write_pc (gdbarch, ia64_write_pc);
+  set_gdbarch_write_pc (gdbarch, ia64_write_pc);
 
   /* Settings for calling functions in the inferior.  */
   set_gdbarch_push_dummy_call (gdbarch, ia64_push_dummy_call);
@@ -3369,6 +3324,9 @@ ia64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   set_gdbarch_print_insn (gdbarch, ia64_print_insn);
   set_gdbarch_convert_from_func_ptr_addr (gdbarch, ia64_convert_from_func_ptr_addr);
 
+  /* Hook in ABI-specific overrides, if they have been registered.  */
+  gdbarch_init_osabi (info, gdbarch);
+
   return gdbarch;
 }
 
@@ -3377,5 +3335,5 @@ extern initialize_file_ftype _initialize_ia64_tdep; /* -Wmissing-prototypes */
 void
 _initialize_ia64_tdep (void)
 {
-  register_gdbarch_init (bfd_arch_ia64, ia64_gdbarch_init);
+  gdbarch_register (bfd_arch_ia64, ia64_gdbarch_init, NULL);
 }
index f917232cd45c33baec6d9aff44019f5f1afd6d76..e4afe3e86fb6337d6f19ed9a9755a7cbe785a08c 100644 (file)
@@ -1,6 +1,6 @@
 /* Target-dependent code for the ia64.
 
-   Copyright 2004 Free Software Foundation, Inc.
+   Copyright 2004, 2005 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 #ifndef IA64_TDEP_H
 #define IA64_TDEP_H
 
-extern CORE_ADDR ia64_linux_sigcontext_register_address (CORE_ADDR, int);
-extern unsigned long ia64_linux_getunwind_table (void *, size_t);
+struct gdbarch_tdep
+{
+  CORE_ADDR (*sigcontext_register_address) (CORE_ADDR, int);
+};
+
 extern void ia64_write_pc (CORE_ADDR, ptid_t);
-extern void ia64_linux_write_pc (CORE_ADDR, ptid_t);
 
 #endif /* IA64_TDEP_H */