X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Falphanbsd-tdep.c;h=f6960c60d11761b10d21f5e09d7f633cf0789748;hb=c709acd150761fffe3536bf9e6a0b32870f41ca3;hp=ca1ecffb326d68cde206ee80443b3d91c36e04f0;hpb=3beabdb233f886e40f3ec92cbe1ef01c2788e537;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/alphanbsd-tdep.c b/gdb/alphanbsd-tdep.c index ca1ecffb32..f6960c60d1 100644 --- a/gdb/alphanbsd-tdep.c +++ b/gdb/alphanbsd-tdep.c @@ -1,6 +1,7 @@ /* Target-dependent code for NetBSD/alpha. - Copyright (C) 2002, 2003, 2004, 2006 Free Software Foundation, Inc. + Copyright (C) 2002, 2003, 2004, 2006, 2007, 2008, 2009, 2010, 2011 + Free Software Foundation, Inc. Contributed by Wasabi Systems, Inc. @@ -8,7 +9,7 @@ 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 2 of the License, or + 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, @@ -17,9 +18,7 @@ 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, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. */ + along with this program. If not, see . */ #include "defs.h" #include "frame.h" @@ -36,6 +35,7 @@ #include "alphabsd-tdep.h" #include "nbsd-tdep.h" #include "solib-svr4.h" +#include "target.h" /* Core file support. */ @@ -163,29 +163,23 @@ static struct regset alphanbsd_aout_gregset = /* Return the appropriate register set for the core section identified by SECT_NAME and SECT_SIZE. */ -static const struct regset * +const struct regset * alphanbsd_regset_from_core_section (struct gdbarch *gdbarch, const char *sect_name, size_t sect_size) { if (strcmp (sect_name, ".reg") == 0 && sect_size >= ALPHANBSD_SIZEOF_GREGS) - return &alphanbsd_gregset; + { + if (sect_size >= ALPHANBSD_SIZEOF_GREGS + ALPHANBSD_SIZEOF_FPREGS) + return &alphanbsd_aout_gregset; + else + return &alphanbsd_gregset; + } if (strcmp (sect_name, ".reg2") == 0 && sect_size >= ALPHANBSD_SIZEOF_FPREGS) return &alphanbsd_fpregset; return NULL; } - -static const struct regset * -alphanbsd_aout_regset_from_core_section (struct gdbarch *gdbarch, - const char *sect_name, - size_t sect_size) -{ - if (strcmp (sect_name, ".reg") == 0 && sect_size >= ALPHANBSD_SIZEOF_GREGS) - return &alphanbsd_aout_gregset; - - return NULL; -} /* Signal trampolines. */ @@ -216,14 +210,14 @@ static const unsigned char sigtramp_retcode[] = #define RETCODE_NWORDS 4 #define RETCODE_SIZE (RETCODE_NWORDS * 4) -LONGEST -alphanbsd_sigtramp_offset (CORE_ADDR pc) +static LONGEST +alphanbsd_sigtramp_offset (struct gdbarch *gdbarch, CORE_ADDR pc) { unsigned char ret[RETCODE_SIZE], w[4]; LONGEST off; int i; - if (deprecated_read_memory_nobpt (pc, (char *) w, 4) != 0) + if (target_read_memory (pc, (char *) w, 4) != 0) return -1; for (i = 0; i < RETCODE_NWORDS; i++) @@ -237,7 +231,7 @@ alphanbsd_sigtramp_offset (CORE_ADDR pc) off = i * 4; pc -= off; - if (deprecated_read_memory_nobpt (pc, (char *) ret, sizeof (ret)) != 0) + if (target_read_memory (pc, (char *) ret, sizeof (ret)) != 0) return -1; if (memcmp (ret, sigtramp_retcode, RETCODE_SIZE) == 0) @@ -247,10 +241,11 @@ alphanbsd_sigtramp_offset (CORE_ADDR pc) } static int -alphanbsd_pc_in_sigtramp (CORE_ADDR pc, char *func_name) +alphanbsd_pc_in_sigtramp (struct gdbarch *gdbarch, + CORE_ADDR pc, char *func_name) { return (nbsd_pc_in_sigtramp (pc, func_name) - || alphanbsd_sigtramp_offset (pc) >= 0); + || alphanbsd_sigtramp_offset (gdbarch, pc) >= 0); } static CORE_ADDR @@ -259,8 +254,11 @@ alphanbsd_sigcontext_addr (struct frame_info *frame) /* FIXME: This is not correct for all versions of NetBSD/alpha. We will probably need to disassemble the trampoline to figure out which trampoline frame type we have. */ - return get_frame_base (frame); + if (!get_next_frame (frame)) + return 0; + return get_frame_base (get_next_frame (frame)); } + static void alphanbsd_init_abi (struct gdbarch_info info, @@ -292,23 +290,13 @@ alphanbsd_init_abi (struct gdbarch_info info, set_gdbarch_regset_from_core_section (gdbarch, alphanbsd_regset_from_core_section); } - -static void -alphanbsd_aout_init_abi (struct gdbarch_info info, - struct gdbarch *gdbarch) -{ - alphanbsd_init_abi(info, gdbarch); - - set_gdbarch_regset_from_core_section - (gdbarch, alphanbsd_aout_regset_from_core_section); -} static enum gdb_osabi alphanbsd_core_osabi_sniffer (bfd *abfd) { if (strcmp (bfd_get_target (abfd), "netbsd-core") == 0) - return GDB_OSABI_NETBSD_AOUT; + return GDB_OSABI_NETBSD_ELF; return GDB_OSABI_UNKNOWN; } @@ -326,8 +314,4 @@ _initialize_alphanbsd_tdep (void) gdbarch_register_osabi (bfd_arch_alpha, 0, GDB_OSABI_NETBSD_ELF, alphanbsd_init_abi); - gdbarch_register_osabi (bfd_arch_alpha, 0, GDB_OSABI_NETBSD_AOUT, - alphanbsd_aout_init_abi); - gdbarch_register_osabi (bfd_arch_alpha, 0, GDB_OSABI_OPENBSD_ELF, - alphanbsd_aout_init_abi); }