X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Frx-tdep.c;h=7d0436c33f37ba209a8887f478fecbb3f51fb22b;hb=f7b7ed97a23e2bf4a2ec27bef0fe0af55a080a94;hp=2732608d618aa6c5f586cf3390319fcd36c3f1c5;hpb=618f726fcb851883a0094aa7fa17003889b7189f;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/rx-tdep.c b/gdb/rx-tdep.c index 2732608d61..7d0436c33f 100644 --- a/gdb/rx-tdep.c +++ b/gdb/rx-tdep.c @@ -1,6 +1,6 @@ /* Target-dependent code for the Renesas RX for GDB, the GNU debugger. - Copyright (C) 2008-2016 Free Software Foundation, Inc. + Copyright (C) 2008-2017 Free Software Foundation, Inc. Contributed by Red Hat, Inc. @@ -36,6 +36,7 @@ #include "elf/rx.h" #include "elf-bfd.h" +#include /* Certain important register numbers. */ enum @@ -149,6 +150,66 @@ rx_register_name (struct gdbarch *gdbarch, int regnr) return reg_names[regnr]; } +/* Construct the flags type for PSW and BPSW. */ + +static struct type * +rx_psw_type (struct gdbarch *gdbarch) +{ + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + + if (tdep->rx_psw_type == NULL) + { + tdep->rx_psw_type = arch_flags_type (gdbarch, "rx_psw_type", 32); + append_flags_type_flag (tdep->rx_psw_type, 0, "C"); + append_flags_type_flag (tdep->rx_psw_type, 1, "Z"); + append_flags_type_flag (tdep->rx_psw_type, 2, "S"); + append_flags_type_flag (tdep->rx_psw_type, 3, "O"); + append_flags_type_flag (tdep->rx_psw_type, 16, "I"); + append_flags_type_flag (tdep->rx_psw_type, 17, "U"); + append_flags_type_flag (tdep->rx_psw_type, 20, "PM"); + append_flags_type_flag (tdep->rx_psw_type, 24, "IPL0"); + append_flags_type_flag (tdep->rx_psw_type, 25, "IPL1"); + append_flags_type_flag (tdep->rx_psw_type, 26, "IPL2"); + append_flags_type_flag (tdep->rx_psw_type, 27, "IPL3"); + } + return tdep->rx_psw_type; +} + +/* Construct flags type for FPSW. */ + +static struct type * +rx_fpsw_type (struct gdbarch *gdbarch) +{ + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + + if (tdep->rx_fpsw_type == NULL) + { + tdep->rx_fpsw_type = arch_flags_type (gdbarch, "rx_fpsw_type", 32); + append_flags_type_flag (tdep->rx_fpsw_type, 0, "RM0"); + append_flags_type_flag (tdep->rx_fpsw_type, 1, "RM1"); + append_flags_type_flag (tdep->rx_fpsw_type, 2, "CV"); + append_flags_type_flag (tdep->rx_fpsw_type, 3, "CO"); + append_flags_type_flag (tdep->rx_fpsw_type, 4, "CZ"); + append_flags_type_flag (tdep->rx_fpsw_type, 5, "CU"); + append_flags_type_flag (tdep->rx_fpsw_type, 6, "CX"); + append_flags_type_flag (tdep->rx_fpsw_type, 7, "CE"); + append_flags_type_flag (tdep->rx_fpsw_type, 8, "DN"); + append_flags_type_flag (tdep->rx_fpsw_type, 10, "EV"); + append_flags_type_flag (tdep->rx_fpsw_type, 11, "EO"); + append_flags_type_flag (tdep->rx_fpsw_type, 12, "EZ"); + append_flags_type_flag (tdep->rx_fpsw_type, 13, "EU"); + append_flags_type_flag (tdep->rx_fpsw_type, 14, "EX"); + append_flags_type_flag (tdep->rx_fpsw_type, 26, "FV"); + append_flags_type_flag (tdep->rx_fpsw_type, 27, "FO"); + append_flags_type_flag (tdep->rx_fpsw_type, 28, "FZ"); + append_flags_type_flag (tdep->rx_fpsw_type, 29, "FU"); + append_flags_type_flag (tdep->rx_fpsw_type, 30, "FX"); + append_flags_type_flag (tdep->rx_fpsw_type, 31, "FS"); + } + + return tdep->rx_fpsw_type; +} + /* Implement the "register_type" gdbarch method. */ static struct type * rx_register_type (struct gdbarch *gdbarch, int reg_nr) @@ -158,9 +219,9 @@ rx_register_type (struct gdbarch *gdbarch, int reg_nr) if (reg_nr == RX_PC_REGNUM) return builtin_type (gdbarch)->builtin_func_ptr; else if (reg_nr == RX_PSW_REGNUM || reg_nr == RX_BPSW_REGNUM) - return tdep->rx_psw_type; + return rx_psw_type (gdbarch); else if (reg_nr == RX_FPSW_REGNUM) - return tdep->rx_fpsw_type; + return rx_fpsw_type (gdbarch); else if (reg_nr == RX_ACC_REGNUM) return builtin_type (gdbarch)->builtin_unsigned_long_long; else @@ -169,7 +230,7 @@ rx_register_type (struct gdbarch *gdbarch, int reg_nr) /* Function for finding saved registers in a 'struct pv_area'; this - function is passed to pv_area_scan. + function is passed to pv_area::scan. If VALUE is a saved register, ADDR says it was saved at a constant offset from the frame base, and SIZE indicates that the whole @@ -226,8 +287,6 @@ rx_analyze_prologue (CORE_ADDR start_pc, CORE_ADDR limit_pc, CORE_ADDR pc, next_pc; int rn; pv_t reg[RX_NUM_REGS]; - struct pv_area *stack; - struct cleanup *back_to; CORE_ADDR after_last_frame_setup_insn = start_pc; memset (result, 0, sizeof (*result)); @@ -240,8 +299,7 @@ rx_analyze_prologue (CORE_ADDR start_pc, CORE_ADDR limit_pc, result->reg_offset[rn] = 1; } - stack = make_pv_area (RX_SP_REGNUM, gdbarch_addr_bit (target_gdbarch ())); - back_to = make_cleanup_free_pv_area (stack); + pv_area stack (RX_SP_REGNUM, gdbarch_addr_bit (target_gdbarch ())); if (frame_type == RX_FRAME_TYPE_FAST_INTERRUPT) { @@ -257,13 +315,13 @@ rx_analyze_prologue (CORE_ADDR start_pc, CORE_ADDR limit_pc, if (frame_type == RX_FRAME_TYPE_EXCEPTION) { reg[RX_SP_REGNUM] = pv_add_constant (reg[RX_SP_REGNUM], -4); - pv_area_store (stack, reg[RX_SP_REGNUM], 4, reg[RX_PSW_REGNUM]); + stack.store (reg[RX_SP_REGNUM], 4, reg[RX_PSW_REGNUM]); } /* The call instruction (or an exception/interrupt) has saved the return address on the stack. */ reg[RX_SP_REGNUM] = pv_add_constant (reg[RX_SP_REGNUM], -4); - pv_area_store (stack, reg[RX_SP_REGNUM], 4, reg[RX_PC_REGNUM]); + stack.store (reg[RX_SP_REGNUM], 4, reg[RX_PC_REGNUM]); } @@ -292,7 +350,7 @@ rx_analyze_prologue (CORE_ADDR start_pc, CORE_ADDR limit_pc, for (r = r2; r >= r1; r--) { reg[RX_SP_REGNUM] = pv_add_constant (reg[RX_SP_REGNUM], -4); - pv_area_store (stack, reg[RX_SP_REGNUM], 4, reg[r]); + stack.store (reg[RX_SP_REGNUM], 4, reg[r]); } after_last_frame_setup_insn = next_pc; } @@ -319,7 +377,7 @@ rx_analyze_prologue (CORE_ADDR start_pc, CORE_ADDR limit_pc, rsrc = opc.op[1].reg; reg[RX_SP_REGNUM] = pv_add_constant (reg[RX_SP_REGNUM], -4); - pv_area_store (stack, reg[RX_SP_REGNUM], 4, reg[rsrc]); + stack.store (reg[RX_SP_REGNUM], 4, reg[rsrc]); after_last_frame_setup_insn = next_pc; } else if (opc.id == RXO_add /* add #const, rsrc, rdst */ @@ -395,11 +453,9 @@ rx_analyze_prologue (CORE_ADDR start_pc, CORE_ADDR limit_pc, } /* Record where all the registers were saved. */ - pv_area_scan (stack, check_for_saved, (void *) result); + stack.scan (check_for_saved, (void *) result); result->prologue_end = after_last_frame_setup_insn; - - do_cleanups (back_to); } @@ -813,7 +869,8 @@ rx_push_dummy_call (struct gdbarch *gdbarch, struct value *function, struct_addr); } else if (TYPE_CODE (arg_type) != TYPE_CODE_STRUCT - && TYPE_CODE (arg_type) != TYPE_CODE_UNION) + && TYPE_CODE (arg_type) != TYPE_CODE_UNION + && arg_size <= 8) { /* Argument is a scalar. */ if (arg_size == 8) @@ -896,7 +953,7 @@ rx_push_dummy_call (struct gdbarch *gdbarch, struct value *function, && arg_size <= 4 * (RX_R4_REGNUM - arg_reg + 1) && arg_size % 4 == 0) { - int len = min (arg_size, 4); + int len = std::min (arg_size, (ULONGEST) 4); if (write_pass) regcache_cooked_write_unsigned (regcache, arg_reg, @@ -959,7 +1016,7 @@ rx_return_value (struct gdbarch *gdbarch, while (valtype_len > 0) { - int len = min (valtype_len, 4); + int len = std::min (valtype_len, (ULONGEST) 4); regcache_cooked_read_unsigned (regcache, argreg, &u); store_unsigned_integer (readbuf + offset, len, byte_order, u); @@ -977,7 +1034,7 @@ rx_return_value (struct gdbarch *gdbarch, while (valtype_len > 0) { - int len = min (valtype_len, 4); + int len = std::min (valtype_len, (ULONGEST) 4); u = extract_unsigned_integer (writebuf + offset, len, byte_order); regcache_cooked_write_unsigned (regcache, argreg, u); @@ -990,14 +1047,9 @@ rx_return_value (struct gdbarch *gdbarch, return RETURN_VALUE_REGISTER_CONVENTION; } -/* Implement the "breakpoint_from_pc" gdbarch method. */ -static const gdb_byte * -rx_breakpoint_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr, int *lenptr) -{ - static gdb_byte breakpoint[] = { 0x00 }; - *lenptr = sizeof breakpoint; - return breakpoint; -} +constexpr gdb_byte rx_break_insn[] = { 0x00 }; + +typedef BP_MANIPULATION (rx_break_insn) rx_breakpoint; /* Implement the dwarf_reg_to_regnum" gdbarch method. */ @@ -1044,49 +1096,10 @@ rx_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) /* None found, create a new architecture from the information provided. */ - tdep = XNEW (struct gdbarch_tdep); + tdep = XCNEW (struct gdbarch_tdep); gdbarch = gdbarch_alloc (&info, tdep); tdep->elf_flags = elf_flags; - /* Initialize the flags type for PSW and BPSW. */ - - tdep->rx_psw_type = arch_flags_type (gdbarch, "rx_psw_type", 4); - append_flags_type_flag (tdep->rx_psw_type, 0, "C"); - append_flags_type_flag (tdep->rx_psw_type, 1, "Z"); - append_flags_type_flag (tdep->rx_psw_type, 2, "S"); - append_flags_type_flag (tdep->rx_psw_type, 3, "O"); - append_flags_type_flag (tdep->rx_psw_type, 16, "I"); - append_flags_type_flag (tdep->rx_psw_type, 17, "U"); - append_flags_type_flag (tdep->rx_psw_type, 20, "PM"); - append_flags_type_flag (tdep->rx_psw_type, 24, "IPL0"); - append_flags_type_flag (tdep->rx_psw_type, 25, "IPL1"); - append_flags_type_flag (tdep->rx_psw_type, 26, "IPL2"); - append_flags_type_flag (tdep->rx_psw_type, 27, "IPL3"); - - /* Initialize flags type for FPSW. */ - - tdep->rx_fpsw_type = arch_flags_type (gdbarch, "rx_fpsw_type", 4); - append_flags_type_flag (tdep->rx_fpsw_type, 0, "RM0"); - append_flags_type_flag (tdep->rx_fpsw_type, 1, "RM1"); - append_flags_type_flag (tdep->rx_fpsw_type, 2, "CV"); - append_flags_type_flag (tdep->rx_fpsw_type, 3, "CO"); - append_flags_type_flag (tdep->rx_fpsw_type, 4, "CZ"); - append_flags_type_flag (tdep->rx_fpsw_type, 5, "CU"); - append_flags_type_flag (tdep->rx_fpsw_type, 6, "CX"); - append_flags_type_flag (tdep->rx_fpsw_type, 7, "CE"); - append_flags_type_flag (tdep->rx_fpsw_type, 8, "DN"); - append_flags_type_flag (tdep->rx_fpsw_type, 10, "EV"); - append_flags_type_flag (tdep->rx_fpsw_type, 11, "EO"); - append_flags_type_flag (tdep->rx_fpsw_type, 12, "EZ"); - append_flags_type_flag (tdep->rx_fpsw_type, 13, "EU"); - append_flags_type_flag (tdep->rx_fpsw_type, 14, "EX"); - append_flags_type_flag (tdep->rx_fpsw_type, 26, "FV"); - append_flags_type_flag (tdep->rx_fpsw_type, 27, "FO"); - append_flags_type_flag (tdep->rx_fpsw_type, 28, "FZ"); - append_flags_type_flag (tdep->rx_fpsw_type, 29, "FU"); - append_flags_type_flag (tdep->rx_fpsw_type, 30, "FX"); - append_flags_type_flag (tdep->rx_fpsw_type, 31, "FS"); - set_gdbarch_num_regs (gdbarch, RX_NUM_REGS); set_gdbarch_num_pseudo_regs (gdbarch, 0); set_gdbarch_register_name (gdbarch, rx_register_name); @@ -1095,11 +1108,10 @@ rx_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_sp_regnum (gdbarch, RX_SP_REGNUM); set_gdbarch_inner_than (gdbarch, core_addr_lessthan); set_gdbarch_decr_pc_after_break (gdbarch, 1); - set_gdbarch_breakpoint_from_pc (gdbarch, rx_breakpoint_from_pc); + set_gdbarch_breakpoint_kind_from_pc (gdbarch, rx_breakpoint::kind_from_pc); + set_gdbarch_sw_breakpoint_from_kind (gdbarch, rx_breakpoint::bp_from_kind); set_gdbarch_skip_prologue (gdbarch, rx_skip_prologue); - set_gdbarch_print_insn (gdbarch, print_insn_rx); - set_gdbarch_unwind_pc (gdbarch, rx_unwind_pc); set_gdbarch_unwind_sp (gdbarch, rx_unwind_sp); @@ -1148,9 +1160,6 @@ rx_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) return gdbarch; } -/* -Wmissing-prototypes */ -extern initialize_file_ftype _initialize_rx_tdep; - /* Register the above initialization routine. */ void