/* Target-dependent code for the Texas Instruments MSP430 for GDB, the
GNU debugger.
- Copyright (C) 2012-2020 Free Software Foundation, Inc.
+ Copyright (C) 2012-2022 Free Software Foundation, Inc.
Contributed by Red Hat, Inc.
#include "gdbcore.h"
#include "dwarf2/frame.h"
#include "reggroups.h"
+#include "gdbarch.h"
#include "elf/msp430.h"
#include "opcode/msp430-decode.h"
/* Architecture specific data. */
-struct gdbarch_tdep
+struct msp430_gdbarch_tdep : gdbarch_tdep
{
/* The ELF header flags specify the multilib used. */
- int elf_flags;
+ int elf_flags = 0;
/* One of MSP_ISA_MSP430 or MSP_ISA_MSP430X. */
- int isa;
+ int isa = 0;
/* One of MSP_SMALL_CODE_MODEL or MSP_LARGE_CODE_MODEL. If, at
some point, we support different data models too, we'll probably
structure things so that we can combine values using logical
"or". */
- int code_model;
+ int code_model = 0;
};
/* This structure holds the results of a prologue analysis. */
static int
msp430_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
- struct reggroup *group)
+ const struct reggroup *group)
{
if (group == all_reggroup)
return 1;
int rn;
pv_t reg[MSP430_NUM_TOTAL_REGS];
CORE_ADDR after_last_frame_setup_insn = start_pc;
- int code_model = gdbarch_tdep (gdbarch)->code_model;
+ msp430_gdbarch_tdep *tdep = (msp430_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+ int code_model = tdep->code_model;
int sz;
memset (result, 0, sizeof (*result));
}
static const struct frame_unwind msp430_unwind = {
+ "msp430 prologue",
NORMAL_FRAME,
default_frame_unwind_stop_reason,
msp430_this_id,
{
enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
LONGEST valtype_len = TYPE_LENGTH (valtype);
- int code_model = gdbarch_tdep (gdbarch)->code_model;
+ msp430_gdbarch_tdep *tdep = (msp430_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+ int code_model = tdep->code_model;
if (TYPE_LENGTH (valtype) > 8
|| valtype->code () == TYPE_CODE_STRUCT
int write_pass;
int sp_off = 0;
CORE_ADDR cfa;
- int code_model = gdbarch_tdep (gdbarch)->code_model;
+ msp430_gdbarch_tdep *tdep = (msp430_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+ int code_model = tdep->code_model;
struct type *func_type = value_type (function);
for (i = 0; i < nargs; i++)
{
struct value *arg = args[i];
- const gdb_byte *arg_bits = value_contents_all (arg);
+ const gdb_byte *arg_bits = value_contents_all (arg).data ();
struct type *arg_type = check_typedef (value_type (arg));
ULONGEST arg_size = TYPE_LENGTH (arg_type);
int offset;
/* Push the return address. */
{
- int sz = (gdbarch_tdep (gdbarch)->code_model == MSP_SMALL_CODE_MODEL)
- ? 2 : 4;
+ int sz = tdep->code_model == MSP_SMALL_CODE_MODEL ? 2 : 4;
sp = sp - sz;
write_memory_unsigned_integer (sp, sz, byte_order, bp_addr);
}
stub_name = bms.minsym->linkage_name ();
- if (gdbarch_tdep (gdbarch)->code_model == MSP_SMALL_CODE_MODEL
+ msp430_gdbarch_tdep *tdep = (msp430_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+ if (tdep->code_model == MSP_SMALL_CODE_MODEL
&& msp430_in_return_stub (gdbarch, pc, stub_name))
{
CORE_ADDR sp = get_frame_register_unsigned (frame, MSP430_SP_REGNUM);
msp430_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
{
struct gdbarch *gdbarch;
- struct gdbarch_tdep *tdep;
int elf_flags, isa, code_model;
/* Extract the elf_flags if available. */
struct gdbarch *ca = get_current_arch ();
if (ca && gdbarch_bfd_arch_info (ca)->arch == bfd_arch_msp430)
{
- struct gdbarch_tdep *ca_tdep = gdbarch_tdep (ca);
+ msp430_gdbarch_tdep *ca_tdep
+ = (msp430_gdbarch_tdep *) gdbarch_tdep (ca);
elf_flags = ca_tdep->elf_flags;
isa = ca_tdep->isa;
arches != NULL;
arches = gdbarch_list_lookup_by_info (arches->next, &info))
{
- struct gdbarch_tdep *candidate_tdep = gdbarch_tdep (arches->gdbarch);
+ msp430_gdbarch_tdep *candidate_tdep
+ = (msp430_gdbarch_tdep *) gdbarch_tdep (arches->gdbarch);
if (candidate_tdep->elf_flags != elf_flags
|| candidate_tdep->isa != isa
/* None found, create a new architecture from the information
provided. */
- tdep = XCNEW (struct gdbarch_tdep);
+ msp430_gdbarch_tdep *tdep = new msp430_gdbarch_tdep;
gdbarch = gdbarch_alloc (&info, tdep);
tdep->elf_flags = elf_flags;
tdep->isa = isa;