X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Farmobsd-tdep.c;h=5ccf1d146d1283a5a8ec74a4fdb626b95e53ecfc;hb=061fc021d5d110cc37a4c06c4ed94b87be00610a;hp=0f5e7a4007d3b42e9cc028e511090d21c29a85c2;hpb=e3ac4a1e11ab967067fda23a41cc77c5b3dc3382;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/armobsd-tdep.c b/gdb/armobsd-tdep.c index 0f5e7a4007..5ccf1d146d 100644 --- a/gdb/armobsd-tdep.c +++ b/gdb/armobsd-tdep.c @@ -1,12 +1,12 @@ /* Target-dependent code for OpenBSD/arm. - Copyright (C) 2006 Free Software Foundation, Inc. + Copyright (C) 2006-2016 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 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, @@ -15,9 +15,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 "osabi.h" @@ -32,7 +30,7 @@ static void armobsd_sigframe_init (const struct tramp_frame *self, - struct frame_info *next_frame, + struct frame_info *this_frame, struct trad_frame_cache *cache, CORE_ADDR func) { @@ -41,7 +39,7 @@ armobsd_sigframe_init (const struct tramp_frame *self, /* We find the appropriate instance of `struct sigcontext' at a fixed offset in the signal frame. */ - sp = frame_unwind_register_signed (next_frame, ARM_SP_REGNUM); + sp = get_frame_register_signed (this_frame, ARM_SP_REGNUM); sigcontext_addr = sp + 16; /* PC. */ @@ -70,6 +68,10 @@ static const struct tramp_frame armobsd_sigframe = }; +/* Override default thumb breakpoints. */ +static const gdb_byte arm_obsd_thumb_le_breakpoint[] = {0xfe, 0xdf}; +static const gdb_byte arm_obsd_thumb_be_breakpoint[] = {0xdf, 0xfe}; + static void armobsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) @@ -88,11 +90,51 @@ armobsd_init_abi (struct gdbarch_info info, tdep->jb_pc = 24; tdep->jb_elt_size = 4; + + set_gdbarch_iterate_over_regset_sections + (gdbarch, armbsd_iterate_over_regset_sections); + + /* OpenBSD/arm uses -fpcc-struct-return by default. */ + tdep->struct_return = pcc_struct_return; + + /* Single stepping. */ + set_gdbarch_software_single_step (gdbarch, arm_software_single_step); + + /* Breakpoints. */ + switch (info.byte_order) + { + case BFD_ENDIAN_BIG: + tdep->thumb_breakpoint = arm_obsd_thumb_be_breakpoint; + tdep->thumb_breakpoint_size = sizeof (arm_obsd_thumb_be_breakpoint); + break; + + case BFD_ENDIAN_LITTLE: + tdep->thumb_breakpoint = arm_obsd_thumb_le_breakpoint; + tdep->thumb_breakpoint_size = sizeof (arm_obsd_thumb_le_breakpoint); + break; + } } + + +static enum gdb_osabi +armobsd_core_osabi_sniffer (bfd *abfd) +{ + if (strcmp (bfd_get_target (abfd), "netbsd-core") == 0) + return GDB_OSABI_OPENBSD_ELF; + + return GDB_OSABI_UNKNOWN; +} + +/* Provide a prototype to silence -Wmissing-prototypes. */ +extern initialize_file_ftype _initialize_armobsd_tdep; void _initialize_armobsd_tdep (void) { + /* BFD doesn't set a flavour for NetBSD style a.out core files. */ + gdbarch_register_osabi_sniffer (bfd_arch_arm, bfd_target_unknown_flavour, + armobsd_core_osabi_sniffer); + gdbarch_register_osabi (bfd_arch_arm, 0, GDB_OSABI_OPENBSD_ELF, armobsd_init_abi); }