X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fm68hc11-tdep.c;h=bf8ecc2534f0b041c70e6fb961dffb51af5c4060;hb=ae6a105d22fb603dbfb956bbcedf9ae469323d55;hp=1215de8d365bfd249aa49cd5a69b7a4315c6d574;hpb=0b30217134add051e159a192066a1e568ebd837f;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/m68hc11-tdep.c b/gdb/m68hc11-tdep.c index 1215de8d36..bf8ecc2534 100644 --- a/gdb/m68hc11-tdep.c +++ b/gdb/m68hc11-tdep.c @@ -1,6 +1,6 @@ /* Target-dependent code for Motorola 68HC11 & 68HC12 - Copyright (C) 1999-2005, 2007-2012 Free Software Foundation, Inc. + Copyright (C) 1999-2014 Free Software Foundation, Inc. Contributed by Stephane Carrez, stcarrez@nerim.fr @@ -30,7 +30,6 @@ #include "gdbtypes.h" #include "gdbcmd.h" #include "gdbcore.h" -#include "gdb_string.h" #include "value.h" #include "inferior.h" #include "dis-asm.h" @@ -199,12 +198,12 @@ static int soft_reg_initialized = 0; static void m68hc11_get_register_info (struct m68hc11_soft_reg *reg, const char *name) { - struct minimal_symbol *msymbol; + struct bound_minimal_symbol msymbol; msymbol = lookup_minimal_symbol (name, NULL, NULL); - if (msymbol) + if (msymbol.minsym) { - reg->addr = SYMBOL_VALUE_ADDRESS (msymbol); + reg->addr = BMSYMBOL_VALUE_ADDRESS (msymbol); reg->name = xstrdup (name); /* Keep track of the address range for soft registers. */ @@ -247,7 +246,7 @@ m68hc11_initialize_register_info (void) { char buf[10]; - sprintf (buf, "_.d%d", i - SOFT_D1_REGNUM + 1); + xsnprintf (buf, sizeof (buf), "_.d%d", i - SOFT_D1_REGNUM + 1); m68hc11_get_register_info (&soft_regs[i], buf); } @@ -338,7 +337,7 @@ m68hc11_pseudo_register_write (struct gdbarch *gdbarch, if (regno == M68HC12_HARD_PC_REGNUM) { const int regsize = 4; - char *tmp = alloca (regsize); + gdb_byte *tmp = alloca (regsize); CORE_ADDR pc; memcpy (tmp, buf, regsize); @@ -363,7 +362,7 @@ m68hc11_pseudo_register_write (struct gdbarch *gdbarch, if (soft_regs[regno].name) { const int regsize = 2; - char *tmp = alloca (regsize); + gdb_byte *tmp = alloca (regsize); memcpy (tmp, buf, regsize); target_write_memory (soft_regs[regno].addr, tmp, regsize); } @@ -587,18 +586,18 @@ m68hc11_analyze_instruction (struct gdbarch *gdbarch, static enum insn_return_kind m68hc11_get_return_insn (CORE_ADDR pc) { - struct minimal_symbol *sym; + struct bound_minimal_symbol sym; /* A flag indicating that this is a STO_M68HC12_FAR or STO_M68HC12_INTERRUPT function is stored by elfread.c in the high bit of the info field. Use this to decide which instruction the function uses to return. */ sym = lookup_minimal_symbol_by_pc (pc); - if (sym == 0) + if (sym.minsym == 0) return RETURN_RTS; - if (MSYMBOL_IS_RTC (sym)) + if (MSYMBOL_IS_RTC (sym.minsym)) return RETURN_RTC; - else if (MSYMBOL_IS_RTI (sym)) + else if (MSYMBOL_IS_RTI (sym.minsym)) return RETURN_RTI; else return RETURN_RTS; @@ -1173,9 +1172,8 @@ m68hc11_push_dummy_call (struct gdbarch *gdbarch, struct value *function, int argnum; int first_stack_argnum; struct type *type; - char *val; - int len; - char buf[2]; + const gdb_byte *val; + gdb_byte buf[2]; first_stack_argnum = 0; if (struct_return) @@ -1185,19 +1183,18 @@ m68hc11_push_dummy_call (struct gdbarch *gdbarch, struct value *function, else if (nargs > 0) { type = value_type (args[0]); - len = TYPE_LENGTH (type); /* First argument is passed in D and X registers. */ - if (len <= 4) + if (TYPE_LENGTH (type) <= 4) { ULONGEST v; v = extract_unsigned_integer (value_contents (args[0]), - len, byte_order); + TYPE_LENGTH (type), byte_order); first_stack_argnum = 1; regcache_cooked_write_unsigned (regcache, HARD_D_REGNUM, v); - if (len > 2) + if (TYPE_LENGTH (type) > 2) { v >>= 16; regcache_cooked_write_unsigned (regcache, HARD_X_REGNUM, v); @@ -1208,18 +1205,17 @@ m68hc11_push_dummy_call (struct gdbarch *gdbarch, struct value *function, for (argnum = nargs - 1; argnum >= first_stack_argnum; argnum--) { type = value_type (args[argnum]); - len = TYPE_LENGTH (type); - if (len & 1) + if (TYPE_LENGTH (type) & 1) { - static char zero = 0; + static gdb_byte zero = 0; sp--; write_memory (sp, &zero, 1); } - val = (char*) value_contents (args[argnum]); - sp -= len; - write_memory (sp, val, len); + val = value_contents (args[argnum]); + sp -= TYPE_LENGTH (type); + write_memory (sp, val, TYPE_LENGTH (type)); } /* Store return address. */ @@ -1264,7 +1260,7 @@ m68hc11_register_type (struct gdbarch *gdbarch, int reg_nr) static void m68hc11_store_return_value (struct type *type, struct regcache *regcache, - const void *valbuf) + const gdb_byte *valbuf) { int len; @@ -1277,7 +1273,7 @@ m68hc11_store_return_value (struct type *type, struct regcache *regcache, { regcache_raw_write_part (regcache, HARD_X_REGNUM, 4 - len, len - 2, valbuf); - regcache_raw_write (regcache, HARD_D_REGNUM, (char*) valbuf + (len - 2)); + regcache_raw_write (regcache, HARD_D_REGNUM, valbuf + (len - 2)); } else error (_("return of value > 4 is not supported.")); @@ -1291,11 +1287,10 @@ static void m68hc11_extract_return_value (struct type *type, struct regcache *regcache, void *valbuf) { - int len = TYPE_LENGTH (type); - char buf[M68HC11_REG_SIZE]; + gdb_byte buf[M68HC11_REG_SIZE]; regcache_raw_read (regcache, HARD_D_REGNUM, buf); - switch (len) + switch (TYPE_LENGTH (type)) { case 1: memcpy (valbuf, buf + 1, 1); @@ -1323,7 +1318,7 @@ m68hc11_extract_return_value (struct type *type, struct regcache *regcache, } static enum return_value_convention -m68hc11_return_value (struct gdbarch *gdbarch, struct type *func_type, +m68hc11_return_value (struct gdbarch *gdbarch, struct value *function, struct type *valtype, struct regcache *regcache, gdb_byte *readbuf, const gdb_byte *writebuf) { @@ -1498,7 +1493,16 @@ m68hc11_gdbarch_init (struct gdbarch_info info, set_gdbarch_short_bit (gdbarch, 16); set_gdbarch_int_bit (gdbarch, elf_flags & E_M68HC11_I32 ? 32 : 16); set_gdbarch_float_bit (gdbarch, 32); - set_gdbarch_double_bit (gdbarch, elf_flags & E_M68HC11_F64 ? 64 : 32); + if (elf_flags & E_M68HC11_F64) + { + set_gdbarch_double_bit (gdbarch, 64); + set_gdbarch_double_format (gdbarch, floatformats_ieee_double); + } + else + { + set_gdbarch_double_bit (gdbarch, 32); + set_gdbarch_double_format (gdbarch, floatformats_ieee_single); + } set_gdbarch_long_double_bit (gdbarch, 64); set_gdbarch_long_bit (gdbarch, 32); set_gdbarch_ptr_bit (gdbarch, 16);