X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fmsp430-tdep.c;h=947a669f28fbac3735bb600d71b4e83082cbede1;hb=b61121178ec07f9da1242e439fe1a23a314ad30e;hp=d730e1bec4528b3986706cb28206ebf89c34d26a;hpb=39503f82427e22ed8e04d986ccdc8562091ec62e;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/msp430-tdep.c b/gdb/msp430-tdep.c index d730e1bec4..947a669f28 100644 --- a/gdb/msp430-tdep.c +++ b/gdb/msp430-tdep.c @@ -1,7 +1,7 @@ /* Target-dependent code for the Texas Instruments MSP430 for GDB, the GNU debugger. - Copyright (C) 2012-2017 Free Software Foundation, Inc. + Copyright (C) 2012-2019 Free Software Foundation, Inc. Contributed by Red Hat, Inc. @@ -218,7 +218,7 @@ msp430_register_reggroup_p (struct gdbarch *gdbarch, int regnum, static enum register_status msp430_pseudo_register_read (struct gdbarch *gdbarch, - struct regcache *regcache, + readable_regcache *regcache, int regnum, gdb_byte *buffer) { if (MSP430_NUM_REGS <= regnum && regnum < MSP430_NUM_TOTAL_REGS) @@ -229,7 +229,7 @@ msp430_pseudo_register_read (struct gdbarch *gdbarch, int regsize = register_size (gdbarch, regnum); int raw_regnum = regnum - MSP430_NUM_REGS; - status = regcache_raw_read_unsigned (regcache, raw_regnum, &val); + status = regcache->raw_read (raw_regnum, &val); if (status == REG_VALID) store_unsigned_integer (buffer, regsize, byte_order, val); @@ -311,7 +311,7 @@ msp430_get_opcode_byte (void *handle) } /* 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 @@ -339,8 +339,6 @@ msp430_analyze_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc, CORE_ADDR pc, next_pc; int rn; pv_t reg[MSP430_NUM_TOTAL_REGS]; - struct pv_area *stack; - struct cleanup *back_to; CORE_ADDR after_last_frame_setup_insn = start_pc; int code_model = gdbarch_tdep (gdbarch)->code_model; int sz; @@ -353,13 +351,12 @@ msp430_analyze_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc, result->reg_offset[rn] = 1; } - stack = make_pv_area (MSP430_SP_REGNUM, gdbarch_addr_bit (gdbarch)); - back_to = make_cleanup_free_pv_area (stack); + pv_area stack (MSP430_SP_REGNUM, gdbarch_addr_bit (gdbarch)); /* The call instruction has saved the return address on the stack. */ sz = code_model == MSP_LARGE_CODE_MODEL ? 4 : 2; reg[MSP430_SP_REGNUM] = pv_add_constant (reg[MSP430_SP_REGNUM], -sz); - pv_area_store (stack, reg[MSP430_SP_REGNUM], sz, reg[MSP430_PC_REGNUM]); + stack.store (reg[MSP430_SP_REGNUM], sz, reg[MSP430_PC_REGNUM]); pc = start_pc; while (pc < limit_pc) @@ -378,7 +375,7 @@ msp430_analyze_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc, int rsrc = opc.op[0].reg; reg[MSP430_SP_REGNUM] = pv_add_constant (reg[MSP430_SP_REGNUM], -2); - pv_area_store (stack, reg[MSP430_SP_REGNUM], 2, reg[rsrc]); + stack.store (reg[MSP430_SP_REGNUM], 2, reg[rsrc]); after_last_frame_setup_insn = next_pc; } else if (opc.id == MSO_push /* PUSHM */ @@ -393,7 +390,7 @@ msp430_analyze_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc, { reg[MSP430_SP_REGNUM] = pv_add_constant (reg[MSP430_SP_REGNUM], -size); - pv_area_store (stack, reg[MSP430_SP_REGNUM], size, reg[rsrc]); + stack.store (reg[MSP430_SP_REGNUM], size, reg[rsrc]); rsrc--; count--; } @@ -428,11 +425,9 @@ msp430_analyze_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc, result->frame_size = reg[MSP430_SP_REGNUM].k; /* Record where all the registers were saved. */ - pv_area_scan (stack, check_for_saved, result); + stack.scan (check_for_saved, result); result->prologue_end = after_last_frame_setup_insn; - - do_cleanups (back_to); } /* Implement the "skip_prologue" gdbarch method. */ @@ -452,22 +447,6 @@ msp430_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc) return p.prologue_end; } -/* Implement the "unwind_pc" gdbarch method. */ - -static CORE_ADDR -msp430_unwind_pc (struct gdbarch *arch, struct frame_info *next_frame) -{ - return frame_unwind_register_unsigned (next_frame, MSP430_PC_REGNUM); -} - -/* Implement the "unwind_sp" gdbarch method. */ - -static CORE_ADDR -msp430_unwind_sp (struct gdbarch *arch, struct frame_info *next_frame) -{ - return frame_unwind_register_unsigned (next_frame, MSP430_SP_REGNUM); -} - /* Given a frame described by THIS_FRAME, decode the prologue of its associated function if there is not cache entry as specified by THIS_PROLOGUE_CACHE. Save the decoded prologue in the cache and @@ -655,26 +634,14 @@ msp430_frame_align (struct gdbarch *gdbarch, CORE_ADDR sp) return align_down (sp, 2); } - -/* Implement the "dummy_id" gdbarch method. */ - -static struct frame_id -msp430_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame) -{ - return - frame_id_build (get_frame_register_unsigned - (this_frame, MSP430_SP_REGNUM), - get_frame_pc (this_frame)); -} - - /* Implement the "push_dummy_call" gdbarch method. */ static CORE_ADDR msp430_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 write_pass; @@ -704,7 +671,7 @@ msp430_push_dummy_call (struct gdbarch *gdbarch, struct value *function, sp = align_down (sp - sp_off, 4); sp_off = 0; - if (struct_return) + if (return_method == return_method_struct) { if (write_pass) regcache_cooked_write_unsigned (regcache, arg_reg, struct_addr); @@ -720,6 +687,7 @@ msp430_push_dummy_call (struct gdbarch *gdbarch, struct value *function, ULONGEST arg_size = TYPE_LENGTH (arg_type); int offset; int current_arg_on_stack; + gdb_byte struct_addr_buf[4]; current_arg_on_stack = 0; @@ -727,11 +695,9 @@ msp430_push_dummy_call (struct gdbarch *gdbarch, struct value *function, || TYPE_CODE (arg_type) == TYPE_CODE_UNION) { /* Aggregates of any size are passed by reference. */ - gdb_byte struct_addr[4]; - - store_unsigned_integer (struct_addr, 4, byte_order, + store_unsigned_integer (struct_addr_buf, 4, byte_order, value_address (arg)); - arg_bits = struct_addr; + arg_bits = struct_addr_buf; arg_size = (code_model == MSP_LARGE_CODE_MODEL) ? 4 : 2; } else @@ -842,7 +808,7 @@ msp430_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc) if (!bms.minsym) return pc; - stub_name = MSYMBOL_LINKAGE_NAME (bms.minsym); + stub_name = bms.minsym->linkage_name (); if (gdbarch_tdep (gdbarch)->code_model == MSP_SMALL_CODE_MODEL && msp430_in_return_stub (gdbarch, pc, stub_name)) @@ -913,8 +879,8 @@ msp430_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) code_model = ca_tdep->code_model; break; } - /* Otherwise, fall through... */ } + /* Fall through. */ default: error (_("Unknown msp430 isa")); break; @@ -944,7 +910,7 @@ msp430_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; tdep->isa = isa; @@ -1000,14 +966,11 @@ msp430_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) /* Frames, prologues, etc. */ set_gdbarch_inner_than (gdbarch, core_addr_lessthan); set_gdbarch_skip_prologue (gdbarch, msp430_skip_prologue); - set_gdbarch_unwind_pc (gdbarch, msp430_unwind_pc); - set_gdbarch_unwind_sp (gdbarch, msp430_unwind_sp); set_gdbarch_frame_align (gdbarch, msp430_frame_align); dwarf2_append_unwinders (gdbarch); frame_unwind_append_unwinder (gdbarch, &msp430_unwind); /* Dummy frames, return values. */ - set_gdbarch_dummy_id (gdbarch, msp430_dummy_id); set_gdbarch_push_dummy_call (gdbarch, msp430_push_dummy_call); set_gdbarch_return_value (gdbarch, msp430_return_value); @@ -1021,9 +984,6 @@ msp430_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) return gdbarch; } -/* -Wmissing-prototypes */ -extern initialize_file_ftype _initialize_msp430_tdep; - /* Register the initialization routine. */ void