X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fxtensa-tdep.c;h=3a3badab1970642a91a92f0cc5680aa4b6c0fc07;hb=a14d1f4dfc08edc8fe92b17b36a55d89203fb89f;hp=3cdb27a2672022c55870896a3b65ba220993b2cd;hpb=8acc9f485bba28b65935dcc3498d9f3b712ddac7;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/xtensa-tdep.c b/gdb/xtensa-tdep.c index 3cdb27a267..3a3badab19 100644 --- a/gdb/xtensa-tdep.c +++ b/gdb/xtensa-tdep.c @@ -1,6 +1,6 @@ /* Target-dependent code for the Xtensa port of GDB, the GNU debugger. - Copyright (C) 2003-2013 Free Software Foundation, Inc. + Copyright (C) 2003-2016 Free Software Foundation, Inc. This file is part of GDB. @@ -28,6 +28,7 @@ #include "value.h" #include "dis-asm.h" #include "inferior.h" +#include "osabi.h" #include "floatformat.h" #include "regcache.h" #include "reggroups.h" @@ -37,7 +38,6 @@ #include "dwarf2.h" #include "dwarf2-frame.h" #include "dwarf2loc.h" -#include "frame.h" #include "frame-base.h" #include "frame-unwind.h" @@ -48,7 +48,6 @@ #include "command.h" #include "gdbcmd.h" -#include "gdb_assert.h" #include "xtensa-isa.h" #include "xtensa-tdep.h" @@ -318,7 +317,8 @@ xtensa_register_type (struct gdbarch *gdbarch, int regnum) if (tp == NULL) { char *name = xstrprintf ("int%d", size * 8); - tp = xmalloc (sizeof (struct ctype_cache)); + + tp = XNEW (struct ctype_cache); tp->next = tdep->type_entries; tdep->type_entries = tp; tp->size = size; @@ -356,9 +356,7 @@ xtensa_reg_to_regnum (struct gdbarch *gdbarch, int regnum) if (regnum == gdbarch_tdep (gdbarch)->regmap[i].target_number) return i; - internal_error (__FILE__, __LINE__, - _("invalid dwarf/stabs register number %d"), regnum); - return 0; + return -1; } @@ -555,10 +553,6 @@ xtensa_pseudo_register_read (struct gdbarch *gdbarch, DEBUGTRACE ("xtensa_pseudo_register_read (... regnum = %d (%s) ...)\n", regnum, xtensa_register_name (gdbarch, regnum)); - if (regnum == gdbarch_num_regs (gdbarch) - + gdbarch_num_pseudo_regs (gdbarch) - 1) - regnum = gdbarch_tdep (gdbarch)->a0_base + 1; - /* Read aliases a0..a15, if this is a Windowed ABI. */ if (gdbarch_tdep (gdbarch)->isa_use_windowed_registers && (regnum >= gdbarch_tdep (gdbarch)->a0_base) @@ -655,10 +649,6 @@ xtensa_pseudo_register_write (struct gdbarch *gdbarch, DEBUGTRACE ("xtensa_pseudo_register_write (... regnum = %d (%s) ...)\n", regnum, xtensa_register_name (gdbarch, regnum)); - if (regnum == gdbarch_num_regs (gdbarch) - + gdbarch_num_pseudo_regs (gdbarch) -1) - regnum = gdbarch_tdep (gdbarch)->a0_base + 1; - /* Renumber register, if aliase a0..a15 on Windowed ABI. */ if (gdbarch_tdep (gdbarch)->isa_use_windowed_registers && (regnum >= gdbarch_tdep (gdbarch)->a0_base) @@ -859,7 +849,7 @@ xtensa_supply_gregset (const struct regset *regset, const void *gregs, size_t len) { - const xtensa_elf_gregset_t *regs = gregs; + const xtensa_elf_gregset_t *regs = (const xtensa_elf_gregset_t *) gregs; struct gdbarch *gdbarch = get_regcache_arch (rc); int i; @@ -912,23 +902,18 @@ xtensa_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 * -xtensa_regset_from_core_section (struct gdbarch *core_arch, - const char *sect_name, - size_t sect_size) +static void +xtensa_iterate_over_regset_sections (struct gdbarch *gdbarch, + iterate_over_regset_sections_cb *cb, + void *cb_data, + const struct regcache *regcache) { - DEBUGTRACE ("xtensa_regset_from_core_section " - "(..., sect_name==\"%s\", sect_size==%x)\n", - sect_name, (unsigned int) sect_size); + DEBUGTRACE ("xtensa_iterate_over_regset_sections\n"); - if (strcmp (sect_name, ".reg") == 0 - && sect_size >= sizeof(xtensa_elf_gregset_t)) - return &xtensa_gregset; - - return NULL; + cb (".reg", sizeof (xtensa_elf_gregset_t), &xtensa_gregset, + NULL, cb_data); } @@ -1154,7 +1139,7 @@ xtensa_scan_prologue (struct gdbarch *gdbarch, CORE_ADDR current_pc) CORE_ADDR start_addr; xtensa_isa isa; xtensa_insnbuf ins, slot; - char ibuf[XTENSA_ISA_BSZ]; + gdb_byte ibuf[XTENSA_ISA_BSZ]; CORE_ADDR ia, bt, ba; xtensa_format ifmt; int ilen, islots, is; @@ -1285,7 +1270,7 @@ xtensa_frame_cache (struct frame_info *this_frame, void **this_cache) int windowed, ps_regnum; if (*this_cache) - return *this_cache; + return (struct xtensa_frame_cache *) *this_cache; pc = get_frame_register_unsigned (this_frame, gdbarch_pc_regnum (gdbarch)); ps_regnum = gdbarch_ps_regnum (gdbarch); @@ -1300,7 +1285,7 @@ xtensa_frame_cache (struct frame_info *this_frame, void **this_cache) if (windowed) { - char op1; + LONGEST op1; /* Get WINDOWBASE, WINDOWSTART, and PS registers. */ wb = get_frame_register_unsigned (this_frame, @@ -1308,8 +1293,8 @@ xtensa_frame_cache (struct frame_info *this_frame, void **this_cache) ws = get_frame_register_unsigned (this_frame, gdbarch_tdep (gdbarch)->ws_regnum); - op1 = read_memory_integer (pc, 1, byte_order); - if (XTENSA_IS_ENTRY (gdbarch, op1)) + if (safe_read_memory_integer (pc, 1, byte_order, &op1) + && XTENSA_IS_ENTRY (gdbarch, op1)) { int callinc = CALLINC (ps); ra = get_frame_register_unsigned @@ -1465,7 +1450,7 @@ xtensa_frame_prev_register (struct frame_info *this_frame, if (*this_cache == NULL) *this_cache = xtensa_frame_cache (this_frame, this_cache); - cache = *this_cache; + cache = (struct xtensa_frame_cache *) *this_cache; if (regnum ==gdbarch_pc_regnum (gdbarch)) saved_reg = cache->ra; @@ -1579,7 +1564,7 @@ xtensa_extract_return_value (struct type *type, void *dst) { struct gdbarch *gdbarch = get_regcache_arch (regcache); - bfd_byte *valbuf = dst; + bfd_byte *valbuf = (bfd_byte *) dst; int len = TYPE_LENGTH (type); ULONGEST pc, wb; int callsize, areg; @@ -1635,7 +1620,7 @@ xtensa_store_return_value (struct type *type, const void *dst) { struct gdbarch *gdbarch = get_regcache_arch (regcache); - const bfd_byte *valbuf = dst; + const bfd_byte *valbuf = (const bfd_byte *) dst; unsigned int areg; ULONGEST pc, wb; int callsize; @@ -2032,7 +2017,7 @@ call0_ret (CORE_ADDR start_pc, CORE_ADDR finish_pc) #define RETURN_RET goto done xtensa_isa isa; xtensa_insnbuf ins, slot; - char ibuf[XTENSA_ISA_BSZ]; + gdb_byte ibuf[XTENSA_ISA_BSZ]; CORE_ADDR ia, bt, ba; xtensa_format ifmt; int ilen, islots, is; @@ -2390,7 +2375,7 @@ call0_analyze_prologue (struct gdbarch *gdbarch, CORE_ADDR ia; /* Current insn address in prologue. */ CORE_ADDR ba = 0; /* Current address at base of insn buffer. */ CORE_ADDR bt; /* Current address at top+1 of insn buffer. */ - char ibuf[XTENSA_ISA_BSZ];/* Instruction buffer for decoding prologue. */ + gdb_byte ibuf[XTENSA_ISA_BSZ];/* Instruction buffer for decoding prologue. */ xtensa_isa isa; /* libisa ISA handle. */ xtensa_insnbuf ins, slot; /* libisa handle to decoded insn, slot. */ xtensa_format ifmt; /* libisa instruction format. */ @@ -2805,7 +2790,7 @@ execute_code (struct gdbarch *gdbarch, CORE_ADDR current_pc, CORE_ADDR wb) { xtensa_isa isa; xtensa_insnbuf ins, slot; - char ibuf[XTENSA_ISA_BSZ]; + gdb_byte ibuf[XTENSA_ISA_BSZ]; CORE_ADDR ia, bt, ba; xtensa_format ifmt; int ilen, islots, is; @@ -2814,7 +2799,7 @@ execute_code (struct gdbarch *gdbarch, CORE_ADDR current_pc, CORE_ADDR wb) int fail = 0; void (*func) (struct gdbarch *, int, int, int, CORE_ADDR); - int at, as, offset; + uint32_t at, as, offset; /* WindowUnderflow12 = true, when inside _WindowUnderflow12. */ int WindowUnderflow12 = (current_pc & 0x1ff) >= 0x140; @@ -3282,12 +3267,15 @@ xtensa_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) xtensa_add_reggroups (gdbarch); set_gdbarch_register_reggroup_p (gdbarch, xtensa_register_reggroup_p); - set_gdbarch_regset_from_core_section (gdbarch, - xtensa_regset_from_core_section); + set_gdbarch_iterate_over_regset_sections + (gdbarch, xtensa_iterate_over_regset_sections); set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_ilp32_fetch_link_map_offsets); + /* Hook in the ABI-specific overrides, if they have been registered. */ + gdbarch_init_osabi (info, gdbarch); + return gdbarch; }