X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Ftilegx-tdep.c;h=fd42a350473193d4991f7e01f72ea47261db5d31;hb=eb115069323087e15210c09e3b581be0f6fb5852;hp=01742e8aa2c77db1ef9a91896a8af999f1492997;hpb=dccbb60975cdbcd6a906a79d0c4308b040fdac1b;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/tilegx-tdep.c b/gdb/tilegx-tdep.c index 01742e8aa2..fd42a35047 100644 --- a/gdb/tilegx-tdep.c +++ b/gdb/tilegx-tdep.c @@ -1,6 +1,6 @@ /* Target-dependent code for the Tilera TILE-Gx processor. - Copyright (C) 2012-2014 Free Software Foundation, Inc. + Copyright (C) 2012-2017 Free Software Foundation, Inc. This file is part of GDB. @@ -30,7 +30,6 @@ #include "value.h" #include "dis-asm.h" #include "inferior.h" -#include #include "arch-utils.h" #include "floatformat.h" #include "regcache.h" @@ -42,6 +41,7 @@ #include "solib-svr4.h" #include "tilegx-tdep.h" #include "opcode/tilegx.h" +#include struct tilegx_frame_cache { @@ -289,7 +289,7 @@ tilegx_push_dummy_call (struct gdbarch *gdbarch, CORE_ADDR stack_dest = sp; int argreg = TILEGX_R0_REGNUM; int i, j; - int typelen, slacklen, alignlen; + int typelen, slacklen; static const gdb_byte four_zero_words[16] = { 0 }; /* If struct_return is 1, then the struct return address will @@ -334,7 +334,7 @@ tilegx_push_dummy_call (struct gdbarch *gdbarch, typelen = TYPE_LENGTH (value_enclosing_type (args[j])); slacklen = align_up (typelen, 8) - typelen; - val = xmalloc (typelen + slacklen); + val = (gdb_byte *) xmalloc (typelen + slacklen); back_to = make_cleanup (xfree, val); memcpy (val, contents, typelen); memset (val + typelen, 0, slacklen); @@ -376,9 +376,6 @@ tilegx_analyze_prologue (struct gdbarch* gdbarch, enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); CORE_ADDR next_addr; CORE_ADDR prolog_end = end_addr; - ULONGEST inst, inst2; - LONGEST offset; - int regnum; gdb_byte instbuf[32 * TILEGX_BUNDLE_SIZE_IN_BYTES]; CORE_ADDR instbuf_start; unsigned int instbuf_size; @@ -432,13 +429,14 @@ tilegx_analyze_prologue (struct gdbarch* gdbarch, if (instbuf_size > size_on_same_page) instbuf_size = size_on_same_page; - instbuf_size = min (instbuf_size, (end_addr - next_addr)); + instbuf_size = std::min ((CORE_ADDR) instbuf_size, + (end_addr - next_addr)); instbuf_start = next_addr; status = safe_frame_unwind_memory (next_frame, instbuf_start, instbuf, instbuf_size); if (status == 0) - memory_error (status, next_addr); + memory_error (TARGET_XFER_E_IO, next_addr); } reverse_frame_valid = 0; @@ -451,7 +449,7 @@ tilegx_analyze_prologue (struct gdbarch* gdbarch, for (i = 0; i < num_insns; i++) { struct tilegx_decoded_instruction *this_insn = &decoded[i]; - int64_t *operands = (int64_t *) this_insn->operand_values; + long long *operands = this_insn->operand_values; const struct tilegx_opcode *opcode = this_insn->opcode; switch (opcode->mnemonic) @@ -756,14 +754,14 @@ tilegx_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc) = skip_prologue_using_sal (gdbarch, func_start); if (post_prologue_pc != 0) - return max (start_pc, post_prologue_pc); + return std::max (start_pc, post_prologue_pc); } /* Don't straddle a section boundary. */ s = find_pc_section (start_pc); end_pc = start_pc + 8 * TILEGX_BUNDLE_SIZE_IN_BYTES; if (s != NULL) - end_pc = min (end_pc, obj_section_endaddr (s)); + end_pc = std::min (end_pc, obj_section_endaddr (s)); /* Otherwise, try to skip prologue the hard way. */ return tilegx_analyze_prologue (gdbarch, @@ -772,16 +770,15 @@ tilegx_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc) NULL, NULL); } -/* This is the implementation of gdbarch method in_function_epilogue_p. */ +/* This is the implementation of gdbarch method stack_frame_destroyed_p. */ static int -tilegx_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR pc) +tilegx_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc) { CORE_ADDR func_addr = 0, func_end = 0; if (find_pc_partial_function (pc, NULL, &func_addr, &func_end)) { - ULONGEST inst, inst2; CORE_ADDR addr = func_end - TILEGX_BUNDLE_SIZE_IN_BYTES; /* FIXME: Find the actual epilogue. */ @@ -845,19 +842,11 @@ tilegx_write_pc (struct regcache *regcache, CORE_ADDR pc) INT_SWINT_1_SIGRETURN); } -/* This is the implementation of gdbarch method breakpoint_from_pc. */ +/* 64-bit pattern for a { bpt ; nop } bundle. */ +constexpr gdb_byte tilegx_break_insn[] = + { 0x00, 0x50, 0x48, 0x51, 0xae, 0x44, 0x6a, 0x28 }; -static const unsigned char * -tilegx_breakpoint_from_pc (struct gdbarch *gdbarch, - CORE_ADDR *pcptr, int *lenptr) -{ - /* 64-bit pattern for a { bpt ; nop } bundle. */ - static const unsigned char breakpoint[] = - { 0x00, 0x50, 0x48, 0x51, 0xae, 0x44, 0x6a, 0x28 }; - - *lenptr = sizeof (breakpoint); - return breakpoint; -} +typedef BP_MANIPULATION (tilegx_break_insn) tilegx_breakpoint; /* Normal frames. */ @@ -867,10 +856,9 @@ tilegx_frame_cache (struct frame_info *this_frame, void **this_cache) struct gdbarch *gdbarch = get_frame_arch (this_frame); struct tilegx_frame_cache *cache; CORE_ADDR current_pc; - int i; if (*this_cache) - return *this_cache; + return (struct tilegx_frame_cache *) *this_cache; cache = FRAME_OBSTACK_ZALLOC (struct tilegx_frame_cache); *this_cache = cache; @@ -1052,8 +1040,7 @@ tilegx_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_skip_prologue (gdbarch, tilegx_skip_prologue); - set_gdbarch_in_function_epilogue_p (gdbarch, - tilegx_in_function_epilogue_p); + set_gdbarch_stack_frame_destroyed_p (gdbarch, tilegx_stack_frame_destroyed_p); /* Map debug registers into internal register numbers. */ set_gdbarch_dwarf2_reg_to_regnum (gdbarch, tilegx_dwarf2_reg_to_regnum); @@ -1062,7 +1049,10 @@ tilegx_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_push_dummy_call (gdbarch, tilegx_push_dummy_call); set_gdbarch_get_longjmp_target (gdbarch, tilegx_get_longjmp_target); set_gdbarch_write_pc (gdbarch, tilegx_write_pc); - set_gdbarch_breakpoint_from_pc (gdbarch, tilegx_breakpoint_from_pc); + set_gdbarch_breakpoint_kind_from_pc (gdbarch, + tilegx_breakpoint::kind_from_pc); + set_gdbarch_sw_breakpoint_from_kind (gdbarch, + tilegx_breakpoint::bp_from_kind); set_gdbarch_return_value (gdbarch, tilegx_return_value); set_gdbarch_print_insn (gdbarch, print_insn_tilegx);