X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Ffrv-tdep.c;h=1eed441f2b34a7e4522a8fb5c1af82613fd8b32e;hb=3c025cfe5efc44eb4dfb03b53dca28e75096dd1e;hp=3e41cfb768daf19890a31fd408f2050b8c5553be;hpb=ecd75fc8eed3bde86036141228074a20e55dcfc9;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/frv-tdep.c b/gdb/frv-tdep.c index 3e41cfb768..1eed441f2b 100644 --- a/gdb/frv-tdep.c +++ b/gdb/frv-tdep.c @@ -1,6 +1,6 @@ /* Target-dependent code for the Fujitsu FR-V, for GDB, the GNU Debugger. - Copyright (C) 2002-2014 Free Software Foundation, Inc. + Copyright (C) 2002-2018 Free Software Foundation, Inc. This file is part of GDB. @@ -18,7 +18,6 @@ along with this program. If not, see . */ #include "defs.h" -#include #include "inferior.h" #include "gdbcore.h" #include "arch-utils.h" @@ -28,7 +27,6 @@ #include "frame-base.h" #include "trad-frame.h" #include "dis-asm.h" -#include "gdb_assert.h" #include "sim-regno.h" #include "gdb/sim-frv.h" #include "opcodes/frv-desc.h" /* for the H_SPR_... enums */ @@ -39,8 +37,7 @@ #include "infcall.h" #include "solib.h" #include "frv-tdep.h" - -extern void _initialize_frv_tdep (void); +#include "objfiles.h" struct frv_unwind_cache /* was struct frame_extra_info */ { @@ -88,7 +85,7 @@ struct gdbarch_tdep int num_hw_breakpoints; /* Register names. */ - char **register_names; + const char **register_names; }; /* Return the FR-V ABI associated with GDBARCH. */ @@ -137,9 +134,8 @@ new_variant (void) struct gdbarch_tdep *var; int r; - var = xmalloc (sizeof (*var)); - memset (var, 0, sizeof (*var)); - + var = XCNEW (struct gdbarch_tdep); + var->frv_abi = FRV_ABI_EABI; var->num_gprs = 64; var->num_fprs = 64; @@ -149,8 +145,8 @@ new_variant (void) /* By default, don't supply any general-purpose or floating-point register names. */ var->register_names - = (char **) xmalloc ((frv_num_regs + frv_num_pseudo_regs) - * sizeof (char *)); + = (const char **) xmalloc ((frv_num_regs + frv_num_pseudo_regs) + * sizeof (const char *)); for (r = 0; r < frv_num_regs + frv_num_pseudo_regs; r++) var->register_names[r] = ""; @@ -299,16 +295,16 @@ frv_register_type (struct gdbarch *gdbarch, int reg) } static enum register_status -frv_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache, +frv_pseudo_register_read (struct gdbarch *gdbarch, readable_regcache *regcache, int reg, gdb_byte *buffer) { enum register_status status; if (reg == iacc0_regnum) { - status = regcache_raw_read (regcache, iacc0h_regnum, buffer); + status = regcache->raw_read (iacc0h_regnum, buffer); if (status == REG_VALID) - status = regcache_raw_read (regcache, iacc0l_regnum, (bfd_byte *) buffer + 4); + status = regcache->raw_read (iacc0l_regnum, (bfd_byte *) buffer + 4); } else if (accg0_regnum <= reg && reg <= accg7_regnum) { @@ -319,7 +315,7 @@ frv_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache, int byte_num = (reg - accg0_regnum) % 4; gdb_byte buf[4]; - status = regcache_raw_read (regcache, raw_regnum, buf); + status = regcache->raw_read (raw_regnum, buf); if (status == REG_VALID) { memset (buffer, 0, 4); @@ -341,8 +337,8 @@ frv_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache, { if (reg == iacc0_regnum) { - regcache_raw_write (regcache, iacc0h_regnum, buffer); - regcache_raw_write (regcache, iacc0l_regnum, (bfd_byte *) buffer + 4); + regcache->raw_write (iacc0h_regnum, buffer); + regcache->raw_write (iacc0l_regnum, (bfd_byte *) buffer + 4); } else if (accg0_regnum <= reg && reg <= accg7_regnum) { @@ -353,9 +349,9 @@ frv_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache, int byte_num = (reg - accg0_regnum) % 4; gdb_byte buf[4]; - regcache_raw_read (regcache, raw_regnum, buf); + regcache->raw_read (raw_regnum, buf); buf[byte_num] = ((bfd_byte *) buffer)[0]; - regcache_raw_write (regcache, raw_regnum, buf); + regcache->raw_write (raw_regnum, buf); } } @@ -426,13 +422,9 @@ frv_register_sim_regno (struct gdbarch *gdbarch, int reg) internal_error (__FILE__, __LINE__, _("Bad register number %d"), reg); } -static const unsigned char * -frv_breakpoint_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr, int *lenp) -{ - static unsigned char breakpoint[] = {0xc0, 0x70, 0x00, 0x01}; - *lenp = sizeof (breakpoint); - return breakpoint; -} +constexpr gdb_byte frv_break_insn[] = {0xc0, 0x70, 0x00, 0x01}; + +typedef BP_MANIPULATION (frv_break_insn) frv_breakpoint; /* Define the maximum number of instructions which may be packed into a bundle (VLIW instruction). */ @@ -1082,8 +1074,8 @@ frv_skip_main_prologue (struct gdbarch *gdbarch, CORE_ADDR pc) s = lookup_minimal_symbol_by_pc (call_dest); if (s.minsym != NULL - && SYMBOL_LINKAGE_NAME (s.minsym) != NULL - && strcmp (SYMBOL_LINKAGE_NAME (s.minsym), "__main") == 0) + && MSYMBOL_LINKAGE_NAME (s.minsym) != NULL + && strcmp (MSYMBOL_LINKAGE_NAME (s.minsym), "__main") == 0) { pc += 4; return pc; @@ -1101,7 +1093,7 @@ frv_frame_unwind_cache (struct frame_info *this_frame, struct frv_unwind_cache *info; if ((*this_prologue_cache)) - return (*this_prologue_cache); + return (struct frv_unwind_cache *) (*this_prologue_cache); info = FRAME_OBSTACK_ZALLOC (struct frv_unwind_cache); (*this_prologue_cache) = info; @@ -1118,7 +1110,7 @@ static void frv_extract_return_value (struct type *type, struct regcache *regcache, gdb_byte *valbuf) { - struct gdbarch *gdbarch = get_regcache_arch (regcache); + struct gdbarch *gdbarch = regcache->arch (); enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); int len = TYPE_LENGTH (type); @@ -1335,12 +1327,12 @@ frv_store_return_value (struct type *type, struct regcache *regcache, bfd_byte val[4]; memset (val, 0, sizeof (val)); memcpy (val + (4 - len), valbuf, len); - regcache_cooked_write (regcache, 8, val); + regcache->cooked_write (8, val); } else if (len == 8) { - regcache_cooked_write (regcache, 8, valbuf); - regcache_cooked_write (regcache, 9, (bfd_byte *) valbuf + 4); + regcache->cooked_write (8, valbuf); + regcache->cooked_write (9, (bfd_byte *) valbuf + 4); } else internal_error (__FILE__, __LINE__, @@ -1391,7 +1383,7 @@ frv_frame_this_id (struct frame_info *this_frame, = frv_frame_unwind_cache (this_frame, this_prologue_cache); CORE_ADDR base; CORE_ADDR func; - struct minimal_symbol *msym_stack; + struct bound_minimal_symbol msym_stack; struct frame_id id; /* The FUNC is easy. */ @@ -1399,7 +1391,7 @@ frv_frame_this_id (struct frame_info *this_frame, /* Check if the stack is empty. */ msym_stack = lookup_minimal_symbol ("_stack", NULL, NULL); - if (msym_stack && info->base == SYMBOL_VALUE_ADDRESS (msym_stack)) + if (msym_stack.minsym && info->base == BMSYMBOL_VALUE_ADDRESS (msym_stack)) return; /* Hopefully the prologue analysis either correctly determined the @@ -1483,6 +1475,7 @@ frv_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) { case bfd_mach_frv: case bfd_mach_frvsimple: + case bfd_mach_fr300: case bfd_mach_fr500: case bfd_mach_frvtomcat: case bfd_mach_fr550: @@ -1538,7 +1531,8 @@ frv_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_skip_prologue (gdbarch, frv_skip_prologue); set_gdbarch_skip_main_prologue (gdbarch, frv_skip_main_prologue); - set_gdbarch_breakpoint_from_pc (gdbarch, frv_breakpoint_from_pc); + set_gdbarch_breakpoint_kind_from_pc (gdbarch, frv_breakpoint::kind_from_pc); + set_gdbarch_sw_breakpoint_from_kind (gdbarch, frv_breakpoint::bp_from_kind); set_gdbarch_adjust_breakpoint_address (gdbarch, frv_adjust_breakpoint_address); @@ -1564,6 +1558,7 @@ frv_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) { case bfd_mach_frv: case bfd_mach_frvsimple: + case bfd_mach_fr300: case bfd_mach_fr500: case bfd_mach_frvtomcat: /* fr500-style hardware debugging support. */ @@ -1585,7 +1580,6 @@ frv_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) break; } - set_gdbarch_print_insn (gdbarch, print_insn_frv); if (frv_abi (gdbarch) == FRV_ABI_FDPIC) set_gdbarch_convert_from_func_ptr_addr (gdbarch, frv_convert_from_func_ptr_addr);