+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
# 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.
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) \
/* 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.
#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
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];
}
}
-void
+static void
ia64_linux_write_pc (CORE_ADDR pc, ptid_t ptid)
{
ia64_write_pc (pc, 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);
+}
#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
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;
};
-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,
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;
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;
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);
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);
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 =
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);
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;
}
void
_initialize_ia64_tdep (void)
{
- register_gdbarch_init (bfd_arch_ia64, ia64_gdbarch_init);
+ gdbarch_register (bfd_arch_ia64, ia64_gdbarch_init, NULL);
}