X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fm88k-tdep.c;h=57754672917929a60d4c851f302d8c21fb59c52e;hb=32b40af94e919e235c21486110311647cbeecf2e;hp=dc9b2919df297494ffa31620c06f1b979cc55c4c;hpb=24568a2cd9b1422f582b6f9c004ebd67ffadcb90;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/m88k-tdep.c b/gdb/m88k-tdep.c index dc9b2919df..5775467291 100644 --- a/gdb/m88k-tdep.c +++ b/gdb/m88k-tdep.c @@ -1,6 +1,6 @@ /* Target-dependent code for the Motorola 88000 series. - Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. + Copyright (C) 2004-2015 Free Software Foundation, Inc. This file is part of GDB. @@ -31,17 +31,14 @@ #include "trad-frame.h" #include "value.h" -#include "gdb_assert.h" -#include "gdb_string.h" - #include "m88k-tdep.h" /* Fetch the instruction at PC. */ static unsigned long -m88k_fetch_instruction (CORE_ADDR pc) +m88k_fetch_instruction (CORE_ADDR pc, enum bfd_endian byte_order) { - return read_memory_unsigned_integer (pc, 4); + return read_memory_unsigned_integer (pc, 4, byte_order); } /* Register information. */ @@ -67,7 +64,7 @@ m88k_register_name (struct gdbarch *gdbarch, int regnum) } /* Return the GDB type object for the "standard" data type of data in - register REGNUM. */ + register REGNUM. */ static struct type * m88k_register_type (struct gdbarch *gdbarch, int regnum) @@ -75,13 +72,13 @@ m88k_register_type (struct gdbarch *gdbarch, int regnum) /* SXIP, SNIP, SFIP and R1 contain code addresses. */ if ((regnum >= M88K_SXIP_REGNUM && regnum <= M88K_SFIP_REGNUM) || regnum == M88K_R1_REGNUM) - return builtin_type_void_func_ptr; + return builtin_type (gdbarch)->builtin_func_ptr; /* R30 and R31 typically contains data addresses. */ if (regnum == M88K_R30_REGNUM || regnum == M88K_R31_REGNUM) - return builtin_type_void_data_ptr; + return builtin_type (gdbarch)->builtin_data_ptr; - return builtin_type_int32; + return builtin_type (gdbarch)->builtin_int32; } @@ -258,6 +255,7 @@ static CORE_ADDR m88k_store_arguments (struct regcache *regcache, int nargs, struct value **args, CORE_ADDR sp) { + struct gdbarch *gdbarch = get_regcache_arch (regcache); int num_register_words = 0; int num_stack_words = 0; int i; @@ -269,7 +267,8 @@ m88k_store_arguments (struct regcache *regcache, int nargs, if (m88k_integral_or_pointer_p (type) && len < 4) { - args[i] = value_cast (builtin_type_int32, args[i]); + args[i] = value_cast (builtin_type (gdbarch)->builtin_int32, + args[i]); type = value_type (args[i]); len = TYPE_LENGTH (type); } @@ -381,7 +380,7 @@ m88k_dummy_id (struct gdbarch *arch, struct frame_info *this_frame) from WRITEBUF into REGCACHE. */ static enum return_value_convention -m88k_return_value (struct gdbarch *gdbarch, struct type *func_type, +m88k_return_value (struct gdbarch *gdbarch, struct value *function, struct type *type, struct regcache *regcache, gdb_byte *readbuf, const gdb_byte *writebuf) { @@ -524,9 +523,11 @@ struct m88k_prologue_insn m88k_prologue_insn_table[] = prologue. */ static CORE_ADDR -m88k_analyze_prologue (CORE_ADDR pc, CORE_ADDR limit, +m88k_analyze_prologue (struct gdbarch *gdbarch, + CORE_ADDR pc, CORE_ADDR limit, struct m88k_frame_cache *cache) { + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); CORE_ADDR end = limit; /* Provide a dummy cache if necessary. */ @@ -546,7 +547,7 @@ m88k_analyze_prologue (CORE_ADDR pc, CORE_ADDR limit, while (pc < limit) { struct m88k_prologue_insn *pi = m88k_prologue_insn_table; - unsigned long insn = m88k_fetch_instruction (pc); + unsigned long insn = m88k_fetch_instruction (pc, byte_order); while ((insn & pi->mask) != pi->insn) pi++; @@ -641,12 +642,14 @@ m88k_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc) return sal.end; } - return m88k_analyze_prologue (pc, pc + m88k_max_prologue_size, NULL); + return m88k_analyze_prologue (gdbarch, pc, pc + m88k_max_prologue_size, + NULL); } -struct m88k_frame_cache * +static struct m88k_frame_cache * m88k_frame_cache (struct frame_info *this_frame, void **this_cache) { + struct gdbarch *gdbarch = get_frame_arch (this_frame); struct m88k_frame_cache *cache; CORE_ADDR frame_sp; @@ -659,7 +662,8 @@ m88k_frame_cache (struct frame_info *this_frame, void **this_cache) cache->pc = get_frame_func (this_frame); if (cache->pc != 0) - m88k_analyze_prologue (cache->pc, get_frame_pc (this_frame), cache); + m88k_analyze_prologue (gdbarch, cache->pc, get_frame_pc (this_frame), + cache); /* Calculate the stack pointer used in the prologue. */ if (cache->fp_offset != -1) @@ -741,6 +745,7 @@ m88k_frame_prev_register (struct frame_info *this_frame, static const struct frame_unwind m88k_frame_unwind = { NORMAL_FRAME, + default_frame_unwind_stop_reason, m88k_frame_this_id, m88k_frame_prev_register, NULL, @@ -791,23 +796,21 @@ m88k_supply_gregset (const struct regset *regset, /* Motorola 88000 register set. */ -static struct regset m88k_gregset = +static const struct regset m88k_gregset = { NULL, m88k_supply_gregset }; -/* Return the appropriate register set for the core section identified - by SECT_NAME and SECT_SIZE. */ +/* Iterate over supported core file register note sections. */ -static const struct regset * -m88k_regset_from_core_section (struct gdbarch *gdbarch, - const char *sect_name, size_t sect_size) +static void +m88k_iterate_over_regset_sections (struct gdbarch *gdbarch, + iterate_over_regset_sections_cb *cb, + void *cb_data, + const struct regcache *regcache) { - if (strcmp (sect_name, ".reg") == 0 && sect_size >= M88K_NUM_REGS * 4) - return &m88k_gregset; - - return NULL; + cb (".reg", M88K_NUM_REGS * 4, &m88k_gregset, NULL, cb_data); } @@ -837,8 +840,8 @@ m88k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_pc_regnum (gdbarch, M88K_SXIP_REGNUM); /* Core file support. */ - set_gdbarch_regset_from_core_section - (gdbarch, m88k_regset_from_core_section); + set_gdbarch_iterate_over_regset_sections + (gdbarch, m88k_iterate_over_regset_sections); set_gdbarch_print_insn (gdbarch, print_insn_m88k); @@ -851,7 +854,7 @@ m88k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_push_dummy_call (gdbarch, m88k_push_dummy_call); set_gdbarch_dummy_id (gdbarch, m88k_dummy_id); - /* Return value info */ + /* Return value info. */ set_gdbarch_return_value (gdbarch, m88k_return_value); set_gdbarch_addr_bits_remove (gdbarch, m88k_addr_bits_remove);