X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fh8300-tdep.c;h=0e80ec8c30626dd7db912dbd5cea68dbf9391faf;hb=20249ae4551ae7b2193caed73d9ce8d594f38754;hp=ffffbc9525d8d14f00780556dfd2a31da406d64f;hpb=ecd75fc8eed3bde86036141228074a20e55dcfc9;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/h8300-tdep.c b/gdb/h8300-tdep.c index ffffbc9525..0e80ec8c30 100644 --- a/gdb/h8300-tdep.c +++ b/gdb/h8300-tdep.c @@ -1,6 +1,6 @@ /* Target-machine dependent code for Renesas H8/300, for GDB. - Copyright (C) 1988-2014 Free Software Foundation, Inc. + Copyright (C) 1988-2016 Free Software Foundation, Inc. This file is part of GDB. @@ -28,7 +28,6 @@ #include "regcache.h" #include "gdbcore.h" #include "objfiles.h" -#include "gdb_assert.h" #include "dis-asm.h" #include "dwarf2-frame.h" #include "frame-base.h" @@ -433,7 +432,7 @@ h8300_frame_cache (struct frame_info *this_frame, void **this_cache) CORE_ADDR current_pc; if (*this_cache) - return *this_cache; + return (struct h8300_frame_cache *) *this_cache; cache = FRAME_OBSTACK_ZALLOC (struct h8300_frame_cache); h8300_init_frame_cache (gdbarch, cache); @@ -672,7 +671,7 @@ h8300_push_dummy_call (struct gdbarch *gdbarch, struct value *function, /* Pad the argument appropriately. */ int padded_len = align_up (len, wordsize); - gdb_byte *padded = xmalloc (padded_len); + gdb_byte *padded = (gdb_byte *) xmalloc (padded_len); back_to = make_cleanup (xfree, padded); memset (padded, 0, padded_len); @@ -743,7 +742,7 @@ h8300_push_dummy_call (struct gdbarch *gdbarch, struct value *function, static void h8300_extract_return_value (struct type *type, struct regcache *regcache, - void *valbuf) + gdb_byte *valbuf) { struct gdbarch *gdbarch = get_regcache_arch (regcache); enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); @@ -761,7 +760,7 @@ h8300_extract_return_value (struct type *type, struct regcache *regcache, regcache_cooked_read_unsigned (regcache, E_RET0_REGNUM, &c); store_unsigned_integer (valbuf, 2, byte_order, c); regcache_cooked_read_unsigned (regcache, E_RET1_REGNUM, &c); - store_unsigned_integer ((void *)((char *) valbuf + 2), 2, byte_order, c); + store_unsigned_integer (valbuf + 2, 2, byte_order, c); break; case 8: /* long long is now 8 bytes. */ if (TYPE_CODE (type) == TYPE_CODE_INT) @@ -780,7 +779,7 @@ h8300_extract_return_value (struct type *type, struct regcache *regcache, static void h8300h_extract_return_value (struct type *type, struct regcache *regcache, - void *valbuf) + gdb_byte *valbuf) { struct gdbarch *gdbarch = get_regcache_arch (regcache); enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); @@ -800,8 +799,7 @@ h8300h_extract_return_value (struct type *type, struct regcache *regcache, regcache_cooked_read_unsigned (regcache, E_RET0_REGNUM, &c); store_unsigned_integer (valbuf, 4, byte_order, c); regcache_cooked_read_unsigned (regcache, E_RET1_REGNUM, &c); - store_unsigned_integer ((void *) ((char *) valbuf + 4), 4, - byte_order, c); + store_unsigned_integer (valbuf + 4, 4, byte_order, c); } else { @@ -846,7 +844,7 @@ h8300h_use_struct_convention (struct type *value_type) static void h8300_store_return_value (struct type *type, struct regcache *regcache, - const void *valbuf) + const gdb_byte *valbuf) { struct gdbarch *gdbarch = get_regcache_arch (regcache); enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); @@ -875,7 +873,7 @@ h8300_store_return_value (struct type *type, struct regcache *regcache, static void h8300h_store_return_value (struct type *type, struct regcache *regcache, - const void *valbuf) + const gdb_byte *valbuf) { struct gdbarch *gdbarch = get_regcache_arch (regcache); enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); @@ -937,7 +935,21 @@ h8300h_return_value (struct gdbarch *gdbarch, struct value *function, return RETURN_VALUE_REGISTER_CONVENTION; } -static struct cmd_list_element *setmachinelist; +/* Implementation of 'register_sim_regno' gdbarch method. */ + +static int +h8300_register_sim_regno (struct gdbarch *gdbarch, int regnum) +{ + /* Only makes sense to supply raw registers. */ + gdb_assert (regnum >= 0 && regnum < gdbarch_num_regs (gdbarch)); + + /* We hide the raw ccr from the user by making it nameless. Because + the default register_sim_regno hook returns + LEGACY_SIM_REGNO_IGNORE for unnamed registers, we need to + override it. The sim register numbering is compatible with + gdb's. */ + return regnum; +} static const char * h8300_register_name (struct gdbarch *gdbarch, int regno) @@ -1148,15 +1160,55 @@ h8300_register_type (struct gdbarch *gdbarch, int regno) } } +/* Helpers for h8300_pseudo_register_read. We expose ccr/exr as + pseudo-registers to users with smaller sizes than the corresponding + raw registers. These helpers extend/narrow the values. */ + +static enum register_status +pseudo_from_raw_register (struct gdbarch *gdbarch, struct regcache *regcache, + gdb_byte *buf, int pseudo_regno, int raw_regno) +{ + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); + enum register_status status; + ULONGEST val; + + status = regcache_raw_read_unsigned (regcache, raw_regno, &val); + if (status == REG_VALID) + store_unsigned_integer (buf, + register_size (gdbarch, pseudo_regno), + byte_order, val); + return status; +} + +/* See pseudo_from_raw_register. */ + +static void +raw_from_pseudo_register (struct gdbarch *gdbarch, struct regcache *regcache, + const gdb_byte *buf, int raw_regno, int pseudo_regno) +{ + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); + ULONGEST val; + + val = extract_unsigned_integer (buf, register_size (gdbarch, pseudo_regno), + byte_order); + regcache_raw_write_unsigned (regcache, raw_regno, val); +} + static enum register_status h8300_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache, int regno, gdb_byte *buf) { if (regno == E_PSEUDO_CCR_REGNUM (gdbarch)) - return regcache_raw_read (regcache, E_CCR_REGNUM, buf); + { + return pseudo_from_raw_register (gdbarch, regcache, buf, + regno, E_CCR_REGNUM); + } else if (regno == E_PSEUDO_EXR_REGNUM (gdbarch)) - return regcache_raw_read (regcache, E_EXR_REGNUM, buf); + { + return pseudo_from_raw_register (gdbarch, regcache, buf, + regno, E_EXR_REGNUM); + } else return regcache_raw_read (regcache, regno, buf); } @@ -1167,9 +1219,9 @@ h8300_pseudo_register_write (struct gdbarch *gdbarch, const gdb_byte *buf) { if (regno == E_PSEUDO_CCR_REGNUM (gdbarch)) - regcache_raw_write (regcache, E_CCR_REGNUM, buf); + raw_from_pseudo_register (gdbarch, regcache, buf, E_CCR_REGNUM, regno); else if (regno == E_PSEUDO_EXR_REGNUM (gdbarch)) - regcache_raw_write (regcache, E_EXR_REGNUM, buf); + raw_from_pseudo_register (gdbarch, regcache, buf, E_EXR_REGNUM, regno); else regcache_raw_write (regcache, regno, buf); } @@ -1203,14 +1255,6 @@ h8300_breakpoint_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr, return breakpoint; } -static void -h8300_print_float_info (struct gdbarch *gdbarch, struct ui_file *file, - struct frame_info *frame, const char *args) -{ - fprintf_filtered (file, "\ -No floating-point info available for this processor.\n"); -} - static struct gdbarch * h8300_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) { @@ -1222,7 +1266,7 @@ h8300_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) return arches->gdbarch; #if 0 - tdep = (struct gdbarch_tdep *) xmalloc (sizeof (struct gdbarch_tdep)); + tdep = XNEW (struct gdbarch_tdep); #endif if (info.bfd_arch_info->arch != bfd_arch_h8300) @@ -1230,6 +1274,8 @@ h8300_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) gdbarch = gdbarch_alloc (&info, 0); + set_gdbarch_register_sim_regno (gdbarch, h8300_register_sim_regno); + switch (info.bfd_arch_info->mach) { case bfd_mach_h8300: @@ -1320,7 +1366,6 @@ h8300_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_pc_regnum (gdbarch, E_PC_REGNUM); set_gdbarch_register_type (gdbarch, h8300_register_type); set_gdbarch_print_registers_info (gdbarch, h8300_print_registers_info); - set_gdbarch_print_float_info (gdbarch, h8300_print_float_info); /* * Frame Info