aboutsummaryrefslogtreecommitdiff
path: root/gdb/hppa-tdep.h
diff options
context:
space:
mode:
authorSimon Marchi <simon.marchi@polymtl.ca>2021-11-15 11:29:39 -0500
committerSimon Marchi <simon.marchi@polymtl.ca>2021-11-15 11:29:39 -0500
commit345bd07cce33565f1cd66acabdaf387ca3a7ccb3 (patch)
treebfa86d2102817e06235193c865d2580e802d0a1a /gdb/hppa-tdep.h
parenteae06bb301512a21277dd48a4bff025c4dceda9e (diff)
downloadgdb-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.h23
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;
};
/*