X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fv850-tdep.c;h=d69ee3298283d2eef18a32eb8fadef3a94f39f18;hb=59b21252a88aa6ba488cfb19686d9cbad2577e76;hp=27740cabbd81ca65dfcfb9035ceda2e085c0f091;hpb=ecd75fc8eed3bde86036141228074a20e55dcfc9;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/v850-tdep.c b/gdb/v850-tdep.c index 27740cabbd..d69ee32982 100644 --- a/gdb/v850-tdep.c +++ b/gdb/v850-tdep.c @@ -1,6 +1,6 @@ /* Target-dependent code for the NEC V850 for GDB, the GNU debugger. - Copyright (C) 1996-2014 Free Software Foundation, Inc. + Copyright (C) 1996-2016 Free Software Foundation, Inc. This file is part of GDB. @@ -25,8 +25,6 @@ #include "dwarf2-frame.h" #include "gdbtypes.h" #include "inferior.h" -#include -#include "gdb_assert.h" #include "gdbcore.h" #include "arch-utils.h" #include "regcache.h" @@ -561,7 +559,7 @@ v850_use_struct_convention (struct gdbarch *gdbarch, struct type *type) if (TYPE_CODE (fld_type) == TYPE_CODE_ARRAY) { tgt_type = TYPE_TARGET_TYPE (fld_type); - if (TYPE_LENGTH (fld_type) >= 0 && TYPE_LENGTH (tgt_type) >= 0 + if (TYPE_LENGTH (tgt_type) > 0 && TYPE_LENGTH (fld_type) / TYPE_LENGTH (tgt_type) > 2) return 1; } @@ -1170,28 +1168,44 @@ v850_return_value (struct gdbarch *gdbarch, struct value *function, return RETURN_VALUE_REGISTER_CONVENTION; } -static const unsigned char * -v850_breakpoint_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr, - int *lenptr) -{ - static unsigned char breakpoint[] = { 0x85, 0x05 }; +/* Implement the breakpoint_kind_from_pc gdbarch method. */ - *lenptr = sizeof (breakpoint); - return breakpoint; +static int +v850_breakpoint_kind_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr) +{ + return 2; } -/* Implement software breakpoints by using the dbtrap instruction. - Older architectures had no such instruction. For those, an - unconditional branch to self instruction is used. */ +/* Implement the sw_breakpoint_from_kind gdbarch method. */ -static const unsigned char * -v850_dbtrap_breakpoint_from_pc (struct gdbarch *gdbarch, - CORE_ADDR *pcptr, int *lenptr) +static const gdb_byte * +v850_sw_breakpoint_from_kind (struct gdbarch *gdbarch, int kind, int *size) { - static unsigned char breakpoint[] = { 0x40, 0xf8 }; + *size = kind; + + switch (gdbarch_bfd_arch_info (gdbarch)->mach) + { + case bfd_mach_v850e2: + case bfd_mach_v850e2v3: + case bfd_mach_v850e3v5: + { + /* Implement software breakpoints by using the dbtrap instruction. + Older architectures had no such instruction. For those, an + unconditional branch to self instruction is used. */ + + static unsigned char dbtrap_breakpoint[] = { 0x40, 0xf8 }; + + return dbtrap_breakpoint; + } + break; + default: + { + static unsigned char breakpoint[] = { 0x85, 0x05 }; - *lenptr = sizeof (breakpoint); - return breakpoint; + return breakpoint; + } + break; + } } static struct v850_frame_cache * @@ -1222,7 +1236,7 @@ v850_frame_cache (struct frame_info *this_frame, void **this_cache) int i; if (*this_cache) - return *this_cache; + return (struct v850_frame_cache *) *this_cache; cache = v850_alloc_frame_cache (this_frame); *this_cache = cache; @@ -1382,7 +1396,7 @@ v850_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) return arches->gdbarch; } - tdep = (struct gdbarch_tdep *) xmalloc (sizeof (struct gdbarch_tdep)); + tdep = XNEW (struct gdbarch_tdep); tdep->e_flags = e_flags; tdep->e_machine = e_machine; @@ -1442,18 +1456,9 @@ v850_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_addr_bit (gdbarch, 4 * TARGET_CHAR_BIT); set_gdbarch_inner_than (gdbarch, core_addr_lessthan); - switch (info.bfd_arch_info->mach) - { - case bfd_mach_v850e2: - case bfd_mach_v850e2v3: - case bfd_mach_v850e3v5: - set_gdbarch_breakpoint_from_pc (gdbarch, v850_dbtrap_breakpoint_from_pc); - break; - default: - set_gdbarch_breakpoint_from_pc (gdbarch, v850_breakpoint_from_pc); - break; - } + set_gdbarch_breakpoint_kind_from_pc (gdbarch, v850_breakpoint_kind_from_pc); + set_gdbarch_sw_breakpoint_from_kind (gdbarch, v850_sw_breakpoint_from_kind); set_gdbarch_return_value (gdbarch, v850_return_value); set_gdbarch_push_dummy_call (gdbarch, v850_push_dummy_call); set_gdbarch_skip_prologue (gdbarch, v850_skip_prologue);