X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Farc-tdep.c;h=fad91709786acffa0790f1b7b78cb1902d2d9edf;hb=0e6f30610fdb50b4974b349ed3673b744d03e9a9;hp=6ff6ba38f954a3810370529f7d797777a4022e84;hpb=981a3fb3594dddae266b7a5014c3001727200d7b;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/arc-tdep.c b/gdb/arc-tdep.c index 6ff6ba38f9..fad9170978 100644 --- a/gdb/arc-tdep.c +++ b/gdb/arc-tdep.c @@ -1,6 +1,6 @@ /* Target dependent code for ARC arhitecture, for GDB. - Copyright 2005-2017 Free Software Foundation, Inc. + Copyright 2005-2018 Free Software Foundation, Inc. Contributed by Synopsys Inc. This file is part of GDB. @@ -447,7 +447,7 @@ arc_insn_get_linear_next_pc (const struct arc_instruction &insn) static void arc_write_pc (struct regcache *regcache, CORE_ADDR new_pc) { - struct gdbarch *gdbarch = get_regcache_arch (regcache); + struct gdbarch *gdbarch = regcache->arch (); if (arc_debug) debug_printf ("arc: Writing PC, new value=%s\n", @@ -664,7 +664,7 @@ arc_push_dummy_call (struct gdbarch *gdbarch, struct value *function, /* Note we don't use write_unsigned here, since that would convert the byte order, but we are already in the correct byte order. */ - regcache_cooked_write (regcache, arg_reg, data); + regcache->cooked_write (arg_reg, data); data += ARC_REGISTER_SIZE; total_space -= ARC_REGISTER_SIZE; @@ -1014,7 +1014,7 @@ arc_is_in_prologue (struct gdbarch *gdbarch, const struct arc_instruction &insn, addr = pv_add_constant (regs[base_reg], arc_insn_get_memory_offset (insn)); - if (pv_area_store_would_trash (stack, addr)) + if (stack->store_would_trash (addr)) return false; if (insn.data_size_mode != ARC_SCALING_D) @@ -1031,7 +1031,7 @@ arc_is_in_prologue (struct gdbarch *gdbarch, const struct arc_instruction &insn, else size = ARC_REGISTER_SIZE; - pv_area_store (stack, addr, size, store_value); + stack->store (addr, size, store_value); } else { @@ -1040,16 +1040,15 @@ arc_is_in_prologue (struct gdbarch *gdbarch, const struct arc_instruction &insn, /* If this is a double store, than write N+1 register as well. */ pv_t store_value1 = regs[insn.operands[0].value]; pv_t store_value2 = regs[insn.operands[0].value + 1]; - pv_area_store (stack, addr, ARC_REGISTER_SIZE, store_value1); - pv_area_store (stack, - pv_add_constant (addr, ARC_REGISTER_SIZE), - ARC_REGISTER_SIZE, store_value2); + stack->store (addr, ARC_REGISTER_SIZE, store_value1); + stack->store (pv_add_constant (addr, ARC_REGISTER_SIZE), + ARC_REGISTER_SIZE, store_value2); } else { pv_t store_value = pv_constant (arc_insn_get_operand_value (insn, 0)); - pv_area_store (stack, addr, ARC_REGISTER_SIZE * 2, store_value); + stack->store (addr, ARC_REGISTER_SIZE * 2, store_value); } } @@ -1136,7 +1135,7 @@ arc_is_in_prologue (struct gdbarch *gdbarch, const struct arc_instruction &insn, /* Assume that if the last register (closest to new SP) can be written, then it is possible to write all of them. */ - if (pv_area_store_would_trash (stack, new_sp)) + if (stack->store_would_trash (new_sp)) return false; /* Current store address. */ @@ -1145,21 +1144,21 @@ arc_is_in_prologue (struct gdbarch *gdbarch, const struct arc_instruction &insn, if (is_fp_saved) { addr = pv_add_constant (addr, -ARC_REGISTER_SIZE); - pv_area_store (stack, addr, ARC_REGISTER_SIZE, regs[ARC_FP_REGNUM]); + stack->store (addr, ARC_REGISTER_SIZE, regs[ARC_FP_REGNUM]); } /* Registers are stored in backward order: from GP (R26) to R13. */ for (int i = ARC_R13_REGNUM + regs_saved - 1; i >= ARC_R13_REGNUM; i--) { addr = pv_add_constant (addr, -ARC_REGISTER_SIZE); - pv_area_store (stack, addr, ARC_REGISTER_SIZE, regs[i]); + stack->store (addr, ARC_REGISTER_SIZE, regs[i]); } if (is_blink_saved) { addr = pv_add_constant (addr, -ARC_REGISTER_SIZE); - pv_area_store (stack, addr, ARC_REGISTER_SIZE, - regs[ARC_BLINK_REGNUM]); + stack->store (addr, ARC_REGISTER_SIZE, + regs[ARC_BLINK_REGNUM]); } gdb_assert (pv_is_identical (addr, new_sp)); @@ -1271,9 +1270,7 @@ arc_analyze_prologue (struct gdbarch *gdbarch, const CORE_ADDR entrypoint, pv_t regs[ARC_LAST_CORE_REGNUM + 1]; for (int i = 0; i <= ARC_LAST_CORE_REGNUM; i++) regs[i] = pv_register (i, 0); - struct pv_area *stack = make_pv_area (ARC_SP_REGNUM, - gdbarch_addr_bit (gdbarch)); - struct cleanup *back_to = make_cleanup_free_pv_area (stack); + pv_area stack (ARC_SP_REGNUM, gdbarch_addr_bit (gdbarch)); CORE_ADDR current_prologue_end = entrypoint; @@ -1290,7 +1287,7 @@ arc_analyze_prologue (struct gdbarch *gdbarch, const CORE_ADDR entrypoint, /* If this instruction is in the prologue, fields in the cache will be updated, and the saved registers mask may be updated. */ - if (!arc_is_in_prologue (gdbarch, insn, regs, stack)) + if (!arc_is_in_prologue (gdbarch, insn, regs, &stack)) { /* Found an instruction that is not in the prologue. */ if (arc_debug) @@ -1320,12 +1317,11 @@ arc_analyze_prologue (struct gdbarch *gdbarch, const CORE_ADDR entrypoint, for (int i = 0; i <= ARC_LAST_CORE_REGNUM; i++) { CORE_ADDR offset; - if (pv_area_find_reg (stack, gdbarch, i, &offset)) + if (stack.find_reg (gdbarch, i, &offset)) cache->saved_regs[i].addr = offset; } } - do_cleanups (back_to); return current_prologue_end; } @@ -1961,6 +1957,15 @@ arc_tdesc_init (struct gdbarch_info info, const struct target_desc **tdesc, return TRUE; } +/* Implement the type_align gdbarch function. */ + +static ULONGEST +arc_type_align (struct gdbarch *gdbarch, struct type *type) +{ + type = check_typedef (type); + return std::min (4, TYPE_LENGTH (type)); +} + /* Implement the "init" gdbarch method. */ static struct gdbarch * @@ -1986,7 +1991,7 @@ arc_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_int_bit (gdbarch, 32); set_gdbarch_long_bit (gdbarch, 32); set_gdbarch_long_long_bit (gdbarch, 64); - set_gdbarch_long_long_align_bit (gdbarch, 32); + set_gdbarch_type_align (gdbarch, arc_type_align); set_gdbarch_float_bit (gdbarch, 32); set_gdbarch_float_format (gdbarch, floatformats_ieee_single); set_gdbarch_double_bit (gdbarch, 64);