X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fi386obsd-tdep.c;h=eae445c845f6bfb85842db59696d692b3b9c0fc8;hb=1e76a7e9b156173a76e6a14a3ed41cefc9fed480;hp=9005304c334ea20345b10439f19731e2f58ed62b;hpb=2c02bd729076b940958bccf68f1cc0b1ecf8403b;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/i386obsd-tdep.c b/gdb/i386obsd-tdep.c index 9005304c33..eae445c845 100644 --- a/gdb/i386obsd-tdep.c +++ b/gdb/i386obsd-tdep.c @@ -1,7 +1,6 @@ /* Target-dependent code for OpenBSD/i386. - Copyright (C) 1988-1989, 1991-1992, 1994, 1996, 2000-2012 Free - Software Foundation, Inc. + Copyright (C) 1988-2015 Free Software Foundation, Inc. This file is part of GDB. @@ -31,9 +30,7 @@ #include "target.h" #include "trad-frame.h" -#include "gdb_assert.h" -#include "gdb_string.h" - +#include "obsd-tdep.h" #include "i386-tdep.h" #include "i387-tdep.h" #include "solib-svr4.h" @@ -142,7 +139,8 @@ i386obsd_aout_supply_regset (const struct regset *regset, struct regcache *regcache, int regnum, const void *regs, size_t len) { - const struct gdbarch_tdep *tdep = gdbarch_tdep (regset->arch); + struct gdbarch *gdbarch = get_regcache_arch (regcache); + const struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); const gdb_byte *gregs = regs; gdb_assert (len >= tdep->sizeof_gregset + I387_SIZEOF_FSAVE); @@ -151,26 +149,24 @@ i386obsd_aout_supply_regset (const struct regset *regset, i387_supply_fsave (regcache, regnum, gregs + tdep->sizeof_gregset); } -static const struct regset * -i386obsd_aout_regset_from_core_section (struct gdbarch *gdbarch, - const char *sect_name, - size_t sect_size) +static const struct regset i386obsd_aout_gregset = + { + NULL, i386obsd_aout_supply_regset, NULL + }; + +static void +i386obsd_aout_iterate_over_regset_sections (struct gdbarch *gdbarch, + iterate_over_regset_sections_cb *cb, + void *cb_data, + const struct regcache *regcache) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); /* OpenBSD a.out core dumps don't use seperate register sets for the general-purpose and floating-point registers. */ - if (strcmp (sect_name, ".reg") == 0 - && sect_size >= tdep->sizeof_gregset + I387_SIZEOF_FSAVE) - { - if (tdep->gregset == NULL) - tdep->gregset = - regset_alloc (gdbarch, i386obsd_aout_supply_regset, NULL); - return tdep->gregset; - } - - return NULL; + cb (".reg", tdep->sizeof_gregset + I387_SIZEOF_FSAVE, + &i386obsd_aout_gregset, NULL, cb_data); } @@ -361,7 +357,7 @@ i386obsd_trapframe_cache (struct frame_info *this_frame, void **this_cache) sp = get_frame_register_unsigned (this_frame, I386_ESP_REGNUM); find_pc_partial_function (func, &name, NULL, NULL); - if (name && strncmp (name, "Xintr", 5) == 0) + if (name && startswith (name, "Xintr")) addr = sp + 8; /* It's an interrupt frame. */ else addr = sp; @@ -424,8 +420,8 @@ i386obsd_trapframe_sniffer (const struct frame_unwind *self, find_pc_partial_function (get_frame_pc (this_frame), &name, NULL, NULL); return (name && (strcmp (name, "calltrap") == 0 || strcmp (name, "syscall1") == 0 - || strncmp (name, "Xintr", 5) == 0 - || strncmp (name, "Xsoft", 5) == 0)); + || startswith (name, "Xintr") + || startswith (name, "Xsoft"))); } static const struct frame_unwind i386obsd_trapframe_unwind = { @@ -448,6 +444,7 @@ i386obsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) /* Obviously OpenBSD is BSD-based. */ i386bsd_init_abi (info, gdbarch); + obsd_init_abi (info, gdbarch); /* OpenBSD has a different `struct reg'. */ tdep->gregset_reg_offset = i386obsd_r_reg_offset; @@ -483,8 +480,8 @@ i386obsd_aout_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) i386obsd_init_abi (info, gdbarch); /* OpenBSD a.out has a single register set. */ - set_gdbarch_regset_from_core_section - (gdbarch, i386obsd_aout_regset_from_core_section); + set_gdbarch_iterate_over_regset_sections + (gdbarch, i386obsd_aout_iterate_over_regset_sections); } /* OpenBSD ELF. */