/* Target-dependent code for the Texas Instruments MSP430 for GDB, the
GNU debugger.
- Copyright (C) 2012-2015 Free Software Foundation, Inc.
+ Copyright (C) 2012-2016 Free Software Foundation, Inc.
Contributed by Red Hat, Inc.
struct regcache *regcache,
int regnum, const gdb_byte *buffer)
{
- enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
if (MSP430_NUM_REGS <= regnum && regnum < MSP430_NUM_TOTAL_REGS)
{
return regnum;
}
-/* Implement the "breakpoint_from_pc" gdbarch method. */
-
-static const gdb_byte *
-msp430_breakpoint_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr,
- int *lenptr)
-{
- static gdb_byte breakpoint[] = { 0x43, 0x43 };
+constexpr gdb_byte msp430_break_insn[] = { 0x43, 0x43 };
- *lenptr = sizeof breakpoint;
- return breakpoint;
-}
+typedef BP_MANIPULATION (msp430_break_insn) msp430_breakpoint;
/* Define a "handle" struct for fetching the next opcode. */
static int
msp430_dwarf2_reg_to_regnum (struct gdbarch *gdbarch, int reg)
{
- if (reg < MSP430_NUM_REGS)
+ if (reg >= 0 && reg < MSP430_NUM_REGS)
return reg + MSP430_NUM_REGS;
- else
- {
- warning (_("Unmapped DWARF Register #%d encountered."), reg);
- return -1;
- }
+ return -1;
}
/* Implement the "return_value" gdbarch method. */
int size = 2;
if (code_model == MSP_LARGE_CODE_MODEL
- && TYPE_CODE (arg_type) == TYPE_CODE_PTR)
+ && (TYPE_CODE (arg_type) == TYPE_CODE_PTR
+ || TYPE_CODE (arg_type) == TYPE_CODE_REF
+ || TYPE_CODE (arg_type) == TYPE_CODE_STRUCT
+ || TYPE_CODE (arg_type) == TYPE_CODE_UNION))
{
- /* Pointer arguments using large memory model are passed
- using entire register. */
+ /* When using the large memory model, pointer,
+ reference, struct, and union arguments are
+ passed using the entire register. (As noted
+ earlier, aggregates are always passed by
+ reference.) */
if (offset != 0)
continue;
size = 4;
set_gdbarch_long_double_format (gdbarch, floatformats_ieee_double);
/* Breakpoints. */
- set_gdbarch_breakpoint_from_pc (gdbarch, msp430_breakpoint_from_pc);
+ set_gdbarch_breakpoint_kind_from_pc (gdbarch,
+ msp430_breakpoint::kind_from_pc);
+ set_gdbarch_sw_breakpoint_from_kind (gdbarch,
+ msp430_breakpoint::bp_from_kind);
set_gdbarch_decr_pc_after_break (gdbarch, 1);
/* Disassembly. */