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/hppa-tdep.h | |
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/hppa-tdep.h')
-rw-r--r-- | gdb/hppa-tdep.h | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/gdb/hppa-tdep.h b/gdb/hppa-tdep.h index d033c14..7298881 100644 --- a/gdb/hppa-tdep.h +++ b/gdb/hppa-tdep.h @@ -20,6 +20,8 @@ #ifndef HPPA_TDEP_H #define HPPA_TDEP_H +#include "gdbarch.h" + struct trad_frame_saved_reg; struct objfile; struct so_list; @@ -82,24 +84,25 @@ enum hppa_regnum #define HPPA_INSN_SIZE 4 /* Target-dependent structure in gdbarch. */ -struct gdbarch_tdep +struct hppa_gdbarch_tdep : gdbarch_tdep { /* The number of bytes in an address. For now, this field is designed to allow us to differentiate hppa32 from hppa64 targets. */ - int bytes_per_address; + int bytes_per_address = 0; /* Is this an ELF target? This can be 64-bit HP-UX, or a 32/64-bit GNU/Linux system. */ - int is_elf; + int is_elf = 0; /* Given a function address, try to find the global pointer for the corresponding shared object. */ - CORE_ADDR (*find_global_pointer) (struct gdbarch *, struct value *); + CORE_ADDR (*find_global_pointer) (struct gdbarch *, struct value *) = nullptr; /* For shared libraries, each call goes through a small piece of trampoline code in the ".plt" section. IN_SOLIB_CALL_TRAMPOLINE evaluates to nonzero if we are currently stopped in one of these. */ - int (*in_solib_call_trampoline) (struct gdbarch *gdbarch, CORE_ADDR pc); + int (*in_solib_call_trampoline) (struct gdbarch *gdbarch, + CORE_ADDR pc) = nullptr; /* For targets that support multiple spaces, we may have additional stubs in the return path. These stubs are internal to the ABI, and users are @@ -107,14 +110,14 @@ struct gdbarch_tdep adjust the pc to the real caller. This improves the behavior of commands that traverse frames such as "up" and "finish". */ void (*unwind_adjust_stub) (struct frame_info *this_frame, CORE_ADDR base, - trad_frame_saved_reg *saved_regs); + trad_frame_saved_reg *saved_regs) = nullptr; /* These are solib-dependent methods. They are really HPUX only, but we don't have a HPUX-specific tdep vector at the moment. */ - CORE_ADDR (*solib_thread_start_addr) (struct so_list *so); - CORE_ADDR (*solib_get_got_by_pc) (CORE_ADDR addr); - CORE_ADDR (*solib_get_solib_by_pc) (CORE_ADDR addr); - CORE_ADDR (*solib_get_text_base) (struct objfile *objfile); + CORE_ADDR (*solib_thread_start_addr) (struct so_list *so) = nullptr; + CORE_ADDR (*solib_get_got_by_pc) (CORE_ADDR addr) = nullptr; + CORE_ADDR (*solib_get_solib_by_pc) (CORE_ADDR addr) = nullptr; + CORE_ADDR (*solib_get_text_base) (struct objfile *objfile) = nullptr; }; /* |