X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fi386obsd-tdep.c;h=1bdc5d6bee79daf44b04981ebc446a44cab63031;hb=cc2c4da8813b980a4e68272bb43583f4af6fe89c;hp=9005304c334ea20345b10439f19731e2f58ed62b;hpb=2c02bd729076b940958bccf68f1cc0b1ecf8403b;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/i386obsd-tdep.c b/gdb/i386obsd-tdep.c index 9005304c33..1bdc5d6bee 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-2016 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" @@ -95,7 +92,7 @@ i386obsd_sigtramp_p (struct frame_info *this_frame) return 0; /* Allocate buffer. */ - buf = alloca (buflen); + buf = (gdb_byte *) alloca (buflen); /* Loop over all offsets. */ for (offset = i386obsd_sigreturn_offset; *offset != -1; offset++) @@ -142,8 +139,9 @@ 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); - const gdb_byte *gregs = regs; + struct gdbarch *gdbarch = get_regcache_arch (regcache); + const struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + const gdb_byte *gregs = (const gdb_byte *) 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); } @@ -352,7 +348,7 @@ i386obsd_trapframe_cache (struct frame_info *this_frame, void **this_cache) int i; if (*this_cache) - return *this_cache; + return (struct trad_frame_cache *) *this_cache; cache = trad_frame_cache_zalloc (this_frame); *this_cache = cache; @@ -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. */