diff options
author | Simon Marchi <simon.marchi@polymtl.ca> | 2021-11-15 11:29:39 -0500 |
---|---|---|
committer | Simon Marchi <simon.marchi@polymtl.ca> | 2021-11-15 11:29:39 -0500 |
commit | 345bd07cce33565f1cd66acabdaf387ca3a7ccb3 (patch) | |
tree | bfa86d2102817e06235193c865d2580e802d0a1a /gdb/m32c-tdep.c | |
parent | eae06bb301512a21277dd48a4bff025c4dceda9e (diff) | |
download | gdb-345bd07cce33565f1cd66acabdaf387ca3a7ccb3.zip gdb-345bd07cce33565f1cd66acabdaf387ca3a7ccb3.tar.gz gdb-345bd07cce33565f1cd66acabdaf387ca3a7ccb3.tar.bz2 |
gdb: fix gdbarch_tdep ODR violation
I would like to be able to use non-trivial types in gdbarch_tdep types.
This is not possible at the moment (in theory), because of the one
definition rule.
To allow it, rename all gdbarch_tdep types to <arch>_gdbarch_tdep, and
make them inherit from a gdbarch_tdep base class. The inheritance is
necessary to be able to pass pointers to all these <arch>_gdbarch_tdep
objects to gdbarch_alloc, which takes a pointer to gdbarch_tdep.
These objects are never deleted through a base class pointer, so I
didn't include a virtual destructor. In the future, if gdbarch objects
deletable, I could imagine that the gdbarch_tdep objects could become
owned by the gdbarch objects, and then it would become useful to have a
virtual destructor (so that the gdbarch object can delete the owned
gdbarch_tdep object). But that's not necessary right now.
It turns out that RISC-V already has a gdbarch_tdep that is
non-default-constructible, so that provides a good motivation for this
change.
Most changes are fairly straightforward, mostly needing to add some
casts all over the place. There is however the xtensa architecture,
doing its own little weird thing to define its gdbarch_tdep. I did my
best to adapt it, but I can't test those changes.
Change-Id: Ic001903f91ddd106bd6ca09a79dabe8df2d69f3b
Diffstat (limited to 'gdb/m32c-tdep.c')
-rw-r--r-- | gdb/m32c-tdep.c | 113 |
1 files changed, 67 insertions, 46 deletions
diff --git a/gdb/m32c-tdep.c b/gdb/m32c-tdep.c index 3374b00..200d51a 100644 --- a/gdb/m32c-tdep.c +++ b/gdb/m32c-tdep.c @@ -95,42 +95,44 @@ struct m32c_reg #define M32C_MAX_DWARF_REGNUM (40) -struct gdbarch_tdep +struct m32c_gdbarch_tdep : gdbarch_tdep { /* All the registers for this variant, indexed by GDB register number, and the number of registers present. */ - struct m32c_reg regs[M32C_MAX_NUM_REGS]; + struct m32c_reg regs[M32C_MAX_NUM_REGS] {}; /* The number of valid registers. */ - int num_regs; + int num_regs = 0; /* Interesting registers. These are pointers into REGS. */ - struct m32c_reg *pc, *flg; - struct m32c_reg *r0, *r1, *r2, *r3, *a0, *a1; - struct m32c_reg *r2r0, *r3r2r1r0, *r3r1r2r0; - struct m32c_reg *sb, *fb, *sp; + struct m32c_reg *pc = nullptr, *flg = nullptr; + struct m32c_reg *r0 = nullptr, *r1 = nullptr, *r2 = nullptr, *r3 = nullptr, + *a0 = nullptr, *a1 = nullptr; + struct m32c_reg *r2r0 = nullptr, *r3r2r1r0 = nullptr, *r3r1r2r0 = nullptr; + struct m32c_reg *sb = nullptr, *fb = nullptr, *sp = nullptr; /* A table indexed by DWARF register numbers, pointing into REGS. */ - struct m32c_reg *dwarf_regs[M32C_MAX_DWARF_REGNUM + 1]; + struct m32c_reg *dwarf_regs[M32C_MAX_DWARF_REGNUM + 1] {}; /* Types for this architecture. We can't use the builtin_type_foo types, because they're not initialized when building a gdbarch structure. */ - struct type *voyd, *ptr_voyd, *func_voyd; - struct type *uint8, *uint16; - struct type *int8, *int16, *int32, *int64; + struct type *voyd = nullptr, *ptr_voyd = nullptr, *func_voyd = nullptr; + struct type *uint8 = nullptr, *uint16 = nullptr; + struct type *int8 = nullptr, *int16 = nullptr, *int32 = nullptr, + *int64 = nullptr; /* The types for data address and code address registers. */ - struct type *data_addr_reg_type, *code_addr_reg_type; + struct type *data_addr_reg_type = nullptr, *code_addr_reg_type = nullptr; /* The number of bytes a return address pushed by a 'jsr' instruction occupies on the stack. */ - int ret_addr_bytes; + int ret_addr_bytes = 0; /* The number of bytes an address register occupies on the stack when saved by an 'enter' or 'pushm' instruction. */ - int push_addr_bytes; + int push_addr_bytes = 0; }; @@ -139,7 +141,7 @@ struct gdbarch_tdep static void make_types (struct gdbarch *arch) { - struct gdbarch_tdep *tdep = gdbarch_tdep (arch); + m32c_gdbarch_tdep *tdep = (m32c_gdbarch_tdep *) gdbarch_tdep (arch); unsigned long mach = gdbarch_bfd_arch_info (arch)->mach; int data_addr_reg_bits, code_addr_reg_bits; char type_name[50]; @@ -212,28 +214,31 @@ make_types (struct gdbarch *arch) static const char * m32c_register_name (struct gdbarch *gdbarch, int num) { - return gdbarch_tdep (gdbarch)->regs[num].name; + m32c_gdbarch_tdep *tdep = (m32c_gdbarch_tdep *) gdbarch_tdep (gdbarch); + return tdep->regs[num].name; } static struct type * m32c_register_type (struct gdbarch *arch, int reg_nr) { - return gdbarch_tdep (arch)->regs[reg_nr].type; + m32c_gdbarch_tdep *tdep = (m32c_gdbarch_tdep *) gdbarch_tdep (arch); + return tdep->regs[reg_nr].type; } static int m32c_register_sim_regno (struct gdbarch *gdbarch, int reg_nr) { - return gdbarch_tdep (gdbarch)->regs[reg_nr].sim_num; + m32c_gdbarch_tdep *tdep = (m32c_gdbarch_tdep *) gdbarch_tdep (gdbarch); + return tdep->regs[reg_nr].sim_num; } static int m32c_debug_info_reg_to_regnum (struct gdbarch *gdbarch, int reg_nr) { - struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + m32c_gdbarch_tdep *tdep = (m32c_gdbarch_tdep *) gdbarch_tdep (gdbarch); if (0 <= reg_nr && reg_nr <= M32C_MAX_DWARF_REGNUM && tdep->dwarf_regs[reg_nr]) return tdep->dwarf_regs[reg_nr]->num; @@ -248,7 +253,7 @@ static int m32c_register_reggroup_p (struct gdbarch *gdbarch, int regnum, struct reggroup *group) { - struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + m32c_gdbarch_tdep *tdep = (m32c_gdbarch_tdep *) gdbarch_tdep (gdbarch); struct m32c_reg *reg = &tdep->regs[regnum]; /* The anonymous raw registers aren't in any groups. */ @@ -323,7 +328,8 @@ m32c_raw_write (struct m32c_reg *reg, struct regcache *cache, static int m32c_read_flg (readable_regcache *cache) { - struct gdbarch_tdep *tdep = gdbarch_tdep (cache->arch ()); + gdbarch *arch = cache->arch (); + m32c_gdbarch_tdep *tdep = (m32c_gdbarch_tdep *) gdbarch_tdep (arch); ULONGEST flg; cache->raw_read (tdep->flg->num, &flg); @@ -522,7 +528,8 @@ m32c_cat_write (struct m32c_reg *reg, struct regcache *cache, static enum register_status m32c_r3r2r1r0_read (struct m32c_reg *reg, readable_regcache *cache, gdb_byte *buf) { - struct gdbarch_tdep *tdep = gdbarch_tdep (reg->arch); + gdbarch *arch = reg->arch; + m32c_gdbarch_tdep *tdep = (m32c_gdbarch_tdep *) gdbarch_tdep (arch); int len = TYPE_LENGTH (tdep->r0->type); enum register_status status; @@ -558,7 +565,8 @@ static enum register_status m32c_r3r2r1r0_write (struct m32c_reg *reg, struct regcache *cache, const gdb_byte *buf) { - struct gdbarch_tdep *tdep = gdbarch_tdep (reg->arch); + gdbarch *arch = reg->arch; + m32c_gdbarch_tdep *tdep = (m32c_gdbarch_tdep *) gdbarch_tdep (arch); int len = TYPE_LENGTH (tdep->r0->type); if (gdbarch_byte_order (reg->arch) == BFD_ENDIAN_BIG) @@ -586,7 +594,7 @@ m32c_pseudo_register_read (struct gdbarch *arch, int cookednum, gdb_byte *buf) { - struct gdbarch_tdep *tdep = gdbarch_tdep (arch); + m32c_gdbarch_tdep *tdep = (m32c_gdbarch_tdep *) gdbarch_tdep (arch); struct m32c_reg *reg; gdb_assert (0 <= cookednum && cookednum < tdep->num_regs); @@ -604,7 +612,7 @@ m32c_pseudo_register_write (struct gdbarch *arch, int cookednum, const gdb_byte *buf) { - struct gdbarch_tdep *tdep = gdbarch_tdep (arch); + m32c_gdbarch_tdep *tdep = (m32c_gdbarch_tdep *) gdbarch_tdep (arch); struct m32c_reg *reg; gdb_assert (0 <= cookednum && cookednum < tdep->num_regs); @@ -629,7 +637,7 @@ add_reg (struct gdbarch *arch, struct m32c_reg *ry, int n) { - struct gdbarch_tdep *tdep = gdbarch_tdep (arch); + m32c_gdbarch_tdep *tdep = (m32c_gdbarch_tdep *) gdbarch_tdep (arch); struct m32c_reg *r = &tdep->regs[tdep->num_regs]; gdb_assert (tdep->num_regs < M32C_MAX_NUM_REGS); @@ -668,7 +676,9 @@ set_dwarf_regnum (struct m32c_reg *reg, int num) reg->dwarf_num = num; /* Update the DWARF->reg mapping. */ - gdbarch_tdep (reg->arch)->dwarf_regs[num] = reg; + gdbarch *arch = reg->arch; + m32c_gdbarch_tdep *tdep = (m32c_gdbarch_tdep *) gdbarch_tdep (arch); + tdep->dwarf_regs[num] = reg; } @@ -789,7 +799,7 @@ mark_save_restore (struct m32c_reg *reg) static void make_regs (struct gdbarch *arch) { - struct gdbarch_tdep *tdep = gdbarch_tdep (arch); + m32c_gdbarch_tdep *tdep = (m32c_gdbarch_tdep *) gdbarch_tdep (arch); int mach = gdbarch_bfd_arch_info (arch)->mach; int num_raw_regs; int num_cooked_regs; @@ -1336,16 +1346,17 @@ m32c_decode_sd23 (struct m32c_pv_state *st, int code, int size, int ind) static int m32c_pv_enter (struct m32c_pv_state *state, int size) { - struct gdbarch_tdep *tdep = gdbarch_tdep (state->arch); - /* If simulating this store would require us to forget everything we know about the stack frame in the name of accuracy, it would be better to just quit now. */ if (state->stack->store_would_trash (state->sp)) return 1; + gdbarch *arch = state->arch; + m32c_gdbarch_tdep *tdep = (m32c_gdbarch_tdep *) gdbarch_tdep (arch); if (m32c_pv_push (state, state->fb, tdep->push_addr_bytes)) return 1; + state->fb = state->sp; state->sp = pv_add_constant (state->sp, -size); @@ -1371,7 +1382,8 @@ m32c_pv_pushm_one (struct m32c_pv_state *state, pv_t reg, static int m32c_pv_pushm (struct m32c_pv_state *state, int src) { - struct gdbarch_tdep *tdep = gdbarch_tdep (state->arch); + gdbarch *arch = state->arch; + m32c_gdbarch_tdep *tdep = (m32c_gdbarch_tdep *) gdbarch_tdep (arch); /* The bits in SRC indicating which registers to save are: r0 r1 r2 r3 a0 a1 sb fb */ @@ -1391,7 +1403,9 @@ m32c_pv_pushm (struct m32c_pv_state *state, int src) static int m32c_is_1st_arg_reg (struct m32c_pv_state *state, pv_t value) { - struct gdbarch_tdep *tdep = gdbarch_tdep (state->arch); + gdbarch *arch = state->arch; + m32c_gdbarch_tdep *tdep = (m32c_gdbarch_tdep *) gdbarch_tdep (arch); + return (value.kind == pvk_register && (gdbarch_bfd_arch_info (state->arch)->mach == bfd_mach_m16c ? (value.reg == tdep->r1->num) @@ -1404,7 +1418,9 @@ m32c_is_1st_arg_reg (struct m32c_pv_state *state, pv_t value) static int m32c_is_arg_reg (struct m32c_pv_state *state, pv_t value) { - struct gdbarch_tdep *tdep = gdbarch_tdep (state->arch); + gdbarch *arch = state->arch; + m32c_gdbarch_tdep *tdep = (m32c_gdbarch_tdep *) gdbarch_tdep (arch); + return (value.kind == pvk_register && (gdbarch_bfd_arch_info (state->arch)->mach == bfd_mach_m16c ? (value.reg == tdep->r1->num || value.reg == tdep->r2->num) @@ -1427,7 +1443,8 @@ m32c_is_arg_spill (struct m32c_pv_state *st, struct srcdest loc, pv_t value) { - struct gdbarch_tdep *tdep = gdbarch_tdep (st->arch); + gdbarch *arch = st->arch; + m32c_gdbarch_tdep *tdep = (m32c_gdbarch_tdep *) gdbarch_tdep (arch); return (m32c_is_arg_reg (st, value) && loc.kind == srcdest_mem @@ -1450,7 +1467,8 @@ m32c_is_struct_return (struct m32c_pv_state *st, struct srcdest loc, pv_t value) { - struct gdbarch_tdep *tdep = gdbarch_tdep (st->arch); + gdbarch *arch = st->arch; + m32c_gdbarch_tdep *tdep = (m32c_gdbarch_tdep *) gdbarch_tdep (arch); return (m32c_is_1st_arg_reg (st, value) && !st->stack->find_reg (st->arch, value.reg, 0) @@ -1467,7 +1485,9 @@ m32c_is_struct_return (struct m32c_pv_state *st, static int m32c_pushm_is_reg_save (struct m32c_pv_state *st, int src) { - struct gdbarch_tdep *tdep = gdbarch_tdep (st->arch); + gdbarch *arch = st->arch; + m32c_gdbarch_tdep *tdep = (m32c_gdbarch_tdep *) gdbarch_tdep (arch); + /* The bits in SRC indicating which registers to save are: r0 r1 r2 r3 a0 a1 sb fb */ return @@ -1494,7 +1514,7 @@ check_for_saved (void *prologue_untyped, pv_t addr, CORE_ADDR size, pv_t value) { struct m32c_prologue *prologue = (struct m32c_prologue *) prologue_untyped; struct gdbarch *arch = prologue->arch; - struct gdbarch_tdep *tdep = gdbarch_tdep (arch); + m32c_gdbarch_tdep *tdep = (m32c_gdbarch_tdep *) gdbarch_tdep (arch); /* Is this the unchanged value of some register being saved on the stack? */ @@ -1534,7 +1554,7 @@ m32c_analyze_prologue (struct gdbarch *arch, CORE_ADDR start, CORE_ADDR limit, struct m32c_prologue *prologue) { - struct gdbarch_tdep *tdep = gdbarch_tdep (arch); + m32c_gdbarch_tdep *tdep = (m32c_gdbarch_tdep *) gdbarch_tdep (arch); unsigned long mach = gdbarch_bfd_arch_info (arch)->mach; CORE_ADDR after_last_frame_related_insn; struct m32c_pv_state st; @@ -1864,7 +1884,8 @@ m32c_frame_base (struct frame_info *this_frame, { struct m32c_prologue *p = m32c_analyze_frame_prologue (this_frame, this_prologue_cache); - struct gdbarch_tdep *tdep = gdbarch_tdep (get_frame_arch (this_frame)); + gdbarch *arch = get_frame_arch (this_frame); + m32c_gdbarch_tdep *tdep = (m32c_gdbarch_tdep *) gdbarch_tdep (arch); /* In functions that use alloca, the distance between the stack pointer and the frame base varies dynamically, so we can't use @@ -1914,7 +1935,8 @@ static struct value * m32c_prev_register (struct frame_info *this_frame, void **this_prologue_cache, int regnum) { - struct gdbarch_tdep *tdep = gdbarch_tdep (get_frame_arch (this_frame)); + gdbarch *arch = get_frame_arch (this_frame); + m32c_gdbarch_tdep *tdep = (m32c_gdbarch_tdep *) gdbarch_tdep (arch); struct m32c_prologue *p = m32c_analyze_frame_prologue (this_frame, this_prologue_cache); CORE_ADDR frame_base = m32c_frame_base (this_frame, this_prologue_cache); @@ -1997,7 +2019,7 @@ m32c_push_dummy_call (struct gdbarch *gdbarch, struct value *function, function_call_return_method return_method, CORE_ADDR struct_addr) { - struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + m32c_gdbarch_tdep *tdep = (m32c_gdbarch_tdep *) gdbarch_tdep (gdbarch); enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); unsigned long mach = gdbarch_bfd_arch_info (gdbarch)->mach; CORE_ADDR cfa; @@ -2160,7 +2182,7 @@ m32c_return_value (struct gdbarch *gdbarch, gdb_byte *readbuf, const gdb_byte *writebuf) { - struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + m32c_gdbarch_tdep *tdep = (m32c_gdbarch_tdep *) gdbarch_tdep (gdbarch); enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); enum return_value_convention conv; ULONGEST valtype_len = TYPE_LENGTH (valtype); @@ -2291,7 +2313,7 @@ static CORE_ADDR m32c_skip_trampoline_code (struct frame_info *frame, CORE_ADDR stop_pc) { struct gdbarch *gdbarch = get_frame_arch (frame); - struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + m32c_gdbarch_tdep *tdep = (m32c_gdbarch_tdep *) gdbarch_tdep (gdbarch); enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); /* It would be nicer to simply look up the addresses of known @@ -2537,7 +2559,7 @@ m32c_virtual_frame_pointer (struct gdbarch *gdbarch, CORE_ADDR pc, struct m32c_prologue p; struct regcache *regcache = get_current_regcache (); - struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + m32c_gdbarch_tdep *tdep = (m32c_gdbarch_tdep *) gdbarch_tdep (gdbarch); if (!find_pc_partial_function (pc, &name, &func_addr, &func_end)) internal_error (__FILE__, __LINE__, @@ -2572,7 +2594,6 @@ static struct gdbarch * m32c_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) { struct gdbarch *gdbarch; - struct gdbarch_tdep *tdep; unsigned long mach = info.bfd_arch_info->mach; /* Find a candidate among the list of architectures we've created @@ -2582,7 +2603,7 @@ m32c_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) arches = gdbarch_list_lookup_by_info (arches->next, &info)) return arches->gdbarch; - tdep = XCNEW (struct gdbarch_tdep); + m32c_gdbarch_tdep *tdep = new m32c_gdbarch_tdep; gdbarch = gdbarch_alloc (&info, tdep); /* Essential types. */ |