X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fscore-tdep.c;h=0ec0e35943a017ad8569f76223b5811e157038fa;hb=40c75bc8b07abc5d5774ea1c439b69c96e7fd485;hp=1bba20b87d4e1f741253d4c7c7e47d71b2df22ee;hpb=22f13eb869197fc45a0da2a8a96b03d39809862e;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/score-tdep.c b/gdb/score-tdep.c index 1bba20b87d..0ec0e35943 100644 --- a/gdb/score-tdep.c +++ b/gdb/score-tdep.c @@ -1,7 +1,7 @@ /* Target-dependent code for the S+core architecture, for GDB, the GNU Debugger. - Copyright (C) 2006-2016 Free Software Foundation, Inc. + Copyright (C) 2006-2020 Free Software Foundation, Inc. Contributed by Qinwei (qinwei@sunnorth.com.cn) Contributed by Ching-Peng Lin (cplin@sunplus.com) @@ -64,18 +64,6 @@ score_register_type (struct gdbarch *gdbarch, int regnum) return builtin_type (gdbarch)->builtin_uint32; } -static CORE_ADDR -score_unwind_sp (struct gdbarch *gdbarch, struct frame_info *next_frame) -{ - return frame_unwind_register_unsigned (next_frame, SCORE_SP_REGNUM); -} - -static CORE_ADDR -score_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame) -{ - return frame_unwind_register_unsigned (next_frame, SCORE_PC_REGNUM); -} - static const char * score7_register_name (struct gdbarch *gdbarch, int regnum) { @@ -126,15 +114,6 @@ score_register_sim_regno (struct gdbarch *gdbarch, int regnum) } #endif -static int -score_print_insn (bfd_vma memaddr, struct disassemble_info *info) -{ - if (info->endian == BFD_ENDIAN_BIG) - return print_insn_big_score (memaddr, info); - else - return print_insn_little_score (memaddr, info); -} - static inst_t * score7_fetch_inst (struct gdbarch *gdbarch, CORE_ADDR addr, gdb_byte *memblock) { @@ -451,11 +430,11 @@ score_xfer_register (struct regcache *regcache, int regnum, int length, } if (readbuf != NULL) - regcache_cooked_read_part (regcache, regnum, reg_offset, length, - readbuf + buf_offset); + regcache->cooked_read_part (regnum, reg_offset, length, + readbuf + buf_offset); if (writebuf != NULL) - regcache_cooked_write_part (regcache, regnum, reg_offset, length, - writebuf + buf_offset); + regcache->cooked_write_part (regnum, reg_offset, length, + writebuf + buf_offset); } static enum return_value_convention @@ -487,14 +466,6 @@ score_return_value (struct gdbarch *gdbarch, struct value *function, } } -static struct frame_id -score_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame) -{ - return frame_id_build (get_frame_register_unsigned (this_frame, - SCORE_SP_REGNUM), - get_frame_pc (this_frame)); -} - static int score_type_needs_double_align (struct type *type) { @@ -520,7 +491,8 @@ static CORE_ADDR score_push_dummy_call (struct gdbarch *gdbarch, struct value *function, struct regcache *regcache, CORE_ADDR bp_addr, int nargs, struct value **args, CORE_ADDR sp, - int struct_return, CORE_ADDR struct_addr) + function_call_return_method return_method, + CORE_ADDR struct_addr) { enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); int argnum; @@ -544,7 +516,7 @@ score_push_dummy_call (struct gdbarch *gdbarch, struct value *function, /* Step 3, Check if struct return then save the struct address to r4 and increase the stack_offset by 4. */ - if (struct_return) + if (return_method == return_method_struct) { regcache_cooked_write_unsigned (regcache, argreg++, struct_addr); stack_offset += SCORE_REGSIZE; @@ -898,7 +870,7 @@ score7_analyze_prologue (CORE_ADDR startaddr, CORE_ADDR pc, inst_t *inst = NULL; if (memblock != NULL) { - /* Reading memory block from target succefully and got all + /* Reading memory block from target successfully and got all the instructions(from STARTADDR to PC) needed. */ score7_adjust_memblock_ptr (&memblock, prev_pc, cur_pc); inst = score7_fetch_inst (gdbarch, cur_pc, memblock); @@ -946,13 +918,15 @@ score7_analyze_prologue (CORE_ADDR startaddr, CORE_ADDR pc, && G_FLD (inst->v, 2, 0) == 0x0) { /* subei! r0, n */ - sp_offset += (int) pow (2, G_FLD (inst->v, 6, 3)); + sp_offset += (int) pow (2.0, G_FLD (inst->v, 6, 3)); } else if (G_FLD (inst->v, 14, 7) == 0xc0 && G_FLD (inst->v, 2, 0) == 0x0) { /* addei! r0, n */ - sp_offset -= (int) pow (2, G_FLD (inst->v, 6, 3)); + /* Solaris 11+gcc 5.5 has ambiguous overloads of pow, so we + pass 2.0 instead of 2 to get the right one. */ + sp_offset -= (int) pow (2.0, G_FLD (inst->v, 6, 3)); } } else @@ -1437,9 +1411,8 @@ score7_linux_supply_gregset(const struct regset *regset, collect function will store the PC in that slot. */ if ((regnum == -1 || regnum == SCORE_EPC_REGNUM) && size >= SCORE7_LINUX_EPC_OFFSET + 4) - regcache_raw_supply (regcache, SCORE_EPC_REGNUM, - (const gdb_byte *) buf - + SCORE7_LINUX_EPC_OFFSET); + regcache->raw_supply + (SCORE_EPC_REGNUM, (const gdb_byte *) buf + SCORE7_LINUX_EPC_OFFSET); } static const struct regset score7_linux_gregset = @@ -1457,8 +1430,8 @@ score7_linux_iterate_over_regset_sections (struct gdbarch *gdbarch, void *cb_data, const struct regcache *regcache) { - cb (".reg", SCORE7_LINUX_SIZEOF_GREGSET, &score7_linux_gregset, - NULL, cb_data); + cb (".reg", SCORE7_LINUX_SIZEOF_GREGSET, SCORE7_LINUX_SIZEOF_GREGSET, + &score7_linux_gregset, NULL, cb_data); } static struct gdbarch * @@ -1489,14 +1462,14 @@ score_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_register_type (gdbarch, score_register_type); set_gdbarch_frame_align (gdbarch, score_frame_align); set_gdbarch_inner_than (gdbarch, core_addr_lessthan); - set_gdbarch_unwind_sp (gdbarch, score_unwind_sp); - set_gdbarch_unwind_pc (gdbarch, score_unwind_pc); - set_gdbarch_print_insn (gdbarch, score_print_insn); switch (target_mach) { case bfd_mach_score7: - SET_GDBARCH_BREAKPOINT_MANIPULATION (score7); + set_gdbarch_breakpoint_kind_from_pc (gdbarch, + score7_breakpoint_kind_from_pc); + set_gdbarch_sw_breakpoint_from_kind (gdbarch, + score7_sw_breakpoint_from_kind); set_gdbarch_skip_prologue (gdbarch, score7_skip_prologue); set_gdbarch_stack_frame_destroyed_p (gdbarch, score7_stack_frame_destroyed_p); @@ -1508,7 +1481,10 @@ score_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) break; case bfd_mach_score3: - SET_GDBARCH_BREAKPOINT_MANIPULATION (score3); + set_gdbarch_breakpoint_kind_from_pc (gdbarch, + score3_breakpoint_kind_from_pc); + set_gdbarch_sw_breakpoint_from_kind (gdbarch, + score3_sw_breakpoint_from_kind); set_gdbarch_skip_prologue (gdbarch, score3_skip_prologue); set_gdbarch_stack_frame_destroyed_p (gdbarch, score3_stack_frame_destroyed_p); @@ -1523,7 +1499,6 @@ score_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) /* Dummy frame hooks. */ set_gdbarch_return_value (gdbarch, score_return_value); set_gdbarch_call_dummy_location (gdbarch, AT_ENTRY_POINT); - set_gdbarch_dummy_id (gdbarch, score_dummy_id); set_gdbarch_push_dummy_call (gdbarch, score_push_dummy_call); /* Normal frame hooks. */ @@ -1535,8 +1510,6 @@ score_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) return gdbarch; } -extern initialize_file_ftype _initialize_score_tdep; - void _initialize_score_tdep (void) {