public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] gdb: fix gdbarch_tdep ODR violation
@ 2021-11-12 20:42 Simon Marchi
  2021-11-12 21:55 ` John Baldwin
                   ` (2 more replies)
  0 siblings, 3 replies; 10+ messages in thread
From: Simon Marchi @ 2021-11-12 20:42 UTC (permalink / raw)
  To: gdb-patches; +Cc: Simon Marchi

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
---
 gdb/aarch64-fbsd-tdep.c   |   2 +-
 gdb/aarch64-linux-tdep.c  |  11 +-
 gdb/aarch64-newlib-tdep.c |   2 +-
 gdb/aarch64-tdep.c        |  60 +++++----
 gdb/aarch64-tdep.h        |  32 ++---
 gdb/alpha-linux-tdep.c    |   4 +-
 gdb/alpha-netbsd-tdep.c   |   2 +-
 gdb/alpha-obsd-tdep.c     |   2 +-
 gdb/alpha-tdep.c          |  26 ++--
 gdb/alpha-tdep.h          |  24 ++--
 gdb/amd64-darwin-tdep.c   |   2 +-
 gdb/amd64-fbsd-tdep.c     |   4 +-
 gdb/amd64-linux-tdep.c    |   8 +-
 gdb/amd64-netbsd-tdep.c   |   2 +-
 gdb/amd64-obsd-tdep.c     |   2 +-
 gdb/amd64-sol2-tdep.c     |   2 +-
 gdb/amd64-tdep.c          |  36 +++---
 gdb/amd64-windows-tdep.c  |   2 +-
 gdb/arc-linux-tdep.c      |   4 +-
 gdb/arc-tdep.c            |  20 +--
 gdb/arc-tdep.h            |  14 +--
 gdb/arm-fbsd-tdep.c       |   4 +-
 gdb/arm-linux-tdep.c      |   4 +-
 gdb/arm-netbsd-tdep.c     |   4 +-
 gdb/arm-none-tdep.c       |   2 +-
 gdb/arm-obsd-tdep.c       |   2 +-
 gdb/arm-tdep.c            | 123 ++++++++++--------
 gdb/arm-tdep.h            |  65 +++++-----
 gdb/arm-wince-tdep.c      |   2 +-
 gdb/avr-tdep.c            |  36 +++---
 gdb/bfin-tdep.c           |  12 +-
 gdb/bfin-tdep.h           |   4 +-
 gdb/bpf-tdep.c            |   4 +-
 gdb/cris-linux-tdep.c     |   2 +-
 gdb/cris-tdep.c           |  31 +++--
 gdb/cris-tdep.h           |   8 +-
 gdb/csky-tdep.c           |   3 +-
 gdb/csky-tdep.h           |   2 +-
 gdb/frv-tdep.c            |  37 +++---
 gdb/ft32-tdep.c           |   8 +-
 gdb/ft32-tdep.h           |   4 +-
 gdb/gdbarch.h             |   2 +
 gdb/gdbarch.sh            |   2 +
 gdb/hppa-bsd-tdep.c       |   2 +-
 gdb/hppa-linux-tdep.c     |   4 +-
 gdb/hppa-tdep.c           |  22 ++--
 gdb/hppa-tdep.h           |  23 ++--
 gdb/i386-bsd-tdep.c       |   2 +-
 gdb/i386-darwin-tdep.c    |   4 +-
 gdb/i386-fbsd-tdep.c      |   8 +-
 gdb/i386-gnu-tdep.c       |   2 +-
 gdb/i386-go32-tdep.c      |   2 +-
 gdb/i386-linux-tdep.c     |   4 +-
 gdb/i386-netbsd-tdep.c    |   4 +-
 gdb/i386-nto-tdep.c       |   6 +-
 gdb/i386-obsd-tdep.c      |   2 +-
 gdb/i386-sol2-tdep.c      |   2 +-
 gdb/i386-tdep.c           | 111 +++++++++--------
 gdb/i386-tdep.h           | 136 ++++++++++----------
 gdb/i386-windows-tdep.c   |   2 +-
 gdb/i387-tdep.c           |  23 ++--
 gdb/ia64-linux-tdep.c     |   2 +-
 gdb/ia64-tdep.c           |  14 +--
 gdb/ia64-tdep.h           |  23 ++--
 gdb/lm32-tdep.c           |   5 +-
 gdb/m32c-tdep.c           | 113 ++++++++++-------
 gdb/m32r-tdep.c           |   3 +-
 gdb/m32r-tdep.h           |   4 +-
 gdb/m68hc11-tdep.c        |  60 ++++++---
 gdb/m68k-bsd-tdep.c       |   2 +-
 gdb/m68k-linux-tdep.c     |   2 +-
 gdb/m68k-tdep.c           |  57 +++++----
 gdb/m68k-tdep.h           |  22 ++--
 gdb/mep-tdep.c            |  28 +++--
 gdb/microblaze-tdep.c     |   3 +-
 gdb/microblaze-tdep.h     |   2 +-
 gdb/mips-linux-tdep.c     |   4 +-
 gdb/mips-tdep.c           | 164 ++++++++++++++----------
 gdb/mips-tdep.h           |  30 ++---
 gdb/mn10300-tdep.c        |   7 +-
 gdb/mn10300-tdep.h        |  11 +-
 gdb/moxie-tdep.c          |   3 +-
 gdb/moxie-tdep.h          |   2 +-
 gdb/msp430-tdep.c         |  32 ++---
 gdb/nds32-tdep.c          |  24 ++--
 gdb/nds32-tdep.h          |  10 +-
 gdb/nios2-linux-tdep.c    |   2 +-
 gdb/nios2-tdep.c          |   7 +-
 gdb/nios2-tdep.h          |  10 +-
 gdb/or1k-tdep.c           |  23 ++--
 gdb/ppc-fbsd-tdep.c       |   8 +-
 gdb/ppc-linux-tdep.c      |  18 +--
 gdb/ppc-netbsd-tdep.c     |   2 +-
 gdb/ppc-obsd-tdep.c       |   2 +-
 gdb/ppc-sysv-tdep.c       |  22 ++--
 gdb/ppc-tdep.h            | 104 ++++++++--------
 gdb/ppc64-tdep.c          |   2 +-
 gdb/riscv-linux-tdep.c    |   2 +-
 gdb/riscv-tdep.c          |  37 +++---
 gdb/riscv-tdep.h          |   5 +-
 gdb/rl78-tdep.c           |  41 +++---
 gdb/rs6000-aix-tdep.c     |  19 +--
 gdb/rs6000-lynx178-tdep.c |   6 +-
 gdb/rs6000-tdep.c         | 121 +++++++++---------
 gdb/rx-tdep.c             |  16 +--
 gdb/s12z-tdep.c           |   4 +-
 gdb/s390-linux-tdep.c     |  20 +--
 gdb/s390-tdep.c           |  74 ++++++-----
 gdb/s390-tdep.h           |  33 ++---
 gdb/sh-linux-tdep.c       |   2 +-
 gdb/sh-netbsd-tdep.c      |   2 +-
 gdb/sh-tdep.c             |  11 +-
 gdb/sh-tdep.h             |  14 ++-
 gdb/sparc-linux-tdep.c    |   5 +-
 gdb/sparc-netbsd-tdep.c   |   2 +-
 gdb/sparc-sol2-tdep.c     |   2 +-
 gdb/sparc-tdep.c          |  21 ++--
 gdb/sparc-tdep.h          |  43 ++++---
 gdb/sparc64-fbsd-tdep.c   |   2 +-
 gdb/sparc64-linux-tdep.c  |   5 +-
 gdb/sparc64-netbsd-tdep.c |   2 +-
 gdb/sparc64-obsd-tdep.c   |   2 +-
 gdb/sparc64-sol2-tdep.c   |   2 +-
 gdb/sparc64-tdep.c        |  10 +-
 gdb/tic6x-linux-tdep.c    |   6 +-
 gdb/tic6x-tdep.c          |  11 +-
 gdb/tic6x-tdep.h          |  10 +-
 gdb/v850-tdep.c           |  30 +++--
 gdb/xtensa-config.c       |   9 +-
 gdb/xtensa-linux-tdep.c   |   2 +-
 gdb/xtensa-tdep.c         | 254 +++++++++++++++++++++-----------------
 gdb/xtensa-tdep.h         | 180 ++++++++++-----------------
 gdb/z80-tdep.c            |  26 ++--
 133 files changed, 1514 insertions(+), 1325 deletions(-)

diff --git a/gdb/aarch64-fbsd-tdep.c b/gdb/aarch64-fbsd-tdep.c
index 3f22d419438..7342e7b9002 100644
--- a/gdb/aarch64-fbsd-tdep.c
+++ b/gdb/aarch64-fbsd-tdep.c
@@ -153,7 +153,7 @@ aarch64_fbsd_iterate_over_regset_sections (struct gdbarch *gdbarch,
 static void
 aarch64_fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* Generic FreeBSD support.  */
   fbsd_init_abi (info, gdbarch);
diff --git a/gdb/aarch64-linux-tdep.c b/gdb/aarch64-linux-tdep.c
index abb8be30731..7a9cf0c87e9 100644
--- a/gdb/aarch64-linux-tdep.c
+++ b/gdb/aarch64-linux-tdep.c
@@ -286,7 +286,7 @@ aarch64_linux_sigframe_init (const struct tramp_frame *self,
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   CORE_ADDR sp = get_frame_register_unsigned (this_frame, AARCH64_SP_REGNUM);
   CORE_ADDR sigcontext_addr = (sp + AARCH64_RT_SIGFRAME_UCONTEXT_OFFSET
 			       + AARCH64_UCONTEXT_SIGCONTEXT_OFFSET );
@@ -640,7 +640,8 @@ aarch64_linux_collect_sve_regset (const struct regset *regset,
   gdb_byte *header = (gdb_byte *) buf;
   struct gdbarch *gdbarch = regcache->arch ();
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
-  uint64_t vq = gdbarch_tdep (gdbarch)->vq;
+  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+  uint64_t vq = tdep->vq;
 
   gdb_assert (buf != NULL);
   gdb_assert (size > SVE_HEADER_SIZE);
@@ -675,7 +676,7 @@ aarch64_linux_iterate_over_regset_sections (struct gdbarch *gdbarch,
 					    void *cb_data,
 					    const struct regcache *regcache)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   cb (".reg", AARCH64_LINUX_SIZEOF_GREGSET, AARCH64_LINUX_SIZEOF_GREGSET,
       &aarch64_linux_gregset, NULL, cb_data);
@@ -1719,7 +1720,7 @@ aarch64_linux_report_signal_info (struct gdbarch *gdbarch,
 				  struct ui_out *uiout,
 				  enum gdb_signal siggnal)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (!tdep->has_mte () || siggnal != GDB_SIGNAL_SEGV)
     return;
@@ -1788,7 +1789,7 @@ aarch64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 								    NULL };
   static const char *const stap_register_indirection_suffixes[] = { "]",
 								    NULL };
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   tdep->lowest_pc = 0x8000;
 
diff --git a/gdb/aarch64-newlib-tdep.c b/gdb/aarch64-newlib-tdep.c
index b5e57bcd95f..9805967a205 100644
--- a/gdb/aarch64-newlib-tdep.c
+++ b/gdb/aarch64-newlib-tdep.c
@@ -29,7 +29,7 @@
 static void
 aarch64_newlib_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* Jump buffer - support for longjmp.
      Offset of original PC in jump buffer (in registers).  */
diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c
index 42b8494980c..392110afd2b 100644
--- a/gdb/aarch64-tdep.c
+++ b/gdb/aarch64-tdep.c
@@ -248,7 +248,7 @@ class instruction_reader : public abstract_instruction_reader
    THIS_FRAME.  */
 
 static CORE_ADDR
-aarch64_frame_unmask_lr (struct gdbarch_tdep *tdep,
+aarch64_frame_unmask_lr (aarch64_gdbarch_tdep *tdep,
 			 struct frame_info *this_frame, CORE_ADDR addr)
 {
   if (tdep->has_pauth ()
@@ -500,7 +500,8 @@ aarch64_analyze_prologue (struct gdbarch *gdbarch,
 	}
       else if (inst.opcode->iclass == ic_system)
 	{
-	  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+	  aarch64_gdbarch_tdep *tdep
+	    = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 	  int ra_state_val = 0;
 
 	  if (insn == 0xd503233f /* paciasp.  */
@@ -635,7 +636,7 @@ aarch64_analyze_prologue_test (void)
   struct aarch64_prologue_cache cache;
   cache.saved_regs = trad_frame_alloc_saved_regs (gdbarch);
 
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* Test the simple prologue in which frame pointer is used.  */
   {
@@ -1037,7 +1038,9 @@ aarch64_prologue_frame_unwind_stop_reason (struct frame_info *this_frame,
     return UNWIND_UNAVAILABLE;
 
   /* Halt the backtrace at "_start".  */
-  if (cache->prev_pc <= gdbarch_tdep (get_frame_arch (this_frame))->lowest_pc)
+  gdbarch *arch = get_frame_arch (this_frame);
+  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (arch);
+  if (cache->prev_pc <= tdep->lowest_pc)
     return UNWIND_OUTERMOST;
 
   /* We've hit a wall, stop.  */
@@ -1079,7 +1082,8 @@ aarch64_prologue_prev_register (struct frame_info *this_frame,
     {
       CORE_ADDR lr;
       struct gdbarch *gdbarch = get_frame_arch (this_frame);
-      struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+      aarch64_gdbarch_tdep *tdep
+	= (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
       lr = frame_unwind_register_unsigned (this_frame, AARCH64_LR_REGNUM);
 
@@ -1247,7 +1251,8 @@ static struct value *
 aarch64_dwarf2_prev_register (struct frame_info *this_frame,
 			      void **this_cache, int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (get_frame_arch (this_frame));
+  gdbarch *arch = get_frame_arch (this_frame);
+  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (arch);
   CORE_ADDR lr;
 
   switch (regnum)
@@ -1273,7 +1278,7 @@ aarch64_dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum,
 			       struct dwarf2_frame_state_reg *reg,
 			       struct frame_info *this_frame)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   switch (regnum)
     {
@@ -1313,7 +1318,7 @@ static bool
 aarch64_execute_dwarf_cfa_vendor_op (struct gdbarch *gdbarch, gdb_byte op,
 				     struct dwarf2_frame_state *fs)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   struct dwarf2_frame_state_reg *ra_state;
 
   if (op == DW_CFA_AARCH64_negate_ra_state)
@@ -1952,7 +1957,7 @@ aarch64_frame_align (struct gdbarch *gdbarch, CORE_ADDR sp)
 static struct type *
 aarch64_vnq_type (struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (tdep->vnq_type == NULL)
     {
@@ -1979,7 +1984,7 @@ aarch64_vnq_type (struct gdbarch *gdbarch)
 static struct type *
 aarch64_vnd_type (struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (tdep->vnd_type == NULL)
     {
@@ -2009,7 +2014,7 @@ aarch64_vnd_type (struct gdbarch *gdbarch)
 static struct type *
 aarch64_vns_type (struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (tdep->vns_type == NULL)
     {
@@ -2039,7 +2044,7 @@ aarch64_vns_type (struct gdbarch *gdbarch)
 static struct type *
 aarch64_vnh_type (struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (tdep->vnh_type == NULL)
     {
@@ -2072,7 +2077,7 @@ aarch64_vnh_type (struct gdbarch *gdbarch)
 static struct type *
 aarch64_vnb_type (struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (tdep->vnb_type == NULL)
     {
@@ -2099,7 +2104,7 @@ aarch64_vnb_type (struct gdbarch *gdbarch)
 static struct type *
 aarch64_vnv_type (struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (tdep->vnv_type == NULL)
     {
@@ -2170,7 +2175,7 @@ aarch64_vnv_type (struct gdbarch *gdbarch)
 static int
 aarch64_dwarf_reg_to_regnum (struct gdbarch *gdbarch, int reg)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (reg >= AARCH64_DWARF_X0 && reg <= AARCH64_DWARF_X0 + 30)
     return AARCH64_X0_REGNUM + reg - AARCH64_DWARF_X0;
@@ -2457,7 +2462,7 @@ aarch64_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
   CORE_ADDR jb_addr;
   gdb_byte buf[X_REGISTER_SIZE];
   struct gdbarch *gdbarch = get_frame_arch (frame);
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
 
   jb_addr = get_frame_register_unsigned (frame, AARCH64_X0_REGNUM);
@@ -2488,7 +2493,7 @@ aarch64_gen_return_address (struct gdbarch *gdbarch,
 static const char *
 aarch64_pseudo_register_name (struct gdbarch *gdbarch, int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   static const char *const q_name[] =
     {
@@ -2602,7 +2607,7 @@ aarch64_pseudo_register_name (struct gdbarch *gdbarch, int regnum)
 static struct type *
 aarch64_pseudo_register_type (struct gdbarch *gdbarch, int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   int p_regnum = regnum - gdbarch_num_regs (gdbarch);
 
@@ -2639,7 +2644,7 @@ static int
 aarch64_pseudo_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
 				    struct reggroup *group)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   int p_regnum = regnum - gdbarch_num_regs (gdbarch);
 
@@ -2693,7 +2698,7 @@ static struct value *
 aarch64_pseudo_read_value (struct gdbarch *gdbarch, readable_regcache *regcache,
 			   int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   struct value *result_value = allocate_value (register_type (gdbarch, regnum));
 
   VALUE_LVAL (result_value) = lval_register;
@@ -2763,7 +2768,7 @@ static void
 aarch64_pseudo_write (struct gdbarch *gdbarch, struct regcache *regcache,
 		      int regnum, const gdb_byte *buf)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   regnum -= gdbarch_num_regs (gdbarch);
 
   if (regnum >= AARCH64_Q0_REGNUM && regnum < AARCH64_Q0_REGNUM + 32)
@@ -3328,7 +3333,7 @@ aarch64_add_reggroups (struct gdbarch *gdbarch)
 static int
 aarch64_cannot_store_register (struct gdbarch *gdbarch, int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (!tdep->has_pauth ())
     return 0;
@@ -3375,7 +3380,8 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
        best_arch != nullptr;
        best_arch = gdbarch_list_lookup_by_info (best_arch->next, &info))
     {
-      struct gdbarch_tdep *tdep = gdbarch_tdep (best_arch->gdbarch);
+      aarch64_gdbarch_tdep *tdep
+	= (aarch64_gdbarch_tdep *) gdbarch_tdep (best_arch->gdbarch);
       if (tdep && tdep->vq == vq)
 	return best_arch->gdbarch;
     }
@@ -3483,7 +3489,7 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   /* AArch64 code is always little-endian.  */
   info.byte_order_for_code = BFD_ENDIAN_LITTLE;
 
-  struct gdbarch_tdep *tdep = XCNEW (struct gdbarch_tdep);
+  aarch64_gdbarch_tdep *tdep = new aarch64_gdbarch_tdep;
   struct gdbarch *gdbarch = gdbarch_alloc (&info, tdep);
 
   /* This should be low enough for everything.  */
@@ -3605,7 +3611,7 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 static void
 aarch64_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (tdep == NULL)
     return;
@@ -3825,7 +3831,9 @@ aarch64_record_data_proc_imm (insn_decode_record *aarch64_insn_r)
 static unsigned int
 aarch64_record_branch_except_sys (insn_decode_record *aarch64_insn_r)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (aarch64_insn_r->gdbarch);
+
+  aarch64_gdbarch_tdep *tdep
+    = (aarch64_gdbarch_tdep *) gdbarch_tdep (aarch64_insn_r->gdbarch);
   uint8_t insn_bits24_27, insn_bits28_31, insn_bits22_23;
   uint32_t record_buf[4];
 
diff --git a/gdb/aarch64-tdep.h b/gdb/aarch64-tdep.h
index 7bf612b012a..efb0fa2d5b2 100644
--- a/gdb/aarch64-tdep.h
+++ b/gdb/aarch64-tdep.h
@@ -25,6 +25,7 @@
 #include "arch/aarch64.h"
 #include "displaced-stepping.h"
 #include "infrun.h"
+#include "gdbarch.h"
 
 /* Forward declarations.  */
 struct gdbarch;
@@ -60,31 +61,32 @@ struct regset;
 #define AARCH64_DISPLACED_MODIFIED_INSNS 1
 
 /* Target-dependent structure in gdbarch.  */
-struct gdbarch_tdep
+struct aarch64_gdbarch_tdep : gdbarch_tdep
 {
   /* Lowest address at which instructions will appear.  */
-  CORE_ADDR lowest_pc;
+  CORE_ADDR lowest_pc = 0;
 
   /* Offset to PC value in jump buffer.  If this is negative, longjmp
      support will be disabled.  */
-  int jb_pc;
+  int jb_pc = 0;
 
   /* And the size of each entry in the buf.  */
-  size_t jb_elt_size;
+  size_t jb_elt_size = 0;
 
   /* Types for AdvSISD registers.  */
-  struct type *vnq_type;
-  struct type *vnd_type;
-  struct type *vns_type;
-  struct type *vnh_type;
-  struct type *vnb_type;
-  struct type *vnv_type;
+  struct type *vnq_type = nullptr;
+  struct type *vnd_type = nullptr;
+  struct type *vns_type = nullptr;
+  struct type *vnh_type = nullptr;
+  struct type *vnb_type = nullptr;
+  struct type *vnv_type = nullptr;
 
   /* syscall record.  */
-  int (*aarch64_syscall_record) (struct regcache *regcache, unsigned long svc_number);
+  int (*aarch64_syscall_record) (struct regcache *regcache,
+				 unsigned long svc_number) = nullptr;
 
   /* The VQ value for SVE targets, or zero if SVE is not supported.  */
-  uint64_t vq;
+  uint64_t vq = 0;
 
   /* Returns true if the target supports SVE.  */
   bool has_sve () const
@@ -92,8 +94,8 @@ struct gdbarch_tdep
     return vq != 0;
   }
 
-  int pauth_reg_base;
-  int pauth_ra_state_regnum;
+  int pauth_reg_base = 0;
+  int pauth_ra_state_regnum = 0;
 
   /* Returns true if the target supports pauth.  */
   bool has_pauth () const
@@ -102,7 +104,7 @@ struct gdbarch_tdep
   }
 
   /* First MTE register.  This is -1 if no MTE registers are available.  */
-  int mte_reg_base;
+  int mte_reg_base = 0;
 
   /* Returns true if the target supports MTE.  */
   bool has_mte () const
diff --git a/gdb/alpha-linux-tdep.c b/gdb/alpha-linux-tdep.c
index 0a00fc1f310..b821a6bd93a 100644
--- a/gdb/alpha-linux-tdep.c
+++ b/gdb/alpha-linux-tdep.c
@@ -354,8 +354,6 @@ alpha_linux_gdb_signal_to_target (struct gdbarch *gdbarch,
 static void
 alpha_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep;
-
   linux_init_abi (info, gdbarch, 0);
 
   /* Hook into the DWARF CFI frame unwinder.  */
@@ -364,7 +362,7 @@ alpha_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
   /* Hook into the MDEBUG frame unwinder.  */
   alpha_mdebug_init_abi (info, gdbarch);
 
-  tdep = gdbarch_tdep (gdbarch);
+  alpha_gdbarch_tdep *tdep = (alpha_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   tdep->dynamic_sigtramp_offset = alpha_linux_sigtramp_offset;
   tdep->sigcontext_addr = alpha_linux_sigcontext_addr;
   tdep->pc_in_sigtramp = alpha_linux_pc_in_sigtramp;
diff --git a/gdb/alpha-netbsd-tdep.c b/gdb/alpha-netbsd-tdep.c
index 0b03aa19de1..b19f76bef06 100644
--- a/gdb/alpha-netbsd-tdep.c
+++ b/gdb/alpha-netbsd-tdep.c
@@ -250,7 +250,7 @@ static void
 alphanbsd_init_abi (struct gdbarch_info info,
 		    struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  alpha_gdbarch_tdep *tdep = (alpha_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* Hook into the DWARF CFI frame unwinder.  */
   alpha_dwarf2_init_abi (info, gdbarch);
diff --git a/gdb/alpha-obsd-tdep.c b/gdb/alpha-obsd-tdep.c
index 0afd4dc56d8..7ca5ca17c6e 100644
--- a/gdb/alpha-obsd-tdep.c
+++ b/gdb/alpha-obsd-tdep.c
@@ -97,7 +97,7 @@ alphaobsd_sigcontext_addr (struct frame_info *this_frame)
 static void
 alphaobsd_init_abi(struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  alpha_gdbarch_tdep *tdep = (alpha_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* Hook into the DWARF CFI frame unwinder.  */
   alpha_dwarf2_init_abi (info, gdbarch);
diff --git a/gdb/alpha-tdep.c b/gdb/alpha-tdep.c
index 03935d1db78..760a18a178a 100644
--- a/gdb/alpha-tdep.c
+++ b/gdb/alpha-tdep.c
@@ -615,11 +615,12 @@ alpha_return_value (struct gdbarch *gdbarch, struct value *function,
 		    gdb_byte *readbuf, const gdb_byte *writebuf)
 {
   enum type_code code = type->code ();
+  alpha_gdbarch_tdep *tdep = (alpha_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if ((code == TYPE_CODE_STRUCT
        || code == TYPE_CODE_UNION
        || code == TYPE_CODE_ARRAY)
-      && gdbarch_tdep (gdbarch)->return_in_memory (type))
+      && tdep->return_in_memory (type))
     {
       if (readbuf)
 	{
@@ -850,7 +851,7 @@ static int
 alpha_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  alpha_gdbarch_tdep *tdep = (alpha_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   CORE_ADDR jb_addr;
   gdb_byte raw_buffer[ALPHA_REGISTER_SIZE];
@@ -882,7 +883,6 @@ alpha_sigtramp_frame_unwind_cache (struct frame_info *this_frame,
 				   void **this_prologue_cache)
 {
   struct alpha_sigtramp_unwind_cache *info;
-  struct gdbarch_tdep *tdep;
 
   if (*this_prologue_cache)
     return (struct alpha_sigtramp_unwind_cache *) *this_prologue_cache;
@@ -890,7 +890,8 @@ alpha_sigtramp_frame_unwind_cache (struct frame_info *this_frame,
   info = FRAME_OBSTACK_ZALLOC (struct alpha_sigtramp_unwind_cache);
   *this_prologue_cache = info;
 
-  tdep = gdbarch_tdep (get_frame_arch (this_frame));
+  gdbarch *arch = get_frame_arch (this_frame);
+  alpha_gdbarch_tdep *tdep = (alpha_gdbarch_tdep *) gdbarch_tdep (arch);
   info->sigcontext_addr = tdep->sigcontext_addr (this_frame);
 
   return info;
@@ -903,7 +904,7 @@ static CORE_ADDR
 alpha_sigtramp_register_address (struct gdbarch *gdbarch,
 				 CORE_ADDR sigcontext_addr, int regnum)
 { 
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  alpha_gdbarch_tdep *tdep = (alpha_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (regnum >= 0 && regnum < 32)
     return sigcontext_addr + tdep->sc_regs_offset + regnum * 8;
@@ -924,7 +925,7 @@ alpha_sigtramp_frame_this_id (struct frame_info *this_frame,
 			      struct frame_id *this_id)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  alpha_gdbarch_tdep *tdep = (alpha_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   struct alpha_sigtramp_unwind_cache *info
     = alpha_sigtramp_frame_unwind_cache (this_frame, this_prologue_cache);
   CORE_ADDR stack_addr, code_addr;
@@ -999,14 +1000,16 @@ alpha_sigtramp_frame_sniffer (const struct frame_unwind *self,
 
   /* We shouldn't even bother to try if the OSABI didn't register a
      sigcontext_addr handler or pc_in_sigtramp handler.  */
-  if (gdbarch_tdep (gdbarch)->sigcontext_addr == NULL)
+  alpha_gdbarch_tdep *tdep = (alpha_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+  if (tdep->sigcontext_addr == NULL)
     return 0;
-  if (gdbarch_tdep (gdbarch)->pc_in_sigtramp == NULL)
+
+  if (tdep->pc_in_sigtramp == NULL)
     return 0;
 
   /* Otherwise we should be in a signal frame.  */
   find_pc_partial_function (pc, &name, NULL, NULL);
-  if (gdbarch_tdep (gdbarch)->pc_in_sigtramp (gdbarch, pc, name))
+  if (tdep->pc_in_sigtramp (gdbarch, pc, name))
     return 1;
 
   return 0;
@@ -1038,7 +1041,7 @@ static int heuristic_fence_post = 0;
 static CORE_ADDR
 alpha_heuristic_proc_start (struct gdbarch *gdbarch, CORE_ADDR pc)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  alpha_gdbarch_tdep *tdep = (alpha_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   CORE_ADDR last_non_nop = pc;
   CORE_ADDR fence = pc - heuristic_fence_post;
   CORE_ADDR orig_pc = pc;
@@ -1724,7 +1727,6 @@ alpha_software_single_step (struct regcache *regcache)
 static struct gdbarch *
 alpha_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 {
-  struct gdbarch_tdep *tdep;
   struct gdbarch *gdbarch;
 
   /* Find a candidate among extant architectures.  */
@@ -1732,7 +1734,7 @@ alpha_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   if (arches != NULL)
     return arches->gdbarch;
 
-  tdep = XCNEW (struct gdbarch_tdep);
+  alpha_gdbarch_tdep *tdep = new alpha_gdbarch_tdep;
   gdbarch = gdbarch_alloc (&info, tdep);
 
   /* Lowest text address.  This is used by heuristic_proc_start()
diff --git a/gdb/alpha-tdep.h b/gdb/alpha-tdep.h
index c1fd69493e8..c1674fea8cb 100644
--- a/gdb/alpha-tdep.h
+++ b/gdb/alpha-tdep.h
@@ -19,6 +19,8 @@
 #ifndef ALPHA_TDEP_H
 #define ALPHA_TDEP_H
 
+#include "gdbarch.h"
+
 struct regcache;
 
 /* Say how long (ordinary) registers are.  This is a piece of bogosity
@@ -68,38 +70,38 @@ struct regcache;
 #define ALPHA_NUM_ARG_REGS   6
 
 /* Target-dependent structure in gdbarch.  */
-struct gdbarch_tdep
+struct alpha_gdbarch_tdep : gdbarch_tdep
 {
-  CORE_ADDR vm_min_address;	/* Used by alpha_heuristic_proc_start.  */
+  CORE_ADDR vm_min_address = 0;	/* Used by alpha_heuristic_proc_start.  */
 
   /* If PC is inside a dynamically-generated signal trampoline function
      (i.e. one copied onto the user stack at run-time), return how many
      bytes PC is beyond the start of that function.  Otherwise, return -1.  */
-  LONGEST (*dynamic_sigtramp_offset) (struct gdbarch *, CORE_ADDR);
+  LONGEST (*dynamic_sigtramp_offset) (struct gdbarch *, CORE_ADDR) = nullptr;
 
   /* Translate a signal handler stack base address into the address of
      the sigcontext structure for that signal handler.  */
-  CORE_ADDR (*sigcontext_addr) (struct frame_info *);
+  CORE_ADDR (*sigcontext_addr) (struct frame_info *) = nullptr;
 
   /* Does the PC fall in a signal trampoline.  */
   /* NOTE: cagney/2004-04-30: Do not copy/clone this code.  Instead
      look at tramp-frame.h and other simpler per-architecture
      sigtramp unwinders.  */
   int (*pc_in_sigtramp) (struct gdbarch *gdbarch, CORE_ADDR pc,
-			 const char *name);
+			 const char *name) = nullptr;
 
   /* If TYPE will be returned in memory, return true.  */
-  int (*return_in_memory) (struct type *type);
+  int (*return_in_memory) (struct type *type) = nullptr;
 
   /* Offset of registers in `struct sigcontext'.  */
-  int sc_pc_offset;
-  int sc_regs_offset;
-  int sc_fpregs_offset;
+  int sc_pc_offset = 0;
+  int sc_regs_offset = 0;
+  int sc_fpregs_offset = 0;
 
-  int jb_pc;			/* Offset to PC value in jump buffer.
+  int jb_pc = 0;			/* Offset to PC value in jump buffer.
 				   If htis is negative, longjmp support
 				   will be disabled.  */
-  size_t jb_elt_size;		/* And the size of each entry in the buf.  */
+  size_t jb_elt_size = 0;		/* And the size of each entry in the buf.  */
 };
 
 extern unsigned int alpha_read_insn (struct gdbarch *gdbarch, CORE_ADDR pc);
diff --git a/gdb/amd64-darwin-tdep.c b/gdb/amd64-darwin-tdep.c
index 3bd6296626d..5cf3ff266a4 100644
--- a/gdb/amd64-darwin-tdep.c
+++ b/gdb/amd64-darwin-tdep.c
@@ -97,7 +97,7 @@ amd64_darwin_sigcontext_addr (struct frame_info *this_frame)
 static void
 x86_darwin_init_abi_64 (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   amd64_init_abi (info, gdbarch,
 		  amd64_target_description (X86_XSTATE_SSE_MASK, true));
diff --git a/gdb/amd64-fbsd-tdep.c b/gdb/amd64-fbsd-tdep.c
index 289431306ab..5069342ca73 100644
--- a/gdb/amd64-fbsd-tdep.c
+++ b/gdb/amd64-fbsd-tdep.c
@@ -195,7 +195,7 @@ amd64fbsd_iterate_over_regset_sections (struct gdbarch *gdbarch,
 					void *cb_data,
 					const struct regcache *regcache)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   cb (".reg", tdep->sizeof_gregset, tdep->sizeof_gregset, &i386_gregset, NULL,
       cb_data);
@@ -229,7 +229,7 @@ amd64fbsd_get_thread_local_address (struct gdbarch *gdbarch, ptid_t ptid,
 static void
 amd64fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* Generic FreeBSD support. */
   fbsd_init_abi (info, gdbarch);
diff --git a/gdb/amd64-linux-tdep.c b/gdb/amd64-linux-tdep.c
index 715add8a7b0..817a197ceaa 100644
--- a/gdb/amd64-linux-tdep.c
+++ b/gdb/amd64-linux-tdep.c
@@ -1650,7 +1650,7 @@ amd64_linux_iterate_over_regset_sections (struct gdbarch *gdbarch,
 					  void *cb_data,
 					  const struct regcache *regcache)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   cb (".reg", 27 * 8, 27 * 8, &i386_gregset, NULL, cb_data);
   cb (".reg2", 512, 512, &amd64_fpregset, NULL, cb_data);
@@ -1787,7 +1787,7 @@ static void
 amd64_linux_init_abi_common(struct gdbarch_info info, struct gdbarch *gdbarch,
 			    int num_disp_step_buffers)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   linux_init_abi (info, gdbarch, num_disp_step_buffers);
 
@@ -1840,7 +1840,7 @@ amd64_linux_init_abi_common(struct gdbarch_info info, struct gdbarch *gdbarch,
 static void
 amd64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   struct tdesc_arch_data *tdesc_data = info.tdesc_data;
   const struct tdesc_feature *feature;
   int valid_p;
@@ -2054,7 +2054,7 @@ amd64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 static void
 amd64_x32_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   struct tdesc_arch_data *tdesc_data = info.tdesc_data;
   const struct tdesc_feature *feature;
   int valid_p;
diff --git a/gdb/amd64-netbsd-tdep.c b/gdb/amd64-netbsd-tdep.c
index 439dd91febb..be8ee3725f6 100644
--- a/gdb/amd64-netbsd-tdep.c
+++ b/gdb/amd64-netbsd-tdep.c
@@ -97,7 +97,7 @@ int amd64nbsd_r_reg_offset[] =
 static void
 amd64nbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* Initialize general-purpose register set details first.  */
   tdep->gregset_reg_offset = amd64nbsd_r_reg_offset;
diff --git a/gdb/amd64-obsd-tdep.c b/gdb/amd64-obsd-tdep.c
index 070f19635aa..0da1dbf4e4b 100644
--- a/gdb/amd64-obsd-tdep.c
+++ b/gdb/amd64-obsd-tdep.c
@@ -420,7 +420,7 @@ static const struct frame_unwind amd64obsd_trapframe_unwind =
 static void
 amd64obsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   amd64_init_abi (info, gdbarch,
 		  amd64_target_description (X86_XSTATE_SSE_MASK, true));
diff --git a/gdb/amd64-sol2-tdep.c b/gdb/amd64-sol2-tdep.c
index e561c0d300c..4cb243bda40 100644
--- a/gdb/amd64-sol2-tdep.c
+++ b/gdb/amd64-sol2-tdep.c
@@ -80,7 +80,7 @@ amd64_sol2_mcontext_addr (struct frame_info *this_frame)
 static void
 amd64_sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   tdep->gregset_reg_offset = amd64_sol2_gregset_reg_offset;
   tdep->gregset_num_regs = ARRAY_SIZE (amd64_sol2_gregset_reg_offset);
diff --git a/gdb/amd64-tdep.c b/gdb/amd64-tdep.c
index de04bbd07c1..7c67359678b 100644
--- a/gdb/amd64-tdep.c
+++ b/gdb/amd64-tdep.c
@@ -247,7 +247,7 @@ static const int amd64_dwarf_regmap_len =
 static int
 amd64_dwarf_reg_to_regnum (struct gdbarch *gdbarch, int reg)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int ymm0_regnum = tdep->ymm0_regnum;
   int regnum = -1;
 
@@ -331,7 +331,7 @@ static const char * const amd64_dword_names[] =
 static const char *
 amd64_pseudo_register_name (struct gdbarch *gdbarch, int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   if (i386_byte_regnum_p (gdbarch, regnum))
     return amd64_byte_names[regnum - tdep->al_regnum];
   else if (i386_zmm_regnum_p (gdbarch, regnum))
@@ -353,7 +353,7 @@ amd64_pseudo_register_read_value (struct gdbarch *gdbarch,
 				  readable_regcache *regcache,
 				  int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   value *result_value = allocate_value (register_type (gdbarch, regnum));
   VALUE_LVAL (result_value) = lval_register;
@@ -413,7 +413,7 @@ amd64_pseudo_register_write (struct gdbarch *gdbarch,
 			     struct regcache *regcache,
 			     int regnum, const gdb_byte *buf)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (i386_byte_regnum_p (gdbarch, regnum))
     {
@@ -465,7 +465,7 @@ static int
 amd64_ax_pseudo_register_collect (struct gdbarch *gdbarch,
 				  struct agent_expr *ax, int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (i386_byte_regnum_p (gdbarch, regnum))
     {
@@ -2739,7 +2739,7 @@ static struct amd64_frame_cache *
 amd64_sigtramp_frame_cache (struct frame_info *this_frame, void **this_cache)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   struct amd64_frame_cache *cache;
   CORE_ADDR addr;
@@ -2821,7 +2821,8 @@ amd64_sigtramp_frame_sniffer (const struct frame_unwind *self,
 			      struct frame_info *this_frame,
 			      void **this_cache)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (get_frame_arch (this_frame));
+  gdbarch *arch = get_frame_arch (this_frame);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (arch);
 
   /* We shouldn't even bother if we don't have a sigcontext_addr
      handler.  */
@@ -3021,7 +3022,7 @@ amd64_supply_fpregset (const struct regset *regset, struct regcache *regcache,
 		       int regnum, const void *fpregs, size_t len)
 {
   struct gdbarch *gdbarch = regcache->arch ();
-  const struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  const i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   gdb_assert (len >= tdep->sizeof_fpregset);
   amd64_supply_fxsave (regcache, regnum, fpregs);
@@ -3038,7 +3039,7 @@ amd64_collect_fpregset (const struct regset *regset,
 			int regnum, void *fpregs, size_t len)
 {
   struct gdbarch *gdbarch = regcache->arch ();
-  const struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  const i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   gdb_assert (len >= tdep->sizeof_fpregset);
   amd64_collect_fxsave (regcache, regnum, fpregs);
@@ -3062,7 +3063,8 @@ amd64_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
   gdb_byte buf[8];
   CORE_ADDR jb_addr;
   struct gdbarch *gdbarch = get_frame_arch (frame);
-  int jb_pc_offset = gdbarch_tdep (gdbarch)->jb_pc_offset;
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+  int jb_pc_offset = tdep->jb_pc_offset;
   int len = TYPE_LENGTH (builtin_type (gdbarch)->builtin_func_ptr);
 
   /* If JB_PC_OFFSET is -1, we have no way to find out where the
@@ -3105,7 +3107,7 @@ void
 amd64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch,
 		const target_desc *default_tdesc)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   const struct target_desc *tdesc = info.target_desc;
   static const char *const stap_integer_prefixes[] = { "$", NULL };
   static const char *const stap_register_prefixes[] = { "%", NULL };
@@ -3284,7 +3286,7 @@ amd64_none_init_abi (gdbarch_info info, gdbarch *arch)
 static struct type *
 amd64_x32_pseudo_register_type (struct gdbarch *gdbarch, int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   switch (regnum - tdep->eax_regnum)
     {
@@ -3302,7 +3304,7 @@ void
 amd64_x32_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch,
 		    const target_desc *default_tdesc)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   amd64_init_abi (info, gdbarch, default_tdesc);
 
@@ -3372,7 +3374,7 @@ amd64_supply_fxsave (struct regcache *regcache, int regnum,
 		     const void *fxsave)
 {
   struct gdbarch *gdbarch = regcache->arch ();
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   i387_supply_fxsave (regcache, regnum, fxsave);
 
@@ -3395,7 +3397,7 @@ amd64_supply_xsave (struct regcache *regcache, int regnum,
 		    const void *xsave)
 {
   struct gdbarch *gdbarch = regcache->arch ();
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   i387_supply_xsave (regcache, regnum, xsave);
 
@@ -3430,7 +3432,7 @@ amd64_collect_fxsave (const struct regcache *regcache, int regnum,
 		      void *fxsave)
 {
   struct gdbarch *gdbarch = regcache->arch ();
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   gdb_byte *regs = (gdb_byte *) fxsave;
 
   i387_collect_fxsave (regcache, regnum, fxsave);
@@ -3451,7 +3453,7 @@ amd64_collect_xsave (const struct regcache *regcache, int regnum,
 		     void *xsave, int gcore)
 {
   struct gdbarch *gdbarch = regcache->arch ();
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   gdb_byte *regs = (gdb_byte *) xsave;
 
   i387_collect_xsave (regcache, regnum, xsave, gcore);
diff --git a/gdb/amd64-windows-tdep.c b/gdb/amd64-windows-tdep.c
index ed783f6420c..fb3fe488ce1 100644
--- a/gdb/amd64-windows-tdep.c
+++ b/gdb/amd64-windows-tdep.c
@@ -1277,7 +1277,7 @@ amd64_windows_auto_wide_charset (void)
 static void
 amd64_windows_init_abi_common (gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* The dwarf2 unwinder (appended very early by i386_gdbarch_init) is
      preferred over the SEH one.  The reasons are:
diff --git a/gdb/arc-linux-tdep.c b/gdb/arc-linux-tdep.c
index 448fa370a36..de95d5acff9 100644
--- a/gdb/arc-linux-tdep.c
+++ b/gdb/arc-linux-tdep.c
@@ -410,7 +410,7 @@ static std::vector<CORE_ADDR>
 arc_linux_software_single_step (struct regcache *regcache)
 {
   struct gdbarch *gdbarch = regcache->arch ();
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  arc_gdbarch_tdep *tdep = (arc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   struct disassemble_info di = arc_disassemble_info (gdbarch);
 
   /* Read current instruction.  */
@@ -692,7 +692,7 @@ arc_linux_core_read_description (struct gdbarch *gdbarch,
 static void
 arc_linux_init_osabi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  arc_gdbarch_tdep *tdep = (arc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   arc_linux_debug_printf ("GNU/Linux OS/ABI initialization.");
 
diff --git a/gdb/arc-tdep.c b/gdb/arc-tdep.c
index 35874ebb510..475ba2a5614 100644
--- a/gdb/arc-tdep.c
+++ b/gdb/arc-tdep.c
@@ -1002,7 +1002,7 @@ arc_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
   arc_debug_printf ("called");
 
   struct gdbarch *gdbarch = get_frame_arch (frame);
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  arc_gdbarch_tdep *tdep = (arc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int pc_offset = tdep->jb_pc * ARC_REGISTER_SIZE;
   gdb_byte buf[ARC_REGISTER_SIZE];
   CORE_ADDR jb_addr = get_frame_register_unsigned (frame, ARC_FIRST_ARG_REGNUM);
@@ -1832,7 +1832,8 @@ arc_make_sigtramp_frame_cache (struct frame_info *this_frame)
 {
   arc_debug_printf ("called");
 
-  struct gdbarch_tdep *tdep = gdbarch_tdep (get_frame_arch (this_frame));
+  gdbarch *arch = get_frame_arch (this_frame);
+  arc_gdbarch_tdep *tdep = (arc_gdbarch_tdep *) gdbarch_tdep (arch);
 
   /* Allocate new frame cache instance and space for saved register info.  */
   struct arc_frame_cache *cache = FRAME_OBSTACK_ZALLOC (struct arc_frame_cache);
@@ -1906,11 +1907,10 @@ arc_sigtramp_frame_sniffer (const struct frame_unwind *self,
 			    struct frame_info *this_frame,
 			    void **this_cache)
 {
-  struct gdbarch_tdep *tdep;
-
   arc_debug_printf ("called");
 
-  tdep = gdbarch_tdep (get_frame_arch (this_frame));
+  gdbarch *arch = get_frame_arch (this_frame);
+  arc_gdbarch_tdep *tdep = (arc_gdbarch_tdep *) gdbarch_tdep (arch);
 
   /* If we have a sigcontext_addr handler, then just return 1 (same as the
      "default_frame_sniffer ()").  */
@@ -2295,11 +2295,11 @@ arc_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 
   /* Allocate the ARC-private target-dependent information structure, and the
      GDB target-independent information structure.  */
-  gdb::unique_xmalloc_ptr<struct gdbarch_tdep> tdep
-    (XCNEW (struct gdbarch_tdep));
+  std::unique_ptr<arc_gdbarch_tdep> tdep_holder (new arc_gdbarch_tdep);
+  arc_gdbarch_tdep *tdep = tdep_holder.get ();
   tdep->jb_pc = -1; /* No longjmp support by default.  */
   tdep->has_hw_loops = arc_check_for_hw_loops (tdesc, tdesc_data.get ());
-  struct gdbarch *gdbarch = gdbarch_alloc (&info, tdep.release ());
+  struct gdbarch *gdbarch = gdbarch_alloc (&info, tdep_holder.release ());
 
   /* Data types.  */
   set_gdbarch_short_bit (gdbarch, 16);
@@ -2384,7 +2384,7 @@ arc_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
      It can override functions set earlier.  */
   gdbarch_init_osabi (info, gdbarch);
 
-  if (gdbarch_tdep (gdbarch)->jb_pc >= 0)
+  if (tdep->jb_pc >= 0)
     set_gdbarch_get_longjmp_target (gdbarch, arc_get_longjmp_target);
 
   /* Disassembler options.  Enforce CPU if it was specified in XML target
@@ -2454,7 +2454,7 @@ arc_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 static void
 arc_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  arc_gdbarch_tdep *tdep = (arc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   fprintf_unfiltered (file, "arc_dump_tdep: jb_pc = %i\n", tdep->jb_pc);
 
diff --git a/gdb/arc-tdep.h b/gdb/arc-tdep.h
index 8bb005cc7d4..d8495ed3154 100644
--- a/gdb/arc-tdep.h
+++ b/gdb/arc-tdep.h
@@ -121,27 +121,27 @@ extern bool arc_debug;
 
 /* Target-dependent information.  */
 
-struct gdbarch_tdep
+struct arc_gdbarch_tdep : gdbarch_tdep
 {
   /* Offset to PC value in jump buffer.  If this is negative, longjmp
      support will be disabled.  */
-  int jb_pc;
+  int jb_pc = 0;
 
   /* Whether target has hardware (aka zero-delay) loops.  */
-  bool has_hw_loops;
+  bool has_hw_loops = false;
 
   /* Detect sigtramp.  */
-  bool (*is_sigtramp) (struct frame_info *);
+  bool (*is_sigtramp) (struct frame_info *) = nullptr;
 
   /* Get address of sigcontext for sigtramp.  */
-  CORE_ADDR (*sigcontext_addr) (struct frame_info *);
+  CORE_ADDR (*sigcontext_addr) (struct frame_info *) = nullptr;
 
   /* Offset of registers in `struct sigcontext'.  */
-  const int *sc_reg_offset;
+  const int *sc_reg_offset = nullptr;
 
   /* Number of registers in sc_reg_offsets.  Most likely a ARC_LAST_REGNUM,
      but in theory it could be less, so it is kept separate.  */
-  int sc_num_regs;
+  int sc_num_regs = 0;
 };
 
 /* Utility functions used by other ARC-specific modules.  */
diff --git a/gdb/arm-fbsd-tdep.c b/gdb/arm-fbsd-tdep.c
index 3a179184550..a1482c49a43 100644
--- a/gdb/arm-fbsd-tdep.c
+++ b/gdb/arm-fbsd-tdep.c
@@ -158,7 +158,7 @@ arm_fbsd_iterate_over_regset_sections (struct gdbarch *gdbarch,
 				       void *cb_data,
 				       const struct regcache *regcache)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   cb (".reg", ARM_FBSD_SIZEOF_GREGSET, ARM_FBSD_SIZEOF_GREGSET,
       &arm_fbsd_gregset, NULL, cb_data);
@@ -211,7 +211,7 @@ arm_fbsd_core_read_description (struct gdbarch *gdbarch,
 static void
 arm_fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* Generic FreeBSD support.  */
   fbsd_init_abi (info, gdbarch);
diff --git a/gdb/arm-linux-tdep.c b/gdb/arm-linux-tdep.c
index c0dfc5fcf3e..025ecf0c625 100644
--- a/gdb/arm-linux-tdep.c
+++ b/gdb/arm-linux-tdep.c
@@ -712,7 +712,7 @@ arm_linux_iterate_over_regset_sections (struct gdbarch *gdbarch,
 					void *cb_data,
 					const struct regcache *regcache)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   cb (".reg", ARM_LINUX_SIZEOF_GREGSET, ARM_LINUX_SIZEOF_GREGSET,
       &arm_linux_gregset, NULL, cb_data);
@@ -1714,7 +1714,7 @@ arm_linux_init_abi (struct gdbarch_info info,
 								    NULL };
   static const char *const stap_register_indirection_suffixes[] = { "]",
 								    NULL };
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   linux_init_abi (info, gdbarch, 1);
 
diff --git a/gdb/arm-netbsd-tdep.c b/gdb/arm-netbsd-tdep.c
index 38c2e81e45d..bf4e46ff617 100644
--- a/gdb/arm-netbsd-tdep.c
+++ b/gdb/arm-netbsd-tdep.c
@@ -111,7 +111,7 @@ static void
 arm_netbsd_init_abi_common (struct gdbarch_info info,
 			    struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   tdep->lowest_pc = 0x8000;
   switch (info.byte_order)
@@ -148,7 +148,7 @@ static void
 arm_netbsd_elf_init_abi (struct gdbarch_info info,
 			 struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   arm_netbsd_init_abi_common (info, gdbarch);
 
diff --git a/gdb/arm-none-tdep.c b/gdb/arm-none-tdep.c
index 2816c5954b3..a308c794aae 100644
--- a/gdb/arm-none-tdep.c
+++ b/gdb/arm-none-tdep.c
@@ -177,7 +177,7 @@ arm_none_iterate_over_regset_sections (struct gdbarch *gdbarch,
 				       void *cb_data,
 				       const struct regcache *regcache)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   cb (".reg", ARM_NONE_SIZEOF_GREGSET, ARM_NONE_SIZEOF_GREGSET,
       &arm_none_gregset, nullptr, cb_data);
diff --git a/gdb/arm-obsd-tdep.c b/gdb/arm-obsd-tdep.c
index ec7a7484dd5..4fa88538e34 100644
--- a/gdb/arm-obsd-tdep.c
+++ b/gdb/arm-obsd-tdep.c
@@ -76,7 +76,7 @@ static void
 armobsd_init_abi (struct gdbarch_info info,
 		  struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (tdep->fp_model == ARM_FLOAT_AUTO)
     tdep->fp_model = ARM_FLOAT_SOFT_VFP;
diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c
index 5b60831bbe9..7495434484e 100644
--- a/gdb/arm-tdep.c
+++ b/gdb/arm-tdep.c
@@ -332,7 +332,9 @@ bool arm_apcs_32 = true;
 int
 arm_psr_thumb_bit (struct gdbarch *gdbarch)
 {
-  if (gdbarch_tdep (gdbarch)->is_m)
+  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+
+  if (tdep->is_m)
     return XPSR_T;
   else
     return CPSR_T;
@@ -438,6 +440,7 @@ arm_pc_is_thumb (struct gdbarch *gdbarch, CORE_ADDR memaddr)
   struct bound_minimal_symbol sym;
   char type;
   arm_displaced_step_copy_insn_closure *dsc = nullptr;
+  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (gdbarch_displaced_step_copy_insn_closure_by_addr_p (gdbarch))
     dsc = ((arm_displaced_step_copy_insn_closure * )
@@ -465,7 +468,7 @@ arm_pc_is_thumb (struct gdbarch *gdbarch, CORE_ADDR memaddr)
     return 1;
 
   /* ARM v6-M and v7-M are always in Thumb mode.  */
-  if (gdbarch_tdep (gdbarch)->is_m)
+  if (tdep->is_m)
     return 1;
 
   /* If there are mapping symbols, consult them.  */
@@ -568,10 +571,11 @@ arm_m_addr_is_magic (CORE_ADDR addr)
 static CORE_ADDR
 arm_addr_bits_remove (struct gdbarch *gdbarch, CORE_ADDR val)
 {
+  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+
   /* On M-profile devices, do not strip the low bit from EXC_RETURN
      (the magic exception return address).  */
-  if (gdbarch_tdep (gdbarch)->is_m
-      && arm_m_addr_is_magic (val))
+  if (tdep->is_m && arm_m_addr_is_magic (val))
     return val;
 
   if (arm_apcs_32)
@@ -1557,6 +1561,7 @@ arm_analyze_prologue (struct gdbarch *gdbarch,
   CORE_ADDR offset, current_pc;
   pv_t regs[ARM_FPS_REGNUM];
   CORE_ADDR unrecognized_pc = 0;
+  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* Search the prologue looking for instructions that set up the
      frame pointer, adjust the stack pointer, and save registers.
@@ -1661,7 +1666,7 @@ arm_analyze_prologue (struct gdbarch *gdbarch,
 	}
       else if ((insn & 0xffff7fff) == 0xed6d0103	/* stfe f?,
 							   [sp, -#c]! */
-	       && gdbarch_tdep (gdbarch)->have_fpa_registers)
+	       && tdep->have_fpa_registers)
 	{
 	  if (stack.store_would_trash (regs[ARM_SP_REGNUM]))
 	    break;
@@ -1672,7 +1677,7 @@ arm_analyze_prologue (struct gdbarch *gdbarch,
 	}
       else if ((insn & 0xffbf0fff) == 0xec2d0200	/* sfmfd f0, 4,
 							   [sp!] */
-	       && gdbarch_tdep (gdbarch)->have_fpa_registers)
+	       && tdep->have_fpa_registers)
 	{
 	  int n_saved_fp_regs;
 	  unsigned int fp_start_reg, fp_bound_reg;
@@ -1800,6 +1805,7 @@ arm_scan_prologue (struct frame_info *this_frame,
   CORE_ADDR prologue_start, prologue_end;
   CORE_ADDR prev_pc = get_frame_pc (this_frame);
   CORE_ADDR block_addr = get_frame_address_in_block (this_frame);
+  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* Assume there is no frame until proven otherwise.  */
   cache->framereg = ARM_SP_REGNUM;
@@ -1865,7 +1871,7 @@ arm_scan_prologue (struct frame_info *this_frame,
       ULONGEST return_value;
 
       /* AAPCS does not use a frame register, so we can abort here.  */
-      if (gdbarch_tdep (gdbarch)->arm_abi == ARM_ABI_AAPCS)
+      if (tdep->arm_abi == ARM_ABI_AAPCS)
 	return;
 
       frame_loc = get_frame_register_unsigned (this_frame, ARM_FP_REGNUM);
@@ -1930,7 +1936,9 @@ arm_prologue_unwind_stop_reason (struct frame_info *this_frame,
 
   /* This is meant to halt the backtrace at "_start".  */
   pc = get_frame_pc (this_frame);
-  if (pc <= gdbarch_tdep (get_frame_arch (this_frame))->lowest_pc)
+  gdbarch *arch = get_frame_arch (this_frame);
+  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (arch);
+  if (pc <= tdep->lowest_pc)
     return UNWIND_OUTERMOST;
 
   /* If we've hit a wall, stop.  */
@@ -3739,15 +3747,18 @@ arm_vfp_call_candidate (struct type *t, enum arm_vfp_cprc_base_type *base_type,
 static int
 arm_vfp_abi_for_function (struct gdbarch *gdbarch, struct type *func_type)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+
   /* Variadic functions always use the base ABI.  Assume that functions
      without debug info are not variadic.  */
   if (func_type && check_typedef (func_type)->has_varargs ())
     return 0;
+
   /* The VFP ABI is only supported as a variant of AAPCS.  */
   if (tdep->arm_abi != ARM_ABI_AAPCS)
     return 0;
-  return gdbarch_tdep (gdbarch)->fp_model == ARM_FLOAT_VFP;
+
+  return tdep->fp_model == ARM_FLOAT_VFP;
 }
 
 /* We currently only support passing parameters in integer registers, which
@@ -3770,6 +3781,7 @@ arm_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
   int use_vfp_abi;
   struct type *ftype;
   unsigned vfp_regs_free = (1 << 16) - 1;
+  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* Determine the type of this function and whether the VFP ABI
      applies.  */
@@ -3827,7 +3839,7 @@ arm_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
       align = (align + ARM_INT_REGISTER_SIZE - 1)
 		& ~(ARM_INT_REGISTER_SIZE - 1);
       /* Different ABIs have different maximum alignments.  */
-      if (gdbarch_tdep (gdbarch)->arm_abi == ARM_ABI_APCS)
+      if (tdep->arm_abi == ARM_ABI_APCS)
 	{
 	  /* The APCS ABI only requires word alignment.  */
 	  align = ARM_INT_REGISTER_SIZE;
@@ -4041,7 +4053,7 @@ arm_print_float_info (struct gdbarch *gdbarch, struct ui_file *file,
 static struct type *
 arm_ext_type (struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (!tdep->arm_ext_type)
     tdep->arm_ext_type
@@ -4054,7 +4066,7 @@ arm_ext_type (struct gdbarch *gdbarch)
 static struct type *
 arm_neon_double_type (struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (tdep->neon_double_type == NULL)
     {
@@ -4093,7 +4105,7 @@ arm_neon_double_type (struct gdbarch *gdbarch)
 static struct type *
 arm_neon_quad_type (struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (tdep->neon_quad_type == NULL)
     {
@@ -4131,7 +4143,7 @@ arm_neon_quad_type (struct gdbarch *gdbarch)
 static bool
 is_q_pseudo (struct gdbarch *gdbarch, int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* Q pseudo registers are available for both NEON (Q0~Q15) and
      MVE (Q0~Q7) features.  */
@@ -4152,7 +4164,7 @@ is_q_pseudo (struct gdbarch *gdbarch, int regnum)
 static bool
 is_s_pseudo (struct gdbarch *gdbarch, int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (tdep->have_s_pseudos
       && regnum >= tdep->s_pseudo_base
@@ -4171,7 +4183,7 @@ is_s_pseudo (struct gdbarch *gdbarch, int regnum)
 static bool
 is_mve_pseudo (struct gdbarch *gdbarch, int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (tdep->have_mve
       && regnum >= tdep->mve_pseudo_base
@@ -4187,7 +4199,7 @@ is_mve_pseudo (struct gdbarch *gdbarch, int regnum)
 static struct type *
 arm_register_type (struct gdbarch *gdbarch, int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (is_s_pseudo (gdbarch, regnum))
     return builtin_type (gdbarch)->builtin_float;
@@ -4369,9 +4381,10 @@ arm_adjust_breakpoint_address (struct gdbarch *gdbarch, CORE_ADDR bpaddr)
   int buf_len;
   enum bfd_endian order = gdbarch_byte_order_for_code (gdbarch);
   int i, any, last_it, last_it_count;
+  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* If we are using BKPT breakpoints, none of this is necessary.  */
-  if (gdbarch_tdep (gdbarch)->thumb2_breakpoint == NULL)
+  if (tdep->thumb2_breakpoint == NULL)
     return bpaddr;
 
   /* ARM mode does not have this problem.  */
@@ -7676,7 +7689,7 @@ arm_displaced_init_closure (struct gdbarch *gdbarch, CORE_ADDR from,
 			    CORE_ADDR to,
 			    arm_displaced_step_copy_insn_closure *dsc)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   unsigned int i, len, offset;
   enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
   int size = dsc->is_thumb? 2 : 4;
@@ -7839,7 +7852,7 @@ static const gdb_byte arm_default_thumb_be_breakpoint[] = THUMB_BE_BREAKPOINT;
 static int
 arm_breakpoint_kind_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
 
   if (arm_pc_is_thumb (gdbarch, *pcptr))
@@ -7874,7 +7887,7 @@ arm_breakpoint_kind_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr)
 static const gdb_byte *
 arm_sw_breakpoint_from_kind (struct gdbarch *gdbarch, int kind, int *size)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   switch (kind)
     {
@@ -7946,10 +7959,11 @@ arm_extract_return_value (struct type *type, struct regcache *regs,
 {
   struct gdbarch *gdbarch = regs->arch ();
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
+  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (TYPE_CODE_FLT == type->code ())
     {
-      switch (gdbarch_tdep (gdbarch)->fp_model)
+      switch (tdep->fp_model)
 	{
 	case ARM_FLOAT_FPA:
 	  {
@@ -8055,7 +8069,8 @@ arm_return_in_memory (struct gdbarch *gdbarch, struct type *type)
       return (TYPE_LENGTH (type) > 16);
     }
 
-  if (gdbarch_tdep (gdbarch)->arm_abi != ARM_ABI_APCS)
+  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+  if (tdep->arm_abi != ARM_ABI_APCS)
     {
       /* The AAPCS says all aggregates not larger than a word are returned
 	 in a register.  */
@@ -8158,8 +8173,9 @@ arm_store_return_value (struct type *type, struct regcache *regs,
   if (type->code () == TYPE_CODE_FLT)
     {
       gdb_byte buf[ARM_FP_REGISTER_SIZE];
+      arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
-      switch (gdbarch_tdep (gdbarch)->fp_model)
+      switch (tdep->fp_model)
 	{
 	case ARM_FLOAT_FPA:
 
@@ -8246,7 +8262,7 @@ arm_return_value (struct gdbarch *gdbarch, struct value *function,
 		  struct type *valtype, struct regcache *regcache,
 		  gdb_byte *readbuf, const gdb_byte *writebuf)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   struct type *func_type = function ? value_type (function) : NULL;
   enum arm_vfp_cprc_base_type vfp_base_type;
   int vfp_base_count;
@@ -8314,7 +8330,7 @@ static int
 arm_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   CORE_ADDR jb_addr;
   gdb_byte buf[ARM_INT_REGISTER_SIZE];
@@ -8503,7 +8519,8 @@ static void
 show_fp_model (struct ui_file *file, int from_tty,
 	       struct cmd_list_element *c, const char *value)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (target_gdbarch ());
+  arm_gdbarch_tdep *tdep
+    = (arm_gdbarch_tdep *) gdbarch_tdep (target_gdbarch ());
 
   if (arm_fp_model == ARM_FLOAT_AUTO
       && gdbarch_bfd_arch_info (target_gdbarch ())->arch == bfd_arch_arm)
@@ -8540,7 +8557,8 @@ static void
 arm_show_abi (struct ui_file *file, int from_tty,
 	     struct cmd_list_element *c, const char *value)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (target_gdbarch ());
+  arm_gdbarch_tdep *tdep
+    = (arm_gdbarch_tdep *) gdbarch_tdep (target_gdbarch ());
 
   if (arm_abi_global == ARM_ABI_AUTO
       && gdbarch_bfd_arch_info (target_gdbarch ())->arch == bfd_arch_arm)
@@ -8611,7 +8629,7 @@ show_disassembly_style_sfunc (struct ui_file *file, int from_tty,
 static const char *
 arm_register_name (struct gdbarch *gdbarch, int i)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (is_s_pseudo (gdbarch, i))
     {
@@ -8778,7 +8796,7 @@ static enum register_status
 arm_mve_pseudo_read (struct gdbarch *gdbarch, readable_regcache *regcache,
 		     int regnum, gdb_byte *buf)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* P0 is the first 16 bits of VPR.  */
   return regcache->raw_read_part (tdep->mve_vpr_regnum, 0, 2, buf);
@@ -8792,11 +8810,10 @@ arm_pseudo_read (struct gdbarch *gdbarch, readable_regcache *regcache,
   char name_buf[4];
   gdb_byte reg_buf[8];
   int offset, double_regnum;
+  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   gdb_assert (regnum >= num_regs);
 
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
-
   if (is_q_pseudo (gdbarch, regnum))
     {
       /* Quad-precision register.  */
@@ -8865,7 +8882,7 @@ static void
 arm_mve_pseudo_write (struct gdbarch *gdbarch, struct regcache *regcache,
 		      int regnum, const gdb_byte *buf)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* P0 is the first 16 bits of VPR.  */
   regcache->raw_write_part (tdep->mve_vpr_regnum, 0, 2, buf);
@@ -8879,11 +8896,10 @@ arm_pseudo_write (struct gdbarch *gdbarch, struct regcache *regcache,
   char name_buf[4];
   gdb_byte reg_buf[8];
   int offset, double_regnum;
+  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   gdb_assert (regnum >= num_regs);
 
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
-
   if (is_q_pseudo (gdbarch, regnum))
     {
       /* Quad-precision register.  */
@@ -8968,7 +8984,9 @@ arm_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
 static void
 arm_register_g_packet_guesses (struct gdbarch *gdbarch)
 {
-  if (gdbarch_tdep (gdbarch)->is_m)
+  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+
+  if (tdep->is_m)
     {
       const target_desc *tdesc;
 
@@ -9005,8 +9023,9 @@ arm_register_g_packet_guesses (struct gdbarch *gdbarch)
 static int
 arm_code_of_frame_writable (struct gdbarch *gdbarch, struct frame_info *frame)
 {
-  if (gdbarch_tdep (gdbarch)->is_m
-      && get_frame_type (frame) == SIGTRAMP_FRAME)
+  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+
+  if (tdep->is_m && get_frame_type (frame) == SIGTRAMP_FRAME)
     {
       /* M-profile exception frames return to some magic PCs, where
 	 isn't writable at all.  */
@@ -9037,7 +9056,6 @@ arm_gnu_triplet_regexp (struct gdbarch *gdbarch)
 static struct gdbarch *
 arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 {
-  struct gdbarch_tdep *tdep;
   struct gdbarch *gdbarch;
   struct gdbarch_list *best_arch;
   enum arm_abi_kind arm_abi = arm_abi_global;
@@ -9406,12 +9424,13 @@ arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
        best_arch != NULL;
        best_arch = gdbarch_list_lookup_by_info (best_arch->next, &info))
     {
-      if (arm_abi != ARM_ABI_AUTO
-	  && arm_abi != gdbarch_tdep (best_arch->gdbarch)->arm_abi)
+      arm_gdbarch_tdep *tdep
+	= (arm_gdbarch_tdep *) gdbarch_tdep (best_arch->gdbarch);
+
+      if (arm_abi != ARM_ABI_AUTO && arm_abi != tdep->arm_abi)
 	continue;
 
-      if (fp_model != ARM_FLOAT_AUTO
-	  && fp_model != gdbarch_tdep (best_arch->gdbarch)->fp_model)
+      if (fp_model != ARM_FLOAT_AUTO && fp_model != tdep->fp_model)
 	continue;
 
       /* There are various other properties in tdep that we do not
@@ -9420,7 +9439,7 @@ arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 	 automatically disqualified.  */
 
       /* Do check is_m, though, since it might come from the binary.  */
-      if (is_m != gdbarch_tdep (best_arch->gdbarch)->is_m)
+      if (is_m != tdep->is_m)
 	continue;
 
       /* Found a match.  */
@@ -9430,7 +9449,7 @@ arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   if (best_arch != NULL)
     return best_arch->gdbarch;
 
-  tdep = XCNEW (struct gdbarch_tdep);
+  arm_gdbarch_tdep *tdep = new arm_gdbarch_tdep;
   gdbarch = gdbarch_alloc (&info, tdep);
 
   /* Record additional information about the architecture we are defining.
@@ -9546,7 +9565,7 @@ arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 
   /* This "info float" is FPA-specific.  Use the generic version if we
      do not have FPA.  */
-  if (gdbarch_tdep (gdbarch)->have_fpa_registers)
+  if (tdep->have_fpa_registers)
     set_gdbarch_print_float_info (gdbarch, arm_print_float_info);
 
   /* Internal <-> external register number maps.  */
@@ -9692,7 +9711,7 @@ arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 static void
 arm_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (tdep == NULL)
     return;
@@ -11868,7 +11887,8 @@ static int
 arm_record_coproc_data_proc (insn_decode_record *arm_insn_r)
 {
   uint32_t op, op1_ebit, coproc, bits_24_25;
-  struct gdbarch_tdep *tdep = gdbarch_tdep (arm_insn_r->gdbarch);
+  arm_gdbarch_tdep *tdep
+    = (arm_gdbarch_tdep *) gdbarch_tdep (arm_insn_r->gdbarch);
   struct regcache *reg_cache = arm_insn_r->regcache;
 
   arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 24, 27);
@@ -12352,9 +12372,10 @@ thumb_record_misc (insn_decode_record *thumb_insn_r)
 /* Handling opcode 110 insns.  */
 
 static int
-thumb_record_ldm_stm_swi (insn_decode_record *thumb_insn_r)                
+thumb_record_ldm_stm_swi (insn_decode_record *thumb_insn_r)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (thumb_insn_r->gdbarch);
+  arm_gdbarch_tdep *tdep
+    = (arm_gdbarch_tdep *) gdbarch_tdep  (thumb_insn_r->gdbarch);
   struct regcache *reg_cache = thumb_insn_r->regcache;
 
   uint32_t ret = 0; /* function return value: -1:record failure ;  0:success  */
diff --git a/gdb/arm-tdep.h b/gdb/arm-tdep.h
index 705aa77a0ed..a43031886b7 100644
--- a/gdb/arm-tdep.h
+++ b/gdb/arm-tdep.h
@@ -87,69 +87,70 @@ enum struct_return
 };
 
 /* Target-dependent structure in gdbarch.  */
-struct gdbarch_tdep
+struct arm_gdbarch_tdep : gdbarch_tdep
 {
   /* The ABI for this architecture.  It should never be set to
      ARM_ABI_AUTO.  */
-  enum arm_abi_kind arm_abi;
+  enum arm_abi_kind arm_abi {};
 
-  enum arm_float_model fp_model; /* Floating point calling conventions.  */
+  enum arm_float_model fp_model {}; /* Floating point calling conventions.  */
 
-  bool have_fpa_registers;	/* Does the target report the FPA registers?  */
-  bool have_wmmx_registers;	/* Does the target report the WMMX registers?  */
+  bool have_fpa_registers = false;	/* Does the target report the FPA registers?  */
+  bool have_wmmx_registers = false;	/* Does the target report the WMMX registers?  */
   /* The number of VFP registers reported by the target.  It is zero
      if VFP registers are not supported.  */
-  int vfp_register_count;
-  bool have_s_pseudos;		/* Are we synthesizing the single precision
+  int vfp_register_count = 0;
+  bool have_s_pseudos = false;	/* Are we synthesizing the single precision
 				   VFP registers?  */
-  int s_pseudo_base;		/* Register number for the first S pseudo
+  int s_pseudo_base = 0;	/* Register number for the first S pseudo
 				   register.  */
-  int s_pseudo_count;		/* Number of S pseudo registers.  */
-  bool have_q_pseudos;		/* Are we synthesizing the quad precision
+  int s_pseudo_count = 0;	/* Number of S pseudo registers.  */
+  bool have_q_pseudos = false;	/* Are we synthesizing the quad precision
 				   Q (NEON or MVE) registers?  Requires
 				   have_s_pseudos.  */
-  int q_pseudo_base;		/* Register number for the first quad
+  int q_pseudo_base = 0;	/* Register number for the first quad
 				   precision pseudo register.  */
-  int q_pseudo_count;		/* Number of quad precision pseudo
+  int q_pseudo_count = 0;	/* Number of quad precision pseudo
 				   registers.  */
-  bool have_neon;		/* Do we have a NEON unit?  */
+  bool have_neon = false;	/* Do we have a NEON unit?  */
 
-  bool have_mve;		/* Do we have a MVE extension?  */
-  int mve_vpr_regnum;		/* MVE VPR register number.  */
-  int mve_pseudo_base;		/* Number of the first MVE pseudo register.  */
-  int mve_pseudo_count;		/* Total number of MVE pseudo registers.  */
+  bool have_mve = false;	/* Do we have a MVE extension?  */
+  int mve_vpr_regnum = 0;	/* MVE VPR register number.  */
+  int mve_pseudo_base = 0;	/* Number of the first MVE pseudo register.  */
+  int mve_pseudo_count = 0;	/* Total number of MVE pseudo registers.  */
 
-  bool is_m;			/* Does the target follow the "M" profile.  */
-  CORE_ADDR lowest_pc;		/* Lowest address at which instructions 
+  bool is_m = false;		/* Does the target follow the "M" profile.  */
+  CORE_ADDR lowest_pc = 0;	/* Lowest address at which instructions 
 				   will appear.  */
 
-  const gdb_byte *arm_breakpoint;	/* Breakpoint pattern for an ARM insn.  */
-  int arm_breakpoint_size;	/* And its size.  */
-  const gdb_byte *thumb_breakpoint;	/* Breakpoint pattern for a Thumb insn.  */
-  int thumb_breakpoint_size;	/* And its size.  */
+  const gdb_byte *arm_breakpoint = nullptr;	/* Breakpoint pattern for an ARM insn.  */
+  int arm_breakpoint_size = 0;	/* And its size.  */
+  const gdb_byte *thumb_breakpoint = nullptr;	/* Breakpoint pattern for a Thumb insn.  */
+  int thumb_breakpoint_size = 0;	/* And its size.  */
 
   /* If the Thumb breakpoint is an undefined instruction (which is
      affected by IT blocks) rather than a BKPT instruction (which is
      not), then we need a 32-bit Thumb breakpoint to preserve the
      instruction count in IT blocks.  */
-  const gdb_byte *thumb2_breakpoint;
-  int thumb2_breakpoint_size;
+  const gdb_byte *thumb2_breakpoint = nullptr;
+  int thumb2_breakpoint_size = 0;
 
-  int jb_pc;			/* Offset to PC value in jump buffer.
+  int jb_pc = 0;			/* Offset to PC value in jump buffer.
 				   If this is negative, longjmp support
 				   will be disabled.  */
-  size_t jb_elt_size;		/* And the size of each entry in the buf.  */
+  size_t jb_elt_size = 0;		/* And the size of each entry in the buf.  */
 
   /* Convention for returning structures.  */
-  enum struct_return struct_return;
+  enum struct_return struct_return {};
 
   /* ISA-specific data types.  */
-  struct type *arm_ext_type;
-  struct type *neon_double_type;
-  struct type *neon_quad_type;
+  struct type *arm_ext_type = nullptr;
+  struct type *neon_double_type = nullptr;
+  struct type *neon_quad_type = nullptr;
 
    /* syscall record.  */
-  int (*arm_syscall_record) (struct regcache *regcache, unsigned long svc_number);
+  int (*arm_syscall_record) (struct regcache *regcache,
+			     unsigned long svc_number) = nullptr;
 };
 
 /* Structures used for displaced stepping.  */
diff --git a/gdb/arm-wince-tdep.c b/gdb/arm-wince-tdep.c
index f81a0541418..46cf83503d9 100644
--- a/gdb/arm-wince-tdep.c
+++ b/gdb/arm-wince-tdep.c
@@ -115,7 +115,7 @@ arm_wince_skip_main_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
 static void
 arm_wince_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   windows_init_abi (info, gdbarch);
 
diff --git a/gdb/avr-tdep.c b/gdb/avr-tdep.c
index ea259b9a5c1..0db19865f31 100644
--- a/gdb/avr-tdep.c
+++ b/gdb/avr-tdep.c
@@ -188,18 +188,18 @@ struct avr_unwind_cache
   trad_frame_saved_reg *saved_regs;
 };
 
-struct gdbarch_tdep
+struct avr_gdbarch_tdep : gdbarch_tdep
 {
   /* Number of bytes stored to the stack by call instructions.
      2 bytes for avr1-5 and avrxmega1-5, 3 bytes for avr6 and avrxmega6-7.  */
-  int call_length;
+  int call_length = 0;
 
   /* Type for void.  */
-  struct type *void_type;
+  struct type *void_type = nullptr;
   /* Type for a function returning void.  */
-  struct type *func_void_type;
+  struct type *func_void_type = nullptr;
   /* Type for a pointer to a function.  Used for the type of PC.  */
-  struct type *pc_type;
+  struct type *pc_type = nullptr;
 };
 
 /* Lookup the name of a register given it's number.  */
@@ -230,10 +230,14 @@ avr_register_type (struct gdbarch *gdbarch, int reg_nr)
 {
   if (reg_nr == AVR_PC_REGNUM)
     return builtin_type (gdbarch)->builtin_uint32;
+
+  avr_gdbarch_tdep *tdep = (avr_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   if (reg_nr == AVR_PSEUDO_PC_REGNUM)
-    return gdbarch_tdep (gdbarch)->pc_type;
+    return tdep->pc_type;
+
   if (reg_nr == AVR_SP_REGNUM)
     return builtin_type (gdbarch)->builtin_data_ptr;
+
   return builtin_type (gdbarch)->builtin_uint8;
 }
 
@@ -745,13 +749,13 @@ avr_scan_prologue (struct gdbarch *gdbarch, CORE_ADDR pc_beg, CORE_ADDR pc_end,
   gdb_assert (vpc < AVR_MAX_PROLOGUE_SIZE);
 
   /* Handle static small stack allocation using rcall or push.  */
-
+  avr_gdbarch_tdep *tdep = (avr_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   while (scan_stage == 1 && vpc < len)
     {
       insn = extract_unsigned_integer (&prologue[vpc], 2, byte_order);
       if (insn == 0xd000)	/* rcall .+0 */
 	{
-	  info->size += gdbarch_tdep (gdbarch)->call_length;
+	  info->size += tdep->call_length;
 	  vpc += 2;
 	}
       else if (insn == 0x920f || insn == 0x921f)  /* push r0 or push r1 */
@@ -984,7 +988,6 @@ avr_frame_unwind_cache (struct frame_info *this_frame,
   ULONGEST this_base;
   struct avr_unwind_cache *info;
   struct gdbarch *gdbarch;
-  struct gdbarch_tdep *tdep;
   int i;
 
   if (*this_prologue_cache)
@@ -1049,7 +1052,7 @@ avr_frame_unwind_cache (struct frame_info *this_frame,
 
   /* The previous frame's SP needed to be computed.  Save the computed
      value.  */
-  tdep = gdbarch_tdep (gdbarch);
+  avr_gdbarch_tdep *tdep = (avr_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   info->saved_regs[AVR_SP_REGNUM].set_value (info->prev_sp
 					     - 1 + tdep->call_length);
 
@@ -1131,7 +1134,7 @@ avr_frame_prev_register (struct frame_info *this_frame,
 	  int i;
 	  gdb_byte buf[3];
 	  struct gdbarch *gdbarch = get_frame_arch (this_frame);
-	  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+	  avr_gdbarch_tdep *tdep = (avr_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
 	  read_memory (info->saved_regs[AVR_PC_REGNUM].addr (),
 		       buf, tdep->call_length);
@@ -1273,7 +1276,8 @@ avr_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 {
   int i;
   gdb_byte buf[3];
-  int call_length = gdbarch_tdep (gdbarch)->call_length;
+  avr_gdbarch_tdep *tdep = (avr_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+  int call_length = tdep->call_length;
   CORE_ADDR return_pc = avr_convert_iaddr_to_raw (bp_addr);
   int regnum = AVR_ARGN_REGNUM;
   struct stack_item *si = NULL;
@@ -1424,7 +1428,6 @@ static struct gdbarch *
 avr_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 {
   struct gdbarch *gdbarch;
-  struct gdbarch_tdep *tdep;
   struct gdbarch_list *best_arch;
   int call_length;
 
@@ -1456,12 +1459,15 @@ avr_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
        best_arch != NULL;
        best_arch = gdbarch_list_lookup_by_info (best_arch->next, &info))
     {
-      if (gdbarch_tdep (best_arch->gdbarch)->call_length == call_length)
+      avr_gdbarch_tdep *tdep
+	= (avr_gdbarch_tdep *) gdbarch_tdep (best_arch->gdbarch);
+
+      if (tdep->call_length == call_length)
 	return best_arch->gdbarch;
     }
 
   /* None found, create a new architecture from the information provided.  */
-  tdep = XCNEW (struct gdbarch_tdep);
+  avr_gdbarch_tdep *tdep = new avr_gdbarch_tdep;
   gdbarch = gdbarch_alloc (&info, tdep);
   
   tdep->call_length = call_length;
diff --git a/gdb/bfin-tdep.c b/gdb/bfin-tdep.c
index d381f927b8f..355f9f44465 100644
--- a/gdb/bfin-tdep.c
+++ b/gdb/bfin-tdep.c
@@ -766,7 +766,8 @@ bfin_frame_align (struct gdbarch *gdbarch, CORE_ADDR address)
 enum bfin_abi
 bfin_abi (struct gdbarch *gdbarch)
 {
-  return gdbarch_tdep (gdbarch)->bfin_abi;
+  bfin_gdbarch_tdep *tdep = (bfin_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+  return tdep->bfin_abi;
 }
 
 /* Initialize the current architecture based on INFO.  If possible,
@@ -779,7 +780,6 @@ bfin_abi (struct gdbarch *gdbarch)
 static struct gdbarch *
 bfin_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 {
-  struct gdbarch_tdep *tdep;
   struct gdbarch *gdbarch;
   enum bfin_abi abi;
 
@@ -791,12 +791,16 @@ bfin_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
        arches != NULL;
        arches = gdbarch_list_lookup_by_info (arches->next, &info))
     {
-      if (gdbarch_tdep (arches->gdbarch)->bfin_abi != abi)
+      bfin_gdbarch_tdep *tdep
+	= (bfin_gdbarch_tdep *) gdbarch_tdep (arches->gdbarch);
+
+      if (tdep->bfin_abi != abi)
 	continue;
+
       return arches->gdbarch;
     }
 
-  tdep = XCNEW (struct gdbarch_tdep);
+  bfin_gdbarch_tdep *tdep = new bfin_gdbarch_tdep;
   gdbarch = gdbarch_alloc (&info, tdep);
 
   tdep->bfin_abi = abi;
diff --git a/gdb/bfin-tdep.h b/gdb/bfin-tdep.h
index 309d4f4bfd5..70a18547e6b 100644
--- a/gdb/bfin-tdep.h
+++ b/gdb/bfin-tdep.h
@@ -94,10 +94,10 @@ enum bfin_abi
 };
 
 /* Target-dependent structure in gdbarch.  */
-struct gdbarch_tdep
+struct bfin_gdbarch_tdep : gdbarch_tdep
 {
   /* Which ABI is in use?  */
-  enum bfin_abi bfin_abi;
+  enum bfin_abi bfin_abi {};
 };
 
 /* Return the Blackfin ABI associated with GDBARCH.  */
diff --git a/gdb/bpf-tdep.c b/gdb/bpf-tdep.c
index e520d5d3d49..b2cd913d9e1 100644
--- a/gdb/bpf-tdep.c
+++ b/gdb/bpf-tdep.c
@@ -57,7 +57,7 @@ enum bpf_regnum
 #define BPF_NUM_REGS	(BPF_PC_REGNUM + 1)
 
 /* Target-dependent structure in gdbarch.  */
-struct gdbarch_tdep
+struct bpf_gdbarch_tdep : gdbarch_tdep
 {
 };
 
@@ -321,7 +321,7 @@ bpf_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
     return arches->gdbarch;
 
   /* Allocate space for the new architecture.  */
-  struct gdbarch_tdep *tdep = XCNEW (struct gdbarch_tdep);
+  bpf_gdbarch_tdep *tdep = new bpf_gdbarch_tdep;
   struct gdbarch *gdbarch = gdbarch_alloc (&info, tdep);
 
   /* Information about registers, etc.  */
diff --git a/gdb/cris-linux-tdep.c b/gdb/cris-linux-tdep.c
index 68a12dbe0e9..e7dbded1f5e 100644
--- a/gdb/cris-linux-tdep.c
+++ b/gdb/cris-linux-tdep.c
@@ -33,7 +33,7 @@
 static void
 cris_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  cris_gdbarch_tdep *tdep = (cris_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   linux_init_abi (info, gdbarch, 0);
 
diff --git a/gdb/cris-tdep.c b/gdb/cris-tdep.c
index 6b5dfc33076..691cad82c9d 100644
--- a/gdb/cris-tdep.c
+++ b/gdb/cris-tdep.c
@@ -313,7 +313,7 @@ cris_sigtramp_frame_unwind_cache (struct frame_info *this_frame,
 				  void **this_cache)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  cris_gdbarch_tdep *tdep = (cris_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   struct cris_unwind_cache *info;
   CORE_ADDR addr;
@@ -450,7 +450,7 @@ static int
 crisv32_single_step_through_delay (struct gdbarch *gdbarch,
 				   struct frame_info *this_frame)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  cris_gdbarch_tdep *tdep = (cris_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   ULONGEST erp;
   int ret = 0;
 
@@ -695,7 +695,7 @@ cris_frame_unwind_cache (struct frame_info *this_frame,
 			 void **this_prologue_cache)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  cris_gdbarch_tdep *tdep = (cris_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   struct cris_unwind_cache *info;
 
   if ((*this_prologue_cache))
@@ -1333,7 +1333,7 @@ crisv32_scan_prologue (CORE_ADDR pc, struct frame_info *this_frame,
 static CORE_ADDR
 cris_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  cris_gdbarch_tdep *tdep = (cris_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   CORE_ADDR func_addr, func_end;
   struct symtab_and_line sal;
   CORE_ADDR pc_after_prologue;
@@ -1368,7 +1368,7 @@ cris_breakpoint_kind_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr)
 static const gdb_byte *
 cris_sw_breakpoint_from_kind (struct gdbarch *gdbarch, int kind, int *size)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  cris_gdbarch_tdep *tdep = (cris_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   static unsigned char break8_insn[] = {0x38, 0xe9};
   static unsigned char break15_insn[] = {0x3f, 0xe9};
 
@@ -1387,7 +1387,7 @@ static int
 cris_spec_reg_applicable (struct gdbarch *gdbarch,
 			  struct cris_spec_reg spec_reg)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  cris_gdbarch_tdep *tdep = (cris_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   unsigned int version = tdep->cris_version;
   
   switch (spec_reg.applicable_version)
@@ -3766,7 +3766,7 @@ cris_supply_gregset (const struct regset *regset, struct regcache *regcache,
 		     int regnum, const void *gregs, size_t len)
 {
   struct gdbarch *gdbarch = regcache->arch ();
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  cris_gdbarch_tdep *tdep = (cris_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int i;
   const cris_elf_greg_t *regp = static_cast<const cris_elf_greg_t *>(gregs);
 
@@ -3860,7 +3860,7 @@ Makes GDB use the NRP register instead of the ERP register in certain cases."),
 static void
 cris_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  cris_gdbarch_tdep *tdep = (cris_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   if (tdep != NULL)
     {
       fprintf_unfiltered (file, "cris_dump_tdep: tdep->cris_version = %i\n",
@@ -3914,7 +3914,6 @@ static struct gdbarch *
 cris_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 {
   struct gdbarch *gdbarch;
-  struct gdbarch_tdep *tdep;
   unsigned int cris_version;
 
   if (usr_cmd_cris_version_valid)
@@ -3940,17 +3939,17 @@ cris_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
        arches != NULL;
        arches = gdbarch_list_lookup_by_info (arches->next, &info))
     {
-      if ((gdbarch_tdep (arches->gdbarch)->cris_version 
-	   == usr_cmd_cris_version)
-	  && (gdbarch_tdep (arches->gdbarch)->cris_mode 
-	   == usr_cmd_cris_mode)
-	  && (gdbarch_tdep (arches->gdbarch)->cris_dwarf2_cfi 
-	      == usr_cmd_cris_dwarf2_cfi))
+      cris_gdbarch_tdep *tdep
+	= (cris_gdbarch_tdep *) gdbarch_tdep (arches->gdbarch);
+
+      if (tdep->cris_version == usr_cmd_cris_version
+	  && tdep->cris_mode == usr_cmd_cris_mode
+	  && tdep->cris_dwarf2_cfi == usr_cmd_cris_dwarf2_cfi)
 	return arches->gdbarch;
     }
 
   /* No matching architecture was found.  Create a new one.  */
-  tdep = XCNEW (struct gdbarch_tdep);
+  cris_gdbarch_tdep *tdep = new cris_gdbarch_tdep;
   info.byte_order = BFD_ENDIAN_LITTLE;
   gdbarch = gdbarch_alloc (&info, tdep);
 
diff --git a/gdb/cris-tdep.h b/gdb/cris-tdep.h
index d898f4d1e71..9b622942839 100644
--- a/gdb/cris-tdep.h
+++ b/gdb/cris-tdep.h
@@ -24,11 +24,11 @@
 #define CRIS_TDEP_H
 
 /* CRIS architecture specific information.  */
-struct gdbarch_tdep
+struct cris_gdbarch_tdep : gdbarch_tdep
 {
-  unsigned int cris_version;
-  const char *cris_mode;
-  int cris_dwarf2_cfi;
+  unsigned int cris_version = 0;
+  const char *cris_mode = nullptr;
+  int cris_dwarf2_cfi = 0;
 };
 
 #endif /* CRIS_TDEP_H */
diff --git a/gdb/csky-tdep.c b/gdb/csky-tdep.c
index 8835aba5e64..0b073fb6f62 100644
--- a/gdb/csky-tdep.c
+++ b/gdb/csky-tdep.c
@@ -2164,7 +2164,6 @@ static struct gdbarch *
 csky_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 {
   struct gdbarch *gdbarch;
-  struct gdbarch_tdep *tdep;
 
   /* Find a candidate among the list of pre-declared architectures.  */
   arches = gdbarch_list_lookup_by_info (arches, &info);
@@ -2173,7 +2172,7 @@ csky_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 
   /* None found, create a new architecture from the information
      provided.  */
-  tdep = XCNEW (struct gdbarch_tdep);
+  csky_gdbarch_tdep *tdep = new csky_gdbarch_tdep;
   gdbarch = gdbarch_alloc (&info, tdep);
 
   /* Target data types.  */
diff --git a/gdb/csky-tdep.h b/gdb/csky-tdep.h
index 7fc1a92e0b6..d690e8f5191 100644
--- a/gdb/csky-tdep.h
+++ b/gdb/csky-tdep.h
@@ -29,7 +29,7 @@ enum lr_type_t
 };
 
 /* Target-dependent structure in gdbarch.  */
-struct gdbarch_tdep
+struct csky_gdbarch_tdep : gdbarch_tdep
 {
   /* This is Unused.  */
 };
diff --git a/gdb/frv-tdep.c b/gdb/frv-tdep.c
index e105c27ae82..c74ea68fe84 100644
--- a/gdb/frv-tdep.c
+++ b/gdb/frv-tdep.c
@@ -67,32 +67,33 @@ struct frv_unwind_cache		/* was struct frame_extra_info */
    of structures, each of which gives all the necessary info for one
    register.  Don't stick parallel arrays in here --- that's so
    Fortran.  */
-struct gdbarch_tdep
+struct frv_gdbarch_tdep : gdbarch_tdep
 {
   /* Which ABI is in use?  */
-  enum frv_abi frv_abi;
+  enum frv_abi frv_abi {};
 
   /* How many general-purpose registers does this variant have?  */
-  int num_gprs;
+  int num_gprs = 0;
 
   /* How many floating-point registers does this variant have?  */
-  int num_fprs;
+  int num_fprs = 0;
 
   /* How many hardware watchpoints can it support?  */
-  int num_hw_watchpoints;
+  int num_hw_watchpoints = 0;
 
   /* How many hardware breakpoints can it support?  */
-  int num_hw_breakpoints;
+  int num_hw_breakpoints = 0;
 
   /* Register names.  */
-  const char **register_names;
+  const char **register_names = nullptr;
 };
 
 /* Return the FR-V ABI associated with GDBARCH.  */
 enum frv_abi
 frv_abi (struct gdbarch *gdbarch)
 {
-  return gdbarch_tdep (gdbarch)->frv_abi;
+  frv_gdbarch_tdep *tdep = (frv_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+  return tdep->frv_abi;
 }
 
 /* Fetch the interpreter and executable loadmap addresses (for shared
@@ -128,13 +129,12 @@ frv_fdpic_loadmap_addresses (struct gdbarch *gdbarch, CORE_ADDR *interp_addr,
 
 /* Allocate a new variant structure, and set up default values for all
    the fields.  */
-static struct gdbarch_tdep *
+static frv_gdbarch_tdep *
 new_variant (void)
 {
-  struct gdbarch_tdep *var;
   int r;
 
-  var = XCNEW (struct gdbarch_tdep);
+  frv_gdbarch_tdep *var = new frv_gdbarch_tdep;
 
   var->frv_abi = FRV_ABI_EABI;
   var->num_gprs = 64;
@@ -219,7 +219,7 @@ new_variant (void)
 /* Indicate that the variant VAR has NUM_GPRS general-purpose
    registers, and fill in the names array appropriately.  */
 static void
-set_variant_num_gprs (struct gdbarch_tdep *var, int num_gprs)
+set_variant_num_gprs (frv_gdbarch_tdep *var, int num_gprs)
 {
   int r;
 
@@ -238,7 +238,7 @@ set_variant_num_gprs (struct gdbarch_tdep *var, int num_gprs)
 /* Indicate that the variant VAR has NUM_FPRS floating-point
    registers, and fill in the names array appropriately.  */
 static void
-set_variant_num_fprs (struct gdbarch_tdep *var, int num_fprs)
+set_variant_num_fprs (frv_gdbarch_tdep *var, int num_fprs)
 {
   int r;
 
@@ -254,7 +254,7 @@ set_variant_num_fprs (struct gdbarch_tdep *var, int num_fprs)
 }
 
 static void
-set_variant_abi_fdpic (struct gdbarch_tdep *var)
+set_variant_abi_fdpic (frv_gdbarch_tdep *var)
 {
   var->frv_abi = FRV_ABI_FDPIC;
   var->register_names[fdpic_loadmap_exec_regnum] = xstrdup ("loadmap_exec");
@@ -263,7 +263,7 @@ set_variant_abi_fdpic (struct gdbarch_tdep *var)
 }
 
 static void
-set_variant_scratch_registers (struct gdbarch_tdep *var)
+set_variant_scratch_registers (frv_gdbarch_tdep *var)
 {
   var->register_names[scr0_regnum] = xstrdup ("scr0");
   var->register_names[scr1_regnum] = xstrdup ("scr1");
@@ -276,10 +276,12 @@ frv_register_name (struct gdbarch *gdbarch, int reg)
 {
   if (reg < 0)
     return "?toosmall?";
+
   if (reg >= frv_num_regs + frv_num_pseudo_regs)
     return "?toolarge?";
 
-  return gdbarch_tdep (gdbarch)->register_names[reg];
+  frv_gdbarch_tdep *tdep = (frv_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+  return tdep->register_names[reg];
 }
 
 
@@ -1439,7 +1441,6 @@ static struct gdbarch *
 frv_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 {
   struct gdbarch *gdbarch;
-  struct gdbarch_tdep *var;
   int elf_flags = 0;
 
   /* Check to see if we've already built an appropriate architecture
@@ -1449,7 +1450,7 @@ frv_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
     return arches->gdbarch;
 
   /* Select the right tdep structure for this variant.  */
-  var = new_variant ();
+  frv_gdbarch_tdep *var = new_variant ();
   switch (info.bfd_arch_info->mach)
     {
     case bfd_mach_frv:
diff --git a/gdb/ft32-tdep.c b/gdb/ft32-tdep.c
index ff03acb4cbb..eec800cf68d 100644
--- a/gdb/ft32-tdep.c
+++ b/gdb/ft32-tdep.c
@@ -109,7 +109,10 @@ static struct type *
 ft32_register_type (struct gdbarch *gdbarch, int reg_nr)
 {
   if (reg_nr == FT32_PC_REGNUM)
-    return gdbarch_tdep (gdbarch)->pc_type;
+    {
+      ft32_gdbarch_tdep *tdep = (ft32_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+      return tdep->pc_type;
+    }
   else if (reg_nr == FT32_SP_REGNUM || reg_nr == FT32_FP_REGNUM)
     return builtin_type (gdbarch)->builtin_data_ptr;
   else
@@ -559,7 +562,6 @@ static struct gdbarch *
 ft32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 {
   struct gdbarch *gdbarch;
-  struct gdbarch_tdep *tdep;
   struct type *void_type;
   struct type *func_void_type;
 
@@ -569,7 +571,7 @@ ft32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
     return arches->gdbarch;
 
   /* Allocate space for the new architecture.  */
-  tdep = XCNEW (struct gdbarch_tdep);
+  ft32_gdbarch_tdep *tdep = new ft32_gdbarch_tdep;
   gdbarch = gdbarch_alloc (&info, tdep);
 
   /* Create a type for PC.  We can't use builtin types here, as they may not
diff --git a/gdb/ft32-tdep.h b/gdb/ft32-tdep.h
index 0303801e01c..c32f646a4a0 100644
--- a/gdb/ft32-tdep.h
+++ b/gdb/ft32-tdep.h
@@ -20,10 +20,10 @@
 #ifndef FT32_TDEP_H
 #define FT32_TDEP_H
 
-struct gdbarch_tdep
+struct ft32_gdbarch_tdep : gdbarch_tdep
 {
   /* Type for a pointer to a function.  Used for the type of PC.  */
-  struct type *pc_type;
+  struct type *pc_type = nullptr;
 };
 
 #endif /* FT32_TDEP_H */
diff --git a/gdb/gdbarch.h b/gdb/gdbarch.h
index 979159ba2f5..f73d5624633 100644
--- a/gdb/gdbarch.h
+++ b/gdb/gdbarch.h
@@ -62,6 +62,8 @@ struct inferior;
 
 #include "regcache.h"
 
+struct gdbarch_tdep {};
+
 /* The architecture associated with the inferior through the
    connection to the target.
 
diff --git a/gdb/gdbarch.sh b/gdb/gdbarch.sh
index 39a99d0d5f3..829f24192ae 100755
--- a/gdb/gdbarch.sh
+++ b/gdb/gdbarch.sh
@@ -1333,6 +1333,8 @@ struct inferior;
 
 #include "regcache.h"
 
+struct gdbarch_tdep {};
+
 /* The architecture associated with the inferior through the
    connection to the target.
 
diff --git a/gdb/hppa-bsd-tdep.c b/gdb/hppa-bsd-tdep.c
index c68aaf1f490..f4567b48f82 100644
--- a/gdb/hppa-bsd-tdep.c
+++ b/gdb/hppa-bsd-tdep.c
@@ -118,7 +118,7 @@ hppabsd_dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum,
 void
 hppabsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  hppa_gdbarch_tdep *tdep = (hppa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* OpenBSD and NetBSD have a 64-bit 'long double'.  */
   set_gdbarch_long_double_bit (gdbarch, 64);
diff --git a/gdb/hppa-linux-tdep.c b/gdb/hppa-linux-tdep.c
index 52c642f0c7f..1dd6993ab09 100644
--- a/gdb/hppa-linux-tdep.c
+++ b/gdb/hppa-linux-tdep.c
@@ -476,7 +476,7 @@ hppa_linux_iterate_over_regset_sections (struct gdbarch *gdbarch,
 					 void *cb_data,
 					 const struct regcache *regcache)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  hppa_gdbarch_tdep *tdep = (hppa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   cb (".reg", 80 * tdep->bytes_per_address, 80 * tdep->bytes_per_address,
       &hppa_linux_regset, NULL, cb_data);
@@ -486,7 +486,7 @@ hppa_linux_iterate_over_regset_sections (struct gdbarch *gdbarch,
 static void
 hppa_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  hppa_gdbarch_tdep *tdep = (hppa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   linux_init_abi (info, gdbarch, 0);
 
diff --git a/gdb/hppa-tdep.c b/gdb/hppa-tdep.c
index 344022ccaa4..d64f9f7d937 100644
--- a/gdb/hppa-tdep.c
+++ b/gdb/hppa-tdep.c
@@ -259,6 +259,7 @@ internalize_unwinds (struct objfile *objfile, struct unwind_table_entry *table,
   if (size > 0)
     {
       struct gdbarch *gdbarch = objfile->arch ();
+      hppa_gdbarch_tdep *tdep = (hppa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
       unsigned long tmp;
       unsigned i;
       char *buf = (char *) alloca (size);
@@ -270,7 +271,7 @@ internalize_unwinds (struct objfile *objfile, struct unwind_table_entry *table,
 	 Note that when loading a shared library (text_offset != 0) the
 	 unwinds are already relative to the text_offset that will be
 	 passed in.  */
-      if (gdbarch_tdep (gdbarch)->is_elf && text_offset == 0)
+      if (tdep->is_elf && text_offset == 0)
 	{
 	  low_text_segment_address = -1;
 
@@ -280,9 +281,9 @@ internalize_unwinds (struct objfile *objfile, struct unwind_table_entry *table,
 
 	  text_offset = low_text_segment_address;
 	}
-      else if (gdbarch_tdep (gdbarch)->solib_get_text_base)
+      else if (tdep->solib_get_text_base)
 	{
-	  text_offset = gdbarch_tdep (gdbarch)->solib_get_text_base (objfile);
+	  text_offset = tdep->solib_get_text_base (objfile);
 	}
 
       bfd_get_section_contents (objfile->obfd, section, buf, 0, size);
@@ -730,7 +731,7 @@ hppa32_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
   /* Global pointer (r19) of the function we are trying to call.  */
   CORE_ADDR gp;
 
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  hppa_gdbarch_tdep *tdep = (hppa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   for (write_pass = 0; write_pass < 2; write_pass++)
     {
@@ -967,7 +968,7 @@ hppa64_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);
+  hppa_gdbarch_tdep *tdep = (hppa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   int i, offset = 0;
   CORE_ADDR gp;
@@ -2253,9 +2254,7 @@ hppa_frame_cache (struct frame_info *this_frame, void **this_cache)
   }
 
   {
-    struct gdbarch_tdep *tdep;
-
-    tdep = gdbarch_tdep (gdbarch);
+    hppa_gdbarch_tdep *tdep = (hppa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
     if (tdep->unwind_adjust_stub)
       tdep->unwind_adjust_stub (this_frame, cache->base, cache->saved_regs);
@@ -2485,7 +2484,7 @@ hppa_stub_unwind_sniffer (const struct frame_unwind *self,
 {
   CORE_ADDR pc = get_frame_address_in_block (this_frame);
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  hppa_gdbarch_tdep *tdep = (hppa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (pc == 0
       || (tdep->in_solib_call_trampoline != NULL
@@ -3029,7 +3028,6 @@ hppa_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
 static struct gdbarch *
 hppa_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 {
-  struct gdbarch_tdep *tdep;
   struct gdbarch *gdbarch;
 
   /* find a candidate among the list of pre-declared architectures.  */
@@ -3038,7 +3036,7 @@ hppa_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
     return (arches->gdbarch);
 
   /* If none found, then allocate and initialize one.  */
-  tdep = XCNEW (struct gdbarch_tdep);
+  hppa_gdbarch_tdep *tdep = new hppa_gdbarch_tdep;
   gdbarch = gdbarch_alloc (&info, tdep);
 
   /* Determine from the bfd_arch_info structure if we are dealing with
@@ -3162,7 +3160,7 @@ hppa_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 static void
 hppa_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  hppa_gdbarch_tdep *tdep = (hppa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   fprintf_unfiltered (file, "bytes_per_address = %d\n", 
 		      tdep->bytes_per_address);
diff --git a/gdb/hppa-tdep.h b/gdb/hppa-tdep.h
index d033c14a569..72988813b2c 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;
 };
 
 /*
diff --git a/gdb/i386-bsd-tdep.c b/gdb/i386-bsd-tdep.c
index fb5fcaa54de..7bddc7a32bc 100644
--- a/gdb/i386-bsd-tdep.c
+++ b/gdb/i386-bsd-tdep.c
@@ -74,7 +74,7 @@ int i386bsd_sc_reg_offset[] =
 void
 i386bsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   tdep->jb_pc_offset = 0;
 
diff --git a/gdb/i386-darwin-tdep.c b/gdb/i386-darwin-tdep.c
index c038d8bbc2a..900a0a6bf96 100644
--- a/gdb/i386-darwin-tdep.c
+++ b/gdb/i386-darwin-tdep.c
@@ -156,7 +156,7 @@ i386_darwin_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);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   gdb_byte buf[4];
   int i;
@@ -248,7 +248,7 @@ i386_darwin_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 static void
 i386_darwin_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* We support the SSE registers.  */
   tdep->num_xmm_regs = I386_NUM_XREGS - 1;
diff --git a/gdb/i386-fbsd-tdep.c b/gdb/i386-fbsd-tdep.c
index 103972490c4..01db76f57ab 100644
--- a/gdb/i386-fbsd-tdep.c
+++ b/gdb/i386-fbsd-tdep.c
@@ -308,7 +308,7 @@ i386fbsd_iterate_over_regset_sections (struct gdbarch *gdbarch,
 				       void *cb_data,
 				       const struct regcache *regcache)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   cb (".reg", tdep->sizeof_gregset, tdep->sizeof_gregset, &i386_gregset, NULL,
       cb_data);
@@ -327,7 +327,7 @@ static CORE_ADDR
 i386fbsd_get_thread_local_address (struct gdbarch *gdbarch, ptid_t ptid,
 				   CORE_ADDR lm_addr, CORE_ADDR offset)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   struct regcache *regcache;
 
   if (tdep->fsbase_regnum == -1)
@@ -349,7 +349,7 @@ i386fbsd_get_thread_local_address (struct gdbarch *gdbarch, ptid_t ptid,
 static void
 i386fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* Obviously FreeBSD is BSD-based.  */
   i386bsd_init_abi (info, gdbarch);
@@ -418,7 +418,7 @@ int i386fbsd4_sc_reg_offset[] =
 static void
 i386fbsd4_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* Generic FreeBSD support. */
   fbsd_init_abi (info, gdbarch);
diff --git a/gdb/i386-gnu-tdep.c b/gdb/i386-gnu-tdep.c
index 33ccd3b9ebe..1f5e5f75012 100644
--- a/gdb/i386-gnu-tdep.c
+++ b/gdb/i386-gnu-tdep.c
@@ -173,7 +173,7 @@ static int i386gnu_gregset_reg_offset[] =
 static void
 i386gnu_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* GNU uses ELF.  */
   i386_elf_init_abi (info, gdbarch);
diff --git a/gdb/i386-go32-tdep.c b/gdb/i386-go32-tdep.c
index 7b9a4ca5c4a..31aef423818 100644
--- a/gdb/i386-go32-tdep.c
+++ b/gdb/i386-go32-tdep.c
@@ -26,7 +26,7 @@
 static void
 i386_go32_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* DJGPP doesn't have any special frames for signal handlers.  */
   tdep->sigtramp_p = NULL;
diff --git a/gdb/i386-linux-tdep.c b/gdb/i386-linux-tdep.c
index 1c065eecb4d..898b73f632c 100644
--- a/gdb/i386-linux-tdep.c
+++ b/gdb/i386-linux-tdep.c
@@ -762,7 +762,7 @@ i386_linux_iterate_over_regset_sections (struct gdbarch *gdbarch,
 					 void *cb_data,
 					 const struct regcache *regcache)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   cb (".reg", 68, 68, &i386_gregset, NULL, cb_data);
 
@@ -824,7 +824,7 @@ i386_linux_displaced_step_copy_insn (struct gdbarch *gdbarch,
 static void
 i386_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   const struct target_desc *tdesc = info.target_desc;
   struct tdesc_arch_data *tdesc_data = info.tdesc_data;
   const struct tdesc_feature *feature;
diff --git a/gdb/i386-netbsd-tdep.c b/gdb/i386-netbsd-tdep.c
index 76dcc4db150..9915921ad54 100644
--- a/gdb/i386-netbsd-tdep.c
+++ b/gdb/i386-netbsd-tdep.c
@@ -372,7 +372,7 @@ i386nbsd_sigtramp_cache_init (const struct tramp_frame *self,
 static void 
 i386nbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* Obviously NetBSD is BSD-based.  */
   i386bsd_init_abi (info, gdbarch);
@@ -407,7 +407,7 @@ i386nbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 static void
 i386nbsdelf_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* It's still NetBSD.  */
   i386nbsd_init_abi (info, gdbarch);
diff --git a/gdb/i386-nto-tdep.c b/gdb/i386-nto-tdep.c
index 11e05e3ea97..4d443e667ff 100644
--- a/gdb/i386-nto-tdep.c
+++ b/gdb/i386-nto-tdep.c
@@ -77,7 +77,7 @@ static void
 i386nto_supply_gregset (struct regcache *regcache, char *gpregs)
 {
   struct gdbarch *gdbarch = regcache->arch ();
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   gdb_assert (tdep->gregset_reg_offset == i386nto_gregset_reg_offset);
   i386_gregset.supply_regset (&i386_gregset, regcache, -1,
@@ -126,7 +126,7 @@ static int
 i386nto_register_area (struct gdbarch *gdbarch,
 		       int regno, int regset, unsigned *off)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   *off = 0;
   if (regset == NTO_REG_GENERAL)
@@ -315,7 +315,7 @@ init_i386nto_ops (void)
 static void
 i386nto_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   static struct target_so_ops nto_svr4_so_ops;
 
   /* Deal with our strange signals.  */
diff --git a/gdb/i386-obsd-tdep.c b/gdb/i386-obsd-tdep.c
index 3f5606df006..ad0a7c8e9de 100644
--- a/gdb/i386-obsd-tdep.c
+++ b/gdb/i386-obsd-tdep.c
@@ -407,7 +407,7 @@ static const struct frame_unwind i386obsd_trapframe_unwind = {
 static void 
 i386obsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* Obviously OpenBSD is BSD-based.  */
   i386bsd_init_abi (info, gdbarch);
diff --git a/gdb/i386-sol2-tdep.c b/gdb/i386-sol2-tdep.c
index acc85eead5b..e06ef36ef99 100644
--- a/gdb/i386-sol2-tdep.c
+++ b/gdb/i386-sol2-tdep.c
@@ -65,7 +65,7 @@ i386_sol2_mcontext_addr (struct frame_info *this_frame)
 static void
 i386_sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* Solaris is SVR4-based.  */
   i386_svr4_init_abi (info, gdbarch);
diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c
index f65a07492d2..ce18cf3e9be 100644
--- a/gdb/i386-tdep.c
+++ b/gdb/i386-tdep.c
@@ -167,7 +167,7 @@ const int num_lower_zmm_regs = 16;
 static int
 i386_mmx_regnum_p (struct gdbarch *gdbarch, int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int mm0_regnum = tdep->mm0_regnum;
 
   if (mm0_regnum < 0)
@@ -182,7 +182,7 @@ i386_mmx_regnum_p (struct gdbarch *gdbarch, int regnum)
 int
 i386_byte_regnum_p (struct gdbarch *gdbarch, int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   regnum -= tdep->al_regnum;
   return regnum >= 0 && regnum < tdep->num_byte_regs;
@@ -193,7 +193,7 @@ i386_byte_regnum_p (struct gdbarch *gdbarch, int regnum)
 int
 i386_word_regnum_p (struct gdbarch *gdbarch, int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   regnum -= tdep->ax_regnum;
   return regnum >= 0 && regnum < tdep->num_word_regs;
@@ -204,7 +204,7 @@ i386_word_regnum_p (struct gdbarch *gdbarch, int regnum)
 int
 i386_dword_regnum_p (struct gdbarch *gdbarch, int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int eax_regnum = tdep->eax_regnum;
 
   if (eax_regnum < 0)
@@ -219,7 +219,7 @@ i386_dword_regnum_p (struct gdbarch *gdbarch, int regnum)
 int
 i386_zmmh_regnum_p (struct gdbarch *gdbarch, int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int zmm0h_regnum = tdep->zmm0h_regnum;
 
   if (zmm0h_regnum < 0)
@@ -232,7 +232,7 @@ i386_zmmh_regnum_p (struct gdbarch *gdbarch, int regnum)
 int
 i386_zmm_regnum_p (struct gdbarch *gdbarch, int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int zmm0_regnum = tdep->zmm0_regnum;
 
   if (zmm0_regnum < 0)
@@ -245,7 +245,7 @@ i386_zmm_regnum_p (struct gdbarch *gdbarch, int regnum)
 int
 i386_k_regnum_p (struct gdbarch *gdbarch, int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int k0_regnum = tdep->k0_regnum;
 
   if (k0_regnum < 0)
@@ -258,7 +258,7 @@ i386_k_regnum_p (struct gdbarch *gdbarch, int regnum)
 static int
 i386_ymmh_regnum_p (struct gdbarch *gdbarch, int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int ymm0h_regnum = tdep->ymm0h_regnum;
 
   if (ymm0h_regnum < 0)
@@ -273,7 +273,7 @@ i386_ymmh_regnum_p (struct gdbarch *gdbarch, int regnum)
 int
 i386_ymm_regnum_p (struct gdbarch *gdbarch, int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int ymm0_regnum = tdep->ymm0_regnum;
 
   if (ymm0_regnum < 0)
@@ -286,7 +286,7 @@ i386_ymm_regnum_p (struct gdbarch *gdbarch, int regnum)
 static int
 i386_ymmh_avx512_regnum_p (struct gdbarch *gdbarch, int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int ymm16h_regnum = tdep->ymm16h_regnum;
 
   if (ymm16h_regnum < 0)
@@ -299,7 +299,7 @@ i386_ymmh_avx512_regnum_p (struct gdbarch *gdbarch, int regnum)
 int
 i386_ymm_avx512_regnum_p (struct gdbarch *gdbarch, int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int ymm16_regnum = tdep->ymm16_regnum;
 
   if (ymm16_regnum < 0)
@@ -314,7 +314,7 @@ i386_ymm_avx512_regnum_p (struct gdbarch *gdbarch, int regnum)
 int
 i386_bnd_regnum_p (struct gdbarch *gdbarch, int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int bnd0_regnum = tdep->bnd0_regnum;
 
   if (bnd0_regnum < 0)
@@ -329,7 +329,7 @@ i386_bnd_regnum_p (struct gdbarch *gdbarch, int regnum)
 int
 i386_xmm_regnum_p (struct gdbarch *gdbarch, int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int num_xmm_regs = I387_NUM_XMM_REGS (tdep);
 
   if (num_xmm_regs == 0)
@@ -344,7 +344,7 @@ i386_xmm_regnum_p (struct gdbarch *gdbarch, int regnum)
 int
 i386_xmm_avx512_regnum_p (struct gdbarch *gdbarch, int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int num_xmm_avx512_regs = I387_NUM_XMM_AVX512_REGS (tdep);
 
   if (num_xmm_avx512_regs == 0)
@@ -357,7 +357,7 @@ i386_xmm_avx512_regnum_p (struct gdbarch *gdbarch, int regnum)
 static int
 i386_mxcsr_regnum_p (struct gdbarch *gdbarch, int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (I387_NUM_XMM_REGS (tdep) == 0)
     return 0;
@@ -370,7 +370,7 @@ i386_mxcsr_regnum_p (struct gdbarch *gdbarch, int regnum)
 int
 i386_fp_regnum_p (struct gdbarch *gdbarch, int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (I387_ST0_REGNUM (tdep) < 0)
     return 0;
@@ -382,7 +382,7 @@ i386_fp_regnum_p (struct gdbarch *gdbarch, int regnum)
 int
 i386_fpc_regnum_p (struct gdbarch *gdbarch, int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (I387_ST0_REGNUM (tdep) < 0)
     return 0;
@@ -396,7 +396,7 @@ i386_fpc_regnum_p (struct gdbarch *gdbarch, int regnum)
 static int
 i386_bndr_regnum_p (struct gdbarch *gdbarch, int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
    if (I387_BND0R_REGNUM (tdep) < 0)
      return 0;
@@ -410,7 +410,7 @@ i386_bndr_regnum_p (struct gdbarch *gdbarch, int regnum)
 static int
 i386_mpx_ctrl_regnum_p (struct gdbarch *gdbarch, int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
    if (I387_BNDCFGU_REGNUM (tdep) < 0)
      return 0;
@@ -424,7 +424,7 @@ i386_mpx_ctrl_regnum_p (struct gdbarch *gdbarch, int regnum)
 bool
 i386_pkru_regnum_p (struct gdbarch *gdbarch, int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int pkru_regnum = tdep->pkru_regnum;
 
   if (pkru_regnum < 0)
@@ -460,7 +460,7 @@ i386_register_name (struct gdbarch *gdbarch, int regnum)
 const char *
 i386_pseudo_register_name (struct gdbarch *gdbarch, int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   if (i386_bnd_regnum_p (gdbarch, regnum))
     return i386_bnd_names[regnum - tdep->bnd0_regnum];
   if (i386_mmx_regnum_p (gdbarch, regnum))
@@ -483,7 +483,7 @@ i386_pseudo_register_name (struct gdbarch *gdbarch, int regnum)
 static int
 i386_dbx_reg_to_regnum (struct gdbarch *gdbarch, int reg)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* This implements what GCC calls the "default" register map
      (dbx_register_map[]).  */
@@ -530,7 +530,7 @@ i386_dbx_reg_to_regnum (struct gdbarch *gdbarch, int reg)
 static int
 i386_svr4_dwarf_reg_to_regnum (struct gdbarch *gdbarch, int reg)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* This implements the GCC register map that tries to be compatible
      with the SVR4 C compiler for DWARF (svr4_dbx_register_map[]).  */
@@ -2432,7 +2432,7 @@ static struct i386_frame_cache *
 i386_sigtramp_frame_cache (struct frame_info *this_frame, void **this_cache)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   struct i386_frame_cache *cache;
   CORE_ADDR addr;
@@ -2521,7 +2521,8 @@ i386_sigtramp_frame_sniffer (const struct frame_unwind *self,
 			     struct frame_info *this_frame,
 			     void **this_prologue_cache)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (get_frame_arch (this_frame));
+  gdbarch *arch = get_frame_arch (this_frame);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (arch);
 
   /* We shouldn't even bother if we don't have a sigcontext_addr
      handler.  */
@@ -2608,7 +2609,8 @@ i386_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
   CORE_ADDR sp, jb_addr;
   struct gdbarch *gdbarch = get_frame_arch (frame);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
-  int jb_pc_offset = gdbarch_tdep (gdbarch)->jb_pc_offset;
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+  int jb_pc_offset = tdep->jb_pc_offset;
 
   /* If JB_PC_OFFSET is -1, we have no way to find out where the
      longjmp will land.  */
@@ -2815,7 +2817,7 @@ static void
 i386_extract_return_value (struct gdbarch *gdbarch, struct type *type,
 			   struct regcache *regcache, gdb_byte *valbuf)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int len = TYPE_LENGTH (type);
   gdb_byte buf[I386_MAX_REGISTER_SIZE];
 
@@ -2873,7 +2875,7 @@ static void
 i386_store_return_value (struct gdbarch *gdbarch, struct type *type,
 			 struct regcache *regcache, const gdb_byte *valbuf)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int len = TYPE_LENGTH (type);
 
   if (type->code () == TYPE_CODE_FLT)
@@ -2952,7 +2954,7 @@ static const char *struct_convention = default_struct_convention;
 static int
 i386_reg_struct_return_p (struct gdbarch *gdbarch, struct type *type)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   enum type_code code = type->code ();
   int len = TYPE_LENGTH (type);
 
@@ -3054,7 +3056,7 @@ i386_return_value (struct gdbarch *gdbarch, struct value *function,
 struct type *
 i387_ext_type (struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (!tdep->i387_ext_type)
     {
@@ -3072,7 +3074,7 @@ i387_ext_type (struct gdbarch *gdbarch)
 static struct type *
 i386_bnd_type (struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
 
   if (!tdep->i386_bnd_type)
@@ -3108,7 +3110,7 @@ i386_bnd_type (struct gdbarch *gdbarch)
 static struct type *
 i386_zmm_type (struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (!tdep->i386_zmm_type)
     {
@@ -3167,7 +3169,7 @@ i386_zmm_type (struct gdbarch *gdbarch)
 static struct type *
 i386_ymm_type (struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (!tdep->i386_ymm_type)
     {
@@ -3224,7 +3226,7 @@ i386_ymm_type (struct gdbarch *gdbarch)
 static struct type *
 i386_mmx_type (struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (!tdep->i386_mmx_type)
     {
@@ -3300,7 +3302,8 @@ i386_pseudo_register_type (struct gdbarch *gdbarch, int regnum)
 static int
 i386_mmx_regnum_to_fp_regnum (readable_regcache *regcache, int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (regcache->arch ());
+  gdbarch *arch = regcache->arch ();
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (arch);
   int mmxreg, fpreg;
   ULONGEST fstat;
   int tos;
@@ -3341,7 +3344,7 @@ i386_pseudo_register_read_into_value (struct gdbarch *gdbarch,
     }
   else
     {
-      struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+      i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
       if (i386_bnd_regnum_p (gdbarch, regnum))
 	{
 	  regnum -= tdep->bnd0_regnum;
@@ -3531,7 +3534,7 @@ i386_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
     }
   else
     {
-      struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+      i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
       if (i386_bnd_regnum_p (gdbarch, regnum))
 	{
@@ -3639,7 +3642,7 @@ int
 i386_ax_pseudo_register_collect (struct gdbarch *gdbarch,
 				 struct agent_expr *ax, int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (i386_mmx_regnum_p (gdbarch, regnum))
     {
@@ -3856,7 +3859,7 @@ i386_supply_gregset (const struct regset *regset, struct regcache *regcache,
 		     int regnum, const void *gregs, size_t len)
 {
   struct gdbarch *gdbarch = regcache->arch ();
-  const struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  const i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   const gdb_byte *regs = (const gdb_byte *) gregs;
   int i;
 
@@ -3881,7 +3884,7 @@ i386_collect_gregset (const struct regset *regset,
 		      int regnum, void *gregs, size_t len)
 {
   struct gdbarch *gdbarch = regcache->arch ();
-  const struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  const i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   gdb_byte *regs = (gdb_byte *) gregs;
   int i;
 
@@ -3904,7 +3907,7 @@ i386_supply_fpregset (const struct regset *regset, struct regcache *regcache,
 		      int regnum, const void *fpregs, size_t len)
 {
   struct gdbarch *gdbarch = regcache->arch ();
-  const struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  const i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (len == I387_SIZEOF_FXSAVE)
     {
@@ -3927,7 +3930,7 @@ i386_collect_fpregset (const struct regset *regset,
 		       int regnum, void *fpregs, size_t len)
 {
   struct gdbarch *gdbarch = regcache->arch ();
-  const struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  const i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (len == I387_SIZEOF_FXSAVE)
     {
@@ -3959,7 +3962,7 @@ i386_iterate_over_regset_sections (struct gdbarch *gdbarch,
 				   void *cb_data,
 				   const struct regcache *regcache)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   cb (".reg", tdep->sizeof_gregset, tdep->sizeof_gregset, &i386_gregset, NULL,
       cb_data);
@@ -4464,7 +4467,7 @@ i386_elf_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 void
 i386_svr4_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* System V Release 4 uses ELF.  */
   i386_elf_init_abi (info, gdbarch);
@@ -4513,7 +4516,7 @@ int
 i386_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
 			  struct reggroup *group)
 {
-  const struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  const i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int fp_regnum_p, mmx_regnum_p, xmm_regnum_p, mxcsr_regnum_p,
       ymm_regnum_p, ymmh_regnum_p, ymm_avx512_regnum_p, ymmh_avx512_regnum_p,
       bndr_regnum_p, bnd_regnum_p, zmm_regnum_p, zmmh_regnum_p,
@@ -4958,7 +4961,7 @@ static int i386_record_floats (struct gdbarch *gdbarch,
 			       struct i386_record_s *ir,
 			       uint32_t iregnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int i;
 
   /* Oza: Because of floating point insn push/pop of fpu stack is going to
@@ -5029,7 +5032,7 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
   ULONGEST addr;
   gdb_byte buf[I386_MAX_REGISTER_SIZE];
   struct i386_record_s ir;
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   uint8_t rex_w = -1;
   uint8_t rex_r = 0;
 
@@ -8191,7 +8194,7 @@ i386_floatformat_for_type (struct gdbarch *gdbarch,
 }
 
 static int
-i386_validate_tdesc_p (struct gdbarch_tdep *tdep,
+i386_validate_tdesc_p (i386_gdbarch_tdep *tdep,
 		       struct tdesc_arch_data *tdesc_data)
 {
   const struct target_desc *tdesc = tdep->tdesc;
@@ -8393,7 +8396,6 @@ i386_type_align (struct gdbarch *gdbarch, struct type *type)
 static struct gdbarch *
 i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 {
-  struct gdbarch_tdep *tdep;
   struct gdbarch *gdbarch;
   const struct target_desc *tdesc;
   int mm0_regnum;
@@ -8407,7 +8409,7 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
     return arches->gdbarch;
 
   /* Allocate space for the new architecture.  Assume i386 for now.  */
-  tdep = XCNEW (struct gdbarch_tdep);
+  i386_gdbarch_tdep *tdep = new i386_gdbarch_tdep;
   gdbarch = gdbarch_alloc (&info, tdep);
 
   /* General-purpose registers.  */
@@ -8651,7 +8653,7 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 
   if (!i386_validate_tdesc_p (tdep, tdesc_data.get ()))
     {
-      xfree (tdep);
+      delete tdep;
       gdbarch_free (gdbarch);
       return NULL;
     }
@@ -8784,12 +8786,12 @@ static unsigned long
 i386_mpx_bd_base (void)
 {
   struct regcache *rcache;
-  struct gdbarch_tdep *tdep;
   ULONGEST ret;
   enum register_status regstatus;
 
   rcache = get_current_regcache ();
-  tdep = gdbarch_tdep (rcache->arch ());
+  gdbarch *arch = rcache->arch ();
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (arch);
 
   regstatus = regcache_raw_read_unsigned (rcache, tdep->bndcfgu_regnum, &ret);
 
@@ -8802,7 +8804,8 @@ i386_mpx_bd_base (void)
 int
 i386_mpx_enabled (void)
 {
-  const struct gdbarch_tdep *tdep = gdbarch_tdep (get_current_arch ());
+  gdbarch *arch = get_current_arch ();
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (arch);
   const struct target_desc *tdesc = tdep->tdesc;
 
   return (tdesc_find_feature (tdesc, "org.gnu.gdb.i386.mpx") != NULL);
diff --git a/gdb/i386-tdep.h b/gdb/i386-tdep.h
index ee7655e9861..8f1819b58de 100644
--- a/gdb/i386-tdep.h
+++ b/gdb/i386-tdep.h
@@ -57,206 +57,206 @@ enum struct_return
 };
 
 /* i386 architecture specific information.  */
-struct gdbarch_tdep
+struct i386_gdbarch_tdep : gdbarch_tdep
 {
   /* General-purpose registers.  */
-  int *gregset_reg_offset;
-  int gregset_num_regs;
-  size_t sizeof_gregset;
+  int *gregset_reg_offset = 0;
+  int gregset_num_regs = 0;
+  size_t sizeof_gregset = 0;
 
   /* Floating-point registers.  */
-  size_t sizeof_fpregset;
+  size_t sizeof_fpregset = 0;
 
   /* Register number for %st(0).  The register numbers for the other
      registers follow from this one.  Set this to -1 to indicate the
      absence of an FPU.  */
-  int st0_regnum;
+  int st0_regnum = 0;
 
   /* Number of MMX registers.  */
-  int num_mmx_regs;
+  int num_mmx_regs = 0;
 
   /* Register number for %mm0.  Set this to -1 to indicate the absence
      of MMX support.  */
-  int mm0_regnum;
+  int mm0_regnum = 0;
 
   /* Number of pseudo YMM registers.  */
-  int num_ymm_regs;
+  int num_ymm_regs = 0;
 
   /* Register number for %ymm0.  Set this to -1 to indicate the absence
      of pseudo YMM register support.  */
-  int ymm0_regnum;
+  int ymm0_regnum = 0;
 
   /* Number of AVX512 OpMask registers (K-registers)  */
-  int num_k_regs;
+  int num_k_regs = 0;
 
   /* Register number for %k0.  Set this to -1 to indicate the absence
      of AVX512 OpMask register support.  */
-  int k0_regnum;
+  int k0_regnum = 0;
 
   /* Number of pseudo ZMM registers ($zmm0-$zmm31).  */
-  int num_zmm_regs;
+  int num_zmm_regs = 0;
 
   /* Register number for %zmm0.  Set this to -1 to indicate the absence
      of pseudo ZMM register support.  */
-  int zmm0_regnum;
+  int zmm0_regnum = 0;
 
   /* Number of byte registers.  */
-  int num_byte_regs;
+  int num_byte_regs = 0;
 
   /* Register pseudo number for %al.  */
-  int al_regnum;
+  int al_regnum = 0;
 
   /* Number of pseudo word registers.  */
-  int num_word_regs;
+  int num_word_regs = 0;
 
   /* Register number for %ax.  */
-  int ax_regnum;
+  int ax_regnum = 0;
 
   /* Number of pseudo dword registers.  */
-  int num_dword_regs;
+  int num_dword_regs = 0;
 
   /* Register number for %eax.  Set this to -1 to indicate the absence
      of pseudo dword register support.  */
-  int eax_regnum;
+  int eax_regnum = 0;
 
   /* Number of core registers.  */
-  int num_core_regs;
+  int num_core_regs = 0;
 
   /* Number of SSE registers.  */
-  int num_xmm_regs;
+  int num_xmm_regs = 0;
 
   /* Number of SSE registers added in AVX512.  */
-  int num_xmm_avx512_regs;
+  int num_xmm_avx512_regs = 0;
 
   /* Register number of XMM16, the first XMM register added in AVX512.  */
-  int xmm16_regnum;
+  int xmm16_regnum = 0;
 
   /* Number of YMM registers added in AVX512.  */
-  int num_ymm_avx512_regs;
+  int num_ymm_avx512_regs = 0;
 
   /* Register number of YMM16, the first YMM register added in AVX512.  */
-  int ymm16_regnum;
+  int ymm16_regnum = 0;
 
   /* Bits of the extended control register 0 (the XFEATURE_ENABLED_MASK
      register), excluding the x87 bit, which are supported by this GDB.  */
 
-  uint64_t xcr0;
+  uint64_t xcr0 = 0;
 
   /* Offset of XCR0 in XSAVE extended state.  */
-  int xsave_xcr0_offset;
+  int xsave_xcr0_offset = 0;
 
   /* Register names.  */
-  const char * const *register_names;
+  const char * const *register_names = nullptr;
 
   /* Register number for %ymm0h.  Set this to -1 to indicate the absence
      of upper YMM register support.  */
-  int ymm0h_regnum;
+  int ymm0h_regnum = 0;
 
   /* Upper YMM register names.  Only used for tdesc_numbered_register.  */
-  const char * const *ymmh_register_names;
+  const char * const *ymmh_register_names = nullptr;
 
   /* Register number for %ymm16h.  Set this to -1 to indicate the absence
   of support for YMM16-31.  */
-  int ymm16h_regnum;
+  int ymm16h_regnum = 0;
 
   /* YMM16-31 register names.  Only used for tdesc_numbered_register.  */
-  const char * const *ymm16h_register_names;
+  const char * const *ymm16h_register_names = nullptr;
 
   /* Register number for %bnd0r.  Set this to -1 to indicate the absence
      bound registers.  */
-  int bnd0r_regnum;
+  int bnd0r_regnum = 0;
 
   /* Register number for pseudo register %bnd0.  Set this to -1 to indicate the absence
      bound registers.  */
-  int bnd0_regnum;
+  int bnd0_regnum = 0;
 
   /* Register number for %bndcfgu. Set this to -1 to indicate the absence
      bound control registers.  */
-  int bndcfgu_regnum;
+  int bndcfgu_regnum = 0;
 
   /* MPX register names.  Only used for tdesc_numbered_register.  */
-  const char * const *mpx_register_names;
+  const char * const *mpx_register_names = nullptr;
 
   /* Register number for %zmm0h.  Set this to -1 to indicate the absence
      of ZMM_HI256 register support.  */
-  int zmm0h_regnum;
+  int zmm0h_regnum = 0;
 
   /* OpMask register names.  */
-  const char * const *k_register_names;
+  const char * const *k_register_names = nullptr;
 
   /* ZMM register names.  Only used for tdesc_numbered_register.  */
-  const char * const *zmmh_register_names;
+  const char * const *zmmh_register_names = nullptr;
 
   /* XMM16-31 register names.  Only used for tdesc_numbered_register.  */
-  const char * const *xmm_avx512_register_names;
+  const char * const *xmm_avx512_register_names = nullptr;
 
   /* YMM16-31 register names.  Only used for tdesc_numbered_register.  */
-  const char * const *ymm_avx512_register_names;
+  const char * const *ymm_avx512_register_names = nullptr;
 
   /* Number of PKEYS registers.  */
-  int num_pkeys_regs;
+  int num_pkeys_regs = 0;
 
   /* Register number for PKRU register.  */
-  int pkru_regnum;
+  int pkru_regnum = 0;
 
   /* PKEYS register names.  */
-  const char * const *pkeys_register_names;
+  const char * const *pkeys_register_names = nullptr;
 
   /* Register number for %fsbase.  Set this to -1 to indicate the
      absence of segment base registers.  */
-  int fsbase_regnum;
+  int fsbase_regnum = 0;
 
   /* Target description.  */
-  const struct target_desc *tdesc;
+  const struct target_desc *tdesc = nullptr;
 
   /* Register group function.  */
-  gdbarch_register_reggroup_p_ftype *register_reggroup_p;
+  gdbarch_register_reggroup_p_ftype *register_reggroup_p = nullptr;
 
   /* Offset of saved PC in jmp_buf.  */
-  int jb_pc_offset;
+  int jb_pc_offset = 0;
 
   /* Convention for returning structures.  */
-  enum struct_return struct_return;
+  enum struct_return struct_return {};
 
   /* Address range where sigtramp lives.  */
-  CORE_ADDR sigtramp_start;
-  CORE_ADDR sigtramp_end;
+  CORE_ADDR sigtramp_start = 0;
+  CORE_ADDR sigtramp_end = 0;
 
   /* Detect sigtramp.  */
-  int (*sigtramp_p) (struct frame_info *);
+  int (*sigtramp_p) (struct frame_info *) = nullptr;
 
   /* Get address of sigcontext for sigtramp.  */
-  CORE_ADDR (*sigcontext_addr) (struct frame_info *);
+  CORE_ADDR (*sigcontext_addr) (struct frame_info *) = nullptr;
 
   /* Offset of registers in `struct sigcontext'.  */
-  int *sc_reg_offset;
-  int sc_num_regs;
+  int *sc_reg_offset = 0;
+  int sc_num_regs = 0;
 
   /* Offset of saved PC and SP in `struct sigcontext'.  Usage of these
      is deprecated, please use `sc_reg_offset' instead.  */
-  int sc_pc_offset;
-  int sc_sp_offset;
+  int sc_pc_offset = 0;
+  int sc_sp_offset = 0;
 
   /* ISA-specific data types.  */
-  struct type *i386_mmx_type;
-  struct type *i386_ymm_type;
-  struct type *i386_zmm_type;
-  struct type *i387_ext_type;
-  struct type *i386_bnd_type;
+  struct type *i386_mmx_type = nullptr;
+  struct type *i386_ymm_type = nullptr;
+  struct type *i386_zmm_type = nullptr;
+  struct type *i387_ext_type = nullptr;
+  struct type *i386_bnd_type = nullptr;
 
   /* Process record/replay target.  */
   /* The map for registers because the AMD64's registers order
      in GDB is not same as I386 instructions.  */
-  const int *record_regmap;
+  const int *record_regmap = nullptr;
   /* Parse intx80 args.  */
-  int (*i386_intx80_record) (struct regcache *regcache);
+  int (*i386_intx80_record) (struct regcache *regcache) = nullptr;
   /* Parse sysenter args.  */
-  int (*i386_sysenter_record) (struct regcache *regcache);
+  int (*i386_sysenter_record) (struct regcache *regcache) = nullptr;
   /* Parse syscall args.  */
-  int (*i386_syscall_record) (struct regcache *regcache);
+  int (*i386_syscall_record) (struct regcache *regcache) = nullptr;
 
   /* Regsets. */
-  const struct regset *fpregset;
+  const struct regset *fpregset = nullptr;
 };
 
 /* Floating-point registers.  */
diff --git a/gdb/i386-windows-tdep.c b/gdb/i386-windows-tdep.c
index b561d60e0f8..5ab1474c164 100644
--- a/gdb/i386-windows-tdep.c
+++ b/gdb/i386-windows-tdep.c
@@ -136,7 +136,7 @@ i386_windows_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 static void
 i386_windows_init_abi_common (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   set_gdbarch_skip_trampoline_code (gdbarch, i386_windows_skip_trampoline_code);
 
diff --git a/gdb/i387-tdep.c b/gdb/i387-tdep.c
index cb1aa152f31..e5c78145bd7 100644
--- a/gdb/i387-tdep.c
+++ b/gdb/i387-tdep.c
@@ -204,7 +204,7 @@ void
 i387_print_float_info (struct gdbarch *gdbarch, struct ui_file *file,
 		       struct frame_info *frame, const char *args)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (get_frame_arch (frame));
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   ULONGEST fctrl;
   int fctrl_p;
   ULONGEST fstat;
@@ -440,7 +440,7 @@ void
 i387_supply_fsave (struct regcache *regcache, int regnum, const void *fsave)
 {
   struct gdbarch *gdbarch = regcache->arch ();
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   const gdb_byte *regs = (const gdb_byte *) fsave;
   int i;
@@ -494,7 +494,8 @@ i387_supply_fsave (struct regcache *regcache, int regnum, const void *fsave)
 void
 i387_collect_fsave (const struct regcache *regcache, int regnum, void *fsave)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (regcache->arch ());
+  gdbarch *arch = regcache->arch ();
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (arch);
   gdb_byte *regs = (gdb_byte *) fsave;
   int i;
 
@@ -587,7 +588,8 @@ static int i387_tag (const gdb_byte *raw);
 void
 i387_supply_fxsave (struct regcache *regcache, int regnum, const void *fxsave)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (regcache->arch ());
+  gdbarch *arch = regcache->arch ();
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (arch);
   const gdb_byte *regs = (const gdb_byte *) fxsave;
   int i;
 
@@ -670,7 +672,8 @@ i387_supply_fxsave (struct regcache *regcache, int regnum, const void *fxsave)
 void
 i387_collect_fxsave (const struct regcache *regcache, int regnum, void *fxsave)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (regcache->arch ());
+  gdbarch *arch = regcache->arch ();
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (arch);
   gdb_byte *regs = (gdb_byte *) fxsave;
   int i;
 
@@ -903,7 +906,7 @@ i387_xsave_get_clear_bv (struct gdbarch *gdbarch, const void *xsave)
 {
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   const gdb_byte *regs = (const gdb_byte *) xsave;
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* Get `xstat_bv'.  The supported bits in `xstat_bv' are 8 bytes.  */
   ULONGEST xstate_bv = extract_unsigned_integer (XSAVE_XSTATE_BV_ADDR (regs),
@@ -923,7 +926,7 @@ i387_supply_xsave (struct regcache *regcache, int regnum,
 {
   struct gdbarch *gdbarch = regcache->arch ();
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   const gdb_byte *regs = (const gdb_byte *) xsave;
   int i;
   /* In 64-bit mode the split between "low" and "high" ZMM registers is at
@@ -1346,7 +1349,7 @@ i387_collect_xsave (const struct regcache *regcache, int regnum,
 {
   struct gdbarch *gdbarch = regcache->arch ();
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   gdb_byte *p, *regs = (gdb_byte *) xsave;
   gdb_byte raw[I386_MAX_REGISTER_SIZE];
   ULONGEST initial_xstate_bv, clear_bv, xstate_bv = 0;
@@ -1931,7 +1934,7 @@ i387_tag (const gdb_byte *raw)
 void
 i387_return_value (struct gdbarch *gdbarch, struct regcache *regcache)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   ULONGEST fstat;
 
   /* Set the top of the floating-point register stack to 7.  The
@@ -1954,7 +1957,7 @@ i387_return_value (struct gdbarch *gdbarch, struct regcache *regcache)
 void
 i387_reset_bnd_regs (struct gdbarch *gdbarch, struct regcache *regcache)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (I387_BND0R_REGNUM (tdep) > 0)
     {
diff --git a/gdb/ia64-linux-tdep.c b/gdb/ia64-linux-tdep.c
index 71767ddf83e..cf062f1754a 100644
--- a/gdb/ia64-linux-tdep.c
+++ b/gdb/ia64-linux-tdep.c
@@ -216,7 +216,7 @@ ia64_linux_iterate_over_regset_sections (struct gdbarch *gdbarch,
 static void
 ia64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ia64_gdbarch_tdep *tdep = (ia64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   static const char *const stap_register_prefixes[] = { "r", NULL };
   static const char *const stap_register_indirection_prefixes[] = { "[",
 								    NULL };
diff --git a/gdb/ia64-tdep.c b/gdb/ia64-tdep.c
index b6816cb78b4..08c5d6a72ef 100644
--- a/gdb/ia64-tdep.c
+++ b/gdb/ia64-tdep.c
@@ -310,7 +310,7 @@ static const struct floatformat *floatformats_ia64_ext[2] =
 static struct type *
 ia64_ext_type (struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ia64_gdbarch_tdep *tdep = (ia64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (!tdep->ia64_ext_type)
     tdep->ia64_ext_type
@@ -2177,7 +2177,7 @@ ia64_sigtramp_frame_init_saved_regs (struct frame_info *this_frame,
 				     struct ia64_frame_cache *cache)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ia64_gdbarch_tdep *tdep = (ia64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (tdep->sigcontext_register_address)
     {
@@ -2335,7 +2335,8 @@ ia64_sigtramp_frame_sniffer (const struct frame_unwind *self,
 			     struct frame_info *this_frame,
 			     void **this_cache)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (get_frame_arch (this_frame));
+  gdbarch *arch = get_frame_arch (this_frame);
+  ia64_gdbarch_tdep *tdep = (ia64_gdbarch_tdep *) gdbarch_tdep (arch);
   if (tdep->pc_in_sigtramp)
     {
       CORE_ADDR pc = get_frame_pc (this_frame);
@@ -3482,7 +3483,7 @@ ia64_find_global_pointer_from_dynamic_section (struct gdbarch *gdbarch,
 static CORE_ADDR
 ia64_find_global_pointer (struct gdbarch *gdbarch, CORE_ADDR faddr)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ia64_gdbarch_tdep *tdep = (ia64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   CORE_ADDR addr = 0;
 
   if (tdep->find_global_pointer_from_solib)
@@ -3677,7 +3678,7 @@ ia64_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);
+  ia64_gdbarch_tdep *tdep = (ia64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   int argno;
   struct value *arg;
@@ -3917,14 +3918,13 @@ static struct gdbarch *
 ia64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 {
   struct gdbarch *gdbarch;
-  struct gdbarch_tdep *tdep;
 
   /* If there is already a candidate, use it.  */
   arches = gdbarch_list_lookup_by_info (arches, &info);
   if (arches != NULL)
     return arches->gdbarch;
 
-  tdep = XCNEW (struct gdbarch_tdep);
+  ia64_gdbarch_tdep *tdep = new ia64_gdbarch_tdep;
   gdbarch = gdbarch_alloc (&info, tdep);
 
   tdep->size_of_register_frame = ia64_size_of_register_frame;
diff --git a/gdb/ia64-tdep.h b/gdb/ia64-tdep.h
index 28bf4463fd6..82319d50894 100644
--- a/gdb/ia64-tdep.h
+++ b/gdb/ia64-tdep.h
@@ -20,6 +20,8 @@
 #ifndef IA64_TDEP_H
 #define IA64_TDEP_H
 
+#include "gdbarch.h"
+
 #ifdef HAVE_LIBUNWIND_IA64_H
 #include "libunwind-ia64.h"
 #include "ia64-libunwind-tdep.h"
@@ -214,30 +216,33 @@ struct ia64_infcall_ops
 
      Should do nothing if this operation is not permitted by the OS.  */
   void (*allocate_new_rse_frame) (struct regcache *regcache, ULONGEST bsp,
-				  int sof);
+				  int sof) = nullptr;
 
   /* Store the argument stored in BUF into the appropriate location
      given the BSP and the SLOTNUM.  */
   void (*store_argument_in_slot) (struct regcache *regcache, CORE_ADDR bsp,
-				  int slotnum, gdb_byte *buf);
+				  int slotnum, gdb_byte *buf) = nullptr;
 
   /* For targets where we cannot call the function directly, store
      the address of the function we want to call at the location
      expected by the calling sequence.  */
-  void (*set_function_addr) (struct regcache *regcache, CORE_ADDR func_addr);
+  void (*set_function_addr) (struct regcache *regcache, CORE_ADDR func_addr)
+    = nullptr;
 };
 
-struct gdbarch_tdep
+struct ia64_gdbarch_tdep : gdbarch_tdep
 {
-  CORE_ADDR (*sigcontext_register_address) (struct gdbarch *, CORE_ADDR, int);
-  int (*pc_in_sigtramp) (CORE_ADDR);
+  CORE_ADDR (*sigcontext_register_address) (struct gdbarch *, CORE_ADDR, int)
+    = nullptr;
+  int (*pc_in_sigtramp) (CORE_ADDR) = nullptr;
 
   /* Return the total size of THIS_FRAME's register frame.
      CFM is THIS_FRAME's cfm register value.
 
      Normally, the size of the register frame is always obtained by
      extracting the lowest 7 bits ("cfm & 0x7f").  */
-  int (*size_of_register_frame) (struct frame_info *this_frame, ULONGEST cfm);
+  int (*size_of_register_frame) (struct frame_info *this_frame, ULONGEST cfm)
+    = nullptr;
 
   /* Determine the function address FADDR belongs to a shared library.
      If it does, then return the associated global pointer.  If no shared
@@ -245,10 +250,10 @@ struct gdbarch_tdep
 
      This pointer may be NULL.  */
   CORE_ADDR (*find_global_pointer_from_solib) (struct gdbarch *gdbarch,
-					       CORE_ADDR faddr);
+					       CORE_ADDR faddr) = nullptr;
 
   /* ISA-specific data types.  */
-  struct type *ia64_ext_type;
+  struct type *ia64_ext_type = nullptr;
 
   struct ia64_infcall_ops infcall_ops;
 };
diff --git a/gdb/lm32-tdep.c b/gdb/lm32-tdep.c
index 9c5dda306d0..3f91c050b47 100644
--- a/gdb/lm32-tdep.c
+++ b/gdb/lm32-tdep.c
@@ -42,7 +42,7 @@
 #define LM32_REG2(insn)         ((insn >> 11) & 0x1f)
 #define LM32_IMM16(insn)        ((((long)insn & 0xffff) << 16) >> 16)
 
-struct gdbarch_tdep
+struct lm32_gdbarch_tdep : gdbarch_tdep
 {
   /* gdbarch target dependent data here.  Currently unused for LM32.  */
 };
@@ -491,7 +491,6 @@ static struct gdbarch *
 lm32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 {
   struct gdbarch *gdbarch;
-  struct gdbarch_tdep *tdep;
 
   /* If there is already a candidate, use it.  */
   arches = gdbarch_list_lookup_by_info (arches, &info);
@@ -499,7 +498,7 @@ lm32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
     return arches->gdbarch;
 
   /* None found, create a new architecture from the information provided.  */
-  tdep = XCNEW (struct gdbarch_tdep);
+  lm32_gdbarch_tdep *tdep = new lm32_gdbarch_tdep;
   gdbarch = gdbarch_alloc (&info, tdep);
 
   /* Type sizes.  */
diff --git a/gdb/m32c-tdep.c b/gdb/m32c-tdep.c
index 3374b00cb5a..200d51a16b1 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;
 };
 
 \f
@@ -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.  */
diff --git a/gdb/m32r-tdep.c b/gdb/m32r-tdep.c
index 48cc42c868b..a9906ff39a6 100644
--- a/gdb/m32r-tdep.c
+++ b/gdb/m32r-tdep.c
@@ -865,7 +865,6 @@ static struct gdbarch *
 m32r_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 {
   struct gdbarch *gdbarch;
-  struct gdbarch_tdep *tdep;
 
   /* If there is already a candidate, use it.  */
   arches = gdbarch_list_lookup_by_info (arches, &info);
@@ -873,7 +872,7 @@ m32r_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
     return arches->gdbarch;
 
   /* Allocate space for the new architecture.  */
-  tdep = XCNEW (struct gdbarch_tdep);
+  m32r_gdbarch_tdep *tdep = new m32r_gdbarch_tdep;
   gdbarch = gdbarch_alloc (&info, tdep);
 
   set_gdbarch_wchar_bit (gdbarch, 16);
diff --git a/gdb/m32r-tdep.h b/gdb/m32r-tdep.h
index ba6bad9a3e8..22c333cff7d 100644
--- a/gdb/m32r-tdep.h
+++ b/gdb/m32r-tdep.h
@@ -20,7 +20,9 @@
 #ifndef M32R_TDEP_H
 #define M32R_TDEP_H
 
-struct gdbarch_tdep
+#include "gdbarch.h"
+
+struct m32r_gdbarch_tdep : gdbarch_tdep
 {
   /* gdbarch target dependent data here.  Currently unused for M32R.  */
 };
diff --git a/gdb/m68hc11-tdep.c b/gdb/m68hc11-tdep.c
index bbf7e5d98e8..6d41fe85f95 100644
--- a/gdb/m68hc11-tdep.c
+++ b/gdb/m68hc11-tdep.c
@@ -123,27 +123,38 @@ enum insn_return_kind {
 #define M68HC12_HARD_PC_REGNUM  (SOFT_D32_REGNUM+1)
 
 struct insn_sequence;
-struct gdbarch_tdep
+struct m68gc11_gdbarch_tdep : gdbarch_tdep
   {
     /* Stack pointer correction value.  For 68hc11, the stack pointer points
        to the next push location.  An offset of 1 must be applied to obtain
        the address where the last value is saved.  For 68hc12, the stack
        pointer points to the last value pushed.  No offset is necessary.  */
-    int stack_correction;
+    int stack_correction = 0;
 
     /* Description of instructions in the prologue.  */
-    struct insn_sequence *prologue;
+    struct insn_sequence *prologue = nullptr;
 
     /* True if the page memory bank register is available
        and must be used.  */
-    int use_page_register;
+    int use_page_register = 0;
 
     /* ELF flags for ABI.  */
-    int elf_flags;
+    int elf_flags = 0;
   };
 
-#define STACK_CORRECTION(gdbarch) (gdbarch_tdep (gdbarch)->stack_correction)
-#define USE_PAGE_REGISTER(gdbarch) (gdbarch_tdep (gdbarch)->use_page_register)
+static int
+stack_correction (gdbarch *arch)
+{
+  m68gc11_gdbarch_tdep *tdep = (m68gc11_gdbarch_tdep *) gdbarch_tdep (arch);
+  return tdep->stack_correction;
+}
+
+static int
+use_page_register (gdbarch *arch)
+{
+  m68gc11_gdbarch_tdep *tdep = (m68gc11_gdbarch_tdep *) gdbarch_tdep (arch);
+  return tdep->stack_correction;
+}
 
 struct m68hc11_unwind_cache
 {
@@ -371,13 +382,15 @@ m68hc11_pseudo_register_write (struct gdbarch *gdbarch,
 static const char *
 m68hc11_register_name (struct gdbarch *gdbarch, int reg_nr)
 {
-  if (reg_nr == M68HC12_HARD_PC_REGNUM && USE_PAGE_REGISTER (gdbarch))
+  if (reg_nr == M68HC12_HARD_PC_REGNUM && use_page_register (gdbarch))
     return "pc";
-  if (reg_nr == HARD_PC_REGNUM && USE_PAGE_REGISTER (gdbarch))
+
+  if (reg_nr == HARD_PC_REGNUM && use_page_register (gdbarch))
     return "ppc";
   
   if (reg_nr < 0)
     return NULL;
+
   if (reg_nr >= M68HC11_ALL_REGS)
     return NULL;
 
@@ -387,6 +400,7 @@ m68hc11_register_name (struct gdbarch *gdbarch, int reg_nr)
      does not exist.  */
   if (reg_nr > M68HC11_LAST_HARD_REG && soft_regs[reg_nr].name == 0)
     return NULL;
+
   return m68hc11_register_names[reg_nr];
 }
 
@@ -627,7 +641,8 @@ m68hc11_scan_prologue (struct gdbarch *gdbarch, CORE_ADDR pc,
       return pc;
     }
 
-  seq_table = gdbarch_tdep (gdbarch)->prologue;
+  m68gc11_gdbarch_tdep *tdep = (m68gc11_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+  seq_table = tdep->prologue;
   
   /* The 68hc11 stack is as follows:
 
@@ -807,7 +822,7 @@ m68hc11_frame_unwind_cache (struct frame_info *this_frame,
       info->saved_regs[HARD_PC_REGNUM].set_addr (info->sp_offset);
       this_base = get_frame_register_unsigned (this_frame, HARD_SP_REGNUM);
       prev_sp = this_base + info->sp_offset + 2;
-      this_base += STACK_CORRECTION (gdbarch);
+      this_base += stack_correction (gdbarch);
     }
   else
     {
@@ -815,7 +830,7 @@ m68hc11_frame_unwind_cache (struct frame_info *this_frame,
 	 to before the first saved register giving the SP.  */
       prev_sp = this_base + info->size + 2;
 
-      this_base += STACK_CORRECTION (gdbarch);
+      this_base += stack_correction (gdbarch);
       if (soft_regs[SOFT_FP_REGNUM].name)
 	info->saved_regs[SOFT_FP_REGNUM].set_addr (info->size - 2);
    }
@@ -898,7 +913,7 @@ m68hc11_frame_prev_register (struct frame_info *this_frame,
   /* Take into account the 68HC12 specific call (PC + page).  */
   if (regnum == HARD_PC_REGNUM
       && info->return_kind == RETURN_RTC
-      && USE_PAGE_REGISTER (get_frame_arch (this_frame)))
+      && use_page_register (get_frame_arch (this_frame)))
     {
       CORE_ADDR pc = value_as_long (value);
       if (pc >= 0x08000 && pc < 0x0c000)
@@ -1003,7 +1018,10 @@ m68hc11_print_register (struct gdbarch *gdbarch, struct ui_file *file,
     }
   else
     {
-      if (regno == HARD_PC_REGNUM && gdbarch_tdep (gdbarch)->use_page_register)
+      m68gc11_gdbarch_tdep *tdep
+	= (m68gc11_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+
+      if (regno == HARD_PC_REGNUM && tdep->use_page_register)
 	{
 	  ULONGEST page;
 
@@ -1106,7 +1124,9 @@ m68hc11_print_registers_info (struct gdbarch *gdbarch, struct ui_file *file,
       fprintf_filtered (file, " Y=");
       m68hc11_print_register (gdbarch, file, frame, HARD_Y_REGNUM);
   
-      if (gdbarch_tdep (gdbarch)->use_page_register)
+      m68gc11_gdbarch_tdep *tdep = (m68gc11_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+
+      if (tdep->use_page_register)
 	{
 	  fprintf_filtered (file, "\nPage=");
 	  m68hc11_print_register (gdbarch, file, frame, HARD_PAGE_REGNUM);
@@ -1194,7 +1214,7 @@ m68hc11_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
   write_memory (sp, buf, 2);
 
   /* Finally, update the stack pointer...  */
-  sp -= STACK_CORRECTION (gdbarch);
+  sp -= stack_correction (gdbarch);
   regcache_cooked_write_unsigned (regcache, HARD_SP_REGNUM, sp);
 
   /* ...and fake a frame pointer.  */
@@ -1386,7 +1406,6 @@ m68hc11_gdbarch_init (struct gdbarch_info info,
 		      struct gdbarch_list *arches)
 {
   struct gdbarch *gdbarch;
-  struct gdbarch_tdep *tdep;
   int elf_flags;
 
   soft_reg_initialized = 0;
@@ -1403,14 +1422,17 @@ m68hc11_gdbarch_init (struct gdbarch_info info,
        arches != NULL;
        arches = gdbarch_list_lookup_by_info (arches->next, &info))
     {
-      if (gdbarch_tdep (arches->gdbarch)->elf_flags != elf_flags)
+      m68gc11_gdbarch_tdep *tdep
+	= (m68gc11_gdbarch_tdep *) gdbarch_tdep (arches->gdbarch);
+
+      if (tdep->elf_flags != elf_flags)
 	continue;
 
       return arches->gdbarch;
     }
 
   /* Need a new architecture.  Fill in a target specific vector.  */
-  tdep = XCNEW (struct gdbarch_tdep);
+  m68gc11_gdbarch_tdep *tdep = new m68gc11_gdbarch_tdep;
   gdbarch = gdbarch_alloc (&info, tdep);
   tdep->elf_flags = elf_flags;
 
diff --git a/gdb/m68k-bsd-tdep.c b/gdb/m68k-bsd-tdep.c
index 593708fe59d..27fbb845551 100644
--- a/gdb/m68k-bsd-tdep.c
+++ b/gdb/m68k-bsd-tdep.c
@@ -133,7 +133,7 @@ m68kbsd_iterate_over_regset_sections (struct gdbarch *gdbarch,
 static void
 m68kbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  m68k_gdbarch_tdep *tdep = (m68k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   tdep->jb_pc = 5;
   tdep->jb_elt_size = 4;
diff --git a/gdb/m68k-linux-tdep.c b/gdb/m68k-linux-tdep.c
index ad4d75adb4d..6704d8319f3 100644
--- a/gdb/m68k-linux-tdep.c
+++ b/gdb/m68k-linux-tdep.c
@@ -384,7 +384,7 @@ m68k_linux_iterate_over_regset_sections (struct gdbarch *gdbarch,
 static void
 m68k_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  m68k_gdbarch_tdep *tdep = (m68k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   linux_init_abi (info, gdbarch, 0);
 
diff --git a/gdb/m68k-tdep.c b/gdb/m68k-tdep.c
index 75fa189b762..4ae27e6b774 100644
--- a/gdb/m68k-tdep.c
+++ b/gdb/m68k-tdep.c
@@ -70,7 +70,7 @@ typedef BP_MANIPULATION (m68k_break_insn) m68k_breakpoint;
 static struct type *
 m68k_ps_type (struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  m68k_gdbarch_tdep *tdep = (m68k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (!tdep->m68k_ps_type)
     {
@@ -99,7 +99,7 @@ m68k_ps_type (struct gdbarch *gdbarch)
 static struct type *
 m68881_ext_type (struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  m68k_gdbarch_tdep *tdep = (m68k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (!tdep->m68881_ext_type)
     tdep->m68881_ext_type
@@ -120,7 +120,7 @@ m68881_ext_type (struct gdbarch *gdbarch)
 static struct type *
 m68k_register_type (struct gdbarch *gdbarch, int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  m68k_gdbarch_tdep *tdep = (m68k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (tdep->fpregs_present)
     {
@@ -171,12 +171,14 @@ static const char * const m68k_register_names[] = {
 static const char *
 m68k_register_name (struct gdbarch *gdbarch, int regnum)
 {
+  m68k_gdbarch_tdep *tdep = (m68k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+
   if (regnum < 0 || regnum >= ARRAY_SIZE (m68k_register_names))
     internal_error (__FILE__, __LINE__,
 		    _("m68k_register_name: illegal register number %d"),
 		    regnum);
   else if (regnum >= M68K_FP0_REGNUM && regnum <= M68K_FPI_REGNUM
-	   && gdbarch_tdep (gdbarch)->fpregs_present == 0)
+	   && tdep->fpregs_present == 0)
     return "";
   else
     return m68k_register_names[regnum];
@@ -189,7 +191,9 @@ static int
 m68k_convert_register_p (struct gdbarch *gdbarch,
 			 int regnum, struct type *type)
 {
-  if (!gdbarch_tdep (gdbarch)->fpregs_present)
+  m68k_gdbarch_tdep *tdep = (m68k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+
+  if (!tdep->fpregs_present)
     return 0;
   return (regnum >= M68K_FP0_REGNUM && regnum <= M68K_FP0_REGNUM + 7
 	  /* We only support floating-point values.  */
@@ -296,7 +300,7 @@ m68k_extract_return_value (struct type *type, struct regcache *regcache,
   if (type->code () == TYPE_CODE_PTR && len == 4)
     {
       struct gdbarch *gdbarch = regcache->arch ();
-      struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+      m68k_gdbarch_tdep *tdep = (m68k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
       regcache->raw_read (tdep->pointer_result_regnum, valbuf);
     }
   else if (len <= 4)
@@ -321,7 +325,7 @@ m68k_svr4_extract_return_value (struct type *type, struct regcache *regcache,
 {
   gdb_byte buf[M68K_MAX_REGISTER_SIZE];
   struct gdbarch *gdbarch = regcache->arch ();
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  m68k_gdbarch_tdep *tdep = (m68k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (tdep->float_return && type->code () == TYPE_CODE_FLT)
     {
@@ -344,7 +348,7 @@ m68k_store_return_value (struct type *type, struct regcache *regcache,
   if (type->code () == TYPE_CODE_PTR && len == 4)
     {
       struct gdbarch *gdbarch = regcache->arch ();
-      struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+      m68k_gdbarch_tdep *tdep = (m68k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
       regcache->raw_write (tdep->pointer_result_regnum, valbuf);
       /* gdb historically also set D0 in the SVR4 case.  */
       if (tdep->pointer_result_regnum != M68K_D0_REGNUM)
@@ -367,7 +371,7 @@ m68k_svr4_store_return_value (struct type *type, struct regcache *regcache,
 			      const gdb_byte *valbuf)
 {
   struct gdbarch *gdbarch = regcache->arch ();
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  m68k_gdbarch_tdep *tdep = (m68k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (tdep->float_return && type->code () == TYPE_CODE_FLT)
     {
@@ -387,7 +391,7 @@ m68k_svr4_store_return_value (struct type *type, struct regcache *regcache,
 static int
 m68k_reg_struct_return_p (struct gdbarch *gdbarch, struct type *type)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  m68k_gdbarch_tdep *tdep = (m68k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   enum type_code code = type->code ();
   int len = TYPE_LENGTH (type);
 
@@ -465,6 +469,7 @@ m68k_svr4_return_value (struct gdbarch *gdbarch, struct value *function,
 			gdb_byte *readbuf, const gdb_byte *writebuf)
 {
   enum type_code code = type->code ();
+  m68k_gdbarch_tdep *tdep = (m68k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* Aggregates with a single member are always returned like their
      sole element.  */
@@ -480,7 +485,7 @@ m68k_svr4_return_value (struct gdbarch *gdbarch, struct value *function,
 	|| code == TYPE_CODE_COMPLEX || code == TYPE_CODE_ARRAY)
        && !m68k_reg_struct_return_p (gdbarch, type))
       /* GCC may return a `long double' in memory too.  */
-      || (!gdbarch_tdep (gdbarch)->float_return
+      || (!tdep->float_return
 	  && code == TYPE_CODE_FLT
 	  && TYPE_LENGTH (type) == 12))
     {
@@ -500,7 +505,6 @@ m68k_svr4_return_value (struct gdbarch *gdbarch, struct value *function,
 
       if (readbuf)
 	{
-	  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
 	  ULONGEST addr;
 
 	  regcache_raw_read_unsigned (regcache, tdep->pointer_result_regnum,
@@ -537,7 +541,7 @@ m68k_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);
+  m68k_gdbarch_tdep *tdep = (m68k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   gdb_byte buf[4];
   int i;
@@ -592,13 +596,15 @@ m68k_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 static int
 m68k_dwarf_reg_to_regnum (struct gdbarch *gdbarch, int num)
 {
+  m68k_gdbarch_tdep *tdep = (m68k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+
   if (num < 8)
     /* d0..7 */
     return (num - 0) + M68K_D0_REGNUM;
   else if (num < 16)
     /* a0..7 */
     return (num - 8) + M68K_A0_REGNUM;
-  else if (num < 24 && gdbarch_tdep (gdbarch)->fpregs_present)
+  else if (num < 24 && tdep->fpregs_present)
     /* fp0..7 */
     return (num - 16) + M68K_FP0_REGNUM;
   else if (num == 25)
@@ -760,6 +766,7 @@ m68k_analyze_register_saves (struct gdbarch *gdbarch, CORE_ADDR pc,
 			     struct m68k_frame_cache *cache)
 {
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
+  m68k_gdbarch_tdep *tdep = (m68k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (cache->locals >= 0)
     {
@@ -772,7 +779,7 @@ m68k_analyze_register_saves (struct gdbarch *gdbarch, CORE_ADDR pc,
 	{
 	  op = read_memory_unsigned_integer (pc, 2, byte_order);
 	  if (op == P_FMOVEMX_SP
-	      && gdbarch_tdep (gdbarch)->fpregs_present)
+	      && tdep->fpregs_present)
 	    {
 	      /* fmovem.x REGS,-(%sp) */
 	      op = read_memory_unsigned_integer (pc + 2, 2, byte_order);
@@ -1051,7 +1058,7 @@ m68k_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
   gdb_byte *buf;
   CORE_ADDR sp, jb_addr;
   struct gdbarch *gdbarch = get_frame_arch (frame);
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  m68k_gdbarch_tdep *tdep = (m68k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
 
   if (tdep->jb_pc < 0)
@@ -1097,7 +1104,7 @@ m68k_return_in_first_hidden_param_p (struct gdbarch *gdbarch,
 void
 m68k_svr4_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  m68k_gdbarch_tdep *tdep = (m68k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* SVR4 uses a different calling convention.  */
   set_gdbarch_return_value (gdbarch, m68k_svr4_return_value);
@@ -1115,7 +1122,7 @@ m68k_svr4_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 static void
 m68k_embedded_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  m68k_gdbarch_tdep *tdep = (m68k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   m68k_svr4_init_abi (info, gdbarch);
   tdep->pointer_result_regnum = M68K_D0_REGNUM;
@@ -1130,7 +1137,6 @@ m68k_embedded_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 static struct gdbarch *
 m68k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 {
-  struct gdbarch_tdep *tdep = NULL;
   struct gdbarch *gdbarch;
   struct gdbarch_list *best_arch;
   tdesc_arch_data_up tdesc_data;
@@ -1230,13 +1236,16 @@ m68k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
        best_arch != NULL;
        best_arch = gdbarch_list_lookup_by_info (best_arch->next, &info))
     {
-      if (flavour != gdbarch_tdep (best_arch->gdbarch)->flavour)
+      m68k_gdbarch_tdep *tdep
+	= (m68k_gdbarch_tdep *) gdbarch_tdep (best_arch->gdbarch);
+
+      if (flavour != tdep->flavour)
 	continue;
 
-      if (has_fp != gdbarch_tdep (best_arch->gdbarch)->fpregs_present)
+      if (has_fp != tdep->fpregs_present)
 	continue;
 
-      if (float_return != gdbarch_tdep (best_arch->gdbarch)->float_return)
+      if (float_return != tdep->float_return)
 	continue;
 
       break;
@@ -1245,7 +1254,7 @@ m68k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   if (best_arch != NULL)
     return best_arch->gdbarch;
 
-  tdep = XCNEW (struct gdbarch_tdep);
+  m68k_gdbarch_tdep *tdep = new m68k_gdbarch_tdep;
   gdbarch = gdbarch_alloc (&info, tdep);
   tdep->fpregs_present = has_fp;
   tdep->float_return = float_return;
@@ -1330,7 +1339,7 @@ m68k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 static void
 m68k_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  m68k_gdbarch_tdep *tdep = (m68k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (tdep == NULL)
     return;
diff --git a/gdb/m68k-tdep.h b/gdb/m68k-tdep.h
index 16384d108bf..c88e7f26da5 100644
--- a/gdb/m68k-tdep.h
+++ b/gdb/m68k-tdep.h
@@ -67,38 +67,38 @@ enum m68k_flavour
 
 /* Target-dependent structure in gdbarch.  */
 
-struct gdbarch_tdep
+struct m68k_gdbarch_tdep : gdbarch_tdep
 {
   /* Offset to PC value in the jump buffer.  If this is negative,
      longjmp support will be disabled.  */
-  int jb_pc;
+  int jb_pc = 0;
   /* The size of each entry in the jump buffer.  */
-  size_t jb_elt_size;
+  size_t jb_elt_size = 0;
 
   /* Register in which the address to store a structure value is
      passed to a function.  */
-  int struct_value_regnum;
+  int struct_value_regnum = 0;
 
   /* Register in which a pointer value is returned.  In the SVR4 ABI,
      this is %a0, but in GCC's "embedded" ABI, this is %d0.  */
-  int pointer_result_regnum;
+  int pointer_result_regnum = 0;
 
   /* Convention for returning structures.  */
-  enum struct_return struct_return;
+  enum struct_return struct_return {};
 
   /* Convention for returning floats.  zero in int regs, non-zero in float.  */
-  int float_return;
+  int float_return = 0;
 
   /* The particular flavour of m68k.  */
-  enum m68k_flavour flavour;
+  enum m68k_flavour flavour {};
 
   /* Flag set if the floating point registers are present, or assumed
      to be present.  */
-  int fpregs_present;
+  int fpregs_present = 0;
 
    /* ISA-specific data types.  */
-  struct type *m68k_ps_type;
-  struct type *m68881_ext_type;
+  struct type *m68k_ps_type = nullptr;
+  struct type *m68881_ext_type = nullptr;
 };
 
 /* Initialize a SVR4 architecture variant.  */
diff --git a/gdb/mep-tdep.c b/gdb/mep-tdep.c
index d48e1f117a7..6d1f04a2ab2 100644
--- a/gdb/mep-tdep.c
+++ b/gdb/mep-tdep.c
@@ -116,7 +116,7 @@
      options are present on the current processor.  */
 
 
-struct gdbarch_tdep
+struct mep_gdbarch_tdep : gdbarch_tdep
 {
   /* A CGEN cpu descriptor for this BFD architecture and machine.
 
@@ -124,7 +124,7 @@ struct gdbarch_tdep
      MeP libopcodes machinery actually puts off module-specific
      customization until the last minute.  So this contains
      information about all supported me_modules.  */
-  CGEN_CPU_DESC cpu_desc;
+  CGEN_CPU_DESC cpu_desc = nullptr;
 
   /* The me_module index from the ELF file we used to select this
      architecture, or CONFIG_NONE if there was none.
@@ -140,7 +140,7 @@ struct gdbarch_tdep
      create a separate instance of the gdbarch structure for each
      me_module value mep_gdbarch_init sees, and store the me_module
      value from the ELF file here.  */
-  CONFIG_ATTR me_module;
+  CONFIG_ATTR me_module {};
 };
 
 
@@ -259,7 +259,9 @@ me_module_register_set (CONFIG_ATTR me_module,
        mask contains any of the me_module's coprocessor ISAs,
        specifically excluding the generic coprocessor register sets.  */
 
-  CGEN_CPU_DESC desc = gdbarch_tdep (target_gdbarch ())->cpu_desc;
+  mep_gdbarch_tdep *tdep
+    = (mep_gdbarch_tdep *) gdbarch_tdep (target_gdbarch ());
+  CGEN_CPU_DESC desc = tdep->cpu_desc;
   const CGEN_HW_ENTRY *hw;
 
   if (me_module == CONFIG_NONE)
@@ -852,7 +854,11 @@ current_me_module (void)
       return (CONFIG_ATTR) regval;
     }
   else
-    return gdbarch_tdep (target_gdbarch ())->me_module;
+    {
+      mep_gdbarch_tdep *tdep
+	= (mep_gdbarch_tdep *) gdbarch_tdep (target_gdbarch ());
+      return tdep->me_module;
+    }
 }
 
 
@@ -2326,7 +2332,6 @@ static struct gdbarch *
 mep_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 {
   struct gdbarch *gdbarch;
-  struct gdbarch_tdep *tdep;
 
   /* Which me_module are we building a gdbarch object for?  */
   CONFIG_ATTR me_module;
@@ -2384,10 +2389,15 @@ mep_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   for (arches = gdbarch_list_lookup_by_info (arches, &info); 
        arches != NULL;
        arches = gdbarch_list_lookup_by_info (arches->next, &info))
-    if (gdbarch_tdep (arches->gdbarch)->me_module == me_module)
-      return arches->gdbarch;
+    {
+      mep_gdbarch_tdep *tdep
+	= (mep_gdbarch_tdep *) gdbarch_tdep (arches->gdbarch);
+
+      if (tdep->me_module == me_module)
+	return arches->gdbarch;
+    }
 
-  tdep = XCNEW (struct gdbarch_tdep);
+  mep_gdbarch_tdep *tdep = new mep_gdbarch_tdep;
   gdbarch = gdbarch_alloc (&info, tdep);
 
   /* Get a CGEN CPU descriptor for this architecture.  */
diff --git a/gdb/microblaze-tdep.c b/gdb/microblaze-tdep.c
index 0c3316dece1..5309da58cc2 100644
--- a/gdb/microblaze-tdep.c
+++ b/gdb/microblaze-tdep.c
@@ -650,7 +650,6 @@ microblaze_register_g_packet_guesses (struct gdbarch *gdbarch)
 static struct gdbarch *
 microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 {
-  struct gdbarch_tdep *tdep;
   struct gdbarch *gdbarch;
   tdesc_arch_data_up tdesc_data;
   const struct target_desc *tdesc = info.target_desc;
@@ -697,7 +696,7 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
     }
 
   /* Allocate space for the new architecture.  */
-  tdep = XCNEW (struct gdbarch_tdep);
+  microblaze_gdbarch_tdep *tdep = new microblaze_gdbarch_tdep;
   gdbarch = gdbarch_alloc (&info, tdep);
 
   set_gdbarch_long_double_bit (gdbarch, 128);
diff --git a/gdb/microblaze-tdep.h b/gdb/microblaze-tdep.h
index 08af0d191c5..3143e92ac74 100644
--- a/gdb/microblaze-tdep.h
+++ b/gdb/microblaze-tdep.h
@@ -22,7 +22,7 @@
 
 
 /* Microblaze architecture-specific information.  */
-struct gdbarch_tdep
+struct microblaze_gdbarch_tdep : gdbarch_tdep
 {
 };
 
diff --git a/gdb/mips-linux-tdep.c b/gdb/mips-linux-tdep.c
index ce287f6a354..9eac3d763ba 100644
--- a/gdb/mips-linux-tdep.c
+++ b/gdb/mips-linux-tdep.c
@@ -1317,7 +1317,7 @@ mips_linux_get_syscall_number (struct gdbarch *gdbarch,
 			       thread_info *thread)
 {
   struct regcache *regcache = get_thread_regcache (thread);
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  mips_gdbarch_tdep *tdep = (mips_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   int regsize = register_size (gdbarch, MIPS_V0_REGNUM);
   /* The content of a register */
@@ -1527,7 +1527,7 @@ static void
 mips_linux_init_abi (struct gdbarch_info info,
 		     struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  mips_gdbarch_tdep *tdep = (mips_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   enum mips_abi abi = mips_abi (gdbarch);
   struct tdesc_arch_data *tdesc_data = info.tdesc_data;
 
diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c
index 89f689e02cc..603c5d2664b 100644
--- a/gdb/mips-tdep.c
+++ b/gdb/mips-tdep.c
@@ -227,7 +227,8 @@ static const char mips_disassembler_options_n64[] = "gpr-names=64";
 const struct mips_regnum *
 mips_regnum (struct gdbarch *gdbarch)
 {
-  return gdbarch_tdep (gdbarch)->regnum;
+  mips_gdbarch_tdep *tdep = (mips_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+  return tdep->regnum;
 }
 
 static int
@@ -248,29 +249,47 @@ mips_float_register_p (struct gdbarch *gdbarch, int regnum)
 	  && rawnum < mips_regnum (gdbarch)->fp0 + 32);
 }
 
-#define MIPS_EABI(gdbarch) (gdbarch_tdep (gdbarch)->mips_abi \
-		     == MIPS_ABI_EABI32 \
-		   || gdbarch_tdep (gdbarch)->mips_abi == MIPS_ABI_EABI64)
+static bool
+mips_eabi (gdbarch *arch)
+{
+  mips_gdbarch_tdep *tdep = (mips_gdbarch_tdep *) gdbarch_tdep (arch);
+  return (tdep->mips_abi == MIPS_ABI_EABI32 \
+	  || tdep->mips_abi == MIPS_ABI_EABI64);
+}
 
-#define MIPS_LAST_FP_ARG_REGNUM(gdbarch) \
-  (gdbarch_tdep (gdbarch)->mips_last_fp_arg_regnum)
+static int
+mips_last_fp_arg_regnum (gdbarch *arch)
+{
+  mips_gdbarch_tdep *tdep = (mips_gdbarch_tdep *) gdbarch_tdep (arch);
+  return tdep->mips_last_fp_arg_regnum;
+}
 
-#define MIPS_LAST_ARG_REGNUM(gdbarch) \
-  (gdbarch_tdep (gdbarch)->mips_last_arg_regnum)
+static int
+mips_last_arg_regnum (gdbarch *arch)
+{
+  mips_gdbarch_tdep *tdep = (mips_gdbarch_tdep *) gdbarch_tdep (arch);
+  return tdep->mips_last_arg_regnum;
+}
 
-#define MIPS_FPU_TYPE(gdbarch) (gdbarch_tdep (gdbarch)->mips_fpu_type)
+static enum mips_fpu_type
+mips_get_fpu_type (gdbarch *arch)
+{
+  mips_gdbarch_tdep *tdep = (mips_gdbarch_tdep *) gdbarch_tdep (arch);
+  return tdep->mips_fpu_type;
+}
 
 /* Return the MIPS ABI associated with GDBARCH.  */
 enum mips_abi
 mips_abi (struct gdbarch *gdbarch)
 {
-  return gdbarch_tdep (gdbarch)->mips_abi;
+  mips_gdbarch_tdep *tdep = (mips_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+  return tdep->mips_abi;
 }
 
 int
 mips_isa_regsize (struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  mips_gdbarch_tdep *tdep = (mips_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* If we know how big the registers are, use that size.  */
   if (tdep->register_size_valid_p)
@@ -316,7 +335,8 @@ mips_abi_regsize (struct gdbarch *gdbarch)
 static int
 is_mips16_isa (struct gdbarch *gdbarch)
 {
-  return gdbarch_tdep (gdbarch)->mips_isa == ISA_MIPS16;
+  mips_gdbarch_tdep *tdep = (mips_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+  return tdep->mips_isa == ISA_MIPS16;
 }
 
 /* Return one iff compressed code is the microMIPS instruction set.  */
@@ -324,7 +344,8 @@ is_mips16_isa (struct gdbarch *gdbarch)
 static int
 is_micromips_isa (struct gdbarch *gdbarch)
 {
-  return gdbarch_tdep (gdbarch)->mips_isa == ISA_MICROMIPS;
+  mips_gdbarch_tdep *tdep = (mips_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+  return tdep->mips_isa == ISA_MICROMIPS;
 }
 
 /* Return one iff ADDR denotes compressed code.  */
@@ -615,7 +636,7 @@ static const char * const mips_linux_reg_names[NUM_MIPS_PROCESSOR_REGS] = {
 static const char *
 mips_register_name (struct gdbarch *gdbarch, int regno)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  mips_gdbarch_tdep *tdep = (mips_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   /* GPR names for all ABIs other than n32/n64.  */
   static const char *mips_gpr_names[] = {
     "zero", "at", "v0", "v1", "a0", "a1", "a2", "a3",
@@ -756,7 +777,9 @@ mips_pseudo_register_read (struct gdbarch *gdbarch, readable_regcache *regcache,
   else if (register_size (gdbarch, rawnum) >
 	   register_size (gdbarch, cookednum))
     {
-      if (gdbarch_tdep (gdbarch)->mips64_transfers_32bit_regs_p)
+      mips_gdbarch_tdep *tdep = (mips_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+
+      if (tdep->mips64_transfers_32bit_regs_p)
 	return regcache->raw_read_part (rawnum, 0, 4, buf);
       else
 	{
@@ -787,7 +810,9 @@ mips_pseudo_register_write (struct gdbarch *gdbarch,
   else if (register_size (gdbarch, rawnum) >
 	   register_size (gdbarch, cookednum))
     {
-      if (gdbarch_tdep (gdbarch)->mips64_transfers_32bit_regs_p)
+      mips_gdbarch_tdep *tdep = (mips_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+
+      if (tdep->mips64_transfers_32bit_regs_p)
 	regcache->raw_write_part (rawnum, 0, 4, buf);
       else
 	{
@@ -829,7 +854,10 @@ mips_ax_pseudo_register_push_stack (struct gdbarch *gdbarch,
 
       if (register_size (gdbarch, rawnum) > register_size (gdbarch, reg))
 	{
-	  if (!gdbarch_tdep (gdbarch)->mips64_transfers_32bit_regs_p
+	  mips_gdbarch_tdep *tdep
+	    = (mips_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+
+	  if (!tdep->mips64_transfers_32bit_regs_p
 	      || gdbarch_byte_order (gdbarch) != BFD_ENDIAN_BIG)
 	    {
 	      ax_const_l (ax, 32);
@@ -1031,6 +1059,7 @@ mips_register_type (struct gdbarch *gdbarch, int regnum)
   else
     {
       int rawnum = regnum - gdbarch_num_regs (gdbarch);
+      mips_gdbarch_tdep *tdep = (mips_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
       /* The cooked or ABI registers.  These are sized according to
 	 the ABI (with a few complications).  */
@@ -1043,7 +1072,7 @@ mips_register_type (struct gdbarch *gdbarch, int regnum)
 	/* The pseudo/cooked view of the embedded registers is always
 	   32-bit.  The raw view is handled below.  */
 	return builtin_type (gdbarch)->builtin_int32;
-      else if (gdbarch_tdep (gdbarch)->mips64_transfers_32bit_regs_p)
+      else if (tdep->mips64_transfers_32bit_regs_p)
 	/* The target, while possibly using a 64-bit register buffer,
 	   is only transfering 32-bits of each integer register.
 	   Reflect this in the cooked/pseudo (ABI) register value.  */
@@ -1132,7 +1161,7 @@ mips_pseudo_register_type (struct gdbarch *gdbarch, int regnum)
 static enum auto_boolean mask_address_var = AUTO_BOOLEAN_AUTO;
 
 static int
-mips_mask_address_p (struct gdbarch_tdep *tdep)
+mips_mask_address_p (mips_gdbarch_tdep *tdep)
 {
   switch (mask_address_var)
     {
@@ -1154,7 +1183,8 @@ static void
 show_mask_address (struct ui_file *file, int from_tty,
 		   struct cmd_list_element *c, const char *value)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (target_gdbarch ());
+  mips_gdbarch_tdep *tdep
+    = (mips_gdbarch_tdep *) gdbarch_tdep (target_gdbarch ());
 
   deprecated_show_value_hack (file, from_tty, c, value);
   switch (mask_address_var)
@@ -1698,9 +1728,9 @@ mips32_next_pc (struct regcache *regcache, CORE_ADDR pc)
 	      break;
 	    case 12:            /* SYSCALL */
 	      {
-		struct gdbarch_tdep *tdep;
+		mips_gdbarch_tdep *tdep
+		  = (mips_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
-		tdep = gdbarch_tdep (gdbarch);
 		if (tdep->syscall_next_pc != NULL)
 		  pc = tdep->syscall_next_pc (get_current_frame ());
 		else
@@ -1909,9 +1939,9 @@ micromips_next_pc (struct regcache *regcache, CORE_ADDR pc)
 		  break;
 		case 0x22d: /* SYSCALL:  000000 1000101101 111100 */
 		  {
-		    struct gdbarch_tdep *tdep;
+		    mips_gdbarch_tdep *tdep
+		      = (mips_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
-		    tdep = gdbarch_tdep (gdbarch);
 		    if (tdep->syscall_next_pc != NULL)
 		      pc = tdep->syscall_next_pc (get_current_frame ());
 		  }
@@ -3870,7 +3900,7 @@ mips_stub_frame_base_sniffer (struct frame_info *this_frame)
 static CORE_ADDR
 mips_addr_bits_remove (struct gdbarch *gdbarch, CORE_ADDR addr)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  mips_gdbarch_tdep *tdep = (mips_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (mips_mask_address_p (tdep) && (((ULONGEST) addr) >> 32 == 0xffffffffUL))
     /* This hack is a work-around for existing boards using PMON, the
@@ -4405,13 +4435,13 @@ fp_register_arg_p (struct gdbarch *gdbarch, enum type_code typecode,
 		   struct type *arg_type)
 {
   return ((typecode == TYPE_CODE_FLT
-	   || (MIPS_EABI (gdbarch)
+	   || (mips_eabi (gdbarch)
 	       && (typecode == TYPE_CODE_STRUCT
 		   || typecode == TYPE_CODE_UNION)
 	       && arg_type->num_fields () == 1
 	       && check_typedef (arg_type->field (0).type ())->code ()
 	       == TYPE_CODE_FLT))
-	  && MIPS_FPU_TYPE(gdbarch) != MIPS_FPU_NONE);
+	  && mips_get_fpu_type (gdbarch) != MIPS_FPU_NONE);
 }
 
 /* On o32, argument passing in GPRs depends on the alignment of the type being
@@ -4611,7 +4641,7 @@ mips_eabi_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 	 point value into an FP register instead of pushing it onto the
 	 stack.  */
       if (fp_register_arg_p (gdbarch, typecode, arg_type)
-	  && float_argreg <= MIPS_LAST_FP_ARG_REGNUM (gdbarch))
+	  && float_argreg <= mips_last_fp_arg_regnum (gdbarch))
 	{
 	  /* EABI32 will pass doubles in consecutive registers, even on
 	     64-bit cores.  At one time, we used to check the size of
@@ -4678,7 +4708,7 @@ mips_eabi_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 				    partial_len);
 
 	      /* Write this portion of the argument to the stack.  */
-	      if (argreg > MIPS_LAST_ARG_REGNUM (gdbarch)
+	      if (argreg > mips_last_arg_regnum (gdbarch)
 		  || odd_sized_struct
 		  || fp_register_arg_p (gdbarch, typecode, arg_type))
 		{
@@ -4729,7 +4759,7 @@ mips_eabi_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 		 arguments will not.  */
 	      /* Write this portion of the argument to a general
 		 purpose register.  */
-	      if (argreg <= MIPS_LAST_ARG_REGNUM (gdbarch)
+	      if (argreg <= mips_last_arg_regnum (gdbarch)
 		  && !fp_register_arg_p (gdbarch, typecode, arg_type))
 		{
 		  LONGEST regval =
@@ -4773,7 +4803,7 @@ mips_eabi_return_value (struct gdbarch *gdbarch, struct value *function,
 			struct type *type, struct regcache *regcache,
 			gdb_byte *readbuf, const gdb_byte *writebuf)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  mips_gdbarch_tdep *tdep = (mips_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int fp_return_type = 0;
   int offset, regnum, xfer;
 
@@ -4845,7 +4875,7 @@ mips_n32n64_fp_arg_chunk_p (struct gdbarch *gdbarch, struct type *arg_type,
   if (arg_type->code () != TYPE_CODE_STRUCT)
     return 0;
 
-  if (MIPS_FPU_TYPE (gdbarch) != MIPS_FPU_DOUBLE)
+  if (mips_get_fpu_type (gdbarch) != MIPS_FPU_DOUBLE)
     return 0;
 
   if (TYPE_LENGTH (arg_type) < offset + MIPS64_REGSIZE)
@@ -4973,7 +5003,7 @@ mips_n32n64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 	}
 
       if (fp_register_arg_p (gdbarch, typecode, arg_type)
-	  && argreg <= MIPS_LAST_ARG_REGNUM (gdbarch))
+	  && argreg <= mips_last_arg_regnum (gdbarch))
 	{
 	  /* This is a floating point value that fits entirely
 	     in a single register or a pair of registers.  */
@@ -5033,10 +5063,10 @@ mips_n32n64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 				    partial_len);
 
 	      if (fp_register_arg_p (gdbarch, typecode, arg_type))
-		gdb_assert (argreg > MIPS_LAST_ARG_REGNUM (gdbarch));
+		gdb_assert (argreg > mips_last_arg_regnum (gdbarch));
 
 	      /* Write this portion of the argument to the stack.  */
-	      if (argreg > MIPS_LAST_ARG_REGNUM (gdbarch))
+	      if (argreg > mips_last_arg_regnum (gdbarch))
 		{
 		  /* Should shorter than int integer values be
 		     promoted to int before being stored?  */
@@ -5079,7 +5109,7 @@ mips_n32n64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 		 structs may go thru BOTH paths.  */
 	      /* Write this portion of the argument to a general
 		 purpose register.  */
-	      if (argreg <= MIPS_LAST_ARG_REGNUM (gdbarch))
+	      if (argreg <= mips_last_arg_regnum (gdbarch))
 		{
 		  LONGEST regval;
 
@@ -5164,7 +5194,7 @@ mips_n32n64_return_value (struct gdbarch *gdbarch, struct value *function,
 			  struct type *type, struct regcache *regcache,
 			  gdb_byte *readbuf, const gdb_byte *writebuf)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  mips_gdbarch_tdep *tdep = (mips_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* From MIPSpro N32 ABI Handbook, Document Number: 007-2816-004
 
@@ -5451,7 +5481,7 @@ mips_o32_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 	 registers are normally skipped.  */
 
       if (fp_register_arg_p (gdbarch, typecode, arg_type)
-	  && float_argreg <= MIPS_LAST_FP_ARG_REGNUM (gdbarch))
+	  && float_argreg <= mips_last_fp_arg_regnum (gdbarch))
 	{
 	  if (register_size (gdbarch, float_argreg) < 8 && len == 8)
 	    {
@@ -5541,7 +5571,7 @@ mips_o32_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 				    partial_len);
 
 	      /* Write this portion of the argument to the stack.  */
-	      if (argreg > MIPS_LAST_ARG_REGNUM (gdbarch)
+	      if (argreg > mips_last_arg_regnum (gdbarch)
 		  || odd_sized_struct)
 		{
 		  /* Should shorter than int integer values be
@@ -5577,7 +5607,7 @@ mips_o32_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 		 structs may go thru BOTH paths.  */
 	      /* Write this portion of the argument to a general
 		 purpose register.  */
-	      if (argreg <= MIPS_LAST_ARG_REGNUM (gdbarch))
+	      if (argreg <= mips_last_arg_regnum (gdbarch))
 		{
 		  LONGEST regval = extract_signed_integer (val, partial_len,
 							   byte_order);
@@ -5625,7 +5655,7 @@ mips_o32_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 
 		  /* Prevent subsequent floating point arguments from
 		     being passed in floating point registers.  */
-		  float_argreg = MIPS_LAST_FP_ARG_REGNUM (gdbarch) + 1;
+		  float_argreg = mips_last_fp_arg_regnum (gdbarch) + 1;
 		}
 
 	      len -= partial_len;
@@ -5659,7 +5689,7 @@ mips_o32_return_value (struct gdbarch *gdbarch, struct value *function,
 {
   CORE_ADDR func_addr = function ? find_function_addr (function, NULL) : 0;
   int mips16 = mips_pc_is_mips16 (gdbarch, func_addr);
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  mips_gdbarch_tdep *tdep = (mips_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   enum mips_fval_reg fval_reg;
 
   fval_reg = readbuf ? mips16 ? mips_fval_gpr : mips_fval_fpr : mips_fval_both;
@@ -5960,7 +5990,7 @@ mips_o64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 	 functions because those registers are normally skipped.  */
 
       if (fp_register_arg_p (gdbarch, typecode, arg_type)
-	  && float_argreg <= MIPS_LAST_FP_ARG_REGNUM (gdbarch))
+	  && float_argreg <= mips_last_fp_arg_regnum (gdbarch))
 	{
 	  LONGEST regval = extract_unsigned_integer (val, len, byte_order);
 	  if (mips_debug)
@@ -5995,7 +6025,7 @@ mips_o64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 				    partial_len);
 
 	      /* Write this portion of the argument to the stack.  */
-	      if (argreg > MIPS_LAST_ARG_REGNUM (gdbarch)
+	      if (argreg > mips_last_arg_regnum (gdbarch)
 		  || odd_sized_struct)
 		{
 		  /* Should shorter than int integer values be
@@ -6039,7 +6069,7 @@ mips_o64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 		 structs may go thru BOTH paths.  */
 	      /* Write this portion of the argument to a general
 		 purpose register.  */
-	      if (argreg <= MIPS_LAST_ARG_REGNUM (gdbarch))
+	      if (argreg <= mips_last_arg_regnum (gdbarch))
 		{
 		  LONGEST regval = extract_signed_integer (val, partial_len,
 							   byte_order);
@@ -6071,7 +6101,7 @@ mips_o64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 
 		  /* Prevent subsequent floating point arguments from
 		     being passed in floating point registers.  */
-		  float_argreg = MIPS_LAST_FP_ARG_REGNUM (gdbarch) + 1;
+		  float_argreg = mips_last_fp_arg_regnum (gdbarch) + 1;
 		}
 
 	      len -= partial_len;
@@ -6403,7 +6433,7 @@ mips_print_float_info (struct gdbarch *gdbarch, struct ui_file *file,
 		      struct frame_info *frame, const char *args)
 {
   int fcsr = mips_regnum (gdbarch)->fp_control_status;
-  enum mips_fpu_type type = MIPS_FPU_TYPE (gdbarch);
+  enum mips_fpu_type type = mips_get_fpu_type (gdbarch);
   ULONGEST fcs = 0;
   int i;
 
@@ -6891,7 +6921,7 @@ show_mipsfpu_command (const char *args, int from_tty)
       return;
     }
 
-  switch (MIPS_FPU_TYPE (target_gdbarch ()))
+  switch (mips_get_fpu_type (target_gdbarch ()))
     {
     case MIPS_FPU_SINGLE:
       fpu = "single-precision";
@@ -8038,7 +8068,6 @@ static struct gdbarch *
 mips_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 {
   struct gdbarch *gdbarch;
-  struct gdbarch_tdep *tdep;
   int elf_flags;
   enum mips_abi mips_abi, found_abi, wanted_abi;
   int i, num_regs;
@@ -8055,7 +8084,11 @@ mips_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   if (info.abfd && bfd_get_flavour (info.abfd) == bfd_target_elf_flavour)
     elf_flags = elf_elfheader (info.abfd)->e_flags;
   else if (arches != NULL)
-    elf_flags = gdbarch_tdep (arches->gdbarch)->elf_flags;
+    {
+      mips_gdbarch_tdep *tdep
+	= (mips_gdbarch_tdep *) gdbarch_tdep (arches->gdbarch);
+      elf_flags = tdep->elf_flags;
+    }
   else
     elf_flags = 0;
   if (gdbarch_debug)
@@ -8092,7 +8125,11 @@ mips_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   /* If we have no useful BFD information, use the ABI from the last
      MIPS architecture (if there is one).  */
   if (found_abi == MIPS_ABI_UNKNOWN && info.abfd == NULL && arches != NULL)
-    found_abi = gdbarch_tdep (arches->gdbarch)->found_abi;
+    {
+      mips_gdbarch_tdep *tdep
+	= (mips_gdbarch_tdep *) gdbarch_tdep (arches->gdbarch);
+      found_abi = tdep->found_abi;
+    }
 
   /* Try the architecture for any hint of the correct ABI.  */
   if (found_abi == MIPS_ABI_UNKNOWN
@@ -8223,7 +8260,7 @@ mips_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 	break;
       }
   else if (arches != NULL)
-    fpu_type = MIPS_FPU_TYPE (arches->gdbarch);
+    fpu_type = mips_get_fpu_type (arches->gdbarch);
   else
     fpu_type = MIPS_FPU_DOUBLE;
   if (gdbarch_debug)
@@ -8406,28 +8443,31 @@ mips_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
        arches != NULL;
        arches = gdbarch_list_lookup_by_info (arches->next, &info))
     {
+      mips_gdbarch_tdep *tdep
+        = (mips_gdbarch_tdep *) gdbarch_tdep (arches->gdbarch);
+
       /* MIPS needs to be pedantic about which ABI and the compressed
 	 ISA variation the object is using.  */
-      if (gdbarch_tdep (arches->gdbarch)->elf_flags != elf_flags)
+      if (tdep->elf_flags != elf_flags)
 	continue;
-      if (gdbarch_tdep (arches->gdbarch)->mips_abi != mips_abi)
+      if (tdep->mips_abi != mips_abi)
 	continue;
-      if (gdbarch_tdep (arches->gdbarch)->mips_isa != mips_isa)
+      if (tdep->mips_isa != mips_isa)
 	continue;
       /* Need to be pedantic about which register virtual size is
 	 used.  */
-      if (gdbarch_tdep (arches->gdbarch)->mips64_transfers_32bit_regs_p
+      if (tdep->mips64_transfers_32bit_regs_p
 	  != mips64_transfers_32bit_regs_p)
 	continue;
       /* Be pedantic about which FPU is selected.  */
-      if (MIPS_FPU_TYPE (arches->gdbarch) != fpu_type)
+      if (mips_get_fpu_type (arches->gdbarch) != fpu_type)
 	continue;
 
       return arches->gdbarch;
     }
 
   /* Need a new architecture.  Fill in a target specific vector.  */
-  tdep = XCNEW (struct gdbarch_tdep);
+  mips_gdbarch_tdep *tdep = new mips_gdbarch_tdep;
   gdbarch = gdbarch_alloc (&info, tdep);
   tdep->elf_flags = elf_flags;
   tdep->mips64_transfers_32bit_regs_p = mips64_transfers_32bit_regs_p;
@@ -8862,7 +8902,7 @@ mips_fpu_type_str (enum mips_fpu_type fpu_type)
 static void
 mips_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  mips_gdbarch_tdep *tdep = (mips_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   if (tdep != NULL)
     {
       int ef_mips_arch;
@@ -8911,11 +8951,11 @@ mips_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file)
 		      MIPS_DEFAULT_FPU_TYPE,
 		      mips_fpu_type_str (MIPS_DEFAULT_FPU_TYPE));
   fprintf_unfiltered (file, "mips_dump_tdep: MIPS_EABI = %d\n",
-		      MIPS_EABI (gdbarch));
+		      mips_eabi (gdbarch));
   fprintf_unfiltered (file,
 		      "mips_dump_tdep: MIPS_FPU_TYPE = %d (%s)\n",
-		      MIPS_FPU_TYPE (gdbarch),
-		      mips_fpu_type_str (MIPS_FPU_TYPE (gdbarch)));
+		      mips_get_fpu_type (gdbarch),
+		      mips_fpu_type_str (mips_get_fpu_type (gdbarch)));
 }
 
 void _initialize_mips_tdep ();
diff --git a/gdb/mips-tdep.h b/gdb/mips-tdep.h
index e7f683718df..b899cfd9bdb 100644
--- a/gdb/mips-tdep.h
+++ b/gdb/mips-tdep.h
@@ -83,39 +83,39 @@ enum mips_fpu_type
 };
 
 /* MIPS specific per-architecture information.  */
-struct gdbarch_tdep
+struct mips_gdbarch_tdep : gdbarch_tdep
 {
   /* from the elf header */
-  int elf_flags;
+  int elf_flags = 0;
 
   /* mips options */
-  enum mips_abi mips_abi;
-  enum mips_abi found_abi;
-  enum mips_isa mips_isa;
-  enum mips_fpu_type mips_fpu_type;
-  int mips_last_arg_regnum;
-  int mips_last_fp_arg_regnum;
-  int default_mask_address_p;
+  enum mips_abi mips_abi {};
+  enum mips_abi found_abi {};
+  enum mips_isa mips_isa {};
+  enum mips_fpu_type mips_fpu_type {};
+  int mips_last_arg_regnum = 0;
+  int mips_last_fp_arg_regnum = 0;
+  int default_mask_address_p = 0;
   /* Is the target using 64-bit raw integer registers but only
      storing a left-aligned 32-bit value in each?  */
-  int mips64_transfers_32bit_regs_p;
+  int mips64_transfers_32bit_regs_p = 0;
   /* Indexes for various registers.  IRIX and embedded have
      different values.  This contains the "public" fields.  Don't
      add any that do not need to be public.  */
-  const struct mips_regnum *regnum;
+  const struct mips_regnum *regnum = nullptr;
   /* Register names table for the current register set.  */
-  const char * const *mips_processor_reg_names;
+  const char * const *mips_processor_reg_names = nullptr;
 
   /* The size of register data available from the target, if known.
      This doesn't quite obsolete the manual
      mips64_transfers_32bit_regs_p, since that is documented to force
      left alignment even for big endian (very strange).  */
-  int register_size_valid_p;
-  int register_size;
+  int register_size_valid_p = 0;
+  int register_size = 0;
 
   /* Return the expected next PC if FRAME is stopped at a syscall
      instruction.  */
-  CORE_ADDR (*syscall_next_pc) (struct frame_info *frame);
+  CORE_ADDR (*syscall_next_pc) (struct frame_info *frame) = nullptr;
 };
 
 /* Register numbers of various important registers.  */
diff --git a/gdb/mn10300-tdep.c b/gdb/mn10300-tdep.c
index 7feab0b3fec..5804efeb627 100644
--- a/gdb/mn10300-tdep.c
+++ b/gdb/mn10300-tdep.c
@@ -372,7 +372,7 @@ mn10300_analyze_prologue (struct gdbarch *gdbarch,
   int rn;
   pv_t regs[MN10300_MAX_NUM_REGS];
   CORE_ADDR after_last_frame_setup_insn = start_pc;
-  int am33_mode = AM33_MODE (gdbarch);
+  int am33_mode = get_am33_mode (gdbarch);
 
   memset (result, 0, sizeof (*result));
   result->gdbarch = gdbarch;
@@ -1337,14 +1337,13 @@ mn10300_gdbarch_init (struct gdbarch_info info,
 		      struct gdbarch_list *arches)
 {
   struct gdbarch *gdbarch;
-  struct gdbarch_tdep *tdep;
   int num_regs;
 
   arches = gdbarch_list_lookup_by_info (arches, &info);
   if (arches != NULL)
     return arches->gdbarch;
 
-  tdep = XCNEW (struct gdbarch_tdep);
+  mn10300_gdbarch_tdep *tdep = new mn10300_gdbarch_tdep;
   gdbarch = gdbarch_alloc (&info, tdep);
 
   switch (info.bfd_arch_info->mach)
@@ -1413,7 +1412,7 @@ mn10300_gdbarch_init (struct gdbarch_info info,
 static void
 mn10300_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  mn10300_gdbarch_tdep *tdep = (mn10300_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   fprintf_unfiltered (file, "mn10300_dump_tdep: am33_mode = %d\n",
 		      tdep->am33_mode);
 }
diff --git a/gdb/mn10300-tdep.h b/gdb/mn10300-tdep.h
index a3518499cb4..220e4d6739b 100644
--- a/gdb/mn10300-tdep.h
+++ b/gdb/mn10300-tdep.h
@@ -20,6 +20,8 @@
 #ifndef MN10300_TDEP_H
 #define MN10300_TDEP_H
 
+#include "gdbarch.h"
+
 enum {
   E_D0_REGNUM = 0,
   E_D1_REGNUM = 1,
@@ -74,11 +76,16 @@ enum frame_kind {
 };
 
 /* mn10300 private data.  */
-struct gdbarch_tdep
+struct mn10300_gdbarch_tdep : gdbarch_tdep
 {
   int am33_mode;
 };
 
-#define AM33_MODE(gdbarch) (gdbarch_tdep (gdbarch)->am33_mode)
+static inline int
+get_am33_mode (gdbarch *arch)
+{
+  mn10300_gdbarch_tdep *tdep = (mn10300_gdbarch_tdep *) gdbarch_tdep (arch);
+  return tdep->am33_mode;
+}
 
 #endif /* MN10300_TDEP_H */
diff --git a/gdb/moxie-tdep.c b/gdb/moxie-tdep.c
index c48f9f75eb4..459bfb8ee5a 100644
--- a/gdb/moxie-tdep.c
+++ b/gdb/moxie-tdep.c
@@ -1052,7 +1052,6 @@ static struct gdbarch *
 moxie_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 {
   struct gdbarch *gdbarch;
-  struct gdbarch_tdep *tdep;
 
   /* If there is already a candidate, use it.  */
   arches = gdbarch_list_lookup_by_info (arches, &info);
@@ -1060,7 +1059,7 @@ moxie_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
     return arches->gdbarch;
 
   /* Allocate space for the new architecture.  */
-  tdep = XCNEW (struct gdbarch_tdep);
+  moxie_gdbarch_tdep *tdep = new moxie_gdbarch_tdep;
   gdbarch = gdbarch_alloc (&info, tdep);
 
   set_gdbarch_wchar_bit (gdbarch, 32);
diff --git a/gdb/moxie-tdep.h b/gdb/moxie-tdep.h
index b3687ef4d32..4e6bcd1c1c9 100644
--- a/gdb/moxie-tdep.h
+++ b/gdb/moxie-tdep.h
@@ -20,7 +20,7 @@
 #ifndef MOXIE_TDEP_H
 #define MOXIE_TDEP_H
 
-struct gdbarch_tdep
+struct moxie_gdbarch_tdep : gdbarch_tdep
 {
   /* gdbarch target dependent data here.  Currently unused for MOXIE.  */
 };
diff --git a/gdb/msp430-tdep.c b/gdb/msp430-tdep.c
index c1b0c4c2e91..f3c44b71ba5 100644
--- a/gdb/msp430-tdep.c
+++ b/gdb/msp430-tdep.c
@@ -104,19 +104,19 @@ enum
 
 /* 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.  */
@@ -340,7 +340,8 @@ msp430_analyze_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc,
   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));
@@ -568,7 +569,8 @@ msp430_return_value (struct gdbarch *gdbarch,
 {
   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
@@ -648,7 +650,8 @@ msp430_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
   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);
 
@@ -766,8 +769,7 @@ msp430_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 
   /* 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);
   }
@@ -811,7 +813,8 @@ msp430_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
 
   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);
@@ -830,7 +833,6 @@ static struct gdbarch *
 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.  */
@@ -873,7 +875,8 @@ msp430_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 	  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;
@@ -899,7 +902,8 @@ msp430_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
        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
@@ -911,7 +915,7 @@ msp430_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 
   /* 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;
diff --git a/gdb/nds32-tdep.c b/gdb/nds32-tdep.c
index 828853ed8e1..0360323d28c 100644
--- a/gdb/nds32-tdep.c
+++ b/gdb/nds32-tdep.c
@@ -289,7 +289,7 @@ typedef BP_MANIPULATION (nds32_break_insn) nds32_breakpoint;
 static int
 nds32_dwarf2_reg_to_regnum (struct gdbarch *gdbarch, int num)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  nds32_gdbarch_tdep *tdep = (nds32_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   const int FSR = 38;
   const int FDR = FSR + 32;
 
@@ -440,7 +440,7 @@ nds32_pseudo_register_read (struct gdbarch *gdbarch,
 			    readable_regcache *regcache, int regnum,
 			    gdb_byte *buf)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  nds32_gdbarch_tdep *tdep = (nds32_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   gdb_byte reg_buf[8];
   int offset, fdr_regnum;
   enum register_status status;
@@ -479,7 +479,7 @@ nds32_pseudo_register_write (struct gdbarch *gdbarch,
 			     struct regcache *regcache, int regnum,
 			     const gdb_byte *buf)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  nds32_gdbarch_tdep *tdep = (nds32_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   gdb_byte reg_buf[8];
   int offset, fdr_regnum;
 
@@ -616,7 +616,7 @@ static CORE_ADDR
 nds32_analyze_prologue (struct gdbarch *gdbarch, CORE_ADDR pc,
 			CORE_ADDR limit_pc, struct nds32_frame_cache *cache)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  nds32_gdbarch_tdep *tdep = (nds32_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int abi_use_fpr = nds32_abi_use_fpr (tdep->elf_abi);
   /* Current scanning status.  */
   int in_prologue_bb = 0;
@@ -1177,7 +1177,7 @@ static int
 nds32_analyze_epilogue (struct gdbarch *gdbarch, CORE_ADDR pc,
 			struct nds32_frame_cache *cache)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  nds32_gdbarch_tdep *tdep = (nds32_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int abi_use_fpr = nds32_abi_use_fpr (tdep->elf_abi);
   CORE_ADDR limit_pc;
   uint32_t insn, insn_len;
@@ -1228,7 +1228,7 @@ nds32_analyze_epilogue (struct gdbarch *gdbarch, CORE_ADDR pc,
 static int
 nds32_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR addr)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  nds32_gdbarch_tdep *tdep = (nds32_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int abi_use_fpr = nds32_abi_use_fpr (tdep->elf_abi);
   int insn_type = INSN_NORMAL;
   int ret_found = 0;
@@ -1432,7 +1432,7 @@ nds32_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
   int i;
   ULONGEST regval;
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  nds32_gdbarch_tdep *tdep = (nds32_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   struct type *func_type = value_type (function);
   int abi_use_fpr = nds32_abi_use_fpr (tdep->elf_abi);
   int abi_split = nds32_abi_split (tdep->elf_abi);
@@ -1660,7 +1660,7 @@ nds32_extract_return_value (struct gdbarch *gdbarch, struct type *type,
 			    struct regcache *regcache, gdb_byte *valbuf)
 {
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  nds32_gdbarch_tdep *tdep = (nds32_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int abi_use_fpr = nds32_abi_use_fpr (tdep->elf_abi);
   int calling_use_fpr;
   int len;
@@ -1750,7 +1750,7 @@ nds32_store_return_value (struct gdbarch *gdbarch, struct type *type,
 			  struct regcache *regcache, const gdb_byte *valbuf)
 {
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  nds32_gdbarch_tdep *tdep = (nds32_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int abi_use_fpr = nds32_abi_use_fpr (tdep->elf_abi);
   int calling_use_fpr;
   int len;
@@ -1955,7 +1955,6 @@ static struct gdbarch *
 nds32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 {
   struct gdbarch *gdbarch;
-  struct gdbarch_tdep *tdep;
   struct gdbarch_list *best_arch;
   tdesc_arch_data_up tdesc_data;
   const struct target_desc *tdesc = info.target_desc;
@@ -1973,7 +1972,8 @@ nds32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
        best_arch != NULL;
        best_arch = gdbarch_list_lookup_by_info (best_arch->next, &info))
     {
-      struct gdbarch_tdep *idep = gdbarch_tdep (best_arch->gdbarch);
+      nds32_gdbarch_tdep *idep
+	= (nds32_gdbarch_tdep *) gdbarch_tdep (best_arch->gdbarch);
 
       if (idep->elf_abi != elf_abi)
 	continue;
@@ -1995,7 +1995,7 @@ nds32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
     return NULL;
 
   /* Allocate space for the new architecture.  */
-  tdep = XCNEW (struct gdbarch_tdep);
+  nds32_gdbarch_tdep *tdep = new nds32_gdbarch_tdep;
   tdep->fpu_freg = fpu_freg;
   tdep->use_pseudo_fsrs = use_pseudo_fsrs;
   tdep->fs0_regnum = -1;
diff --git a/gdb/nds32-tdep.h b/gdb/nds32-tdep.h
index 24229306328..e06512323f9 100644
--- a/gdb/nds32-tdep.h
+++ b/gdb/nds32-tdep.h
@@ -40,15 +40,15 @@ enum nds32_regnum
   NDS32_FD0_REGNUM = NDS32_NUM_REGS,
 };
 
-struct gdbarch_tdep
+struct nds32_gdbarch_tdep : gdbarch_tdep
 {
   /* The guessed FPU configuration.  */
-  int fpu_freg;
+  int fpu_freg = 0;
   /* FSRs are defined as pseudo registers.  */
-  int use_pseudo_fsrs;
+  int use_pseudo_fsrs = 0;
   /* Cached regnum of the first FSR (FS0).  */
-  int fs0_regnum;
+  int fs0_regnum = 0;
   /* ELF ABI info.  */
-  int elf_abi;
+  int elf_abi = 0;
 };
 #endif /* NDS32_TDEP_H */
diff --git a/gdb/nios2-linux-tdep.c b/gdb/nios2-linux-tdep.c
index bd86146c878..2e360ba264e 100644
--- a/gdb/nios2-linux-tdep.c
+++ b/gdb/nios2-linux-tdep.c
@@ -217,7 +217,7 @@ nios2_linux_is_kernel_helper (CORE_ADDR pc)
 static void
 nios2_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  nios2_gdbarch_tdep *tdep = (nios2_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   linux_init_abi (info, gdbarch, 0);
 
diff --git a/gdb/nios2-tdep.c b/gdb/nios2-tdep.c
index be5544ec9fd..706b579ef17 100644
--- a/gdb/nios2-tdep.c
+++ b/gdb/nios2-tdep.c
@@ -2098,7 +2098,7 @@ static CORE_ADDR
 nios2_get_next_pc (struct regcache *regcache, CORE_ADDR pc)
 {
   struct gdbarch *gdbarch = regcache->arch ();
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  nios2_gdbarch_tdep *tdep = (nios2_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   unsigned long mach = gdbarch_bfd_arch_info (gdbarch)->mach;
   unsigned int insn;
   const struct nios2_opcode *op = nios2_fetch_insn (gdbarch, pc, &insn);
@@ -2221,7 +2221,7 @@ static int
 nios2_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  nios2_gdbarch_tdep *tdep = (nios2_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   CORE_ADDR jb_addr = get_frame_register_unsigned (frame, NIOS2_R4_REGNUM);
   gdb_byte buf[4];
@@ -2275,7 +2275,6 @@ static struct gdbarch *
 nios2_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 {
   struct gdbarch *gdbarch;
-  struct gdbarch_tdep *tdep;
   int i;
   tdesc_arch_data_up tdesc_data;
   const struct target_desc *tdesc = info.target_desc;
@@ -2313,7 +2312,7 @@ nios2_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 
   /* None found, create a new architecture from the information
      provided.  */
-  tdep = XCNEW (struct gdbarch_tdep);
+  nios2_gdbarch_tdep *tdep = new nios2_gdbarch_tdep;
   gdbarch = gdbarch_alloc (&info, tdep);
 
   /* longjmp support not enabled by default.  */
diff --git a/gdb/nios2-tdep.h b/gdb/nios2-tdep.h
index f9e7349f0f5..96f186536e6 100644
--- a/gdb/nios2-tdep.h
+++ b/gdb/nios2-tdep.h
@@ -20,6 +20,8 @@
 #ifndef NIOS2_TDEP_H
 #define NIOS2_TDEP_H
 
+#include "gdbarch.h"
+
 /* Nios II ISA specific encodings and macros.  */
 #include "opcode/nios2.h"
 
@@ -67,19 +69,19 @@
 #define NIOS2_CDX_OPCODE_SIZE 2
 
 /* Target-dependent structure in gdbarch.  */
-struct gdbarch_tdep
+struct nios2_gdbarch_tdep : gdbarch_tdep
 {
   /* Assumes FRAME is stopped at a syscall (trap) instruction; returns
      the expected next PC.  */
   CORE_ADDR (*syscall_next_pc) (struct frame_info *frame,
-				const struct nios2_opcode *op);
+				const struct nios2_opcode *op) = nullptr;
 
   /* Returns true if PC points to a kernel helper function.  */
-  bool (*is_kernel_helper) (CORE_ADDR pc);
+  bool (*is_kernel_helper) (CORE_ADDR pc) = nullptr;
 
   /* Offset to PC value in jump buffer.
      If this is negative, longjmp support will be disabled.  */
-  int jb_pc;
+  int jb_pc = 0;
 };
 
 extern struct target_desc *tdesc_nios2_linux;
diff --git a/gdb/or1k-tdep.c b/gdb/or1k-tdep.c
index 4c42e0242f3..346ee97c49b 100644
--- a/gdb/or1k-tdep.c
+++ b/gdb/or1k-tdep.c
@@ -62,11 +62,11 @@ show_or1k_debug (struct ui_file *file, int from_tty,
 
 /* The target-dependent structure for gdbarch.  */
 
-struct gdbarch_tdep
+struct or1k_gdbarch_tdep : gdbarch_tdep
 {
-  int bytes_per_word;
-  int bytes_per_address;
-  CGEN_CPU_DESC gdb_cgen_cpu_desc;
+  int bytes_per_word = 0;
+  int bytes_per_address = 0;
+  CGEN_CPU_DESC gdb_cgen_cpu_desc = nullptr;
 };
 
 /* Support functions for the architecture definition.  */
@@ -247,7 +247,8 @@ or1k_return_value (struct gdbarch *gdbarch, struct value *functype,
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   enum type_code rv_type = valtype->code ();
   unsigned int rv_size = TYPE_LENGTH (valtype);
-  int bpw = (gdbarch_tdep (gdbarch))->bytes_per_word;
+  or1k_gdbarch_tdep *tdep = (or1k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+  int bpw = tdep->bytes_per_word;
 
   /* Deal with struct/union as addresses.  If an array won't fit in a
      single register it is returned as address.  Anything larger than 2
@@ -351,7 +352,7 @@ or1k_delay_slot_p (struct gdbarch *gdbarch, CORE_ADDR pc)
 {
   const CGEN_INSN *insn;
   CGEN_FIELDS tmp_fields;
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  or1k_gdbarch_tdep *tdep = (or1k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   insn = cgen_lookup_insn (tdep->gdb_cgen_cpu_desc,
 			   NULL,
@@ -633,8 +634,9 @@ or1k_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
   int heap_offset = 0;
   CORE_ADDR heap_sp = sp - 128;
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
-  int bpa = (gdbarch_tdep (gdbarch))->bytes_per_address;
-  int bpw = (gdbarch_tdep (gdbarch))->bytes_per_word;
+  or1k_gdbarch_tdep *tdep = (or1k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+  int bpa = tdep->bytes_per_address;
+  int bpw = tdep->bytes_per_word;
   struct type *func_type = value_type (function);
 
   /* Return address */
@@ -1140,7 +1142,6 @@ static struct gdbarch *
 or1k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 {
   struct gdbarch *gdbarch;
-  struct gdbarch_tdep *tdep;
   const struct bfd_arch_info *binfo;
   tdesc_arch_data_up tdesc_data;
   const struct target_desc *tdesc = info.target_desc;
@@ -1155,7 +1156,7 @@ or1k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
      actually know which target we are talking to, but put in some defaults
      for now.  */
   binfo = info.bfd_arch_info;
-  tdep = XCNEW (struct gdbarch_tdep);
+  or1k_gdbarch_tdep *tdep = new or1k_gdbarch_tdep;
   tdep->bytes_per_word = binfo->bits_per_word / binfo->bits_per_byte;
   tdep->bytes_per_address = binfo->bits_per_address / binfo->bits_per_byte;
   gdbarch = gdbarch_alloc (&info, tdep);
@@ -1283,7 +1284,7 @@ or1k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 static void
 or1k_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  or1k_gdbarch_tdep *tdep = (or1k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (NULL == tdep)
     return; /* Nothing to report */
diff --git a/gdb/ppc-fbsd-tdep.c b/gdb/ppc-fbsd-tdep.c
index f41c8bb0be9..87d2a694e90 100644
--- a/gdb/ppc-fbsd-tdep.c
+++ b/gdb/ppc-fbsd-tdep.c
@@ -126,7 +126,7 @@ ppcfbsd_iterate_over_regset_sections (struct gdbarch *gdbarch,
 				      void *cb_data,
 				      const struct regcache *regcache)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (tdep->wordsize == 4)
     cb (".reg", 148, 148, &ppc32_fbsd_gregset, NULL, cb_data);
@@ -200,7 +200,7 @@ static struct trad_frame_cache *
 ppcfbsd_sigtramp_frame_cache (struct frame_info *this_frame, void **this_cache)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   struct trad_frame_cache *cache;
   CORE_ADDR addr, base, func;
   gdb_byte buf[PPC_INSN_SIZE];
@@ -287,7 +287,7 @@ static CORE_ADDR
 ppcfbsd_get_thread_local_address (struct gdbarch *gdbarch, ptid_t ptid,
 				  CORE_ADDR lm_addr, CORE_ADDR offset)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   struct regcache *regcache;
   int tp_offset, tp_regnum;
 
@@ -319,7 +319,7 @@ ppcfbsd_get_thread_local_address (struct gdbarch *gdbarch, ptid_t ptid,
 static void
 ppcfbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* Generic FreeBSD support. */
   fbsd_init_abi (info, gdbarch);
diff --git a/gdb/ppc-linux-tdep.c b/gdb/ppc-linux-tdep.c
index e2e1b1ec1d4..6df2411397c 100644
--- a/gdb/ppc-linux-tdep.c
+++ b/gdb/ppc-linux-tdep.c
@@ -332,7 +332,7 @@ ppc_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
 {
   unsigned int insnbuf[POWERPC32_PLT_CHECK_LEN];
   struct gdbarch *gdbarch = get_frame_arch (frame);
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   CORE_ADDR target = 0;
   int scan_limit, i;
@@ -898,7 +898,7 @@ ppc_linux_vsxregset (void)
 const struct regset *
 ppc_linux_cgprregset (struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (tdep->wordsize == 4)
     {
@@ -938,7 +938,7 @@ ppc_linux_collect_core_cpgrregset (const struct regset *regset,
 				   int regnum, void *buf, size_t len)
 {
   struct gdbarch *gdbarch = regcache->arch ();
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   const struct regset *cgprregset = ppc_linux_cgprregset (gdbarch);
 
@@ -985,7 +985,7 @@ ppc_linux_iterate_over_regset_sections (struct gdbarch *gdbarch,
 					void *cb_data,
 					const struct regcache *regcache)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int have_altivec = tdep->ppc_vr0_regnum != -1;
   int have_vsx = tdep->ppc_vsr0_upper_regnum != -1;
   int have_ppr = tdep->ppc_ppr_regnum != -1;
@@ -1170,7 +1170,7 @@ ppc_linux_sigtramp_cache (struct frame_info *this_frame,
   CORE_ADDR fpregs;
   int i;
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
 
   base = get_frame_register_unsigned (this_frame,
@@ -1341,7 +1341,7 @@ ppc_linux_get_syscall_number (struct gdbarch *gdbarch,
 			      thread_info *thread)
 {
   struct regcache *regcache = get_thread_regcache (thread);
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
 
   /* Make sure we're in a 32- or 64-bit machine */
@@ -1417,7 +1417,7 @@ static int
 ppc_linux_syscall_record (struct regcache *regcache)
 {
   struct gdbarch *gdbarch = regcache->arch ();
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   ULONGEST scnum;
   enum gdb_syscall syscall_gdb;
   int ret;
@@ -1506,7 +1506,7 @@ ppc_linux_record_signal (struct gdbarch *gdbarch, struct regcache *regcache,
   const int SIGNAL_FRAMESIZE = 128;
   const int sizeof_rt_sigframe = 1440 * 2 + 8 * 2 + 4 * 6 + 8 + 8 + 128 + 512;
   ULONGEST sp;
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int i;
 
   for (i = 3; i <= 12; i++)
@@ -2018,7 +2018,7 @@ static void
 ppc_linux_init_abi (struct gdbarch_info info,
 		    struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   struct tdesc_arch_data *tdesc_data = info.tdesc_data;
   static const char *const stap_integer_prefixes[] = { "i", NULL };
   static const char *const stap_register_indirection_prefixes[] = { "(",
diff --git a/gdb/ppc-netbsd-tdep.c b/gdb/ppc-netbsd-tdep.c
index 31f11993889..97912eb5508 100644
--- a/gdb/ppc-netbsd-tdep.c
+++ b/gdb/ppc-netbsd-tdep.c
@@ -102,7 +102,7 @@ ppcnbsd_sigtramp_cache_init (const struct tramp_frame *self,
 			     CORE_ADDR func)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   CORE_ADDR addr, base;
   int i;
 
diff --git a/gdb/ppc-obsd-tdep.c b/gdb/ppc-obsd-tdep.c
index 98b3e4013e9..6a83c08b04f 100644
--- a/gdb/ppc-obsd-tdep.c
+++ b/gdb/ppc-obsd-tdep.c
@@ -161,7 +161,7 @@ static struct trad_frame_cache *
 ppcobsd_sigtramp_frame_cache (struct frame_info *this_frame, void **this_cache)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   struct trad_frame_cache *cache;
   CORE_ADDR addr, base, func;
diff --git a/gdb/ppc-sysv-tdep.c b/gdb/ppc-sysv-tdep.c
index d98af2552b4..0d15e427561 100644
--- a/gdb/ppc-sysv-tdep.c
+++ b/gdb/ppc-sysv-tdep.c
@@ -65,7 +65,7 @@ ppc_sysv_abi_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);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   int opencl_abi = ppc_sysv_use_opencl_abi (value_type (function));
   ULONGEST saved_sp;
@@ -597,7 +597,7 @@ get_decimal_float_return_value (struct gdbarch *gdbarch, struct type *valtype,
 				struct regcache *regcache, gdb_byte *readbuf,
 				const gdb_byte *writebuf)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   gdb_assert (valtype->code () == TYPE_CODE_DECFLOAT);
 
@@ -675,7 +675,7 @@ do_ppc_sysv_return_value (struct gdbarch *gdbarch, struct type *func_type,
 			  gdb_byte *readbuf, const gdb_byte *writebuf,
 			  int broken_gcc)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   int opencl_abi = func_type? ppc_sysv_use_opencl_abi (func_type) : 0;
 
@@ -1250,7 +1250,7 @@ ppc64_sysv_abi_push_val (struct gdbarch *gdbarch,
 			 const bfd_byte *val, int len, int align,
 			 struct ppc64_sysv_argpos *argpos)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int offset = 0;
 
   /* Enforce alignment of stack location, if requested.  */
@@ -1300,7 +1300,7 @@ static void
 ppc64_sysv_abi_push_integer (struct gdbarch *gdbarch, ULONGEST val,
 			     struct ppc64_sysv_argpos *argpos)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   gdb_byte buf[PPC_MAX_REGISTER_SIZE];
 
@@ -1318,7 +1318,7 @@ ppc64_sysv_abi_push_freg (struct gdbarch *gdbarch,
 			  struct type *type, const bfd_byte *val,
 			  struct ppc64_sysv_argpos *argpos)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   if (tdep->soft_float)
     return;
 
@@ -1403,7 +1403,7 @@ static void
 ppc64_sysv_abi_push_vreg (struct gdbarch *gdbarch, const bfd_byte *val,
 			  struct ppc64_sysv_argpos *argpos)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (argpos->regcache && argpos->vreg <= 13)
     argpos->regcache->cooked_write (tdep->ppc_vr0_regnum + argpos->vreg, val);
@@ -1419,7 +1419,7 @@ ppc64_sysv_abi_push_param (struct gdbarch *gdbarch,
 			   struct type *type, const bfd_byte *val,
 			   struct ppc64_sysv_argpos *argpos)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (type->code () == TYPE_CODE_FLT
       || type->code () == TYPE_CODE_DECFLOAT)
@@ -1545,7 +1545,7 @@ ppc64_sysv_abi_push_dummy_call (struct gdbarch *gdbarch,
 				CORE_ADDR struct_addr)
 {
   CORE_ADDR func_addr = find_function_addr (function, NULL);
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   int opencl_abi = ppc_sysv_use_opencl_abi (value_type (function));
   ULONGEST back_chain;
@@ -1739,7 +1739,7 @@ ppc64_sysv_abi_return_value_base (struct gdbarch *gdbarch, struct type *valtype,
 				  struct regcache *regcache, gdb_byte *readbuf,
 				  const gdb_byte *writebuf, int index)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* Integers live in GPRs starting at r3.  */
   if ((valtype->code () == TYPE_CODE_INT
@@ -1905,7 +1905,7 @@ ppc64_sysv_abi_return_value (struct gdbarch *gdbarch, struct value *function,
 			     struct type *valtype, struct regcache *regcache,
 			     gdb_byte *readbuf, const gdb_byte *writebuf)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   struct type *func_type = function ? value_type (function) : NULL;
   int opencl_abi = func_type? ppc_sysv_use_opencl_abi (func_type) : 0;
   struct type *eltype;
diff --git a/gdb/ppc-tdep.h b/gdb/ppc-tdep.h
index 1e0754f7692..6b305c460b1 100644
--- a/gdb/ppc-tdep.h
+++ b/gdb/ppc-tdep.h
@@ -205,106 +205,106 @@ enum powerpc_long_double_abi
   POWERPC_LONG_DOUBLE_LAST
 };
 
-struct gdbarch_tdep
+struct ppc_gdbarch_tdep : gdbarch_tdep
   {
-    int wordsize;		/* Size in bytes of fixed-point word.  */
-    int soft_float;		/* Avoid FP registers for arguments?  */
+    int wordsize = 0;		/* Size in bytes of fixed-point word.  */
+    int soft_float = 0;		/* Avoid FP registers for arguments?  */
 
-    enum powerpc_elf_abi elf_abi;	/* ELF ABI version.  */
+    enum powerpc_elf_abi elf_abi {};	/* ELF ABI version.  */
 
     /* Format to use for the "long double" data type.  */
-    enum powerpc_long_double_abi long_double_abi;
+    enum powerpc_long_double_abi long_double_abi {};
 
     /* How to pass vector arguments.  Never set to AUTO or LAST.  */
-    enum powerpc_vector_abi vector_abi;
+    enum powerpc_vector_abi vector_abi {};
 
-    int ppc_gp0_regnum;		/* GPR register 0 */
-    int ppc_toc_regnum;		/* TOC register */
-    int ppc_ps_regnum;	        /* Processor (or machine) status (%msr) */
-    int ppc_cr_regnum;		/* Condition register */
-    int ppc_lr_regnum;		/* Link register */
-    int ppc_ctr_regnum;		/* Count register */
-    int ppc_xer_regnum;		/* Integer exception register */
+    int ppc_gp0_regnum = 0;		/* GPR register 0 */
+    int ppc_toc_regnum = 0;		/* TOC register */
+    int ppc_ps_regnum = 0;		/* Processor (or machine) status (%msr) */
+    int ppc_cr_regnum = 0;		/* Condition register */
+    int ppc_lr_regnum = 0;		/* Link register */
+    int ppc_ctr_regnum = 0;		/* Count register */
+    int ppc_xer_regnum = 0;		/* Integer exception register */
 
     /* Not all PPC and RS6000 variants will have the registers
        represented below.  A -1 is used to indicate that the register
        is not present in this variant.  */
 
     /* Floating-point registers.  */
-    int ppc_fp0_regnum;         /* Floating-point register 0.  */
-    int ppc_fpscr_regnum;	/* fp status and condition register.  */
+    int ppc_fp0_regnum = 0;	/* Floating-point register 0.  */
+    int ppc_fpscr_regnum = 0;	/* fp status and condition register.  */
 
     /* Multiplier-Quotient Register (older POWER architectures only).  */
-    int ppc_mq_regnum;
+    int ppc_mq_regnum = 0;
 
     /* POWER7 VSX registers.  */
-    int ppc_vsr0_regnum;	/* First VSX register.  */
-    int ppc_vsr0_upper_regnum;  /* First right most dword vsx register.  */
-    int ppc_efpr0_regnum;	/* First Extended FP register.  */
+    int ppc_vsr0_regnum = 0;		/* First VSX register.  */
+    int ppc_vsr0_upper_regnum = 0; 	/* First right most dword vsx register.  */
+    int ppc_efpr0_regnum = 0;		/* First Extended FP register.  */
 
     /* Altivec registers.  */
-    int ppc_vr0_regnum;		/* First AltiVec register.  */
-    int ppc_vrsave_regnum;	/* Last AltiVec register.  */
+    int ppc_vr0_regnum = 0;	/* First AltiVec register.  */
+    int ppc_vrsave_regnum = 0;	/* Last AltiVec register.  */
 
     /* Altivec pseudo-register vX aliases for the raw vrX
        registers.  */
-    int ppc_v0_alias_regnum;
+    int ppc_v0_alias_regnum = 0;
 
     /* SPE registers.  */
-    int ppc_ev0_upper_regnum;   /* First GPR upper half register.  */
-    int ppc_ev0_regnum;         /* First ev register.  */
-    int ppc_acc_regnum;         /* SPE 'acc' register.  */
-    int ppc_spefscr_regnum;     /* SPE 'spefscr' register.  */
+    int ppc_ev0_upper_regnum = 0;   /* First GPR upper half register.  */
+    int ppc_ev0_regnum = 0;         /* First ev register.  */
+    int ppc_acc_regnum = 0;         /* SPE 'acc' register.  */
+    int ppc_spefscr_regnum = 0;     /* SPE 'spefscr' register.  */
 
     /* Program Priority Register.  */
-    int ppc_ppr_regnum;
+    int ppc_ppr_regnum = 0;
 
     /* Data Stream Control Register.  */
-    int ppc_dscr_regnum;
+    int ppc_dscr_regnum = 0;
 
     /* Target Address Register.  */
-    int ppc_tar_regnum;
+    int ppc_tar_regnum = 0;
 
     /* Decimal 128 registers.  */
-    int ppc_dl0_regnum;		/* First Decimal128 argument register pair.  */
+    int ppc_dl0_regnum = 0;	/* First Decimal128 argument register pair.  */
 
-    int have_ebb;
+    int have_ebb = 0;
 
     /* PMU registers.  */
-    int ppc_mmcr0_regnum;
-    int ppc_mmcr2_regnum;
-    int ppc_siar_regnum;
-    int ppc_sdar_regnum;
-    int ppc_sier_regnum;
+    int ppc_mmcr0_regnum = 0;
+    int ppc_mmcr2_regnum = 0;
+    int ppc_siar_regnum = 0;
+    int ppc_sdar_regnum = 0;
+    int ppc_sier_regnum = 0;
 
     /* Hardware Transactional Memory registers.  */
-    int have_htm_spr;
-    int have_htm_core;
-    int have_htm_fpu;
-    int have_htm_altivec;
-    int have_htm_vsx;
-    int ppc_cppr_regnum;
-    int ppc_cdscr_regnum;
-    int ppc_ctar_regnum;
+    int have_htm_spr = 0;
+    int have_htm_core = 0;
+    int have_htm_fpu = 0;
+    int have_htm_altivec = 0;
+    int have_htm_vsx = 0;
+    int ppc_cppr_regnum = 0;
+    int ppc_cdscr_regnum = 0;
+    int ppc_ctar_regnum = 0;
 
     /* HTM pseudo registers.  */
-    int ppc_cdl0_regnum;
-    int ppc_cvsr0_regnum;
-    int ppc_cefpr0_regnum;
+    int ppc_cdl0_regnum = 0;
+    int ppc_cvsr0_regnum = 0;
+    int ppc_cefpr0_regnum = 0;
 
     /* Offset to ABI specific location where link register is saved.  */
-    int lr_frame_offset;	
+    int lr_frame_offset = 0;
 
     /* An array of integers, such that sim_regno[I] is the simulator
        register number for GDB register number I, or -1 if the
        simulator does not implement that register.  */
-    int *sim_regno;
+    int *sim_regno = nullptr;
 
     /* ISA-specific types.  */
-    struct type *ppc_builtin_type_vec64;
-    struct type *ppc_builtin_type_vec128;
+    struct type *ppc_builtin_type_vec64 = nullptr;
+    struct type *ppc_builtin_type_vec128 = nullptr;
 
-    int (*ppc_syscall_record) (struct regcache *regcache);
+    int (*ppc_syscall_record) (struct regcache *regcache) = nullptr;
 };
 
 
diff --git a/gdb/ppc64-tdep.c b/gdb/ppc64-tdep.c
index 1dd94f20ab6..aab893df3a5 100644
--- a/gdb/ppc64-tdep.c
+++ b/gdb/ppc64-tdep.c
@@ -89,7 +89,7 @@ ppc64_plt_entry_point (struct frame_info *frame, CORE_ADDR plt_off)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   CORE_ADDR tocp;
 
   if (execution_direction == EXEC_REVERSE)
diff --git a/gdb/riscv-linux-tdep.c b/gdb/riscv-linux-tdep.c
index 7351e1901d6..f6489ab0238 100644
--- a/gdb/riscv-linux-tdep.c
+++ b/gdb/riscv-linux-tdep.c
@@ -179,7 +179,7 @@ riscv_linux_syscall_next_pc (struct frame_info *frame)
 static void
 riscv_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  riscv_gdbarch_tdep *tdep = (riscv_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   linux_init_abi (info, gdbarch, 0);
 
diff --git a/gdb/riscv-tdep.c b/gdb/riscv-tdep.c
index bfd93c65d22..a6a64d3cb84 100644
--- a/gdb/riscv-tdep.c
+++ b/gdb/riscv-tdep.c
@@ -730,7 +730,8 @@ show_riscv_debug_variable (struct ui_file *file, int from_tty,
 int
 riscv_isa_xlen (struct gdbarch *gdbarch)
 {
-  return gdbarch_tdep (gdbarch)->isa_features.xlen;
+  riscv_gdbarch_tdep *tdep = (riscv_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+  return tdep->isa_features.xlen;
 }
 
 /* See riscv-tdep.h.  */
@@ -738,7 +739,8 @@ riscv_isa_xlen (struct gdbarch *gdbarch)
 int
 riscv_abi_xlen (struct gdbarch *gdbarch)
 {
-  return gdbarch_tdep (gdbarch)->abi_features.xlen;
+  riscv_gdbarch_tdep *tdep = (riscv_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+  return tdep->abi_features.xlen;
 }
 
 /* See riscv-tdep.h.  */
@@ -746,7 +748,8 @@ riscv_abi_xlen (struct gdbarch *gdbarch)
 int
 riscv_isa_flen (struct gdbarch *gdbarch)
 {
-  return gdbarch_tdep (gdbarch)->isa_features.flen;
+  riscv_gdbarch_tdep *tdep = (riscv_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+  return tdep->isa_features.flen;
 }
 
 /* See riscv-tdep.h.  */
@@ -754,7 +757,8 @@ riscv_isa_flen (struct gdbarch *gdbarch)
 int
 riscv_abi_flen (struct gdbarch *gdbarch)
 {
-  return gdbarch_tdep (gdbarch)->abi_features.flen;
+  riscv_gdbarch_tdep *tdep = (riscv_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+  return tdep->abi_features.flen;
 }
 
 /* See riscv-tdep.h.  */
@@ -762,7 +766,8 @@ riscv_abi_flen (struct gdbarch *gdbarch)
 bool
 riscv_abi_embedded (struct gdbarch *gdbarch)
 {
-  return gdbarch_tdep (gdbarch)->abi_features.embedded;
+  riscv_gdbarch_tdep *tdep = (riscv_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+  return tdep->abi_features.embedded;
 }
 
 /* Return true if the target for GDBARCH has floating point hardware.  */
@@ -778,7 +783,8 @@ riscv_has_fp_regs (struct gdbarch *gdbarch)
 static bool
 riscv_has_fp_abi (struct gdbarch *gdbarch)
 {
-  return gdbarch_tdep (gdbarch)->abi_features.flen > 0;
+  riscv_gdbarch_tdep *tdep = (riscv_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+  return tdep->abi_features.flen > 0;
 }
 
 /* Return true if REGNO is a floating pointer register.  */
@@ -901,7 +907,7 @@ riscv_register_name (struct gdbarch *gdbarch, int regnum)
      will show up in 'info register all'.  Unless, we identify the
      duplicate copies of these registers (in riscv_tdesc_unknown_reg) and
      then hide the registers here by giving them no name.  */
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  riscv_gdbarch_tdep *tdep = (riscv_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   if (tdep->duplicate_fflags_regnum == regnum)
     return NULL;
   if (tdep->duplicate_frm_regnum == regnum)
@@ -929,7 +935,7 @@ riscv_register_name (struct gdbarch *gdbarch, int regnum)
 static struct type *
 riscv_fpreg_d_type (struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  riscv_gdbarch_tdep *tdep = (riscv_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (tdep->riscv_fpreg_d_type == nullptr)
     {
@@ -1251,7 +1257,7 @@ riscv_is_regnum_a_named_csr (int regnum)
 static bool
 riscv_is_unknown_csr (struct gdbarch *gdbarch, int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  riscv_gdbarch_tdep *tdep = (riscv_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   return (regnum >= tdep->unknown_csrs_first_regnum
 	  && regnum < (tdep->unknown_csrs_first_regnum
 		       + tdep->unknown_csrs_count));
@@ -3560,7 +3566,7 @@ riscv_tdesc_unknown_reg (struct gdbarch *gdbarch, tdesc_feature *feature,
      record their register numbers here.  */
   if (strcmp (tdesc_feature_name (feature), riscv_freg_feature.name ()) == 0)
     {
-      struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+      riscv_gdbarch_tdep *tdep = (riscv_gdbarch_tdep *) gdbarch_tdep (gdbarch);
       int *regnum_ptr = nullptr;
 
       if (strcmp (reg_name, "fflags") == 0)
@@ -3591,7 +3597,7 @@ riscv_tdesc_unknown_reg (struct gdbarch *gdbarch, tdesc_feature *feature,
      about register groups in riscv_register_reggroup_p.  */
   if (strcmp (tdesc_feature_name (feature), riscv_csr_feature.name ()) == 0)
     {
-      struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+      riscv_gdbarch_tdep *tdep = (riscv_gdbarch_tdep *) gdbarch_tdep (gdbarch);
       if (tdep->unknown_csrs_first_regnum == -1)
 	tdep->unknown_csrs_first_regnum = possible_regnum;
       gdb_assert (tdep->unknown_csrs_first_regnum
@@ -3628,7 +3634,6 @@ riscv_gdbarch_init (struct gdbarch_info info,
 		    struct gdbarch_list *arches)
 {
   struct gdbarch *gdbarch;
-  struct gdbarch_tdep *tdep;
   struct riscv_gdbarch_features features;
   const struct target_desc *tdesc = info.target_desc;
 
@@ -3693,7 +3698,8 @@ riscv_gdbarch_init (struct gdbarch_info info,
       /* Check that the feature set of the ARCHES matches the feature set
 	 we are looking for.  If it doesn't then we can't reuse this
 	 gdbarch.  */
-      struct gdbarch_tdep *other_tdep = gdbarch_tdep (arches->gdbarch);
+      riscv_gdbarch_tdep *other_tdep
+	= (riscv_gdbarch_tdep *) gdbarch_tdep (arches->gdbarch);
 
       if (other_tdep->isa_features != features
 	  || other_tdep->abi_features != abi_features)
@@ -3706,7 +3712,7 @@ riscv_gdbarch_init (struct gdbarch_info info,
     return arches->gdbarch;
 
   /* None found, so create a new architecture from the information provided.  */
-  tdep = new (struct gdbarch_tdep);
+  riscv_gdbarch_tdep *tdep = new riscv_gdbarch_tdep;
   gdbarch = gdbarch_alloc (&info, tdep);
   tdep->isa_features = features;
   tdep->abi_features = abi_features;
@@ -3812,7 +3818,8 @@ static CORE_ADDR
 riscv_next_pc (struct regcache *regcache, CORE_ADDR pc)
 {
   struct gdbarch *gdbarch = regcache->arch ();
-  const struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  const riscv_gdbarch_tdep *tdep
+    = (riscv_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   struct riscv_insn insn;
   CORE_ADDR next_pc;
 
diff --git a/gdb/riscv-tdep.h b/gdb/riscv-tdep.h
index 03870cf9e5b..2af6ec332f7 100644
--- a/gdb/riscv-tdep.h
+++ b/gdb/riscv-tdep.h
@@ -22,6 +22,7 @@
 #define RISCV_TDEP_H
 
 #include "arch/riscv.h"
+#include "gdbarch.h"
 
 /* RiscV register numbers.  */
 enum
@@ -75,7 +76,7 @@ enum
 };
 
 /* RISC-V specific per-architecture information.  */
-struct gdbarch_tdep
+struct riscv_gdbarch_tdep : gdbarch_tdep
 {
   /* Features about the target hardware that impact how the gdbarch is
      configured.  Two gdbarch instances are compatible only if this field
@@ -105,7 +106,7 @@ struct gdbarch_tdep
 
   /* Return the expected next PC assuming FRAME is stopped at a syscall
      instruction.  */
-  CORE_ADDR (*syscall_next_pc) (struct frame_info *frame);
+  CORE_ADDR (*syscall_next_pc) (struct frame_info *frame) = nullptr;
 };
 
 
diff --git a/gdb/rl78-tdep.c b/gdb/rl78-tdep.c
index 3b2cf9667df..616dafb1721 100644
--- a/gdb/rl78-tdep.c
+++ b/gdb/rl78-tdep.c
@@ -209,21 +209,21 @@ enum
 
 /* Architecture specific data.  */
 
-struct gdbarch_tdep
+struct rl78_gdbarch_tdep : gdbarch_tdep
 {
   /* The ELF header flags specify the multilib used.  */
-  int elf_flags;
-
-  struct type *rl78_void,
-	      *rl78_uint8,
-	      *rl78_int8,
-	      *rl78_uint16,
-	      *rl78_int16,
-	      *rl78_uint32,
-	      *rl78_int32,
-	      *rl78_data_pointer,
-	      *rl78_code_pointer,
-	      *rl78_psw_type;
+  int elf_flags = 0;
+
+  struct type *rl78_void = nullptr,
+	      *rl78_uint8 = nullptr,
+	      *rl78_int8 = nullptr,
+	      *rl78_uint16 = nullptr,
+	      *rl78_int16 = nullptr,
+	      *rl78_uint32 = nullptr,
+	      *rl78_int32 = nullptr,
+	      *rl78_data_pointer = nullptr,
+	      *rl78_code_pointer = nullptr,
+	      *rl78_psw_type = nullptr;
 };
 
 /* This structure holds the results of a prologue analysis.  */
@@ -266,7 +266,7 @@ struct rl78_prologue
 static struct type *
 rl78_psw_type (struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  rl78_gdbarch_tdep *tdep = (rl78_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (tdep->rl78_psw_type == NULL)
     {
@@ -290,7 +290,7 @@ rl78_psw_type (struct gdbarch *gdbarch)
 static struct type *
 rl78_register_type (struct gdbarch *gdbarch, int reg_nr)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  rl78_gdbarch_tdep *tdep = (rl78_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (reg_nr == RL78_PC_REGNUM)
     return tdep->rl78_code_pointer;
@@ -1247,7 +1247,8 @@ rl78_return_value (struct gdbarch *gdbarch,
 {
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   ULONGEST valtype_len = TYPE_LENGTH (valtype);
-  int is_g10 = gdbarch_tdep (gdbarch)->elf_flags & E_FLAG_RL78_G10;
+  rl78_gdbarch_tdep *tdep = (rl78_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+  int is_g10 = tdep->elf_flags & E_FLAG_RL78_G10;
 
   if (valtype_len > 8)
     return RETURN_VALUE_STRUCT_CONVENTION;
@@ -1375,7 +1376,6 @@ static struct gdbarch *
 rl78_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 {
   struct gdbarch *gdbarch;
-  struct gdbarch_tdep *tdep;
   int elf_flags;
 
   /* Extract the elf_flags if available.  */
@@ -1392,7 +1392,10 @@ rl78_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
        arches != NULL;
        arches = gdbarch_list_lookup_by_info (arches->next, &info))
     {
-      if (gdbarch_tdep (arches->gdbarch)->elf_flags != elf_flags)
+      rl78_gdbarch_tdep *tdep
+	= (rl78_gdbarch_tdep *) gdbarch_tdep (arches->gdbarch);
+
+      if (tdep->elf_flags != elf_flags)
 	continue;
 
       return arches->gdbarch;
@@ -1400,7 +1403,7 @@ rl78_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 
   /* None found, create a new architecture from the information
      provided.  */
-  tdep = XCNEW (struct gdbarch_tdep);
+  rl78_gdbarch_tdep * tdep = new rl78_gdbarch_tdep;
   gdbarch = gdbarch_alloc (&info, tdep);
   tdep->elf_flags = elf_flags;
 
diff --git a/gdb/rs6000-aix-tdep.c b/gdb/rs6000-aix-tdep.c
index 80e19570a4d..11cae6ad4bc 100644
--- a/gdb/rs6000-aix-tdep.c
+++ b/gdb/rs6000-aix-tdep.c
@@ -73,7 +73,7 @@ aix_sighandle_frame_cache (struct frame_info *this_frame,
   LONGEST backchain;
   CORE_ADDR base, base_orig, func;
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   struct trad_frame_cache *this_trad_cache;
 
@@ -259,7 +259,8 @@ rs6000_aix_iterate_over_regset_sections (struct gdbarch *gdbarch,
 					 void *cb_data,
 					 const struct regcache *regcache)
 {
-  if (gdbarch_tdep (gdbarch)->wordsize == 4)
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+  if (tdep->wordsize == 4)
     cb (".reg", 592, 592, &rs6000_aix32_regset, NULL, cb_data);
   else
     cb (".reg", 576, 576, &rs6000_aix64_regset, NULL, cb_data);
@@ -289,7 +290,7 @@ rs6000_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);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   int ii;
   int len = 0;
@@ -297,7 +298,7 @@ rs6000_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
   int argbytes;			/* current argument byte */
   gdb_byte tmp_buffer[50];
   int f_argno = 0;		/* current floating point argno */
-  int wordsize = gdbarch_tdep (gdbarch)->wordsize;
+  int wordsize = tdep->wordsize;
   CORE_ADDR func_addr = find_function_addr (function, NULL);
 
   struct value *arg = 0;
@@ -519,7 +520,7 @@ rs6000_return_value (struct gdbarch *gdbarch, struct value *function,
 		     struct type *valtype, struct regcache *regcache,
 		     gdb_byte *readbuf, const gdb_byte *writebuf)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
 
   /* The calling convention this function implements assumes the
@@ -657,7 +658,7 @@ rs6000_convert_from_func_ptr_addr (struct gdbarch *gdbarch,
 				   CORE_ADDR addr,
 				   struct target_ops *targ)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   struct obj_section *s;
 
@@ -701,7 +702,7 @@ branch_dest (struct regcache *regcache, int opcode, int instr,
 	     CORE_ADDR pc, CORE_ADDR safety)
 {
   struct gdbarch *gdbarch = regcache->arch ();
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   CORE_ADDR dest;
   int immediate;
@@ -969,7 +970,7 @@ static struct ld_info
 rs6000_aix_extract_ld_info (struct gdbarch *gdbarch,
 			    const gdb_byte *ldi_buf)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   struct type *ptr_type = builtin_type (gdbarch)->builtin_data_ptr;
   const struct ld_info_desc desc
@@ -1128,7 +1129,7 @@ rs6000_aix_core_xfer_shared_libraries_aix (struct gdbarch *gdbarch,
 static void
 rs6000_aix_init_osabi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* RS6000/AIX does not support PT_STEP.  Has to be simulated.  */
   set_gdbarch_software_single_step (gdbarch, rs6000_software_single_step);
diff --git a/gdb/rs6000-lynx178-tdep.c b/gdb/rs6000-lynx178-tdep.c
index 21f1baf19dc..bdc1aaa18d7 100644
--- a/gdb/rs6000-lynx178-tdep.c
+++ b/gdb/rs6000-lynx178-tdep.c
@@ -36,7 +36,7 @@ rs6000_lynx178_push_dummy_call (struct gdbarch *gdbarch,
 				function_call_return_method return_method,
 				CORE_ADDR struct_addr)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   int ii;
   int len = 0;
@@ -44,7 +44,7 @@ rs6000_lynx178_push_dummy_call (struct gdbarch *gdbarch,
   int argbytes;			/* current argument byte */
   gdb_byte tmp_buffer[50];
   int f_argno = 0;		/* current floating point argno */
-  int wordsize = gdbarch_tdep (gdbarch)->wordsize;
+  int wordsize = tdep->wordsize;
 
   struct value *arg = 0;
   struct type *type;
@@ -265,7 +265,7 @@ rs6000_lynx178_return_value (struct gdbarch *gdbarch, struct value *function,
 			     struct type *valtype, struct regcache *regcache,
 			     gdb_byte *readbuf, const gdb_byte *writebuf)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
 
   /* The calling convention this function implements assumes the
diff --git a/gdb/rs6000-tdep.c b/gdb/rs6000-tdep.c
index 4830ed22593..0d618943186 100644
--- a/gdb/rs6000-tdep.c
+++ b/gdb/rs6000-tdep.c
@@ -209,7 +209,7 @@ struct rs6000_framedata
 int
 vsx_register_p (struct gdbarch *gdbarch, int regno)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   if (tdep->ppc_vsr0_regnum < 0)
     return 0;
   else
@@ -221,7 +221,7 @@ vsx_register_p (struct gdbarch *gdbarch, int regno)
 int
 altivec_register_p (struct gdbarch *gdbarch, int regno)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   if (tdep->ppc_vr0_regnum < 0 || tdep->ppc_vrsave_regnum < 0)
     return 0;
   else
@@ -233,7 +233,7 @@ altivec_register_p (struct gdbarch *gdbarch, int regno)
 int
 spe_register_p (struct gdbarch *gdbarch, int regno)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   
   /* Is it a reference to EV0 -- EV31, and do we have those?  */
   if (IS_SPE_PSEUDOREG (tdep, regno))
@@ -265,7 +265,7 @@ spe_register_p (struct gdbarch *gdbarch, int regno)
 int
 ppc_floating_point_unit_p (struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   return (tdep->ppc_fp0_regnum >= 0
 	  && tdep->ppc_fpscr_regnum >= 0);
@@ -276,7 +276,7 @@ ppc_floating_point_unit_p (struct gdbarch *gdbarch)
 int
 ppc_altivec_support_p (struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   return (tdep->ppc_vr0_regnum >= 0
 	  && tdep->ppc_vrsave_regnum >= 0);
@@ -305,7 +305,7 @@ set_sim_regno (int *table, int gdb_regno, int sim_regno)
 static void
 init_sim_regno_table (struct gdbarch *arch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (arch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (arch);
   int total_regs = gdbarch_num_regs (arch);
   int *sim_regno = GDBARCH_OBSTACK_CALLOC (arch, total_regs, int);
   int i;
@@ -399,7 +399,7 @@ init_sim_regno_table (struct gdbarch *arch)
 static int
 rs6000_register_sim_regno (struct gdbarch *gdbarch, int reg)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int sim_regno;
 
   if (tdep->sim_regno == NULL)
@@ -470,7 +470,7 @@ ppc_collect_reg (const struct regcache *regcache, int regnum,
     
 static int
 ppc_greg_offset (struct gdbarch *gdbarch,
-		 struct gdbarch_tdep *tdep,
+		 ppc_gdbarch_tdep *tdep,
 		 const struct ppc_reg_offsets *offsets,
 		 int regnum,
 		 int *regsize)
@@ -507,7 +507,7 @@ ppc_greg_offset (struct gdbarch *gdbarch,
 }
 
 static int
-ppc_fpreg_offset (struct gdbarch_tdep *tdep,
+ppc_fpreg_offset (ppc_gdbarch_tdep *tdep,
 		  const struct ppc_reg_offsets *offsets,
 		  int regnum)
 {
@@ -530,7 +530,7 @@ ppc_supply_gregset (const struct regset *regset, struct regcache *regcache,
 		    int regnum, const void *gregs, size_t len)
 {
   struct gdbarch *gdbarch = regcache->arch ();
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   const struct ppc_reg_offsets *offsets
     = (const struct ppc_reg_offsets *) regset->regmap;
   size_t offset;
@@ -580,14 +580,13 @@ ppc_supply_fpregset (const struct regset *regset, struct regcache *regcache,
 		     int regnum, const void *fpregs, size_t len)
 {
   struct gdbarch *gdbarch = regcache->arch ();
-  struct gdbarch_tdep *tdep;
   const struct ppc_reg_offsets *offsets;
   size_t offset;
 
   if (!ppc_floating_point_unit_p (gdbarch))
     return;
 
-  tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   offsets = (const struct ppc_reg_offsets *) regset->regmap;
   if (regnum == -1)
     {
@@ -620,7 +619,7 @@ ppc_collect_gregset (const struct regset *regset,
 		     int regnum, void *gregs, size_t len)
 {
   struct gdbarch *gdbarch = regcache->arch ();
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   const struct ppc_reg_offsets *offsets
     = (const struct ppc_reg_offsets *) regset->regmap;
   size_t offset;
@@ -671,14 +670,13 @@ ppc_collect_fpregset (const struct regset *regset,
 		      int regnum, void *fpregs, size_t len)
 {
   struct gdbarch *gdbarch = regcache->arch ();
-  struct gdbarch_tdep *tdep;
   const struct ppc_reg_offsets *offsets;
   size_t offset;
 
   if (!ppc_floating_point_unit_p (gdbarch))
     return;
 
-  tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   offsets = (const struct ppc_reg_offsets *) regset->regmap;
   if (regnum == -1)
     {
@@ -756,7 +754,7 @@ static int
 rs6000_in_function_epilogue_frame_p (struct frame_info *curfrm,
 				     struct gdbarch *gdbarch, CORE_ADDR pc)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   bfd_byte insn_buf[PPC_INSN_SIZE];
   CORE_ADDR scan_pc, func_start, func_end, epilogue_start, epilogue_end;
@@ -1052,8 +1050,9 @@ ppc_displaced_step_fixup (struct gdbarch *gdbarch,
       if (insn & 0x1)
 	{
 	  /* Link register needs to be set to the next instruction's PC.  */
+	  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 	  regcache_cooked_write_unsigned (regs,
-					  gdbarch_tdep (gdbarch)->ppc_lr_regnum,
+					  tdep->ppc_lr_regnum,
 					  from + PPC_INSN_SIZE);
 	  displaced_debug_printf ("(ppc) adjusted LR to %s",
 				  paddress (gdbarch, from + PPC_INSN_SIZE));
@@ -1599,7 +1598,7 @@ skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc, CORE_ADDR lim_pc,
   int num_skip_non_prologue_insns = 0;
   int r0_contains_arg = 0;
   const struct bfd_arch_info *arch_info = gdbarch_bfd_arch_info (gdbarch);
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
 
   memset (fdata, 0, sizeof (struct rs6000_framedata));
@@ -2319,7 +2318,7 @@ static CORE_ADDR
 rs6000_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   unsigned int ii, op;
   int rel;
@@ -2377,7 +2376,7 @@ rs6000_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
 static struct type *
 rs6000_builtin_type_vec64 (struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (!tdep->ppc_builtin_type_vec64)
     {
@@ -2422,7 +2421,7 @@ rs6000_builtin_type_vec64 (struct gdbarch *gdbarch)
 static struct type *
 rs6000_builtin_type_vec128 (struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (!tdep->ppc_builtin_type_vec128)
     {
@@ -2476,7 +2475,7 @@ rs6000_builtin_type_vec128 (struct gdbarch *gdbarch)
 static const char *
 rs6000_register_name (struct gdbarch *gdbarch, int regno)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* The upper half "registers" have names in the XML description,
      but we present only the low GPRs and the full 64-bit registers
@@ -2614,7 +2613,7 @@ rs6000_register_name (struct gdbarch *gdbarch, int regno)
 static struct type *
 rs6000_pseudo_register_type (struct gdbarch *gdbarch, int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* These are the e500 pseudo-registers.  */
   if (IS_SPE_PSEUDOREG (tdep, regnum))
@@ -2653,7 +2652,7 @@ static int
 rs6000_pseudo_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
 				   struct reggroup *group)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (IS_V_ALIAS_PSEUDOREG (tdep, regnum))
     return 0;
@@ -2668,7 +2667,7 @@ static int
 rs6000_convert_register_p (struct gdbarch *gdbarch, int regnum,
 			   struct type *type)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   return (tdep->ppc_fp0_regnum >= 0
 	  && regnum >= tdep->ppc_fp0_regnum
@@ -2753,7 +2752,7 @@ e500_move_ev_register (move_ev_register_func move,
 		       struct regcache *regcache, int ev_reg, void *buffer)
 {
   struct gdbarch *arch = regcache->arch ();
-  struct gdbarch_tdep *tdep = gdbarch_tdep (arch); 
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (arch);
   int reg_index;
   gdb_byte *byte_buffer = (gdb_byte *) buffer;
   enum register_status status;
@@ -2794,7 +2793,7 @@ e500_pseudo_register_read (struct gdbarch *gdbarch, readable_regcache *regcache,
 			   int ev_reg, gdb_byte *buffer)
 {
   struct gdbarch *arch = regcache->arch ();
-  struct gdbarch_tdep *tdep = gdbarch_tdep (arch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int reg_index;
   enum register_status status;
 
@@ -2835,7 +2834,7 @@ static enum register_status
 dfp_pseudo_register_read (struct gdbarch *gdbarch, readable_regcache *regcache,
 			   int reg_nr, gdb_byte *buffer)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int reg_index, fp0;
   enum register_status status;
 
@@ -2875,7 +2874,7 @@ static void
 dfp_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
 			    int reg_nr, const gdb_byte *buffer)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int reg_index, fp0;
 
   if (IS_DFP_PSEUDOREG (tdep, reg_nr))
@@ -2912,7 +2911,7 @@ v_alias_pseudo_register_read (struct gdbarch *gdbarch,
 			      readable_regcache *regcache, int reg_nr,
 			      gdb_byte *buffer)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   gdb_assert (IS_V_ALIAS_PSEUDOREG (tdep, reg_nr));
 
   return regcache->raw_read (tdep->ppc_vr0_regnum
@@ -2927,7 +2926,7 @@ v_alias_pseudo_register_write (struct gdbarch *gdbarch,
 			       struct regcache *regcache,
 			       int reg_nr, const gdb_byte *buffer)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   gdb_assert (IS_V_ALIAS_PSEUDOREG (tdep, reg_nr));
 
   regcache->raw_write (tdep->ppc_vr0_regnum
@@ -2939,7 +2938,7 @@ static enum register_status
 vsx_pseudo_register_read (struct gdbarch *gdbarch, readable_regcache *regcache,
 			   int reg_nr, gdb_byte *buffer)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int reg_index, vr0, fp0, vsr0_upper;
   enum register_status status;
 
@@ -2987,7 +2986,7 @@ static void
 vsx_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
 			    int reg_nr, const gdb_byte *buffer)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int reg_index, vr0, fp0, vsr0_upper;
 
   if (IS_VSX_PSEUDOREG (tdep, reg_nr))
@@ -3029,7 +3028,7 @@ static enum register_status
 efp_pseudo_register_read (struct gdbarch *gdbarch, readable_regcache *regcache,
 			   int reg_nr, gdb_byte *buffer)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int reg_index, vr0;
 
   if (IS_EFP_PSEUDOREG (tdep, reg_nr))
@@ -3058,7 +3057,7 @@ static void
 efp_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
 			    int reg_nr, const gdb_byte *buffer)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int reg_index, vr0;
   int offset = gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG ? 0 : 8;
 
@@ -3094,7 +3093,7 @@ rs6000_pseudo_register_read (struct gdbarch *gdbarch,
 			     int reg_nr, gdb_byte *buffer)
 {
   struct gdbarch *regcache_arch = regcache->arch ();
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); 
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   gdb_assert (regcache_arch == gdbarch);
 
@@ -3125,7 +3124,7 @@ rs6000_pseudo_register_write (struct gdbarch *gdbarch,
 			      int reg_nr, const gdb_byte *buffer)
 {
   struct gdbarch *regcache_arch = regcache->arch ();
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); 
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   gdb_assert (regcache_arch == gdbarch);
 
@@ -3156,7 +3155,7 @@ static void
 dfp_ax_pseudo_register_collect (struct gdbarch *gdbarch,
 				struct agent_expr *ax, int reg_nr)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int reg_index, fp0;
 
   if (IS_DFP_PSEUDOREG (tdep, reg_nr))
@@ -3183,7 +3182,7 @@ static void
 v_alias_pseudo_register_collect (struct gdbarch *gdbarch,
 				 struct agent_expr *ax, int reg_nr)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   gdb_assert (IS_V_ALIAS_PSEUDOREG (tdep, reg_nr));
 
   ax_reg_mask (ax, tdep->ppc_vr0_regnum
@@ -3197,7 +3196,7 @@ static void
 vsx_ax_pseudo_register_collect (struct gdbarch *gdbarch,
 				struct agent_expr *ax, int reg_nr)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int reg_index, vr0, fp0, vsr0_upper;
 
   if (IS_VSX_PSEUDOREG (tdep, reg_nr))
@@ -3235,7 +3234,7 @@ static void
 efp_ax_pseudo_register_collect (struct gdbarch *gdbarch,
 				struct agent_expr *ax, int reg_nr)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int reg_index, vr0;
 
   if (IS_EFP_PSEUDOREG (tdep, reg_nr))
@@ -3258,7 +3257,7 @@ static int
 rs6000_ax_pseudo_register_collect (struct gdbarch *gdbarch,
 				   struct agent_expr *ax, int reg_nr)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   if (IS_SPE_PSEUDOREG (tdep, reg_nr))
     {
       int reg_index = reg_nr - tdep->ppc_ev0_regnum;
@@ -3298,7 +3297,7 @@ rs6000_gen_return_address (struct gdbarch *gdbarch,
 			   struct agent_expr *ax, struct axs_value *value,
 			   CORE_ADDR scope)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   value->type = register_type (gdbarch, tdep->ppc_lr_regnum);
   value->kind = axs_lvalue_register;
   value->u.reg = tdep->ppc_lr_regnum;
@@ -3309,7 +3308,7 @@ rs6000_gen_return_address (struct gdbarch *gdbarch,
 static int
 rs6000_stab_reg_to_regnum (struct gdbarch *gdbarch, int num)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (0 <= num && num <= 31)
     return tdep->ppc_gp0_regnum + num;
@@ -3351,7 +3350,7 @@ rs6000_stab_reg_to_regnum (struct gdbarch *gdbarch, int num)
 static int
 rs6000_dwarf2_reg_to_regnum (struct gdbarch *gdbarch, int num)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (0 <= num && num <= 31)
     return tdep->ppc_gp0_regnum + num;
@@ -3570,7 +3569,7 @@ rs6000_frame_cache (struct frame_info *this_frame, void **this_cache)
 {
   struct rs6000_frame_cache *cache;
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   struct rs6000_framedata fdata;
   int wordsize = tdep->wordsize;
@@ -3806,7 +3805,7 @@ rs6000_epilogue_frame_cache (struct frame_info *this_frame, void **this_cache)
 {
   struct rs6000_frame_cache *cache;
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (*this_cache)
     return (struct rs6000_frame_cache *) *this_cache;
@@ -3927,7 +3926,7 @@ ppc_dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum,
 			    struct dwarf2_frame_state_reg *reg,
 			    struct frame_info *this_frame)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* PPC32 and PPC64 ABI's are the same regarding volatile and
      non-volatile registers.  We will use the same code for both.  */
@@ -4139,7 +4138,7 @@ bfd_uses_spe_extensions (bfd *abfd)
    Otherwise, it's just a VR register.  Record them accordingly.  */
 
 static int
-ppc_record_vsr (struct regcache *regcache, struct gdbarch_tdep *tdep, int vsr)
+ppc_record_vsr (struct regcache *regcache, ppc_gdbarch_tdep *tdep, int vsr)
 {
   if (vsr < 0 || vsr >= 64)
     return -1;
@@ -4168,7 +4167,7 @@ static int
 ppc_process_record_op4 (struct gdbarch *gdbarch, struct regcache *regcache,
 			CORE_ADDR addr, uint32_t insn)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int ext = PPC_FIELD (insn, 21, 11);
   int vra = PPC_FIELD (insn, 11, 5);
 
@@ -4541,7 +4540,7 @@ static int
 ppc_process_record_op19 (struct gdbarch *gdbarch, struct regcache *regcache,
 			   CORE_ADDR addr, uint32_t insn)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int ext = PPC_EXTOP (insn);
 
   switch (ext & 0x01f)
@@ -4593,7 +4592,7 @@ static int
 ppc_process_record_op31 (struct gdbarch *gdbarch, struct regcache *regcache,
 			   CORE_ADDR addr, uint32_t insn)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int ext = PPC_EXTOP (insn);
   int tmp, nr, nb, i;
   CORE_ADDR at_dcsz, ea = 0;
@@ -5190,7 +5189,7 @@ static int
 ppc_process_record_op59 (struct gdbarch *gdbarch, struct regcache *regcache,
 			   CORE_ADDR addr, uint32_t insn)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int ext = PPC_EXTOP (insn);
 
   switch (ext & 0x1f)
@@ -5284,7 +5283,7 @@ static int
 ppc_process_record_op60 (struct gdbarch *gdbarch, struct regcache *regcache,
 			   CORE_ADDR addr, uint32_t insn)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int ext = PPC_EXTOP (insn);
 
   switch (ext >> 2)
@@ -5646,7 +5645,7 @@ static int
 ppc_process_record_op61 (struct gdbarch *gdbarch, struct regcache *regcache,
 			   CORE_ADDR addr, uint32_t insn)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   ULONGEST ea = 0;
   int size;
 
@@ -5705,7 +5704,7 @@ static int
 ppc_process_record_op63 (struct gdbarch *gdbarch, struct regcache *regcache,
 			   CORE_ADDR addr, uint32_t insn)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int ext = PPC_EXTOP (insn);
   int tmp;
 
@@ -5964,7 +5963,7 @@ int
 ppc_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
 		      CORE_ADDR addr)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   uint32_t insn;
   int op6, tmp, i;
@@ -6267,7 +6266,6 @@ static struct gdbarch *
 rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 {
   struct gdbarch *gdbarch;
-  struct gdbarch_tdep *tdep;
   int wordsize, from_xcoff_exec, from_elf_exec;
   enum bfd_architecture arch;
   unsigned long mach;
@@ -6953,7 +6951,8 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
       /* Word size in the various PowerPC bfd_arch_info structs isn't
 	 meaningful, because 64-bit CPUs can run in 32-bit mode.  So, perform
 	 separate word size check.  */
-      tdep = gdbarch_tdep (arches->gdbarch);
+      ppc_gdbarch_tdep *tdep
+	= (ppc_gdbarch_tdep *) gdbarch_tdep (arches->gdbarch);
       if (tdep && tdep->elf_abi != elf_abi)
 	continue;
       if (tdep && tdep->soft_float != soft_float)
@@ -6974,7 +6973,7 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
        - "set arch"		trust blindly
        - GDB startup		useless but harmless */
 
-  tdep = XCNEW (struct gdbarch_tdep);
+  ppc_gdbarch_tdep *tdep = new ppc_gdbarch_tdep;
   tdep->wordsize = wordsize;
   tdep->elf_abi = elf_abi;
   tdep->soft_float = soft_float;
@@ -7253,7 +7252,7 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 static void
 rs6000_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (tdep == NULL)
     return;
diff --git a/gdb/rx-tdep.c b/gdb/rx-tdep.c
index 2d20aedf994..73e708b6462 100644
--- a/gdb/rx-tdep.c
+++ b/gdb/rx-tdep.c
@@ -68,16 +68,16 @@ enum rx_frame_type {
 };
 
 /* Architecture specific data.  */
-struct gdbarch_tdep
+struct rx_gdbarch_tdep : gdbarch_tdep
 {
   /* The ELF header flags specify the multilib used.  */
-  int elf_flags;
+  int elf_flags = 0;
 
   /* Type of PSW and BPSW.  */
-  struct type *rx_psw_type;
+  struct type *rx_psw_type = nullptr;
 
   /* Type of FPSW.  */
-  struct type *rx_fpsw_type;
+  struct type *rx_fpsw_type = nullptr;
 };
 
 /* This structure holds the results of a prologue analysis.  */
@@ -944,7 +944,6 @@ static struct gdbarch *
 rx_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 {
   struct gdbarch *gdbarch;
-  struct gdbarch_tdep *tdep;
   int elf_flags;
   tdesc_arch_data_up tdesc_data;
   const struct target_desc *tdesc = info.target_desc;
@@ -963,7 +962,10 @@ rx_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
        arches != NULL;
        arches = gdbarch_list_lookup_by_info (arches->next, &info))
     {
-      if (gdbarch_tdep (arches->gdbarch)->elf_flags != elf_flags)
+      rx_gdbarch_tdep *tdep
+	= (rx_gdbarch_tdep *) gdbarch_tdep (arches->gdbarch);
+
+      if (tdep->elf_flags != elf_flags)
 	continue;
 
       return arches->gdbarch;
@@ -994,7 +996,7 @@ rx_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 
   gdb_assert(tdesc_data != NULL);
 
-  tdep = XCNEW (struct gdbarch_tdep);
+  rx_gdbarch_tdep *tdep = new rx_gdbarch_tdep;
   gdbarch = gdbarch_alloc (&info, tdep);
   tdep->elf_flags = elf_flags;
 
diff --git a/gdb/s12z-tdep.c b/gdb/s12z-tdep.c
index faf63c40305..ca4fe0a3c71 100644
--- a/gdb/s12z-tdep.c
+++ b/gdb/s12z-tdep.c
@@ -482,7 +482,7 @@ constexpr gdb_byte s12z_break_insn[] = {0x00};
 
 typedef BP_MANIPULATION (s12z_break_insn) s12z_breakpoint;
 
-struct gdbarch_tdep
+struct s12z_gdbarch_tdep : gdbarch_tdep
 {
 };
 
@@ -640,7 +640,7 @@ show_bdccsr_command (const char *args, int from_tty)
 static struct gdbarch *
 s12z_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 {
-  struct gdbarch_tdep *tdep = XNEW (struct gdbarch_tdep);
+  s12z_gdbarch_tdep *tdep = new s12z_gdbarch_tdep;
   struct gdbarch *gdbarch = gdbarch_alloc (&info, tdep);
 
   add_cmd ("bdccsr", class_support, show_bdccsr_command,
diff --git a/gdb/s390-linux-tdep.c b/gdb/s390-linux-tdep.c
index 04e3fc640d2..3fa0b65f0b6 100644
--- a/gdb/s390-linux-tdep.c
+++ b/gdb/s390-linux-tdep.c
@@ -79,7 +79,7 @@ static void
 s390_write_pc (struct regcache *regcache, CORE_ADDR pc)
 {
   struct gdbarch *gdbarch = regcache->arch ();
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   regcache_cooked_write_unsigned (regcache, tdep->pc_regnum, pc);
 
@@ -269,7 +269,7 @@ s390_iterate_over_regset_sections (struct gdbarch *gdbarch,
 				   void *cb_data,
 				   const struct regcache *regcache)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   const int gregset_size = (tdep->abi == ABI_LINUX_S390 ?
 			    s390_sizeof_gregset : s390x_sizeof_gregset);
 
@@ -390,7 +390,7 @@ s390_sigtramp_frame_unwind_cache (struct frame_info *this_frame,
 				  void **this_prologue_cache)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int word_size = gdbarch_ptr_bit (gdbarch) / 8;
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   struct s390_sigtramp_unwind_cache *info;
@@ -561,7 +561,7 @@ s390_linux_get_syscall_number (struct gdbarch *gdbarch,
 			       thread_info *thread)
 {
   struct regcache *regs = get_thread_regcache (thread);
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   ULONGEST pc;
   ULONGEST svc_number = -1;
@@ -594,7 +594,7 @@ static int
 s390_all_but_pc_registers_record (struct regcache *regcache)
 {
   struct gdbarch *gdbarch = regcache->arch ();
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int i;
 
   for (i = 0; i < 16; i++)
@@ -802,7 +802,7 @@ static int
 s390_linux_syscall_record (struct regcache *regcache, LONGEST syscall_native)
 {
   struct gdbarch *gdbarch = regcache->arch ();
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int ret;
   enum gdb_syscall syscall_gdb;
 
@@ -852,7 +852,7 @@ static int
 s390_linux_record_signal (struct gdbarch *gdbarch, struct regcache *regcache,
 			  enum gdb_signal signal)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   /* There are two kinds of signal frames on s390. rt_sigframe is always
      the larger one, so don't even bother with sigframe.  */
   const int sizeof_rt_sigframe = (tdep->abi == ABI_LINUX_ZSERIES ?
@@ -1116,7 +1116,7 @@ s390_init_linux_record_tdep (struct linux_record_tdep *record_tdep,
 static void
 s390_linux_init_abi_any (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   tdep->s390_syscall_record = s390_linux_syscall_record;
 
@@ -1151,7 +1151,7 @@ s390_linux_init_abi_any (struct gdbarch_info info, struct gdbarch *gdbarch)
 static void
 s390_linux_init_abi_31 (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   tdep->abi = ABI_LINUX_S390;
 
@@ -1167,7 +1167,7 @@ s390_linux_init_abi_31 (struct gdbarch_info info, struct gdbarch *gdbarch)
 static void
 s390_linux_init_abi_64 (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   tdep->abi = ABI_LINUX_ZSERIES;
 
diff --git a/gdb/s390-tdep.c b/gdb/s390-tdep.c
index 0a4a574787c..abbb094b11e 100644
--- a/gdb/s390-tdep.c
+++ b/gdb/s390-tdep.c
@@ -1045,7 +1045,7 @@ s390_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
 static int
 s390_register_call_saved (struct gdbarch *gdbarch, int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   switch (tdep->abi)
     {
@@ -1076,7 +1076,7 @@ s390_guess_tracepoint_registers (struct gdbarch *gdbarch,
 				 struct regcache *regcache,
 				 CORE_ADDR addr)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int sz = register_size (gdbarch, S390_PSWA_REGNUM);
   gdb_byte *reg = (gdb_byte *) alloca (sz);
   ULONGEST pswm, pswa;
@@ -1172,7 +1172,7 @@ enum { s390_dwarf_reg_r0l = ARRAY_SIZE (s390_dwarf_regmap) - 16 };
 static int
 s390_dwarf_reg_to_regnum (struct gdbarch *gdbarch, int reg)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int gdb_reg = -1;
 
   /* In a 32-on-64 debug scenario, debug info refers to the full
@@ -1205,7 +1205,7 @@ s390_dwarf_reg_to_regnum (struct gdbarch *gdbarch, int reg)
    These pseudo-registers are composed of two adjacent gprs.  */
 
 static int
-regnum_is_gpr_full (struct gdbarch_tdep *tdep, int regnum)
+regnum_is_gpr_full (s390_gdbarch_tdep *tdep, int regnum)
 {
   return (tdep->gpr_full_regnum != -1
 	  && regnum >= tdep->gpr_full_regnum
@@ -1216,7 +1216,7 @@ regnum_is_gpr_full (struct gdbarch_tdep *tdep, int regnum)
    These pseudo-registers are composed of f0-f15 and v0l-v15l.  */
 
 static int
-regnum_is_vxr_full (struct gdbarch_tdep *tdep, int regnum)
+regnum_is_vxr_full (s390_gdbarch_tdep *tdep, int regnum)
 {
   return (tdep->v0_full_regnum != -1
 	  && regnum >= tdep->v0_full_regnum
@@ -1231,7 +1231,7 @@ static struct value *
 s390_value_from_register (struct gdbarch *gdbarch, struct type *type,
 			  int regnum, struct frame_id frame_id)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   struct value *value = default_value_from_register (gdbarch, type,
 						     regnum, frame_id);
   check_typedef (type);
@@ -1250,7 +1250,7 @@ s390_value_from_register (struct gdbarch *gdbarch, struct type *type,
 static const char *
 s390_pseudo_register_name (struct gdbarch *gdbarch, int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (regnum == tdep->pc_regnum)
     return "pc";
@@ -1284,7 +1284,7 @@ s390_pseudo_register_name (struct gdbarch *gdbarch, int regnum)
 static struct type *
 s390_pseudo_register_type (struct gdbarch *gdbarch, int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (regnum == tdep->pc_regnum)
     return builtin_type (gdbarch)->builtin_func_ptr;
@@ -1308,7 +1308,7 @@ static enum register_status
 s390_pseudo_register_read (struct gdbarch *gdbarch, readable_regcache *regcache,
 			   int regnum, gdb_byte *buf)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   int regsize = register_size (gdbarch, regnum);
   ULONGEST val;
@@ -1383,7 +1383,7 @@ static void
 s390_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
 			    int regnum, const gdb_byte *buf)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   int regsize = register_size (gdbarch, regnum);
   ULONGEST val, psw;
@@ -1442,7 +1442,7 @@ static int
 s390_pseudo_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
 				 struct reggroup *group)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* We usually save/restore the whole PSW, which includes PC and CC.
      However, some older gdbservers may not support saving/restoring
@@ -1470,7 +1470,7 @@ static int
 s390_ax_pseudo_register_collect (struct gdbarch *gdbarch,
 				 struct agent_expr *ax, int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   if (regnum == tdep->pc_regnum)
     {
       ax_reg_mask (ax, S390_PSWA_REGNUM);
@@ -1504,7 +1504,7 @@ static int
 s390_ax_pseudo_register_push_stack (struct gdbarch *gdbarch,
 				    struct agent_expr *ax, int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   if (regnum == tdep->pc_regnum)
     {
       ax_reg (ax, S390_PSWA_REGNUM);
@@ -1746,7 +1746,7 @@ struct s390_arg_state
 
 static void
 s390_handle_arg (struct s390_arg_state *as, struct value *arg,
-		 struct gdbarch_tdep *tdep, int word_size,
+		 s390_gdbarch_tdep *tdep, int word_size,
 		 enum bfd_endian byte_order, int is_unnamed)
 {
   struct type *type = check_typedef (value_type (arg));
@@ -1905,7 +1905,7 @@ s390_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);
+  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int word_size = gdbarch_ptr_bit (gdbarch) / 8;
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   int i;
@@ -2083,11 +2083,14 @@ s390_return_value (struct gdbarch *gdbarch, struct value *function,
       rvc = RETURN_VALUE_STRUCT_CONVENTION;
       break;
     case TYPE_CODE_ARRAY:
-      rvc = (gdbarch_tdep (gdbarch)->vector_abi == S390_VECTOR_ABI_128
-	     && TYPE_LENGTH (type) <= 16 && type->is_vector ())
-	? RETURN_VALUE_REGISTER_CONVENTION
-	: RETURN_VALUE_STRUCT_CONVENTION;
-      break;
+      {
+	s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+	rvc = (tdep->vector_abi == S390_VECTOR_ABI_128
+	       && TYPE_LENGTH (type) <= 16 && type->is_vector ())
+	  ? RETURN_VALUE_REGISTER_CONVENTION
+	  : RETURN_VALUE_STRUCT_CONVENTION;
+	break;
+      }
     default:
       rvc = TYPE_LENGTH (type) <= 8
 	? RETURN_VALUE_REGISTER_CONVENTION
@@ -2165,7 +2168,7 @@ s390_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
 static CORE_ADDR
 s390_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   ULONGEST pc;
   pc = frame_unwind_register_unsigned (next_frame, tdep->pc_regnum);
   return gdbarch_addr_bits_remove (gdbarch, pc);
@@ -2187,7 +2190,7 @@ static struct value *
 s390_unwind_pseudo_register (struct frame_info *this_frame, int regnum)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   struct type *type = register_type (gdbarch, regnum);
 
   /* Unwind PC via PSW address.  */
@@ -2772,7 +2775,7 @@ static CORE_ADDR
 s390_record_address_mask (struct gdbarch *gdbarch, struct regcache *regcache,
 			  CORE_ADDR val)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   ULONGEST pswm, pswa;
   int am;
   if (tdep->abi == ABI_LINUX_S390)
@@ -2839,7 +2842,7 @@ s390_record_calc_disp_vsce (struct gdbarch *gdbarch, struct regcache *regcache,
 			    uint8_t vx, uint8_t el, uint8_t es, uint16_t bd,
 			    int8_t dh, CORE_ADDR *res)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   ULONGEST x;
   gdb_byte buf[16];
@@ -2882,7 +2885,7 @@ static int s390_popcnt (unsigned int x) {
 static int
 s390_record_gpr_g (struct gdbarch *gdbarch, struct regcache *regcache, int i)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + i))
     return -1;
   if (tdep->abi == ABI_LINUX_S390)
@@ -2896,7 +2899,7 @@ s390_record_gpr_g (struct gdbarch *gdbarch, struct regcache *regcache, int i)
 static int
 s390_record_gpr_h (struct gdbarch *gdbarch, struct regcache *regcache, int i)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   if (tdep->abi == ABI_LINUX_S390)
     {
       if (record_full_arch_list_add_reg (regcache, S390_R0_UPPER_REGNUM + i))
@@ -2936,7 +2939,7 @@ static int
 s390_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
 		     CORE_ADDR addr)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   uint16_t insn[3] = {0};
   /* Instruction as bytes.  */
   uint8_t ibyte[6];
@@ -6831,7 +6834,7 @@ while (0)
    tdesc.  */
 
 static bool
-s390_tdesc_valid (struct gdbarch_tdep *tdep,
+s390_tdesc_valid (s390_gdbarch_tdep *tdep,
 		  struct tdesc_arch_data *tdesc_data)
 {
   static const char *const psw[] = {
@@ -6983,10 +6986,10 @@ s390_tdesc_valid (struct gdbarch_tdep *tdep,
 /* Allocate and initialize new gdbarch_tdep.  Caller is responsible to free
    memory after use.  */
 
-static struct gdbarch_tdep *
+static s390_gdbarch_tdep *
 s390_gdbarch_tdep_alloc ()
 {
-  struct gdbarch_tdep *tdep = XCNEW (struct gdbarch_tdep);
+  s390_gdbarch_tdep *tdep = new s390_gdbarch_tdep;
 
   tdep->tdesc = NULL;
 
@@ -7023,7 +7026,7 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   static const char *const stap_register_indirection_suffixes[] = { ")",
 								    NULL };
 
-  struct gdbarch_tdep *tdep = s390_gdbarch_tdep_alloc ();
+  s390_gdbarch_tdep *tdep = s390_gdbarch_tdep_alloc ();
   struct gdbarch *gdbarch = gdbarch_alloc (&info, tdep);
   tdesc_arch_data_up tdesc_data = tdesc_data_alloc ();
   info.tdesc_data = tdesc_data.get ();
@@ -7153,7 +7156,7 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   /* Check any target description for validity.  */
   if (!s390_tdesc_valid (tdep, tdesc_data.get ()))
     {
-      xfree (tdep);
+      delete tdep;
       gdbarch_free (gdbarch);
       return NULL;
     }
@@ -7174,16 +7177,19 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
        arches != NULL;
        arches = gdbarch_list_lookup_by_info (arches->next, &info))
     {
-      struct gdbarch_tdep *tmp = gdbarch_tdep (arches->gdbarch);
+      s390_gdbarch_tdep *tmp
+	= (s390_gdbarch_tdep *) gdbarch_tdep (arches->gdbarch);
+
       if (!tmp)
 	continue;
+
       /* A program can 'choose' not to use the vector registers when they
 	 are present.  Leading to the same tdesc but different tdep and
 	 thereby a different gdbarch.  */
       if (tmp->vector_abi != tdep->vector_abi)
 	continue;
 
-      xfree (tdep);
+      delete tdep;
       gdbarch_free (gdbarch);
       return arches->gdbarch;
     }
diff --git a/gdb/s390-tdep.h b/gdb/s390-tdep.h
index 8c9d75a81fe..191977ecf50 100644
--- a/gdb/s390-tdep.h
+++ b/gdb/s390-tdep.h
@@ -37,32 +37,33 @@ enum s390_vector_abi_kind
 
 /* The tdep structure.  */
 
-struct gdbarch_tdep
+struct s390_gdbarch_tdep : gdbarch_tdep
 {
   /* Target description.  */
-  const struct target_desc *tdesc;
+  const struct target_desc *tdesc = nullptr;
 
   /* ABI version.  */
-  enum s390_abi_kind abi;
+  enum s390_abi_kind abi {};
 
   /* Vector ABI.  */
-  enum s390_vector_abi_kind vector_abi;
+  enum s390_vector_abi_kind vector_abi {};
 
   /* Pseudo register numbers.  */
-  int gpr_full_regnum;
-  int pc_regnum;
-  int cc_regnum;
-  int v0_full_regnum;
-
-  bool have_upper;
-  bool have_linux_v1;
-  bool have_linux_v2;
-  bool have_tdb;
-  bool have_vx;
-  bool have_gs;
+  int gpr_full_regnum = 0;
+  int pc_regnum = 0;
+  int cc_regnum = 0;
+  int v0_full_regnum = 0;
+
+  bool have_upper = 0;
+  bool have_linux_v1 = 0;
+  bool have_linux_v2 = 0;
+  bool have_tdb = 0;
+  bool have_vx = 0;
+  bool have_gs = 0;
 
   /* Hook to record OS specific systemcall.  */
-  int (*s390_syscall_record) (struct regcache *regcache, LONGEST svc_number);
+  int (*s390_syscall_record) (struct regcache *regcache, LONGEST svc_number)
+    = nullptr;
 };
 
 /* Decoding S/390 instructions.  */
diff --git a/gdb/sh-linux-tdep.c b/gdb/sh-linux-tdep.c
index 8315d46fddf..9d4bebb11aa 100644
--- a/gdb/sh-linux-tdep.c
+++ b/gdb/sh-linux-tdep.c
@@ -195,7 +195,7 @@ sh_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
   set_gdbarch_fetch_tls_load_module_address (gdbarch,
 					     svr4_fetch_objfile_link_map);
 
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  sh_gdbarch_tdep *tdep = (sh_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* Remember regset characteristics.  The sizes should match
      elf_gregset_t and elf_fpregset_t from Linux.  */
diff --git a/gdb/sh-netbsd-tdep.c b/gdb/sh-netbsd-tdep.c
index 0401eeef306..ddb2c7e1ea8 100644
--- a/gdb/sh-netbsd-tdep.c
+++ b/gdb/sh-netbsd-tdep.c
@@ -63,7 +63,7 @@ static void
 shnbsd_init_abi (struct gdbarch_info info,
 		  struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  sh_gdbarch_tdep *tdep = (sh_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   nbsd_init_abi (info, gdbarch);
 
   tdep->core_gregmap = (struct sh_corefile_regmap *)regmap;
diff --git a/gdb/sh-tdep.c b/gdb/sh-tdep.c
index f78eb2d73be..4346e78c5e9 100644
--- a/gdb/sh-tdep.c
+++ b/gdb/sh-tdep.c
@@ -1554,7 +1554,7 @@ sh_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
 static struct type *
 sh_littlebyte_bigword_type (struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  sh_gdbarch_tdep *tdep = (sh_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (tdep->sh_littlebyte_bigword_type == NULL)
     tdep->sh_littlebyte_bigword_type
@@ -2146,7 +2146,7 @@ sh_corefile_supply_regset (const struct regset *regset,
 			   int regnum, const void *regs, size_t len)
 {
   struct gdbarch *gdbarch = regcache->arch ();
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  sh_gdbarch_tdep *tdep = (sh_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   const struct sh_corefile_regmap *regmap = (regset == &sh_corefile_gregset
 					     ? tdep->core_gregmap
 					     : tdep->core_fpregmap);
@@ -2172,7 +2172,7 @@ sh_corefile_collect_regset (const struct regset *regset,
 			    int regnum, void *regs, size_t len)
 {
   struct gdbarch *gdbarch = regcache->arch ();
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  sh_gdbarch_tdep *tdep = (sh_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   const struct sh_corefile_regmap *regmap = (regset == &sh_corefile_gregset
 					     ? tdep->core_gregmap
 					     : tdep->core_fpregmap);
@@ -2210,7 +2210,7 @@ sh_iterate_over_regset_sections (struct gdbarch *gdbarch,
 				 void *cb_data,
 				 const struct regcache *regcache)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  sh_gdbarch_tdep *tdep = (sh_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (tdep->core_gregmap != NULL)
     cb (".reg", tdep->sizeof_gregset, tdep->sizeof_gregset,
@@ -2237,7 +2237,6 @@ static struct gdbarch *
 sh_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 {
   struct gdbarch *gdbarch;
-  struct gdbarch_tdep *tdep;
 
   /* If there is already a candidate, use it.  */
   arches = gdbarch_list_lookup_by_info (arches, &info);
@@ -2246,7 +2245,7 @@ sh_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 
   /* None found, create a new architecture from the information
      provided.  */
-  tdep = XCNEW (struct gdbarch_tdep);
+  sh_gdbarch_tdep *tdep = new sh_gdbarch_tdep;
   gdbarch = gdbarch_alloc (&info, tdep);
 
   set_gdbarch_short_bit (gdbarch, 2 * TARGET_CHAR_BIT);
diff --git a/gdb/sh-tdep.h b/gdb/sh-tdep.h
index 737b6dc6bdc..fce3f715f67 100644
--- a/gdb/sh-tdep.h
+++ b/gdb/sh-tdep.h
@@ -19,6 +19,8 @@
 #ifndef SH_TDEP_H
 #define SH_TDEP_H
 
+#include "gdbarch.h"
+
 /* Contributed by Steve Chamberlain sac@cygnus.com.  */
 
 /* Registers for all SH variants.  Used also by sh3-rom.c.  */
@@ -89,20 +91,20 @@ struct sh_corefile_regmap
   unsigned int offset;
 };
 
-struct gdbarch_tdep
+struct sh_gdbarch_tdep : gdbarch_tdep
 {
   /* Non-NULL when debugging from a core file.  Provides the offset
      where each general-purpose register is stored inside the associated
      core file section.  */
-  struct sh_corefile_regmap *core_gregmap;
-  int sizeof_gregset;
+  struct sh_corefile_regmap *core_gregmap = nullptr;
+  int sizeof_gregset = 0;
   /* Non-NULL when debugging from a core file and when FP registers are
      available.  Provides the offset where each FP register is stored
      inside the associated core file section.  */
-  struct sh_corefile_regmap *core_fpregmap;
-  int sizeof_fpregset;
+  struct sh_corefile_regmap *core_fpregmap = nullptr;
+  int sizeof_fpregset = 0;
   /* ISA-specific data types.  */
-  struct type *sh_littlebyte_bigword_type;
+  struct type *sh_littlebyte_bigword_type = nullptr;
 };
 
 extern const struct regset sh_corefile_gregset;
diff --git a/gdb/sparc-linux-tdep.c b/gdb/sparc-linux-tdep.c
index 4ad77e24d82..9c46919e72b 100644
--- a/gdb/sparc-linux-tdep.c
+++ b/gdb/sparc-linux-tdep.c
@@ -253,7 +253,8 @@ sparc32_linux_collect_core_fpregset (const struct regset *regset,
 static void
 sparc_linux_write_pc (struct regcache *regcache, CORE_ADDR pc)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (regcache->arch ());
+  gdbarch *arch = regcache->arch ();
+  sparc_gdbarch_tdep *tdep = (sparc_gdbarch_tdep *) gdbarch_tdep (arch);
   ULONGEST psr;
 
   regcache_cooked_write_unsigned (regcache, tdep->pc_regnum, pc);
@@ -420,7 +421,7 @@ static const struct regset sparc32_linux_fpregset =
 static void
 sparc32_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  sparc_gdbarch_tdep *tdep = (sparc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   linux_init_abi (info, gdbarch, 0);
 
diff --git a/gdb/sparc-netbsd-tdep.c b/gdb/sparc-netbsd-tdep.c
index e34405c849e..e600447ab99 100644
--- a/gdb/sparc-netbsd-tdep.c
+++ b/gdb/sparc-netbsd-tdep.c
@@ -295,7 +295,7 @@ static const struct regset sparc32nbsd_fpregset =
 void
 sparc32nbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  sparc_gdbarch_tdep *tdep = (sparc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   nbsd_init_abi (info, gdbarch);
 
diff --git a/gdb/sparc-sol2-tdep.c b/gdb/sparc-sol2-tdep.c
index f2144493738..94e8a121a4c 100644
--- a/gdb/sparc-sol2-tdep.c
+++ b/gdb/sparc-sol2-tdep.c
@@ -196,7 +196,7 @@ static const struct frame_unwind sparc32_sol2_sigtramp_frame_unwind =
 static void
 sparc32_sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  sparc_gdbarch_tdep *tdep = (sparc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   tdep->gregset = &sparc32_sol2_gregset;
   tdep->sizeof_gregset = 152;
diff --git a/gdb/sparc-tdep.c b/gdb/sparc-tdep.c
index 7302929c9b7..31916b60ddb 100644
--- a/gdb/sparc-tdep.c
+++ b/gdb/sparc-tdep.c
@@ -429,7 +429,7 @@ sparc32_register_name (struct gdbarch *gdbarch, int regnum)
 static struct type *
 sparc_psr_type (struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  sparc_gdbarch_tdep *tdep = (sparc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (!tdep->sparc_psr_type)
     {
@@ -451,7 +451,7 @@ sparc_psr_type (struct gdbarch *gdbarch)
 static struct type *
 sparc_fsr_type (struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  sparc_gdbarch_tdep *tdep = (sparc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (!tdep->sparc_fsr_type)
     {
@@ -992,7 +992,7 @@ CORE_ADDR
 sparc_analyze_prologue (struct gdbarch *gdbarch, CORE_ADDR pc,
 			CORE_ADDR current_pc, struct sparc_frame_cache *cache)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  sparc_gdbarch_tdep *tdep = (sparc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   unsigned long insn;
   int offset = 0;
   int dest = -1;
@@ -1684,8 +1684,9 @@ sparc_analyze_control_transfer (struct regcache *regcache,
       struct frame_info *frame = get_current_frame ();
 
       /* Trap instruction (TRAP).  */
-      return gdbarch_tdep (regcache->arch ())->step_trap (frame,
-								     insn);
+      gdbarch *arch = regcache->arch ();
+      sparc_gdbarch_tdep *tdep = (sparc_gdbarch_tdep *) gdbarch_tdep (arch);
+      return tdep->step_trap (frame, insn);
     }
 
   /* FIXME: Handle DONE and RETRY instructions.  */
@@ -1735,7 +1736,7 @@ static std::vector<CORE_ADDR>
 sparc_software_single_step (struct regcache *regcache)
 {
   struct gdbarch *arch = regcache->arch ();
-  struct gdbarch_tdep *tdep = gdbarch_tdep (arch);
+  sparc_gdbarch_tdep *tdep = (sparc_gdbarch_tdep *) gdbarch_tdep (arch);
   CORE_ADDR npc, nnpc;
 
   CORE_ADDR pc, orig_npc;
@@ -1764,7 +1765,8 @@ sparc_software_single_step (struct regcache *regcache)
 static void
 sparc_write_pc (struct regcache *regcache, CORE_ADDR pc)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (regcache->arch ());
+  gdbarch *arch = regcache->arch ();
+  sparc_gdbarch_tdep *tdep = (sparc_gdbarch_tdep *) gdbarch_tdep (arch);
 
   regcache_cooked_write_unsigned (regcache, tdep->pc_regnum, pc);
   regcache_cooked_write_unsigned (regcache, tdep->npc_regnum, pc + 4);
@@ -1779,7 +1781,7 @@ sparc_iterate_over_regset_sections (struct gdbarch *gdbarch,
 				    void *cb_data,
 				    const struct regcache *regcache)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  sparc_gdbarch_tdep *tdep = (sparc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   cb (".reg", tdep->sizeof_gregset, tdep->sizeof_gregset, tdep->gregset, NULL,
       cb_data);
@@ -1814,7 +1816,6 @@ validate_tdesc_registers (const struct target_desc *tdesc,
 static struct gdbarch *
 sparc32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 {
-  struct gdbarch_tdep *tdep;
   const struct target_desc *tdesc = info.target_desc;
   struct gdbarch *gdbarch;
   int valid_p = 1;
@@ -1825,7 +1826,7 @@ sparc32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
     return arches->gdbarch;
 
   /* Allocate space for the new architecture.  */
-  tdep = XCNEW (struct gdbarch_tdep);
+  sparc_gdbarch_tdep *tdep = new sparc_gdbarch_tdep;
   gdbarch = gdbarch_alloc (&info, tdep);
 
   tdep->pc_regnum = SPARC32_PC_REGNUM;
diff --git a/gdb/sparc-tdep.h b/gdb/sparc-tdep.h
index c0cfd09a6de..ceedb2cb595 100644
--- a/gdb/sparc-tdep.h
+++ b/gdb/sparc-tdep.h
@@ -20,6 +20,8 @@
 #ifndef SPARC_TDEP_H
 #define SPARC_TDEP_H 1
 
+#include "gdbarch.h"
+
 #define SPARC_CORE_REGISTERS                      \
   "g0", "g1", "g2", "g3", "g4", "g5", "g6", "g7", \
   "o0", "o1", "o2", "o3", "o4", "o5", "sp", "o7", \
@@ -55,43 +57,44 @@ struct sparc_fpregmap
 
 /* SPARC architecture-specific information.  */
 
-struct gdbarch_tdep
+struct sparc_gdbarch_tdep : gdbarch_tdep
 {
   /* Register numbers for the PN and nPC registers.  The definitions
      for (64-bit) UltraSPARC differ from the (32-bit) SPARC
      definitions.  */
-  int pc_regnum;
-  int npc_regnum;
+  int pc_regnum = 0;
+  int npc_regnum = 0;
 
   /* Register names specific for architecture (sparc32 vs. sparc64) */
-  const char * const *fpu_register_names;
-  size_t fpu_registers_num;
-  const char * const *cp0_register_names;
-  size_t cp0_registers_num;
+  const char * const *fpu_register_names = nullptr;
+  size_t fpu_registers_num = 0;
+  const char * const *cp0_register_names = nullptr;
+  size_t cp0_registers_num = 0;
 
   /* Register sets.  */
-  const struct regset *gregset;
-  size_t sizeof_gregset;
-  const struct regset *fpregset;
-  size_t sizeof_fpregset;
+  const struct regset *gregset = nullptr;
+  size_t sizeof_gregset = 0;
+  const struct regset *fpregset = nullptr;
+  size_t sizeof_fpregset = 0;
 
   /* Offset of saved PC in jmp_buf.  */
-  int jb_pc_offset;
+  int jb_pc_offset = 0;
 
   /* Size of an Procedure Linkage Table (PLT) entry, 0 if we shouldn't
      treat the PLT special when doing prologue analysis.  */
-  size_t plt_entry_size;
+  size_t plt_entry_size = 0;
 
   /* Alternative location for trap return.  Used for single-stepping.  */
-  CORE_ADDR (*step_trap) (struct frame_info *frame, unsigned long insn);
+  CORE_ADDR (*step_trap) (struct frame_info *frame, unsigned long insn)
+    = nullptr;
 
   /* ISA-specific data types.  */
-  struct type *sparc_psr_type;
-  struct type *sparc_fsr_type;
-  struct type *sparc64_ccr_type;
-  struct type *sparc64_pstate_type;
-  struct type *sparc64_fsr_type;
-  struct type *sparc64_fprs_type;
+  struct type *sparc_psr_type = nullptr;
+  struct type *sparc_fsr_type = nullptr;
+  struct type *sparc64_ccr_type = nullptr;
+  struct type *sparc64_pstate_type = nullptr;
+  struct type *sparc64_fsr_type = nullptr;
+  struct type *sparc64_fprs_type = nullptr;
 };
 
 /* Register numbers of various important registers.  */
diff --git a/gdb/sparc64-fbsd-tdep.c b/gdb/sparc64-fbsd-tdep.c
index 6dad813c356..d52162a55a9 100644
--- a/gdb/sparc64-fbsd-tdep.c
+++ b/gdb/sparc64-fbsd-tdep.c
@@ -222,7 +222,7 @@ static const struct regset sparc64fbsd_fpregset =
 static void
 sparc64fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  sparc_gdbarch_tdep *tdep = (sparc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* Generic FreeBSD support. */
   fbsd_init_abi (info, gdbarch);
diff --git a/gdb/sparc64-linux-tdep.c b/gdb/sparc64-linux-tdep.c
index e63fa87c69b..5b9cc904656 100644
--- a/gdb/sparc64-linux-tdep.c
+++ b/gdb/sparc64-linux-tdep.c
@@ -261,7 +261,8 @@ sparc64_linux_collect_core_fpregset (const struct regset *regset,
 static void
 sparc64_linux_write_pc (struct regcache *regcache, CORE_ADDR pc)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (regcache->arch ());
+  gdbarch *arch = regcache->arch ();
+  sparc_gdbarch_tdep *tdep = (sparc_gdbarch_tdep *) gdbarch_tdep (arch);
   ULONGEST state;
 
   regcache_cooked_write_unsigned (regcache, tdep->pc_regnum, pc);
@@ -363,7 +364,7 @@ static const struct regset sparc64_linux_fpregset =
 static void
 sparc64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  sparc_gdbarch_tdep *tdep = (sparc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   linux_init_abi (info, gdbarch, 0);
 
diff --git a/gdb/sparc64-netbsd-tdep.c b/gdb/sparc64-netbsd-tdep.c
index 0438093563e..81e37631d15 100644
--- a/gdb/sparc64-netbsd-tdep.c
+++ b/gdb/sparc64-netbsd-tdep.c
@@ -248,7 +248,7 @@ static const struct regset sparc64nbsd_fpregset =
 static void
 sparc64nbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  sparc_gdbarch_tdep *tdep = (sparc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   nbsd_init_abi (info, gdbarch);
 
diff --git a/gdb/sparc64-obsd-tdep.c b/gdb/sparc64-obsd-tdep.c
index 033779e273d..0931b23b92c 100644
--- a/gdb/sparc64-obsd-tdep.c
+++ b/gdb/sparc64-obsd-tdep.c
@@ -423,7 +423,7 @@ static const struct regset sparc64obsd_fpregset =
 static void
 sparc64obsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  sparc_gdbarch_tdep *tdep = (sparc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   tdep->gregset = &sparc64obsd_gregset;
   tdep->sizeof_gregset = 288;
diff --git a/gdb/sparc64-sol2-tdep.c b/gdb/sparc64-sol2-tdep.c
index 6aea8bd56d7..6c1fe192cb6 100644
--- a/gdb/sparc64-sol2-tdep.c
+++ b/gdb/sparc64-sol2-tdep.c
@@ -199,7 +199,7 @@ static const struct frame_unwind sparc64_sol2_sigtramp_frame_unwind =
 static void
 sparc64_sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  sparc_gdbarch_tdep *tdep = (sparc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   tdep->gregset = &sparc64_sol2_gregset;
   tdep->sizeof_gregset = 304;
diff --git a/gdb/sparc64-tdep.c b/gdb/sparc64-tdep.c
index c0d31599570..cb698304d62 100644
--- a/gdb/sparc64-tdep.c
+++ b/gdb/sparc64-tdep.c
@@ -648,7 +648,7 @@ sparc64_structure_or_union_p (const struct type *type)
 static struct type *
 sparc64_pstate_type (struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  sparc_gdbarch_tdep *tdep = (sparc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (!tdep->sparc64_pstate_type)
     {
@@ -675,7 +675,7 @@ sparc64_pstate_type (struct gdbarch *gdbarch)
 static struct type *
 sparc64_ccr_type (struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  sparc_gdbarch_tdep *tdep = (sparc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (tdep->sparc64_ccr_type == NULL)
     {
@@ -700,7 +700,7 @@ sparc64_ccr_type (struct gdbarch *gdbarch)
 static struct type *
 sparc64_fsr_type (struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  sparc_gdbarch_tdep *tdep = (sparc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (!tdep->sparc64_fsr_type)
     {
@@ -733,7 +733,7 @@ sparc64_fsr_type (struct gdbarch *gdbarch)
 static struct type *
 sparc64_fprs_type (struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  sparc_gdbarch_tdep *tdep = (sparc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (!tdep->sparc64_fprs_type)
     {
@@ -1806,7 +1806,7 @@ sparc64_addr_bits_remove (struct gdbarch *gdbarch, CORE_ADDR addr)
 void
 sparc64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  sparc_gdbarch_tdep *tdep = (sparc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   tdep->pc_regnum = SPARC64_PC_REGNUM;
   tdep->npc_regnum = SPARC64_NPC_REGNUM;
diff --git a/gdb/tic6x-linux-tdep.c b/gdb/tic6x-linux-tdep.c
index 4e165ec139d..ff5fec81375 100644
--- a/gdb/tic6x-linux-tdep.c
+++ b/gdb/tic6x-linux-tdep.c
@@ -45,7 +45,7 @@ static const gdb_byte tic6x_bkpt_bnop_le[] = { 0x22, 0xa1, 0x00, 0x00 };
 static unsigned int
 tic6x_register_sigcontext_offset (unsigned int regnum, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  tic6x_gdbarch_tdep *tdep = (tic6x_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (regnum == TIC6X_A4_REGNUM || regnum == TIC6X_A4_REGNUM + 2
       || regnum == TIC6X_A4_REGNUM + 4)
@@ -92,7 +92,7 @@ tic6x_linux_rt_sigreturn_init (const struct tramp_frame *self,
 		    + TIC6X_SIGINFO_SIZE
 		    + 4 + 4 /* uc_flags and *uc_link in struct ucontext.  */
 		    + TIC6X_STACK_T_SIZE);
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  tic6x_gdbarch_tdep *tdep = (tic6x_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   unsigned int reg_offset;
   unsigned int i;
 
@@ -165,7 +165,7 @@ extern struct target_so_ops dsbt_so_ops;
 static void
 tic6x_uclinux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  tic6x_gdbarch_tdep *tdep = (tic6x_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   linux_init_abi (info, gdbarch, 0);
 
diff --git a/gdb/tic6x-tdep.c b/gdb/tic6x-tdep.c
index afa034c9942..7b1d83bd637 100644
--- a/gdb/tic6x-tdep.c
+++ b/gdb/tic6x-tdep.c
@@ -325,7 +325,7 @@ tic6x_breakpoint_kind_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr)
 static const gdb_byte *
 tic6x_sw_breakpoint_from_kind (struct gdbarch *gdbarch, int kind, int *size)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  tic6x_gdbarch_tdep *tdep = (tic6x_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   *size = kind;
 
@@ -598,7 +598,8 @@ tic6x_get_next_pc (struct regcache *regcache, CORE_ADDR pc)
 
       if (inst == TIC6X_INST_SWE)
 	{
-	  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+	  tic6x_gdbarch_tdep *tdep
+	    = (tic6x_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
 	  if (tdep->syscall_next_pc != NULL)
 	    return tdep->syscall_next_pc (get_current_frame ());
@@ -1141,7 +1142,6 @@ static struct gdbarch *
 tic6x_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 {
   struct gdbarch *gdbarch;
-  struct gdbarch_tdep *tdep;
   tdesc_arch_data_up tdesc_data;
   const struct target_desc *tdesc = info.target_desc;
   int has_gp = 0;
@@ -1216,7 +1216,8 @@ tic6x_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
        arches != NULL;
        arches = gdbarch_list_lookup_by_info (arches->next, &info))
     {
-      tdep = gdbarch_tdep (arches->gdbarch);
+      tic6x_gdbarch_tdep *tdep
+	= (tic6x_gdbarch_tdep *) gdbarch_tdep (arches->gdbarch);
 
       if (has_gp != tdep->has_gp)
 	continue;
@@ -1225,7 +1226,7 @@ tic6x_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 	return arches->gdbarch;
     }
 
-  tdep = XCNEW (struct gdbarch_tdep);
+  tic6x_gdbarch_tdep *tdep = new tic6x_gdbarch_tdep;
 
   tdep->has_gp = has_gp;
   gdbarch = gdbarch_alloc (&info, tdep);
diff --git a/gdb/tic6x-tdep.h b/gdb/tic6x-tdep.h
index 7d5587ab525..bb79a0dd95d 100644
--- a/gdb/tic6x-tdep.h
+++ b/gdb/tic6x-tdep.h
@@ -20,6 +20,8 @@
 #ifndef TIC6X_TDEP_H
 #define TIC6X_TDEP_H
 
+#include "gdbarch.h"
+
 enum
 {
   TIC6X_A4_REGNUM = 4,
@@ -44,15 +46,15 @@ extern const gdb_byte tic6x_bkpt_illegal_opcode_be[];
 extern const gdb_byte tic6x_bkpt_illegal_opcode_le[];
 
 /* Target-dependent structure in gdbarch.  */
-struct gdbarch_tdep
+struct tic6x_gdbarch_tdep : gdbarch_tdep
 {
   /* Return the expected next PC if FRAME is stopped at a syscall
      instruction.  */
-  CORE_ADDR (*syscall_next_pc) (struct frame_info *frame);
+  CORE_ADDR (*syscall_next_pc) (struct frame_info *frame) = nullptr;
 
-  const gdb_byte *breakpoint; /* Breakpoint instruction.  */
+  const gdb_byte *breakpoint = nullptr; /* Breakpoint instruction.  */
 
-  int has_gp; /* Has general purpose registers A16 - A31 and B16 - B31.  */
+  int has_gp = 0; /* Has general purpose registers A16 - A31 and B16 - B31.  */
 };
 
 #endif /* TIC6X_TDEP_H */
diff --git a/gdb/v850-tdep.c b/gdb/v850-tdep.c
index f829f4db2dd..70f6d42a95b 100644
--- a/gdb/v850-tdep.c
+++ b/gdb/v850-tdep.c
@@ -264,15 +264,15 @@ enum v850_abi
 
 /* Architecture specific data.  */
 
-struct gdbarch_tdep
+struct v850_gdbarch_tdep : gdbarch_tdep
 {
   /* Fields from the ELF header.  */
-  int e_flags;
-  int e_machine;
+  int e_flags = 0;
+  int e_machine = 0;
 
   /* Which ABI are we using?  */
-  enum v850_abi abi;
-  int eight_byte_align;
+  enum v850_abi abi {};
+  int eight_byte_align = 0;
 };
 
 struct v850_frame_cache
@@ -510,8 +510,9 @@ v850_use_struct_convention (struct gdbarch *gdbarch, struct type *type)
 {
   int i;
   struct type *fld_type, *tgt_type;
+  v850_gdbarch_tdep *tdep = (v850_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
-  if (gdbarch_tdep (gdbarch)->abi == V850_ABI_RH850)
+  if (tdep->abi == V850_ABI_RH850)
     {
       if (v850_type_is_scalar (type) && TYPE_LENGTH(type) <= 8)
 	return 0;
@@ -1021,8 +1022,9 @@ v850_push_dummy_call (struct gdbarch *gdbarch,
   int argnum;
   int arg_space = 0;
   int stack_offset;
+  v850_gdbarch_tdep *tdep = (v850_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
-  if (gdbarch_tdep (gdbarch)->abi == V850_ABI_RH850)
+  if (tdep->abi == V850_ABI_RH850)
     stack_offset = 0;
   else
     {
@@ -1054,7 +1056,7 @@ v850_push_dummy_call (struct gdbarch *gdbarch,
       gdb_byte valbuf[v850_reg_size];
 
       if (!v850_type_is_scalar (value_type (*args))
-	 && gdbarch_tdep (gdbarch)->abi == V850_ABI_GCC
+	  && tdep->abi == V850_ABI_GCC
 	  && TYPE_LENGTH (value_type (*args)) > E_MAX_RETTYPE_SIZE_IN_REGS)
 	{
 	  store_unsigned_integer (valbuf, 4, byte_order,
@@ -1068,7 +1070,7 @@ v850_push_dummy_call (struct gdbarch *gdbarch,
 	  val = (gdb_byte *) value_contents (*args).data ();
 	}
 
-      if (gdbarch_tdep (gdbarch)->eight_byte_align
+      if (tdep->eight_byte_align
 	  && v850_eight_byte_align_p (value_type (*args)))
 	{
 	  if (argreg <= E_ARGLAST_REGNUM && (argreg & 1))
@@ -1348,7 +1350,6 @@ static struct gdbarch *
 v850_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 {
   struct gdbarch *gdbarch;
-  struct gdbarch_tdep *tdep;
   int e_flags, e_machine;
 
   /* Extract the elf_flags if available.  */
@@ -1371,13 +1372,16 @@ v850_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
        arches != NULL;
        arches = gdbarch_list_lookup_by_info (arches->next, &info))
     {
-      if (gdbarch_tdep (arches->gdbarch)->e_flags != e_flags
-	  || gdbarch_tdep (arches->gdbarch)->e_machine != e_machine)
+      v850_gdbarch_tdep *tdep
+	= (v850_gdbarch_tdep *) gdbarch_tdep (arches->gdbarch);
+
+      if (tdep->e_flags != e_flags || tdep->e_machine != e_machine)
 	continue;
 
       return arches->gdbarch;
     }
-  tdep = XCNEW (struct gdbarch_tdep);
+
+  v850_gdbarch_tdep *tdep = new v850_gdbarch_tdep;
   tdep->e_flags = e_flags;
   tdep->e_machine = e_machine;
 
diff --git a/gdb/xtensa-config.c b/gdb/xtensa-config.c
index 2c21c788996..57a9ff0b98d 100644
--- a/gdb/xtensa-config.c
+++ b/gdb/xtensa-config.c
@@ -62,7 +62,7 @@ const xtensa_mask_t xtensa_mask15 = { 1, xtensa_submask15 };
 
 
 /* Register map.  */
-xtensa_register_t rmap[] = 
+static xtensa_register_t rmap[] =
 {
   /*    idx ofs bi sz al targno  flags cp typ group name  */
   XTREG(  0,  0,32, 4, 4,0x0020,0x0006,-2, 9,0x0100,pc,          0,0,0,0,0,0)
@@ -213,9 +213,4 @@ xtensa_register_t rmap[] =
   XTREG_END
 };
 
-
-
-#ifdef XTENSA_CONFIG_INSTANTIATE
-XTENSA_CONFIG_INSTANTIATE(rmap,0)
-#endif
-
+xtensa_gdbarch_tdep xtensa_tdep (rmap);
diff --git a/gdb/xtensa-linux-tdep.c b/gdb/xtensa-linux-tdep.c
index c9e2519b1e7..b24ebc5f17c 100644
--- a/gdb/xtensa-linux-tdep.c
+++ b/gdb/xtensa-linux-tdep.c
@@ -99,7 +99,7 @@ xtensa_linux_gdb_signal_to_target (struct gdbarch *gdbarch,
 static void
 xtensa_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (tdep->num_nopriv_regs < tdep->num_regs)
     {
diff --git a/gdb/xtensa-tdep.c b/gdb/xtensa-tdep.c
index 42bff4c818f..f09d2335559 100644
--- a/gdb/xtensa-tdep.c
+++ b/gdb/xtensa-tdep.c
@@ -86,13 +86,13 @@ static unsigned int xtensa_debug_level = 0;
 #define TX_PS			0x20
 
 /* ABI-independent macros.  */
-#define ARG_NOF(gdbarch) \
-  (gdbarch_tdep (gdbarch)->call_abi \
+#define ARG_NOF(tdep) \
+  (tdep->call_abi \
    == CallAbiCall0Only ? C0_NARGS : (ARGS_NUM_REGS))
-#define ARG_1ST(gdbarch) \
-  (gdbarch_tdep (gdbarch)->call_abi  == CallAbiCall0Only \
-   ? (gdbarch_tdep (gdbarch)->a0_base + C0_ARGS) \
-   : (gdbarch_tdep (gdbarch)->a0_base + 6))
+#define ARG_1ST(tdep) \
+  (tdep->call_abi  == CallAbiCall0Only \
+   ? (tdep->a0_base + C0_ARGS) \
+   : (tdep->a0_base + 6))
 
 /* XTENSA_IS_ENTRY tests whether the first byte of an instruction
    indicates that the instruction is an ENTRY instruction.  */
@@ -116,8 +116,10 @@ static unsigned int xtensa_debug_level = 0;
 static int
 windowing_enabled (struct gdbarch *gdbarch, unsigned int ps)
 {
+  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+
   /* If we know CALL0 ABI is set explicitly,  say it is Call0.  */
-  if (gdbarch_tdep (gdbarch)->call_abi == CallAbiCall0Only)
+  if (tdep->call_abi == CallAbiCall0Only)
     return 0;
 
   return ((ps & PS_EXC) == 0 && (ps & PS_WOE) != 0);
@@ -128,7 +130,7 @@ windowing_enabled (struct gdbarch *gdbarch, unsigned int ps)
 static int
 arreg_number (struct gdbarch *gdbarch, int a_regnum, ULONGEST wb)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int arreg;
 
   arreg = a_regnum - tdep->a0_base;
@@ -143,7 +145,7 @@ arreg_number (struct gdbarch *gdbarch, int a_regnum, ULONGEST wb)
 static int
 areg_number (struct gdbarch *gdbarch, int ar_regnum, unsigned int wb)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int areg;
 
   areg = ar_regnum - tdep->ar_base;
@@ -224,10 +226,10 @@ static int
 xtensa_find_register_by_name (struct gdbarch *gdbarch, const char *name)
 {
   int i;
+  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   for (i = 0; i < gdbarch_num_cooked_regs (gdbarch); i++)
-
-    if (strcasecmp (gdbarch_tdep (gdbarch)->regmap[i].name, name) == 0)
+    if (strcasecmp (tdep->regmap[i].name, name) == 0)
       return i;
 
   return -1;
@@ -237,9 +239,11 @@ xtensa_find_register_by_name (struct gdbarch *gdbarch, const char *name)
 static const char *
 xtensa_register_name (struct gdbarch *gdbarch, int regnum)
 {
+  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+
   /* Return the name stored in the register map.  */
   if (regnum >= 0 && regnum < gdbarch_num_cooked_regs (gdbarch))
-    return gdbarch_tdep (gdbarch)->regmap[regnum].name;
+    return tdep->regmap[regnum].name;
 
   internal_error (__FILE__, __LINE__, _("invalid register %d"), regnum);
   return 0;
@@ -250,7 +254,7 @@ xtensa_register_name (struct gdbarch *gdbarch, int regnum)
 static struct type *
 xtensa_register_type (struct gdbarch *gdbarch, int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* Return signed integer for ARx and Ax registers.  */
   if ((regnum >= tdep->ar_base
@@ -335,12 +339,13 @@ static int
 xtensa_reg_to_regnum (struct gdbarch *gdbarch, int regnum)
 {
   int i;
+  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (regnum >= 0 && regnum < 16)
-    return gdbarch_tdep (gdbarch)->a0_base + regnum;
+    return tdep->a0_base + regnum;
 
   for (i = 0; i < gdbarch_num_cooked_regs (gdbarch); i++)
-    if (regnum == gdbarch_tdep (gdbarch)->regmap[i].target_number)
+    if (regnum == tdep->regmap[i].target_number)
       return i;
 
   return -1;
@@ -537,16 +542,17 @@ xtensa_pseudo_register_read (struct gdbarch *gdbarch,
 {
   DEBUGTRACE ("xtensa_pseudo_register_read (... regnum = %d (%s) ...)\n",
 	      regnum, xtensa_register_name (gdbarch, regnum));
+  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* Read aliases a0..a15, if this is a Windowed ABI.  */
-  if (gdbarch_tdep (gdbarch)->isa_use_windowed_registers
-      && (regnum >= gdbarch_tdep (gdbarch)->a0_base)
-      && (regnum <= gdbarch_tdep (gdbarch)->a0_base + 15))
+  if (tdep->isa_use_windowed_registers
+      && (regnum >= tdep->a0_base)
+      && (regnum <= tdep->a0_base + 15))
     {
       ULONGEST value;
       enum register_status status;
 
-      status = regcache->raw_read (gdbarch_tdep (gdbarch)->wb_regnum,
+      status = regcache->raw_read (tdep->wb_regnum,
 				   &value);
       if (status != REG_VALID)
 	return status;
@@ -560,8 +566,8 @@ xtensa_pseudo_register_read (struct gdbarch *gdbarch,
   /* We have to find out how to deal with priveleged registers.
      Let's treat them as pseudo-registers, but we cannot read/write them.  */
      
-  else if (gdbarch_tdep (gdbarch)->call_abi == CallAbiCall0Only
-	   || regnum < gdbarch_tdep (gdbarch)->a0_base)
+  else if (tdep->call_abi == CallAbiCall0Only
+	   || regnum < tdep->a0_base)
     {
       buffer[0] = (gdb_byte)0;
       buffer[1] = (gdb_byte)0;
@@ -572,9 +578,9 @@ xtensa_pseudo_register_read (struct gdbarch *gdbarch,
   /* Pseudo registers.  */
   else if (regnum >= 0 && regnum < gdbarch_num_cooked_regs (gdbarch))
     {
-      xtensa_register_t *reg = &gdbarch_tdep (gdbarch)->regmap[regnum];
+      xtensa_register_t *reg = &tdep->regmap[regnum];
       xtensa_register_type_t type = reg->type;
-      int flags = gdbarch_tdep (gdbarch)->target_flags;
+      int flags = tdep->target_flags;
 
       /* We cannot read Unknown or Unmapped registers.  */
       if (type == xtRegisterTypeUnmapped || type == xtRegisterTypeUnknown)
@@ -628,15 +634,16 @@ xtensa_pseudo_register_write (struct gdbarch *gdbarch,
 {
   DEBUGTRACE ("xtensa_pseudo_register_write (... regnum = %d (%s) ...)\n",
 	      regnum, xtensa_register_name (gdbarch, regnum));
+  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* Renumber register, if aliases a0..a15 on Windowed ABI.  */
-  if (gdbarch_tdep (gdbarch)->isa_use_windowed_registers
-      && (regnum >= gdbarch_tdep (gdbarch)->a0_base)
-      && (regnum <= gdbarch_tdep (gdbarch)->a0_base + 15))
+  if (tdep->isa_use_windowed_registers
+      && (regnum >= tdep->a0_base)
+      && (regnum <= tdep->a0_base + 15))
     {
       ULONGEST value;
       regcache_raw_read_unsigned (regcache,
-				  gdbarch_tdep (gdbarch)->wb_regnum, &value);
+				  tdep->wb_regnum, &value);
       regnum = arreg_number (gdbarch, regnum, value);
     }
 
@@ -648,16 +655,16 @@ xtensa_pseudo_register_write (struct gdbarch *gdbarch,
   /* We have to find out how to deal with priveleged registers.
      Let's treat them as pseudo-registers, but we cannot read/write them.  */
 
-  else if (regnum < gdbarch_tdep (gdbarch)->a0_base)
+  else if (regnum < tdep->a0_base)
     {
       return;
     }
   /* Pseudo registers.  */
   else if (regnum >= 0 && regnum < gdbarch_num_cooked_regs (gdbarch))
     {
-      xtensa_register_t *reg = &gdbarch_tdep (gdbarch)->regmap[regnum];
+      xtensa_register_t *reg = &tdep->regmap[regnum];
       xtensa_register_type_t type = reg->type;
-      int flags = gdbarch_tdep (gdbarch)->target_flags;
+      int flags = tdep->target_flags;
 
       /* On most targets, we cannot write registers
 	 of type "Unknown" or "Unmapped".  */
@@ -770,7 +777,8 @@ xtensa_register_reggroup_p (struct gdbarch *gdbarch,
 			    int regnum,
 			    struct reggroup *group)
 {
-  xtensa_register_t* reg = &gdbarch_tdep (gdbarch)->regmap[regnum];
+  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+  xtensa_register_t* reg = &tdep->regmap[regnum];
   xtensa_register_type_t type = reg->type;
   xtensa_register_group_t rg = reg->group;
   int cp_number;
@@ -823,6 +831,7 @@ xtensa_supply_gregset (const struct regset *regset,
 {
   const xtensa_elf_gregset_t *regs = (const xtensa_elf_gregset_t *) gregs;
   struct gdbarch *gdbarch = rc->arch ();
+  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int i;
 
   DEBUGTRACE ("xtensa_supply_gregset (..., regnum==%d, ...)\n", regnum);
@@ -831,33 +840,33 @@ xtensa_supply_gregset (const struct regset *regset,
     rc->raw_supply (gdbarch_pc_regnum (gdbarch), (char *) &regs->pc);
   if (regnum == gdbarch_ps_regnum (gdbarch) || regnum == -1)
     rc->raw_supply (gdbarch_ps_regnum (gdbarch), (char *) &regs->ps);
-  if (regnum == gdbarch_tdep (gdbarch)->wb_regnum || regnum == -1)
-    rc->raw_supply (gdbarch_tdep (gdbarch)->wb_regnum,
+  if (regnum == tdep->wb_regnum || regnum == -1)
+    rc->raw_supply (tdep->wb_regnum,
 		    (char *) &regs->windowbase);
-  if (regnum == gdbarch_tdep (gdbarch)->ws_regnum || regnum == -1)
-    rc->raw_supply (gdbarch_tdep (gdbarch)->ws_regnum,
+  if (regnum == tdep->ws_regnum || regnum == -1)
+    rc->raw_supply (tdep->ws_regnum,
 		    (char *) &regs->windowstart);
-  if (regnum == gdbarch_tdep (gdbarch)->lbeg_regnum || regnum == -1)
-    rc->raw_supply (gdbarch_tdep (gdbarch)->lbeg_regnum,
+  if (regnum == tdep->lbeg_regnum || regnum == -1)
+    rc->raw_supply (tdep->lbeg_regnum,
 		    (char *) &regs->lbeg);
-  if (regnum == gdbarch_tdep (gdbarch)->lend_regnum || regnum == -1)
-    rc->raw_supply (gdbarch_tdep (gdbarch)->lend_regnum,
+  if (regnum == tdep->lend_regnum || regnum == -1)
+    rc->raw_supply (tdep->lend_regnum,
 		    (char *) &regs->lend);
-  if (regnum == gdbarch_tdep (gdbarch)->lcount_regnum || regnum == -1)
-    rc->raw_supply (gdbarch_tdep (gdbarch)->lcount_regnum,
+  if (regnum == tdep->lcount_regnum || regnum == -1)
+    rc->raw_supply (tdep->lcount_regnum,
 		    (char *) &regs->lcount);
-  if (regnum == gdbarch_tdep (gdbarch)->sar_regnum || regnum == -1)
-    rc->raw_supply (gdbarch_tdep (gdbarch)->sar_regnum,
+  if (regnum == tdep->sar_regnum || regnum == -1)
+    rc->raw_supply (tdep->sar_regnum,
 		    (char *) &regs->sar);
-  if (regnum >=gdbarch_tdep (gdbarch)->ar_base
-      && regnum < gdbarch_tdep (gdbarch)->ar_base
-		    + gdbarch_tdep (gdbarch)->num_aregs)
+  if (regnum >=tdep->ar_base
+      && regnum < tdep->ar_base
+		    + tdep->num_aregs)
     rc->raw_supply
-      (regnum, (char *) &regs->ar[regnum - gdbarch_tdep (gdbarch)->ar_base]);
+      (regnum, (char *) &regs->ar[regnum - tdep->ar_base]);
   else if (regnum == -1)
     {
-      for (i = 0; i < gdbarch_tdep (gdbarch)->num_aregs; ++i)
-	rc->raw_supply (gdbarch_tdep (gdbarch)->ar_base + i,
+      for (i = 0; i < tdep->num_aregs; ++i)
+	rc->raw_supply (tdep->ar_base + i,
 			(char *) &regs->ar[i]);
     }
 }
@@ -1051,12 +1060,13 @@ static struct frame_id
 xtensa_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
 {
   CORE_ADDR pc, fp;
+  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* THIS-FRAME is a dummy frame.  Return a frame ID of that frame.  */
 
   pc = get_frame_pc (this_frame);
   fp = get_frame_register_unsigned
-	 (this_frame, gdbarch_tdep (gdbarch)->a0_base + 1);
+	 (this_frame, tdep->a0_base + 1);
 
   /* Make dummy frame ID unique by adding a constant.  */
   return frame_id_build (fp + SP_ALIGNMENT, pc);
@@ -1105,7 +1115,8 @@ xtensa_scan_prologue (struct gdbarch *gdbarch, CORE_ADDR current_pc)
 {
 #define RETURN_FP goto done
 
-  unsigned int fp_regnum = gdbarch_tdep (gdbarch)->a0_base + 1;
+  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+  unsigned int fp_regnum = tdep->a0_base + 1;
   CORE_ADDR start_addr;
   xtensa_isa isa;
   xtensa_insnbuf ins, slot;
@@ -1182,7 +1193,7 @@ xtensa_scan_prologue (struct gdbarch *gdbarch, CORE_ADDR current_pc)
 		    RETURN_FP;
 
 		  fp_regnum
-		    = gdbarch_tdep (gdbarch)->a0_base + register_operand;
+		    = tdep->a0_base + register_operand;
 		  RETURN_FP;
 		}
 	    }
@@ -1254,26 +1265,27 @@ xtensa_frame_cache (struct frame_info *this_frame, void **this_cache)
   if (windowed)
     {
       LONGEST op1;
+      xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
       /* Get WINDOWBASE, WINDOWSTART, and PS registers.  */
       wb = get_frame_register_unsigned (this_frame, 
-					gdbarch_tdep (gdbarch)->wb_regnum);
+					tdep->wb_regnum);
       ws = get_frame_register_unsigned (this_frame,
-					gdbarch_tdep (gdbarch)->ws_regnum);
+					tdep->ws_regnum);
 
       if (safe_read_memory_integer (pc, 1, byte_order, &op1)
 	  && XTENSA_IS_ENTRY (gdbarch, op1))
 	{
 	  int callinc = CALLINC (ps);
 	  ra = get_frame_register_unsigned
-	    (this_frame, gdbarch_tdep (gdbarch)->a0_base + callinc * 4);
+	    (this_frame, tdep->a0_base + callinc * 4);
 	  
 	  /* ENTRY hasn't been executed yet, therefore callsize is still 0.  */
 	  cache->wd.callsize = 0;
 	  cache->wd.wb = wb;
 	  cache->wd.ws = ws;
 	  cache->prev_sp = get_frame_register_unsigned
-			     (this_frame, gdbarch_tdep (gdbarch)->a0_base + 1);
+			     (this_frame, tdep->a0_base + 1);
 
 	  /* This only can be the outermost frame since we are
 	     just about to execute ENTRY.  SP hasn't been set yet.
@@ -1292,10 +1304,10 @@ xtensa_frame_cache (struct frame_info *this_frame, void **this_cache)
 	{
 	  fp_regnum = xtensa_scan_prologue (gdbarch, pc);
 	  ra = get_frame_register_unsigned (this_frame,
-					    gdbarch_tdep (gdbarch)->a0_base);
+					    tdep->a0_base);
 	  cache->wd.callsize = WINSIZE (ra);
 	  cache->wd.wb = (wb - cache->wd.callsize / 4)
-			  & (gdbarch_tdep (gdbarch)->num_aregs / 4 - 1);
+			  & (tdep->num_aregs / 4 - 1);
 	  cache->wd.ws = ws & ~(1 << wb);
 
 	  cache->pc = get_frame_func (this_frame);
@@ -1310,7 +1322,7 @@ xtensa_frame_cache (struct frame_info *this_frame, void **this_cache)
 
 	  /* Set A0...A3.  */
 	  sp = get_frame_register_unsigned
-	    (this_frame, gdbarch_tdep (gdbarch)->a0_base + 1) - 16;
+	    (this_frame, tdep->a0_base + 1) - 16;
 	  
 	  for (i = 0; i < 4; i++, sp += 4)
 	    {
@@ -1342,14 +1354,14 @@ xtensa_frame_cache (struct frame_info *this_frame, void **this_cache)
 	      /* Register window overflow already happened.
 		 We can read caller's SP from the proper spill location.  */
 	      sp = get_frame_register_unsigned
-		(this_frame, gdbarch_tdep (gdbarch)->a0_base + 1);
+		(this_frame, tdep->a0_base + 1);
 	      cache->prev_sp = read_memory_integer (sp - 12, 4, byte_order);
 	    }
 	  else
 	    {
 	      /* Read caller's frame SP directly from the previous window.  */
 	      int regnum = arreg_number
-			     (gdbarch, gdbarch_tdep (gdbarch)->a0_base + 1,
+			     (gdbarch, tdep->a0_base + 1,
 			      cache->wd.wb);
 
 	      cache->prev_sp = xtensa_read_register (regnum);
@@ -1415,6 +1427,7 @@ xtensa_frame_prev_register (struct frame_info *this_frame,
   struct xtensa_frame_cache *cache;
   ULONGEST saved_reg = 0;
   int done = 1;
+  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   if (*this_cache == NULL)
     *this_cache = xtensa_frame_cache (this_frame, this_cache);
@@ -1422,13 +1435,13 @@ xtensa_frame_prev_register (struct frame_info *this_frame,
 
   if (regnum ==gdbarch_pc_regnum (gdbarch))
     saved_reg = cache->ra;
-  else if (regnum == gdbarch_tdep (gdbarch)->a0_base + 1)
+  else if (regnum == tdep->a0_base + 1)
     saved_reg = cache->prev_sp;
   else if (!cache->call0)
     {
-      if (regnum == gdbarch_tdep (gdbarch)->ws_regnum)
+      if (regnum == tdep->ws_regnum)
 	saved_reg = cache->wd.ws;
-      else if (regnum == gdbarch_tdep (gdbarch)->wb_regnum)
+      else if (regnum == tdep->wb_regnum)
 	saved_reg = cache->wd.wb;
       else if (regnum == gdbarch_ps_regnum (gdbarch))
 	saved_reg = cache->ps;
@@ -1445,14 +1458,14 @@ xtensa_frame_prev_register (struct frame_info *this_frame,
     {
       /* Convert A-register numbers to AR-register numbers,
 	 if we deal with A-register.  */
-      if (regnum >= gdbarch_tdep (gdbarch)->a0_base
-	  && regnum <= gdbarch_tdep (gdbarch)->a0_base + 15)
+      if (regnum >= tdep->a0_base
+	  && regnum <= tdep->a0_base + 15)
 	regnum = arreg_number (gdbarch, regnum, cache->wd.wb);
 
       /* Check, if we deal with AR-register saved on stack.  */
-      if (regnum >= gdbarch_tdep (gdbarch)->ar_base
-	  && regnum <= (gdbarch_tdep (gdbarch)->ar_base
-			 + gdbarch_tdep (gdbarch)->num_aregs))
+      if (regnum >= tdep->ar_base
+	  && regnum <= (tdep->ar_base
+			 + tdep->num_aregs))
 	{
 	  int areg = areg_number (gdbarch, regnum, cache->wd.wb);
 
@@ -1465,10 +1478,10 @@ xtensa_frame_prev_register (struct frame_info *this_frame,
     }
   else /* Call0 ABI.  */
     {
-      int reg = (regnum >= gdbarch_tdep (gdbarch)->ar_base
-		&& regnum <= (gdbarch_tdep (gdbarch)->ar_base
+      int reg = (regnum >= tdep->ar_base
+		&& regnum <= (tdep->ar_base
 			       + C0_NREGS))
-		  ? regnum - gdbarch_tdep (gdbarch)->ar_base : regnum;
+		  ? regnum - tdep->ar_base : regnum;
 
       if (reg < C0_NREGS)
 	{
@@ -1543,7 +1556,8 @@ xtensa_extract_return_value (struct type *type,
 
   gdb_assert(len > 0);
 
-  if (gdbarch_tdep (gdbarch)->call_abi != CallAbiCall0Only)
+  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+  if (tdep->call_abi != CallAbiCall0Only)
     {
       /* First, we have to find the caller window in the register file.  */
       regcache_raw_read_unsigned (regcache, gdbarch_pc_regnum (gdbarch), &pc);
@@ -1558,14 +1572,14 @@ xtensa_extract_return_value (struct type *type,
       /* Get the register offset of the return
 	 register (A2) in the caller window.  */
       regcache_raw_read_unsigned
-	(regcache, gdbarch_tdep (gdbarch)->wb_regnum, &wb);
+	(regcache, tdep->wb_regnum, &wb);
       areg = arreg_number (gdbarch,
-			  gdbarch_tdep (gdbarch)->a0_base + 2 + callsize, wb);
+			  tdep->a0_base + 2 + callsize, wb);
     }
   else
     {
       /* No windowing hardware - Call0 ABI.  */
-      areg = gdbarch_tdep (gdbarch)->a0_base + C0_ARGS;
+      areg = tdep->a0_base + C0_ARGS;
     }
 
   DEBUGINFO ("[xtensa_extract_return_value] areg %d len %d\n", areg, len);
@@ -1598,10 +1612,11 @@ xtensa_store_return_value (struct type *type,
 
   DEBUGTRACE ("xtensa_store_return_value (...)\n");
 
-  if (gdbarch_tdep (gdbarch)->call_abi != CallAbiCall0Only)
+  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+  if (tdep->call_abi != CallAbiCall0Only)
     {
       regcache_raw_read_unsigned 
-	(regcache, gdbarch_tdep (gdbarch)->wb_regnum, &wb);
+	(regcache, tdep->wb_regnum, &wb);
       regcache_raw_read_unsigned (regcache, gdbarch_pc_regnum (gdbarch), &pc);
       callsize = extract_call_winsize (gdbarch, pc);
 
@@ -1610,14 +1625,14 @@ xtensa_store_return_value (struct type *type,
 			_("unimplemented for this length: %s"),
 			pulongest (TYPE_LENGTH (type)));
       areg = arreg_number (gdbarch,
-			   gdbarch_tdep (gdbarch)->a0_base + 2 + callsize, wb);
+			   tdep->a0_base + 2 + callsize, wb);
 
       DEBUGTRACE ("[xtensa_store_return_value] callsize %d wb %d\n",
 	      callsize, (int) wb);
     }
   else
     {
-      areg = gdbarch_tdep (gdbarch)->a0_base + C0_ARGS;
+      areg = tdep->a0_base + C0_ARGS;
     }
 
   if (len < 4 && gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
@@ -1681,6 +1696,7 @@ xtensa_push_dummy_call (struct gdbarch *gdbarch,
 			CORE_ADDR struct_addr)
 {
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
+  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   int size, onstack_size;
   gdb_byte *buf = (gdb_byte *) alloca (16);
   CORE_ADDR ra, ps;
@@ -1793,7 +1809,7 @@ xtensa_push_dummy_call (struct gdbarch *gdbarch,
       size = (size + info->align - 1) & ~(info->align - 1);
       onstack_size = (onstack_size + info->align - 1) & ~(info->align - 1);
 
-      if (size + info->length > REGISTER_SIZE * ARG_NOF (gdbarch))
+      if (size + info->length > REGISTER_SIZE * ARG_NOF (tdep))
 	{
 	  info->onstack = 1;
 	  info->u.offset = onstack_size;
@@ -1802,7 +1818,7 @@ xtensa_push_dummy_call (struct gdbarch *gdbarch,
       else
 	{
 	  info->onstack = 0;
-	  info->u.regno = ARG_1ST (gdbarch) + size / REGISTER_SIZE;
+	  info->u.regno = ARG_1ST (tdep) + size / REGISTER_SIZE;
 	}
       size += info->length;
     }
@@ -1811,7 +1827,7 @@ xtensa_push_dummy_call (struct gdbarch *gdbarch,
   sp = align_down (sp - onstack_size, SP_ALIGNMENT);
 
   /* Simulate MOVSP, if Windowed ABI.  */
-  if ((gdbarch_tdep (gdbarch)->call_abi != CallAbiCall0Only)
+  if ((tdep->call_abi != CallAbiCall0Only)
       && (sp != osp))
     {
       read_memory (osp - 16, buf, 16);
@@ -1823,7 +1839,7 @@ xtensa_push_dummy_call (struct gdbarch *gdbarch,
   if (return_method == return_method_struct)
     {
       store_unsigned_integer (buf, REGISTER_SIZE, byte_order, struct_addr);
-      regcache->cooked_write (ARG_1ST (gdbarch), buf);
+      regcache->cooked_write (ARG_1ST (tdep), buf);
     }
 
   for (int i = 0; i < nargs; i++)
@@ -1887,7 +1903,7 @@ xtensa_push_dummy_call (struct gdbarch *gdbarch,
      The return address for the current function (in A0) is
      saved in the dummy frame, so we can safely overwrite A0 here.  */
 
-  if (gdbarch_tdep (gdbarch)->call_abi != CallAbiCall0Only)
+  if (tdep->call_abi != CallAbiCall0Only)
     {
       ULONGEST val;
 
@@ -1895,7 +1911,7 @@ xtensa_push_dummy_call (struct gdbarch *gdbarch,
       regcache_raw_read_unsigned (regcache, gdbarch_ps_regnum (gdbarch), &val);
       ps = (unsigned long) val & ~0x00030000;
       regcache_cooked_write_unsigned
-	(regcache, gdbarch_tdep (gdbarch)->a0_base + 4, ra);
+	(regcache, tdep->a0_base + 4, ra);
       regcache_cooked_write_unsigned (regcache,
 				      gdbarch_ps_regnum (gdbarch),
 				      ps | 0x00010000);
@@ -1905,21 +1921,21 @@ xtensa_push_dummy_call (struct gdbarch *gdbarch,
 	 to modify WINDOWSTART register to make it look like there
 	 is only one register window corresponding to WINDOWEBASE.  */
 
-      regcache->raw_read (gdbarch_tdep (gdbarch)->wb_regnum, buf);
+      regcache->raw_read (tdep->wb_regnum, buf);
       regcache_cooked_write_unsigned
-	(regcache, gdbarch_tdep (gdbarch)->ws_regnum,
+	(regcache, tdep->ws_regnum,
 	 1 << extract_unsigned_integer (buf, 4, byte_order));
     }
   else
     {
       /* Simulate CALL0: write RA into A0 register.  */
       regcache_cooked_write_unsigned
-	(regcache, gdbarch_tdep (gdbarch)->a0_base, bp_addr);
+	(regcache, tdep->a0_base, bp_addr);
     }
 
   /* Set new stack pointer and return it.  */
   regcache_cooked_write_unsigned (regcache,
-				  gdbarch_tdep (gdbarch)->a0_base + 1, sp);
+				  tdep->a0_base + 1, sp);
   /* Make dummy frame ID unique by adding a constant.  */
   return sp + SP_ALIGNMENT;
 }
@@ -1929,7 +1945,9 @@ xtensa_push_dummy_call (struct gdbarch *gdbarch,
 static int
 xtensa_breakpoint_kind_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr)
 {
-  if (gdbarch_tdep (gdbarch)->isa_use_density_instructions)
+  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+
+  if (tdep->isa_use_density_instructions)
     return 2;
   else
     return 4;
@@ -2174,6 +2192,7 @@ call0_track_op (struct gdbarch *gdbarch, xtensa_c0reg_t dst[], xtensa_c0reg_t sr
 {
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   unsigned litbase, litaddr, litval;
+  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   switch (opclass)
     {
@@ -2264,9 +2283,9 @@ call0_track_op (struct gdbarch *gdbarch, xtensa_c0reg_t dst[], xtensa_c0reg_t sr
       /* 2 operands: dst, literal offset.  */
       gdb_assert (nods == 2);
       /* litbase = xtensa_get_litbase (pc);  can be also used.  */
-      litbase = (gdbarch_tdep (gdbarch)->litbase_regnum == -1)
+      litbase = (tdep->litbase_regnum == -1)
 	? 0 : xtensa_read_register
-		(gdbarch_tdep (gdbarch)->litbase_regnum);
+		(tdep->litbase_regnum);
       litaddr = litbase & 1
 		  ? (litbase & ~1) + (signed)odv[1]
 		  : (pc + 3  + (signed)odv[1]) & ~3;
@@ -2548,9 +2567,10 @@ call0_frame_cache (struct frame_info *this_frame,
   CORE_ADDR body_pc=UINT_MAX;	/* PC, where prologue analysis stopped.  */
   CORE_ADDR sp, fp, ra;
   int fp_regnum = C0_SP, c0_hasfp = 0, c0_frmsz = 0, prev_sp = 0, to_stk;
+  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
  
   sp = get_frame_register_unsigned
-    (this_frame, gdbarch_tdep (gdbarch)->a0_base + 1);
+    (this_frame, tdep->a0_base + 1);
   fp = sp; /* Assume FP == SP until proven otherwise.  */
 
   /* Find the beginning of the prologue of the function containing the PC
@@ -2584,12 +2604,12 @@ call0_frame_cache (struct frame_info *this_frame,
 	 was derived from SP.  Otherwise, it would be C0_FP.  */
       fp_regnum = c0_hasfp ? C0_FP : C0_SP;
       c0_frmsz = - cache->c0.c0_rt[fp_regnum].fr_ofs;
-      fp_regnum += gdbarch_tdep (gdbarch)->a0_base;
+      fp_regnum += tdep->a0_base;
     }
   else  /* No data from the prologue analysis.  */
     {
       c0_hasfp = 0;
-      fp_regnum = gdbarch_tdep (gdbarch)->a0_base + C0_SP;
+      fp_regnum = tdep->a0_base + C0_SP;
       c0_frmsz = 0;
       start_pc = pc;
    }
@@ -2613,7 +2633,7 @@ call0_frame_cache (struct frame_info *this_frame,
       if (cache->c0.c0_sp_ofs == C0_NOSTK)
 	/* Saved unaligned value of SP is kept in a register.  */
 	unaligned_sp = get_frame_register_unsigned
-	  (this_frame, gdbarch_tdep (gdbarch)->a0_base + cache->c0.c0_old_sp);
+	  (this_frame, tdep->a0_base + cache->c0.c0_old_sp);
       else
 	/* Get the value from stack.  */
 	unaligned_sp = (CORE_ADDR)
@@ -2673,7 +2693,7 @@ call0_frame_cache (struct frame_info *this_frame,
 	{
 	  ra = get_frame_register_unsigned
 	    (this_frame,
-	     gdbarch_tdep (gdbarch)->a0_base + cache->c0.c0_rt[i].fr_reg);
+	     tdep->a0_base + cache->c0.c0_rt[i].fr_reg);
 	}
       else ra = 0;
     }
@@ -2700,8 +2720,9 @@ static int a11_was_saved;
 static void
 execute_l32e (struct gdbarch *gdbarch, int at, int as, int offset, CORE_ADDR wb)
 {
-  int atreg = arreg_number (gdbarch, gdbarch_tdep (gdbarch)->a0_base + at, wb);
-  int asreg = arreg_number (gdbarch, gdbarch_tdep (gdbarch)->a0_base + as, wb);
+  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+  int atreg = arreg_number (gdbarch, tdep->a0_base + at, wb);
+  int asreg = arreg_number (gdbarch, tdep->a0_base + as, wb);
   CORE_ADDR addr = xtensa_read_register (asreg) + offset;
   unsigned int spilled_value
     = read_memory_unsigned_integer (addr, 4, gdbarch_byte_order (gdbarch));
@@ -2729,8 +2750,9 @@ execute_l32e (struct gdbarch *gdbarch, int at, int as, int offset, CORE_ADDR wb)
 static void
 execute_s32e (struct gdbarch *gdbarch, int at, int as, int offset, CORE_ADDR wb)
 {
-  int atreg = arreg_number (gdbarch, gdbarch_tdep (gdbarch)->a0_base + at, wb);
-  int asreg = arreg_number (gdbarch, gdbarch_tdep (gdbarch)->a0_base + as, wb);
+  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+  int atreg = arreg_number (gdbarch, tdep->a0_base + at, wb);
+  int asreg = arreg_number (gdbarch, tdep->a0_base + as, wb);
   CORE_ADDR addr = xtensa_read_register (asreg) + offset;
   ULONGEST spilled_value = xtensa_read_register (atreg);
 
@@ -2762,6 +2784,7 @@ execute_code (struct gdbarch *gdbarch, CORE_ADDR current_pc, CORE_ADDR wb)
   xtensa_opcode opc;
   int insn_num = 0;
   void (*func) (struct gdbarch *, int, int, int, CORE_ADDR);
+  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   uint32_t at, as, offset;
 
@@ -2827,7 +2850,7 @@ execute_code (struct gdbarch *gdbarch, CORE_ADDR current_pc, CORE_ADDR wb)
 	      if (a0_was_saved)
 		{
 		  int arreg = arreg_number (gdbarch,
-					    gdbarch_tdep (gdbarch)->a0_base,
+					    tdep->a0_base,
 					    wb);
 		  xtensa_write_register (arreg, a0_saved);
 		}
@@ -2840,7 +2863,7 @@ execute_code (struct gdbarch *gdbarch, CORE_ADDR current_pc, CORE_ADDR wb)
 		  if (a11_was_saved)
 		    {
 		      int arreg = arreg_number (gdbarch,
-						gdbarch_tdep (gdbarch)->a0_base + 11,
+						tdep->a0_base + 11,
 						wb);
 		      xtensa_write_register (arreg, a11_saved);
 		    }
@@ -2848,7 +2871,7 @@ execute_code (struct gdbarch *gdbarch, CORE_ADDR current_pc, CORE_ADDR wb)
 	      else if (a7_was_saved)
 		{
 		  int arreg = arreg_number (gdbarch,
-					    gdbarch_tdep (gdbarch)->a0_base + 7,
+					    tdep->a0_base + 7,
 					    wb);
 		  xtensa_write_register (arreg, a7_saved);
 		}
@@ -2892,12 +2915,13 @@ xtensa_window_interrupt_frame_cache (struct frame_info *this_frame,
   CORE_ADDR ps, wb, ws, ra;
   int epc1_regnum, i, regnum;
   xtensa_exception_handler_t eh_type;
+  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 
   /* Read PS, WB, and WS from the hardware. Note that PS register
      must be present, if Windowed ABI is supported.  */
   ps = xtensa_read_register (gdbarch_ps_regnum (gdbarch));
-  wb = xtensa_read_register (gdbarch_tdep (gdbarch)->wb_regnum);
-  ws = xtensa_read_register (gdbarch_tdep (gdbarch)->ws_regnum);
+  wb = xtensa_read_register (tdep->wb_regnum);
+  ws = xtensa_read_register (tdep->ws_regnum);
 
   /* Execute all the remaining instructions from Window Interrupt Handler
      by simulating them on the remote protocol level.  On return, set the
@@ -2920,7 +2944,7 @@ Unable to decode Xtensa Window Interrupt Handler's code."));
     cache->wd.ws = ws | (1 << wb);
 
   cache->wd.wb = (ps & 0xf00) >> 8; /* Set WB to OWB.  */
-  regnum = arreg_number (gdbarch, gdbarch_tdep (gdbarch)->a0_base,
+  regnum = arreg_number (gdbarch, tdep->a0_base,
 			 cache->wd.wb);
   ra = xtensa_read_register (regnum);
   cache->wd.callsize = WINSIZE (ra);
@@ -2928,7 +2952,7 @@ Unable to decode Xtensa Window Interrupt Handler's code."));
   /* Set regnum to a frame pointer of the frame being cached.  */
   regnum = xtensa_scan_prologue (gdbarch, pc);
   regnum = arreg_number (gdbarch,
-			 gdbarch_tdep (gdbarch)->a0_base + regnum,
+			 tdep->a0_base + regnum,
 			 cache->wd.wb);
   cache->base = get_frame_register_unsigned (this_frame, regnum);
 
@@ -3005,7 +3029,8 @@ xtensa_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc)
 
       CORE_ADDR end_func;
 
-      if ((gdbarch_tdep (gdbarch)->call_abi == CallAbiCall0Only)
+      xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+      if ((tdep->call_abi == CallAbiCall0Only)
 	  && call0_ret (start_pc, prologue_sal.end))
 	return start_pc;
 
@@ -3026,7 +3051,7 @@ xtensa_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc)
 static void
 xtensa_verify_config (struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
   string_file log;
 
   /* Verify that we got a reasonable number of AREGS.  */
@@ -3064,7 +3089,7 @@ xtensa_verify_config (struct gdbarch *gdbarch)
 /* Derive specific register numbers from the array of registers.  */
 
 static void
-xtensa_derive_tdep (struct gdbarch_tdep *tdep)
+xtensa_derive_tdep (xtensa_gdbarch_tdep *tdep)
 {
   xtensa_register_t* rmap;
   int n, max_size = 4;
@@ -3139,12 +3164,11 @@ xtensa_derive_tdep (struct gdbarch_tdep *tdep)
 
 /* Module "constructor" function.  */
 
-extern struct gdbarch_tdep xtensa_tdep;
+extern xtensa_gdbarch_tdep xtensa_tdep;
 
 static struct gdbarch *
 xtensa_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 {
-  struct gdbarch_tdep *tdep;
   struct gdbarch *gdbarch;
 
   DEBUGTRACE ("gdbarch_init()\n");
@@ -3155,7 +3179,7 @@ xtensa_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   /* We have to set the byte order before we call gdbarch_alloc.  */
   info.byte_order = XCHAL_HAVE_BE ? BFD_ENDIAN_BIG : BFD_ENDIAN_LITTLE;
 
-  tdep = &xtensa_tdep;
+  xtensa_gdbarch_tdep *tdep = &xtensa_tdep;
   gdbarch = gdbarch_alloc (&info, tdep);
   xtensa_derive_tdep (tdep);
 
diff --git a/gdb/xtensa-tdep.h b/gdb/xtensa-tdep.h
index 55a2ed491bb..64e4da69dc5 100644
--- a/gdb/xtensa-tdep.h
+++ b/gdb/xtensa-tdep.h
@@ -21,6 +21,8 @@
 #define XTENSA_TDEP_H
 
 #include "arch/xtensa.h"
+#include "gdbarch.h"
+#include "xtensa-config.h"
 
 /* XTENSA_TDEP_VERSION can/should be changed along with XTENSA_CONFIG_VERSION
    whenever the "tdep" structure changes in an incompatible way.  */
@@ -155,137 +157,91 @@ struct ctype_cache
   struct type *virtual_type;
 };
 
+#ifndef XCHAL_NUM_CONTEXTS
+# define XCHAL_NUM_CONTEXTS	0
+#endif
+
+#ifndef XCHAL_HAVE_EXCEPTIONS
+# define XCHAL_HAVE_EXCEPTIONS	1
+#endif
+
 /*  Xtensa-specific target dependencies.  */
 
-struct gdbarch_tdep
+struct xtensa_gdbarch_tdep : gdbarch_tdep
 {
-  unsigned int target_flags;
+  xtensa_gdbarch_tdep (xtensa_register_t *regmap)
+    : regmap (regmap)
+  {}
+
+  unsigned int target_flags = 0;
 
   /* Spill location for TIE register files under ocd.  */
 
-  unsigned int spill_location;
-  unsigned int spill_size;
+  unsigned int spill_location = (unsigned int) -1;
+  unsigned int spill_size = 0;
 
-  char *unused;				/* Placeholder for compatibility.  */
-  call_abi_t call_abi;			/* Calling convention.  */
+  char *unused = nullptr;		/* Placeholder for compatibility.  */
+
+  /* Calling convention.  */
+  call_abi_t call_abi = (XSHAL_ABI == XTHAL_ABI_CALL0
+			 ? CallAbiCall0Only : CallAbiDefault);
 
   /* CPU configuration.  */
 
-  unsigned int debug_interrupt_level;
+  unsigned int debug_interrupt_level = XCHAL_DEBUGLEVEL;
 
-  unsigned int icache_line_bytes;
-  unsigned int dcache_line_bytes;
-  unsigned int dcache_writeback;
+  unsigned int icache_line_bytes = XCHAL_ICACHE_LINESIZE;
+  unsigned int dcache_line_bytes = XCHAL_DCACHE_LINESIZE;
+  unsigned int dcache_writeback = XCHAL_DCACHE_IS_WRITEBACK;
 
-  unsigned int isa_use_windowed_registers;
-  unsigned int isa_use_density_instructions;
-  unsigned int isa_use_exceptions;
-  unsigned int isa_use_ext_l32r;
-  unsigned int isa_max_insn_size;	/* Maximum instruction length.  */
-  unsigned int debug_num_ibreaks;	/* Number of IBREAKs.  */
-  unsigned int debug_num_dbreaks;
+  unsigned int isa_use_windowed_registers = XSHAL_ABI != XTHAL_ABI_CALL0;
+  unsigned int isa_use_density_instructions = XCHAL_HAVE_DENSITY;
+  unsigned int isa_use_exceptions = XCHAL_HAVE_EXCEPTIONS;
+  unsigned int isa_use_ext_l32r = XSHAL_USE_ABSOLUTE_LITERALS;
+  unsigned int isa_max_insn_size = XCHAL_MAX_INSTRUCTION_SIZE;	/* Maximum instruction length.  */
+  unsigned int debug_num_ibreaks = XCHAL_NUM_IBREAK;	/* Number of IBREAKs.  */
+  unsigned int debug_num_dbreaks = XCHAL_NUM_DBREAK;
 
   /* Register map.  */
 
-  xtensa_register_t* regmap;
-
-  unsigned int num_regs;	/* Number of registers in register map.  */
-  unsigned int num_nopriv_regs;	/* Number of non-privileged registers.  */
-  unsigned int num_pseudo_regs;	/* Number of pseudo registers.  */
-  unsigned int num_aregs;	/* Size of register file.  */
-  unsigned int num_contexts;
-
-  int ar_base;			/* Register number for AR0.  */
-  int a0_base;			/* Register number for A0 (pseudo).  */
-  int wb_regnum;		/* Register number for WB.  */
-  int ws_regnum;		/* Register number for WS.  */
-  int pc_regnum;		/* Register number for PC.  */
-  int ps_regnum;		/* Register number for PS.  */
-  int lbeg_regnum;		/* Register numbers for count regs.  */
-  int lend_regnum;
-  int lcount_regnum;
-  int sar_regnum;		/* Register number of SAR.  */
-  int litbase_regnum;		/* Register number of LITBASE.  */
-  int threadptr_regnum;		/* Register number of THREADPTR.  */
-
-  int interrupt_regnum;		/* Register number for interrupt.  */
-  int interrupt2_regnum;	/* Register number for interrupt2.  */
-  int cpenable_regnum;		/* Register number for cpenable.  */
-  int debugcause_regnum;	/* Register number for debugcause.  */
-  int exccause_regnum;		/* Register number for exccause.  */
-  int excvaddr_regnum;		/* Register number for excvaddr.  */
-
-  int max_register_raw_size;
-  int max_register_virtual_size;
-  unsigned long *fp_layout;	/* Layout of custom/TIE regs in 'FP' area.  */
-  unsigned int fp_layout_bytes;	/* Size of layout information (in bytes).  */
-  unsigned long *gregmap;
+  xtensa_register_t *regmap;
+
+  unsigned int num_regs = 0;		/* Number of registers in register map.  */
+  unsigned int num_nopriv_regs = 0;	/* Number of non-privileged registers.  */
+  unsigned int num_pseudo_regs = 0;	/* Number of pseudo registers.  */
+  unsigned int num_aregs = XCHAL_NUM_AREGS;		/* Size of register file.  */
+  unsigned int num_contexts = XCHAL_NUM_CONTEXTS;
+
+  int ar_base = -1;		/* Register number for AR0.  */
+  int a0_base = -1;		/* Register number for A0 (pseudo).  */
+  int wb_regnum = -1;		/* Register number for WB.  */
+  int ws_regnum = -1;		/* Register number for WS.  */
+  int pc_regnum = -1;		/* Register number for PC.  */
+  int ps_regnum = -1;		/* Register number for PS.  */
+  int lbeg_regnum = -1;		/* Register numbers for count regs.  */
+  int lend_regnum = -1;
+  int lcount_regnum = -1;
+  int sar_regnum = -1;		/* Register number of SAR.  */
+  int litbase_regnum = -1;	/* Register number of LITBASE.  */
+  int threadptr_regnum = -1;	/* Register number of THREADPTR.  */
+
+  int interrupt_regnum = -1;	/* Register number for interrupt.  */
+  int interrupt2_regnum = -1;	/* Register number for interrupt2.  */
+  int cpenable_regnum = -1;	/* Register number for cpenable.  */
+  int debugcause_regnum = -1;	/* Register number for debugcause.  */
+  int exccause_regnum = -1;	/* Register number for exccause.  */
+  int excvaddr_regnum = -1;	/* Register number for excvaddr.  */
+
+  int max_register_raw_size = 0;
+  int max_register_virtual_size = 0;
+  unsigned long *fp_layout = nullptr;	/* Layout of custom/TIE regs in 'FP' area.  */
+  unsigned int fp_layout_bytes = 0;	/* Size of layout information (in bytes).  */
+  unsigned long *gregmap = nullptr;
 
   /* Cached register types.  */
-  struct ctype_cache *type_entries;
+  struct ctype_cache *type_entries = nullptr;
 };
 
-/* Macro to instantiate a gdbarch_tdep structure.  */
-
-#define XTENSA_GDBARCH_TDEP_INSTANTIATE(rmap,spillsz)			\
-  {									\
-    0,				/* target_flags */			\
-    (unsigned) -1,		/* spill_location */	\
-    (spillsz),			/* spill_size */			\
-    0,				/* unused */				\
-    (XSHAL_ABI == XTHAL_ABI_CALL0					\
-     ? CallAbiCall0Only							\
-     : CallAbiDefault),		/* call_abi */				\
-    XCHAL_DEBUGLEVEL,		/* debug_interrupt_level */		\
-    XCHAL_ICACHE_LINESIZE,	/* icache_line_bytes */			\
-    XCHAL_DCACHE_LINESIZE,	/* dcache_line_bytes */			\
-    XCHAL_DCACHE_IS_WRITEBACK,  /* dcache_writeback */			\
-    (XSHAL_ABI != XTHAL_ABI_CALL0),   /* isa_use_windowed_registers */	\
-    XCHAL_HAVE_DENSITY,		 /* isa_use_density_instructions */	\
-    XCHAL_HAVE_EXCEPTIONS,	 /* isa_use_exceptions */		\
-    XSHAL_USE_ABSOLUTE_LITERALS, /* isa_use_ext_l32r */			\
-    XCHAL_MAX_INSTRUCTION_SIZE,  /* isa_max_insn_size */		\
-    XCHAL_NUM_IBREAK,		 /* debug_num_ibreaks */		\
-    XCHAL_NUM_DBREAK,		 /* debug_num_dbreaks */		\
-    rmap,			 /* regmap */				\
-    0,				 /* num_regs */				\
-    0,				 /* num_nopriv_regs */			\
-    0,				 /* num_pseudo_regs */			\
-    XCHAL_NUM_AREGS,		 /* num_aregs */			\
-    XCHAL_NUM_CONTEXTS,		 /* num_contexts */			\
-    -1,				 /* ar_base */				\
-    -1,				 /* a0_base */				\
-    -1,				 /* wb_regnum */			\
-    -1,				 /* ws_regnum */			\
-    -1,				 /* pc_regnum */			\
-    -1,				 /* ps_regnum */			\
-    -1,				 /* lbeg_regnum */			\
-    -1,				 /* lend_regnum */			\
-    -1,				 /* lcount_regnum */			\
-    -1,				 /* sar_regnum */			\
-    -1,				 /* litbase_regnum */			\
-    -1,				 /* interrupt_regnum */			\
-    -1,				 /* interrupt2_regnum */		\
-    -1,				 /* cpenable_regnum */			\
-    -1,				 /* debugcause_regnum */		\
-    -1,				 /* exccause_regnum */			\
-    -1,				 /* excvaddr_regnum */			\
-    0,				 /* max_register_raw_size */		\
-    0,				 /* max_register_virtual_size */	\
-    0,				 /* fp_layout */			\
-    0,				 /* fp_layout_bytes */			\
-    0,				 /* gregmap */				\
-  }
-#define XTENSA_CONFIG_INSTANTIATE(rmap,spill_size)	\
-	struct gdbarch_tdep xtensa_tdep = \
-	  XTENSA_GDBARCH_TDEP_INSTANTIATE(rmap,spill_size);
-
-#ifndef XCHAL_NUM_CONTEXTS
-#define XCHAL_NUM_CONTEXTS	0
-#endif
-#ifndef XCHAL_HAVE_EXCEPTIONS
-#define XCHAL_HAVE_EXCEPTIONS	1
-#endif
 #define WB_SHIFT	  2
 
 /* We assign fixed numbers to the registers of the "current" window 
diff --git a/gdb/z80-tdep.c b/gdb/z80-tdep.c
index 7b9a7e23501..9d453cd32b9 100644
--- a/gdb/z80-tdep.c
+++ b/gdb/z80-tdep.c
@@ -54,19 +54,21 @@
      next frame - frame of caller, which has called current function
 */
 
-struct gdbarch_tdep
+struct z80_gdbarch_tdep : gdbarch_tdep
 {
   /* Number of bytes used for address:
       2 bytes for all Z80 family
       3 bytes for eZ80 CPUs operating in ADL mode */
-  int addr_length;
+  int addr_length = 0;
 
   /* Type for void.  */
-  struct type *void_type;
+  struct type *void_type = nullptr;
+
   /* Type for a function returning void.  */
-  struct type *func_void_type;
+  struct type *func_void_type = nullptr;
+
   /* Type for a pointer to a function.  Used for the type of PC.  */
-  struct type *pc_type;
+  struct type *pc_type = nullptr;
 };
 
 /* At any time stack frame contains following parts:
@@ -305,7 +307,8 @@ z80_scan_prologue (struct gdbarch *gdbarch, CORE_ADDR pc_beg, CORE_ADDR pc_end,
 		   struct z80_unwind_cache *info)
 {
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
-  int addr_len = gdbarch_tdep (gdbarch)->addr_length;
+  z80_gdbarch_tdep *tdep = (z80_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+  int addr_len = tdep->addr_length;
   gdb_byte prologue[32]; /* max prologue is 24 bytes: __interrupt with local array */
   int pos = 0;
   int len;
@@ -560,7 +563,8 @@ z80_frame_unwind_cache (struct frame_info *this_frame,
   gdb_byte buf[sizeof(void*)];
   struct z80_unwind_cache *info;
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
-  int addr_len = gdbarch_tdep (gdbarch)->addr_length;
+  z80_gdbarch_tdep *tdep = (z80_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+  int addr_len = tdep->addr_length;
 
   if (*this_prologue_cache)
     return (struct z80_unwind_cache *) *this_prologue_cache;
@@ -692,7 +696,7 @@ z80_frame_prev_register (struct frame_info *this_frame,
 	  ULONGEST pc;
 	  gdb_byte buf[3];
 	  struct gdbarch *gdbarch = get_frame_arch (this_frame);
-	  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+	  z80_gdbarch_tdep *tdep = (z80_gdbarch_tdep *) gdbarch_tdep (gdbarch);
 	  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
 
 	  read_memory (info->saved_regs[Z80_PC_REGNUM].addr (),
@@ -745,11 +749,12 @@ z80_sw_breakpoint_from_kind (struct gdbarch *gdbarch, int kind, int *size)
     }
   else /* kind is non-RST address, use CALL instead, but it is dungerous */
     {
+      z80_gdbarch_tdep *tdep = (z80_gdbarch_tdep *) gdbarch_tdep (gdbarch);
       gdb_byte *p = break_insn;
       *p++ = 0xcd;
       *p++ = (kind >> 0) & 0xff;
       *p++ = (kind >> 8) & 0xff;
-      if (gdbarch_tdep (gdbarch)->addr_length > 2)
+      if (tdep->addr_length > 2)
 	*p++ = (kind >> 16) & 0xff;
       *size = p - break_insn;
     }
@@ -1077,7 +1082,6 @@ static struct gdbarch *
 z80_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 {
   struct gdbarch *gdbarch;
-  struct gdbarch_tdep *tdep;
   struct gdbarch_list *best_arch;
   tdesc_arch_data_up tdesc_data;
   unsigned long mach = info.bfd_arch_info->mach;
@@ -1119,7 +1123,7 @@ z80_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
     }
 
   /* None found, create a new architecture from the information provided.  */
-  tdep = XCNEW (struct gdbarch_tdep);
+  z80_gdbarch_tdep *tdep = new z80_gdbarch_tdep;
   gdbarch = gdbarch_alloc (&info, tdep);
 
   if (mach == bfd_mach_ez80_adl)
-- 
2.33.1


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] gdb: fix gdbarch_tdep ODR violation
  2021-11-12 20:42 [PATCH] gdb: fix gdbarch_tdep ODR violation Simon Marchi
@ 2021-11-12 21:55 ` John Baldwin
  2021-11-15 10:45 ` Luis Machado
  2021-11-15 16:47 ` Pedro Alves
  2 siblings, 0 replies; 10+ messages in thread
From: John Baldwin @ 2021-11-12 21:55 UTC (permalink / raw)
  To: Simon Marchi, gdb-patches

On 11/12/21 12:42 PM, Simon Marchi via Gdb-patches wrote:
> 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.

I haven't reviewed in detail, but I'm a big fan of this change.  If nothign
else it makes it easier to debug gdb itself since 'p (gdbarch_tdep *)foo'
will no longer be ambiguous.

-- 
John Baldwin

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] gdb: fix gdbarch_tdep ODR violation
  2021-11-12 20:42 [PATCH] gdb: fix gdbarch_tdep ODR violation Simon Marchi
  2021-11-12 21:55 ` John Baldwin
@ 2021-11-15 10:45 ` Luis Machado
  2021-11-15 16:29   ` Simon Marchi
  2021-11-15 16:47 ` Pedro Alves
  2 siblings, 1 reply; 10+ messages in thread
From: Luis Machado @ 2021-11-15 10:45 UTC (permalink / raw)
  To: Simon Marchi, gdb-patches

LGTM

On 11/12/21 5:42 PM, Simon Marchi via Gdb-patches wrote:
> 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
> ---
>   gdb/aarch64-fbsd-tdep.c   |   2 +-
>   gdb/aarch64-linux-tdep.c  |  11 +-
>   gdb/aarch64-newlib-tdep.c |   2 +-
>   gdb/aarch64-tdep.c        |  60 +++++----
>   gdb/aarch64-tdep.h        |  32 ++---
>   gdb/alpha-linux-tdep.c    |   4 +-
>   gdb/alpha-netbsd-tdep.c   |   2 +-
>   gdb/alpha-obsd-tdep.c     |   2 +-
>   gdb/alpha-tdep.c          |  26 ++--
>   gdb/alpha-tdep.h          |  24 ++--
>   gdb/amd64-darwin-tdep.c   |   2 +-
>   gdb/amd64-fbsd-tdep.c     |   4 +-
>   gdb/amd64-linux-tdep.c    |   8 +-
>   gdb/amd64-netbsd-tdep.c   |   2 +-
>   gdb/amd64-obsd-tdep.c     |   2 +-
>   gdb/amd64-sol2-tdep.c     |   2 +-
>   gdb/amd64-tdep.c          |  36 +++---
>   gdb/amd64-windows-tdep.c  |   2 +-
>   gdb/arc-linux-tdep.c      |   4 +-
>   gdb/arc-tdep.c            |  20 +--
>   gdb/arc-tdep.h            |  14 +--
>   gdb/arm-fbsd-tdep.c       |   4 +-
>   gdb/arm-linux-tdep.c      |   4 +-
>   gdb/arm-netbsd-tdep.c     |   4 +-
>   gdb/arm-none-tdep.c       |   2 +-
>   gdb/arm-obsd-tdep.c       |   2 +-
>   gdb/arm-tdep.c            | 123 ++++++++++--------
>   gdb/arm-tdep.h            |  65 +++++-----
>   gdb/arm-wince-tdep.c      |   2 +-
>   gdb/avr-tdep.c            |  36 +++---
>   gdb/bfin-tdep.c           |  12 +-
>   gdb/bfin-tdep.h           |   4 +-
>   gdb/bpf-tdep.c            |   4 +-
>   gdb/cris-linux-tdep.c     |   2 +-
>   gdb/cris-tdep.c           |  31 +++--
>   gdb/cris-tdep.h           |   8 +-
>   gdb/csky-tdep.c           |   3 +-
>   gdb/csky-tdep.h           |   2 +-
>   gdb/frv-tdep.c            |  37 +++---
>   gdb/ft32-tdep.c           |   8 +-
>   gdb/ft32-tdep.h           |   4 +-
>   gdb/gdbarch.h             |   2 +
>   gdb/gdbarch.sh            |   2 +
>   gdb/hppa-bsd-tdep.c       |   2 +-
>   gdb/hppa-linux-tdep.c     |   4 +-
>   gdb/hppa-tdep.c           |  22 ++--
>   gdb/hppa-tdep.h           |  23 ++--
>   gdb/i386-bsd-tdep.c       |   2 +-
>   gdb/i386-darwin-tdep.c    |   4 +-
>   gdb/i386-fbsd-tdep.c      |   8 +-
>   gdb/i386-gnu-tdep.c       |   2 +-
>   gdb/i386-go32-tdep.c      |   2 +-
>   gdb/i386-linux-tdep.c     |   4 +-
>   gdb/i386-netbsd-tdep.c    |   4 +-
>   gdb/i386-nto-tdep.c       |   6 +-
>   gdb/i386-obsd-tdep.c      |   2 +-
>   gdb/i386-sol2-tdep.c      |   2 +-
>   gdb/i386-tdep.c           | 111 +++++++++--------
>   gdb/i386-tdep.h           | 136 ++++++++++----------
>   gdb/i386-windows-tdep.c   |   2 +-
>   gdb/i387-tdep.c           |  23 ++--
>   gdb/ia64-linux-tdep.c     |   2 +-
>   gdb/ia64-tdep.c           |  14 +--
>   gdb/ia64-tdep.h           |  23 ++--
>   gdb/lm32-tdep.c           |   5 +-
>   gdb/m32c-tdep.c           | 113 ++++++++++-------
>   gdb/m32r-tdep.c           |   3 +-
>   gdb/m32r-tdep.h           |   4 +-
>   gdb/m68hc11-tdep.c        |  60 ++++++---
>   gdb/m68k-bsd-tdep.c       |   2 +-
>   gdb/m68k-linux-tdep.c     |   2 +-
>   gdb/m68k-tdep.c           |  57 +++++----
>   gdb/m68k-tdep.h           |  22 ++--
>   gdb/mep-tdep.c            |  28 +++--
>   gdb/microblaze-tdep.c     |   3 +-
>   gdb/microblaze-tdep.h     |   2 +-
>   gdb/mips-linux-tdep.c     |   4 +-
>   gdb/mips-tdep.c           | 164 ++++++++++++++----------
>   gdb/mips-tdep.h           |  30 ++---
>   gdb/mn10300-tdep.c        |   7 +-
>   gdb/mn10300-tdep.h        |  11 +-
>   gdb/moxie-tdep.c          |   3 +-
>   gdb/moxie-tdep.h          |   2 +-
>   gdb/msp430-tdep.c         |  32 ++---
>   gdb/nds32-tdep.c          |  24 ++--
>   gdb/nds32-tdep.h          |  10 +-
>   gdb/nios2-linux-tdep.c    |   2 +-
>   gdb/nios2-tdep.c          |   7 +-
>   gdb/nios2-tdep.h          |  10 +-
>   gdb/or1k-tdep.c           |  23 ++--
>   gdb/ppc-fbsd-tdep.c       |   8 +-
>   gdb/ppc-linux-tdep.c      |  18 +--
>   gdb/ppc-netbsd-tdep.c     |   2 +-
>   gdb/ppc-obsd-tdep.c       |   2 +-
>   gdb/ppc-sysv-tdep.c       |  22 ++--
>   gdb/ppc-tdep.h            | 104 ++++++++--------
>   gdb/ppc64-tdep.c          |   2 +-
>   gdb/riscv-linux-tdep.c    |   2 +-
>   gdb/riscv-tdep.c          |  37 +++---
>   gdb/riscv-tdep.h          |   5 +-
>   gdb/rl78-tdep.c           |  41 +++---
>   gdb/rs6000-aix-tdep.c     |  19 +--
>   gdb/rs6000-lynx178-tdep.c |   6 +-
>   gdb/rs6000-tdep.c         | 121 +++++++++---------
>   gdb/rx-tdep.c             |  16 +--
>   gdb/s12z-tdep.c           |   4 +-
>   gdb/s390-linux-tdep.c     |  20 +--
>   gdb/s390-tdep.c           |  74 ++++++-----
>   gdb/s390-tdep.h           |  33 ++---
>   gdb/sh-linux-tdep.c       |   2 +-
>   gdb/sh-netbsd-tdep.c      |   2 +-
>   gdb/sh-tdep.c             |  11 +-
>   gdb/sh-tdep.h             |  14 ++-
>   gdb/sparc-linux-tdep.c    |   5 +-
>   gdb/sparc-netbsd-tdep.c   |   2 +-
>   gdb/sparc-sol2-tdep.c     |   2 +-
>   gdb/sparc-tdep.c          |  21 ++--
>   gdb/sparc-tdep.h          |  43 ++++---
>   gdb/sparc64-fbsd-tdep.c   |   2 +-
>   gdb/sparc64-linux-tdep.c  |   5 +-
>   gdb/sparc64-netbsd-tdep.c |   2 +-
>   gdb/sparc64-obsd-tdep.c   |   2 +-
>   gdb/sparc64-sol2-tdep.c   |   2 +-
>   gdb/sparc64-tdep.c        |  10 +-
>   gdb/tic6x-linux-tdep.c    |   6 +-
>   gdb/tic6x-tdep.c          |  11 +-
>   gdb/tic6x-tdep.h          |  10 +-
>   gdb/v850-tdep.c           |  30 +++--
>   gdb/xtensa-config.c       |   9 +-
>   gdb/xtensa-linux-tdep.c   |   2 +-
>   gdb/xtensa-tdep.c         | 254 +++++++++++++++++++++-----------------
>   gdb/xtensa-tdep.h         | 180 ++++++++++-----------------
>   gdb/z80-tdep.c            |  26 ++--
>   133 files changed, 1514 insertions(+), 1325 deletions(-)
> 
> diff --git a/gdb/aarch64-fbsd-tdep.c b/gdb/aarch64-fbsd-tdep.c
> index 3f22d419438..7342e7b9002 100644
> --- a/gdb/aarch64-fbsd-tdep.c
> +++ b/gdb/aarch64-fbsd-tdep.c
> @@ -153,7 +153,7 @@ aarch64_fbsd_iterate_over_regset_sections (struct gdbarch *gdbarch,
>   static void
>   aarch64_fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* Generic FreeBSD support.  */
>     fbsd_init_abi (info, gdbarch);
> diff --git a/gdb/aarch64-linux-tdep.c b/gdb/aarch64-linux-tdep.c
> index abb8be30731..7a9cf0c87e9 100644
> --- a/gdb/aarch64-linux-tdep.c
> +++ b/gdb/aarch64-linux-tdep.c
> @@ -286,7 +286,7 @@ aarch64_linux_sigframe_init (const struct tramp_frame *self,
>   {
>     struct gdbarch *gdbarch = get_frame_arch (this_frame);
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     CORE_ADDR sp = get_frame_register_unsigned (this_frame, AARCH64_SP_REGNUM);
>     CORE_ADDR sigcontext_addr = (sp + AARCH64_RT_SIGFRAME_UCONTEXT_OFFSET
>   			       + AARCH64_UCONTEXT_SIGCONTEXT_OFFSET );
> @@ -640,7 +640,8 @@ aarch64_linux_collect_sve_regset (const struct regset *regset,
>     gdb_byte *header = (gdb_byte *) buf;
>     struct gdbarch *gdbarch = regcache->arch ();
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
> -  uint64_t vq = gdbarch_tdep (gdbarch)->vq;
> +  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +  uint64_t vq = tdep->vq;
>   
>     gdb_assert (buf != NULL);
>     gdb_assert (size > SVE_HEADER_SIZE);
> @@ -675,7 +676,7 @@ aarch64_linux_iterate_over_regset_sections (struct gdbarch *gdbarch,
>   					    void *cb_data,
>   					    const struct regcache *regcache)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     cb (".reg", AARCH64_LINUX_SIZEOF_GREGSET, AARCH64_LINUX_SIZEOF_GREGSET,
>         &aarch64_linux_gregset, NULL, cb_data);
> @@ -1719,7 +1720,7 @@ aarch64_linux_report_signal_info (struct gdbarch *gdbarch,
>   				  struct ui_out *uiout,
>   				  enum gdb_signal siggnal)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (!tdep->has_mte () || siggnal != GDB_SIGNAL_SEGV)
>       return;
> @@ -1788,7 +1789,7 @@ aarch64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   								    NULL };
>     static const char *const stap_register_indirection_suffixes[] = { "]",
>   								    NULL };
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     tdep->lowest_pc = 0x8000;
>   
> diff --git a/gdb/aarch64-newlib-tdep.c b/gdb/aarch64-newlib-tdep.c
> index b5e57bcd95f..9805967a205 100644
> --- a/gdb/aarch64-newlib-tdep.c
> +++ b/gdb/aarch64-newlib-tdep.c
> @@ -29,7 +29,7 @@
>   static void
>   aarch64_newlib_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* Jump buffer - support for longjmp.
>        Offset of original PC in jump buffer (in registers).  */
> diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c
> index 42b8494980c..392110afd2b 100644
> --- a/gdb/aarch64-tdep.c
> +++ b/gdb/aarch64-tdep.c
> @@ -248,7 +248,7 @@ class instruction_reader : public abstract_instruction_reader
>      THIS_FRAME.  */
>   
>   static CORE_ADDR
> -aarch64_frame_unmask_lr (struct gdbarch_tdep *tdep,
> +aarch64_frame_unmask_lr (aarch64_gdbarch_tdep *tdep,
>   			 struct frame_info *this_frame, CORE_ADDR addr)
>   {
>     if (tdep->has_pauth ()
> @@ -500,7 +500,8 @@ aarch64_analyze_prologue (struct gdbarch *gdbarch,
>   	}
>         else if (inst.opcode->iclass == ic_system)
>   	{
> -	  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +	  aarch64_gdbarch_tdep *tdep
> +	    = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   	  int ra_state_val = 0;
>   
>   	  if (insn == 0xd503233f /* paciasp.  */
> @@ -635,7 +636,7 @@ aarch64_analyze_prologue_test (void)
>     struct aarch64_prologue_cache cache;
>     cache.saved_regs = trad_frame_alloc_saved_regs (gdbarch);
>   
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* Test the simple prologue in which frame pointer is used.  */
>     {
> @@ -1037,7 +1038,9 @@ aarch64_prologue_frame_unwind_stop_reason (struct frame_info *this_frame,
>       return UNWIND_UNAVAILABLE;
>   
>     /* Halt the backtrace at "_start".  */
> -  if (cache->prev_pc <= gdbarch_tdep (get_frame_arch (this_frame))->lowest_pc)
> +  gdbarch *arch = get_frame_arch (this_frame);
> +  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (arch);
> +  if (cache->prev_pc <= tdep->lowest_pc)
>       return UNWIND_OUTERMOST;
>   
>     /* We've hit a wall, stop.  */
> @@ -1079,7 +1082,8 @@ aarch64_prologue_prev_register (struct frame_info *this_frame,
>       {
>         CORE_ADDR lr;
>         struct gdbarch *gdbarch = get_frame_arch (this_frame);
> -      struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +      aarch64_gdbarch_tdep *tdep
> +	= (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>         lr = frame_unwind_register_unsigned (this_frame, AARCH64_LR_REGNUM);
>   
> @@ -1247,7 +1251,8 @@ static struct value *
>   aarch64_dwarf2_prev_register (struct frame_info *this_frame,
>   			      void **this_cache, int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (get_frame_arch (this_frame));
> +  gdbarch *arch = get_frame_arch (this_frame);
> +  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (arch);
>     CORE_ADDR lr;
>   
>     switch (regnum)
> @@ -1273,7 +1278,7 @@ aarch64_dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum,
>   			       struct dwarf2_frame_state_reg *reg,
>   			       struct frame_info *this_frame)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     switch (regnum)
>       {
> @@ -1313,7 +1318,7 @@ static bool
>   aarch64_execute_dwarf_cfa_vendor_op (struct gdbarch *gdbarch, gdb_byte op,
>   				     struct dwarf2_frame_state *fs)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     struct dwarf2_frame_state_reg *ra_state;
>   
>     if (op == DW_CFA_AARCH64_negate_ra_state)
> @@ -1952,7 +1957,7 @@ aarch64_frame_align (struct gdbarch *gdbarch, CORE_ADDR sp)
>   static struct type *
>   aarch64_vnq_type (struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (tdep->vnq_type == NULL)
>       {
> @@ -1979,7 +1984,7 @@ aarch64_vnq_type (struct gdbarch *gdbarch)
>   static struct type *
>   aarch64_vnd_type (struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (tdep->vnd_type == NULL)
>       {
> @@ -2009,7 +2014,7 @@ aarch64_vnd_type (struct gdbarch *gdbarch)
>   static struct type *
>   aarch64_vns_type (struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (tdep->vns_type == NULL)
>       {
> @@ -2039,7 +2044,7 @@ aarch64_vns_type (struct gdbarch *gdbarch)
>   static struct type *
>   aarch64_vnh_type (struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (tdep->vnh_type == NULL)
>       {
> @@ -2072,7 +2077,7 @@ aarch64_vnh_type (struct gdbarch *gdbarch)
>   static struct type *
>   aarch64_vnb_type (struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (tdep->vnb_type == NULL)
>       {
> @@ -2099,7 +2104,7 @@ aarch64_vnb_type (struct gdbarch *gdbarch)
>   static struct type *
>   aarch64_vnv_type (struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (tdep->vnv_type == NULL)
>       {
> @@ -2170,7 +2175,7 @@ aarch64_vnv_type (struct gdbarch *gdbarch)
>   static int
>   aarch64_dwarf_reg_to_regnum (struct gdbarch *gdbarch, int reg)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (reg >= AARCH64_DWARF_X0 && reg <= AARCH64_DWARF_X0 + 30)
>       return AARCH64_X0_REGNUM + reg - AARCH64_DWARF_X0;
> @@ -2457,7 +2462,7 @@ aarch64_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
>     CORE_ADDR jb_addr;
>     gdb_byte buf[X_REGISTER_SIZE];
>     struct gdbarch *gdbarch = get_frame_arch (frame);
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>   
>     jb_addr = get_frame_register_unsigned (frame, AARCH64_X0_REGNUM);
> @@ -2488,7 +2493,7 @@ aarch64_gen_return_address (struct gdbarch *gdbarch,
>   static const char *
>   aarch64_pseudo_register_name (struct gdbarch *gdbarch, int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     static const char *const q_name[] =
>       {
> @@ -2602,7 +2607,7 @@ aarch64_pseudo_register_name (struct gdbarch *gdbarch, int regnum)
>   static struct type *
>   aarch64_pseudo_register_type (struct gdbarch *gdbarch, int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     int p_regnum = regnum - gdbarch_num_regs (gdbarch);
>   
> @@ -2639,7 +2644,7 @@ static int
>   aarch64_pseudo_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
>   				    struct reggroup *group)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     int p_regnum = regnum - gdbarch_num_regs (gdbarch);
>   
> @@ -2693,7 +2698,7 @@ static struct value *
>   aarch64_pseudo_read_value (struct gdbarch *gdbarch, readable_regcache *regcache,
>   			   int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     struct value *result_value = allocate_value (register_type (gdbarch, regnum));
>   
>     VALUE_LVAL (result_value) = lval_register;
> @@ -2763,7 +2768,7 @@ static void
>   aarch64_pseudo_write (struct gdbarch *gdbarch, struct regcache *regcache,
>   		      int regnum, const gdb_byte *buf)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     regnum -= gdbarch_num_regs (gdbarch);
>   
>     if (regnum >= AARCH64_Q0_REGNUM && regnum < AARCH64_Q0_REGNUM + 32)
> @@ -3328,7 +3333,7 @@ aarch64_add_reggroups (struct gdbarch *gdbarch)
>   static int
>   aarch64_cannot_store_register (struct gdbarch *gdbarch, int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (!tdep->has_pauth ())
>       return 0;
> @@ -3375,7 +3380,8 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>          best_arch != nullptr;
>          best_arch = gdbarch_list_lookup_by_info (best_arch->next, &info))
>       {
> -      struct gdbarch_tdep *tdep = gdbarch_tdep (best_arch->gdbarch);
> +      aarch64_gdbarch_tdep *tdep
> +	= (aarch64_gdbarch_tdep *) gdbarch_tdep (best_arch->gdbarch);
>         if (tdep && tdep->vq == vq)
>   	return best_arch->gdbarch;
>       }
> @@ -3483,7 +3489,7 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>     /* AArch64 code is always little-endian.  */
>     info.byte_order_for_code = BFD_ENDIAN_LITTLE;
>   
> -  struct gdbarch_tdep *tdep = XCNEW (struct gdbarch_tdep);
> +  aarch64_gdbarch_tdep *tdep = new aarch64_gdbarch_tdep;
>     struct gdbarch *gdbarch = gdbarch_alloc (&info, tdep);
>   
>     /* This should be low enough for everything.  */
> @@ -3605,7 +3611,7 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   static void
>   aarch64_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (tdep == NULL)
>       return;
> @@ -3825,7 +3831,9 @@ aarch64_record_data_proc_imm (insn_decode_record *aarch64_insn_r)
>   static unsigned int
>   aarch64_record_branch_except_sys (insn_decode_record *aarch64_insn_r)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (aarch64_insn_r->gdbarch);
> +
> +  aarch64_gdbarch_tdep *tdep
> +    = (aarch64_gdbarch_tdep *) gdbarch_tdep (aarch64_insn_r->gdbarch);
>     uint8_t insn_bits24_27, insn_bits28_31, insn_bits22_23;
>     uint32_t record_buf[4];
>   
> diff --git a/gdb/aarch64-tdep.h b/gdb/aarch64-tdep.h
> index 7bf612b012a..efb0fa2d5b2 100644
> --- a/gdb/aarch64-tdep.h
> +++ b/gdb/aarch64-tdep.h
> @@ -25,6 +25,7 @@
>   #include "arch/aarch64.h"
>   #include "displaced-stepping.h"
>   #include "infrun.h"
> +#include "gdbarch.h"
>   
>   /* Forward declarations.  */
>   struct gdbarch;
> @@ -60,31 +61,32 @@ struct regset;
>   #define AARCH64_DISPLACED_MODIFIED_INSNS 1
>   
>   /* Target-dependent structure in gdbarch.  */
> -struct gdbarch_tdep
> +struct aarch64_gdbarch_tdep : gdbarch_tdep
>   {
>     /* Lowest address at which instructions will appear.  */
> -  CORE_ADDR lowest_pc;
> +  CORE_ADDR lowest_pc = 0;
>   
>     /* Offset to PC value in jump buffer.  If this is negative, longjmp
>        support will be disabled.  */
> -  int jb_pc;
> +  int jb_pc = 0;
>   
>     /* And the size of each entry in the buf.  */
> -  size_t jb_elt_size;
> +  size_t jb_elt_size = 0;
>   
>     /* Types for AdvSISD registers.  */
> -  struct type *vnq_type;
> -  struct type *vnd_type;
> -  struct type *vns_type;
> -  struct type *vnh_type;
> -  struct type *vnb_type;
> -  struct type *vnv_type;
> +  struct type *vnq_type = nullptr;
> +  struct type *vnd_type = nullptr;
> +  struct type *vns_type = nullptr;
> +  struct type *vnh_type = nullptr;
> +  struct type *vnb_type = nullptr;
> +  struct type *vnv_type = nullptr;
>   
>     /* syscall record.  */
> -  int (*aarch64_syscall_record) (struct regcache *regcache, unsigned long svc_number);
> +  int (*aarch64_syscall_record) (struct regcache *regcache,
> +				 unsigned long svc_number) = nullptr;
>   
>     /* The VQ value for SVE targets, or zero if SVE is not supported.  */
> -  uint64_t vq;
> +  uint64_t vq = 0;
>   
>     /* Returns true if the target supports SVE.  */
>     bool has_sve () const
> @@ -92,8 +94,8 @@ struct gdbarch_tdep
>       return vq != 0;
>     }
>   
> -  int pauth_reg_base;
> -  int pauth_ra_state_regnum;
> +  int pauth_reg_base = 0;
> +  int pauth_ra_state_regnum = 0;
>   
>     /* Returns true if the target supports pauth.  */
>     bool has_pauth () const
> @@ -102,7 +104,7 @@ struct gdbarch_tdep
>     }
>   
>     /* First MTE register.  This is -1 if no MTE registers are available.  */
> -  int mte_reg_base;
> +  int mte_reg_base = 0;
>   
>     /* Returns true if the target supports MTE.  */
>     bool has_mte () const
> diff --git a/gdb/alpha-linux-tdep.c b/gdb/alpha-linux-tdep.c
> index 0a00fc1f310..b821a6bd93a 100644
> --- a/gdb/alpha-linux-tdep.c
> +++ b/gdb/alpha-linux-tdep.c
> @@ -354,8 +354,6 @@ alpha_linux_gdb_signal_to_target (struct gdbarch *gdbarch,
>   static void
>   alpha_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep;
> -
>     linux_init_abi (info, gdbarch, 0);
>   
>     /* Hook into the DWARF CFI frame unwinder.  */
> @@ -364,7 +362,7 @@ alpha_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>     /* Hook into the MDEBUG frame unwinder.  */
>     alpha_mdebug_init_abi (info, gdbarch);
>   
> -  tdep = gdbarch_tdep (gdbarch);
> +  alpha_gdbarch_tdep *tdep = (alpha_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     tdep->dynamic_sigtramp_offset = alpha_linux_sigtramp_offset;
>     tdep->sigcontext_addr = alpha_linux_sigcontext_addr;
>     tdep->pc_in_sigtramp = alpha_linux_pc_in_sigtramp;
> diff --git a/gdb/alpha-netbsd-tdep.c b/gdb/alpha-netbsd-tdep.c
> index 0b03aa19de1..b19f76bef06 100644
> --- a/gdb/alpha-netbsd-tdep.c
> +++ b/gdb/alpha-netbsd-tdep.c
> @@ -250,7 +250,7 @@ static void
>   alphanbsd_init_abi (struct gdbarch_info info,
>   		    struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  alpha_gdbarch_tdep *tdep = (alpha_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* Hook into the DWARF CFI frame unwinder.  */
>     alpha_dwarf2_init_abi (info, gdbarch);
> diff --git a/gdb/alpha-obsd-tdep.c b/gdb/alpha-obsd-tdep.c
> index 0afd4dc56d8..7ca5ca17c6e 100644
> --- a/gdb/alpha-obsd-tdep.c
> +++ b/gdb/alpha-obsd-tdep.c
> @@ -97,7 +97,7 @@ alphaobsd_sigcontext_addr (struct frame_info *this_frame)
>   static void
>   alphaobsd_init_abi(struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  alpha_gdbarch_tdep *tdep = (alpha_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* Hook into the DWARF CFI frame unwinder.  */
>     alpha_dwarf2_init_abi (info, gdbarch);
> diff --git a/gdb/alpha-tdep.c b/gdb/alpha-tdep.c
> index 03935d1db78..760a18a178a 100644
> --- a/gdb/alpha-tdep.c
> +++ b/gdb/alpha-tdep.c
> @@ -615,11 +615,12 @@ alpha_return_value (struct gdbarch *gdbarch, struct value *function,
>   		    gdb_byte *readbuf, const gdb_byte *writebuf)
>   {
>     enum type_code code = type->code ();
> +  alpha_gdbarch_tdep *tdep = (alpha_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if ((code == TYPE_CODE_STRUCT
>          || code == TYPE_CODE_UNION
>          || code == TYPE_CODE_ARRAY)
> -      && gdbarch_tdep (gdbarch)->return_in_memory (type))
> +      && tdep->return_in_memory (type))
>       {
>         if (readbuf)
>   	{
> @@ -850,7 +851,7 @@ static int
>   alpha_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
>   {
>     struct gdbarch *gdbarch = get_frame_arch (frame);
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  alpha_gdbarch_tdep *tdep = (alpha_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>     CORE_ADDR jb_addr;
>     gdb_byte raw_buffer[ALPHA_REGISTER_SIZE];
> @@ -882,7 +883,6 @@ alpha_sigtramp_frame_unwind_cache (struct frame_info *this_frame,
>   				   void **this_prologue_cache)
>   {
>     struct alpha_sigtramp_unwind_cache *info;
> -  struct gdbarch_tdep *tdep;
>   
>     if (*this_prologue_cache)
>       return (struct alpha_sigtramp_unwind_cache *) *this_prologue_cache;
> @@ -890,7 +890,8 @@ alpha_sigtramp_frame_unwind_cache (struct frame_info *this_frame,
>     info = FRAME_OBSTACK_ZALLOC (struct alpha_sigtramp_unwind_cache);
>     *this_prologue_cache = info;
>   
> -  tdep = gdbarch_tdep (get_frame_arch (this_frame));
> +  gdbarch *arch = get_frame_arch (this_frame);
> +  alpha_gdbarch_tdep *tdep = (alpha_gdbarch_tdep *) gdbarch_tdep (arch);
>     info->sigcontext_addr = tdep->sigcontext_addr (this_frame);
>   
>     return info;
> @@ -903,7 +904,7 @@ static CORE_ADDR
>   alpha_sigtramp_register_address (struct gdbarch *gdbarch,
>   				 CORE_ADDR sigcontext_addr, int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  alpha_gdbarch_tdep *tdep = (alpha_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (regnum >= 0 && regnum < 32)
>       return sigcontext_addr + tdep->sc_regs_offset + regnum * 8;
> @@ -924,7 +925,7 @@ alpha_sigtramp_frame_this_id (struct frame_info *this_frame,
>   			      struct frame_id *this_id)
>   {
>     struct gdbarch *gdbarch = get_frame_arch (this_frame);
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  alpha_gdbarch_tdep *tdep = (alpha_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     struct alpha_sigtramp_unwind_cache *info
>       = alpha_sigtramp_frame_unwind_cache (this_frame, this_prologue_cache);
>     CORE_ADDR stack_addr, code_addr;
> @@ -999,14 +1000,16 @@ alpha_sigtramp_frame_sniffer (const struct frame_unwind *self,
>   
>     /* We shouldn't even bother to try if the OSABI didn't register a
>        sigcontext_addr handler or pc_in_sigtramp handler.  */
> -  if (gdbarch_tdep (gdbarch)->sigcontext_addr == NULL)
> +  alpha_gdbarch_tdep *tdep = (alpha_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +  if (tdep->sigcontext_addr == NULL)
>       return 0;
> -  if (gdbarch_tdep (gdbarch)->pc_in_sigtramp == NULL)
> +
> +  if (tdep->pc_in_sigtramp == NULL)
>       return 0;
>   
>     /* Otherwise we should be in a signal frame.  */
>     find_pc_partial_function (pc, &name, NULL, NULL);
> -  if (gdbarch_tdep (gdbarch)->pc_in_sigtramp (gdbarch, pc, name))
> +  if (tdep->pc_in_sigtramp (gdbarch, pc, name))
>       return 1;
>   
>     return 0;
> @@ -1038,7 +1041,7 @@ static int heuristic_fence_post = 0;
>   static CORE_ADDR
>   alpha_heuristic_proc_start (struct gdbarch *gdbarch, CORE_ADDR pc)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  alpha_gdbarch_tdep *tdep = (alpha_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     CORE_ADDR last_non_nop = pc;
>     CORE_ADDR fence = pc - heuristic_fence_post;
>     CORE_ADDR orig_pc = pc;
> @@ -1724,7 +1727,6 @@ alpha_software_single_step (struct regcache *regcache)
>   static struct gdbarch *
>   alpha_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   {
> -  struct gdbarch_tdep *tdep;
>     struct gdbarch *gdbarch;
>   
>     /* Find a candidate among extant architectures.  */
> @@ -1732,7 +1734,7 @@ alpha_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>     if (arches != NULL)
>       return arches->gdbarch;
>   
> -  tdep = XCNEW (struct gdbarch_tdep);
> +  alpha_gdbarch_tdep *tdep = new alpha_gdbarch_tdep;
>     gdbarch = gdbarch_alloc (&info, tdep);
>   
>     /* Lowest text address.  This is used by heuristic_proc_start()
> diff --git a/gdb/alpha-tdep.h b/gdb/alpha-tdep.h
> index c1fd69493e8..c1674fea8cb 100644
> --- a/gdb/alpha-tdep.h
> +++ b/gdb/alpha-tdep.h
> @@ -19,6 +19,8 @@
>   #ifndef ALPHA_TDEP_H
>   #define ALPHA_TDEP_H
>   
> +#include "gdbarch.h"
> +
>   struct regcache;
>   
>   /* Say how long (ordinary) registers are.  This is a piece of bogosity
> @@ -68,38 +70,38 @@ struct regcache;
>   #define ALPHA_NUM_ARG_REGS   6
>   
>   /* Target-dependent structure in gdbarch.  */
> -struct gdbarch_tdep
> +struct alpha_gdbarch_tdep : gdbarch_tdep
>   {
> -  CORE_ADDR vm_min_address;	/* Used by alpha_heuristic_proc_start.  */
> +  CORE_ADDR vm_min_address = 0;	/* Used by alpha_heuristic_proc_start.  */
>   
>     /* If PC is inside a dynamically-generated signal trampoline function
>        (i.e. one copied onto the user stack at run-time), return how many
>        bytes PC is beyond the start of that function.  Otherwise, return -1.  */
> -  LONGEST (*dynamic_sigtramp_offset) (struct gdbarch *, CORE_ADDR);
> +  LONGEST (*dynamic_sigtramp_offset) (struct gdbarch *, CORE_ADDR) = nullptr;
>   
>     /* Translate a signal handler stack base address into the address of
>        the sigcontext structure for that signal handler.  */
> -  CORE_ADDR (*sigcontext_addr) (struct frame_info *);
> +  CORE_ADDR (*sigcontext_addr) (struct frame_info *) = nullptr;
>   
>     /* Does the PC fall in a signal trampoline.  */
>     /* NOTE: cagney/2004-04-30: Do not copy/clone this code.  Instead
>        look at tramp-frame.h and other simpler per-architecture
>        sigtramp unwinders.  */
>     int (*pc_in_sigtramp) (struct gdbarch *gdbarch, CORE_ADDR pc,
> -			 const char *name);
> +			 const char *name) = nullptr;
>   
>     /* If TYPE will be returned in memory, return true.  */
> -  int (*return_in_memory) (struct type *type);
> +  int (*return_in_memory) (struct type *type) = nullptr;
>   
>     /* Offset of registers in `struct sigcontext'.  */
> -  int sc_pc_offset;
> -  int sc_regs_offset;
> -  int sc_fpregs_offset;
> +  int sc_pc_offset = 0;
> +  int sc_regs_offset = 0;
> +  int sc_fpregs_offset = 0;
>   
> -  int jb_pc;			/* Offset to PC value in jump buffer.
> +  int jb_pc = 0;			/* Offset to PC value in jump buffer.
>   				   If htis is negative, longjmp support
>   				   will be disabled.  */
> -  size_t jb_elt_size;		/* And the size of each entry in the buf.  */
> +  size_t jb_elt_size = 0;		/* And the size of each entry in the buf.  */
>   };
>   
>   extern unsigned int alpha_read_insn (struct gdbarch *gdbarch, CORE_ADDR pc);
> diff --git a/gdb/amd64-darwin-tdep.c b/gdb/amd64-darwin-tdep.c
> index 3bd6296626d..5cf3ff266a4 100644
> --- a/gdb/amd64-darwin-tdep.c
> +++ b/gdb/amd64-darwin-tdep.c
> @@ -97,7 +97,7 @@ amd64_darwin_sigcontext_addr (struct frame_info *this_frame)
>   static void
>   x86_darwin_init_abi_64 (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     amd64_init_abi (info, gdbarch,
>   		  amd64_target_description (X86_XSTATE_SSE_MASK, true));
> diff --git a/gdb/amd64-fbsd-tdep.c b/gdb/amd64-fbsd-tdep.c
> index 289431306ab..5069342ca73 100644
> --- a/gdb/amd64-fbsd-tdep.c
> +++ b/gdb/amd64-fbsd-tdep.c
> @@ -195,7 +195,7 @@ amd64fbsd_iterate_over_regset_sections (struct gdbarch *gdbarch,
>   					void *cb_data,
>   					const struct regcache *regcache)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     cb (".reg", tdep->sizeof_gregset, tdep->sizeof_gregset, &i386_gregset, NULL,
>         cb_data);
> @@ -229,7 +229,7 @@ amd64fbsd_get_thread_local_address (struct gdbarch *gdbarch, ptid_t ptid,
>   static void
>   amd64fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* Generic FreeBSD support. */
>     fbsd_init_abi (info, gdbarch);
> diff --git a/gdb/amd64-linux-tdep.c b/gdb/amd64-linux-tdep.c
> index 715add8a7b0..817a197ceaa 100644
> --- a/gdb/amd64-linux-tdep.c
> +++ b/gdb/amd64-linux-tdep.c
> @@ -1650,7 +1650,7 @@ amd64_linux_iterate_over_regset_sections (struct gdbarch *gdbarch,
>   					  void *cb_data,
>   					  const struct regcache *regcache)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     cb (".reg", 27 * 8, 27 * 8, &i386_gregset, NULL, cb_data);
>     cb (".reg2", 512, 512, &amd64_fpregset, NULL, cb_data);
> @@ -1787,7 +1787,7 @@ static void
>   amd64_linux_init_abi_common(struct gdbarch_info info, struct gdbarch *gdbarch,
>   			    int num_disp_step_buffers)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     linux_init_abi (info, gdbarch, num_disp_step_buffers);
>   
> @@ -1840,7 +1840,7 @@ amd64_linux_init_abi_common(struct gdbarch_info info, struct gdbarch *gdbarch,
>   static void
>   amd64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     struct tdesc_arch_data *tdesc_data = info.tdesc_data;
>     const struct tdesc_feature *feature;
>     int valid_p;
> @@ -2054,7 +2054,7 @@ amd64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   static void
>   amd64_x32_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     struct tdesc_arch_data *tdesc_data = info.tdesc_data;
>     const struct tdesc_feature *feature;
>     int valid_p;
> diff --git a/gdb/amd64-netbsd-tdep.c b/gdb/amd64-netbsd-tdep.c
> index 439dd91febb..be8ee3725f6 100644
> --- a/gdb/amd64-netbsd-tdep.c
> +++ b/gdb/amd64-netbsd-tdep.c
> @@ -97,7 +97,7 @@ int amd64nbsd_r_reg_offset[] =
>   static void
>   amd64nbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* Initialize general-purpose register set details first.  */
>     tdep->gregset_reg_offset = amd64nbsd_r_reg_offset;
> diff --git a/gdb/amd64-obsd-tdep.c b/gdb/amd64-obsd-tdep.c
> index 070f19635aa..0da1dbf4e4b 100644
> --- a/gdb/amd64-obsd-tdep.c
> +++ b/gdb/amd64-obsd-tdep.c
> @@ -420,7 +420,7 @@ static const struct frame_unwind amd64obsd_trapframe_unwind =
>   static void
>   amd64obsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     amd64_init_abi (info, gdbarch,
>   		  amd64_target_description (X86_XSTATE_SSE_MASK, true));
> diff --git a/gdb/amd64-sol2-tdep.c b/gdb/amd64-sol2-tdep.c
> index e561c0d300c..4cb243bda40 100644
> --- a/gdb/amd64-sol2-tdep.c
> +++ b/gdb/amd64-sol2-tdep.c
> @@ -80,7 +80,7 @@ amd64_sol2_mcontext_addr (struct frame_info *this_frame)
>   static void
>   amd64_sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     tdep->gregset_reg_offset = amd64_sol2_gregset_reg_offset;
>     tdep->gregset_num_regs = ARRAY_SIZE (amd64_sol2_gregset_reg_offset);
> diff --git a/gdb/amd64-tdep.c b/gdb/amd64-tdep.c
> index de04bbd07c1..7c67359678b 100644
> --- a/gdb/amd64-tdep.c
> +++ b/gdb/amd64-tdep.c
> @@ -247,7 +247,7 @@ static const int amd64_dwarf_regmap_len =
>   static int
>   amd64_dwarf_reg_to_regnum (struct gdbarch *gdbarch, int reg)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int ymm0_regnum = tdep->ymm0_regnum;
>     int regnum = -1;
>   
> @@ -331,7 +331,7 @@ static const char * const amd64_dword_names[] =
>   static const char *
>   amd64_pseudo_register_name (struct gdbarch *gdbarch, int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     if (i386_byte_regnum_p (gdbarch, regnum))
>       return amd64_byte_names[regnum - tdep->al_regnum];
>     else if (i386_zmm_regnum_p (gdbarch, regnum))
> @@ -353,7 +353,7 @@ amd64_pseudo_register_read_value (struct gdbarch *gdbarch,
>   				  readable_regcache *regcache,
>   				  int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     value *result_value = allocate_value (register_type (gdbarch, regnum));
>     VALUE_LVAL (result_value) = lval_register;
> @@ -413,7 +413,7 @@ amd64_pseudo_register_write (struct gdbarch *gdbarch,
>   			     struct regcache *regcache,
>   			     int regnum, const gdb_byte *buf)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (i386_byte_regnum_p (gdbarch, regnum))
>       {
> @@ -465,7 +465,7 @@ static int
>   amd64_ax_pseudo_register_collect (struct gdbarch *gdbarch,
>   				  struct agent_expr *ax, int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (i386_byte_regnum_p (gdbarch, regnum))
>       {
> @@ -2739,7 +2739,7 @@ static struct amd64_frame_cache *
>   amd64_sigtramp_frame_cache (struct frame_info *this_frame, void **this_cache)
>   {
>     struct gdbarch *gdbarch = get_frame_arch (this_frame);
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>     struct amd64_frame_cache *cache;
>     CORE_ADDR addr;
> @@ -2821,7 +2821,8 @@ amd64_sigtramp_frame_sniffer (const struct frame_unwind *self,
>   			      struct frame_info *this_frame,
>   			      void **this_cache)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (get_frame_arch (this_frame));
> +  gdbarch *arch = get_frame_arch (this_frame);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (arch);
>   
>     /* We shouldn't even bother if we don't have a sigcontext_addr
>        handler.  */
> @@ -3021,7 +3022,7 @@ amd64_supply_fpregset (const struct regset *regset, struct regcache *regcache,
>   		       int regnum, const void *fpregs, size_t len)
>   {
>     struct gdbarch *gdbarch = regcache->arch ();
> -  const struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  const i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     gdb_assert (len >= tdep->sizeof_fpregset);
>     amd64_supply_fxsave (regcache, regnum, fpregs);
> @@ -3038,7 +3039,7 @@ amd64_collect_fpregset (const struct regset *regset,
>   			int regnum, void *fpregs, size_t len)
>   {
>     struct gdbarch *gdbarch = regcache->arch ();
> -  const struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  const i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     gdb_assert (len >= tdep->sizeof_fpregset);
>     amd64_collect_fxsave (regcache, regnum, fpregs);
> @@ -3062,7 +3063,8 @@ amd64_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
>     gdb_byte buf[8];
>     CORE_ADDR jb_addr;
>     struct gdbarch *gdbarch = get_frame_arch (frame);
> -  int jb_pc_offset = gdbarch_tdep (gdbarch)->jb_pc_offset;
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +  int jb_pc_offset = tdep->jb_pc_offset;
>     int len = TYPE_LENGTH (builtin_type (gdbarch)->builtin_func_ptr);
>   
>     /* If JB_PC_OFFSET is -1, we have no way to find out where the
> @@ -3105,7 +3107,7 @@ void
>   amd64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch,
>   		const target_desc *default_tdesc)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     const struct target_desc *tdesc = info.target_desc;
>     static const char *const stap_integer_prefixes[] = { "$", NULL };
>     static const char *const stap_register_prefixes[] = { "%", NULL };
> @@ -3284,7 +3286,7 @@ amd64_none_init_abi (gdbarch_info info, gdbarch *arch)
>   static struct type *
>   amd64_x32_pseudo_register_type (struct gdbarch *gdbarch, int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     switch (regnum - tdep->eax_regnum)
>       {
> @@ -3302,7 +3304,7 @@ void
>   amd64_x32_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch,
>   		    const target_desc *default_tdesc)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     amd64_init_abi (info, gdbarch, default_tdesc);
>   
> @@ -3372,7 +3374,7 @@ amd64_supply_fxsave (struct regcache *regcache, int regnum,
>   		     const void *fxsave)
>   {
>     struct gdbarch *gdbarch = regcache->arch ();
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     i387_supply_fxsave (regcache, regnum, fxsave);
>   
> @@ -3395,7 +3397,7 @@ amd64_supply_xsave (struct regcache *regcache, int regnum,
>   		    const void *xsave)
>   {
>     struct gdbarch *gdbarch = regcache->arch ();
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     i387_supply_xsave (regcache, regnum, xsave);
>   
> @@ -3430,7 +3432,7 @@ amd64_collect_fxsave (const struct regcache *regcache, int regnum,
>   		      void *fxsave)
>   {
>     struct gdbarch *gdbarch = regcache->arch ();
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     gdb_byte *regs = (gdb_byte *) fxsave;
>   
>     i387_collect_fxsave (regcache, regnum, fxsave);
> @@ -3451,7 +3453,7 @@ amd64_collect_xsave (const struct regcache *regcache, int regnum,
>   		     void *xsave, int gcore)
>   {
>     struct gdbarch *gdbarch = regcache->arch ();
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     gdb_byte *regs = (gdb_byte *) xsave;
>   
>     i387_collect_xsave (regcache, regnum, xsave, gcore);
> diff --git a/gdb/amd64-windows-tdep.c b/gdb/amd64-windows-tdep.c
> index ed783f6420c..fb3fe488ce1 100644
> --- a/gdb/amd64-windows-tdep.c
> +++ b/gdb/amd64-windows-tdep.c
> @@ -1277,7 +1277,7 @@ amd64_windows_auto_wide_charset (void)
>   static void
>   amd64_windows_init_abi_common (gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* The dwarf2 unwinder (appended very early by i386_gdbarch_init) is
>        preferred over the SEH one.  The reasons are:
> diff --git a/gdb/arc-linux-tdep.c b/gdb/arc-linux-tdep.c
> index 448fa370a36..de95d5acff9 100644
> --- a/gdb/arc-linux-tdep.c
> +++ b/gdb/arc-linux-tdep.c
> @@ -410,7 +410,7 @@ static std::vector<CORE_ADDR>
>   arc_linux_software_single_step (struct regcache *regcache)
>   {
>     struct gdbarch *gdbarch = regcache->arch ();
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  arc_gdbarch_tdep *tdep = (arc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     struct disassemble_info di = arc_disassemble_info (gdbarch);
>   
>     /* Read current instruction.  */
> @@ -692,7 +692,7 @@ arc_linux_core_read_description (struct gdbarch *gdbarch,
>   static void
>   arc_linux_init_osabi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  arc_gdbarch_tdep *tdep = (arc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     arc_linux_debug_printf ("GNU/Linux OS/ABI initialization.");
>   
> diff --git a/gdb/arc-tdep.c b/gdb/arc-tdep.c
> index 35874ebb510..475ba2a5614 100644
> --- a/gdb/arc-tdep.c
> +++ b/gdb/arc-tdep.c
> @@ -1002,7 +1002,7 @@ arc_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
>     arc_debug_printf ("called");
>   
>     struct gdbarch *gdbarch = get_frame_arch (frame);
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  arc_gdbarch_tdep *tdep = (arc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int pc_offset = tdep->jb_pc * ARC_REGISTER_SIZE;
>     gdb_byte buf[ARC_REGISTER_SIZE];
>     CORE_ADDR jb_addr = get_frame_register_unsigned (frame, ARC_FIRST_ARG_REGNUM);
> @@ -1832,7 +1832,8 @@ arc_make_sigtramp_frame_cache (struct frame_info *this_frame)
>   {
>     arc_debug_printf ("called");
>   
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (get_frame_arch (this_frame));
> +  gdbarch *arch = get_frame_arch (this_frame);
> +  arc_gdbarch_tdep *tdep = (arc_gdbarch_tdep *) gdbarch_tdep (arch);
>   
>     /* Allocate new frame cache instance and space for saved register info.  */
>     struct arc_frame_cache *cache = FRAME_OBSTACK_ZALLOC (struct arc_frame_cache);
> @@ -1906,11 +1907,10 @@ arc_sigtramp_frame_sniffer (const struct frame_unwind *self,
>   			    struct frame_info *this_frame,
>   			    void **this_cache)
>   {
> -  struct gdbarch_tdep *tdep;
> -
>     arc_debug_printf ("called");
>   
> -  tdep = gdbarch_tdep (get_frame_arch (this_frame));
> +  gdbarch *arch = get_frame_arch (this_frame);
> +  arc_gdbarch_tdep *tdep = (arc_gdbarch_tdep *) gdbarch_tdep (arch);
>   
>     /* If we have a sigcontext_addr handler, then just return 1 (same as the
>        "default_frame_sniffer ()").  */
> @@ -2295,11 +2295,11 @@ arc_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   
>     /* Allocate the ARC-private target-dependent information structure, and the
>        GDB target-independent information structure.  */
> -  gdb::unique_xmalloc_ptr<struct gdbarch_tdep> tdep
> -    (XCNEW (struct gdbarch_tdep));
> +  std::unique_ptr<arc_gdbarch_tdep> tdep_holder (new arc_gdbarch_tdep);
> +  arc_gdbarch_tdep *tdep = tdep_holder.get ();
>     tdep->jb_pc = -1; /* No longjmp support by default.  */
>     tdep->has_hw_loops = arc_check_for_hw_loops (tdesc, tdesc_data.get ());
> -  struct gdbarch *gdbarch = gdbarch_alloc (&info, tdep.release ());
> +  struct gdbarch *gdbarch = gdbarch_alloc (&info, tdep_holder.release ());
>   
>     /* Data types.  */
>     set_gdbarch_short_bit (gdbarch, 16);
> @@ -2384,7 +2384,7 @@ arc_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>        It can override functions set earlier.  */
>     gdbarch_init_osabi (info, gdbarch);
>   
> -  if (gdbarch_tdep (gdbarch)->jb_pc >= 0)
> +  if (tdep->jb_pc >= 0)
>       set_gdbarch_get_longjmp_target (gdbarch, arc_get_longjmp_target);
>   
>     /* Disassembler options.  Enforce CPU if it was specified in XML target
> @@ -2454,7 +2454,7 @@ arc_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   static void
>   arc_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  arc_gdbarch_tdep *tdep = (arc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     fprintf_unfiltered (file, "arc_dump_tdep: jb_pc = %i\n", tdep->jb_pc);
>   
> diff --git a/gdb/arc-tdep.h b/gdb/arc-tdep.h
> index 8bb005cc7d4..d8495ed3154 100644
> --- a/gdb/arc-tdep.h
> +++ b/gdb/arc-tdep.h
> @@ -121,27 +121,27 @@ extern bool arc_debug;
>   
>   /* Target-dependent information.  */
>   
> -struct gdbarch_tdep
> +struct arc_gdbarch_tdep : gdbarch_tdep
>   {
>     /* Offset to PC value in jump buffer.  If this is negative, longjmp
>        support will be disabled.  */
> -  int jb_pc;
> +  int jb_pc = 0;
>   
>     /* Whether target has hardware (aka zero-delay) loops.  */
> -  bool has_hw_loops;
> +  bool has_hw_loops = false;
>   
>     /* Detect sigtramp.  */
> -  bool (*is_sigtramp) (struct frame_info *);
> +  bool (*is_sigtramp) (struct frame_info *) = nullptr;
>   
>     /* Get address of sigcontext for sigtramp.  */
> -  CORE_ADDR (*sigcontext_addr) (struct frame_info *);
> +  CORE_ADDR (*sigcontext_addr) (struct frame_info *) = nullptr;
>   
>     /* Offset of registers in `struct sigcontext'.  */
> -  const int *sc_reg_offset;
> +  const int *sc_reg_offset = nullptr;
>   
>     /* Number of registers in sc_reg_offsets.  Most likely a ARC_LAST_REGNUM,
>        but in theory it could be less, so it is kept separate.  */
> -  int sc_num_regs;
> +  int sc_num_regs = 0;
>   };
>   
>   /* Utility functions used by other ARC-specific modules.  */
> diff --git a/gdb/arm-fbsd-tdep.c b/gdb/arm-fbsd-tdep.c
> index 3a179184550..a1482c49a43 100644
> --- a/gdb/arm-fbsd-tdep.c
> +++ b/gdb/arm-fbsd-tdep.c
> @@ -158,7 +158,7 @@ arm_fbsd_iterate_over_regset_sections (struct gdbarch *gdbarch,
>   				       void *cb_data,
>   				       const struct regcache *regcache)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     cb (".reg", ARM_FBSD_SIZEOF_GREGSET, ARM_FBSD_SIZEOF_GREGSET,
>         &arm_fbsd_gregset, NULL, cb_data);
> @@ -211,7 +211,7 @@ arm_fbsd_core_read_description (struct gdbarch *gdbarch,
>   static void
>   arm_fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* Generic FreeBSD support.  */
>     fbsd_init_abi (info, gdbarch);
> diff --git a/gdb/arm-linux-tdep.c b/gdb/arm-linux-tdep.c
> index c0dfc5fcf3e..025ecf0c625 100644
> --- a/gdb/arm-linux-tdep.c
> +++ b/gdb/arm-linux-tdep.c
> @@ -712,7 +712,7 @@ arm_linux_iterate_over_regset_sections (struct gdbarch *gdbarch,
>   					void *cb_data,
>   					const struct regcache *regcache)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     cb (".reg", ARM_LINUX_SIZEOF_GREGSET, ARM_LINUX_SIZEOF_GREGSET,
>         &arm_linux_gregset, NULL, cb_data);
> @@ -1714,7 +1714,7 @@ arm_linux_init_abi (struct gdbarch_info info,
>   								    NULL };
>     static const char *const stap_register_indirection_suffixes[] = { "]",
>   								    NULL };
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     linux_init_abi (info, gdbarch, 1);
>   
> diff --git a/gdb/arm-netbsd-tdep.c b/gdb/arm-netbsd-tdep.c
> index 38c2e81e45d..bf4e46ff617 100644
> --- a/gdb/arm-netbsd-tdep.c
> +++ b/gdb/arm-netbsd-tdep.c
> @@ -111,7 +111,7 @@ static void
>   arm_netbsd_init_abi_common (struct gdbarch_info info,
>   			    struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     tdep->lowest_pc = 0x8000;
>     switch (info.byte_order)
> @@ -148,7 +148,7 @@ static void
>   arm_netbsd_elf_init_abi (struct gdbarch_info info,
>   			 struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     arm_netbsd_init_abi_common (info, gdbarch);
>   
> diff --git a/gdb/arm-none-tdep.c b/gdb/arm-none-tdep.c
> index 2816c5954b3..a308c794aae 100644
> --- a/gdb/arm-none-tdep.c
> +++ b/gdb/arm-none-tdep.c
> @@ -177,7 +177,7 @@ arm_none_iterate_over_regset_sections (struct gdbarch *gdbarch,
>   				       void *cb_data,
>   				       const struct regcache *regcache)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     cb (".reg", ARM_NONE_SIZEOF_GREGSET, ARM_NONE_SIZEOF_GREGSET,
>         &arm_none_gregset, nullptr, cb_data);
> diff --git a/gdb/arm-obsd-tdep.c b/gdb/arm-obsd-tdep.c
> index ec7a7484dd5..4fa88538e34 100644
> --- a/gdb/arm-obsd-tdep.c
> +++ b/gdb/arm-obsd-tdep.c
> @@ -76,7 +76,7 @@ static void
>   armobsd_init_abi (struct gdbarch_info info,
>   		  struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (tdep->fp_model == ARM_FLOAT_AUTO)
>       tdep->fp_model = ARM_FLOAT_SOFT_VFP;
> diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c
> index 5b60831bbe9..7495434484e 100644
> --- a/gdb/arm-tdep.c
> +++ b/gdb/arm-tdep.c
> @@ -332,7 +332,9 @@ bool arm_apcs_32 = true;
>   int
>   arm_psr_thumb_bit (struct gdbarch *gdbarch)
>   {
> -  if (gdbarch_tdep (gdbarch)->is_m)
> +  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +
> +  if (tdep->is_m)
>       return XPSR_T;
>     else
>       return CPSR_T;
> @@ -438,6 +440,7 @@ arm_pc_is_thumb (struct gdbarch *gdbarch, CORE_ADDR memaddr)
>     struct bound_minimal_symbol sym;
>     char type;
>     arm_displaced_step_copy_insn_closure *dsc = nullptr;
> +  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (gdbarch_displaced_step_copy_insn_closure_by_addr_p (gdbarch))
>       dsc = ((arm_displaced_step_copy_insn_closure * )
> @@ -465,7 +468,7 @@ arm_pc_is_thumb (struct gdbarch *gdbarch, CORE_ADDR memaddr)
>       return 1;
>   
>     /* ARM v6-M and v7-M are always in Thumb mode.  */
> -  if (gdbarch_tdep (gdbarch)->is_m)
> +  if (tdep->is_m)
>       return 1;
>   
>     /* If there are mapping symbols, consult them.  */
> @@ -568,10 +571,11 @@ arm_m_addr_is_magic (CORE_ADDR addr)
>   static CORE_ADDR
>   arm_addr_bits_remove (struct gdbarch *gdbarch, CORE_ADDR val)
>   {
> +  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +
>     /* On M-profile devices, do not strip the low bit from EXC_RETURN
>        (the magic exception return address).  */
> -  if (gdbarch_tdep (gdbarch)->is_m
> -      && arm_m_addr_is_magic (val))
> +  if (tdep->is_m && arm_m_addr_is_magic (val))
>       return val;
>   
>     if (arm_apcs_32)
> @@ -1557,6 +1561,7 @@ arm_analyze_prologue (struct gdbarch *gdbarch,
>     CORE_ADDR offset, current_pc;
>     pv_t regs[ARM_FPS_REGNUM];
>     CORE_ADDR unrecognized_pc = 0;
> +  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* Search the prologue looking for instructions that set up the
>        frame pointer, adjust the stack pointer, and save registers.
> @@ -1661,7 +1666,7 @@ arm_analyze_prologue (struct gdbarch *gdbarch,
>   	}
>         else if ((insn & 0xffff7fff) == 0xed6d0103	/* stfe f?,
>   							   [sp, -#c]! */
> -	       && gdbarch_tdep (gdbarch)->have_fpa_registers)
> +	       && tdep->have_fpa_registers)
>   	{
>   	  if (stack.store_would_trash (regs[ARM_SP_REGNUM]))
>   	    break;
> @@ -1672,7 +1677,7 @@ arm_analyze_prologue (struct gdbarch *gdbarch,
>   	}
>         else if ((insn & 0xffbf0fff) == 0xec2d0200	/* sfmfd f0, 4,
>   							   [sp!] */
> -	       && gdbarch_tdep (gdbarch)->have_fpa_registers)
> +	       && tdep->have_fpa_registers)
>   	{
>   	  int n_saved_fp_regs;
>   	  unsigned int fp_start_reg, fp_bound_reg;
> @@ -1800,6 +1805,7 @@ arm_scan_prologue (struct frame_info *this_frame,
>     CORE_ADDR prologue_start, prologue_end;
>     CORE_ADDR prev_pc = get_frame_pc (this_frame);
>     CORE_ADDR block_addr = get_frame_address_in_block (this_frame);
> +  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* Assume there is no frame until proven otherwise.  */
>     cache->framereg = ARM_SP_REGNUM;
> @@ -1865,7 +1871,7 @@ arm_scan_prologue (struct frame_info *this_frame,
>         ULONGEST return_value;
>   
>         /* AAPCS does not use a frame register, so we can abort here.  */
> -      if (gdbarch_tdep (gdbarch)->arm_abi == ARM_ABI_AAPCS)
> +      if (tdep->arm_abi == ARM_ABI_AAPCS)
>   	return;
>   
>         frame_loc = get_frame_register_unsigned (this_frame, ARM_FP_REGNUM);
> @@ -1930,7 +1936,9 @@ arm_prologue_unwind_stop_reason (struct frame_info *this_frame,
>   
>     /* This is meant to halt the backtrace at "_start".  */
>     pc = get_frame_pc (this_frame);
> -  if (pc <= gdbarch_tdep (get_frame_arch (this_frame))->lowest_pc)
> +  gdbarch *arch = get_frame_arch (this_frame);
> +  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (arch);
> +  if (pc <= tdep->lowest_pc)
>       return UNWIND_OUTERMOST;
>   
>     /* If we've hit a wall, stop.  */
> @@ -3739,15 +3747,18 @@ arm_vfp_call_candidate (struct type *t, enum arm_vfp_cprc_base_type *base_type,
>   static int
>   arm_vfp_abi_for_function (struct gdbarch *gdbarch, struct type *func_type)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +
>     /* Variadic functions always use the base ABI.  Assume that functions
>        without debug info are not variadic.  */
>     if (func_type && check_typedef (func_type)->has_varargs ())
>       return 0;
> +
>     /* The VFP ABI is only supported as a variant of AAPCS.  */
>     if (tdep->arm_abi != ARM_ABI_AAPCS)
>       return 0;
> -  return gdbarch_tdep (gdbarch)->fp_model == ARM_FLOAT_VFP;
> +
> +  return tdep->fp_model == ARM_FLOAT_VFP;
>   }
>   
>   /* We currently only support passing parameters in integer registers, which
> @@ -3770,6 +3781,7 @@ arm_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
>     int use_vfp_abi;
>     struct type *ftype;
>     unsigned vfp_regs_free = (1 << 16) - 1;
> +  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* Determine the type of this function and whether the VFP ABI
>        applies.  */
> @@ -3827,7 +3839,7 @@ arm_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
>         align = (align + ARM_INT_REGISTER_SIZE - 1)
>   		& ~(ARM_INT_REGISTER_SIZE - 1);
>         /* Different ABIs have different maximum alignments.  */
> -      if (gdbarch_tdep (gdbarch)->arm_abi == ARM_ABI_APCS)
> +      if (tdep->arm_abi == ARM_ABI_APCS)
>   	{
>   	  /* The APCS ABI only requires word alignment.  */
>   	  align = ARM_INT_REGISTER_SIZE;
> @@ -4041,7 +4053,7 @@ arm_print_float_info (struct gdbarch *gdbarch, struct ui_file *file,
>   static struct type *
>   arm_ext_type (struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (!tdep->arm_ext_type)
>       tdep->arm_ext_type
> @@ -4054,7 +4066,7 @@ arm_ext_type (struct gdbarch *gdbarch)
>   static struct type *
>   arm_neon_double_type (struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (tdep->neon_double_type == NULL)
>       {
> @@ -4093,7 +4105,7 @@ arm_neon_double_type (struct gdbarch *gdbarch)
>   static struct type *
>   arm_neon_quad_type (struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (tdep->neon_quad_type == NULL)
>       {
> @@ -4131,7 +4143,7 @@ arm_neon_quad_type (struct gdbarch *gdbarch)
>   static bool
>   is_q_pseudo (struct gdbarch *gdbarch, int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* Q pseudo registers are available for both NEON (Q0~Q15) and
>        MVE (Q0~Q7) features.  */
> @@ -4152,7 +4164,7 @@ is_q_pseudo (struct gdbarch *gdbarch, int regnum)
>   static bool
>   is_s_pseudo (struct gdbarch *gdbarch, int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (tdep->have_s_pseudos
>         && regnum >= tdep->s_pseudo_base
> @@ -4171,7 +4183,7 @@ is_s_pseudo (struct gdbarch *gdbarch, int regnum)
>   static bool
>   is_mve_pseudo (struct gdbarch *gdbarch, int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (tdep->have_mve
>         && regnum >= tdep->mve_pseudo_base
> @@ -4187,7 +4199,7 @@ is_mve_pseudo (struct gdbarch *gdbarch, int regnum)
>   static struct type *
>   arm_register_type (struct gdbarch *gdbarch, int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (is_s_pseudo (gdbarch, regnum))
>       return builtin_type (gdbarch)->builtin_float;
> @@ -4369,9 +4381,10 @@ arm_adjust_breakpoint_address (struct gdbarch *gdbarch, CORE_ADDR bpaddr)
>     int buf_len;
>     enum bfd_endian order = gdbarch_byte_order_for_code (gdbarch);
>     int i, any, last_it, last_it_count;
> +  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* If we are using BKPT breakpoints, none of this is necessary.  */
> -  if (gdbarch_tdep (gdbarch)->thumb2_breakpoint == NULL)
> +  if (tdep->thumb2_breakpoint == NULL)
>       return bpaddr;
>   
>     /* ARM mode does not have this problem.  */
> @@ -7676,7 +7689,7 @@ arm_displaced_init_closure (struct gdbarch *gdbarch, CORE_ADDR from,
>   			    CORE_ADDR to,
>   			    arm_displaced_step_copy_insn_closure *dsc)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     unsigned int i, len, offset;
>     enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
>     int size = dsc->is_thumb? 2 : 4;
> @@ -7839,7 +7852,7 @@ static const gdb_byte arm_default_thumb_be_breakpoint[] = THUMB_BE_BREAKPOINT;
>   static int
>   arm_breakpoint_kind_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
>   
>     if (arm_pc_is_thumb (gdbarch, *pcptr))
> @@ -7874,7 +7887,7 @@ arm_breakpoint_kind_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr)
>   static const gdb_byte *
>   arm_sw_breakpoint_from_kind (struct gdbarch *gdbarch, int kind, int *size)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     switch (kind)
>       {
> @@ -7946,10 +7959,11 @@ arm_extract_return_value (struct type *type, struct regcache *regs,
>   {
>     struct gdbarch *gdbarch = regs->arch ();
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
> +  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (TYPE_CODE_FLT == type->code ())
>       {
> -      switch (gdbarch_tdep (gdbarch)->fp_model)
> +      switch (tdep->fp_model)
>   	{
>   	case ARM_FLOAT_FPA:
>   	  {
> @@ -8055,7 +8069,8 @@ arm_return_in_memory (struct gdbarch *gdbarch, struct type *type)
>         return (TYPE_LENGTH (type) > 16);
>       }
>   
> -  if (gdbarch_tdep (gdbarch)->arm_abi != ARM_ABI_APCS)
> +  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +  if (tdep->arm_abi != ARM_ABI_APCS)
>       {
>         /* The AAPCS says all aggregates not larger than a word are returned
>   	 in a register.  */
> @@ -8158,8 +8173,9 @@ arm_store_return_value (struct type *type, struct regcache *regs,
>     if (type->code () == TYPE_CODE_FLT)
>       {
>         gdb_byte buf[ARM_FP_REGISTER_SIZE];
> +      arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
> -      switch (gdbarch_tdep (gdbarch)->fp_model)
> +      switch (tdep->fp_model)
>   	{
>   	case ARM_FLOAT_FPA:
>   
> @@ -8246,7 +8262,7 @@ arm_return_value (struct gdbarch *gdbarch, struct value *function,
>   		  struct type *valtype, struct regcache *regcache,
>   		  gdb_byte *readbuf, const gdb_byte *writebuf)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     struct type *func_type = function ? value_type (function) : NULL;
>     enum arm_vfp_cprc_base_type vfp_base_type;
>     int vfp_base_count;
> @@ -8314,7 +8330,7 @@ static int
>   arm_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
>   {
>     struct gdbarch *gdbarch = get_frame_arch (frame);
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>     CORE_ADDR jb_addr;
>     gdb_byte buf[ARM_INT_REGISTER_SIZE];
> @@ -8503,7 +8519,8 @@ static void
>   show_fp_model (struct ui_file *file, int from_tty,
>   	       struct cmd_list_element *c, const char *value)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (target_gdbarch ());
> +  arm_gdbarch_tdep *tdep
> +    = (arm_gdbarch_tdep *) gdbarch_tdep (target_gdbarch ());
>   
>     if (arm_fp_model == ARM_FLOAT_AUTO
>         && gdbarch_bfd_arch_info (target_gdbarch ())->arch == bfd_arch_arm)
> @@ -8540,7 +8557,8 @@ static void
>   arm_show_abi (struct ui_file *file, int from_tty,
>   	     struct cmd_list_element *c, const char *value)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (target_gdbarch ());
> +  arm_gdbarch_tdep *tdep
> +    = (arm_gdbarch_tdep *) gdbarch_tdep (target_gdbarch ());
>   
>     if (arm_abi_global == ARM_ABI_AUTO
>         && gdbarch_bfd_arch_info (target_gdbarch ())->arch == bfd_arch_arm)
> @@ -8611,7 +8629,7 @@ show_disassembly_style_sfunc (struct ui_file *file, int from_tty,
>   static const char *
>   arm_register_name (struct gdbarch *gdbarch, int i)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (is_s_pseudo (gdbarch, i))
>       {
> @@ -8778,7 +8796,7 @@ static enum register_status
>   arm_mve_pseudo_read (struct gdbarch *gdbarch, readable_regcache *regcache,
>   		     int regnum, gdb_byte *buf)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* P0 is the first 16 bits of VPR.  */
>     return regcache->raw_read_part (tdep->mve_vpr_regnum, 0, 2, buf);
> @@ -8792,11 +8810,10 @@ arm_pseudo_read (struct gdbarch *gdbarch, readable_regcache *regcache,
>     char name_buf[4];
>     gdb_byte reg_buf[8];
>     int offset, double_regnum;
> +  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     gdb_assert (regnum >= num_regs);
>   
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> -
>     if (is_q_pseudo (gdbarch, regnum))
>       {
>         /* Quad-precision register.  */
> @@ -8865,7 +8882,7 @@ static void
>   arm_mve_pseudo_write (struct gdbarch *gdbarch, struct regcache *regcache,
>   		      int regnum, const gdb_byte *buf)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* P0 is the first 16 bits of VPR.  */
>     regcache->raw_write_part (tdep->mve_vpr_regnum, 0, 2, buf);
> @@ -8879,11 +8896,10 @@ arm_pseudo_write (struct gdbarch *gdbarch, struct regcache *regcache,
>     char name_buf[4];
>     gdb_byte reg_buf[8];
>     int offset, double_regnum;
> +  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     gdb_assert (regnum >= num_regs);
>   
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> -
>     if (is_q_pseudo (gdbarch, regnum))
>       {
>         /* Quad-precision register.  */
> @@ -8968,7 +8984,9 @@ arm_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
>   static void
>   arm_register_g_packet_guesses (struct gdbarch *gdbarch)
>   {
> -  if (gdbarch_tdep (gdbarch)->is_m)
> +  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +
> +  if (tdep->is_m)
>       {
>         const target_desc *tdesc;
>   
> @@ -9005,8 +9023,9 @@ arm_register_g_packet_guesses (struct gdbarch *gdbarch)
>   static int
>   arm_code_of_frame_writable (struct gdbarch *gdbarch, struct frame_info *frame)
>   {
> -  if (gdbarch_tdep (gdbarch)->is_m
> -      && get_frame_type (frame) == SIGTRAMP_FRAME)
> +  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +
> +  if (tdep->is_m && get_frame_type (frame) == SIGTRAMP_FRAME)
>       {
>         /* M-profile exception frames return to some magic PCs, where
>   	 isn't writable at all.  */
> @@ -9037,7 +9056,6 @@ arm_gnu_triplet_regexp (struct gdbarch *gdbarch)
>   static struct gdbarch *
>   arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   {
> -  struct gdbarch_tdep *tdep;
>     struct gdbarch *gdbarch;
>     struct gdbarch_list *best_arch;
>     enum arm_abi_kind arm_abi = arm_abi_global;
> @@ -9406,12 +9424,13 @@ arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>          best_arch != NULL;
>          best_arch = gdbarch_list_lookup_by_info (best_arch->next, &info))
>       {
> -      if (arm_abi != ARM_ABI_AUTO
> -	  && arm_abi != gdbarch_tdep (best_arch->gdbarch)->arm_abi)
> +      arm_gdbarch_tdep *tdep
> +	= (arm_gdbarch_tdep *) gdbarch_tdep (best_arch->gdbarch);
> +
> +      if (arm_abi != ARM_ABI_AUTO && arm_abi != tdep->arm_abi)
>   	continue;
>   
> -      if (fp_model != ARM_FLOAT_AUTO
> -	  && fp_model != gdbarch_tdep (best_arch->gdbarch)->fp_model)
> +      if (fp_model != ARM_FLOAT_AUTO && fp_model != tdep->fp_model)
>   	continue;
>   
>         /* There are various other properties in tdep that we do not
> @@ -9420,7 +9439,7 @@ arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   	 automatically disqualified.  */
>   
>         /* Do check is_m, though, since it might come from the binary.  */
> -      if (is_m != gdbarch_tdep (best_arch->gdbarch)->is_m)
> +      if (is_m != tdep->is_m)
>   	continue;
>   
>         /* Found a match.  */
> @@ -9430,7 +9449,7 @@ arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>     if (best_arch != NULL)
>       return best_arch->gdbarch;
>   
> -  tdep = XCNEW (struct gdbarch_tdep);
> +  arm_gdbarch_tdep *tdep = new arm_gdbarch_tdep;
>     gdbarch = gdbarch_alloc (&info, tdep);
>   
>     /* Record additional information about the architecture we are defining.
> @@ -9546,7 +9565,7 @@ arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   
>     /* This "info float" is FPA-specific.  Use the generic version if we
>        do not have FPA.  */
> -  if (gdbarch_tdep (gdbarch)->have_fpa_registers)
> +  if (tdep->have_fpa_registers)
>       set_gdbarch_print_float_info (gdbarch, arm_print_float_info);
>   
>     /* Internal <-> external register number maps.  */
> @@ -9692,7 +9711,7 @@ arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   static void
>   arm_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (tdep == NULL)
>       return;
> @@ -11868,7 +11887,8 @@ static int
>   arm_record_coproc_data_proc (insn_decode_record *arm_insn_r)
>   {
>     uint32_t op, op1_ebit, coproc, bits_24_25;
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (arm_insn_r->gdbarch);
> +  arm_gdbarch_tdep *tdep
> +    = (arm_gdbarch_tdep *) gdbarch_tdep (arm_insn_r->gdbarch);
>     struct regcache *reg_cache = arm_insn_r->regcache;
>   
>     arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 24, 27);
> @@ -12352,9 +12372,10 @@ thumb_record_misc (insn_decode_record *thumb_insn_r)
>   /* Handling opcode 110 insns.  */
>   
>   static int
> -thumb_record_ldm_stm_swi (insn_decode_record *thumb_insn_r)
> +thumb_record_ldm_stm_swi (insn_decode_record *thumb_insn_r)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (thumb_insn_r->gdbarch);
> +  arm_gdbarch_tdep *tdep
> +    = (arm_gdbarch_tdep *) gdbarch_tdep  (thumb_insn_r->gdbarch);
>     struct regcache *reg_cache = thumb_insn_r->regcache;
>   
>     uint32_t ret = 0; /* function return value: -1:record failure ;  0:success  */
> diff --git a/gdb/arm-tdep.h b/gdb/arm-tdep.h
> index 705aa77a0ed..a43031886b7 100644
> --- a/gdb/arm-tdep.h
> +++ b/gdb/arm-tdep.h
> @@ -87,69 +87,70 @@ enum struct_return
>   };
>   
>   /* Target-dependent structure in gdbarch.  */
> -struct gdbarch_tdep
> +struct arm_gdbarch_tdep : gdbarch_tdep
>   {
>     /* The ABI for this architecture.  It should never be set to
>        ARM_ABI_AUTO.  */
> -  enum arm_abi_kind arm_abi;
> +  enum arm_abi_kind arm_abi {};
>   
> -  enum arm_float_model fp_model; /* Floating point calling conventions.  */
> +  enum arm_float_model fp_model {}; /* Floating point calling conventions.  */
>   
> -  bool have_fpa_registers;	/* Does the target report the FPA registers?  */
> -  bool have_wmmx_registers;	/* Does the target report the WMMX registers?  */
> +  bool have_fpa_registers = false;	/* Does the target report the FPA registers?  */
> +  bool have_wmmx_registers = false;	/* Does the target report the WMMX registers?  */
>     /* The number of VFP registers reported by the target.  It is zero
>        if VFP registers are not supported.  */
> -  int vfp_register_count;
> -  bool have_s_pseudos;		/* Are we synthesizing the single precision
> +  int vfp_register_count = 0;
> +  bool have_s_pseudos = false;	/* Are we synthesizing the single precision
>   				   VFP registers?  */
> -  int s_pseudo_base;		/* Register number for the first S pseudo
> +  int s_pseudo_base = 0;	/* Register number for the first S pseudo
>   				   register.  */
> -  int s_pseudo_count;		/* Number of S pseudo registers.  */
> -  bool have_q_pseudos;		/* Are we synthesizing the quad precision
> +  int s_pseudo_count = 0;	/* Number of S pseudo registers.  */
> +  bool have_q_pseudos = false;	/* Are we synthesizing the quad precision
>   				   Q (NEON or MVE) registers?  Requires
>   				   have_s_pseudos.  */
> -  int q_pseudo_base;		/* Register number for the first quad
> +  int q_pseudo_base = 0;	/* Register number for the first quad
>   				   precision pseudo register.  */
> -  int q_pseudo_count;		/* Number of quad precision pseudo
> +  int q_pseudo_count = 0;	/* Number of quad precision pseudo
>   				   registers.  */
> -  bool have_neon;		/* Do we have a NEON unit?  */
> +  bool have_neon = false;	/* Do we have a NEON unit?  */
>   
> -  bool have_mve;		/* Do we have a MVE extension?  */
> -  int mve_vpr_regnum;		/* MVE VPR register number.  */
> -  int mve_pseudo_base;		/* Number of the first MVE pseudo register.  */
> -  int mve_pseudo_count;		/* Total number of MVE pseudo registers.  */
> +  bool have_mve = false;	/* Do we have a MVE extension?  */
> +  int mve_vpr_regnum = 0;	/* MVE VPR register number.  */
> +  int mve_pseudo_base = 0;	/* Number of the first MVE pseudo register.  */
> +  int mve_pseudo_count = 0;	/* Total number of MVE pseudo registers.  */
>   
> -  bool is_m;			/* Does the target follow the "M" profile.  */
> -  CORE_ADDR lowest_pc;		/* Lowest address at which instructions
> +  bool is_m = false;		/* Does the target follow the "M" profile.  */
> +  CORE_ADDR lowest_pc = 0;	/* Lowest address at which instructions
>   				   will appear.  */
>   
> -  const gdb_byte *arm_breakpoint;	/* Breakpoint pattern for an ARM insn.  */
> -  int arm_breakpoint_size;	/* And its size.  */
> -  const gdb_byte *thumb_breakpoint;	/* Breakpoint pattern for a Thumb insn.  */
> -  int thumb_breakpoint_size;	/* And its size.  */
> +  const gdb_byte *arm_breakpoint = nullptr;	/* Breakpoint pattern for an ARM insn.  */
> +  int arm_breakpoint_size = 0;	/* And its size.  */
> +  const gdb_byte *thumb_breakpoint = nullptr;	/* Breakpoint pattern for a Thumb insn.  */
> +  int thumb_breakpoint_size = 0;	/* And its size.  */
>   
>     /* If the Thumb breakpoint is an undefined instruction (which is
>        affected by IT blocks) rather than a BKPT instruction (which is
>        not), then we need a 32-bit Thumb breakpoint to preserve the
>        instruction count in IT blocks.  */
> -  const gdb_byte *thumb2_breakpoint;
> -  int thumb2_breakpoint_size;
> +  const gdb_byte *thumb2_breakpoint = nullptr;
> +  int thumb2_breakpoint_size = 0;
>   
> -  int jb_pc;			/* Offset to PC value in jump buffer.
> +  int jb_pc = 0;			/* Offset to PC value in jump buffer.
>   				   If this is negative, longjmp support
>   				   will be disabled.  */
> -  size_t jb_elt_size;		/* And the size of each entry in the buf.  */
> +  size_t jb_elt_size = 0;		/* And the size of each entry in the buf.  */
>   
>     /* Convention for returning structures.  */
> -  enum struct_return struct_return;
> +  enum struct_return struct_return {};
>   
>     /* ISA-specific data types.  */
> -  struct type *arm_ext_type;
> -  struct type *neon_double_type;
> -  struct type *neon_quad_type;
> +  struct type *arm_ext_type = nullptr;
> +  struct type *neon_double_type = nullptr;
> +  struct type *neon_quad_type = nullptr;
>   
>      /* syscall record.  */
> -  int (*arm_syscall_record) (struct regcache *regcache, unsigned long svc_number);
> +  int (*arm_syscall_record) (struct regcache *regcache,
> +			     unsigned long svc_number) = nullptr;
>   };
>   
>   /* Structures used for displaced stepping.  */
> diff --git a/gdb/arm-wince-tdep.c b/gdb/arm-wince-tdep.c
> index f81a0541418..46cf83503d9 100644
> --- a/gdb/arm-wince-tdep.c
> +++ b/gdb/arm-wince-tdep.c
> @@ -115,7 +115,7 @@ arm_wince_skip_main_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
>   static void
>   arm_wince_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     windows_init_abi (info, gdbarch);
>   
> diff --git a/gdb/avr-tdep.c b/gdb/avr-tdep.c
> index ea259b9a5c1..0db19865f31 100644
> --- a/gdb/avr-tdep.c
> +++ b/gdb/avr-tdep.c
> @@ -188,18 +188,18 @@ struct avr_unwind_cache
>     trad_frame_saved_reg *saved_regs;
>   };
>   
> -struct gdbarch_tdep
> +struct avr_gdbarch_tdep : gdbarch_tdep
>   {
>     /* Number of bytes stored to the stack by call instructions.
>        2 bytes for avr1-5 and avrxmega1-5, 3 bytes for avr6 and avrxmega6-7.  */
> -  int call_length;
> +  int call_length = 0;
>   
>     /* Type for void.  */
> -  struct type *void_type;
> +  struct type *void_type = nullptr;
>     /* Type for a function returning void.  */
> -  struct type *func_void_type;
> +  struct type *func_void_type = nullptr;
>     /* Type for a pointer to a function.  Used for the type of PC.  */
> -  struct type *pc_type;
> +  struct type *pc_type = nullptr;
>   };
>   
>   /* Lookup the name of a register given it's number.  */
> @@ -230,10 +230,14 @@ avr_register_type (struct gdbarch *gdbarch, int reg_nr)
>   {
>     if (reg_nr == AVR_PC_REGNUM)
>       return builtin_type (gdbarch)->builtin_uint32;
> +
> +  avr_gdbarch_tdep *tdep = (avr_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     if (reg_nr == AVR_PSEUDO_PC_REGNUM)
> -    return gdbarch_tdep (gdbarch)->pc_type;
> +    return tdep->pc_type;
> +
>     if (reg_nr == AVR_SP_REGNUM)
>       return builtin_type (gdbarch)->builtin_data_ptr;
> +
>     return builtin_type (gdbarch)->builtin_uint8;
>   }
>   
> @@ -745,13 +749,13 @@ avr_scan_prologue (struct gdbarch *gdbarch, CORE_ADDR pc_beg, CORE_ADDR pc_end,
>     gdb_assert (vpc < AVR_MAX_PROLOGUE_SIZE);
>   
>     /* Handle static small stack allocation using rcall or push.  */
> -
> +  avr_gdbarch_tdep *tdep = (avr_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     while (scan_stage == 1 && vpc < len)
>       {
>         insn = extract_unsigned_integer (&prologue[vpc], 2, byte_order);
>         if (insn == 0xd000)	/* rcall .+0 */
>   	{
> -	  info->size += gdbarch_tdep (gdbarch)->call_length;
> +	  info->size += tdep->call_length;
>   	  vpc += 2;
>   	}
>         else if (insn == 0x920f || insn == 0x921f)  /* push r0 or push r1 */
> @@ -984,7 +988,6 @@ avr_frame_unwind_cache (struct frame_info *this_frame,
>     ULONGEST this_base;
>     struct avr_unwind_cache *info;
>     struct gdbarch *gdbarch;
> -  struct gdbarch_tdep *tdep;
>     int i;
>   
>     if (*this_prologue_cache)
> @@ -1049,7 +1052,7 @@ avr_frame_unwind_cache (struct frame_info *this_frame,
>   
>     /* The previous frame's SP needed to be computed.  Save the computed
>        value.  */
> -  tdep = gdbarch_tdep (gdbarch);
> +  avr_gdbarch_tdep *tdep = (avr_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     info->saved_regs[AVR_SP_REGNUM].set_value (info->prev_sp
>   					     - 1 + tdep->call_length);
>   
> @@ -1131,7 +1134,7 @@ avr_frame_prev_register (struct frame_info *this_frame,
>   	  int i;
>   	  gdb_byte buf[3];
>   	  struct gdbarch *gdbarch = get_frame_arch (this_frame);
> -	  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +	  avr_gdbarch_tdep *tdep = (avr_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>   	  read_memory (info->saved_regs[AVR_PC_REGNUM].addr (),
>   		       buf, tdep->call_length);
> @@ -1273,7 +1276,8 @@ avr_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
>   {
>     int i;
>     gdb_byte buf[3];
> -  int call_length = gdbarch_tdep (gdbarch)->call_length;
> +  avr_gdbarch_tdep *tdep = (avr_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +  int call_length = tdep->call_length;
>     CORE_ADDR return_pc = avr_convert_iaddr_to_raw (bp_addr);
>     int regnum = AVR_ARGN_REGNUM;
>     struct stack_item *si = NULL;
> @@ -1424,7 +1428,6 @@ static struct gdbarch *
>   avr_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   {
>     struct gdbarch *gdbarch;
> -  struct gdbarch_tdep *tdep;
>     struct gdbarch_list *best_arch;
>     int call_length;
>   
> @@ -1456,12 +1459,15 @@ avr_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>          best_arch != NULL;
>          best_arch = gdbarch_list_lookup_by_info (best_arch->next, &info))
>       {
> -      if (gdbarch_tdep (best_arch->gdbarch)->call_length == call_length)
> +      avr_gdbarch_tdep *tdep
> +	= (avr_gdbarch_tdep *) gdbarch_tdep (best_arch->gdbarch);
> +
> +      if (tdep->call_length == call_length)
>   	return best_arch->gdbarch;
>       }
>   
>     /* None found, create a new architecture from the information provided.  */
> -  tdep = XCNEW (struct gdbarch_tdep);
> +  avr_gdbarch_tdep *tdep = new avr_gdbarch_tdep;
>     gdbarch = gdbarch_alloc (&info, tdep);
>     
>     tdep->call_length = call_length;
> diff --git a/gdb/bfin-tdep.c b/gdb/bfin-tdep.c
> index d381f927b8f..355f9f44465 100644
> --- a/gdb/bfin-tdep.c
> +++ b/gdb/bfin-tdep.c
> @@ -766,7 +766,8 @@ bfin_frame_align (struct gdbarch *gdbarch, CORE_ADDR address)
>   enum bfin_abi
>   bfin_abi (struct gdbarch *gdbarch)
>   {
> -  return gdbarch_tdep (gdbarch)->bfin_abi;
> +  bfin_gdbarch_tdep *tdep = (bfin_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +  return tdep->bfin_abi;
>   }
>   
>   /* Initialize the current architecture based on INFO.  If possible,
> @@ -779,7 +780,6 @@ bfin_abi (struct gdbarch *gdbarch)
>   static struct gdbarch *
>   bfin_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   {
> -  struct gdbarch_tdep *tdep;
>     struct gdbarch *gdbarch;
>     enum bfin_abi abi;
>   
> @@ -791,12 +791,16 @@ bfin_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>          arches != NULL;
>          arches = gdbarch_list_lookup_by_info (arches->next, &info))
>       {
> -      if (gdbarch_tdep (arches->gdbarch)->bfin_abi != abi)
> +      bfin_gdbarch_tdep *tdep
> +	= (bfin_gdbarch_tdep *) gdbarch_tdep (arches->gdbarch);
> +
> +      if (tdep->bfin_abi != abi)
>   	continue;
> +
>         return arches->gdbarch;
>       }
>   
> -  tdep = XCNEW (struct gdbarch_tdep);
> +  bfin_gdbarch_tdep *tdep = new bfin_gdbarch_tdep;
>     gdbarch = gdbarch_alloc (&info, tdep);
>   
>     tdep->bfin_abi = abi;
> diff --git a/gdb/bfin-tdep.h b/gdb/bfin-tdep.h
> index 309d4f4bfd5..70a18547e6b 100644
> --- a/gdb/bfin-tdep.h
> +++ b/gdb/bfin-tdep.h
> @@ -94,10 +94,10 @@ enum bfin_abi
>   };
>   
>   /* Target-dependent structure in gdbarch.  */
> -struct gdbarch_tdep
> +struct bfin_gdbarch_tdep : gdbarch_tdep
>   {
>     /* Which ABI is in use?  */
> -  enum bfin_abi bfin_abi;
> +  enum bfin_abi bfin_abi {};
>   };
>   
>   /* Return the Blackfin ABI associated with GDBARCH.  */
> diff --git a/gdb/bpf-tdep.c b/gdb/bpf-tdep.c
> index e520d5d3d49..b2cd913d9e1 100644
> --- a/gdb/bpf-tdep.c
> +++ b/gdb/bpf-tdep.c
> @@ -57,7 +57,7 @@ enum bpf_regnum
>   #define BPF_NUM_REGS	(BPF_PC_REGNUM + 1)
>   
>   /* Target-dependent structure in gdbarch.  */
> -struct gdbarch_tdep
> +struct bpf_gdbarch_tdep : gdbarch_tdep
>   {
>   };
>   
> @@ -321,7 +321,7 @@ bpf_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>       return arches->gdbarch;
>   
>     /* Allocate space for the new architecture.  */
> -  struct gdbarch_tdep *tdep = XCNEW (struct gdbarch_tdep);
> +  bpf_gdbarch_tdep *tdep = new bpf_gdbarch_tdep;
>     struct gdbarch *gdbarch = gdbarch_alloc (&info, tdep);
>   
>     /* Information about registers, etc.  */
> diff --git a/gdb/cris-linux-tdep.c b/gdb/cris-linux-tdep.c
> index 68a12dbe0e9..e7dbded1f5e 100644
> --- a/gdb/cris-linux-tdep.c
> +++ b/gdb/cris-linux-tdep.c
> @@ -33,7 +33,7 @@
>   static void
>   cris_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  cris_gdbarch_tdep *tdep = (cris_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     linux_init_abi (info, gdbarch, 0);
>   
> diff --git a/gdb/cris-tdep.c b/gdb/cris-tdep.c
> index 6b5dfc33076..691cad82c9d 100644
> --- a/gdb/cris-tdep.c
> +++ b/gdb/cris-tdep.c
> @@ -313,7 +313,7 @@ cris_sigtramp_frame_unwind_cache (struct frame_info *this_frame,
>   				  void **this_cache)
>   {
>     struct gdbarch *gdbarch = get_frame_arch (this_frame);
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  cris_gdbarch_tdep *tdep = (cris_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>     struct cris_unwind_cache *info;
>     CORE_ADDR addr;
> @@ -450,7 +450,7 @@ static int
>   crisv32_single_step_through_delay (struct gdbarch *gdbarch,
>   				   struct frame_info *this_frame)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  cris_gdbarch_tdep *tdep = (cris_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     ULONGEST erp;
>     int ret = 0;
>   
> @@ -695,7 +695,7 @@ cris_frame_unwind_cache (struct frame_info *this_frame,
>   			 void **this_prologue_cache)
>   {
>     struct gdbarch *gdbarch = get_frame_arch (this_frame);
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  cris_gdbarch_tdep *tdep = (cris_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     struct cris_unwind_cache *info;
>   
>     if ((*this_prologue_cache))
> @@ -1333,7 +1333,7 @@ crisv32_scan_prologue (CORE_ADDR pc, struct frame_info *this_frame,
>   static CORE_ADDR
>   cris_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  cris_gdbarch_tdep *tdep = (cris_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     CORE_ADDR func_addr, func_end;
>     struct symtab_and_line sal;
>     CORE_ADDR pc_after_prologue;
> @@ -1368,7 +1368,7 @@ cris_breakpoint_kind_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr)
>   static const gdb_byte *
>   cris_sw_breakpoint_from_kind (struct gdbarch *gdbarch, int kind, int *size)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  cris_gdbarch_tdep *tdep = (cris_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     static unsigned char break8_insn[] = {0x38, 0xe9};
>     static unsigned char break15_insn[] = {0x3f, 0xe9};
>   
> @@ -1387,7 +1387,7 @@ static int
>   cris_spec_reg_applicable (struct gdbarch *gdbarch,
>   			  struct cris_spec_reg spec_reg)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  cris_gdbarch_tdep *tdep = (cris_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     unsigned int version = tdep->cris_version;
>     
>     switch (spec_reg.applicable_version)
> @@ -3766,7 +3766,7 @@ cris_supply_gregset (const struct regset *regset, struct regcache *regcache,
>   		     int regnum, const void *gregs, size_t len)
>   {
>     struct gdbarch *gdbarch = regcache->arch ();
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  cris_gdbarch_tdep *tdep = (cris_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int i;
>     const cris_elf_greg_t *regp = static_cast<const cris_elf_greg_t *>(gregs);
>   
> @@ -3860,7 +3860,7 @@ Makes GDB use the NRP register instead of the ERP register in certain cases."),
>   static void
>   cris_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  cris_gdbarch_tdep *tdep = (cris_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     if (tdep != NULL)
>       {
>         fprintf_unfiltered (file, "cris_dump_tdep: tdep->cris_version = %i\n",
> @@ -3914,7 +3914,6 @@ static struct gdbarch *
>   cris_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   {
>     struct gdbarch *gdbarch;
> -  struct gdbarch_tdep *tdep;
>     unsigned int cris_version;
>   
>     if (usr_cmd_cris_version_valid)
> @@ -3940,17 +3939,17 @@ cris_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>          arches != NULL;
>          arches = gdbarch_list_lookup_by_info (arches->next, &info))
>       {
> -      if ((gdbarch_tdep (arches->gdbarch)->cris_version
> -	   == usr_cmd_cris_version)
> -	  && (gdbarch_tdep (arches->gdbarch)->cris_mode
> -	   == usr_cmd_cris_mode)
> -	  && (gdbarch_tdep (arches->gdbarch)->cris_dwarf2_cfi
> -	      == usr_cmd_cris_dwarf2_cfi))
> +      cris_gdbarch_tdep *tdep
> +	= (cris_gdbarch_tdep *) gdbarch_tdep (arches->gdbarch);
> +
> +      if (tdep->cris_version == usr_cmd_cris_version
> +	  && tdep->cris_mode == usr_cmd_cris_mode
> +	  && tdep->cris_dwarf2_cfi == usr_cmd_cris_dwarf2_cfi)
>   	return arches->gdbarch;
>       }
>   
>     /* No matching architecture was found.  Create a new one.  */
> -  tdep = XCNEW (struct gdbarch_tdep);
> +  cris_gdbarch_tdep *tdep = new cris_gdbarch_tdep;
>     info.byte_order = BFD_ENDIAN_LITTLE;
>     gdbarch = gdbarch_alloc (&info, tdep);
>   
> diff --git a/gdb/cris-tdep.h b/gdb/cris-tdep.h
> index d898f4d1e71..9b622942839 100644
> --- a/gdb/cris-tdep.h
> +++ b/gdb/cris-tdep.h
> @@ -24,11 +24,11 @@
>   #define CRIS_TDEP_H
>   
>   /* CRIS architecture specific information.  */
> -struct gdbarch_tdep
> +struct cris_gdbarch_tdep : gdbarch_tdep
>   {
> -  unsigned int cris_version;
> -  const char *cris_mode;
> -  int cris_dwarf2_cfi;
> +  unsigned int cris_version = 0;
> +  const char *cris_mode = nullptr;
> +  int cris_dwarf2_cfi = 0;
>   };
>   
>   #endif /* CRIS_TDEP_H */
> diff --git a/gdb/csky-tdep.c b/gdb/csky-tdep.c
> index 8835aba5e64..0b073fb6f62 100644
> --- a/gdb/csky-tdep.c
> +++ b/gdb/csky-tdep.c
> @@ -2164,7 +2164,6 @@ static struct gdbarch *
>   csky_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   {
>     struct gdbarch *gdbarch;
> -  struct gdbarch_tdep *tdep;
>   
>     /* Find a candidate among the list of pre-declared architectures.  */
>     arches = gdbarch_list_lookup_by_info (arches, &info);
> @@ -2173,7 +2172,7 @@ csky_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   
>     /* None found, create a new architecture from the information
>        provided.  */
> -  tdep = XCNEW (struct gdbarch_tdep);
> +  csky_gdbarch_tdep *tdep = new csky_gdbarch_tdep;
>     gdbarch = gdbarch_alloc (&info, tdep);
>   
>     /* Target data types.  */
> diff --git a/gdb/csky-tdep.h b/gdb/csky-tdep.h
> index 7fc1a92e0b6..d690e8f5191 100644
> --- a/gdb/csky-tdep.h
> +++ b/gdb/csky-tdep.h
> @@ -29,7 +29,7 @@ enum lr_type_t
>   };
>   
>   /* Target-dependent structure in gdbarch.  */
> -struct gdbarch_tdep
> +struct csky_gdbarch_tdep : gdbarch_tdep
>   {
>     /* This is Unused.  */
>   };
> diff --git a/gdb/frv-tdep.c b/gdb/frv-tdep.c
> index e105c27ae82..c74ea68fe84 100644
> --- a/gdb/frv-tdep.c
> +++ b/gdb/frv-tdep.c
> @@ -67,32 +67,33 @@ struct frv_unwind_cache		/* was struct frame_extra_info */
>      of structures, each of which gives all the necessary info for one
>      register.  Don't stick parallel arrays in here --- that's so
>      Fortran.  */
> -struct gdbarch_tdep
> +struct frv_gdbarch_tdep : gdbarch_tdep
>   {
>     /* Which ABI is in use?  */
> -  enum frv_abi frv_abi;
> +  enum frv_abi frv_abi {};
>   
>     /* How many general-purpose registers does this variant have?  */
> -  int num_gprs;
> +  int num_gprs = 0;
>   
>     /* How many floating-point registers does this variant have?  */
> -  int num_fprs;
> +  int num_fprs = 0;
>   
>     /* How many hardware watchpoints can it support?  */
> -  int num_hw_watchpoints;
> +  int num_hw_watchpoints = 0;
>   
>     /* How many hardware breakpoints can it support?  */
> -  int num_hw_breakpoints;
> +  int num_hw_breakpoints = 0;
>   
>     /* Register names.  */
> -  const char **register_names;
> +  const char **register_names = nullptr;
>   };
>   
>   /* Return the FR-V ABI associated with GDBARCH.  */
>   enum frv_abi
>   frv_abi (struct gdbarch *gdbarch)
>   {
> -  return gdbarch_tdep (gdbarch)->frv_abi;
> +  frv_gdbarch_tdep *tdep = (frv_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +  return tdep->frv_abi;
>   }
>   
>   /* Fetch the interpreter and executable loadmap addresses (for shared
> @@ -128,13 +129,12 @@ frv_fdpic_loadmap_addresses (struct gdbarch *gdbarch, CORE_ADDR *interp_addr,
>   
>   /* Allocate a new variant structure, and set up default values for all
>      the fields.  */
> -static struct gdbarch_tdep *
> +static frv_gdbarch_tdep *
>   new_variant (void)
>   {
> -  struct gdbarch_tdep *var;
>     int r;
>   
> -  var = XCNEW (struct gdbarch_tdep);
> +  frv_gdbarch_tdep *var = new frv_gdbarch_tdep;
>   
>     var->frv_abi = FRV_ABI_EABI;
>     var->num_gprs = 64;
> @@ -219,7 +219,7 @@ new_variant (void)
>   /* Indicate that the variant VAR has NUM_GPRS general-purpose
>      registers, and fill in the names array appropriately.  */
>   static void
> -set_variant_num_gprs (struct gdbarch_tdep *var, int num_gprs)
> +set_variant_num_gprs (frv_gdbarch_tdep *var, int num_gprs)
>   {
>     int r;
>   
> @@ -238,7 +238,7 @@ set_variant_num_gprs (struct gdbarch_tdep *var, int num_gprs)
>   /* Indicate that the variant VAR has NUM_FPRS floating-point
>      registers, and fill in the names array appropriately.  */
>   static void
> -set_variant_num_fprs (struct gdbarch_tdep *var, int num_fprs)
> +set_variant_num_fprs (frv_gdbarch_tdep *var, int num_fprs)
>   {
>     int r;
>   
> @@ -254,7 +254,7 @@ set_variant_num_fprs (struct gdbarch_tdep *var, int num_fprs)
>   }
>   
>   static void
> -set_variant_abi_fdpic (struct gdbarch_tdep *var)
> +set_variant_abi_fdpic (frv_gdbarch_tdep *var)
>   {
>     var->frv_abi = FRV_ABI_FDPIC;
>     var->register_names[fdpic_loadmap_exec_regnum] = xstrdup ("loadmap_exec");
> @@ -263,7 +263,7 @@ set_variant_abi_fdpic (struct gdbarch_tdep *var)
>   }
>   
>   static void
> -set_variant_scratch_registers (struct gdbarch_tdep *var)
> +set_variant_scratch_registers (frv_gdbarch_tdep *var)
>   {
>     var->register_names[scr0_regnum] = xstrdup ("scr0");
>     var->register_names[scr1_regnum] = xstrdup ("scr1");
> @@ -276,10 +276,12 @@ frv_register_name (struct gdbarch *gdbarch, int reg)
>   {
>     if (reg < 0)
>       return "?toosmall?";
> +
>     if (reg >= frv_num_regs + frv_num_pseudo_regs)
>       return "?toolarge?";
>   
> -  return gdbarch_tdep (gdbarch)->register_names[reg];
> +  frv_gdbarch_tdep *tdep = (frv_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +  return tdep->register_names[reg];
>   }
>   
>   
> @@ -1439,7 +1441,6 @@ static struct gdbarch *
>   frv_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   {
>     struct gdbarch *gdbarch;
> -  struct gdbarch_tdep *var;
>     int elf_flags = 0;
>   
>     /* Check to see if we've already built an appropriate architecture
> @@ -1449,7 +1450,7 @@ frv_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>       return arches->gdbarch;
>   
>     /* Select the right tdep structure for this variant.  */
> -  var = new_variant ();
> +  frv_gdbarch_tdep *var = new_variant ();
>     switch (info.bfd_arch_info->mach)
>       {
>       case bfd_mach_frv:
> diff --git a/gdb/ft32-tdep.c b/gdb/ft32-tdep.c
> index ff03acb4cbb..eec800cf68d 100644
> --- a/gdb/ft32-tdep.c
> +++ b/gdb/ft32-tdep.c
> @@ -109,7 +109,10 @@ static struct type *
>   ft32_register_type (struct gdbarch *gdbarch, int reg_nr)
>   {
>     if (reg_nr == FT32_PC_REGNUM)
> -    return gdbarch_tdep (gdbarch)->pc_type;
> +    {
> +      ft32_gdbarch_tdep *tdep = (ft32_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +      return tdep->pc_type;
> +    }
>     else if (reg_nr == FT32_SP_REGNUM || reg_nr == FT32_FP_REGNUM)
>       return builtin_type (gdbarch)->builtin_data_ptr;
>     else
> @@ -559,7 +562,6 @@ static struct gdbarch *
>   ft32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   {
>     struct gdbarch *gdbarch;
> -  struct gdbarch_tdep *tdep;
>     struct type *void_type;
>     struct type *func_void_type;
>   
> @@ -569,7 +571,7 @@ ft32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>       return arches->gdbarch;
>   
>     /* Allocate space for the new architecture.  */
> -  tdep = XCNEW (struct gdbarch_tdep);
> +  ft32_gdbarch_tdep *tdep = new ft32_gdbarch_tdep;
>     gdbarch = gdbarch_alloc (&info, tdep);
>   
>     /* Create a type for PC.  We can't use builtin types here, as they may not
> diff --git a/gdb/ft32-tdep.h b/gdb/ft32-tdep.h
> index 0303801e01c..c32f646a4a0 100644
> --- a/gdb/ft32-tdep.h
> +++ b/gdb/ft32-tdep.h
> @@ -20,10 +20,10 @@
>   #ifndef FT32_TDEP_H
>   #define FT32_TDEP_H
>   
> -struct gdbarch_tdep
> +struct ft32_gdbarch_tdep : gdbarch_tdep
>   {
>     /* Type for a pointer to a function.  Used for the type of PC.  */
> -  struct type *pc_type;
> +  struct type *pc_type = nullptr;
>   };
>   
>   #endif /* FT32_TDEP_H */
> diff --git a/gdb/gdbarch.h b/gdb/gdbarch.h
> index 979159ba2f5..f73d5624633 100644
> --- a/gdb/gdbarch.h
> +++ b/gdb/gdbarch.h
> @@ -62,6 +62,8 @@ struct inferior;
>   
>   #include "regcache.h"
>   
> +struct gdbarch_tdep {};
> +
>   /* The architecture associated with the inferior through the
>      connection to the target.
>   
> diff --git a/gdb/gdbarch.sh b/gdb/gdbarch.sh
> index 39a99d0d5f3..829f24192ae 100755
> --- a/gdb/gdbarch.sh
> +++ b/gdb/gdbarch.sh
> @@ -1333,6 +1333,8 @@ struct inferior;
>   
>   #include "regcache.h"
>   
> +struct gdbarch_tdep {};
> +
>   /* The architecture associated with the inferior through the
>      connection to the target.
>   
> diff --git a/gdb/hppa-bsd-tdep.c b/gdb/hppa-bsd-tdep.c
> index c68aaf1f490..f4567b48f82 100644
> --- a/gdb/hppa-bsd-tdep.c
> +++ b/gdb/hppa-bsd-tdep.c
> @@ -118,7 +118,7 @@ hppabsd_dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum,
>   void
>   hppabsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  hppa_gdbarch_tdep *tdep = (hppa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* OpenBSD and NetBSD have a 64-bit 'long double'.  */
>     set_gdbarch_long_double_bit (gdbarch, 64);
> diff --git a/gdb/hppa-linux-tdep.c b/gdb/hppa-linux-tdep.c
> index 52c642f0c7f..1dd6993ab09 100644
> --- a/gdb/hppa-linux-tdep.c
> +++ b/gdb/hppa-linux-tdep.c
> @@ -476,7 +476,7 @@ hppa_linux_iterate_over_regset_sections (struct gdbarch *gdbarch,
>   					 void *cb_data,
>   					 const struct regcache *regcache)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  hppa_gdbarch_tdep *tdep = (hppa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     cb (".reg", 80 * tdep->bytes_per_address, 80 * tdep->bytes_per_address,
>         &hppa_linux_regset, NULL, cb_data);
> @@ -486,7 +486,7 @@ hppa_linux_iterate_over_regset_sections (struct gdbarch *gdbarch,
>   static void
>   hppa_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  hppa_gdbarch_tdep *tdep = (hppa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     linux_init_abi (info, gdbarch, 0);
>   
> diff --git a/gdb/hppa-tdep.c b/gdb/hppa-tdep.c
> index 344022ccaa4..d64f9f7d937 100644
> --- a/gdb/hppa-tdep.c
> +++ b/gdb/hppa-tdep.c
> @@ -259,6 +259,7 @@ internalize_unwinds (struct objfile *objfile, struct unwind_table_entry *table,
>     if (size > 0)
>       {
>         struct gdbarch *gdbarch = objfile->arch ();
> +      hppa_gdbarch_tdep *tdep = (hppa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>         unsigned long tmp;
>         unsigned i;
>         char *buf = (char *) alloca (size);
> @@ -270,7 +271,7 @@ internalize_unwinds (struct objfile *objfile, struct unwind_table_entry *table,
>   	 Note that when loading a shared library (text_offset != 0) the
>   	 unwinds are already relative to the text_offset that will be
>   	 passed in.  */
> -      if (gdbarch_tdep (gdbarch)->is_elf && text_offset == 0)
> +      if (tdep->is_elf && text_offset == 0)
>   	{
>   	  low_text_segment_address = -1;
>   
> @@ -280,9 +281,9 @@ internalize_unwinds (struct objfile *objfile, struct unwind_table_entry *table,
>   
>   	  text_offset = low_text_segment_address;
>   	}
> -      else if (gdbarch_tdep (gdbarch)->solib_get_text_base)
> +      else if (tdep->solib_get_text_base)
>   	{
> -	  text_offset = gdbarch_tdep (gdbarch)->solib_get_text_base (objfile);
> +	  text_offset = tdep->solib_get_text_base (objfile);
>   	}
>   
>         bfd_get_section_contents (objfile->obfd, section, buf, 0, size);
> @@ -730,7 +731,7 @@ hppa32_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
>     /* Global pointer (r19) of the function we are trying to call.  */
>     CORE_ADDR gp;
>   
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  hppa_gdbarch_tdep *tdep = (hppa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     for (write_pass = 0; write_pass < 2; write_pass++)
>       {
> @@ -967,7 +968,7 @@ hppa64_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);
> +  hppa_gdbarch_tdep *tdep = (hppa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>     int i, offset = 0;
>     CORE_ADDR gp;
> @@ -2253,9 +2254,7 @@ hppa_frame_cache (struct frame_info *this_frame, void **this_cache)
>     }
>   
>     {
> -    struct gdbarch_tdep *tdep;
> -
> -    tdep = gdbarch_tdep (gdbarch);
> +    hppa_gdbarch_tdep *tdep = (hppa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>       if (tdep->unwind_adjust_stub)
>         tdep->unwind_adjust_stub (this_frame, cache->base, cache->saved_regs);
> @@ -2485,7 +2484,7 @@ hppa_stub_unwind_sniffer (const struct frame_unwind *self,
>   {
>     CORE_ADDR pc = get_frame_address_in_block (this_frame);
>     struct gdbarch *gdbarch = get_frame_arch (this_frame);
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  hppa_gdbarch_tdep *tdep = (hppa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (pc == 0
>         || (tdep->in_solib_call_trampoline != NULL
> @@ -3029,7 +3028,6 @@ hppa_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
>   static struct gdbarch *
>   hppa_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   {
> -  struct gdbarch_tdep *tdep;
>     struct gdbarch *gdbarch;
>   
>     /* find a candidate among the list of pre-declared architectures.  */
> @@ -3038,7 +3036,7 @@ hppa_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>       return (arches->gdbarch);
>   
>     /* If none found, then allocate and initialize one.  */
> -  tdep = XCNEW (struct gdbarch_tdep);
> +  hppa_gdbarch_tdep *tdep = new hppa_gdbarch_tdep;
>     gdbarch = gdbarch_alloc (&info, tdep);
>   
>     /* Determine from the bfd_arch_info structure if we are dealing with
> @@ -3162,7 +3160,7 @@ hppa_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   static void
>   hppa_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  hppa_gdbarch_tdep *tdep = (hppa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     fprintf_unfiltered (file, "bytes_per_address = %d\n",
>   		      tdep->bytes_per_address);
> diff --git a/gdb/hppa-tdep.h b/gdb/hppa-tdep.h
> index d033c14a569..72988813b2c 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;
>   };
>   
>   /*
> diff --git a/gdb/i386-bsd-tdep.c b/gdb/i386-bsd-tdep.c
> index fb5fcaa54de..7bddc7a32bc 100644
> --- a/gdb/i386-bsd-tdep.c
> +++ b/gdb/i386-bsd-tdep.c
> @@ -74,7 +74,7 @@ int i386bsd_sc_reg_offset[] =
>   void
>   i386bsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     tdep->jb_pc_offset = 0;
>   
> diff --git a/gdb/i386-darwin-tdep.c b/gdb/i386-darwin-tdep.c
> index c038d8bbc2a..900a0a6bf96 100644
> --- a/gdb/i386-darwin-tdep.c
> +++ b/gdb/i386-darwin-tdep.c
> @@ -156,7 +156,7 @@ i386_darwin_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);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>     gdb_byte buf[4];
>     int i;
> @@ -248,7 +248,7 @@ i386_darwin_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
>   static void
>   i386_darwin_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* We support the SSE registers.  */
>     tdep->num_xmm_regs = I386_NUM_XREGS - 1;
> diff --git a/gdb/i386-fbsd-tdep.c b/gdb/i386-fbsd-tdep.c
> index 103972490c4..01db76f57ab 100644
> --- a/gdb/i386-fbsd-tdep.c
> +++ b/gdb/i386-fbsd-tdep.c
> @@ -308,7 +308,7 @@ i386fbsd_iterate_over_regset_sections (struct gdbarch *gdbarch,
>   				       void *cb_data,
>   				       const struct regcache *regcache)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     cb (".reg", tdep->sizeof_gregset, tdep->sizeof_gregset, &i386_gregset, NULL,
>         cb_data);
> @@ -327,7 +327,7 @@ static CORE_ADDR
>   i386fbsd_get_thread_local_address (struct gdbarch *gdbarch, ptid_t ptid,
>   				   CORE_ADDR lm_addr, CORE_ADDR offset)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     struct regcache *regcache;
>   
>     if (tdep->fsbase_regnum == -1)
> @@ -349,7 +349,7 @@ i386fbsd_get_thread_local_address (struct gdbarch *gdbarch, ptid_t ptid,
>   static void
>   i386fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* Obviously FreeBSD is BSD-based.  */
>     i386bsd_init_abi (info, gdbarch);
> @@ -418,7 +418,7 @@ int i386fbsd4_sc_reg_offset[] =
>   static void
>   i386fbsd4_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* Generic FreeBSD support. */
>     fbsd_init_abi (info, gdbarch);
> diff --git a/gdb/i386-gnu-tdep.c b/gdb/i386-gnu-tdep.c
> index 33ccd3b9ebe..1f5e5f75012 100644
> --- a/gdb/i386-gnu-tdep.c
> +++ b/gdb/i386-gnu-tdep.c
> @@ -173,7 +173,7 @@ static int i386gnu_gregset_reg_offset[] =
>   static void
>   i386gnu_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* GNU uses ELF.  */
>     i386_elf_init_abi (info, gdbarch);
> diff --git a/gdb/i386-go32-tdep.c b/gdb/i386-go32-tdep.c
> index 7b9a4ca5c4a..31aef423818 100644
> --- a/gdb/i386-go32-tdep.c
> +++ b/gdb/i386-go32-tdep.c
> @@ -26,7 +26,7 @@
>   static void
>   i386_go32_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* DJGPP doesn't have any special frames for signal handlers.  */
>     tdep->sigtramp_p = NULL;
> diff --git a/gdb/i386-linux-tdep.c b/gdb/i386-linux-tdep.c
> index 1c065eecb4d..898b73f632c 100644
> --- a/gdb/i386-linux-tdep.c
> +++ b/gdb/i386-linux-tdep.c
> @@ -762,7 +762,7 @@ i386_linux_iterate_over_regset_sections (struct gdbarch *gdbarch,
>   					 void *cb_data,
>   					 const struct regcache *regcache)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     cb (".reg", 68, 68, &i386_gregset, NULL, cb_data);
>   
> @@ -824,7 +824,7 @@ i386_linux_displaced_step_copy_insn (struct gdbarch *gdbarch,
>   static void
>   i386_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     const struct target_desc *tdesc = info.target_desc;
>     struct tdesc_arch_data *tdesc_data = info.tdesc_data;
>     const struct tdesc_feature *feature;
> diff --git a/gdb/i386-netbsd-tdep.c b/gdb/i386-netbsd-tdep.c
> index 76dcc4db150..9915921ad54 100644
> --- a/gdb/i386-netbsd-tdep.c
> +++ b/gdb/i386-netbsd-tdep.c
> @@ -372,7 +372,7 @@ i386nbsd_sigtramp_cache_init (const struct tramp_frame *self,
>   static void
>   i386nbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* Obviously NetBSD is BSD-based.  */
>     i386bsd_init_abi (info, gdbarch);
> @@ -407,7 +407,7 @@ i386nbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   static void
>   i386nbsdelf_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* It's still NetBSD.  */
>     i386nbsd_init_abi (info, gdbarch);
> diff --git a/gdb/i386-nto-tdep.c b/gdb/i386-nto-tdep.c
> index 11e05e3ea97..4d443e667ff 100644
> --- a/gdb/i386-nto-tdep.c
> +++ b/gdb/i386-nto-tdep.c
> @@ -77,7 +77,7 @@ static void
>   i386nto_supply_gregset (struct regcache *regcache, char *gpregs)
>   {
>     struct gdbarch *gdbarch = regcache->arch ();
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     gdb_assert (tdep->gregset_reg_offset == i386nto_gregset_reg_offset);
>     i386_gregset.supply_regset (&i386_gregset, regcache, -1,
> @@ -126,7 +126,7 @@ static int
>   i386nto_register_area (struct gdbarch *gdbarch,
>   		       int regno, int regset, unsigned *off)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     *off = 0;
>     if (regset == NTO_REG_GENERAL)
> @@ -315,7 +315,7 @@ init_i386nto_ops (void)
>   static void
>   i386nto_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     static struct target_so_ops nto_svr4_so_ops;
>   
>     /* Deal with our strange signals.  */
> diff --git a/gdb/i386-obsd-tdep.c b/gdb/i386-obsd-tdep.c
> index 3f5606df006..ad0a7c8e9de 100644
> --- a/gdb/i386-obsd-tdep.c
> +++ b/gdb/i386-obsd-tdep.c
> @@ -407,7 +407,7 @@ static const struct frame_unwind i386obsd_trapframe_unwind = {
>   static void
>   i386obsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* Obviously OpenBSD is BSD-based.  */
>     i386bsd_init_abi (info, gdbarch);
> diff --git a/gdb/i386-sol2-tdep.c b/gdb/i386-sol2-tdep.c
> index acc85eead5b..e06ef36ef99 100644
> --- a/gdb/i386-sol2-tdep.c
> +++ b/gdb/i386-sol2-tdep.c
> @@ -65,7 +65,7 @@ i386_sol2_mcontext_addr (struct frame_info *this_frame)
>   static void
>   i386_sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* Solaris is SVR4-based.  */
>     i386_svr4_init_abi (info, gdbarch);
> diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c
> index f65a07492d2..ce18cf3e9be 100644
> --- a/gdb/i386-tdep.c
> +++ b/gdb/i386-tdep.c
> @@ -167,7 +167,7 @@ const int num_lower_zmm_regs = 16;
>   static int
>   i386_mmx_regnum_p (struct gdbarch *gdbarch, int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int mm0_regnum = tdep->mm0_regnum;
>   
>     if (mm0_regnum < 0)
> @@ -182,7 +182,7 @@ i386_mmx_regnum_p (struct gdbarch *gdbarch, int regnum)
>   int
>   i386_byte_regnum_p (struct gdbarch *gdbarch, int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     regnum -= tdep->al_regnum;
>     return regnum >= 0 && regnum < tdep->num_byte_regs;
> @@ -193,7 +193,7 @@ i386_byte_regnum_p (struct gdbarch *gdbarch, int regnum)
>   int
>   i386_word_regnum_p (struct gdbarch *gdbarch, int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     regnum -= tdep->ax_regnum;
>     return regnum >= 0 && regnum < tdep->num_word_regs;
> @@ -204,7 +204,7 @@ i386_word_regnum_p (struct gdbarch *gdbarch, int regnum)
>   int
>   i386_dword_regnum_p (struct gdbarch *gdbarch, int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int eax_regnum = tdep->eax_regnum;
>   
>     if (eax_regnum < 0)
> @@ -219,7 +219,7 @@ i386_dword_regnum_p (struct gdbarch *gdbarch, int regnum)
>   int
>   i386_zmmh_regnum_p (struct gdbarch *gdbarch, int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int zmm0h_regnum = tdep->zmm0h_regnum;
>   
>     if (zmm0h_regnum < 0)
> @@ -232,7 +232,7 @@ i386_zmmh_regnum_p (struct gdbarch *gdbarch, int regnum)
>   int
>   i386_zmm_regnum_p (struct gdbarch *gdbarch, int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int zmm0_regnum = tdep->zmm0_regnum;
>   
>     if (zmm0_regnum < 0)
> @@ -245,7 +245,7 @@ i386_zmm_regnum_p (struct gdbarch *gdbarch, int regnum)
>   int
>   i386_k_regnum_p (struct gdbarch *gdbarch, int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int k0_regnum = tdep->k0_regnum;
>   
>     if (k0_regnum < 0)
> @@ -258,7 +258,7 @@ i386_k_regnum_p (struct gdbarch *gdbarch, int regnum)
>   static int
>   i386_ymmh_regnum_p (struct gdbarch *gdbarch, int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int ymm0h_regnum = tdep->ymm0h_regnum;
>   
>     if (ymm0h_regnum < 0)
> @@ -273,7 +273,7 @@ i386_ymmh_regnum_p (struct gdbarch *gdbarch, int regnum)
>   int
>   i386_ymm_regnum_p (struct gdbarch *gdbarch, int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int ymm0_regnum = tdep->ymm0_regnum;
>   
>     if (ymm0_regnum < 0)
> @@ -286,7 +286,7 @@ i386_ymm_regnum_p (struct gdbarch *gdbarch, int regnum)
>   static int
>   i386_ymmh_avx512_regnum_p (struct gdbarch *gdbarch, int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int ymm16h_regnum = tdep->ymm16h_regnum;
>   
>     if (ymm16h_regnum < 0)
> @@ -299,7 +299,7 @@ i386_ymmh_avx512_regnum_p (struct gdbarch *gdbarch, int regnum)
>   int
>   i386_ymm_avx512_regnum_p (struct gdbarch *gdbarch, int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int ymm16_regnum = tdep->ymm16_regnum;
>   
>     if (ymm16_regnum < 0)
> @@ -314,7 +314,7 @@ i386_ymm_avx512_regnum_p (struct gdbarch *gdbarch, int regnum)
>   int
>   i386_bnd_regnum_p (struct gdbarch *gdbarch, int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int bnd0_regnum = tdep->bnd0_regnum;
>   
>     if (bnd0_regnum < 0)
> @@ -329,7 +329,7 @@ i386_bnd_regnum_p (struct gdbarch *gdbarch, int regnum)
>   int
>   i386_xmm_regnum_p (struct gdbarch *gdbarch, int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int num_xmm_regs = I387_NUM_XMM_REGS (tdep);
>   
>     if (num_xmm_regs == 0)
> @@ -344,7 +344,7 @@ i386_xmm_regnum_p (struct gdbarch *gdbarch, int regnum)
>   int
>   i386_xmm_avx512_regnum_p (struct gdbarch *gdbarch, int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int num_xmm_avx512_regs = I387_NUM_XMM_AVX512_REGS (tdep);
>   
>     if (num_xmm_avx512_regs == 0)
> @@ -357,7 +357,7 @@ i386_xmm_avx512_regnum_p (struct gdbarch *gdbarch, int regnum)
>   static int
>   i386_mxcsr_regnum_p (struct gdbarch *gdbarch, int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (I387_NUM_XMM_REGS (tdep) == 0)
>       return 0;
> @@ -370,7 +370,7 @@ i386_mxcsr_regnum_p (struct gdbarch *gdbarch, int regnum)
>   int
>   i386_fp_regnum_p (struct gdbarch *gdbarch, int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (I387_ST0_REGNUM (tdep) < 0)
>       return 0;
> @@ -382,7 +382,7 @@ i386_fp_regnum_p (struct gdbarch *gdbarch, int regnum)
>   int
>   i386_fpc_regnum_p (struct gdbarch *gdbarch, int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (I387_ST0_REGNUM (tdep) < 0)
>       return 0;
> @@ -396,7 +396,7 @@ i386_fpc_regnum_p (struct gdbarch *gdbarch, int regnum)
>   static int
>   i386_bndr_regnum_p (struct gdbarch *gdbarch, int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>      if (I387_BND0R_REGNUM (tdep) < 0)
>        return 0;
> @@ -410,7 +410,7 @@ i386_bndr_regnum_p (struct gdbarch *gdbarch, int regnum)
>   static int
>   i386_mpx_ctrl_regnum_p (struct gdbarch *gdbarch, int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>      if (I387_BNDCFGU_REGNUM (tdep) < 0)
>        return 0;
> @@ -424,7 +424,7 @@ i386_mpx_ctrl_regnum_p (struct gdbarch *gdbarch, int regnum)
>   bool
>   i386_pkru_regnum_p (struct gdbarch *gdbarch, int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int pkru_regnum = tdep->pkru_regnum;
>   
>     if (pkru_regnum < 0)
> @@ -460,7 +460,7 @@ i386_register_name (struct gdbarch *gdbarch, int regnum)
>   const char *
>   i386_pseudo_register_name (struct gdbarch *gdbarch, int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     if (i386_bnd_regnum_p (gdbarch, regnum))
>       return i386_bnd_names[regnum - tdep->bnd0_regnum];
>     if (i386_mmx_regnum_p (gdbarch, regnum))
> @@ -483,7 +483,7 @@ i386_pseudo_register_name (struct gdbarch *gdbarch, int regnum)
>   static int
>   i386_dbx_reg_to_regnum (struct gdbarch *gdbarch, int reg)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* This implements what GCC calls the "default" register map
>        (dbx_register_map[]).  */
> @@ -530,7 +530,7 @@ i386_dbx_reg_to_regnum (struct gdbarch *gdbarch, int reg)
>   static int
>   i386_svr4_dwarf_reg_to_regnum (struct gdbarch *gdbarch, int reg)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* This implements the GCC register map that tries to be compatible
>        with the SVR4 C compiler for DWARF (svr4_dbx_register_map[]).  */
> @@ -2432,7 +2432,7 @@ static struct i386_frame_cache *
>   i386_sigtramp_frame_cache (struct frame_info *this_frame, void **this_cache)
>   {
>     struct gdbarch *gdbarch = get_frame_arch (this_frame);
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>     struct i386_frame_cache *cache;
>     CORE_ADDR addr;
> @@ -2521,7 +2521,8 @@ i386_sigtramp_frame_sniffer (const struct frame_unwind *self,
>   			     struct frame_info *this_frame,
>   			     void **this_prologue_cache)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (get_frame_arch (this_frame));
> +  gdbarch *arch = get_frame_arch (this_frame);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (arch);
>   
>     /* We shouldn't even bother if we don't have a sigcontext_addr
>        handler.  */
> @@ -2608,7 +2609,8 @@ i386_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
>     CORE_ADDR sp, jb_addr;
>     struct gdbarch *gdbarch = get_frame_arch (frame);
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
> -  int jb_pc_offset = gdbarch_tdep (gdbarch)->jb_pc_offset;
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +  int jb_pc_offset = tdep->jb_pc_offset;
>   
>     /* If JB_PC_OFFSET is -1, we have no way to find out where the
>        longjmp will land.  */
> @@ -2815,7 +2817,7 @@ static void
>   i386_extract_return_value (struct gdbarch *gdbarch, struct type *type,
>   			   struct regcache *regcache, gdb_byte *valbuf)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int len = TYPE_LENGTH (type);
>     gdb_byte buf[I386_MAX_REGISTER_SIZE];
>   
> @@ -2873,7 +2875,7 @@ static void
>   i386_store_return_value (struct gdbarch *gdbarch, struct type *type,
>   			 struct regcache *regcache, const gdb_byte *valbuf)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int len = TYPE_LENGTH (type);
>   
>     if (type->code () == TYPE_CODE_FLT)
> @@ -2952,7 +2954,7 @@ static const char *struct_convention = default_struct_convention;
>   static int
>   i386_reg_struct_return_p (struct gdbarch *gdbarch, struct type *type)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     enum type_code code = type->code ();
>     int len = TYPE_LENGTH (type);
>   
> @@ -3054,7 +3056,7 @@ i386_return_value (struct gdbarch *gdbarch, struct value *function,
>   struct type *
>   i387_ext_type (struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (!tdep->i387_ext_type)
>       {
> @@ -3072,7 +3074,7 @@ i387_ext_type (struct gdbarch *gdbarch)
>   static struct type *
>   i386_bnd_type (struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>   
>     if (!tdep->i386_bnd_type)
> @@ -3108,7 +3110,7 @@ i386_bnd_type (struct gdbarch *gdbarch)
>   static struct type *
>   i386_zmm_type (struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (!tdep->i386_zmm_type)
>       {
> @@ -3167,7 +3169,7 @@ i386_zmm_type (struct gdbarch *gdbarch)
>   static struct type *
>   i386_ymm_type (struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (!tdep->i386_ymm_type)
>       {
> @@ -3224,7 +3226,7 @@ i386_ymm_type (struct gdbarch *gdbarch)
>   static struct type *
>   i386_mmx_type (struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (!tdep->i386_mmx_type)
>       {
> @@ -3300,7 +3302,8 @@ i386_pseudo_register_type (struct gdbarch *gdbarch, int regnum)
>   static int
>   i386_mmx_regnum_to_fp_regnum (readable_regcache *regcache, int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (regcache->arch ());
> +  gdbarch *arch = regcache->arch ();
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (arch);
>     int mmxreg, fpreg;
>     ULONGEST fstat;
>     int tos;
> @@ -3341,7 +3344,7 @@ i386_pseudo_register_read_into_value (struct gdbarch *gdbarch,
>       }
>     else
>       {
> -      struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +      i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>         if (i386_bnd_regnum_p (gdbarch, regnum))
>   	{
>   	  regnum -= tdep->bnd0_regnum;
> @@ -3531,7 +3534,7 @@ i386_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
>       }
>     else
>       {
> -      struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +      i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>         if (i386_bnd_regnum_p (gdbarch, regnum))
>   	{
> @@ -3639,7 +3642,7 @@ int
>   i386_ax_pseudo_register_collect (struct gdbarch *gdbarch,
>   				 struct agent_expr *ax, int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (i386_mmx_regnum_p (gdbarch, regnum))
>       {
> @@ -3856,7 +3859,7 @@ i386_supply_gregset (const struct regset *regset, struct regcache *regcache,
>   		     int regnum, const void *gregs, size_t len)
>   {
>     struct gdbarch *gdbarch = regcache->arch ();
> -  const struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  const i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     const gdb_byte *regs = (const gdb_byte *) gregs;
>     int i;
>   
> @@ -3881,7 +3884,7 @@ i386_collect_gregset (const struct regset *regset,
>   		      int regnum, void *gregs, size_t len)
>   {
>     struct gdbarch *gdbarch = regcache->arch ();
> -  const struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  const i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     gdb_byte *regs = (gdb_byte *) gregs;
>     int i;
>   
> @@ -3904,7 +3907,7 @@ i386_supply_fpregset (const struct regset *regset, struct regcache *regcache,
>   		      int regnum, const void *fpregs, size_t len)
>   {
>     struct gdbarch *gdbarch = regcache->arch ();
> -  const struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  const i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (len == I387_SIZEOF_FXSAVE)
>       {
> @@ -3927,7 +3930,7 @@ i386_collect_fpregset (const struct regset *regset,
>   		       int regnum, void *fpregs, size_t len)
>   {
>     struct gdbarch *gdbarch = regcache->arch ();
> -  const struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  const i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (len == I387_SIZEOF_FXSAVE)
>       {
> @@ -3959,7 +3962,7 @@ i386_iterate_over_regset_sections (struct gdbarch *gdbarch,
>   				   void *cb_data,
>   				   const struct regcache *regcache)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     cb (".reg", tdep->sizeof_gregset, tdep->sizeof_gregset, &i386_gregset, NULL,
>         cb_data);
> @@ -4464,7 +4467,7 @@ i386_elf_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   void
>   i386_svr4_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* System V Release 4 uses ELF.  */
>     i386_elf_init_abi (info, gdbarch);
> @@ -4513,7 +4516,7 @@ int
>   i386_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
>   			  struct reggroup *group)
>   {
> -  const struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  const i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int fp_regnum_p, mmx_regnum_p, xmm_regnum_p, mxcsr_regnum_p,
>         ymm_regnum_p, ymmh_regnum_p, ymm_avx512_regnum_p, ymmh_avx512_regnum_p,
>         bndr_regnum_p, bnd_regnum_p, zmm_regnum_p, zmmh_regnum_p,
> @@ -4958,7 +4961,7 @@ static int i386_record_floats (struct gdbarch *gdbarch,
>   			       struct i386_record_s *ir,
>   			       uint32_t iregnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int i;
>   
>     /* Oza: Because of floating point insn push/pop of fpu stack is going to
> @@ -5029,7 +5032,7 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
>     ULONGEST addr;
>     gdb_byte buf[I386_MAX_REGISTER_SIZE];
>     struct i386_record_s ir;
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     uint8_t rex_w = -1;
>     uint8_t rex_r = 0;
>   
> @@ -8191,7 +8194,7 @@ i386_floatformat_for_type (struct gdbarch *gdbarch,
>   }
>   
>   static int
> -i386_validate_tdesc_p (struct gdbarch_tdep *tdep,
> +i386_validate_tdesc_p (i386_gdbarch_tdep *tdep,
>   		       struct tdesc_arch_data *tdesc_data)
>   {
>     const struct target_desc *tdesc = tdep->tdesc;
> @@ -8393,7 +8396,6 @@ i386_type_align (struct gdbarch *gdbarch, struct type *type)
>   static struct gdbarch *
>   i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   {
> -  struct gdbarch_tdep *tdep;
>     struct gdbarch *gdbarch;
>     const struct target_desc *tdesc;
>     int mm0_regnum;
> @@ -8407,7 +8409,7 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>       return arches->gdbarch;
>   
>     /* Allocate space for the new architecture.  Assume i386 for now.  */
> -  tdep = XCNEW (struct gdbarch_tdep);
> +  i386_gdbarch_tdep *tdep = new i386_gdbarch_tdep;
>     gdbarch = gdbarch_alloc (&info, tdep);
>   
>     /* General-purpose registers.  */
> @@ -8651,7 +8653,7 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   
>     if (!i386_validate_tdesc_p (tdep, tdesc_data.get ()))
>       {
> -      xfree (tdep);
> +      delete tdep;
>         gdbarch_free (gdbarch);
>         return NULL;
>       }
> @@ -8784,12 +8786,12 @@ static unsigned long
>   i386_mpx_bd_base (void)
>   {
>     struct regcache *rcache;
> -  struct gdbarch_tdep *tdep;
>     ULONGEST ret;
>     enum register_status regstatus;
>   
>     rcache = get_current_regcache ();
> -  tdep = gdbarch_tdep (rcache->arch ());
> +  gdbarch *arch = rcache->arch ();
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (arch);
>   
>     regstatus = regcache_raw_read_unsigned (rcache, tdep->bndcfgu_regnum, &ret);
>   
> @@ -8802,7 +8804,8 @@ i386_mpx_bd_base (void)
>   int
>   i386_mpx_enabled (void)
>   {
> -  const struct gdbarch_tdep *tdep = gdbarch_tdep (get_current_arch ());
> +  gdbarch *arch = get_current_arch ();
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (arch);
>     const struct target_desc *tdesc = tdep->tdesc;
>   
>     return (tdesc_find_feature (tdesc, "org.gnu.gdb.i386.mpx") != NULL);
> diff --git a/gdb/i386-tdep.h b/gdb/i386-tdep.h
> index ee7655e9861..8f1819b58de 100644
> --- a/gdb/i386-tdep.h
> +++ b/gdb/i386-tdep.h
> @@ -57,206 +57,206 @@ enum struct_return
>   };
>   
>   /* i386 architecture specific information.  */
> -struct gdbarch_tdep
> +struct i386_gdbarch_tdep : gdbarch_tdep
>   {
>     /* General-purpose registers.  */
> -  int *gregset_reg_offset;
> -  int gregset_num_regs;
> -  size_t sizeof_gregset;
> +  int *gregset_reg_offset = 0;
> +  int gregset_num_regs = 0;
> +  size_t sizeof_gregset = 0;
>   
>     /* Floating-point registers.  */
> -  size_t sizeof_fpregset;
> +  size_t sizeof_fpregset = 0;
>   
>     /* Register number for %st(0).  The register numbers for the other
>        registers follow from this one.  Set this to -1 to indicate the
>        absence of an FPU.  */
> -  int st0_regnum;
> +  int st0_regnum = 0;
>   
>     /* Number of MMX registers.  */
> -  int num_mmx_regs;
> +  int num_mmx_regs = 0;
>   
>     /* Register number for %mm0.  Set this to -1 to indicate the absence
>        of MMX support.  */
> -  int mm0_regnum;
> +  int mm0_regnum = 0;
>   
>     /* Number of pseudo YMM registers.  */
> -  int num_ymm_regs;
> +  int num_ymm_regs = 0;
>   
>     /* Register number for %ymm0.  Set this to -1 to indicate the absence
>        of pseudo YMM register support.  */
> -  int ymm0_regnum;
> +  int ymm0_regnum = 0;
>   
>     /* Number of AVX512 OpMask registers (K-registers)  */
> -  int num_k_regs;
> +  int num_k_regs = 0;
>   
>     /* Register number for %k0.  Set this to -1 to indicate the absence
>        of AVX512 OpMask register support.  */
> -  int k0_regnum;
> +  int k0_regnum = 0;
>   
>     /* Number of pseudo ZMM registers ($zmm0-$zmm31).  */
> -  int num_zmm_regs;
> +  int num_zmm_regs = 0;
>   
>     /* Register number for %zmm0.  Set this to -1 to indicate the absence
>        of pseudo ZMM register support.  */
> -  int zmm0_regnum;
> +  int zmm0_regnum = 0;
>   
>     /* Number of byte registers.  */
> -  int num_byte_regs;
> +  int num_byte_regs = 0;
>   
>     /* Register pseudo number for %al.  */
> -  int al_regnum;
> +  int al_regnum = 0;
>   
>     /* Number of pseudo word registers.  */
> -  int num_word_regs;
> +  int num_word_regs = 0;
>   
>     /* Register number for %ax.  */
> -  int ax_regnum;
> +  int ax_regnum = 0;
>   
>     /* Number of pseudo dword registers.  */
> -  int num_dword_regs;
> +  int num_dword_regs = 0;
>   
>     /* Register number for %eax.  Set this to -1 to indicate the absence
>        of pseudo dword register support.  */
> -  int eax_regnum;
> +  int eax_regnum = 0;
>   
>     /* Number of core registers.  */
> -  int num_core_regs;
> +  int num_core_regs = 0;
>   
>     /* Number of SSE registers.  */
> -  int num_xmm_regs;
> +  int num_xmm_regs = 0;
>   
>     /* Number of SSE registers added in AVX512.  */
> -  int num_xmm_avx512_regs;
> +  int num_xmm_avx512_regs = 0;
>   
>     /* Register number of XMM16, the first XMM register added in AVX512.  */
> -  int xmm16_regnum;
> +  int xmm16_regnum = 0;
>   
>     /* Number of YMM registers added in AVX512.  */
> -  int num_ymm_avx512_regs;
> +  int num_ymm_avx512_regs = 0;
>   
>     /* Register number of YMM16, the first YMM register added in AVX512.  */
> -  int ymm16_regnum;
> +  int ymm16_regnum = 0;
>   
>     /* Bits of the extended control register 0 (the XFEATURE_ENABLED_MASK
>        register), excluding the x87 bit, which are supported by this GDB.  */
>   
> -  uint64_t xcr0;
> +  uint64_t xcr0 = 0;
>   
>     /* Offset of XCR0 in XSAVE extended state.  */
> -  int xsave_xcr0_offset;
> +  int xsave_xcr0_offset = 0;
>   
>     /* Register names.  */
> -  const char * const *register_names;
> +  const char * const *register_names = nullptr;
>   
>     /* Register number for %ymm0h.  Set this to -1 to indicate the absence
>        of upper YMM register support.  */
> -  int ymm0h_regnum;
> +  int ymm0h_regnum = 0;
>   
>     /* Upper YMM register names.  Only used for tdesc_numbered_register.  */
> -  const char * const *ymmh_register_names;
> +  const char * const *ymmh_register_names = nullptr;
>   
>     /* Register number for %ymm16h.  Set this to -1 to indicate the absence
>     of support for YMM16-31.  */
> -  int ymm16h_regnum;
> +  int ymm16h_regnum = 0;
>   
>     /* YMM16-31 register names.  Only used for tdesc_numbered_register.  */
> -  const char * const *ymm16h_register_names;
> +  const char * const *ymm16h_register_names = nullptr;
>   
>     /* Register number for %bnd0r.  Set this to -1 to indicate the absence
>        bound registers.  */
> -  int bnd0r_regnum;
> +  int bnd0r_regnum = 0;
>   
>     /* Register number for pseudo register %bnd0.  Set this to -1 to indicate the absence
>        bound registers.  */
> -  int bnd0_regnum;
> +  int bnd0_regnum = 0;
>   
>     /* Register number for %bndcfgu. Set this to -1 to indicate the absence
>        bound control registers.  */
> -  int bndcfgu_regnum;
> +  int bndcfgu_regnum = 0;
>   
>     /* MPX register names.  Only used for tdesc_numbered_register.  */
> -  const char * const *mpx_register_names;
> +  const char * const *mpx_register_names = nullptr;
>   
>     /* Register number for %zmm0h.  Set this to -1 to indicate the absence
>        of ZMM_HI256 register support.  */
> -  int zmm0h_regnum;
> +  int zmm0h_regnum = 0;
>   
>     /* OpMask register names.  */
> -  const char * const *k_register_names;
> +  const char * const *k_register_names = nullptr;
>   
>     /* ZMM register names.  Only used for tdesc_numbered_register.  */
> -  const char * const *zmmh_register_names;
> +  const char * const *zmmh_register_names = nullptr;
>   
>     /* XMM16-31 register names.  Only used for tdesc_numbered_register.  */
> -  const char * const *xmm_avx512_register_names;
> +  const char * const *xmm_avx512_register_names = nullptr;
>   
>     /* YMM16-31 register names.  Only used for tdesc_numbered_register.  */
> -  const char * const *ymm_avx512_register_names;
> +  const char * const *ymm_avx512_register_names = nullptr;
>   
>     /* Number of PKEYS registers.  */
> -  int num_pkeys_regs;
> +  int num_pkeys_regs = 0;
>   
>     /* Register number for PKRU register.  */
> -  int pkru_regnum;
> +  int pkru_regnum = 0;
>   
>     /* PKEYS register names.  */
> -  const char * const *pkeys_register_names;
> +  const char * const *pkeys_register_names = nullptr;
>   
>     /* Register number for %fsbase.  Set this to -1 to indicate the
>        absence of segment base registers.  */
> -  int fsbase_regnum;
> +  int fsbase_regnum = 0;
>   
>     /* Target description.  */
> -  const struct target_desc *tdesc;
> +  const struct target_desc *tdesc = nullptr;
>   
>     /* Register group function.  */
> -  gdbarch_register_reggroup_p_ftype *register_reggroup_p;
> +  gdbarch_register_reggroup_p_ftype *register_reggroup_p = nullptr;
>   
>     /* Offset of saved PC in jmp_buf.  */
> -  int jb_pc_offset;
> +  int jb_pc_offset = 0;
>   
>     /* Convention for returning structures.  */
> -  enum struct_return struct_return;
> +  enum struct_return struct_return {};
>   
>     /* Address range where sigtramp lives.  */
> -  CORE_ADDR sigtramp_start;
> -  CORE_ADDR sigtramp_end;
> +  CORE_ADDR sigtramp_start = 0;
> +  CORE_ADDR sigtramp_end = 0;
>   
>     /* Detect sigtramp.  */
> -  int (*sigtramp_p) (struct frame_info *);
> +  int (*sigtramp_p) (struct frame_info *) = nullptr;
>   
>     /* Get address of sigcontext for sigtramp.  */
> -  CORE_ADDR (*sigcontext_addr) (struct frame_info *);
> +  CORE_ADDR (*sigcontext_addr) (struct frame_info *) = nullptr;
>   
>     /* Offset of registers in `struct sigcontext'.  */
> -  int *sc_reg_offset;
> -  int sc_num_regs;
> +  int *sc_reg_offset = 0;
> +  int sc_num_regs = 0;
>   
>     /* Offset of saved PC and SP in `struct sigcontext'.  Usage of these
>        is deprecated, please use `sc_reg_offset' instead.  */
> -  int sc_pc_offset;
> -  int sc_sp_offset;
> +  int sc_pc_offset = 0;
> +  int sc_sp_offset = 0;
>   
>     /* ISA-specific data types.  */
> -  struct type *i386_mmx_type;
> -  struct type *i386_ymm_type;
> -  struct type *i386_zmm_type;
> -  struct type *i387_ext_type;
> -  struct type *i386_bnd_type;
> +  struct type *i386_mmx_type = nullptr;
> +  struct type *i386_ymm_type = nullptr;
> +  struct type *i386_zmm_type = nullptr;
> +  struct type *i387_ext_type = nullptr;
> +  struct type *i386_bnd_type = nullptr;
>   
>     /* Process record/replay target.  */
>     /* The map for registers because the AMD64's registers order
>        in GDB is not same as I386 instructions.  */
> -  const int *record_regmap;
> +  const int *record_regmap = nullptr;
>     /* Parse intx80 args.  */
> -  int (*i386_intx80_record) (struct regcache *regcache);
> +  int (*i386_intx80_record) (struct regcache *regcache) = nullptr;
>     /* Parse sysenter args.  */
> -  int (*i386_sysenter_record) (struct regcache *regcache);
> +  int (*i386_sysenter_record) (struct regcache *regcache) = nullptr;
>     /* Parse syscall args.  */
> -  int (*i386_syscall_record) (struct regcache *regcache);
> +  int (*i386_syscall_record) (struct regcache *regcache) = nullptr;
>   
>     /* Regsets. */
> -  const struct regset *fpregset;
> +  const struct regset *fpregset = nullptr;
>   };
>   
>   /* Floating-point registers.  */
> diff --git a/gdb/i386-windows-tdep.c b/gdb/i386-windows-tdep.c
> index b561d60e0f8..5ab1474c164 100644
> --- a/gdb/i386-windows-tdep.c
> +++ b/gdb/i386-windows-tdep.c
> @@ -136,7 +136,7 @@ i386_windows_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
>   static void
>   i386_windows_init_abi_common (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     set_gdbarch_skip_trampoline_code (gdbarch, i386_windows_skip_trampoline_code);
>   
> diff --git a/gdb/i387-tdep.c b/gdb/i387-tdep.c
> index cb1aa152f31..e5c78145bd7 100644
> --- a/gdb/i387-tdep.c
> +++ b/gdb/i387-tdep.c
> @@ -204,7 +204,7 @@ void
>   i387_print_float_info (struct gdbarch *gdbarch, struct ui_file *file,
>   		       struct frame_info *frame, const char *args)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (get_frame_arch (frame));
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     ULONGEST fctrl;
>     int fctrl_p;
>     ULONGEST fstat;
> @@ -440,7 +440,7 @@ void
>   i387_supply_fsave (struct regcache *regcache, int regnum, const void *fsave)
>   {
>     struct gdbarch *gdbarch = regcache->arch ();
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>     const gdb_byte *regs = (const gdb_byte *) fsave;
>     int i;
> @@ -494,7 +494,8 @@ i387_supply_fsave (struct regcache *regcache, int regnum, const void *fsave)
>   void
>   i387_collect_fsave (const struct regcache *regcache, int regnum, void *fsave)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (regcache->arch ());
> +  gdbarch *arch = regcache->arch ();
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (arch);
>     gdb_byte *regs = (gdb_byte *) fsave;
>     int i;
>   
> @@ -587,7 +588,8 @@ static int i387_tag (const gdb_byte *raw);
>   void
>   i387_supply_fxsave (struct regcache *regcache, int regnum, const void *fxsave)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (regcache->arch ());
> +  gdbarch *arch = regcache->arch ();
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (arch);
>     const gdb_byte *regs = (const gdb_byte *) fxsave;
>     int i;
>   
> @@ -670,7 +672,8 @@ i387_supply_fxsave (struct regcache *regcache, int regnum, const void *fxsave)
>   void
>   i387_collect_fxsave (const struct regcache *regcache, int regnum, void *fxsave)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (regcache->arch ());
> +  gdbarch *arch = regcache->arch ();
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (arch);
>     gdb_byte *regs = (gdb_byte *) fxsave;
>     int i;
>   
> @@ -903,7 +906,7 @@ i387_xsave_get_clear_bv (struct gdbarch *gdbarch, const void *xsave)
>   {
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>     const gdb_byte *regs = (const gdb_byte *) xsave;
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* Get `xstat_bv'.  The supported bits in `xstat_bv' are 8 bytes.  */
>     ULONGEST xstate_bv = extract_unsigned_integer (XSAVE_XSTATE_BV_ADDR (regs),
> @@ -923,7 +926,7 @@ i387_supply_xsave (struct regcache *regcache, int regnum,
>   {
>     struct gdbarch *gdbarch = regcache->arch ();
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     const gdb_byte *regs = (const gdb_byte *) xsave;
>     int i;
>     /* In 64-bit mode the split between "low" and "high" ZMM registers is at
> @@ -1346,7 +1349,7 @@ i387_collect_xsave (const struct regcache *regcache, int regnum,
>   {
>     struct gdbarch *gdbarch = regcache->arch ();
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     gdb_byte *p, *regs = (gdb_byte *) xsave;
>     gdb_byte raw[I386_MAX_REGISTER_SIZE];
>     ULONGEST initial_xstate_bv, clear_bv, xstate_bv = 0;
> @@ -1931,7 +1934,7 @@ i387_tag (const gdb_byte *raw)
>   void
>   i387_return_value (struct gdbarch *gdbarch, struct regcache *regcache)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     ULONGEST fstat;
>   
>     /* Set the top of the floating-point register stack to 7.  The
> @@ -1954,7 +1957,7 @@ i387_return_value (struct gdbarch *gdbarch, struct regcache *regcache)
>   void
>   i387_reset_bnd_regs (struct gdbarch *gdbarch, struct regcache *regcache)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (I387_BND0R_REGNUM (tdep) > 0)
>       {
> diff --git a/gdb/ia64-linux-tdep.c b/gdb/ia64-linux-tdep.c
> index 71767ddf83e..cf062f1754a 100644
> --- a/gdb/ia64-linux-tdep.c
> +++ b/gdb/ia64-linux-tdep.c
> @@ -216,7 +216,7 @@ ia64_linux_iterate_over_regset_sections (struct gdbarch *gdbarch,
>   static void
>   ia64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ia64_gdbarch_tdep *tdep = (ia64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     static const char *const stap_register_prefixes[] = { "r", NULL };
>     static const char *const stap_register_indirection_prefixes[] = { "[",
>   								    NULL };
> diff --git a/gdb/ia64-tdep.c b/gdb/ia64-tdep.c
> index b6816cb78b4..08c5d6a72ef 100644
> --- a/gdb/ia64-tdep.c
> +++ b/gdb/ia64-tdep.c
> @@ -310,7 +310,7 @@ static const struct floatformat *floatformats_ia64_ext[2] =
>   static struct type *
>   ia64_ext_type (struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ia64_gdbarch_tdep *tdep = (ia64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (!tdep->ia64_ext_type)
>       tdep->ia64_ext_type
> @@ -2177,7 +2177,7 @@ ia64_sigtramp_frame_init_saved_regs (struct frame_info *this_frame,
>   				     struct ia64_frame_cache *cache)
>   {
>     struct gdbarch *gdbarch = get_frame_arch (this_frame);
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ia64_gdbarch_tdep *tdep = (ia64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (tdep->sigcontext_register_address)
>       {
> @@ -2335,7 +2335,8 @@ ia64_sigtramp_frame_sniffer (const struct frame_unwind *self,
>   			     struct frame_info *this_frame,
>   			     void **this_cache)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (get_frame_arch (this_frame));
> +  gdbarch *arch = get_frame_arch (this_frame);
> +  ia64_gdbarch_tdep *tdep = (ia64_gdbarch_tdep *) gdbarch_tdep (arch);
>     if (tdep->pc_in_sigtramp)
>       {
>         CORE_ADDR pc = get_frame_pc (this_frame);
> @@ -3482,7 +3483,7 @@ ia64_find_global_pointer_from_dynamic_section (struct gdbarch *gdbarch,
>   static CORE_ADDR
>   ia64_find_global_pointer (struct gdbarch *gdbarch, CORE_ADDR faddr)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ia64_gdbarch_tdep *tdep = (ia64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     CORE_ADDR addr = 0;
>   
>     if (tdep->find_global_pointer_from_solib)
> @@ -3677,7 +3678,7 @@ ia64_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);
> +  ia64_gdbarch_tdep *tdep = (ia64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>     int argno;
>     struct value *arg;
> @@ -3917,14 +3918,13 @@ static struct gdbarch *
>   ia64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   {
>     struct gdbarch *gdbarch;
> -  struct gdbarch_tdep *tdep;
>   
>     /* If there is already a candidate, use it.  */
>     arches = gdbarch_list_lookup_by_info (arches, &info);
>     if (arches != NULL)
>       return arches->gdbarch;
>   
> -  tdep = XCNEW (struct gdbarch_tdep);
> +  ia64_gdbarch_tdep *tdep = new ia64_gdbarch_tdep;
>     gdbarch = gdbarch_alloc (&info, tdep);
>   
>     tdep->size_of_register_frame = ia64_size_of_register_frame;
> diff --git a/gdb/ia64-tdep.h b/gdb/ia64-tdep.h
> index 28bf4463fd6..82319d50894 100644
> --- a/gdb/ia64-tdep.h
> +++ b/gdb/ia64-tdep.h
> @@ -20,6 +20,8 @@
>   #ifndef IA64_TDEP_H
>   #define IA64_TDEP_H
>   
> +#include "gdbarch.h"
> +
>   #ifdef HAVE_LIBUNWIND_IA64_H
>   #include "libunwind-ia64.h"
>   #include "ia64-libunwind-tdep.h"
> @@ -214,30 +216,33 @@ struct ia64_infcall_ops
>   
>        Should do nothing if this operation is not permitted by the OS.  */
>     void (*allocate_new_rse_frame) (struct regcache *regcache, ULONGEST bsp,
> -				  int sof);
> +				  int sof) = nullptr;
>   
>     /* Store the argument stored in BUF into the appropriate location
>        given the BSP and the SLOTNUM.  */
>     void (*store_argument_in_slot) (struct regcache *regcache, CORE_ADDR bsp,
> -				  int slotnum, gdb_byte *buf);
> +				  int slotnum, gdb_byte *buf) = nullptr;
>   
>     /* For targets where we cannot call the function directly, store
>        the address of the function we want to call at the location
>        expected by the calling sequence.  */
> -  void (*set_function_addr) (struct regcache *regcache, CORE_ADDR func_addr);
> +  void (*set_function_addr) (struct regcache *regcache, CORE_ADDR func_addr)
> +    = nullptr;
>   };
>   
> -struct gdbarch_tdep
> +struct ia64_gdbarch_tdep : gdbarch_tdep
>   {
> -  CORE_ADDR (*sigcontext_register_address) (struct gdbarch *, CORE_ADDR, int);
> -  int (*pc_in_sigtramp) (CORE_ADDR);
> +  CORE_ADDR (*sigcontext_register_address) (struct gdbarch *, CORE_ADDR, int)
> +    = nullptr;
> +  int (*pc_in_sigtramp) (CORE_ADDR) = nullptr;
>   
>     /* Return the total size of THIS_FRAME's register frame.
>        CFM is THIS_FRAME's cfm register value.
>   
>        Normally, the size of the register frame is always obtained by
>        extracting the lowest 7 bits ("cfm & 0x7f").  */
> -  int (*size_of_register_frame) (struct frame_info *this_frame, ULONGEST cfm);
> +  int (*size_of_register_frame) (struct frame_info *this_frame, ULONGEST cfm)
> +    = nullptr;
>   
>     /* Determine the function address FADDR belongs to a shared library.
>        If it does, then return the associated global pointer.  If no shared
> @@ -245,10 +250,10 @@ struct gdbarch_tdep
>   
>        This pointer may be NULL.  */
>     CORE_ADDR (*find_global_pointer_from_solib) (struct gdbarch *gdbarch,
> -					       CORE_ADDR faddr);
> +					       CORE_ADDR faddr) = nullptr;
>   
>     /* ISA-specific data types.  */
> -  struct type *ia64_ext_type;
> +  struct type *ia64_ext_type = nullptr;
>   
>     struct ia64_infcall_ops infcall_ops;
>   };
> diff --git a/gdb/lm32-tdep.c b/gdb/lm32-tdep.c
> index 9c5dda306d0..3f91c050b47 100644
> --- a/gdb/lm32-tdep.c
> +++ b/gdb/lm32-tdep.c
> @@ -42,7 +42,7 @@
>   #define LM32_REG2(insn)         ((insn >> 11) & 0x1f)
>   #define LM32_IMM16(insn)        ((((long)insn & 0xffff) << 16) >> 16)
>   
> -struct gdbarch_tdep
> +struct lm32_gdbarch_tdep : gdbarch_tdep
>   {
>     /* gdbarch target dependent data here.  Currently unused for LM32.  */
>   };
> @@ -491,7 +491,6 @@ static struct gdbarch *
>   lm32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   {
>     struct gdbarch *gdbarch;
> -  struct gdbarch_tdep *tdep;
>   
>     /* If there is already a candidate, use it.  */
>     arches = gdbarch_list_lookup_by_info (arches, &info);
> @@ -499,7 +498,7 @@ lm32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>       return arches->gdbarch;
>   
>     /* None found, create a new architecture from the information provided.  */
> -  tdep = XCNEW (struct gdbarch_tdep);
> +  lm32_gdbarch_tdep *tdep = new lm32_gdbarch_tdep;
>     gdbarch = gdbarch_alloc (&info, tdep);
>   
>     /* Type sizes.  */
> diff --git a/gdb/m32c-tdep.c b/gdb/m32c-tdep.c
> index 3374b00cb5a..200d51a16b1 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;
>   };
>   
>   \f
> @@ -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.  */
> diff --git a/gdb/m32r-tdep.c b/gdb/m32r-tdep.c
> index 48cc42c868b..a9906ff39a6 100644
> --- a/gdb/m32r-tdep.c
> +++ b/gdb/m32r-tdep.c
> @@ -865,7 +865,6 @@ static struct gdbarch *
>   m32r_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   {
>     struct gdbarch *gdbarch;
> -  struct gdbarch_tdep *tdep;
>   
>     /* If there is already a candidate, use it.  */
>     arches = gdbarch_list_lookup_by_info (arches, &info);
> @@ -873,7 +872,7 @@ m32r_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>       return arches->gdbarch;
>   
>     /* Allocate space for the new architecture.  */
> -  tdep = XCNEW (struct gdbarch_tdep);
> +  m32r_gdbarch_tdep *tdep = new m32r_gdbarch_tdep;
>     gdbarch = gdbarch_alloc (&info, tdep);
>   
>     set_gdbarch_wchar_bit (gdbarch, 16);
> diff --git a/gdb/m32r-tdep.h b/gdb/m32r-tdep.h
> index ba6bad9a3e8..22c333cff7d 100644
> --- a/gdb/m32r-tdep.h
> +++ b/gdb/m32r-tdep.h
> @@ -20,7 +20,9 @@
>   #ifndef M32R_TDEP_H
>   #define M32R_TDEP_H
>   
> -struct gdbarch_tdep
> +#include "gdbarch.h"
> +
> +struct m32r_gdbarch_tdep : gdbarch_tdep
>   {
>     /* gdbarch target dependent data here.  Currently unused for M32R.  */
>   };
> diff --git a/gdb/m68hc11-tdep.c b/gdb/m68hc11-tdep.c
> index bbf7e5d98e8..6d41fe85f95 100644
> --- a/gdb/m68hc11-tdep.c
> +++ b/gdb/m68hc11-tdep.c
> @@ -123,27 +123,38 @@ enum insn_return_kind {
>   #define M68HC12_HARD_PC_REGNUM  (SOFT_D32_REGNUM+1)
>   
>   struct insn_sequence;
> -struct gdbarch_tdep
> +struct m68gc11_gdbarch_tdep : gdbarch_tdep
>     {
>       /* Stack pointer correction value.  For 68hc11, the stack pointer points
>          to the next push location.  An offset of 1 must be applied to obtain
>          the address where the last value is saved.  For 68hc12, the stack
>          pointer points to the last value pushed.  No offset is necessary.  */
> -    int stack_correction;
> +    int stack_correction = 0;
>   
>       /* Description of instructions in the prologue.  */
> -    struct insn_sequence *prologue;
> +    struct insn_sequence *prologue = nullptr;
>   
>       /* True if the page memory bank register is available
>          and must be used.  */
> -    int use_page_register;
> +    int use_page_register = 0;
>   
>       /* ELF flags for ABI.  */
> -    int elf_flags;
> +    int elf_flags = 0;
>     };
>   
> -#define STACK_CORRECTION(gdbarch) (gdbarch_tdep (gdbarch)->stack_correction)
> -#define USE_PAGE_REGISTER(gdbarch) (gdbarch_tdep (gdbarch)->use_page_register)
> +static int
> +stack_correction (gdbarch *arch)
> +{
> +  m68gc11_gdbarch_tdep *tdep = (m68gc11_gdbarch_tdep *) gdbarch_tdep (arch);
> +  return tdep->stack_correction;
> +}
> +
> +static int
> +use_page_register (gdbarch *arch)
> +{
> +  m68gc11_gdbarch_tdep *tdep = (m68gc11_gdbarch_tdep *) gdbarch_tdep (arch);
> +  return tdep->stack_correction;
> +}
>   
>   struct m68hc11_unwind_cache
>   {
> @@ -371,13 +382,15 @@ m68hc11_pseudo_register_write (struct gdbarch *gdbarch,
>   static const char *
>   m68hc11_register_name (struct gdbarch *gdbarch, int reg_nr)
>   {
> -  if (reg_nr == M68HC12_HARD_PC_REGNUM && USE_PAGE_REGISTER (gdbarch))
> +  if (reg_nr == M68HC12_HARD_PC_REGNUM && use_page_register (gdbarch))
>       return "pc";
> -  if (reg_nr == HARD_PC_REGNUM && USE_PAGE_REGISTER (gdbarch))
> +
> +  if (reg_nr == HARD_PC_REGNUM && use_page_register (gdbarch))
>       return "ppc";
>     
>     if (reg_nr < 0)
>       return NULL;
> +
>     if (reg_nr >= M68HC11_ALL_REGS)
>       return NULL;
>   
> @@ -387,6 +400,7 @@ m68hc11_register_name (struct gdbarch *gdbarch, int reg_nr)
>        does not exist.  */
>     if (reg_nr > M68HC11_LAST_HARD_REG && soft_regs[reg_nr].name == 0)
>       return NULL;
> +
>     return m68hc11_register_names[reg_nr];
>   }
>   
> @@ -627,7 +641,8 @@ m68hc11_scan_prologue (struct gdbarch *gdbarch, CORE_ADDR pc,
>         return pc;
>       }
>   
> -  seq_table = gdbarch_tdep (gdbarch)->prologue;
> +  m68gc11_gdbarch_tdep *tdep = (m68gc11_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +  seq_table = tdep->prologue;
>     
>     /* The 68hc11 stack is as follows:
>   
> @@ -807,7 +822,7 @@ m68hc11_frame_unwind_cache (struct frame_info *this_frame,
>         info->saved_regs[HARD_PC_REGNUM].set_addr (info->sp_offset);
>         this_base = get_frame_register_unsigned (this_frame, HARD_SP_REGNUM);
>         prev_sp = this_base + info->sp_offset + 2;
> -      this_base += STACK_CORRECTION (gdbarch);
> +      this_base += stack_correction (gdbarch);
>       }
>     else
>       {
> @@ -815,7 +830,7 @@ m68hc11_frame_unwind_cache (struct frame_info *this_frame,
>   	 to before the first saved register giving the SP.  */
>         prev_sp = this_base + info->size + 2;
>   
> -      this_base += STACK_CORRECTION (gdbarch);
> +      this_base += stack_correction (gdbarch);
>         if (soft_regs[SOFT_FP_REGNUM].name)
>   	info->saved_regs[SOFT_FP_REGNUM].set_addr (info->size - 2);
>      }
> @@ -898,7 +913,7 @@ m68hc11_frame_prev_register (struct frame_info *this_frame,
>     /* Take into account the 68HC12 specific call (PC + page).  */
>     if (regnum == HARD_PC_REGNUM
>         && info->return_kind == RETURN_RTC
> -      && USE_PAGE_REGISTER (get_frame_arch (this_frame)))
> +      && use_page_register (get_frame_arch (this_frame)))
>       {
>         CORE_ADDR pc = value_as_long (value);
>         if (pc >= 0x08000 && pc < 0x0c000)
> @@ -1003,7 +1018,10 @@ m68hc11_print_register (struct gdbarch *gdbarch, struct ui_file *file,
>       }
>     else
>       {
> -      if (regno == HARD_PC_REGNUM && gdbarch_tdep (gdbarch)->use_page_register)
> +      m68gc11_gdbarch_tdep *tdep
> +	= (m68gc11_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +
> +      if (regno == HARD_PC_REGNUM && tdep->use_page_register)
>   	{
>   	  ULONGEST page;
>   
> @@ -1106,7 +1124,9 @@ m68hc11_print_registers_info (struct gdbarch *gdbarch, struct ui_file *file,
>         fprintf_filtered (file, " Y=");
>         m68hc11_print_register (gdbarch, file, frame, HARD_Y_REGNUM);
>     
> -      if (gdbarch_tdep (gdbarch)->use_page_register)
> +      m68gc11_gdbarch_tdep *tdep = (m68gc11_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +
> +      if (tdep->use_page_register)
>   	{
>   	  fprintf_filtered (file, "\nPage=");
>   	  m68hc11_print_register (gdbarch, file, frame, HARD_PAGE_REGNUM);
> @@ -1194,7 +1214,7 @@ m68hc11_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
>     write_memory (sp, buf, 2);
>   
>     /* Finally, update the stack pointer...  */
> -  sp -= STACK_CORRECTION (gdbarch);
> +  sp -= stack_correction (gdbarch);
>     regcache_cooked_write_unsigned (regcache, HARD_SP_REGNUM, sp);
>   
>     /* ...and fake a frame pointer.  */
> @@ -1386,7 +1406,6 @@ m68hc11_gdbarch_init (struct gdbarch_info info,
>   		      struct gdbarch_list *arches)
>   {
>     struct gdbarch *gdbarch;
> -  struct gdbarch_tdep *tdep;
>     int elf_flags;
>   
>     soft_reg_initialized = 0;
> @@ -1403,14 +1422,17 @@ m68hc11_gdbarch_init (struct gdbarch_info info,
>          arches != NULL;
>          arches = gdbarch_list_lookup_by_info (arches->next, &info))
>       {
> -      if (gdbarch_tdep (arches->gdbarch)->elf_flags != elf_flags)
> +      m68gc11_gdbarch_tdep *tdep
> +	= (m68gc11_gdbarch_tdep *) gdbarch_tdep (arches->gdbarch);
> +
> +      if (tdep->elf_flags != elf_flags)
>   	continue;
>   
>         return arches->gdbarch;
>       }
>   
>     /* Need a new architecture.  Fill in a target specific vector.  */
> -  tdep = XCNEW (struct gdbarch_tdep);
> +  m68gc11_gdbarch_tdep *tdep = new m68gc11_gdbarch_tdep;
>     gdbarch = gdbarch_alloc (&info, tdep);
>     tdep->elf_flags = elf_flags;
>   
> diff --git a/gdb/m68k-bsd-tdep.c b/gdb/m68k-bsd-tdep.c
> index 593708fe59d..27fbb845551 100644
> --- a/gdb/m68k-bsd-tdep.c
> +++ b/gdb/m68k-bsd-tdep.c
> @@ -133,7 +133,7 @@ m68kbsd_iterate_over_regset_sections (struct gdbarch *gdbarch,
>   static void
>   m68kbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  m68k_gdbarch_tdep *tdep = (m68k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     tdep->jb_pc = 5;
>     tdep->jb_elt_size = 4;
> diff --git a/gdb/m68k-linux-tdep.c b/gdb/m68k-linux-tdep.c
> index ad4d75adb4d..6704d8319f3 100644
> --- a/gdb/m68k-linux-tdep.c
> +++ b/gdb/m68k-linux-tdep.c
> @@ -384,7 +384,7 @@ m68k_linux_iterate_over_regset_sections (struct gdbarch *gdbarch,
>   static void
>   m68k_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  m68k_gdbarch_tdep *tdep = (m68k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     linux_init_abi (info, gdbarch, 0);
>   
> diff --git a/gdb/m68k-tdep.c b/gdb/m68k-tdep.c
> index 75fa189b762..4ae27e6b774 100644
> --- a/gdb/m68k-tdep.c
> +++ b/gdb/m68k-tdep.c
> @@ -70,7 +70,7 @@ typedef BP_MANIPULATION (m68k_break_insn) m68k_breakpoint;
>   static struct type *
>   m68k_ps_type (struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  m68k_gdbarch_tdep *tdep = (m68k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (!tdep->m68k_ps_type)
>       {
> @@ -99,7 +99,7 @@ m68k_ps_type (struct gdbarch *gdbarch)
>   static struct type *
>   m68881_ext_type (struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  m68k_gdbarch_tdep *tdep = (m68k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (!tdep->m68881_ext_type)
>       tdep->m68881_ext_type
> @@ -120,7 +120,7 @@ m68881_ext_type (struct gdbarch *gdbarch)
>   static struct type *
>   m68k_register_type (struct gdbarch *gdbarch, int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  m68k_gdbarch_tdep *tdep = (m68k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (tdep->fpregs_present)
>       {
> @@ -171,12 +171,14 @@ static const char * const m68k_register_names[] = {
>   static const char *
>   m68k_register_name (struct gdbarch *gdbarch, int regnum)
>   {
> +  m68k_gdbarch_tdep *tdep = (m68k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +
>     if (regnum < 0 || regnum >= ARRAY_SIZE (m68k_register_names))
>       internal_error (__FILE__, __LINE__,
>   		    _("m68k_register_name: illegal register number %d"),
>   		    regnum);
>     else if (regnum >= M68K_FP0_REGNUM && regnum <= M68K_FPI_REGNUM
> -	   && gdbarch_tdep (gdbarch)->fpregs_present == 0)
> +	   && tdep->fpregs_present == 0)
>       return "";
>     else
>       return m68k_register_names[regnum];
> @@ -189,7 +191,9 @@ static int
>   m68k_convert_register_p (struct gdbarch *gdbarch,
>   			 int regnum, struct type *type)
>   {
> -  if (!gdbarch_tdep (gdbarch)->fpregs_present)
> +  m68k_gdbarch_tdep *tdep = (m68k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +
> +  if (!tdep->fpregs_present)
>       return 0;
>     return (regnum >= M68K_FP0_REGNUM && regnum <= M68K_FP0_REGNUM + 7
>   	  /* We only support floating-point values.  */
> @@ -296,7 +300,7 @@ m68k_extract_return_value (struct type *type, struct regcache *regcache,
>     if (type->code () == TYPE_CODE_PTR && len == 4)
>       {
>         struct gdbarch *gdbarch = regcache->arch ();
> -      struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +      m68k_gdbarch_tdep *tdep = (m68k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>         regcache->raw_read (tdep->pointer_result_regnum, valbuf);
>       }
>     else if (len <= 4)
> @@ -321,7 +325,7 @@ m68k_svr4_extract_return_value (struct type *type, struct regcache *regcache,
>   {
>     gdb_byte buf[M68K_MAX_REGISTER_SIZE];
>     struct gdbarch *gdbarch = regcache->arch ();
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  m68k_gdbarch_tdep *tdep = (m68k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (tdep->float_return && type->code () == TYPE_CODE_FLT)
>       {
> @@ -344,7 +348,7 @@ m68k_store_return_value (struct type *type, struct regcache *regcache,
>     if (type->code () == TYPE_CODE_PTR && len == 4)
>       {
>         struct gdbarch *gdbarch = regcache->arch ();
> -      struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +      m68k_gdbarch_tdep *tdep = (m68k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>         regcache->raw_write (tdep->pointer_result_regnum, valbuf);
>         /* gdb historically also set D0 in the SVR4 case.  */
>         if (tdep->pointer_result_regnum != M68K_D0_REGNUM)
> @@ -367,7 +371,7 @@ m68k_svr4_store_return_value (struct type *type, struct regcache *regcache,
>   			      const gdb_byte *valbuf)
>   {
>     struct gdbarch *gdbarch = regcache->arch ();
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  m68k_gdbarch_tdep *tdep = (m68k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (tdep->float_return && type->code () == TYPE_CODE_FLT)
>       {
> @@ -387,7 +391,7 @@ m68k_svr4_store_return_value (struct type *type, struct regcache *regcache,
>   static int
>   m68k_reg_struct_return_p (struct gdbarch *gdbarch, struct type *type)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  m68k_gdbarch_tdep *tdep = (m68k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     enum type_code code = type->code ();
>     int len = TYPE_LENGTH (type);
>   
> @@ -465,6 +469,7 @@ m68k_svr4_return_value (struct gdbarch *gdbarch, struct value *function,
>   			gdb_byte *readbuf, const gdb_byte *writebuf)
>   {
>     enum type_code code = type->code ();
> +  m68k_gdbarch_tdep *tdep = (m68k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* Aggregates with a single member are always returned like their
>        sole element.  */
> @@ -480,7 +485,7 @@ m68k_svr4_return_value (struct gdbarch *gdbarch, struct value *function,
>   	|| code == TYPE_CODE_COMPLEX || code == TYPE_CODE_ARRAY)
>          && !m68k_reg_struct_return_p (gdbarch, type))
>         /* GCC may return a `long double' in memory too.  */
> -      || (!gdbarch_tdep (gdbarch)->float_return
> +      || (!tdep->float_return
>   	  && code == TYPE_CODE_FLT
>   	  && TYPE_LENGTH (type) == 12))
>       {
> @@ -500,7 +505,6 @@ m68k_svr4_return_value (struct gdbarch *gdbarch, struct value *function,
>   
>         if (readbuf)
>   	{
> -	  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
>   	  ULONGEST addr;
>   
>   	  regcache_raw_read_unsigned (regcache, tdep->pointer_result_regnum,
> @@ -537,7 +541,7 @@ m68k_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);
> +  m68k_gdbarch_tdep *tdep = (m68k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>     gdb_byte buf[4];
>     int i;
> @@ -592,13 +596,15 @@ m68k_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
>   static int
>   m68k_dwarf_reg_to_regnum (struct gdbarch *gdbarch, int num)
>   {
> +  m68k_gdbarch_tdep *tdep = (m68k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +
>     if (num < 8)
>       /* d0..7 */
>       return (num - 0) + M68K_D0_REGNUM;
>     else if (num < 16)
>       /* a0..7 */
>       return (num - 8) + M68K_A0_REGNUM;
> -  else if (num < 24 && gdbarch_tdep (gdbarch)->fpregs_present)
> +  else if (num < 24 && tdep->fpregs_present)
>       /* fp0..7 */
>       return (num - 16) + M68K_FP0_REGNUM;
>     else if (num == 25)
> @@ -760,6 +766,7 @@ m68k_analyze_register_saves (struct gdbarch *gdbarch, CORE_ADDR pc,
>   			     struct m68k_frame_cache *cache)
>   {
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
> +  m68k_gdbarch_tdep *tdep = (m68k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (cache->locals >= 0)
>       {
> @@ -772,7 +779,7 @@ m68k_analyze_register_saves (struct gdbarch *gdbarch, CORE_ADDR pc,
>   	{
>   	  op = read_memory_unsigned_integer (pc, 2, byte_order);
>   	  if (op == P_FMOVEMX_SP
> -	      && gdbarch_tdep (gdbarch)->fpregs_present)
> +	      && tdep->fpregs_present)
>   	    {
>   	      /* fmovem.x REGS,-(%sp) */
>   	      op = read_memory_unsigned_integer (pc + 2, 2, byte_order);
> @@ -1051,7 +1058,7 @@ m68k_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
>     gdb_byte *buf;
>     CORE_ADDR sp, jb_addr;
>     struct gdbarch *gdbarch = get_frame_arch (frame);
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  m68k_gdbarch_tdep *tdep = (m68k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>   
>     if (tdep->jb_pc < 0)
> @@ -1097,7 +1104,7 @@ m68k_return_in_first_hidden_param_p (struct gdbarch *gdbarch,
>   void
>   m68k_svr4_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  m68k_gdbarch_tdep *tdep = (m68k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* SVR4 uses a different calling convention.  */
>     set_gdbarch_return_value (gdbarch, m68k_svr4_return_value);
> @@ -1115,7 +1122,7 @@ m68k_svr4_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   static void
>   m68k_embedded_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  m68k_gdbarch_tdep *tdep = (m68k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     m68k_svr4_init_abi (info, gdbarch);
>     tdep->pointer_result_regnum = M68K_D0_REGNUM;
> @@ -1130,7 +1137,6 @@ m68k_embedded_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   static struct gdbarch *
>   m68k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   {
> -  struct gdbarch_tdep *tdep = NULL;
>     struct gdbarch *gdbarch;
>     struct gdbarch_list *best_arch;
>     tdesc_arch_data_up tdesc_data;
> @@ -1230,13 +1236,16 @@ m68k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>          best_arch != NULL;
>          best_arch = gdbarch_list_lookup_by_info (best_arch->next, &info))
>       {
> -      if (flavour != gdbarch_tdep (best_arch->gdbarch)->flavour)
> +      m68k_gdbarch_tdep *tdep
> +	= (m68k_gdbarch_tdep *) gdbarch_tdep (best_arch->gdbarch);
> +
> +      if (flavour != tdep->flavour)
>   	continue;
>   
> -      if (has_fp != gdbarch_tdep (best_arch->gdbarch)->fpregs_present)
> +      if (has_fp != tdep->fpregs_present)
>   	continue;
>   
> -      if (float_return != gdbarch_tdep (best_arch->gdbarch)->float_return)
> +      if (float_return != tdep->float_return)
>   	continue;
>   
>         break;
> @@ -1245,7 +1254,7 @@ m68k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>     if (best_arch != NULL)
>       return best_arch->gdbarch;
>   
> -  tdep = XCNEW (struct gdbarch_tdep);
> +  m68k_gdbarch_tdep *tdep = new m68k_gdbarch_tdep;
>     gdbarch = gdbarch_alloc (&info, tdep);
>     tdep->fpregs_present = has_fp;
>     tdep->float_return = float_return;
> @@ -1330,7 +1339,7 @@ m68k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   static void
>   m68k_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  m68k_gdbarch_tdep *tdep = (m68k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (tdep == NULL)
>       return;
> diff --git a/gdb/m68k-tdep.h b/gdb/m68k-tdep.h
> index 16384d108bf..c88e7f26da5 100644
> --- a/gdb/m68k-tdep.h
> +++ b/gdb/m68k-tdep.h
> @@ -67,38 +67,38 @@ enum m68k_flavour
>   
>   /* Target-dependent structure in gdbarch.  */
>   
> -struct gdbarch_tdep
> +struct m68k_gdbarch_tdep : gdbarch_tdep
>   {
>     /* Offset to PC value in the jump buffer.  If this is negative,
>        longjmp support will be disabled.  */
> -  int jb_pc;
> +  int jb_pc = 0;
>     /* The size of each entry in the jump buffer.  */
> -  size_t jb_elt_size;
> +  size_t jb_elt_size = 0;
>   
>     /* Register in which the address to store a structure value is
>        passed to a function.  */
> -  int struct_value_regnum;
> +  int struct_value_regnum = 0;
>   
>     /* Register in which a pointer value is returned.  In the SVR4 ABI,
>        this is %a0, but in GCC's "embedded" ABI, this is %d0.  */
> -  int pointer_result_regnum;
> +  int pointer_result_regnum = 0;
>   
>     /* Convention for returning structures.  */
> -  enum struct_return struct_return;
> +  enum struct_return struct_return {};
>   
>     /* Convention for returning floats.  zero in int regs, non-zero in float.  */
> -  int float_return;
> +  int float_return = 0;
>   
>     /* The particular flavour of m68k.  */
> -  enum m68k_flavour flavour;
> +  enum m68k_flavour flavour {};
>   
>     /* Flag set if the floating point registers are present, or assumed
>        to be present.  */
> -  int fpregs_present;
> +  int fpregs_present = 0;
>   
>      /* ISA-specific data types.  */
> -  struct type *m68k_ps_type;
> -  struct type *m68881_ext_type;
> +  struct type *m68k_ps_type = nullptr;
> +  struct type *m68881_ext_type = nullptr;
>   };
>   
>   /* Initialize a SVR4 architecture variant.  */
> diff --git a/gdb/mep-tdep.c b/gdb/mep-tdep.c
> index d48e1f117a7..6d1f04a2ab2 100644
> --- a/gdb/mep-tdep.c
> +++ b/gdb/mep-tdep.c
> @@ -116,7 +116,7 @@
>        options are present on the current processor.  */
>   
>   
> -struct gdbarch_tdep
> +struct mep_gdbarch_tdep : gdbarch_tdep
>   {
>     /* A CGEN cpu descriptor for this BFD architecture and machine.
>   
> @@ -124,7 +124,7 @@ struct gdbarch_tdep
>        MeP libopcodes machinery actually puts off module-specific
>        customization until the last minute.  So this contains
>        information about all supported me_modules.  */
> -  CGEN_CPU_DESC cpu_desc;
> +  CGEN_CPU_DESC cpu_desc = nullptr;
>   
>     /* The me_module index from the ELF file we used to select this
>        architecture, or CONFIG_NONE if there was none.
> @@ -140,7 +140,7 @@ struct gdbarch_tdep
>        create a separate instance of the gdbarch structure for each
>        me_module value mep_gdbarch_init sees, and store the me_module
>        value from the ELF file here.  */
> -  CONFIG_ATTR me_module;
> +  CONFIG_ATTR me_module {};
>   };
>   
>   
> @@ -259,7 +259,9 @@ me_module_register_set (CONFIG_ATTR me_module,
>          mask contains any of the me_module's coprocessor ISAs,
>          specifically excluding the generic coprocessor register sets.  */
>   
> -  CGEN_CPU_DESC desc = gdbarch_tdep (target_gdbarch ())->cpu_desc;
> +  mep_gdbarch_tdep *tdep
> +    = (mep_gdbarch_tdep *) gdbarch_tdep (target_gdbarch ());
> +  CGEN_CPU_DESC desc = tdep->cpu_desc;
>     const CGEN_HW_ENTRY *hw;
>   
>     if (me_module == CONFIG_NONE)
> @@ -852,7 +854,11 @@ current_me_module (void)
>         return (CONFIG_ATTR) regval;
>       }
>     else
> -    return gdbarch_tdep (target_gdbarch ())->me_module;
> +    {
> +      mep_gdbarch_tdep *tdep
> +	= (mep_gdbarch_tdep *) gdbarch_tdep (target_gdbarch ());
> +      return tdep->me_module;
> +    }
>   }
>   
>   
> @@ -2326,7 +2332,6 @@ static struct gdbarch *
>   mep_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   {
>     struct gdbarch *gdbarch;
> -  struct gdbarch_tdep *tdep;
>   
>     /* Which me_module are we building a gdbarch object for?  */
>     CONFIG_ATTR me_module;
> @@ -2384,10 +2389,15 @@ mep_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>     for (arches = gdbarch_list_lookup_by_info (arches, &info);
>          arches != NULL;
>          arches = gdbarch_list_lookup_by_info (arches->next, &info))
> -    if (gdbarch_tdep (arches->gdbarch)->me_module == me_module)
> -      return arches->gdbarch;
> +    {
> +      mep_gdbarch_tdep *tdep
> +	= (mep_gdbarch_tdep *) gdbarch_tdep (arches->gdbarch);
> +
> +      if (tdep->me_module == me_module)
> +	return arches->gdbarch;
> +    }
>   
> -  tdep = XCNEW (struct gdbarch_tdep);
> +  mep_gdbarch_tdep *tdep = new mep_gdbarch_tdep;
>     gdbarch = gdbarch_alloc (&info, tdep);
>   
>     /* Get a CGEN CPU descriptor for this architecture.  */
> diff --git a/gdb/microblaze-tdep.c b/gdb/microblaze-tdep.c
> index 0c3316dece1..5309da58cc2 100644
> --- a/gdb/microblaze-tdep.c
> +++ b/gdb/microblaze-tdep.c
> @@ -650,7 +650,6 @@ microblaze_register_g_packet_guesses (struct gdbarch *gdbarch)
>   static struct gdbarch *
>   microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   {
> -  struct gdbarch_tdep *tdep;
>     struct gdbarch *gdbarch;
>     tdesc_arch_data_up tdesc_data;
>     const struct target_desc *tdesc = info.target_desc;
> @@ -697,7 +696,7 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>       }
>   
>     /* Allocate space for the new architecture.  */
> -  tdep = XCNEW (struct gdbarch_tdep);
> +  microblaze_gdbarch_tdep *tdep = new microblaze_gdbarch_tdep;
>     gdbarch = gdbarch_alloc (&info, tdep);
>   
>     set_gdbarch_long_double_bit (gdbarch, 128);
> diff --git a/gdb/microblaze-tdep.h b/gdb/microblaze-tdep.h
> index 08af0d191c5..3143e92ac74 100644
> --- a/gdb/microblaze-tdep.h
> +++ b/gdb/microblaze-tdep.h
> @@ -22,7 +22,7 @@
>   
>   
>   /* Microblaze architecture-specific information.  */
> -struct gdbarch_tdep
> +struct microblaze_gdbarch_tdep : gdbarch_tdep
>   {
>   };
>   
> diff --git a/gdb/mips-linux-tdep.c b/gdb/mips-linux-tdep.c
> index ce287f6a354..9eac3d763ba 100644
> --- a/gdb/mips-linux-tdep.c
> +++ b/gdb/mips-linux-tdep.c
> @@ -1317,7 +1317,7 @@ mips_linux_get_syscall_number (struct gdbarch *gdbarch,
>   			       thread_info *thread)
>   {
>     struct regcache *regcache = get_thread_regcache (thread);
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  mips_gdbarch_tdep *tdep = (mips_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>     int regsize = register_size (gdbarch, MIPS_V0_REGNUM);
>     /* The content of a register */
> @@ -1527,7 +1527,7 @@ static void
>   mips_linux_init_abi (struct gdbarch_info info,
>   		     struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  mips_gdbarch_tdep *tdep = (mips_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     enum mips_abi abi = mips_abi (gdbarch);
>     struct tdesc_arch_data *tdesc_data = info.tdesc_data;
>   
> diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c
> index 89f689e02cc..603c5d2664b 100644
> --- a/gdb/mips-tdep.c
> +++ b/gdb/mips-tdep.c
> @@ -227,7 +227,8 @@ static const char mips_disassembler_options_n64[] = "gpr-names=64";
>   const struct mips_regnum *
>   mips_regnum (struct gdbarch *gdbarch)
>   {
> -  return gdbarch_tdep (gdbarch)->regnum;
> +  mips_gdbarch_tdep *tdep = (mips_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +  return tdep->regnum;
>   }
>   
>   static int
> @@ -248,29 +249,47 @@ mips_float_register_p (struct gdbarch *gdbarch, int regnum)
>   	  && rawnum < mips_regnum (gdbarch)->fp0 + 32);
>   }
>   
> -#define MIPS_EABI(gdbarch) (gdbarch_tdep (gdbarch)->mips_abi \
> -		     == MIPS_ABI_EABI32 \
> -		   || gdbarch_tdep (gdbarch)->mips_abi == MIPS_ABI_EABI64)
> +static bool
> +mips_eabi (gdbarch *arch)
> +{
> +  mips_gdbarch_tdep *tdep = (mips_gdbarch_tdep *) gdbarch_tdep (arch);
> +  return (tdep->mips_abi == MIPS_ABI_EABI32 \
> +	  || tdep->mips_abi == MIPS_ABI_EABI64);
> +}
>   
> -#define MIPS_LAST_FP_ARG_REGNUM(gdbarch) \
> -  (gdbarch_tdep (gdbarch)->mips_last_fp_arg_regnum)
> +static int
> +mips_last_fp_arg_regnum (gdbarch *arch)
> +{
> +  mips_gdbarch_tdep *tdep = (mips_gdbarch_tdep *) gdbarch_tdep (arch);
> +  return tdep->mips_last_fp_arg_regnum;
> +}
>   
> -#define MIPS_LAST_ARG_REGNUM(gdbarch) \
> -  (gdbarch_tdep (gdbarch)->mips_last_arg_regnum)
> +static int
> +mips_last_arg_regnum (gdbarch *arch)
> +{
> +  mips_gdbarch_tdep *tdep = (mips_gdbarch_tdep *) gdbarch_tdep (arch);
> +  return tdep->mips_last_arg_regnum;
> +}
>   
> -#define MIPS_FPU_TYPE(gdbarch) (gdbarch_tdep (gdbarch)->mips_fpu_type)
> +static enum mips_fpu_type
> +mips_get_fpu_type (gdbarch *arch)
> +{
> +  mips_gdbarch_tdep *tdep = (mips_gdbarch_tdep *) gdbarch_tdep (arch);
> +  return tdep->mips_fpu_type;
> +}
>   
>   /* Return the MIPS ABI associated with GDBARCH.  */
>   enum mips_abi
>   mips_abi (struct gdbarch *gdbarch)
>   {
> -  return gdbarch_tdep (gdbarch)->mips_abi;
> +  mips_gdbarch_tdep *tdep = (mips_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +  return tdep->mips_abi;
>   }
>   
>   int
>   mips_isa_regsize (struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  mips_gdbarch_tdep *tdep = (mips_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* If we know how big the registers are, use that size.  */
>     if (tdep->register_size_valid_p)
> @@ -316,7 +335,8 @@ mips_abi_regsize (struct gdbarch *gdbarch)
>   static int
>   is_mips16_isa (struct gdbarch *gdbarch)
>   {
> -  return gdbarch_tdep (gdbarch)->mips_isa == ISA_MIPS16;
> +  mips_gdbarch_tdep *tdep = (mips_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +  return tdep->mips_isa == ISA_MIPS16;
>   }
>   
>   /* Return one iff compressed code is the microMIPS instruction set.  */
> @@ -324,7 +344,8 @@ is_mips16_isa (struct gdbarch *gdbarch)
>   static int
>   is_micromips_isa (struct gdbarch *gdbarch)
>   {
> -  return gdbarch_tdep (gdbarch)->mips_isa == ISA_MICROMIPS;
> +  mips_gdbarch_tdep *tdep = (mips_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +  return tdep->mips_isa == ISA_MICROMIPS;
>   }
>   
>   /* Return one iff ADDR denotes compressed code.  */
> @@ -615,7 +636,7 @@ static const char * const mips_linux_reg_names[NUM_MIPS_PROCESSOR_REGS] = {
>   static const char *
>   mips_register_name (struct gdbarch *gdbarch, int regno)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  mips_gdbarch_tdep *tdep = (mips_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     /* GPR names for all ABIs other than n32/n64.  */
>     static const char *mips_gpr_names[] = {
>       "zero", "at", "v0", "v1", "a0", "a1", "a2", "a3",
> @@ -756,7 +777,9 @@ mips_pseudo_register_read (struct gdbarch *gdbarch, readable_regcache *regcache,
>     else if (register_size (gdbarch, rawnum) >
>   	   register_size (gdbarch, cookednum))
>       {
> -      if (gdbarch_tdep (gdbarch)->mips64_transfers_32bit_regs_p)
> +      mips_gdbarch_tdep *tdep = (mips_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +
> +      if (tdep->mips64_transfers_32bit_regs_p)
>   	return regcache->raw_read_part (rawnum, 0, 4, buf);
>         else
>   	{
> @@ -787,7 +810,9 @@ mips_pseudo_register_write (struct gdbarch *gdbarch,
>     else if (register_size (gdbarch, rawnum) >
>   	   register_size (gdbarch, cookednum))
>       {
> -      if (gdbarch_tdep (gdbarch)->mips64_transfers_32bit_regs_p)
> +      mips_gdbarch_tdep *tdep = (mips_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +
> +      if (tdep->mips64_transfers_32bit_regs_p)
>   	regcache->raw_write_part (rawnum, 0, 4, buf);
>         else
>   	{
> @@ -829,7 +854,10 @@ mips_ax_pseudo_register_push_stack (struct gdbarch *gdbarch,
>   
>         if (register_size (gdbarch, rawnum) > register_size (gdbarch, reg))
>   	{
> -	  if (!gdbarch_tdep (gdbarch)->mips64_transfers_32bit_regs_p
> +	  mips_gdbarch_tdep *tdep
> +	    = (mips_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +
> +	  if (!tdep->mips64_transfers_32bit_regs_p
>   	      || gdbarch_byte_order (gdbarch) != BFD_ENDIAN_BIG)
>   	    {
>   	      ax_const_l (ax, 32);
> @@ -1031,6 +1059,7 @@ mips_register_type (struct gdbarch *gdbarch, int regnum)
>     else
>       {
>         int rawnum = regnum - gdbarch_num_regs (gdbarch);
> +      mips_gdbarch_tdep *tdep = (mips_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>         /* The cooked or ABI registers.  These are sized according to
>   	 the ABI (with a few complications).  */
> @@ -1043,7 +1072,7 @@ mips_register_type (struct gdbarch *gdbarch, int regnum)
>   	/* The pseudo/cooked view of the embedded registers is always
>   	   32-bit.  The raw view is handled below.  */
>   	return builtin_type (gdbarch)->builtin_int32;
> -      else if (gdbarch_tdep (gdbarch)->mips64_transfers_32bit_regs_p)
> +      else if (tdep->mips64_transfers_32bit_regs_p)
>   	/* The target, while possibly using a 64-bit register buffer,
>   	   is only transfering 32-bits of each integer register.
>   	   Reflect this in the cooked/pseudo (ABI) register value.  */
> @@ -1132,7 +1161,7 @@ mips_pseudo_register_type (struct gdbarch *gdbarch, int regnum)
>   static enum auto_boolean mask_address_var = AUTO_BOOLEAN_AUTO;
>   
>   static int
> -mips_mask_address_p (struct gdbarch_tdep *tdep)
> +mips_mask_address_p (mips_gdbarch_tdep *tdep)
>   {
>     switch (mask_address_var)
>       {
> @@ -1154,7 +1183,8 @@ static void
>   show_mask_address (struct ui_file *file, int from_tty,
>   		   struct cmd_list_element *c, const char *value)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (target_gdbarch ());
> +  mips_gdbarch_tdep *tdep
> +    = (mips_gdbarch_tdep *) gdbarch_tdep (target_gdbarch ());
>   
>     deprecated_show_value_hack (file, from_tty, c, value);
>     switch (mask_address_var)
> @@ -1698,9 +1728,9 @@ mips32_next_pc (struct regcache *regcache, CORE_ADDR pc)
>   	      break;
>   	    case 12:            /* SYSCALL */
>   	      {
> -		struct gdbarch_tdep *tdep;
> +		mips_gdbarch_tdep *tdep
> +		  = (mips_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
> -		tdep = gdbarch_tdep (gdbarch);
>   		if (tdep->syscall_next_pc != NULL)
>   		  pc = tdep->syscall_next_pc (get_current_frame ());
>   		else
> @@ -1909,9 +1939,9 @@ micromips_next_pc (struct regcache *regcache, CORE_ADDR pc)
>   		  break;
>   		case 0x22d: /* SYSCALL:  000000 1000101101 111100 */
>   		  {
> -		    struct gdbarch_tdep *tdep;
> +		    mips_gdbarch_tdep *tdep
> +		      = (mips_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
> -		    tdep = gdbarch_tdep (gdbarch);
>   		    if (tdep->syscall_next_pc != NULL)
>   		      pc = tdep->syscall_next_pc (get_current_frame ());
>   		  }
> @@ -3870,7 +3900,7 @@ mips_stub_frame_base_sniffer (struct frame_info *this_frame)
>   static CORE_ADDR
>   mips_addr_bits_remove (struct gdbarch *gdbarch, CORE_ADDR addr)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  mips_gdbarch_tdep *tdep = (mips_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (mips_mask_address_p (tdep) && (((ULONGEST) addr) >> 32 == 0xffffffffUL))
>       /* This hack is a work-around for existing boards using PMON, the
> @@ -4405,13 +4435,13 @@ fp_register_arg_p (struct gdbarch *gdbarch, enum type_code typecode,
>   		   struct type *arg_type)
>   {
>     return ((typecode == TYPE_CODE_FLT
> -	   || (MIPS_EABI (gdbarch)
> +	   || (mips_eabi (gdbarch)
>   	       && (typecode == TYPE_CODE_STRUCT
>   		   || typecode == TYPE_CODE_UNION)
>   	       && arg_type->num_fields () == 1
>   	       && check_typedef (arg_type->field (0).type ())->code ()
>   	       == TYPE_CODE_FLT))
> -	  && MIPS_FPU_TYPE(gdbarch) != MIPS_FPU_NONE);
> +	  && mips_get_fpu_type (gdbarch) != MIPS_FPU_NONE);
>   }
>   
>   /* On o32, argument passing in GPRs depends on the alignment of the type being
> @@ -4611,7 +4641,7 @@ mips_eabi_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
>   	 point value into an FP register instead of pushing it onto the
>   	 stack.  */
>         if (fp_register_arg_p (gdbarch, typecode, arg_type)
> -	  && float_argreg <= MIPS_LAST_FP_ARG_REGNUM (gdbarch))
> +	  && float_argreg <= mips_last_fp_arg_regnum (gdbarch))
>   	{
>   	  /* EABI32 will pass doubles in consecutive registers, even on
>   	     64-bit cores.  At one time, we used to check the size of
> @@ -4678,7 +4708,7 @@ mips_eabi_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
>   				    partial_len);
>   
>   	      /* Write this portion of the argument to the stack.  */
> -	      if (argreg > MIPS_LAST_ARG_REGNUM (gdbarch)
> +	      if (argreg > mips_last_arg_regnum (gdbarch)
>   		  || odd_sized_struct
>   		  || fp_register_arg_p (gdbarch, typecode, arg_type))
>   		{
> @@ -4729,7 +4759,7 @@ mips_eabi_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
>   		 arguments will not.  */
>   	      /* Write this portion of the argument to a general
>   		 purpose register.  */
> -	      if (argreg <= MIPS_LAST_ARG_REGNUM (gdbarch)
> +	      if (argreg <= mips_last_arg_regnum (gdbarch)
>   		  && !fp_register_arg_p (gdbarch, typecode, arg_type))
>   		{
>   		  LONGEST regval =
> @@ -4773,7 +4803,7 @@ mips_eabi_return_value (struct gdbarch *gdbarch, struct value *function,
>   			struct type *type, struct regcache *regcache,
>   			gdb_byte *readbuf, const gdb_byte *writebuf)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  mips_gdbarch_tdep *tdep = (mips_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int fp_return_type = 0;
>     int offset, regnum, xfer;
>   
> @@ -4845,7 +4875,7 @@ mips_n32n64_fp_arg_chunk_p (struct gdbarch *gdbarch, struct type *arg_type,
>     if (arg_type->code () != TYPE_CODE_STRUCT)
>       return 0;
>   
> -  if (MIPS_FPU_TYPE (gdbarch) != MIPS_FPU_DOUBLE)
> +  if (mips_get_fpu_type (gdbarch) != MIPS_FPU_DOUBLE)
>       return 0;
>   
>     if (TYPE_LENGTH (arg_type) < offset + MIPS64_REGSIZE)
> @@ -4973,7 +5003,7 @@ mips_n32n64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
>   	}
>   
>         if (fp_register_arg_p (gdbarch, typecode, arg_type)
> -	  && argreg <= MIPS_LAST_ARG_REGNUM (gdbarch))
> +	  && argreg <= mips_last_arg_regnum (gdbarch))
>   	{
>   	  /* This is a floating point value that fits entirely
>   	     in a single register or a pair of registers.  */
> @@ -5033,10 +5063,10 @@ mips_n32n64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
>   				    partial_len);
>   
>   	      if (fp_register_arg_p (gdbarch, typecode, arg_type))
> -		gdb_assert (argreg > MIPS_LAST_ARG_REGNUM (gdbarch));
> +		gdb_assert (argreg > mips_last_arg_regnum (gdbarch));
>   
>   	      /* Write this portion of the argument to the stack.  */
> -	      if (argreg > MIPS_LAST_ARG_REGNUM (gdbarch))
> +	      if (argreg > mips_last_arg_regnum (gdbarch))
>   		{
>   		  /* Should shorter than int integer values be
>   		     promoted to int before being stored?  */
> @@ -5079,7 +5109,7 @@ mips_n32n64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
>   		 structs may go thru BOTH paths.  */
>   	      /* Write this portion of the argument to a general
>   		 purpose register.  */
> -	      if (argreg <= MIPS_LAST_ARG_REGNUM (gdbarch))
> +	      if (argreg <= mips_last_arg_regnum (gdbarch))
>   		{
>   		  LONGEST regval;
>   
> @@ -5164,7 +5194,7 @@ mips_n32n64_return_value (struct gdbarch *gdbarch, struct value *function,
>   			  struct type *type, struct regcache *regcache,
>   			  gdb_byte *readbuf, const gdb_byte *writebuf)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  mips_gdbarch_tdep *tdep = (mips_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* From MIPSpro N32 ABI Handbook, Document Number: 007-2816-004
>   
> @@ -5451,7 +5481,7 @@ mips_o32_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
>   	 registers are normally skipped.  */
>   
>         if (fp_register_arg_p (gdbarch, typecode, arg_type)
> -	  && float_argreg <= MIPS_LAST_FP_ARG_REGNUM (gdbarch))
> +	  && float_argreg <= mips_last_fp_arg_regnum (gdbarch))
>   	{
>   	  if (register_size (gdbarch, float_argreg) < 8 && len == 8)
>   	    {
> @@ -5541,7 +5571,7 @@ mips_o32_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
>   				    partial_len);
>   
>   	      /* Write this portion of the argument to the stack.  */
> -	      if (argreg > MIPS_LAST_ARG_REGNUM (gdbarch)
> +	      if (argreg > mips_last_arg_regnum (gdbarch)
>   		  || odd_sized_struct)
>   		{
>   		  /* Should shorter than int integer values be
> @@ -5577,7 +5607,7 @@ mips_o32_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
>   		 structs may go thru BOTH paths.  */
>   	      /* Write this portion of the argument to a general
>   		 purpose register.  */
> -	      if (argreg <= MIPS_LAST_ARG_REGNUM (gdbarch))
> +	      if (argreg <= mips_last_arg_regnum (gdbarch))
>   		{
>   		  LONGEST regval = extract_signed_integer (val, partial_len,
>   							   byte_order);
> @@ -5625,7 +5655,7 @@ mips_o32_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
>   
>   		  /* Prevent subsequent floating point arguments from
>   		     being passed in floating point registers.  */
> -		  float_argreg = MIPS_LAST_FP_ARG_REGNUM (gdbarch) + 1;
> +		  float_argreg = mips_last_fp_arg_regnum (gdbarch) + 1;
>   		}
>   
>   	      len -= partial_len;
> @@ -5659,7 +5689,7 @@ mips_o32_return_value (struct gdbarch *gdbarch, struct value *function,
>   {
>     CORE_ADDR func_addr = function ? find_function_addr (function, NULL) : 0;
>     int mips16 = mips_pc_is_mips16 (gdbarch, func_addr);
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  mips_gdbarch_tdep *tdep = (mips_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     enum mips_fval_reg fval_reg;
>   
>     fval_reg = readbuf ? mips16 ? mips_fval_gpr : mips_fval_fpr : mips_fval_both;
> @@ -5960,7 +5990,7 @@ mips_o64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
>   	 functions because those registers are normally skipped.  */
>   
>         if (fp_register_arg_p (gdbarch, typecode, arg_type)
> -	  && float_argreg <= MIPS_LAST_FP_ARG_REGNUM (gdbarch))
> +	  && float_argreg <= mips_last_fp_arg_regnum (gdbarch))
>   	{
>   	  LONGEST regval = extract_unsigned_integer (val, len, byte_order);
>   	  if (mips_debug)
> @@ -5995,7 +6025,7 @@ mips_o64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
>   				    partial_len);
>   
>   	      /* Write this portion of the argument to the stack.  */
> -	      if (argreg > MIPS_LAST_ARG_REGNUM (gdbarch)
> +	      if (argreg > mips_last_arg_regnum (gdbarch)
>   		  || odd_sized_struct)
>   		{
>   		  /* Should shorter than int integer values be
> @@ -6039,7 +6069,7 @@ mips_o64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
>   		 structs may go thru BOTH paths.  */
>   	      /* Write this portion of the argument to a general
>   		 purpose register.  */
> -	      if (argreg <= MIPS_LAST_ARG_REGNUM (gdbarch))
> +	      if (argreg <= mips_last_arg_regnum (gdbarch))
>   		{
>   		  LONGEST regval = extract_signed_integer (val, partial_len,
>   							   byte_order);
> @@ -6071,7 +6101,7 @@ mips_o64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
>   
>   		  /* Prevent subsequent floating point arguments from
>   		     being passed in floating point registers.  */
> -		  float_argreg = MIPS_LAST_FP_ARG_REGNUM (gdbarch) + 1;
> +		  float_argreg = mips_last_fp_arg_regnum (gdbarch) + 1;
>   		}
>   
>   	      len -= partial_len;
> @@ -6403,7 +6433,7 @@ mips_print_float_info (struct gdbarch *gdbarch, struct ui_file *file,
>   		      struct frame_info *frame, const char *args)
>   {
>     int fcsr = mips_regnum (gdbarch)->fp_control_status;
> -  enum mips_fpu_type type = MIPS_FPU_TYPE (gdbarch);
> +  enum mips_fpu_type type = mips_get_fpu_type (gdbarch);
>     ULONGEST fcs = 0;
>     int i;
>   
> @@ -6891,7 +6921,7 @@ show_mipsfpu_command (const char *args, int from_tty)
>         return;
>       }
>   
> -  switch (MIPS_FPU_TYPE (target_gdbarch ()))
> +  switch (mips_get_fpu_type (target_gdbarch ()))
>       {
>       case MIPS_FPU_SINGLE:
>         fpu = "single-precision";
> @@ -8038,7 +8068,6 @@ static struct gdbarch *
>   mips_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   {
>     struct gdbarch *gdbarch;
> -  struct gdbarch_tdep *tdep;
>     int elf_flags;
>     enum mips_abi mips_abi, found_abi, wanted_abi;
>     int i, num_regs;
> @@ -8055,7 +8084,11 @@ mips_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>     if (info.abfd && bfd_get_flavour (info.abfd) == bfd_target_elf_flavour)
>       elf_flags = elf_elfheader (info.abfd)->e_flags;
>     else if (arches != NULL)
> -    elf_flags = gdbarch_tdep (arches->gdbarch)->elf_flags;
> +    {
> +      mips_gdbarch_tdep *tdep
> +	= (mips_gdbarch_tdep *) gdbarch_tdep (arches->gdbarch);
> +      elf_flags = tdep->elf_flags;
> +    }
>     else
>       elf_flags = 0;
>     if (gdbarch_debug)
> @@ -8092,7 +8125,11 @@ mips_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>     /* If we have no useful BFD information, use the ABI from the last
>        MIPS architecture (if there is one).  */
>     if (found_abi == MIPS_ABI_UNKNOWN && info.abfd == NULL && arches != NULL)
> -    found_abi = gdbarch_tdep (arches->gdbarch)->found_abi;
> +    {
> +      mips_gdbarch_tdep *tdep
> +	= (mips_gdbarch_tdep *) gdbarch_tdep (arches->gdbarch);
> +      found_abi = tdep->found_abi;
> +    }
>   
>     /* Try the architecture for any hint of the correct ABI.  */
>     if (found_abi == MIPS_ABI_UNKNOWN
> @@ -8223,7 +8260,7 @@ mips_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   	break;
>         }
>     else if (arches != NULL)
> -    fpu_type = MIPS_FPU_TYPE (arches->gdbarch);
> +    fpu_type = mips_get_fpu_type (arches->gdbarch);
>     else
>       fpu_type = MIPS_FPU_DOUBLE;
>     if (gdbarch_debug)
> @@ -8406,28 +8443,31 @@ mips_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>          arches != NULL;
>          arches = gdbarch_list_lookup_by_info (arches->next, &info))
>       {
> +      mips_gdbarch_tdep *tdep
> +        = (mips_gdbarch_tdep *) gdbarch_tdep (arches->gdbarch);
> +
>         /* MIPS needs to be pedantic about which ABI and the compressed
>   	 ISA variation the object is using.  */
> -      if (gdbarch_tdep (arches->gdbarch)->elf_flags != elf_flags)
> +      if (tdep->elf_flags != elf_flags)
>   	continue;
> -      if (gdbarch_tdep (arches->gdbarch)->mips_abi != mips_abi)
> +      if (tdep->mips_abi != mips_abi)
>   	continue;
> -      if (gdbarch_tdep (arches->gdbarch)->mips_isa != mips_isa)
> +      if (tdep->mips_isa != mips_isa)
>   	continue;
>         /* Need to be pedantic about which register virtual size is
>   	 used.  */
> -      if (gdbarch_tdep (arches->gdbarch)->mips64_transfers_32bit_regs_p
> +      if (tdep->mips64_transfers_32bit_regs_p
>   	  != mips64_transfers_32bit_regs_p)
>   	continue;
>         /* Be pedantic about which FPU is selected.  */
> -      if (MIPS_FPU_TYPE (arches->gdbarch) != fpu_type)
> +      if (mips_get_fpu_type (arches->gdbarch) != fpu_type)
>   	continue;
>   
>         return arches->gdbarch;
>       }
>   
>     /* Need a new architecture.  Fill in a target specific vector.  */
> -  tdep = XCNEW (struct gdbarch_tdep);
> +  mips_gdbarch_tdep *tdep = new mips_gdbarch_tdep;
>     gdbarch = gdbarch_alloc (&info, tdep);
>     tdep->elf_flags = elf_flags;
>     tdep->mips64_transfers_32bit_regs_p = mips64_transfers_32bit_regs_p;
> @@ -8862,7 +8902,7 @@ mips_fpu_type_str (enum mips_fpu_type fpu_type)
>   static void
>   mips_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  mips_gdbarch_tdep *tdep = (mips_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     if (tdep != NULL)
>       {
>         int ef_mips_arch;
> @@ -8911,11 +8951,11 @@ mips_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file)
>   		      MIPS_DEFAULT_FPU_TYPE,
>   		      mips_fpu_type_str (MIPS_DEFAULT_FPU_TYPE));
>     fprintf_unfiltered (file, "mips_dump_tdep: MIPS_EABI = %d\n",
> -		      MIPS_EABI (gdbarch));
> +		      mips_eabi (gdbarch));
>     fprintf_unfiltered (file,
>   		      "mips_dump_tdep: MIPS_FPU_TYPE = %d (%s)\n",
> -		      MIPS_FPU_TYPE (gdbarch),
> -		      mips_fpu_type_str (MIPS_FPU_TYPE (gdbarch)));
> +		      mips_get_fpu_type (gdbarch),
> +		      mips_fpu_type_str (mips_get_fpu_type (gdbarch)));
>   }
>   
>   void _initialize_mips_tdep ();
> diff --git a/gdb/mips-tdep.h b/gdb/mips-tdep.h
> index e7f683718df..b899cfd9bdb 100644
> --- a/gdb/mips-tdep.h
> +++ b/gdb/mips-tdep.h
> @@ -83,39 +83,39 @@ enum mips_fpu_type
>   };
>   
>   /* MIPS specific per-architecture information.  */
> -struct gdbarch_tdep
> +struct mips_gdbarch_tdep : gdbarch_tdep
>   {
>     /* from the elf header */
> -  int elf_flags;
> +  int elf_flags = 0;
>   
>     /* mips options */
> -  enum mips_abi mips_abi;
> -  enum mips_abi found_abi;
> -  enum mips_isa mips_isa;
> -  enum mips_fpu_type mips_fpu_type;
> -  int mips_last_arg_regnum;
> -  int mips_last_fp_arg_regnum;
> -  int default_mask_address_p;
> +  enum mips_abi mips_abi {};
> +  enum mips_abi found_abi {};
> +  enum mips_isa mips_isa {};
> +  enum mips_fpu_type mips_fpu_type {};
> +  int mips_last_arg_regnum = 0;
> +  int mips_last_fp_arg_regnum = 0;
> +  int default_mask_address_p = 0;
>     /* Is the target using 64-bit raw integer registers but only
>        storing a left-aligned 32-bit value in each?  */
> -  int mips64_transfers_32bit_regs_p;
> +  int mips64_transfers_32bit_regs_p = 0;
>     /* Indexes for various registers.  IRIX and embedded have
>        different values.  This contains the "public" fields.  Don't
>        add any that do not need to be public.  */
> -  const struct mips_regnum *regnum;
> +  const struct mips_regnum *regnum = nullptr;
>     /* Register names table for the current register set.  */
> -  const char * const *mips_processor_reg_names;
> +  const char * const *mips_processor_reg_names = nullptr;
>   
>     /* The size of register data available from the target, if known.
>        This doesn't quite obsolete the manual
>        mips64_transfers_32bit_regs_p, since that is documented to force
>        left alignment even for big endian (very strange).  */
> -  int register_size_valid_p;
> -  int register_size;
> +  int register_size_valid_p = 0;
> +  int register_size = 0;
>   
>     /* Return the expected next PC if FRAME is stopped at a syscall
>        instruction.  */
> -  CORE_ADDR (*syscall_next_pc) (struct frame_info *frame);
> +  CORE_ADDR (*syscall_next_pc) (struct frame_info *frame) = nullptr;
>   };
>   
>   /* Register numbers of various important registers.  */
> diff --git a/gdb/mn10300-tdep.c b/gdb/mn10300-tdep.c
> index 7feab0b3fec..5804efeb627 100644
> --- a/gdb/mn10300-tdep.c
> +++ b/gdb/mn10300-tdep.c
> @@ -372,7 +372,7 @@ mn10300_analyze_prologue (struct gdbarch *gdbarch,
>     int rn;
>     pv_t regs[MN10300_MAX_NUM_REGS];
>     CORE_ADDR after_last_frame_setup_insn = start_pc;
> -  int am33_mode = AM33_MODE (gdbarch);
> +  int am33_mode = get_am33_mode (gdbarch);
>   
>     memset (result, 0, sizeof (*result));
>     result->gdbarch = gdbarch;
> @@ -1337,14 +1337,13 @@ mn10300_gdbarch_init (struct gdbarch_info info,
>   		      struct gdbarch_list *arches)
>   {
>     struct gdbarch *gdbarch;
> -  struct gdbarch_tdep *tdep;
>     int num_regs;
>   
>     arches = gdbarch_list_lookup_by_info (arches, &info);
>     if (arches != NULL)
>       return arches->gdbarch;
>   
> -  tdep = XCNEW (struct gdbarch_tdep);
> +  mn10300_gdbarch_tdep *tdep = new mn10300_gdbarch_tdep;
>     gdbarch = gdbarch_alloc (&info, tdep);
>   
>     switch (info.bfd_arch_info->mach)
> @@ -1413,7 +1412,7 @@ mn10300_gdbarch_init (struct gdbarch_info info,
>   static void
>   mn10300_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  mn10300_gdbarch_tdep *tdep = (mn10300_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     fprintf_unfiltered (file, "mn10300_dump_tdep: am33_mode = %d\n",
>   		      tdep->am33_mode);
>   }
> diff --git a/gdb/mn10300-tdep.h b/gdb/mn10300-tdep.h
> index a3518499cb4..220e4d6739b 100644
> --- a/gdb/mn10300-tdep.h
> +++ b/gdb/mn10300-tdep.h
> @@ -20,6 +20,8 @@
>   #ifndef MN10300_TDEP_H
>   #define MN10300_TDEP_H
>   
> +#include "gdbarch.h"
> +
>   enum {
>     E_D0_REGNUM = 0,
>     E_D1_REGNUM = 1,
> @@ -74,11 +76,16 @@ enum frame_kind {
>   };
>   
>   /* mn10300 private data.  */
> -struct gdbarch_tdep
> +struct mn10300_gdbarch_tdep : gdbarch_tdep
>   {
>     int am33_mode;
>   };
>   
> -#define AM33_MODE(gdbarch) (gdbarch_tdep (gdbarch)->am33_mode)
> +static inline int
> +get_am33_mode (gdbarch *arch)
> +{
> +  mn10300_gdbarch_tdep *tdep = (mn10300_gdbarch_tdep *) gdbarch_tdep (arch);
> +  return tdep->am33_mode;
> +}
>   
>   #endif /* MN10300_TDEP_H */
> diff --git a/gdb/moxie-tdep.c b/gdb/moxie-tdep.c
> index c48f9f75eb4..459bfb8ee5a 100644
> --- a/gdb/moxie-tdep.c
> +++ b/gdb/moxie-tdep.c
> @@ -1052,7 +1052,6 @@ static struct gdbarch *
>   moxie_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   {
>     struct gdbarch *gdbarch;
> -  struct gdbarch_tdep *tdep;
>   
>     /* If there is already a candidate, use it.  */
>     arches = gdbarch_list_lookup_by_info (arches, &info);
> @@ -1060,7 +1059,7 @@ moxie_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>       return arches->gdbarch;
>   
>     /* Allocate space for the new architecture.  */
> -  tdep = XCNEW (struct gdbarch_tdep);
> +  moxie_gdbarch_tdep *tdep = new moxie_gdbarch_tdep;
>     gdbarch = gdbarch_alloc (&info, tdep);
>   
>     set_gdbarch_wchar_bit (gdbarch, 32);
> diff --git a/gdb/moxie-tdep.h b/gdb/moxie-tdep.h
> index b3687ef4d32..4e6bcd1c1c9 100644
> --- a/gdb/moxie-tdep.h
> +++ b/gdb/moxie-tdep.h
> @@ -20,7 +20,7 @@
>   #ifndef MOXIE_TDEP_H
>   #define MOXIE_TDEP_H
>   
> -struct gdbarch_tdep
> +struct moxie_gdbarch_tdep : gdbarch_tdep
>   {
>     /* gdbarch target dependent data here.  Currently unused for MOXIE.  */
>   };
> diff --git a/gdb/msp430-tdep.c b/gdb/msp430-tdep.c
> index c1b0c4c2e91..f3c44b71ba5 100644
> --- a/gdb/msp430-tdep.c
> +++ b/gdb/msp430-tdep.c
> @@ -104,19 +104,19 @@ enum
>   
>   /* 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.  */
> @@ -340,7 +340,8 @@ msp430_analyze_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc,
>     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));
> @@ -568,7 +569,8 @@ msp430_return_value (struct gdbarch *gdbarch,
>   {
>     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
> @@ -648,7 +650,8 @@ msp430_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
>     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);
>   
> @@ -766,8 +769,7 @@ msp430_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
>   
>     /* 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);
>     }
> @@ -811,7 +813,8 @@ msp430_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
>   
>     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);
> @@ -830,7 +833,6 @@ static struct gdbarch *
>   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.  */
> @@ -873,7 +875,8 @@ msp430_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   	  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;
> @@ -899,7 +902,8 @@ msp430_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>          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
> @@ -911,7 +915,7 @@ msp430_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   
>     /* 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;
> diff --git a/gdb/nds32-tdep.c b/gdb/nds32-tdep.c
> index 828853ed8e1..0360323d28c 100644
> --- a/gdb/nds32-tdep.c
> +++ b/gdb/nds32-tdep.c
> @@ -289,7 +289,7 @@ typedef BP_MANIPULATION (nds32_break_insn) nds32_breakpoint;
>   static int
>   nds32_dwarf2_reg_to_regnum (struct gdbarch *gdbarch, int num)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  nds32_gdbarch_tdep *tdep = (nds32_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     const int FSR = 38;
>     const int FDR = FSR + 32;
>   
> @@ -440,7 +440,7 @@ nds32_pseudo_register_read (struct gdbarch *gdbarch,
>   			    readable_regcache *regcache, int regnum,
>   			    gdb_byte *buf)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  nds32_gdbarch_tdep *tdep = (nds32_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     gdb_byte reg_buf[8];
>     int offset, fdr_regnum;
>     enum register_status status;
> @@ -479,7 +479,7 @@ nds32_pseudo_register_write (struct gdbarch *gdbarch,
>   			     struct regcache *regcache, int regnum,
>   			     const gdb_byte *buf)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  nds32_gdbarch_tdep *tdep = (nds32_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     gdb_byte reg_buf[8];
>     int offset, fdr_regnum;
>   
> @@ -616,7 +616,7 @@ static CORE_ADDR
>   nds32_analyze_prologue (struct gdbarch *gdbarch, CORE_ADDR pc,
>   			CORE_ADDR limit_pc, struct nds32_frame_cache *cache)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  nds32_gdbarch_tdep *tdep = (nds32_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int abi_use_fpr = nds32_abi_use_fpr (tdep->elf_abi);
>     /* Current scanning status.  */
>     int in_prologue_bb = 0;
> @@ -1177,7 +1177,7 @@ static int
>   nds32_analyze_epilogue (struct gdbarch *gdbarch, CORE_ADDR pc,
>   			struct nds32_frame_cache *cache)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  nds32_gdbarch_tdep *tdep = (nds32_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int abi_use_fpr = nds32_abi_use_fpr (tdep->elf_abi);
>     CORE_ADDR limit_pc;
>     uint32_t insn, insn_len;
> @@ -1228,7 +1228,7 @@ nds32_analyze_epilogue (struct gdbarch *gdbarch, CORE_ADDR pc,
>   static int
>   nds32_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR addr)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  nds32_gdbarch_tdep *tdep = (nds32_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int abi_use_fpr = nds32_abi_use_fpr (tdep->elf_abi);
>     int insn_type = INSN_NORMAL;
>     int ret_found = 0;
> @@ -1432,7 +1432,7 @@ nds32_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
>     int i;
>     ULONGEST regval;
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  nds32_gdbarch_tdep *tdep = (nds32_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     struct type *func_type = value_type (function);
>     int abi_use_fpr = nds32_abi_use_fpr (tdep->elf_abi);
>     int abi_split = nds32_abi_split (tdep->elf_abi);
> @@ -1660,7 +1660,7 @@ nds32_extract_return_value (struct gdbarch *gdbarch, struct type *type,
>   			    struct regcache *regcache, gdb_byte *valbuf)
>   {
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  nds32_gdbarch_tdep *tdep = (nds32_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int abi_use_fpr = nds32_abi_use_fpr (tdep->elf_abi);
>     int calling_use_fpr;
>     int len;
> @@ -1750,7 +1750,7 @@ nds32_store_return_value (struct gdbarch *gdbarch, struct type *type,
>   			  struct regcache *regcache, const gdb_byte *valbuf)
>   {
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  nds32_gdbarch_tdep *tdep = (nds32_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int abi_use_fpr = nds32_abi_use_fpr (tdep->elf_abi);
>     int calling_use_fpr;
>     int len;
> @@ -1955,7 +1955,6 @@ static struct gdbarch *
>   nds32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   {
>     struct gdbarch *gdbarch;
> -  struct gdbarch_tdep *tdep;
>     struct gdbarch_list *best_arch;
>     tdesc_arch_data_up tdesc_data;
>     const struct target_desc *tdesc = info.target_desc;
> @@ -1973,7 +1972,8 @@ nds32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>          best_arch != NULL;
>          best_arch = gdbarch_list_lookup_by_info (best_arch->next, &info))
>       {
> -      struct gdbarch_tdep *idep = gdbarch_tdep (best_arch->gdbarch);
> +      nds32_gdbarch_tdep *idep
> +	= (nds32_gdbarch_tdep *) gdbarch_tdep (best_arch->gdbarch);
>   
>         if (idep->elf_abi != elf_abi)
>   	continue;
> @@ -1995,7 +1995,7 @@ nds32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>       return NULL;
>   
>     /* Allocate space for the new architecture.  */
> -  tdep = XCNEW (struct gdbarch_tdep);
> +  nds32_gdbarch_tdep *tdep = new nds32_gdbarch_tdep;
>     tdep->fpu_freg = fpu_freg;
>     tdep->use_pseudo_fsrs = use_pseudo_fsrs;
>     tdep->fs0_regnum = -1;
> diff --git a/gdb/nds32-tdep.h b/gdb/nds32-tdep.h
> index 24229306328..e06512323f9 100644
> --- a/gdb/nds32-tdep.h
> +++ b/gdb/nds32-tdep.h
> @@ -40,15 +40,15 @@ enum nds32_regnum
>     NDS32_FD0_REGNUM = NDS32_NUM_REGS,
>   };
>   
> -struct gdbarch_tdep
> +struct nds32_gdbarch_tdep : gdbarch_tdep
>   {
>     /* The guessed FPU configuration.  */
> -  int fpu_freg;
> +  int fpu_freg = 0;
>     /* FSRs are defined as pseudo registers.  */
> -  int use_pseudo_fsrs;
> +  int use_pseudo_fsrs = 0;
>     /* Cached regnum of the first FSR (FS0).  */
> -  int fs0_regnum;
> +  int fs0_regnum = 0;
>     /* ELF ABI info.  */
> -  int elf_abi;
> +  int elf_abi = 0;
>   };
>   #endif /* NDS32_TDEP_H */
> diff --git a/gdb/nios2-linux-tdep.c b/gdb/nios2-linux-tdep.c
> index bd86146c878..2e360ba264e 100644
> --- a/gdb/nios2-linux-tdep.c
> +++ b/gdb/nios2-linux-tdep.c
> @@ -217,7 +217,7 @@ nios2_linux_is_kernel_helper (CORE_ADDR pc)
>   static void
>   nios2_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  nios2_gdbarch_tdep *tdep = (nios2_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     linux_init_abi (info, gdbarch, 0);
>   
> diff --git a/gdb/nios2-tdep.c b/gdb/nios2-tdep.c
> index be5544ec9fd..706b579ef17 100644
> --- a/gdb/nios2-tdep.c
> +++ b/gdb/nios2-tdep.c
> @@ -2098,7 +2098,7 @@ static CORE_ADDR
>   nios2_get_next_pc (struct regcache *regcache, CORE_ADDR pc)
>   {
>     struct gdbarch *gdbarch = regcache->arch ();
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  nios2_gdbarch_tdep *tdep = (nios2_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     unsigned long mach = gdbarch_bfd_arch_info (gdbarch)->mach;
>     unsigned int insn;
>     const struct nios2_opcode *op = nios2_fetch_insn (gdbarch, pc, &insn);
> @@ -2221,7 +2221,7 @@ static int
>   nios2_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
>   {
>     struct gdbarch *gdbarch = get_frame_arch (frame);
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  nios2_gdbarch_tdep *tdep = (nios2_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>     CORE_ADDR jb_addr = get_frame_register_unsigned (frame, NIOS2_R4_REGNUM);
>     gdb_byte buf[4];
> @@ -2275,7 +2275,6 @@ static struct gdbarch *
>   nios2_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   {
>     struct gdbarch *gdbarch;
> -  struct gdbarch_tdep *tdep;
>     int i;
>     tdesc_arch_data_up tdesc_data;
>     const struct target_desc *tdesc = info.target_desc;
> @@ -2313,7 +2312,7 @@ nios2_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   
>     /* None found, create a new architecture from the information
>        provided.  */
> -  tdep = XCNEW (struct gdbarch_tdep);
> +  nios2_gdbarch_tdep *tdep = new nios2_gdbarch_tdep;
>     gdbarch = gdbarch_alloc (&info, tdep);
>   
>     /* longjmp support not enabled by default.  */
> diff --git a/gdb/nios2-tdep.h b/gdb/nios2-tdep.h
> index f9e7349f0f5..96f186536e6 100644
> --- a/gdb/nios2-tdep.h
> +++ b/gdb/nios2-tdep.h
> @@ -20,6 +20,8 @@
>   #ifndef NIOS2_TDEP_H
>   #define NIOS2_TDEP_H
>   
> +#include "gdbarch.h"
> +
>   /* Nios II ISA specific encodings and macros.  */
>   #include "opcode/nios2.h"
>   
> @@ -67,19 +69,19 @@
>   #define NIOS2_CDX_OPCODE_SIZE 2
>   
>   /* Target-dependent structure in gdbarch.  */
> -struct gdbarch_tdep
> +struct nios2_gdbarch_tdep : gdbarch_tdep
>   {
>     /* Assumes FRAME is stopped at a syscall (trap) instruction; returns
>        the expected next PC.  */
>     CORE_ADDR (*syscall_next_pc) (struct frame_info *frame,
> -				const struct nios2_opcode *op);
> +				const struct nios2_opcode *op) = nullptr;
>   
>     /* Returns true if PC points to a kernel helper function.  */
> -  bool (*is_kernel_helper) (CORE_ADDR pc);
> +  bool (*is_kernel_helper) (CORE_ADDR pc) = nullptr;
>   
>     /* Offset to PC value in jump buffer.
>        If this is negative, longjmp support will be disabled.  */
> -  int jb_pc;
> +  int jb_pc = 0;
>   };
>   
>   extern struct target_desc *tdesc_nios2_linux;
> diff --git a/gdb/or1k-tdep.c b/gdb/or1k-tdep.c
> index 4c42e0242f3..346ee97c49b 100644
> --- a/gdb/or1k-tdep.c
> +++ b/gdb/or1k-tdep.c
> @@ -62,11 +62,11 @@ show_or1k_debug (struct ui_file *file, int from_tty,
>   
>   /* The target-dependent structure for gdbarch.  */
>   
> -struct gdbarch_tdep
> +struct or1k_gdbarch_tdep : gdbarch_tdep
>   {
> -  int bytes_per_word;
> -  int bytes_per_address;
> -  CGEN_CPU_DESC gdb_cgen_cpu_desc;
> +  int bytes_per_word = 0;
> +  int bytes_per_address = 0;
> +  CGEN_CPU_DESC gdb_cgen_cpu_desc = nullptr;
>   };
>   
>   /* Support functions for the architecture definition.  */
> @@ -247,7 +247,8 @@ or1k_return_value (struct gdbarch *gdbarch, struct value *functype,
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>     enum type_code rv_type = valtype->code ();
>     unsigned int rv_size = TYPE_LENGTH (valtype);
> -  int bpw = (gdbarch_tdep (gdbarch))->bytes_per_word;
> +  or1k_gdbarch_tdep *tdep = (or1k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +  int bpw = tdep->bytes_per_word;
>   
>     /* Deal with struct/union as addresses.  If an array won't fit in a
>        single register it is returned as address.  Anything larger than 2
> @@ -351,7 +352,7 @@ or1k_delay_slot_p (struct gdbarch *gdbarch, CORE_ADDR pc)
>   {
>     const CGEN_INSN *insn;
>     CGEN_FIELDS tmp_fields;
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  or1k_gdbarch_tdep *tdep = (or1k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     insn = cgen_lookup_insn (tdep->gdb_cgen_cpu_desc,
>   			   NULL,
> @@ -633,8 +634,9 @@ or1k_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
>     int heap_offset = 0;
>     CORE_ADDR heap_sp = sp - 128;
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
> -  int bpa = (gdbarch_tdep (gdbarch))->bytes_per_address;
> -  int bpw = (gdbarch_tdep (gdbarch))->bytes_per_word;
> +  or1k_gdbarch_tdep *tdep = (or1k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +  int bpa = tdep->bytes_per_address;
> +  int bpw = tdep->bytes_per_word;
>     struct type *func_type = value_type (function);
>   
>     /* Return address */
> @@ -1140,7 +1142,6 @@ static struct gdbarch *
>   or1k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   {
>     struct gdbarch *gdbarch;
> -  struct gdbarch_tdep *tdep;
>     const struct bfd_arch_info *binfo;
>     tdesc_arch_data_up tdesc_data;
>     const struct target_desc *tdesc = info.target_desc;
> @@ -1155,7 +1156,7 @@ or1k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>        actually know which target we are talking to, but put in some defaults
>        for now.  */
>     binfo = info.bfd_arch_info;
> -  tdep = XCNEW (struct gdbarch_tdep);
> +  or1k_gdbarch_tdep *tdep = new or1k_gdbarch_tdep;
>     tdep->bytes_per_word = binfo->bits_per_word / binfo->bits_per_byte;
>     tdep->bytes_per_address = binfo->bits_per_address / binfo->bits_per_byte;
>     gdbarch = gdbarch_alloc (&info, tdep);
> @@ -1283,7 +1284,7 @@ or1k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   static void
>   or1k_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  or1k_gdbarch_tdep *tdep = (or1k_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (NULL == tdep)
>       return; /* Nothing to report */
> diff --git a/gdb/ppc-fbsd-tdep.c b/gdb/ppc-fbsd-tdep.c
> index f41c8bb0be9..87d2a694e90 100644
> --- a/gdb/ppc-fbsd-tdep.c
> +++ b/gdb/ppc-fbsd-tdep.c
> @@ -126,7 +126,7 @@ ppcfbsd_iterate_over_regset_sections (struct gdbarch *gdbarch,
>   				      void *cb_data,
>   				      const struct regcache *regcache)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (tdep->wordsize == 4)
>       cb (".reg", 148, 148, &ppc32_fbsd_gregset, NULL, cb_data);
> @@ -200,7 +200,7 @@ static struct trad_frame_cache *
>   ppcfbsd_sigtramp_frame_cache (struct frame_info *this_frame, void **this_cache)
>   {
>     struct gdbarch *gdbarch = get_frame_arch (this_frame);
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     struct trad_frame_cache *cache;
>     CORE_ADDR addr, base, func;
>     gdb_byte buf[PPC_INSN_SIZE];
> @@ -287,7 +287,7 @@ static CORE_ADDR
>   ppcfbsd_get_thread_local_address (struct gdbarch *gdbarch, ptid_t ptid,
>   				  CORE_ADDR lm_addr, CORE_ADDR offset)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     struct regcache *regcache;
>     int tp_offset, tp_regnum;
>   
> @@ -319,7 +319,7 @@ ppcfbsd_get_thread_local_address (struct gdbarch *gdbarch, ptid_t ptid,
>   static void
>   ppcfbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* Generic FreeBSD support. */
>     fbsd_init_abi (info, gdbarch);
> diff --git a/gdb/ppc-linux-tdep.c b/gdb/ppc-linux-tdep.c
> index e2e1b1ec1d4..6df2411397c 100644
> --- a/gdb/ppc-linux-tdep.c
> +++ b/gdb/ppc-linux-tdep.c
> @@ -332,7 +332,7 @@ ppc_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
>   {
>     unsigned int insnbuf[POWERPC32_PLT_CHECK_LEN];
>     struct gdbarch *gdbarch = get_frame_arch (frame);
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>     CORE_ADDR target = 0;
>     int scan_limit, i;
> @@ -898,7 +898,7 @@ ppc_linux_vsxregset (void)
>   const struct regset *
>   ppc_linux_cgprregset (struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (tdep->wordsize == 4)
>       {
> @@ -938,7 +938,7 @@ ppc_linux_collect_core_cpgrregset (const struct regset *regset,
>   				   int regnum, void *buf, size_t len)
>   {
>     struct gdbarch *gdbarch = regcache->arch ();
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     const struct regset *cgprregset = ppc_linux_cgprregset (gdbarch);
>   
> @@ -985,7 +985,7 @@ ppc_linux_iterate_over_regset_sections (struct gdbarch *gdbarch,
>   					void *cb_data,
>   					const struct regcache *regcache)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int have_altivec = tdep->ppc_vr0_regnum != -1;
>     int have_vsx = tdep->ppc_vsr0_upper_regnum != -1;
>     int have_ppr = tdep->ppc_ppr_regnum != -1;
> @@ -1170,7 +1170,7 @@ ppc_linux_sigtramp_cache (struct frame_info *this_frame,
>     CORE_ADDR fpregs;
>     int i;
>     struct gdbarch *gdbarch = get_frame_arch (this_frame);
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>   
>     base = get_frame_register_unsigned (this_frame,
> @@ -1341,7 +1341,7 @@ ppc_linux_get_syscall_number (struct gdbarch *gdbarch,
>   			      thread_info *thread)
>   {
>     struct regcache *regcache = get_thread_regcache (thread);
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>   
>     /* Make sure we're in a 32- or 64-bit machine */
> @@ -1417,7 +1417,7 @@ static int
>   ppc_linux_syscall_record (struct regcache *regcache)
>   {
>     struct gdbarch *gdbarch = regcache->arch ();
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     ULONGEST scnum;
>     enum gdb_syscall syscall_gdb;
>     int ret;
> @@ -1506,7 +1506,7 @@ ppc_linux_record_signal (struct gdbarch *gdbarch, struct regcache *regcache,
>     const int SIGNAL_FRAMESIZE = 128;
>     const int sizeof_rt_sigframe = 1440 * 2 + 8 * 2 + 4 * 6 + 8 + 8 + 128 + 512;
>     ULONGEST sp;
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int i;
>   
>     for (i = 3; i <= 12; i++)
> @@ -2018,7 +2018,7 @@ static void
>   ppc_linux_init_abi (struct gdbarch_info info,
>   		    struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     struct tdesc_arch_data *tdesc_data = info.tdesc_data;
>     static const char *const stap_integer_prefixes[] = { "i", NULL };
>     static const char *const stap_register_indirection_prefixes[] = { "(",
> diff --git a/gdb/ppc-netbsd-tdep.c b/gdb/ppc-netbsd-tdep.c
> index 31f11993889..97912eb5508 100644
> --- a/gdb/ppc-netbsd-tdep.c
> +++ b/gdb/ppc-netbsd-tdep.c
> @@ -102,7 +102,7 @@ ppcnbsd_sigtramp_cache_init (const struct tramp_frame *self,
>   			     CORE_ADDR func)
>   {
>     struct gdbarch *gdbarch = get_frame_arch (this_frame);
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     CORE_ADDR addr, base;
>     int i;
>   
> diff --git a/gdb/ppc-obsd-tdep.c b/gdb/ppc-obsd-tdep.c
> index 98b3e4013e9..6a83c08b04f 100644
> --- a/gdb/ppc-obsd-tdep.c
> +++ b/gdb/ppc-obsd-tdep.c
> @@ -161,7 +161,7 @@ static struct trad_frame_cache *
>   ppcobsd_sigtramp_frame_cache (struct frame_info *this_frame, void **this_cache)
>   {
>     struct gdbarch *gdbarch = get_frame_arch (this_frame);
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>     struct trad_frame_cache *cache;
>     CORE_ADDR addr, base, func;
> diff --git a/gdb/ppc-sysv-tdep.c b/gdb/ppc-sysv-tdep.c
> index d98af2552b4..0d15e427561 100644
> --- a/gdb/ppc-sysv-tdep.c
> +++ b/gdb/ppc-sysv-tdep.c
> @@ -65,7 +65,7 @@ ppc_sysv_abi_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);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>     int opencl_abi = ppc_sysv_use_opencl_abi (value_type (function));
>     ULONGEST saved_sp;
> @@ -597,7 +597,7 @@ get_decimal_float_return_value (struct gdbarch *gdbarch, struct type *valtype,
>   				struct regcache *regcache, gdb_byte *readbuf,
>   				const gdb_byte *writebuf)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     gdb_assert (valtype->code () == TYPE_CODE_DECFLOAT);
>   
> @@ -675,7 +675,7 @@ do_ppc_sysv_return_value (struct gdbarch *gdbarch, struct type *func_type,
>   			  gdb_byte *readbuf, const gdb_byte *writebuf,
>   			  int broken_gcc)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>     int opencl_abi = func_type? ppc_sysv_use_opencl_abi (func_type) : 0;
>   
> @@ -1250,7 +1250,7 @@ ppc64_sysv_abi_push_val (struct gdbarch *gdbarch,
>   			 const bfd_byte *val, int len, int align,
>   			 struct ppc64_sysv_argpos *argpos)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int offset = 0;
>   
>     /* Enforce alignment of stack location, if requested.  */
> @@ -1300,7 +1300,7 @@ static void
>   ppc64_sysv_abi_push_integer (struct gdbarch *gdbarch, ULONGEST val,
>   			     struct ppc64_sysv_argpos *argpos)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>     gdb_byte buf[PPC_MAX_REGISTER_SIZE];
>   
> @@ -1318,7 +1318,7 @@ ppc64_sysv_abi_push_freg (struct gdbarch *gdbarch,
>   			  struct type *type, const bfd_byte *val,
>   			  struct ppc64_sysv_argpos *argpos)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     if (tdep->soft_float)
>       return;
>   
> @@ -1403,7 +1403,7 @@ static void
>   ppc64_sysv_abi_push_vreg (struct gdbarch *gdbarch, const bfd_byte *val,
>   			  struct ppc64_sysv_argpos *argpos)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (argpos->regcache && argpos->vreg <= 13)
>       argpos->regcache->cooked_write (tdep->ppc_vr0_regnum + argpos->vreg, val);
> @@ -1419,7 +1419,7 @@ ppc64_sysv_abi_push_param (struct gdbarch *gdbarch,
>   			   struct type *type, const bfd_byte *val,
>   			   struct ppc64_sysv_argpos *argpos)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (type->code () == TYPE_CODE_FLT
>         || type->code () == TYPE_CODE_DECFLOAT)
> @@ -1545,7 +1545,7 @@ ppc64_sysv_abi_push_dummy_call (struct gdbarch *gdbarch,
>   				CORE_ADDR struct_addr)
>   {
>     CORE_ADDR func_addr = find_function_addr (function, NULL);
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>     int opencl_abi = ppc_sysv_use_opencl_abi (value_type (function));
>     ULONGEST back_chain;
> @@ -1739,7 +1739,7 @@ ppc64_sysv_abi_return_value_base (struct gdbarch *gdbarch, struct type *valtype,
>   				  struct regcache *regcache, gdb_byte *readbuf,
>   				  const gdb_byte *writebuf, int index)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* Integers live in GPRs starting at r3.  */
>     if ((valtype->code () == TYPE_CODE_INT
> @@ -1905,7 +1905,7 @@ ppc64_sysv_abi_return_value (struct gdbarch *gdbarch, struct value *function,
>   			     struct type *valtype, struct regcache *regcache,
>   			     gdb_byte *readbuf, const gdb_byte *writebuf)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     struct type *func_type = function ? value_type (function) : NULL;
>     int opencl_abi = func_type? ppc_sysv_use_opencl_abi (func_type) : 0;
>     struct type *eltype;
> diff --git a/gdb/ppc-tdep.h b/gdb/ppc-tdep.h
> index 1e0754f7692..6b305c460b1 100644
> --- a/gdb/ppc-tdep.h
> +++ b/gdb/ppc-tdep.h
> @@ -205,106 +205,106 @@ enum powerpc_long_double_abi
>     POWERPC_LONG_DOUBLE_LAST
>   };
>   
> -struct gdbarch_tdep
> +struct ppc_gdbarch_tdep : gdbarch_tdep
>     {
> -    int wordsize;		/* Size in bytes of fixed-point word.  */
> -    int soft_float;		/* Avoid FP registers for arguments?  */
> +    int wordsize = 0;		/* Size in bytes of fixed-point word.  */
> +    int soft_float = 0;		/* Avoid FP registers for arguments?  */
>   
> -    enum powerpc_elf_abi elf_abi;	/* ELF ABI version.  */
> +    enum powerpc_elf_abi elf_abi {};	/* ELF ABI version.  */
>   
>       /* Format to use for the "long double" data type.  */
> -    enum powerpc_long_double_abi long_double_abi;
> +    enum powerpc_long_double_abi long_double_abi {};
>   
>       /* How to pass vector arguments.  Never set to AUTO or LAST.  */
> -    enum powerpc_vector_abi vector_abi;
> +    enum powerpc_vector_abi vector_abi {};
>   
> -    int ppc_gp0_regnum;		/* GPR register 0 */
> -    int ppc_toc_regnum;		/* TOC register */
> -    int ppc_ps_regnum;	        /* Processor (or machine) status (%msr) */
> -    int ppc_cr_regnum;		/* Condition register */
> -    int ppc_lr_regnum;		/* Link register */
> -    int ppc_ctr_regnum;		/* Count register */
> -    int ppc_xer_regnum;		/* Integer exception register */
> +    int ppc_gp0_regnum = 0;		/* GPR register 0 */
> +    int ppc_toc_regnum = 0;		/* TOC register */
> +    int ppc_ps_regnum = 0;		/* Processor (or machine) status (%msr) */
> +    int ppc_cr_regnum = 0;		/* Condition register */
> +    int ppc_lr_regnum = 0;		/* Link register */
> +    int ppc_ctr_regnum = 0;		/* Count register */
> +    int ppc_xer_regnum = 0;		/* Integer exception register */
>   
>       /* Not all PPC and RS6000 variants will have the registers
>          represented below.  A -1 is used to indicate that the register
>          is not present in this variant.  */
>   
>       /* Floating-point registers.  */
> -    int ppc_fp0_regnum;         /* Floating-point register 0.  */
> -    int ppc_fpscr_regnum;	/* fp status and condition register.  */
> +    int ppc_fp0_regnum = 0;	/* Floating-point register 0.  */
> +    int ppc_fpscr_regnum = 0;	/* fp status and condition register.  */
>   
>       /* Multiplier-Quotient Register (older POWER architectures only).  */
> -    int ppc_mq_regnum;
> +    int ppc_mq_regnum = 0;
>   
>       /* POWER7 VSX registers.  */
> -    int ppc_vsr0_regnum;	/* First VSX register.  */
> -    int ppc_vsr0_upper_regnum;  /* First right most dword vsx register.  */
> -    int ppc_efpr0_regnum;	/* First Extended FP register.  */
> +    int ppc_vsr0_regnum = 0;		/* First VSX register.  */
> +    int ppc_vsr0_upper_regnum = 0; 	/* First right most dword vsx register.  */
> +    int ppc_efpr0_regnum = 0;		/* First Extended FP register.  */
>   
>       /* Altivec registers.  */
> -    int ppc_vr0_regnum;		/* First AltiVec register.  */
> -    int ppc_vrsave_regnum;	/* Last AltiVec register.  */
> +    int ppc_vr0_regnum = 0;	/* First AltiVec register.  */
> +    int ppc_vrsave_regnum = 0;	/* Last AltiVec register.  */
>   
>       /* Altivec pseudo-register vX aliases for the raw vrX
>          registers.  */
> -    int ppc_v0_alias_regnum;
> +    int ppc_v0_alias_regnum = 0;
>   
>       /* SPE registers.  */
> -    int ppc_ev0_upper_regnum;   /* First GPR upper half register.  */
> -    int ppc_ev0_regnum;         /* First ev register.  */
> -    int ppc_acc_regnum;         /* SPE 'acc' register.  */
> -    int ppc_spefscr_regnum;     /* SPE 'spefscr' register.  */
> +    int ppc_ev0_upper_regnum = 0;   /* First GPR upper half register.  */
> +    int ppc_ev0_regnum = 0;         /* First ev register.  */
> +    int ppc_acc_regnum = 0;         /* SPE 'acc' register.  */
> +    int ppc_spefscr_regnum = 0;     /* SPE 'spefscr' register.  */
>   
>       /* Program Priority Register.  */
> -    int ppc_ppr_regnum;
> +    int ppc_ppr_regnum = 0;
>   
>       /* Data Stream Control Register.  */
> -    int ppc_dscr_regnum;
> +    int ppc_dscr_regnum = 0;
>   
>       /* Target Address Register.  */
> -    int ppc_tar_regnum;
> +    int ppc_tar_regnum = 0;
>   
>       /* Decimal 128 registers.  */
> -    int ppc_dl0_regnum;		/* First Decimal128 argument register pair.  */
> +    int ppc_dl0_regnum = 0;	/* First Decimal128 argument register pair.  */
>   
> -    int have_ebb;
> +    int have_ebb = 0;
>   
>       /* PMU registers.  */
> -    int ppc_mmcr0_regnum;
> -    int ppc_mmcr2_regnum;
> -    int ppc_siar_regnum;
> -    int ppc_sdar_regnum;
> -    int ppc_sier_regnum;
> +    int ppc_mmcr0_regnum = 0;
> +    int ppc_mmcr2_regnum = 0;
> +    int ppc_siar_regnum = 0;
> +    int ppc_sdar_regnum = 0;
> +    int ppc_sier_regnum = 0;
>   
>       /* Hardware Transactional Memory registers.  */
> -    int have_htm_spr;
> -    int have_htm_core;
> -    int have_htm_fpu;
> -    int have_htm_altivec;
> -    int have_htm_vsx;
> -    int ppc_cppr_regnum;
> -    int ppc_cdscr_regnum;
> -    int ppc_ctar_regnum;
> +    int have_htm_spr = 0;
> +    int have_htm_core = 0;
> +    int have_htm_fpu = 0;
> +    int have_htm_altivec = 0;
> +    int have_htm_vsx = 0;
> +    int ppc_cppr_regnum = 0;
> +    int ppc_cdscr_regnum = 0;
> +    int ppc_ctar_regnum = 0;
>   
>       /* HTM pseudo registers.  */
> -    int ppc_cdl0_regnum;
> -    int ppc_cvsr0_regnum;
> -    int ppc_cefpr0_regnum;
> +    int ppc_cdl0_regnum = 0;
> +    int ppc_cvsr0_regnum = 0;
> +    int ppc_cefpr0_regnum = 0;
>   
>       /* Offset to ABI specific location where link register is saved.  */
> -    int lr_frame_offset;	
> +    int lr_frame_offset = 0;
>   
>       /* An array of integers, such that sim_regno[I] is the simulator
>          register number for GDB register number I, or -1 if the
>          simulator does not implement that register.  */
> -    int *sim_regno;
> +    int *sim_regno = nullptr;
>   
>       /* ISA-specific types.  */
> -    struct type *ppc_builtin_type_vec64;
> -    struct type *ppc_builtin_type_vec128;
> +    struct type *ppc_builtin_type_vec64 = nullptr;
> +    struct type *ppc_builtin_type_vec128 = nullptr;
>   
> -    int (*ppc_syscall_record) (struct regcache *regcache);
> +    int (*ppc_syscall_record) (struct regcache *regcache) = nullptr;
>   };
>   
>   
> diff --git a/gdb/ppc64-tdep.c b/gdb/ppc64-tdep.c
> index 1dd94f20ab6..aab893df3a5 100644
> --- a/gdb/ppc64-tdep.c
> +++ b/gdb/ppc64-tdep.c
> @@ -89,7 +89,7 @@ ppc64_plt_entry_point (struct frame_info *frame, CORE_ADDR plt_off)
>   {
>     struct gdbarch *gdbarch = get_frame_arch (frame);
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     CORE_ADDR tocp;
>   
>     if (execution_direction == EXEC_REVERSE)
> diff --git a/gdb/riscv-linux-tdep.c b/gdb/riscv-linux-tdep.c
> index 7351e1901d6..f6489ab0238 100644
> --- a/gdb/riscv-linux-tdep.c
> +++ b/gdb/riscv-linux-tdep.c
> @@ -179,7 +179,7 @@ riscv_linux_syscall_next_pc (struct frame_info *frame)
>   static void
>   riscv_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  riscv_gdbarch_tdep *tdep = (riscv_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     linux_init_abi (info, gdbarch, 0);
>   
> diff --git a/gdb/riscv-tdep.c b/gdb/riscv-tdep.c
> index bfd93c65d22..a6a64d3cb84 100644
> --- a/gdb/riscv-tdep.c
> +++ b/gdb/riscv-tdep.c
> @@ -730,7 +730,8 @@ show_riscv_debug_variable (struct ui_file *file, int from_tty,
>   int
>   riscv_isa_xlen (struct gdbarch *gdbarch)
>   {
> -  return gdbarch_tdep (gdbarch)->isa_features.xlen;
> +  riscv_gdbarch_tdep *tdep = (riscv_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +  return tdep->isa_features.xlen;
>   }
>   
>   /* See riscv-tdep.h.  */
> @@ -738,7 +739,8 @@ riscv_isa_xlen (struct gdbarch *gdbarch)
>   int
>   riscv_abi_xlen (struct gdbarch *gdbarch)
>   {
> -  return gdbarch_tdep (gdbarch)->abi_features.xlen;
> +  riscv_gdbarch_tdep *tdep = (riscv_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +  return tdep->abi_features.xlen;
>   }
>   
>   /* See riscv-tdep.h.  */
> @@ -746,7 +748,8 @@ riscv_abi_xlen (struct gdbarch *gdbarch)
>   int
>   riscv_isa_flen (struct gdbarch *gdbarch)
>   {
> -  return gdbarch_tdep (gdbarch)->isa_features.flen;
> +  riscv_gdbarch_tdep *tdep = (riscv_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +  return tdep->isa_features.flen;
>   }
>   
>   /* See riscv-tdep.h.  */
> @@ -754,7 +757,8 @@ riscv_isa_flen (struct gdbarch *gdbarch)
>   int
>   riscv_abi_flen (struct gdbarch *gdbarch)
>   {
> -  return gdbarch_tdep (gdbarch)->abi_features.flen;
> +  riscv_gdbarch_tdep *tdep = (riscv_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +  return tdep->abi_features.flen;
>   }
>   
>   /* See riscv-tdep.h.  */
> @@ -762,7 +766,8 @@ riscv_abi_flen (struct gdbarch *gdbarch)
>   bool
>   riscv_abi_embedded (struct gdbarch *gdbarch)
>   {
> -  return gdbarch_tdep (gdbarch)->abi_features.embedded;
> +  riscv_gdbarch_tdep *tdep = (riscv_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +  return tdep->abi_features.embedded;
>   }
>   
>   /* Return true if the target for GDBARCH has floating point hardware.  */
> @@ -778,7 +783,8 @@ riscv_has_fp_regs (struct gdbarch *gdbarch)
>   static bool
>   riscv_has_fp_abi (struct gdbarch *gdbarch)
>   {
> -  return gdbarch_tdep (gdbarch)->abi_features.flen > 0;
> +  riscv_gdbarch_tdep *tdep = (riscv_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +  return tdep->abi_features.flen > 0;
>   }
>   
>   /* Return true if REGNO is a floating pointer register.  */
> @@ -901,7 +907,7 @@ riscv_register_name (struct gdbarch *gdbarch, int regnum)
>        will show up in 'info register all'.  Unless, we identify the
>        duplicate copies of these registers (in riscv_tdesc_unknown_reg) and
>        then hide the registers here by giving them no name.  */
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  riscv_gdbarch_tdep *tdep = (riscv_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     if (tdep->duplicate_fflags_regnum == regnum)
>       return NULL;
>     if (tdep->duplicate_frm_regnum == regnum)
> @@ -929,7 +935,7 @@ riscv_register_name (struct gdbarch *gdbarch, int regnum)
>   static struct type *
>   riscv_fpreg_d_type (struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  riscv_gdbarch_tdep *tdep = (riscv_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (tdep->riscv_fpreg_d_type == nullptr)
>       {
> @@ -1251,7 +1257,7 @@ riscv_is_regnum_a_named_csr (int regnum)
>   static bool
>   riscv_is_unknown_csr (struct gdbarch *gdbarch, int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  riscv_gdbarch_tdep *tdep = (riscv_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     return (regnum >= tdep->unknown_csrs_first_regnum
>   	  && regnum < (tdep->unknown_csrs_first_regnum
>   		       + tdep->unknown_csrs_count));
> @@ -3560,7 +3566,7 @@ riscv_tdesc_unknown_reg (struct gdbarch *gdbarch, tdesc_feature *feature,
>        record their register numbers here.  */
>     if (strcmp (tdesc_feature_name (feature), riscv_freg_feature.name ()) == 0)
>       {
> -      struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +      riscv_gdbarch_tdep *tdep = (riscv_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>         int *regnum_ptr = nullptr;
>   
>         if (strcmp (reg_name, "fflags") == 0)
> @@ -3591,7 +3597,7 @@ riscv_tdesc_unknown_reg (struct gdbarch *gdbarch, tdesc_feature *feature,
>        about register groups in riscv_register_reggroup_p.  */
>     if (strcmp (tdesc_feature_name (feature), riscv_csr_feature.name ()) == 0)
>       {
> -      struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +      riscv_gdbarch_tdep *tdep = (riscv_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>         if (tdep->unknown_csrs_first_regnum == -1)
>   	tdep->unknown_csrs_first_regnum = possible_regnum;
>         gdb_assert (tdep->unknown_csrs_first_regnum
> @@ -3628,7 +3634,6 @@ riscv_gdbarch_init (struct gdbarch_info info,
>   		    struct gdbarch_list *arches)
>   {
>     struct gdbarch *gdbarch;
> -  struct gdbarch_tdep *tdep;
>     struct riscv_gdbarch_features features;
>     const struct target_desc *tdesc = info.target_desc;
>   
> @@ -3693,7 +3698,8 @@ riscv_gdbarch_init (struct gdbarch_info info,
>         /* Check that the feature set of the ARCHES matches the feature set
>   	 we are looking for.  If it doesn't then we can't reuse this
>   	 gdbarch.  */
> -      struct gdbarch_tdep *other_tdep = gdbarch_tdep (arches->gdbarch);
> +      riscv_gdbarch_tdep *other_tdep
> +	= (riscv_gdbarch_tdep *) gdbarch_tdep (arches->gdbarch);
>   
>         if (other_tdep->isa_features != features
>   	  || other_tdep->abi_features != abi_features)
> @@ -3706,7 +3712,7 @@ riscv_gdbarch_init (struct gdbarch_info info,
>       return arches->gdbarch;
>   
>     /* None found, so create a new architecture from the information provided.  */
> -  tdep = new (struct gdbarch_tdep);
> +  riscv_gdbarch_tdep *tdep = new riscv_gdbarch_tdep;
>     gdbarch = gdbarch_alloc (&info, tdep);
>     tdep->isa_features = features;
>     tdep->abi_features = abi_features;
> @@ -3812,7 +3818,8 @@ static CORE_ADDR
>   riscv_next_pc (struct regcache *regcache, CORE_ADDR pc)
>   {
>     struct gdbarch *gdbarch = regcache->arch ();
> -  const struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  const riscv_gdbarch_tdep *tdep
> +    = (riscv_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     struct riscv_insn insn;
>     CORE_ADDR next_pc;
>   
> diff --git a/gdb/riscv-tdep.h b/gdb/riscv-tdep.h
> index 03870cf9e5b..2af6ec332f7 100644
> --- a/gdb/riscv-tdep.h
> +++ b/gdb/riscv-tdep.h
> @@ -22,6 +22,7 @@
>   #define RISCV_TDEP_H
>   
>   #include "arch/riscv.h"
> +#include "gdbarch.h"
>   
>   /* RiscV register numbers.  */
>   enum
> @@ -75,7 +76,7 @@ enum
>   };
>   
>   /* RISC-V specific per-architecture information.  */
> -struct gdbarch_tdep
> +struct riscv_gdbarch_tdep : gdbarch_tdep
>   {
>     /* Features about the target hardware that impact how the gdbarch is
>        configured.  Two gdbarch instances are compatible only if this field
> @@ -105,7 +106,7 @@ struct gdbarch_tdep
>   
>     /* Return the expected next PC assuming FRAME is stopped at a syscall
>        instruction.  */
> -  CORE_ADDR (*syscall_next_pc) (struct frame_info *frame);
> +  CORE_ADDR (*syscall_next_pc) (struct frame_info *frame) = nullptr;
>   };
>   
>   
> diff --git a/gdb/rl78-tdep.c b/gdb/rl78-tdep.c
> index 3b2cf9667df..616dafb1721 100644
> --- a/gdb/rl78-tdep.c
> +++ b/gdb/rl78-tdep.c
> @@ -209,21 +209,21 @@ enum
>   
>   /* Architecture specific data.  */
>   
> -struct gdbarch_tdep
> +struct rl78_gdbarch_tdep : gdbarch_tdep
>   {
>     /* The ELF header flags specify the multilib used.  */
> -  int elf_flags;
> -
> -  struct type *rl78_void,
> -	      *rl78_uint8,
> -	      *rl78_int8,
> -	      *rl78_uint16,
> -	      *rl78_int16,
> -	      *rl78_uint32,
> -	      *rl78_int32,
> -	      *rl78_data_pointer,
> -	      *rl78_code_pointer,
> -	      *rl78_psw_type;
> +  int elf_flags = 0;
> +
> +  struct type *rl78_void = nullptr,
> +	      *rl78_uint8 = nullptr,
> +	      *rl78_int8 = nullptr,
> +	      *rl78_uint16 = nullptr,
> +	      *rl78_int16 = nullptr,
> +	      *rl78_uint32 = nullptr,
> +	      *rl78_int32 = nullptr,
> +	      *rl78_data_pointer = nullptr,
> +	      *rl78_code_pointer = nullptr,
> +	      *rl78_psw_type = nullptr;
>   };
>   
>   /* This structure holds the results of a prologue analysis.  */
> @@ -266,7 +266,7 @@ struct rl78_prologue
>   static struct type *
>   rl78_psw_type (struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  rl78_gdbarch_tdep *tdep = (rl78_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (tdep->rl78_psw_type == NULL)
>       {
> @@ -290,7 +290,7 @@ rl78_psw_type (struct gdbarch *gdbarch)
>   static struct type *
>   rl78_register_type (struct gdbarch *gdbarch, int reg_nr)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  rl78_gdbarch_tdep *tdep = (rl78_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (reg_nr == RL78_PC_REGNUM)
>       return tdep->rl78_code_pointer;
> @@ -1247,7 +1247,8 @@ rl78_return_value (struct gdbarch *gdbarch,
>   {
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>     ULONGEST valtype_len = TYPE_LENGTH (valtype);
> -  int is_g10 = gdbarch_tdep (gdbarch)->elf_flags & E_FLAG_RL78_G10;
> +  rl78_gdbarch_tdep *tdep = (rl78_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +  int is_g10 = tdep->elf_flags & E_FLAG_RL78_G10;
>   
>     if (valtype_len > 8)
>       return RETURN_VALUE_STRUCT_CONVENTION;
> @@ -1375,7 +1376,6 @@ static struct gdbarch *
>   rl78_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   {
>     struct gdbarch *gdbarch;
> -  struct gdbarch_tdep *tdep;
>     int elf_flags;
>   
>     /* Extract the elf_flags if available.  */
> @@ -1392,7 +1392,10 @@ rl78_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>          arches != NULL;
>          arches = gdbarch_list_lookup_by_info (arches->next, &info))
>       {
> -      if (gdbarch_tdep (arches->gdbarch)->elf_flags != elf_flags)
> +      rl78_gdbarch_tdep *tdep
> +	= (rl78_gdbarch_tdep *) gdbarch_tdep (arches->gdbarch);
> +
> +      if (tdep->elf_flags != elf_flags)
>   	continue;
>   
>         return arches->gdbarch;
> @@ -1400,7 +1403,7 @@ rl78_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   
>     /* None found, create a new architecture from the information
>        provided.  */
> -  tdep = XCNEW (struct gdbarch_tdep);
> +  rl78_gdbarch_tdep * tdep = new rl78_gdbarch_tdep;
>     gdbarch = gdbarch_alloc (&info, tdep);
>     tdep->elf_flags = elf_flags;
>   
> diff --git a/gdb/rs6000-aix-tdep.c b/gdb/rs6000-aix-tdep.c
> index 80e19570a4d..11cae6ad4bc 100644
> --- a/gdb/rs6000-aix-tdep.c
> +++ b/gdb/rs6000-aix-tdep.c
> @@ -73,7 +73,7 @@ aix_sighandle_frame_cache (struct frame_info *this_frame,
>     LONGEST backchain;
>     CORE_ADDR base, base_orig, func;
>     struct gdbarch *gdbarch = get_frame_arch (this_frame);
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>     struct trad_frame_cache *this_trad_cache;
>   
> @@ -259,7 +259,8 @@ rs6000_aix_iterate_over_regset_sections (struct gdbarch *gdbarch,
>   					 void *cb_data,
>   					 const struct regcache *regcache)
>   {
> -  if (gdbarch_tdep (gdbarch)->wordsize == 4)
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +  if (tdep->wordsize == 4)
>       cb (".reg", 592, 592, &rs6000_aix32_regset, NULL, cb_data);
>     else
>       cb (".reg", 576, 576, &rs6000_aix64_regset, NULL, cb_data);
> @@ -289,7 +290,7 @@ rs6000_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);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>     int ii;
>     int len = 0;
> @@ -297,7 +298,7 @@ rs6000_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
>     int argbytes;			/* current argument byte */
>     gdb_byte tmp_buffer[50];
>     int f_argno = 0;		/* current floating point argno */
> -  int wordsize = gdbarch_tdep (gdbarch)->wordsize;
> +  int wordsize = tdep->wordsize;
>     CORE_ADDR func_addr = find_function_addr (function, NULL);
>   
>     struct value *arg = 0;
> @@ -519,7 +520,7 @@ rs6000_return_value (struct gdbarch *gdbarch, struct value *function,
>   		     struct type *valtype, struct regcache *regcache,
>   		     gdb_byte *readbuf, const gdb_byte *writebuf)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>   
>     /* The calling convention this function implements assumes the
> @@ -657,7 +658,7 @@ rs6000_convert_from_func_ptr_addr (struct gdbarch *gdbarch,
>   				   CORE_ADDR addr,
>   				   struct target_ops *targ)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>     struct obj_section *s;
>   
> @@ -701,7 +702,7 @@ branch_dest (struct regcache *regcache, int opcode, int instr,
>   	     CORE_ADDR pc, CORE_ADDR safety)
>   {
>     struct gdbarch *gdbarch = regcache->arch ();
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>     CORE_ADDR dest;
>     int immediate;
> @@ -969,7 +970,7 @@ static struct ld_info
>   rs6000_aix_extract_ld_info (struct gdbarch *gdbarch,
>   			    const gdb_byte *ldi_buf)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>     struct type *ptr_type = builtin_type (gdbarch)->builtin_data_ptr;
>     const struct ld_info_desc desc
> @@ -1128,7 +1129,7 @@ rs6000_aix_core_xfer_shared_libraries_aix (struct gdbarch *gdbarch,
>   static void
>   rs6000_aix_init_osabi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* RS6000/AIX does not support PT_STEP.  Has to be simulated.  */
>     set_gdbarch_software_single_step (gdbarch, rs6000_software_single_step);
> diff --git a/gdb/rs6000-lynx178-tdep.c b/gdb/rs6000-lynx178-tdep.c
> index 21f1baf19dc..bdc1aaa18d7 100644
> --- a/gdb/rs6000-lynx178-tdep.c
> +++ b/gdb/rs6000-lynx178-tdep.c
> @@ -36,7 +36,7 @@ rs6000_lynx178_push_dummy_call (struct gdbarch *gdbarch,
>   				function_call_return_method return_method,
>   				CORE_ADDR struct_addr)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>     int ii;
>     int len = 0;
> @@ -44,7 +44,7 @@ rs6000_lynx178_push_dummy_call (struct gdbarch *gdbarch,
>     int argbytes;			/* current argument byte */
>     gdb_byte tmp_buffer[50];
>     int f_argno = 0;		/* current floating point argno */
> -  int wordsize = gdbarch_tdep (gdbarch)->wordsize;
> +  int wordsize = tdep->wordsize;
>   
>     struct value *arg = 0;
>     struct type *type;
> @@ -265,7 +265,7 @@ rs6000_lynx178_return_value (struct gdbarch *gdbarch, struct value *function,
>   			     struct type *valtype, struct regcache *regcache,
>   			     gdb_byte *readbuf, const gdb_byte *writebuf)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>   
>     /* The calling convention this function implements assumes the
> diff --git a/gdb/rs6000-tdep.c b/gdb/rs6000-tdep.c
> index 4830ed22593..0d618943186 100644
> --- a/gdb/rs6000-tdep.c
> +++ b/gdb/rs6000-tdep.c
> @@ -209,7 +209,7 @@ struct rs6000_framedata
>   int
>   vsx_register_p (struct gdbarch *gdbarch, int regno)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     if (tdep->ppc_vsr0_regnum < 0)
>       return 0;
>     else
> @@ -221,7 +221,7 @@ vsx_register_p (struct gdbarch *gdbarch, int regno)
>   int
>   altivec_register_p (struct gdbarch *gdbarch, int regno)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     if (tdep->ppc_vr0_regnum < 0 || tdep->ppc_vrsave_regnum < 0)
>       return 0;
>     else
> @@ -233,7 +233,7 @@ altivec_register_p (struct gdbarch *gdbarch, int regno)
>   int
>   spe_register_p (struct gdbarch *gdbarch, int regno)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     
>     /* Is it a reference to EV0 -- EV31, and do we have those?  */
>     if (IS_SPE_PSEUDOREG (tdep, regno))
> @@ -265,7 +265,7 @@ spe_register_p (struct gdbarch *gdbarch, int regno)
>   int
>   ppc_floating_point_unit_p (struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     return (tdep->ppc_fp0_regnum >= 0
>   	  && tdep->ppc_fpscr_regnum >= 0);
> @@ -276,7 +276,7 @@ ppc_floating_point_unit_p (struct gdbarch *gdbarch)
>   int
>   ppc_altivec_support_p (struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     return (tdep->ppc_vr0_regnum >= 0
>   	  && tdep->ppc_vrsave_regnum >= 0);
> @@ -305,7 +305,7 @@ set_sim_regno (int *table, int gdb_regno, int sim_regno)
>   static void
>   init_sim_regno_table (struct gdbarch *arch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (arch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (arch);
>     int total_regs = gdbarch_num_regs (arch);
>     int *sim_regno = GDBARCH_OBSTACK_CALLOC (arch, total_regs, int);
>     int i;
> @@ -399,7 +399,7 @@ init_sim_regno_table (struct gdbarch *arch)
>   static int
>   rs6000_register_sim_regno (struct gdbarch *gdbarch, int reg)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int sim_regno;
>   
>     if (tdep->sim_regno == NULL)
> @@ -470,7 +470,7 @@ ppc_collect_reg (const struct regcache *regcache, int regnum,
>       
>   static int
>   ppc_greg_offset (struct gdbarch *gdbarch,
> -		 struct gdbarch_tdep *tdep,
> +		 ppc_gdbarch_tdep *tdep,
>   		 const struct ppc_reg_offsets *offsets,
>   		 int regnum,
>   		 int *regsize)
> @@ -507,7 +507,7 @@ ppc_greg_offset (struct gdbarch *gdbarch,
>   }
>   
>   static int
> -ppc_fpreg_offset (struct gdbarch_tdep *tdep,
> +ppc_fpreg_offset (ppc_gdbarch_tdep *tdep,
>   		  const struct ppc_reg_offsets *offsets,
>   		  int regnum)
>   {
> @@ -530,7 +530,7 @@ ppc_supply_gregset (const struct regset *regset, struct regcache *regcache,
>   		    int regnum, const void *gregs, size_t len)
>   {
>     struct gdbarch *gdbarch = regcache->arch ();
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     const struct ppc_reg_offsets *offsets
>       = (const struct ppc_reg_offsets *) regset->regmap;
>     size_t offset;
> @@ -580,14 +580,13 @@ ppc_supply_fpregset (const struct regset *regset, struct regcache *regcache,
>   		     int regnum, const void *fpregs, size_t len)
>   {
>     struct gdbarch *gdbarch = regcache->arch ();
> -  struct gdbarch_tdep *tdep;
>     const struct ppc_reg_offsets *offsets;
>     size_t offset;
>   
>     if (!ppc_floating_point_unit_p (gdbarch))
>       return;
>   
> -  tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     offsets = (const struct ppc_reg_offsets *) regset->regmap;
>     if (regnum == -1)
>       {
> @@ -620,7 +619,7 @@ ppc_collect_gregset (const struct regset *regset,
>   		     int regnum, void *gregs, size_t len)
>   {
>     struct gdbarch *gdbarch = regcache->arch ();
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     const struct ppc_reg_offsets *offsets
>       = (const struct ppc_reg_offsets *) regset->regmap;
>     size_t offset;
> @@ -671,14 +670,13 @@ ppc_collect_fpregset (const struct regset *regset,
>   		      int regnum, void *fpregs, size_t len)
>   {
>     struct gdbarch *gdbarch = regcache->arch ();
> -  struct gdbarch_tdep *tdep;
>     const struct ppc_reg_offsets *offsets;
>     size_t offset;
>   
>     if (!ppc_floating_point_unit_p (gdbarch))
>       return;
>   
> -  tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     offsets = (const struct ppc_reg_offsets *) regset->regmap;
>     if (regnum == -1)
>       {
> @@ -756,7 +754,7 @@ static int
>   rs6000_in_function_epilogue_frame_p (struct frame_info *curfrm,
>   				     struct gdbarch *gdbarch, CORE_ADDR pc)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>     bfd_byte insn_buf[PPC_INSN_SIZE];
>     CORE_ADDR scan_pc, func_start, func_end, epilogue_start, epilogue_end;
> @@ -1052,8 +1050,9 @@ ppc_displaced_step_fixup (struct gdbarch *gdbarch,
>         if (insn & 0x1)
>   	{
>   	  /* Link register needs to be set to the next instruction's PC.  */
> +	  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   	  regcache_cooked_write_unsigned (regs,
> -					  gdbarch_tdep (gdbarch)->ppc_lr_regnum,
> +					  tdep->ppc_lr_regnum,
>   					  from + PPC_INSN_SIZE);
>   	  displaced_debug_printf ("(ppc) adjusted LR to %s",
>   				  paddress (gdbarch, from + PPC_INSN_SIZE));
> @@ -1599,7 +1598,7 @@ skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc, CORE_ADDR lim_pc,
>     int num_skip_non_prologue_insns = 0;
>     int r0_contains_arg = 0;
>     const struct bfd_arch_info *arch_info = gdbarch_bfd_arch_info (gdbarch);
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>   
>     memset (fdata, 0, sizeof (struct rs6000_framedata));
> @@ -2319,7 +2318,7 @@ static CORE_ADDR
>   rs6000_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
>   {
>     struct gdbarch *gdbarch = get_frame_arch (frame);
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>     unsigned int ii, op;
>     int rel;
> @@ -2377,7 +2376,7 @@ rs6000_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
>   static struct type *
>   rs6000_builtin_type_vec64 (struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (!tdep->ppc_builtin_type_vec64)
>       {
> @@ -2422,7 +2421,7 @@ rs6000_builtin_type_vec64 (struct gdbarch *gdbarch)
>   static struct type *
>   rs6000_builtin_type_vec128 (struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (!tdep->ppc_builtin_type_vec128)
>       {
> @@ -2476,7 +2475,7 @@ rs6000_builtin_type_vec128 (struct gdbarch *gdbarch)
>   static const char *
>   rs6000_register_name (struct gdbarch *gdbarch, int regno)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* The upper half "registers" have names in the XML description,
>        but we present only the low GPRs and the full 64-bit registers
> @@ -2614,7 +2613,7 @@ rs6000_register_name (struct gdbarch *gdbarch, int regno)
>   static struct type *
>   rs6000_pseudo_register_type (struct gdbarch *gdbarch, int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* These are the e500 pseudo-registers.  */
>     if (IS_SPE_PSEUDOREG (tdep, regnum))
> @@ -2653,7 +2652,7 @@ static int
>   rs6000_pseudo_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
>   				   struct reggroup *group)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (IS_V_ALIAS_PSEUDOREG (tdep, regnum))
>       return 0;
> @@ -2668,7 +2667,7 @@ static int
>   rs6000_convert_register_p (struct gdbarch *gdbarch, int regnum,
>   			   struct type *type)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     return (tdep->ppc_fp0_regnum >= 0
>   	  && regnum >= tdep->ppc_fp0_regnum
> @@ -2753,7 +2752,7 @@ e500_move_ev_register (move_ev_register_func move,
>   		       struct regcache *regcache, int ev_reg, void *buffer)
>   {
>     struct gdbarch *arch = regcache->arch ();
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (arch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (arch);
>     int reg_index;
>     gdb_byte *byte_buffer = (gdb_byte *) buffer;
>     enum register_status status;
> @@ -2794,7 +2793,7 @@ e500_pseudo_register_read (struct gdbarch *gdbarch, readable_regcache *regcache,
>   			   int ev_reg, gdb_byte *buffer)
>   {
>     struct gdbarch *arch = regcache->arch ();
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (arch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int reg_index;
>     enum register_status status;
>   
> @@ -2835,7 +2834,7 @@ static enum register_status
>   dfp_pseudo_register_read (struct gdbarch *gdbarch, readable_regcache *regcache,
>   			   int reg_nr, gdb_byte *buffer)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int reg_index, fp0;
>     enum register_status status;
>   
> @@ -2875,7 +2874,7 @@ static void
>   dfp_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
>   			    int reg_nr, const gdb_byte *buffer)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int reg_index, fp0;
>   
>     if (IS_DFP_PSEUDOREG (tdep, reg_nr))
> @@ -2912,7 +2911,7 @@ v_alias_pseudo_register_read (struct gdbarch *gdbarch,
>   			      readable_regcache *regcache, int reg_nr,
>   			      gdb_byte *buffer)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     gdb_assert (IS_V_ALIAS_PSEUDOREG (tdep, reg_nr));
>   
>     return regcache->raw_read (tdep->ppc_vr0_regnum
> @@ -2927,7 +2926,7 @@ v_alias_pseudo_register_write (struct gdbarch *gdbarch,
>   			       struct regcache *regcache,
>   			       int reg_nr, const gdb_byte *buffer)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     gdb_assert (IS_V_ALIAS_PSEUDOREG (tdep, reg_nr));
>   
>     regcache->raw_write (tdep->ppc_vr0_regnum
> @@ -2939,7 +2938,7 @@ static enum register_status
>   vsx_pseudo_register_read (struct gdbarch *gdbarch, readable_regcache *regcache,
>   			   int reg_nr, gdb_byte *buffer)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int reg_index, vr0, fp0, vsr0_upper;
>     enum register_status status;
>   
> @@ -2987,7 +2986,7 @@ static void
>   vsx_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
>   			    int reg_nr, const gdb_byte *buffer)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int reg_index, vr0, fp0, vsr0_upper;
>   
>     if (IS_VSX_PSEUDOREG (tdep, reg_nr))
> @@ -3029,7 +3028,7 @@ static enum register_status
>   efp_pseudo_register_read (struct gdbarch *gdbarch, readable_regcache *regcache,
>   			   int reg_nr, gdb_byte *buffer)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int reg_index, vr0;
>   
>     if (IS_EFP_PSEUDOREG (tdep, reg_nr))
> @@ -3058,7 +3057,7 @@ static void
>   efp_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
>   			    int reg_nr, const gdb_byte *buffer)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int reg_index, vr0;
>     int offset = gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG ? 0 : 8;
>   
> @@ -3094,7 +3093,7 @@ rs6000_pseudo_register_read (struct gdbarch *gdbarch,
>   			     int reg_nr, gdb_byte *buffer)
>   {
>     struct gdbarch *regcache_arch = regcache->arch ();
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     gdb_assert (regcache_arch == gdbarch);
>   
> @@ -3125,7 +3124,7 @@ rs6000_pseudo_register_write (struct gdbarch *gdbarch,
>   			      int reg_nr, const gdb_byte *buffer)
>   {
>     struct gdbarch *regcache_arch = regcache->arch ();
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     gdb_assert (regcache_arch == gdbarch);
>   
> @@ -3156,7 +3155,7 @@ static void
>   dfp_ax_pseudo_register_collect (struct gdbarch *gdbarch,
>   				struct agent_expr *ax, int reg_nr)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int reg_index, fp0;
>   
>     if (IS_DFP_PSEUDOREG (tdep, reg_nr))
> @@ -3183,7 +3182,7 @@ static void
>   v_alias_pseudo_register_collect (struct gdbarch *gdbarch,
>   				 struct agent_expr *ax, int reg_nr)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     gdb_assert (IS_V_ALIAS_PSEUDOREG (tdep, reg_nr));
>   
>     ax_reg_mask (ax, tdep->ppc_vr0_regnum
> @@ -3197,7 +3196,7 @@ static void
>   vsx_ax_pseudo_register_collect (struct gdbarch *gdbarch,
>   				struct agent_expr *ax, int reg_nr)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int reg_index, vr0, fp0, vsr0_upper;
>   
>     if (IS_VSX_PSEUDOREG (tdep, reg_nr))
> @@ -3235,7 +3234,7 @@ static void
>   efp_ax_pseudo_register_collect (struct gdbarch *gdbarch,
>   				struct agent_expr *ax, int reg_nr)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int reg_index, vr0;
>   
>     if (IS_EFP_PSEUDOREG (tdep, reg_nr))
> @@ -3258,7 +3257,7 @@ static int
>   rs6000_ax_pseudo_register_collect (struct gdbarch *gdbarch,
>   				   struct agent_expr *ax, int reg_nr)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     if (IS_SPE_PSEUDOREG (tdep, reg_nr))
>       {
>         int reg_index = reg_nr - tdep->ppc_ev0_regnum;
> @@ -3298,7 +3297,7 @@ rs6000_gen_return_address (struct gdbarch *gdbarch,
>   			   struct agent_expr *ax, struct axs_value *value,
>   			   CORE_ADDR scope)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     value->type = register_type (gdbarch, tdep->ppc_lr_regnum);
>     value->kind = axs_lvalue_register;
>     value->u.reg = tdep->ppc_lr_regnum;
> @@ -3309,7 +3308,7 @@ rs6000_gen_return_address (struct gdbarch *gdbarch,
>   static int
>   rs6000_stab_reg_to_regnum (struct gdbarch *gdbarch, int num)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (0 <= num && num <= 31)
>       return tdep->ppc_gp0_regnum + num;
> @@ -3351,7 +3350,7 @@ rs6000_stab_reg_to_regnum (struct gdbarch *gdbarch, int num)
>   static int
>   rs6000_dwarf2_reg_to_regnum (struct gdbarch *gdbarch, int num)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (0 <= num && num <= 31)
>       return tdep->ppc_gp0_regnum + num;
> @@ -3570,7 +3569,7 @@ rs6000_frame_cache (struct frame_info *this_frame, void **this_cache)
>   {
>     struct rs6000_frame_cache *cache;
>     struct gdbarch *gdbarch = get_frame_arch (this_frame);
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>     struct rs6000_framedata fdata;
>     int wordsize = tdep->wordsize;
> @@ -3806,7 +3805,7 @@ rs6000_epilogue_frame_cache (struct frame_info *this_frame, void **this_cache)
>   {
>     struct rs6000_frame_cache *cache;
>     struct gdbarch *gdbarch = get_frame_arch (this_frame);
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (*this_cache)
>       return (struct rs6000_frame_cache *) *this_cache;
> @@ -3927,7 +3926,7 @@ ppc_dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum,
>   			    struct dwarf2_frame_state_reg *reg,
>   			    struct frame_info *this_frame)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* PPC32 and PPC64 ABI's are the same regarding volatile and
>        non-volatile registers.  We will use the same code for both.  */
> @@ -4139,7 +4138,7 @@ bfd_uses_spe_extensions (bfd *abfd)
>      Otherwise, it's just a VR register.  Record them accordingly.  */
>   
>   static int
> -ppc_record_vsr (struct regcache *regcache, struct gdbarch_tdep *tdep, int vsr)
> +ppc_record_vsr (struct regcache *regcache, ppc_gdbarch_tdep *tdep, int vsr)
>   {
>     if (vsr < 0 || vsr >= 64)
>       return -1;
> @@ -4168,7 +4167,7 @@ static int
>   ppc_process_record_op4 (struct gdbarch *gdbarch, struct regcache *regcache,
>   			CORE_ADDR addr, uint32_t insn)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int ext = PPC_FIELD (insn, 21, 11);
>     int vra = PPC_FIELD (insn, 11, 5);
>   
> @@ -4541,7 +4540,7 @@ static int
>   ppc_process_record_op19 (struct gdbarch *gdbarch, struct regcache *regcache,
>   			   CORE_ADDR addr, uint32_t insn)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int ext = PPC_EXTOP (insn);
>   
>     switch (ext & 0x01f)
> @@ -4593,7 +4592,7 @@ static int
>   ppc_process_record_op31 (struct gdbarch *gdbarch, struct regcache *regcache,
>   			   CORE_ADDR addr, uint32_t insn)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int ext = PPC_EXTOP (insn);
>     int tmp, nr, nb, i;
>     CORE_ADDR at_dcsz, ea = 0;
> @@ -5190,7 +5189,7 @@ static int
>   ppc_process_record_op59 (struct gdbarch *gdbarch, struct regcache *regcache,
>   			   CORE_ADDR addr, uint32_t insn)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int ext = PPC_EXTOP (insn);
>   
>     switch (ext & 0x1f)
> @@ -5284,7 +5283,7 @@ static int
>   ppc_process_record_op60 (struct gdbarch *gdbarch, struct regcache *regcache,
>   			   CORE_ADDR addr, uint32_t insn)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int ext = PPC_EXTOP (insn);
>   
>     switch (ext >> 2)
> @@ -5646,7 +5645,7 @@ static int
>   ppc_process_record_op61 (struct gdbarch *gdbarch, struct regcache *regcache,
>   			   CORE_ADDR addr, uint32_t insn)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     ULONGEST ea = 0;
>     int size;
>   
> @@ -5705,7 +5704,7 @@ static int
>   ppc_process_record_op63 (struct gdbarch *gdbarch, struct regcache *regcache,
>   			   CORE_ADDR addr, uint32_t insn)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int ext = PPC_EXTOP (insn);
>     int tmp;
>   
> @@ -5964,7 +5963,7 @@ int
>   ppc_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
>   		      CORE_ADDR addr)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>     uint32_t insn;
>     int op6, tmp, i;
> @@ -6267,7 +6266,6 @@ static struct gdbarch *
>   rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   {
>     struct gdbarch *gdbarch;
> -  struct gdbarch_tdep *tdep;
>     int wordsize, from_xcoff_exec, from_elf_exec;
>     enum bfd_architecture arch;
>     unsigned long mach;
> @@ -6953,7 +6951,8 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>         /* Word size in the various PowerPC bfd_arch_info structs isn't
>   	 meaningful, because 64-bit CPUs can run in 32-bit mode.  So, perform
>   	 separate word size check.  */
> -      tdep = gdbarch_tdep (arches->gdbarch);
> +      ppc_gdbarch_tdep *tdep
> +	= (ppc_gdbarch_tdep *) gdbarch_tdep (arches->gdbarch);
>         if (tdep && tdep->elf_abi != elf_abi)
>   	continue;
>         if (tdep && tdep->soft_float != soft_float)
> @@ -6974,7 +6973,7 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>          - "set arch"		trust blindly
>          - GDB startup		useless but harmless */
>   
> -  tdep = XCNEW (struct gdbarch_tdep);
> +  ppc_gdbarch_tdep *tdep = new ppc_gdbarch_tdep;
>     tdep->wordsize = wordsize;
>     tdep->elf_abi = elf_abi;
>     tdep->soft_float = soft_float;
> @@ -7253,7 +7252,7 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   static void
>   rs6000_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (tdep == NULL)
>       return;
> diff --git a/gdb/rx-tdep.c b/gdb/rx-tdep.c
> index 2d20aedf994..73e708b6462 100644
> --- a/gdb/rx-tdep.c
> +++ b/gdb/rx-tdep.c
> @@ -68,16 +68,16 @@ enum rx_frame_type {
>   };
>   
>   /* Architecture specific data.  */
> -struct gdbarch_tdep
> +struct rx_gdbarch_tdep : gdbarch_tdep
>   {
>     /* The ELF header flags specify the multilib used.  */
> -  int elf_flags;
> +  int elf_flags = 0;
>   
>     /* Type of PSW and BPSW.  */
> -  struct type *rx_psw_type;
> +  struct type *rx_psw_type = nullptr;
>   
>     /* Type of FPSW.  */
> -  struct type *rx_fpsw_type;
> +  struct type *rx_fpsw_type = nullptr;
>   };
>   
>   /* This structure holds the results of a prologue analysis.  */
> @@ -944,7 +944,6 @@ static struct gdbarch *
>   rx_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   {
>     struct gdbarch *gdbarch;
> -  struct gdbarch_tdep *tdep;
>     int elf_flags;
>     tdesc_arch_data_up tdesc_data;
>     const struct target_desc *tdesc = info.target_desc;
> @@ -963,7 +962,10 @@ rx_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>          arches != NULL;
>          arches = gdbarch_list_lookup_by_info (arches->next, &info))
>       {
> -      if (gdbarch_tdep (arches->gdbarch)->elf_flags != elf_flags)
> +      rx_gdbarch_tdep *tdep
> +	= (rx_gdbarch_tdep *) gdbarch_tdep (arches->gdbarch);
> +
> +      if (tdep->elf_flags != elf_flags)
>   	continue;
>   
>         return arches->gdbarch;
> @@ -994,7 +996,7 @@ rx_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   
>     gdb_assert(tdesc_data != NULL);
>   
> -  tdep = XCNEW (struct gdbarch_tdep);
> +  rx_gdbarch_tdep *tdep = new rx_gdbarch_tdep;
>     gdbarch = gdbarch_alloc (&info, tdep);
>     tdep->elf_flags = elf_flags;
>   
> diff --git a/gdb/s12z-tdep.c b/gdb/s12z-tdep.c
> index faf63c40305..ca4fe0a3c71 100644
> --- a/gdb/s12z-tdep.c
> +++ b/gdb/s12z-tdep.c
> @@ -482,7 +482,7 @@ constexpr gdb_byte s12z_break_insn[] = {0x00};
>   
>   typedef BP_MANIPULATION (s12z_break_insn) s12z_breakpoint;
>   
> -struct gdbarch_tdep
> +struct s12z_gdbarch_tdep : gdbarch_tdep
>   {
>   };
>   
> @@ -640,7 +640,7 @@ show_bdccsr_command (const char *args, int from_tty)
>   static struct gdbarch *
>   s12z_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   {
> -  struct gdbarch_tdep *tdep = XNEW (struct gdbarch_tdep);
> +  s12z_gdbarch_tdep *tdep = new s12z_gdbarch_tdep;
>     struct gdbarch *gdbarch = gdbarch_alloc (&info, tdep);
>   
>     add_cmd ("bdccsr", class_support, show_bdccsr_command,
> diff --git a/gdb/s390-linux-tdep.c b/gdb/s390-linux-tdep.c
> index 04e3fc640d2..3fa0b65f0b6 100644
> --- a/gdb/s390-linux-tdep.c
> +++ b/gdb/s390-linux-tdep.c
> @@ -79,7 +79,7 @@ static void
>   s390_write_pc (struct regcache *regcache, CORE_ADDR pc)
>   {
>     struct gdbarch *gdbarch = regcache->arch ();
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     regcache_cooked_write_unsigned (regcache, tdep->pc_regnum, pc);
>   
> @@ -269,7 +269,7 @@ s390_iterate_over_regset_sections (struct gdbarch *gdbarch,
>   				   void *cb_data,
>   				   const struct regcache *regcache)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     const int gregset_size = (tdep->abi == ABI_LINUX_S390 ?
>   			    s390_sizeof_gregset : s390x_sizeof_gregset);
>   
> @@ -390,7 +390,7 @@ s390_sigtramp_frame_unwind_cache (struct frame_info *this_frame,
>   				  void **this_prologue_cache)
>   {
>     struct gdbarch *gdbarch = get_frame_arch (this_frame);
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int word_size = gdbarch_ptr_bit (gdbarch) / 8;
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>     struct s390_sigtramp_unwind_cache *info;
> @@ -561,7 +561,7 @@ s390_linux_get_syscall_number (struct gdbarch *gdbarch,
>   			       thread_info *thread)
>   {
>     struct regcache *regs = get_thread_regcache (thread);
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>     ULONGEST pc;
>     ULONGEST svc_number = -1;
> @@ -594,7 +594,7 @@ static int
>   s390_all_but_pc_registers_record (struct regcache *regcache)
>   {
>     struct gdbarch *gdbarch = regcache->arch ();
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int i;
>   
>     for (i = 0; i < 16; i++)
> @@ -802,7 +802,7 @@ static int
>   s390_linux_syscall_record (struct regcache *regcache, LONGEST syscall_native)
>   {
>     struct gdbarch *gdbarch = regcache->arch ();
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int ret;
>     enum gdb_syscall syscall_gdb;
>   
> @@ -852,7 +852,7 @@ static int
>   s390_linux_record_signal (struct gdbarch *gdbarch, struct regcache *regcache,
>   			  enum gdb_signal signal)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     /* There are two kinds of signal frames on s390. rt_sigframe is always
>        the larger one, so don't even bother with sigframe.  */
>     const int sizeof_rt_sigframe = (tdep->abi == ABI_LINUX_ZSERIES ?
> @@ -1116,7 +1116,7 @@ s390_init_linux_record_tdep (struct linux_record_tdep *record_tdep,
>   static void
>   s390_linux_init_abi_any (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     tdep->s390_syscall_record = s390_linux_syscall_record;
>   
> @@ -1151,7 +1151,7 @@ s390_linux_init_abi_any (struct gdbarch_info info, struct gdbarch *gdbarch)
>   static void
>   s390_linux_init_abi_31 (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     tdep->abi = ABI_LINUX_S390;
>   
> @@ -1167,7 +1167,7 @@ s390_linux_init_abi_31 (struct gdbarch_info info, struct gdbarch *gdbarch)
>   static void
>   s390_linux_init_abi_64 (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     tdep->abi = ABI_LINUX_ZSERIES;
>   
> diff --git a/gdb/s390-tdep.c b/gdb/s390-tdep.c
> index 0a4a574787c..abbb094b11e 100644
> --- a/gdb/s390-tdep.c
> +++ b/gdb/s390-tdep.c
> @@ -1045,7 +1045,7 @@ s390_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
>   static int
>   s390_register_call_saved (struct gdbarch *gdbarch, int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     switch (tdep->abi)
>       {
> @@ -1076,7 +1076,7 @@ s390_guess_tracepoint_registers (struct gdbarch *gdbarch,
>   				 struct regcache *regcache,
>   				 CORE_ADDR addr)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int sz = register_size (gdbarch, S390_PSWA_REGNUM);
>     gdb_byte *reg = (gdb_byte *) alloca (sz);
>     ULONGEST pswm, pswa;
> @@ -1172,7 +1172,7 @@ enum { s390_dwarf_reg_r0l = ARRAY_SIZE (s390_dwarf_regmap) - 16 };
>   static int
>   s390_dwarf_reg_to_regnum (struct gdbarch *gdbarch, int reg)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int gdb_reg = -1;
>   
>     /* In a 32-on-64 debug scenario, debug info refers to the full
> @@ -1205,7 +1205,7 @@ s390_dwarf_reg_to_regnum (struct gdbarch *gdbarch, int reg)
>      These pseudo-registers are composed of two adjacent gprs.  */
>   
>   static int
> -regnum_is_gpr_full (struct gdbarch_tdep *tdep, int regnum)
> +regnum_is_gpr_full (s390_gdbarch_tdep *tdep, int regnum)
>   {
>     return (tdep->gpr_full_regnum != -1
>   	  && regnum >= tdep->gpr_full_regnum
> @@ -1216,7 +1216,7 @@ regnum_is_gpr_full (struct gdbarch_tdep *tdep, int regnum)
>      These pseudo-registers are composed of f0-f15 and v0l-v15l.  */
>   
>   static int
> -regnum_is_vxr_full (struct gdbarch_tdep *tdep, int regnum)
> +regnum_is_vxr_full (s390_gdbarch_tdep *tdep, int regnum)
>   {
>     return (tdep->v0_full_regnum != -1
>   	  && regnum >= tdep->v0_full_regnum
> @@ -1231,7 +1231,7 @@ static struct value *
>   s390_value_from_register (struct gdbarch *gdbarch, struct type *type,
>   			  int regnum, struct frame_id frame_id)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     struct value *value = default_value_from_register (gdbarch, type,
>   						     regnum, frame_id);
>     check_typedef (type);
> @@ -1250,7 +1250,7 @@ s390_value_from_register (struct gdbarch *gdbarch, struct type *type,
>   static const char *
>   s390_pseudo_register_name (struct gdbarch *gdbarch, int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (regnum == tdep->pc_regnum)
>       return "pc";
> @@ -1284,7 +1284,7 @@ s390_pseudo_register_name (struct gdbarch *gdbarch, int regnum)
>   static struct type *
>   s390_pseudo_register_type (struct gdbarch *gdbarch, int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (regnum == tdep->pc_regnum)
>       return builtin_type (gdbarch)->builtin_func_ptr;
> @@ -1308,7 +1308,7 @@ static enum register_status
>   s390_pseudo_register_read (struct gdbarch *gdbarch, readable_regcache *regcache,
>   			   int regnum, gdb_byte *buf)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>     int regsize = register_size (gdbarch, regnum);
>     ULONGEST val;
> @@ -1383,7 +1383,7 @@ static void
>   s390_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
>   			    int regnum, const gdb_byte *buf)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>     int regsize = register_size (gdbarch, regnum);
>     ULONGEST val, psw;
> @@ -1442,7 +1442,7 @@ static int
>   s390_pseudo_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
>   				 struct reggroup *group)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* We usually save/restore the whole PSW, which includes PC and CC.
>        However, some older gdbservers may not support saving/restoring
> @@ -1470,7 +1470,7 @@ static int
>   s390_ax_pseudo_register_collect (struct gdbarch *gdbarch,
>   				 struct agent_expr *ax, int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     if (regnum == tdep->pc_regnum)
>       {
>         ax_reg_mask (ax, S390_PSWA_REGNUM);
> @@ -1504,7 +1504,7 @@ static int
>   s390_ax_pseudo_register_push_stack (struct gdbarch *gdbarch,
>   				    struct agent_expr *ax, int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     if (regnum == tdep->pc_regnum)
>       {
>         ax_reg (ax, S390_PSWA_REGNUM);
> @@ -1746,7 +1746,7 @@ struct s390_arg_state
>   
>   static void
>   s390_handle_arg (struct s390_arg_state *as, struct value *arg,
> -		 struct gdbarch_tdep *tdep, int word_size,
> +		 s390_gdbarch_tdep *tdep, int word_size,
>   		 enum bfd_endian byte_order, int is_unnamed)
>   {
>     struct type *type = check_typedef (value_type (arg));
> @@ -1905,7 +1905,7 @@ s390_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);
> +  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int word_size = gdbarch_ptr_bit (gdbarch) / 8;
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>     int i;
> @@ -2083,11 +2083,14 @@ s390_return_value (struct gdbarch *gdbarch, struct value *function,
>         rvc = RETURN_VALUE_STRUCT_CONVENTION;
>         break;
>       case TYPE_CODE_ARRAY:
> -      rvc = (gdbarch_tdep (gdbarch)->vector_abi == S390_VECTOR_ABI_128
> -	     && TYPE_LENGTH (type) <= 16 && type->is_vector ())
> -	? RETURN_VALUE_REGISTER_CONVENTION
> -	: RETURN_VALUE_STRUCT_CONVENTION;
> -      break;
> +      {
> +	s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +	rvc = (tdep->vector_abi == S390_VECTOR_ABI_128
> +	       && TYPE_LENGTH (type) <= 16 && type->is_vector ())
> +	  ? RETURN_VALUE_REGISTER_CONVENTION
> +	  : RETURN_VALUE_STRUCT_CONVENTION;
> +	break;
> +      }
>       default:
>         rvc = TYPE_LENGTH (type) <= 8
>   	? RETURN_VALUE_REGISTER_CONVENTION
> @@ -2165,7 +2168,7 @@ s390_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
>   static CORE_ADDR
>   s390_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     ULONGEST pc;
>     pc = frame_unwind_register_unsigned (next_frame, tdep->pc_regnum);
>     return gdbarch_addr_bits_remove (gdbarch, pc);
> @@ -2187,7 +2190,7 @@ static struct value *
>   s390_unwind_pseudo_register (struct frame_info *this_frame, int regnum)
>   {
>     struct gdbarch *gdbarch = get_frame_arch (this_frame);
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     struct type *type = register_type (gdbarch, regnum);
>   
>     /* Unwind PC via PSW address.  */
> @@ -2772,7 +2775,7 @@ static CORE_ADDR
>   s390_record_address_mask (struct gdbarch *gdbarch, struct regcache *regcache,
>   			  CORE_ADDR val)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     ULONGEST pswm, pswa;
>     int am;
>     if (tdep->abi == ABI_LINUX_S390)
> @@ -2839,7 +2842,7 @@ s390_record_calc_disp_vsce (struct gdbarch *gdbarch, struct regcache *regcache,
>   			    uint8_t vx, uint8_t el, uint8_t es, uint16_t bd,
>   			    int8_t dh, CORE_ADDR *res)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>     ULONGEST x;
>     gdb_byte buf[16];
> @@ -2882,7 +2885,7 @@ static int s390_popcnt (unsigned int x) {
>   static int
>   s390_record_gpr_g (struct gdbarch *gdbarch, struct regcache *regcache, int i)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + i))
>       return -1;
>     if (tdep->abi == ABI_LINUX_S390)
> @@ -2896,7 +2899,7 @@ s390_record_gpr_g (struct gdbarch *gdbarch, struct regcache *regcache, int i)
>   static int
>   s390_record_gpr_h (struct gdbarch *gdbarch, struct regcache *regcache, int i)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     if (tdep->abi == ABI_LINUX_S390)
>       {
>         if (record_full_arch_list_add_reg (regcache, S390_R0_UPPER_REGNUM + i))
> @@ -2936,7 +2939,7 @@ static int
>   s390_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
>   		     CORE_ADDR addr)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  s390_gdbarch_tdep *tdep = (s390_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     uint16_t insn[3] = {0};
>     /* Instruction as bytes.  */
>     uint8_t ibyte[6];
> @@ -6831,7 +6834,7 @@ while (0)
>      tdesc.  */
>   
>   static bool
> -s390_tdesc_valid (struct gdbarch_tdep *tdep,
> +s390_tdesc_valid (s390_gdbarch_tdep *tdep,
>   		  struct tdesc_arch_data *tdesc_data)
>   {
>     static const char *const psw[] = {
> @@ -6983,10 +6986,10 @@ s390_tdesc_valid (struct gdbarch_tdep *tdep,
>   /* Allocate and initialize new gdbarch_tdep.  Caller is responsible to free
>      memory after use.  */
>   
> -static struct gdbarch_tdep *
> +static s390_gdbarch_tdep *
>   s390_gdbarch_tdep_alloc ()
>   {
> -  struct gdbarch_tdep *tdep = XCNEW (struct gdbarch_tdep);
> +  s390_gdbarch_tdep *tdep = new s390_gdbarch_tdep;
>   
>     tdep->tdesc = NULL;
>   
> @@ -7023,7 +7026,7 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>     static const char *const stap_register_indirection_suffixes[] = { ")",
>   								    NULL };
>   
> -  struct gdbarch_tdep *tdep = s390_gdbarch_tdep_alloc ();
> +  s390_gdbarch_tdep *tdep = s390_gdbarch_tdep_alloc ();
>     struct gdbarch *gdbarch = gdbarch_alloc (&info, tdep);
>     tdesc_arch_data_up tdesc_data = tdesc_data_alloc ();
>     info.tdesc_data = tdesc_data.get ();
> @@ -7153,7 +7156,7 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>     /* Check any target description for validity.  */
>     if (!s390_tdesc_valid (tdep, tdesc_data.get ()))
>       {
> -      xfree (tdep);
> +      delete tdep;
>         gdbarch_free (gdbarch);
>         return NULL;
>       }
> @@ -7174,16 +7177,19 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>          arches != NULL;
>          arches = gdbarch_list_lookup_by_info (arches->next, &info))
>       {
> -      struct gdbarch_tdep *tmp = gdbarch_tdep (arches->gdbarch);
> +      s390_gdbarch_tdep *tmp
> +	= (s390_gdbarch_tdep *) gdbarch_tdep (arches->gdbarch);
> +
>         if (!tmp)
>   	continue;
> +
>         /* A program can 'choose' not to use the vector registers when they
>   	 are present.  Leading to the same tdesc but different tdep and
>   	 thereby a different gdbarch.  */
>         if (tmp->vector_abi != tdep->vector_abi)
>   	continue;
>   
> -      xfree (tdep);
> +      delete tdep;
>         gdbarch_free (gdbarch);
>         return arches->gdbarch;
>       }
> diff --git a/gdb/s390-tdep.h b/gdb/s390-tdep.h
> index 8c9d75a81fe..191977ecf50 100644
> --- a/gdb/s390-tdep.h
> +++ b/gdb/s390-tdep.h
> @@ -37,32 +37,33 @@ enum s390_vector_abi_kind
>   
>   /* The tdep structure.  */
>   
> -struct gdbarch_tdep
> +struct s390_gdbarch_tdep : gdbarch_tdep
>   {
>     /* Target description.  */
> -  const struct target_desc *tdesc;
> +  const struct target_desc *tdesc = nullptr;
>   
>     /* ABI version.  */
> -  enum s390_abi_kind abi;
> +  enum s390_abi_kind abi {};
>   
>     /* Vector ABI.  */
> -  enum s390_vector_abi_kind vector_abi;
> +  enum s390_vector_abi_kind vector_abi {};
>   
>     /* Pseudo register numbers.  */
> -  int gpr_full_regnum;
> -  int pc_regnum;
> -  int cc_regnum;
> -  int v0_full_regnum;
> -
> -  bool have_upper;
> -  bool have_linux_v1;
> -  bool have_linux_v2;
> -  bool have_tdb;
> -  bool have_vx;
> -  bool have_gs;
> +  int gpr_full_regnum = 0;
> +  int pc_regnum = 0;
> +  int cc_regnum = 0;
> +  int v0_full_regnum = 0;
> +
> +  bool have_upper = 0;
> +  bool have_linux_v1 = 0;
> +  bool have_linux_v2 = 0;
> +  bool have_tdb = 0;
> +  bool have_vx = 0;
> +  bool have_gs = 0;
>   
>     /* Hook to record OS specific systemcall.  */
> -  int (*s390_syscall_record) (struct regcache *regcache, LONGEST svc_number);
> +  int (*s390_syscall_record) (struct regcache *regcache, LONGEST svc_number)
> +    = nullptr;
>   };
>   
>   /* Decoding S/390 instructions.  */
> diff --git a/gdb/sh-linux-tdep.c b/gdb/sh-linux-tdep.c
> index 8315d46fddf..9d4bebb11aa 100644
> --- a/gdb/sh-linux-tdep.c
> +++ b/gdb/sh-linux-tdep.c
> @@ -195,7 +195,7 @@ sh_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>     set_gdbarch_fetch_tls_load_module_address (gdbarch,
>   					     svr4_fetch_objfile_link_map);
>   
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  sh_gdbarch_tdep *tdep = (sh_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* Remember regset characteristics.  The sizes should match
>        elf_gregset_t and elf_fpregset_t from Linux.  */
> diff --git a/gdb/sh-netbsd-tdep.c b/gdb/sh-netbsd-tdep.c
> index 0401eeef306..ddb2c7e1ea8 100644
> --- a/gdb/sh-netbsd-tdep.c
> +++ b/gdb/sh-netbsd-tdep.c
> @@ -63,7 +63,7 @@ static void
>   shnbsd_init_abi (struct gdbarch_info info,
>   		  struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  sh_gdbarch_tdep *tdep = (sh_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     nbsd_init_abi (info, gdbarch);
>   
>     tdep->core_gregmap = (struct sh_corefile_regmap *)regmap;
> diff --git a/gdb/sh-tdep.c b/gdb/sh-tdep.c
> index f78eb2d73be..4346e78c5e9 100644
> --- a/gdb/sh-tdep.c
> +++ b/gdb/sh-tdep.c
> @@ -1554,7 +1554,7 @@ sh_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
>   static struct type *
>   sh_littlebyte_bigword_type (struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  sh_gdbarch_tdep *tdep = (sh_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (tdep->sh_littlebyte_bigword_type == NULL)
>       tdep->sh_littlebyte_bigword_type
> @@ -2146,7 +2146,7 @@ sh_corefile_supply_regset (const struct regset *regset,
>   			   int regnum, const void *regs, size_t len)
>   {
>     struct gdbarch *gdbarch = regcache->arch ();
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  sh_gdbarch_tdep *tdep = (sh_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     const struct sh_corefile_regmap *regmap = (regset == &sh_corefile_gregset
>   					     ? tdep->core_gregmap
>   					     : tdep->core_fpregmap);
> @@ -2172,7 +2172,7 @@ sh_corefile_collect_regset (const struct regset *regset,
>   			    int regnum, void *regs, size_t len)
>   {
>     struct gdbarch *gdbarch = regcache->arch ();
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  sh_gdbarch_tdep *tdep = (sh_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     const struct sh_corefile_regmap *regmap = (regset == &sh_corefile_gregset
>   					     ? tdep->core_gregmap
>   					     : tdep->core_fpregmap);
> @@ -2210,7 +2210,7 @@ sh_iterate_over_regset_sections (struct gdbarch *gdbarch,
>   				 void *cb_data,
>   				 const struct regcache *regcache)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  sh_gdbarch_tdep *tdep = (sh_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (tdep->core_gregmap != NULL)
>       cb (".reg", tdep->sizeof_gregset, tdep->sizeof_gregset,
> @@ -2237,7 +2237,6 @@ static struct gdbarch *
>   sh_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   {
>     struct gdbarch *gdbarch;
> -  struct gdbarch_tdep *tdep;
>   
>     /* If there is already a candidate, use it.  */
>     arches = gdbarch_list_lookup_by_info (arches, &info);
> @@ -2246,7 +2245,7 @@ sh_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   
>     /* None found, create a new architecture from the information
>        provided.  */
> -  tdep = XCNEW (struct gdbarch_tdep);
> +  sh_gdbarch_tdep *tdep = new sh_gdbarch_tdep;
>     gdbarch = gdbarch_alloc (&info, tdep);
>   
>     set_gdbarch_short_bit (gdbarch, 2 * TARGET_CHAR_BIT);
> diff --git a/gdb/sh-tdep.h b/gdb/sh-tdep.h
> index 737b6dc6bdc..fce3f715f67 100644
> --- a/gdb/sh-tdep.h
> +++ b/gdb/sh-tdep.h
> @@ -19,6 +19,8 @@
>   #ifndef SH_TDEP_H
>   #define SH_TDEP_H
>   
> +#include "gdbarch.h"
> +
>   /* Contributed by Steve Chamberlain sac@cygnus.com.  */
>   
>   /* Registers for all SH variants.  Used also by sh3-rom.c.  */
> @@ -89,20 +91,20 @@ struct sh_corefile_regmap
>     unsigned int offset;
>   };
>   
> -struct gdbarch_tdep
> +struct sh_gdbarch_tdep : gdbarch_tdep
>   {
>     /* Non-NULL when debugging from a core file.  Provides the offset
>        where each general-purpose register is stored inside the associated
>        core file section.  */
> -  struct sh_corefile_regmap *core_gregmap;
> -  int sizeof_gregset;
> +  struct sh_corefile_regmap *core_gregmap = nullptr;
> +  int sizeof_gregset = 0;
>     /* Non-NULL when debugging from a core file and when FP registers are
>        available.  Provides the offset where each FP register is stored
>        inside the associated core file section.  */
> -  struct sh_corefile_regmap *core_fpregmap;
> -  int sizeof_fpregset;
> +  struct sh_corefile_regmap *core_fpregmap = nullptr;
> +  int sizeof_fpregset = 0;
>     /* ISA-specific data types.  */
> -  struct type *sh_littlebyte_bigword_type;
> +  struct type *sh_littlebyte_bigword_type = nullptr;
>   };
>   
>   extern const struct regset sh_corefile_gregset;
> diff --git a/gdb/sparc-linux-tdep.c b/gdb/sparc-linux-tdep.c
> index 4ad77e24d82..9c46919e72b 100644
> --- a/gdb/sparc-linux-tdep.c
> +++ b/gdb/sparc-linux-tdep.c
> @@ -253,7 +253,8 @@ sparc32_linux_collect_core_fpregset (const struct regset *regset,
>   static void
>   sparc_linux_write_pc (struct regcache *regcache, CORE_ADDR pc)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (regcache->arch ());
> +  gdbarch *arch = regcache->arch ();
> +  sparc_gdbarch_tdep *tdep = (sparc_gdbarch_tdep *) gdbarch_tdep (arch);
>     ULONGEST psr;
>   
>     regcache_cooked_write_unsigned (regcache, tdep->pc_regnum, pc);
> @@ -420,7 +421,7 @@ static const struct regset sparc32_linux_fpregset =
>   static void
>   sparc32_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  sparc_gdbarch_tdep *tdep = (sparc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     linux_init_abi (info, gdbarch, 0);
>   
> diff --git a/gdb/sparc-netbsd-tdep.c b/gdb/sparc-netbsd-tdep.c
> index e34405c849e..e600447ab99 100644
> --- a/gdb/sparc-netbsd-tdep.c
> +++ b/gdb/sparc-netbsd-tdep.c
> @@ -295,7 +295,7 @@ static const struct regset sparc32nbsd_fpregset =
>   void
>   sparc32nbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  sparc_gdbarch_tdep *tdep = (sparc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     nbsd_init_abi (info, gdbarch);
>   
> diff --git a/gdb/sparc-sol2-tdep.c b/gdb/sparc-sol2-tdep.c
> index f2144493738..94e8a121a4c 100644
> --- a/gdb/sparc-sol2-tdep.c
> +++ b/gdb/sparc-sol2-tdep.c
> @@ -196,7 +196,7 @@ static const struct frame_unwind sparc32_sol2_sigtramp_frame_unwind =
>   static void
>   sparc32_sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  sparc_gdbarch_tdep *tdep = (sparc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     tdep->gregset = &sparc32_sol2_gregset;
>     tdep->sizeof_gregset = 152;
> diff --git a/gdb/sparc-tdep.c b/gdb/sparc-tdep.c
> index 7302929c9b7..31916b60ddb 100644
> --- a/gdb/sparc-tdep.c
> +++ b/gdb/sparc-tdep.c
> @@ -429,7 +429,7 @@ sparc32_register_name (struct gdbarch *gdbarch, int regnum)
>   static struct type *
>   sparc_psr_type (struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  sparc_gdbarch_tdep *tdep = (sparc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (!tdep->sparc_psr_type)
>       {
> @@ -451,7 +451,7 @@ sparc_psr_type (struct gdbarch *gdbarch)
>   static struct type *
>   sparc_fsr_type (struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  sparc_gdbarch_tdep *tdep = (sparc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (!tdep->sparc_fsr_type)
>       {
> @@ -992,7 +992,7 @@ CORE_ADDR
>   sparc_analyze_prologue (struct gdbarch *gdbarch, CORE_ADDR pc,
>   			CORE_ADDR current_pc, struct sparc_frame_cache *cache)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  sparc_gdbarch_tdep *tdep = (sparc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     unsigned long insn;
>     int offset = 0;
>     int dest = -1;
> @@ -1684,8 +1684,9 @@ sparc_analyze_control_transfer (struct regcache *regcache,
>         struct frame_info *frame = get_current_frame ();
>   
>         /* Trap instruction (TRAP).  */
> -      return gdbarch_tdep (regcache->arch ())->step_trap (frame,
> -								     insn);
> +      gdbarch *arch = regcache->arch ();
> +      sparc_gdbarch_tdep *tdep = (sparc_gdbarch_tdep *) gdbarch_tdep (arch);
> +      return tdep->step_trap (frame, insn);
>       }
>   
>     /* FIXME: Handle DONE and RETRY instructions.  */
> @@ -1735,7 +1736,7 @@ static std::vector<CORE_ADDR>
>   sparc_software_single_step (struct regcache *regcache)
>   {
>     struct gdbarch *arch = regcache->arch ();
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (arch);
> +  sparc_gdbarch_tdep *tdep = (sparc_gdbarch_tdep *) gdbarch_tdep (arch);
>     CORE_ADDR npc, nnpc;
>   
>     CORE_ADDR pc, orig_npc;
> @@ -1764,7 +1765,8 @@ sparc_software_single_step (struct regcache *regcache)
>   static void
>   sparc_write_pc (struct regcache *regcache, CORE_ADDR pc)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (regcache->arch ());
> +  gdbarch *arch = regcache->arch ();
> +  sparc_gdbarch_tdep *tdep = (sparc_gdbarch_tdep *) gdbarch_tdep (arch);
>   
>     regcache_cooked_write_unsigned (regcache, tdep->pc_regnum, pc);
>     regcache_cooked_write_unsigned (regcache, tdep->npc_regnum, pc + 4);
> @@ -1779,7 +1781,7 @@ sparc_iterate_over_regset_sections (struct gdbarch *gdbarch,
>   				    void *cb_data,
>   				    const struct regcache *regcache)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  sparc_gdbarch_tdep *tdep = (sparc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     cb (".reg", tdep->sizeof_gregset, tdep->sizeof_gregset, tdep->gregset, NULL,
>         cb_data);
> @@ -1814,7 +1816,6 @@ validate_tdesc_registers (const struct target_desc *tdesc,
>   static struct gdbarch *
>   sparc32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   {
> -  struct gdbarch_tdep *tdep;
>     const struct target_desc *tdesc = info.target_desc;
>     struct gdbarch *gdbarch;
>     int valid_p = 1;
> @@ -1825,7 +1826,7 @@ sparc32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>       return arches->gdbarch;
>   
>     /* Allocate space for the new architecture.  */
> -  tdep = XCNEW (struct gdbarch_tdep);
> +  sparc_gdbarch_tdep *tdep = new sparc_gdbarch_tdep;
>     gdbarch = gdbarch_alloc (&info, tdep);
>   
>     tdep->pc_regnum = SPARC32_PC_REGNUM;
> diff --git a/gdb/sparc-tdep.h b/gdb/sparc-tdep.h
> index c0cfd09a6de..ceedb2cb595 100644
> --- a/gdb/sparc-tdep.h
> +++ b/gdb/sparc-tdep.h
> @@ -20,6 +20,8 @@
>   #ifndef SPARC_TDEP_H
>   #define SPARC_TDEP_H 1
>   
> +#include "gdbarch.h"
> +
>   #define SPARC_CORE_REGISTERS                      \
>     "g0", "g1", "g2", "g3", "g4", "g5", "g6", "g7", \
>     "o0", "o1", "o2", "o3", "o4", "o5", "sp", "o7", \
> @@ -55,43 +57,44 @@ struct sparc_fpregmap
>   
>   /* SPARC architecture-specific information.  */
>   
> -struct gdbarch_tdep
> +struct sparc_gdbarch_tdep : gdbarch_tdep
>   {
>     /* Register numbers for the PN and nPC registers.  The definitions
>        for (64-bit) UltraSPARC differ from the (32-bit) SPARC
>        definitions.  */
> -  int pc_regnum;
> -  int npc_regnum;
> +  int pc_regnum = 0;
> +  int npc_regnum = 0;
>   
>     /* Register names specific for architecture (sparc32 vs. sparc64) */
> -  const char * const *fpu_register_names;
> -  size_t fpu_registers_num;
> -  const char * const *cp0_register_names;
> -  size_t cp0_registers_num;
> +  const char * const *fpu_register_names = nullptr;
> +  size_t fpu_registers_num = 0;
> +  const char * const *cp0_register_names = nullptr;
> +  size_t cp0_registers_num = 0;
>   
>     /* Register sets.  */
> -  const struct regset *gregset;
> -  size_t sizeof_gregset;
> -  const struct regset *fpregset;
> -  size_t sizeof_fpregset;
> +  const struct regset *gregset = nullptr;
> +  size_t sizeof_gregset = 0;
> +  const struct regset *fpregset = nullptr;
> +  size_t sizeof_fpregset = 0;
>   
>     /* Offset of saved PC in jmp_buf.  */
> -  int jb_pc_offset;
> +  int jb_pc_offset = 0;
>   
>     /* Size of an Procedure Linkage Table (PLT) entry, 0 if we shouldn't
>        treat the PLT special when doing prologue analysis.  */
> -  size_t plt_entry_size;
> +  size_t plt_entry_size = 0;
>   
>     /* Alternative location for trap return.  Used for single-stepping.  */
> -  CORE_ADDR (*step_trap) (struct frame_info *frame, unsigned long insn);
> +  CORE_ADDR (*step_trap) (struct frame_info *frame, unsigned long insn)
> +    = nullptr;
>   
>     /* ISA-specific data types.  */
> -  struct type *sparc_psr_type;
> -  struct type *sparc_fsr_type;
> -  struct type *sparc64_ccr_type;
> -  struct type *sparc64_pstate_type;
> -  struct type *sparc64_fsr_type;
> -  struct type *sparc64_fprs_type;
> +  struct type *sparc_psr_type = nullptr;
> +  struct type *sparc_fsr_type = nullptr;
> +  struct type *sparc64_ccr_type = nullptr;
> +  struct type *sparc64_pstate_type = nullptr;
> +  struct type *sparc64_fsr_type = nullptr;
> +  struct type *sparc64_fprs_type = nullptr;
>   };
>   
>   /* Register numbers of various important registers.  */
> diff --git a/gdb/sparc64-fbsd-tdep.c b/gdb/sparc64-fbsd-tdep.c
> index 6dad813c356..d52162a55a9 100644
> --- a/gdb/sparc64-fbsd-tdep.c
> +++ b/gdb/sparc64-fbsd-tdep.c
> @@ -222,7 +222,7 @@ static const struct regset sparc64fbsd_fpregset =
>   static void
>   sparc64fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  sparc_gdbarch_tdep *tdep = (sparc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* Generic FreeBSD support. */
>     fbsd_init_abi (info, gdbarch);
> diff --git a/gdb/sparc64-linux-tdep.c b/gdb/sparc64-linux-tdep.c
> index e63fa87c69b..5b9cc904656 100644
> --- a/gdb/sparc64-linux-tdep.c
> +++ b/gdb/sparc64-linux-tdep.c
> @@ -261,7 +261,8 @@ sparc64_linux_collect_core_fpregset (const struct regset *regset,
>   static void
>   sparc64_linux_write_pc (struct regcache *regcache, CORE_ADDR pc)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (regcache->arch ());
> +  gdbarch *arch = regcache->arch ();
> +  sparc_gdbarch_tdep *tdep = (sparc_gdbarch_tdep *) gdbarch_tdep (arch);
>     ULONGEST state;
>   
>     regcache_cooked_write_unsigned (regcache, tdep->pc_regnum, pc);
> @@ -363,7 +364,7 @@ static const struct regset sparc64_linux_fpregset =
>   static void
>   sparc64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  sparc_gdbarch_tdep *tdep = (sparc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     linux_init_abi (info, gdbarch, 0);
>   
> diff --git a/gdb/sparc64-netbsd-tdep.c b/gdb/sparc64-netbsd-tdep.c
> index 0438093563e..81e37631d15 100644
> --- a/gdb/sparc64-netbsd-tdep.c
> +++ b/gdb/sparc64-netbsd-tdep.c
> @@ -248,7 +248,7 @@ static const struct regset sparc64nbsd_fpregset =
>   static void
>   sparc64nbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  sparc_gdbarch_tdep *tdep = (sparc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     nbsd_init_abi (info, gdbarch);
>   
> diff --git a/gdb/sparc64-obsd-tdep.c b/gdb/sparc64-obsd-tdep.c
> index 033779e273d..0931b23b92c 100644
> --- a/gdb/sparc64-obsd-tdep.c
> +++ b/gdb/sparc64-obsd-tdep.c
> @@ -423,7 +423,7 @@ static const struct regset sparc64obsd_fpregset =
>   static void
>   sparc64obsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  sparc_gdbarch_tdep *tdep = (sparc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     tdep->gregset = &sparc64obsd_gregset;
>     tdep->sizeof_gregset = 288;
> diff --git a/gdb/sparc64-sol2-tdep.c b/gdb/sparc64-sol2-tdep.c
> index 6aea8bd56d7..6c1fe192cb6 100644
> --- a/gdb/sparc64-sol2-tdep.c
> +++ b/gdb/sparc64-sol2-tdep.c
> @@ -199,7 +199,7 @@ static const struct frame_unwind sparc64_sol2_sigtramp_frame_unwind =
>   static void
>   sparc64_sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  sparc_gdbarch_tdep *tdep = (sparc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     tdep->gregset = &sparc64_sol2_gregset;
>     tdep->sizeof_gregset = 304;
> diff --git a/gdb/sparc64-tdep.c b/gdb/sparc64-tdep.c
> index c0d31599570..cb698304d62 100644
> --- a/gdb/sparc64-tdep.c
> +++ b/gdb/sparc64-tdep.c
> @@ -648,7 +648,7 @@ sparc64_structure_or_union_p (const struct type *type)
>   static struct type *
>   sparc64_pstate_type (struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  sparc_gdbarch_tdep *tdep = (sparc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (!tdep->sparc64_pstate_type)
>       {
> @@ -675,7 +675,7 @@ sparc64_pstate_type (struct gdbarch *gdbarch)
>   static struct type *
>   sparc64_ccr_type (struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  sparc_gdbarch_tdep *tdep = (sparc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (tdep->sparc64_ccr_type == NULL)
>       {
> @@ -700,7 +700,7 @@ sparc64_ccr_type (struct gdbarch *gdbarch)
>   static struct type *
>   sparc64_fsr_type (struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  sparc_gdbarch_tdep *tdep = (sparc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (!tdep->sparc64_fsr_type)
>       {
> @@ -733,7 +733,7 @@ sparc64_fsr_type (struct gdbarch *gdbarch)
>   static struct type *
>   sparc64_fprs_type (struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  sparc_gdbarch_tdep *tdep = (sparc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (!tdep->sparc64_fprs_type)
>       {
> @@ -1806,7 +1806,7 @@ sparc64_addr_bits_remove (struct gdbarch *gdbarch, CORE_ADDR addr)
>   void
>   sparc64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  sparc_gdbarch_tdep *tdep = (sparc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     tdep->pc_regnum = SPARC64_PC_REGNUM;
>     tdep->npc_regnum = SPARC64_NPC_REGNUM;
> diff --git a/gdb/tic6x-linux-tdep.c b/gdb/tic6x-linux-tdep.c
> index 4e165ec139d..ff5fec81375 100644
> --- a/gdb/tic6x-linux-tdep.c
> +++ b/gdb/tic6x-linux-tdep.c
> @@ -45,7 +45,7 @@ static const gdb_byte tic6x_bkpt_bnop_le[] = { 0x22, 0xa1, 0x00, 0x00 };
>   static unsigned int
>   tic6x_register_sigcontext_offset (unsigned int regnum, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  tic6x_gdbarch_tdep *tdep = (tic6x_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (regnum == TIC6X_A4_REGNUM || regnum == TIC6X_A4_REGNUM + 2
>         || regnum == TIC6X_A4_REGNUM + 4)
> @@ -92,7 +92,7 @@ tic6x_linux_rt_sigreturn_init (const struct tramp_frame *self,
>   		    + TIC6X_SIGINFO_SIZE
>   		    + 4 + 4 /* uc_flags and *uc_link in struct ucontext.  */
>   		    + TIC6X_STACK_T_SIZE);
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  tic6x_gdbarch_tdep *tdep = (tic6x_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     unsigned int reg_offset;
>     unsigned int i;
>   
> @@ -165,7 +165,7 @@ extern struct target_so_ops dsbt_so_ops;
>   static void
>   tic6x_uclinux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  tic6x_gdbarch_tdep *tdep = (tic6x_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     linux_init_abi (info, gdbarch, 0);
>   
> diff --git a/gdb/tic6x-tdep.c b/gdb/tic6x-tdep.c
> index afa034c9942..7b1d83bd637 100644
> --- a/gdb/tic6x-tdep.c
> +++ b/gdb/tic6x-tdep.c
> @@ -325,7 +325,7 @@ tic6x_breakpoint_kind_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr)
>   static const gdb_byte *
>   tic6x_sw_breakpoint_from_kind (struct gdbarch *gdbarch, int kind, int *size)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  tic6x_gdbarch_tdep *tdep = (tic6x_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     *size = kind;
>   
> @@ -598,7 +598,8 @@ tic6x_get_next_pc (struct regcache *regcache, CORE_ADDR pc)
>   
>         if (inst == TIC6X_INST_SWE)
>   	{
> -	  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +	  tic6x_gdbarch_tdep *tdep
> +	    = (tic6x_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>   	  if (tdep->syscall_next_pc != NULL)
>   	    return tdep->syscall_next_pc (get_current_frame ());
> @@ -1141,7 +1142,6 @@ static struct gdbarch *
>   tic6x_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   {
>     struct gdbarch *gdbarch;
> -  struct gdbarch_tdep *tdep;
>     tdesc_arch_data_up tdesc_data;
>     const struct target_desc *tdesc = info.target_desc;
>     int has_gp = 0;
> @@ -1216,7 +1216,8 @@ tic6x_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>          arches != NULL;
>          arches = gdbarch_list_lookup_by_info (arches->next, &info))
>       {
> -      tdep = gdbarch_tdep (arches->gdbarch);
> +      tic6x_gdbarch_tdep *tdep
> +	= (tic6x_gdbarch_tdep *) gdbarch_tdep (arches->gdbarch);
>   
>         if (has_gp != tdep->has_gp)
>   	continue;
> @@ -1225,7 +1226,7 @@ tic6x_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   	return arches->gdbarch;
>       }
>   
> -  tdep = XCNEW (struct gdbarch_tdep);
> +  tic6x_gdbarch_tdep *tdep = new tic6x_gdbarch_tdep;
>   
>     tdep->has_gp = has_gp;
>     gdbarch = gdbarch_alloc (&info, tdep);
> diff --git a/gdb/tic6x-tdep.h b/gdb/tic6x-tdep.h
> index 7d5587ab525..bb79a0dd95d 100644
> --- a/gdb/tic6x-tdep.h
> +++ b/gdb/tic6x-tdep.h
> @@ -20,6 +20,8 @@
>   #ifndef TIC6X_TDEP_H
>   #define TIC6X_TDEP_H
>   
> +#include "gdbarch.h"
> +
>   enum
>   {
>     TIC6X_A4_REGNUM = 4,
> @@ -44,15 +46,15 @@ extern const gdb_byte tic6x_bkpt_illegal_opcode_be[];
>   extern const gdb_byte tic6x_bkpt_illegal_opcode_le[];
>   
>   /* Target-dependent structure in gdbarch.  */
> -struct gdbarch_tdep
> +struct tic6x_gdbarch_tdep : gdbarch_tdep
>   {
>     /* Return the expected next PC if FRAME is stopped at a syscall
>        instruction.  */
> -  CORE_ADDR (*syscall_next_pc) (struct frame_info *frame);
> +  CORE_ADDR (*syscall_next_pc) (struct frame_info *frame) = nullptr;
>   
> -  const gdb_byte *breakpoint; /* Breakpoint instruction.  */
> +  const gdb_byte *breakpoint = nullptr; /* Breakpoint instruction.  */
>   
> -  int has_gp; /* Has general purpose registers A16 - A31 and B16 - B31.  */
> +  int has_gp = 0; /* Has general purpose registers A16 - A31 and B16 - B31.  */
>   };
>   
>   #endif /* TIC6X_TDEP_H */
> diff --git a/gdb/v850-tdep.c b/gdb/v850-tdep.c
> index f829f4db2dd..70f6d42a95b 100644
> --- a/gdb/v850-tdep.c
> +++ b/gdb/v850-tdep.c
> @@ -264,15 +264,15 @@ enum v850_abi
>   
>   /* Architecture specific data.  */
>   
> -struct gdbarch_tdep
> +struct v850_gdbarch_tdep : gdbarch_tdep
>   {
>     /* Fields from the ELF header.  */
> -  int e_flags;
> -  int e_machine;
> +  int e_flags = 0;
> +  int e_machine = 0;
>   
>     /* Which ABI are we using?  */
> -  enum v850_abi abi;
> -  int eight_byte_align;
> +  enum v850_abi abi {};
> +  int eight_byte_align = 0;
>   };
>   
>   struct v850_frame_cache
> @@ -510,8 +510,9 @@ v850_use_struct_convention (struct gdbarch *gdbarch, struct type *type)
>   {
>     int i;
>     struct type *fld_type, *tgt_type;
> +  v850_gdbarch_tdep *tdep = (v850_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
> -  if (gdbarch_tdep (gdbarch)->abi == V850_ABI_RH850)
> +  if (tdep->abi == V850_ABI_RH850)
>       {
>         if (v850_type_is_scalar (type) && TYPE_LENGTH(type) <= 8)
>   	return 0;
> @@ -1021,8 +1022,9 @@ v850_push_dummy_call (struct gdbarch *gdbarch,
>     int argnum;
>     int arg_space = 0;
>     int stack_offset;
> +  v850_gdbarch_tdep *tdep = (v850_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
> -  if (gdbarch_tdep (gdbarch)->abi == V850_ABI_RH850)
> +  if (tdep->abi == V850_ABI_RH850)
>       stack_offset = 0;
>     else
>       {
> @@ -1054,7 +1056,7 @@ v850_push_dummy_call (struct gdbarch *gdbarch,
>         gdb_byte valbuf[v850_reg_size];
>   
>         if (!v850_type_is_scalar (value_type (*args))
> -	 && gdbarch_tdep (gdbarch)->abi == V850_ABI_GCC
> +	  && tdep->abi == V850_ABI_GCC
>   	  && TYPE_LENGTH (value_type (*args)) > E_MAX_RETTYPE_SIZE_IN_REGS)
>   	{
>   	  store_unsigned_integer (valbuf, 4, byte_order,
> @@ -1068,7 +1070,7 @@ v850_push_dummy_call (struct gdbarch *gdbarch,
>   	  val = (gdb_byte *) value_contents (*args).data ();
>   	}
>   
> -      if (gdbarch_tdep (gdbarch)->eight_byte_align
> +      if (tdep->eight_byte_align
>   	  && v850_eight_byte_align_p (value_type (*args)))
>   	{
>   	  if (argreg <= E_ARGLAST_REGNUM && (argreg & 1))
> @@ -1348,7 +1350,6 @@ static struct gdbarch *
>   v850_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   {
>     struct gdbarch *gdbarch;
> -  struct gdbarch_tdep *tdep;
>     int e_flags, e_machine;
>   
>     /* Extract the elf_flags if available.  */
> @@ -1371,13 +1372,16 @@ v850_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>          arches != NULL;
>          arches = gdbarch_list_lookup_by_info (arches->next, &info))
>       {
> -      if (gdbarch_tdep (arches->gdbarch)->e_flags != e_flags
> -	  || gdbarch_tdep (arches->gdbarch)->e_machine != e_machine)
> +      v850_gdbarch_tdep *tdep
> +	= (v850_gdbarch_tdep *) gdbarch_tdep (arches->gdbarch);
> +
> +      if (tdep->e_flags != e_flags || tdep->e_machine != e_machine)
>   	continue;
>   
>         return arches->gdbarch;
>       }
> -  tdep = XCNEW (struct gdbarch_tdep);
> +
> +  v850_gdbarch_tdep *tdep = new v850_gdbarch_tdep;
>     tdep->e_flags = e_flags;
>     tdep->e_machine = e_machine;
>   
> diff --git a/gdb/xtensa-config.c b/gdb/xtensa-config.c
> index 2c21c788996..57a9ff0b98d 100644
> --- a/gdb/xtensa-config.c
> +++ b/gdb/xtensa-config.c
> @@ -62,7 +62,7 @@ const xtensa_mask_t xtensa_mask15 = { 1, xtensa_submask15 };
>   
>   
>   /* Register map.  */
> -xtensa_register_t rmap[] =
> +static xtensa_register_t rmap[] =
>   {
>     /*    idx ofs bi sz al targno  flags cp typ group name  */
>     XTREG(  0,  0,32, 4, 4,0x0020,0x0006,-2, 9,0x0100,pc,          0,0,0,0,0,0)
> @@ -213,9 +213,4 @@ xtensa_register_t rmap[] =
>     XTREG_END
>   };
>   
> -
> -
> -#ifdef XTENSA_CONFIG_INSTANTIATE
> -XTENSA_CONFIG_INSTANTIATE(rmap,0)
> -#endif
> -
> +xtensa_gdbarch_tdep xtensa_tdep (rmap);
> diff --git a/gdb/xtensa-linux-tdep.c b/gdb/xtensa-linux-tdep.c
> index c9e2519b1e7..b24ebc5f17c 100644
> --- a/gdb/xtensa-linux-tdep.c
> +++ b/gdb/xtensa-linux-tdep.c
> @@ -99,7 +99,7 @@ xtensa_linux_gdb_signal_to_target (struct gdbarch *gdbarch,
>   static void
>   xtensa_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (tdep->num_nopriv_regs < tdep->num_regs)
>       {
> diff --git a/gdb/xtensa-tdep.c b/gdb/xtensa-tdep.c
> index 42bff4c818f..f09d2335559 100644
> --- a/gdb/xtensa-tdep.c
> +++ b/gdb/xtensa-tdep.c
> @@ -86,13 +86,13 @@ static unsigned int xtensa_debug_level = 0;
>   #define TX_PS			0x20
>   
>   /* ABI-independent macros.  */
> -#define ARG_NOF(gdbarch) \
> -  (gdbarch_tdep (gdbarch)->call_abi \
> +#define ARG_NOF(tdep) \
> +  (tdep->call_abi \
>      == CallAbiCall0Only ? C0_NARGS : (ARGS_NUM_REGS))
> -#define ARG_1ST(gdbarch) \
> -  (gdbarch_tdep (gdbarch)->call_abi  == CallAbiCall0Only \
> -   ? (gdbarch_tdep (gdbarch)->a0_base + C0_ARGS) \
> -   : (gdbarch_tdep (gdbarch)->a0_base + 6))
> +#define ARG_1ST(tdep) \
> +  (tdep->call_abi  == CallAbiCall0Only \
> +   ? (tdep->a0_base + C0_ARGS) \
> +   : (tdep->a0_base + 6))
>   
>   /* XTENSA_IS_ENTRY tests whether the first byte of an instruction
>      indicates that the instruction is an ENTRY instruction.  */
> @@ -116,8 +116,10 @@ static unsigned int xtensa_debug_level = 0;
>   static int
>   windowing_enabled (struct gdbarch *gdbarch, unsigned int ps)
>   {
> +  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +
>     /* If we know CALL0 ABI is set explicitly,  say it is Call0.  */
> -  if (gdbarch_tdep (gdbarch)->call_abi == CallAbiCall0Only)
> +  if (tdep->call_abi == CallAbiCall0Only)
>       return 0;
>   
>     return ((ps & PS_EXC) == 0 && (ps & PS_WOE) != 0);
> @@ -128,7 +130,7 @@ windowing_enabled (struct gdbarch *gdbarch, unsigned int ps)
>   static int
>   arreg_number (struct gdbarch *gdbarch, int a_regnum, ULONGEST wb)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int arreg;
>   
>     arreg = a_regnum - tdep->a0_base;
> @@ -143,7 +145,7 @@ arreg_number (struct gdbarch *gdbarch, int a_regnum, ULONGEST wb)
>   static int
>   areg_number (struct gdbarch *gdbarch, int ar_regnum, unsigned int wb)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int areg;
>   
>     areg = ar_regnum - tdep->ar_base;
> @@ -224,10 +226,10 @@ static int
>   xtensa_find_register_by_name (struct gdbarch *gdbarch, const char *name)
>   {
>     int i;
> +  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     for (i = 0; i < gdbarch_num_cooked_regs (gdbarch); i++)
> -
> -    if (strcasecmp (gdbarch_tdep (gdbarch)->regmap[i].name, name) == 0)
> +    if (strcasecmp (tdep->regmap[i].name, name) == 0)
>         return i;
>   
>     return -1;
> @@ -237,9 +239,11 @@ xtensa_find_register_by_name (struct gdbarch *gdbarch, const char *name)
>   static const char *
>   xtensa_register_name (struct gdbarch *gdbarch, int regnum)
>   {
> +  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +
>     /* Return the name stored in the register map.  */
>     if (regnum >= 0 && regnum < gdbarch_num_cooked_regs (gdbarch))
> -    return gdbarch_tdep (gdbarch)->regmap[regnum].name;
> +    return tdep->regmap[regnum].name;
>   
>     internal_error (__FILE__, __LINE__, _("invalid register %d"), regnum);
>     return 0;
> @@ -250,7 +254,7 @@ xtensa_register_name (struct gdbarch *gdbarch, int regnum)
>   static struct type *
>   xtensa_register_type (struct gdbarch *gdbarch, int regnum)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* Return signed integer for ARx and Ax registers.  */
>     if ((regnum >= tdep->ar_base
> @@ -335,12 +339,13 @@ static int
>   xtensa_reg_to_regnum (struct gdbarch *gdbarch, int regnum)
>   {
>     int i;
> +  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (regnum >= 0 && regnum < 16)
> -    return gdbarch_tdep (gdbarch)->a0_base + regnum;
> +    return tdep->a0_base + regnum;
>   
>     for (i = 0; i < gdbarch_num_cooked_regs (gdbarch); i++)
> -    if (regnum == gdbarch_tdep (gdbarch)->regmap[i].target_number)
> +    if (regnum == tdep->regmap[i].target_number)
>         return i;
>   
>     return -1;
> @@ -537,16 +542,17 @@ xtensa_pseudo_register_read (struct gdbarch *gdbarch,
>   {
>     DEBUGTRACE ("xtensa_pseudo_register_read (... regnum = %d (%s) ...)\n",
>   	      regnum, xtensa_register_name (gdbarch, regnum));
> +  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* Read aliases a0..a15, if this is a Windowed ABI.  */
> -  if (gdbarch_tdep (gdbarch)->isa_use_windowed_registers
> -      && (regnum >= gdbarch_tdep (gdbarch)->a0_base)
> -      && (regnum <= gdbarch_tdep (gdbarch)->a0_base + 15))
> +  if (tdep->isa_use_windowed_registers
> +      && (regnum >= tdep->a0_base)
> +      && (regnum <= tdep->a0_base + 15))
>       {
>         ULONGEST value;
>         enum register_status status;
>   
> -      status = regcache->raw_read (gdbarch_tdep (gdbarch)->wb_regnum,
> +      status = regcache->raw_read (tdep->wb_regnum,
>   				   &value);
>         if (status != REG_VALID)
>   	return status;
> @@ -560,8 +566,8 @@ xtensa_pseudo_register_read (struct gdbarch *gdbarch,
>     /* We have to find out how to deal with priveleged registers.
>        Let's treat them as pseudo-registers, but we cannot read/write them.  */
>        
> -  else if (gdbarch_tdep (gdbarch)->call_abi == CallAbiCall0Only
> -	   || regnum < gdbarch_tdep (gdbarch)->a0_base)
> +  else if (tdep->call_abi == CallAbiCall0Only
> +	   || regnum < tdep->a0_base)
>       {
>         buffer[0] = (gdb_byte)0;
>         buffer[1] = (gdb_byte)0;
> @@ -572,9 +578,9 @@ xtensa_pseudo_register_read (struct gdbarch *gdbarch,
>     /* Pseudo registers.  */
>     else if (regnum >= 0 && regnum < gdbarch_num_cooked_regs (gdbarch))
>       {
> -      xtensa_register_t *reg = &gdbarch_tdep (gdbarch)->regmap[regnum];
> +      xtensa_register_t *reg = &tdep->regmap[regnum];
>         xtensa_register_type_t type = reg->type;
> -      int flags = gdbarch_tdep (gdbarch)->target_flags;
> +      int flags = tdep->target_flags;
>   
>         /* We cannot read Unknown or Unmapped registers.  */
>         if (type == xtRegisterTypeUnmapped || type == xtRegisterTypeUnknown)
> @@ -628,15 +634,16 @@ xtensa_pseudo_register_write (struct gdbarch *gdbarch,
>   {
>     DEBUGTRACE ("xtensa_pseudo_register_write (... regnum = %d (%s) ...)\n",
>   	      regnum, xtensa_register_name (gdbarch, regnum));
> +  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* Renumber register, if aliases a0..a15 on Windowed ABI.  */
> -  if (gdbarch_tdep (gdbarch)->isa_use_windowed_registers
> -      && (regnum >= gdbarch_tdep (gdbarch)->a0_base)
> -      && (regnum <= gdbarch_tdep (gdbarch)->a0_base + 15))
> +  if (tdep->isa_use_windowed_registers
> +      && (regnum >= tdep->a0_base)
> +      && (regnum <= tdep->a0_base + 15))
>       {
>         ULONGEST value;
>         regcache_raw_read_unsigned (regcache,
> -				  gdbarch_tdep (gdbarch)->wb_regnum, &value);
> +				  tdep->wb_regnum, &value);
>         regnum = arreg_number (gdbarch, regnum, value);
>       }
>   
> @@ -648,16 +655,16 @@ xtensa_pseudo_register_write (struct gdbarch *gdbarch,
>     /* We have to find out how to deal with priveleged registers.
>        Let's treat them as pseudo-registers, but we cannot read/write them.  */
>   
> -  else if (regnum < gdbarch_tdep (gdbarch)->a0_base)
> +  else if (regnum < tdep->a0_base)
>       {
>         return;
>       }
>     /* Pseudo registers.  */
>     else if (regnum >= 0 && regnum < gdbarch_num_cooked_regs (gdbarch))
>       {
> -      xtensa_register_t *reg = &gdbarch_tdep (gdbarch)->regmap[regnum];
> +      xtensa_register_t *reg = &tdep->regmap[regnum];
>         xtensa_register_type_t type = reg->type;
> -      int flags = gdbarch_tdep (gdbarch)->target_flags;
> +      int flags = tdep->target_flags;
>   
>         /* On most targets, we cannot write registers
>   	 of type "Unknown" or "Unmapped".  */
> @@ -770,7 +777,8 @@ xtensa_register_reggroup_p (struct gdbarch *gdbarch,
>   			    int regnum,
>   			    struct reggroup *group)
>   {
> -  xtensa_register_t* reg = &gdbarch_tdep (gdbarch)->regmap[regnum];
> +  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +  xtensa_register_t* reg = &tdep->regmap[regnum];
>     xtensa_register_type_t type = reg->type;
>     xtensa_register_group_t rg = reg->group;
>     int cp_number;
> @@ -823,6 +831,7 @@ xtensa_supply_gregset (const struct regset *regset,
>   {
>     const xtensa_elf_gregset_t *regs = (const xtensa_elf_gregset_t *) gregs;
>     struct gdbarch *gdbarch = rc->arch ();
> +  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int i;
>   
>     DEBUGTRACE ("xtensa_supply_gregset (..., regnum==%d, ...)\n", regnum);
> @@ -831,33 +840,33 @@ xtensa_supply_gregset (const struct regset *regset,
>       rc->raw_supply (gdbarch_pc_regnum (gdbarch), (char *) &regs->pc);
>     if (regnum == gdbarch_ps_regnum (gdbarch) || regnum == -1)
>       rc->raw_supply (gdbarch_ps_regnum (gdbarch), (char *) &regs->ps);
> -  if (regnum == gdbarch_tdep (gdbarch)->wb_regnum || regnum == -1)
> -    rc->raw_supply (gdbarch_tdep (gdbarch)->wb_regnum,
> +  if (regnum == tdep->wb_regnum || regnum == -1)
> +    rc->raw_supply (tdep->wb_regnum,
>   		    (char *) &regs->windowbase);
> -  if (regnum == gdbarch_tdep (gdbarch)->ws_regnum || regnum == -1)
> -    rc->raw_supply (gdbarch_tdep (gdbarch)->ws_regnum,
> +  if (regnum == tdep->ws_regnum || regnum == -1)
> +    rc->raw_supply (tdep->ws_regnum,
>   		    (char *) &regs->windowstart);
> -  if (regnum == gdbarch_tdep (gdbarch)->lbeg_regnum || regnum == -1)
> -    rc->raw_supply (gdbarch_tdep (gdbarch)->lbeg_regnum,
> +  if (regnum == tdep->lbeg_regnum || regnum == -1)
> +    rc->raw_supply (tdep->lbeg_regnum,
>   		    (char *) &regs->lbeg);
> -  if (regnum == gdbarch_tdep (gdbarch)->lend_regnum || regnum == -1)
> -    rc->raw_supply (gdbarch_tdep (gdbarch)->lend_regnum,
> +  if (regnum == tdep->lend_regnum || regnum == -1)
> +    rc->raw_supply (tdep->lend_regnum,
>   		    (char *) &regs->lend);
> -  if (regnum == gdbarch_tdep (gdbarch)->lcount_regnum || regnum == -1)
> -    rc->raw_supply (gdbarch_tdep (gdbarch)->lcount_regnum,
> +  if (regnum == tdep->lcount_regnum || regnum == -1)
> +    rc->raw_supply (tdep->lcount_regnum,
>   		    (char *) &regs->lcount);
> -  if (regnum == gdbarch_tdep (gdbarch)->sar_regnum || regnum == -1)
> -    rc->raw_supply (gdbarch_tdep (gdbarch)->sar_regnum,
> +  if (regnum == tdep->sar_regnum || regnum == -1)
> +    rc->raw_supply (tdep->sar_regnum,
>   		    (char *) &regs->sar);
> -  if (regnum >=gdbarch_tdep (gdbarch)->ar_base
> -      && regnum < gdbarch_tdep (gdbarch)->ar_base
> -		    + gdbarch_tdep (gdbarch)->num_aregs)
> +  if (regnum >=tdep->ar_base
> +      && regnum < tdep->ar_base
> +		    + tdep->num_aregs)
>       rc->raw_supply
> -      (regnum, (char *) &regs->ar[regnum - gdbarch_tdep (gdbarch)->ar_base]);
> +      (regnum, (char *) &regs->ar[regnum - tdep->ar_base]);
>     else if (regnum == -1)
>       {
> -      for (i = 0; i < gdbarch_tdep (gdbarch)->num_aregs; ++i)
> -	rc->raw_supply (gdbarch_tdep (gdbarch)->ar_base + i,
> +      for (i = 0; i < tdep->num_aregs; ++i)
> +	rc->raw_supply (tdep->ar_base + i,
>   			(char *) &regs->ar[i]);
>       }
>   }
> @@ -1051,12 +1060,13 @@ static struct frame_id
>   xtensa_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
>   {
>     CORE_ADDR pc, fp;
> +  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* THIS-FRAME is a dummy frame.  Return a frame ID of that frame.  */
>   
>     pc = get_frame_pc (this_frame);
>     fp = get_frame_register_unsigned
> -	 (this_frame, gdbarch_tdep (gdbarch)->a0_base + 1);
> +	 (this_frame, tdep->a0_base + 1);
>   
>     /* Make dummy frame ID unique by adding a constant.  */
>     return frame_id_build (fp + SP_ALIGNMENT, pc);
> @@ -1105,7 +1115,8 @@ xtensa_scan_prologue (struct gdbarch *gdbarch, CORE_ADDR current_pc)
>   {
>   #define RETURN_FP goto done
>   
> -  unsigned int fp_regnum = gdbarch_tdep (gdbarch)->a0_base + 1;
> +  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +  unsigned int fp_regnum = tdep->a0_base + 1;
>     CORE_ADDR start_addr;
>     xtensa_isa isa;
>     xtensa_insnbuf ins, slot;
> @@ -1182,7 +1193,7 @@ xtensa_scan_prologue (struct gdbarch *gdbarch, CORE_ADDR current_pc)
>   		    RETURN_FP;
>   
>   		  fp_regnum
> -		    = gdbarch_tdep (gdbarch)->a0_base + register_operand;
> +		    = tdep->a0_base + register_operand;
>   		  RETURN_FP;
>   		}
>   	    }
> @@ -1254,26 +1265,27 @@ xtensa_frame_cache (struct frame_info *this_frame, void **this_cache)
>     if (windowed)
>       {
>         LONGEST op1;
> +      xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>         /* Get WINDOWBASE, WINDOWSTART, and PS registers.  */
>         wb = get_frame_register_unsigned (this_frame,
> -					gdbarch_tdep (gdbarch)->wb_regnum);
> +					tdep->wb_regnum);
>         ws = get_frame_register_unsigned (this_frame,
> -					gdbarch_tdep (gdbarch)->ws_regnum);
> +					tdep->ws_regnum);
>   
>         if (safe_read_memory_integer (pc, 1, byte_order, &op1)
>   	  && XTENSA_IS_ENTRY (gdbarch, op1))
>   	{
>   	  int callinc = CALLINC (ps);
>   	  ra = get_frame_register_unsigned
> -	    (this_frame, gdbarch_tdep (gdbarch)->a0_base + callinc * 4);
> +	    (this_frame, tdep->a0_base + callinc * 4);
>   	
>   	  /* ENTRY hasn't been executed yet, therefore callsize is still 0.  */
>   	  cache->wd.callsize = 0;
>   	  cache->wd.wb = wb;
>   	  cache->wd.ws = ws;
>   	  cache->prev_sp = get_frame_register_unsigned
> -			     (this_frame, gdbarch_tdep (gdbarch)->a0_base + 1);
> +			     (this_frame, tdep->a0_base + 1);
>   
>   	  /* This only can be the outermost frame since we are
>   	     just about to execute ENTRY.  SP hasn't been set yet.
> @@ -1292,10 +1304,10 @@ xtensa_frame_cache (struct frame_info *this_frame, void **this_cache)
>   	{
>   	  fp_regnum = xtensa_scan_prologue (gdbarch, pc);
>   	  ra = get_frame_register_unsigned (this_frame,
> -					    gdbarch_tdep (gdbarch)->a0_base);
> +					    tdep->a0_base);
>   	  cache->wd.callsize = WINSIZE (ra);
>   	  cache->wd.wb = (wb - cache->wd.callsize / 4)
> -			  & (gdbarch_tdep (gdbarch)->num_aregs / 4 - 1);
> +			  & (tdep->num_aregs / 4 - 1);
>   	  cache->wd.ws = ws & ~(1 << wb);
>   
>   	  cache->pc = get_frame_func (this_frame);
> @@ -1310,7 +1322,7 @@ xtensa_frame_cache (struct frame_info *this_frame, void **this_cache)
>   
>   	  /* Set A0...A3.  */
>   	  sp = get_frame_register_unsigned
> -	    (this_frame, gdbarch_tdep (gdbarch)->a0_base + 1) - 16;
> +	    (this_frame, tdep->a0_base + 1) - 16;
>   	
>   	  for (i = 0; i < 4; i++, sp += 4)
>   	    {
> @@ -1342,14 +1354,14 @@ xtensa_frame_cache (struct frame_info *this_frame, void **this_cache)
>   	      /* Register window overflow already happened.
>   		 We can read caller's SP from the proper spill location.  */
>   	      sp = get_frame_register_unsigned
> -		(this_frame, gdbarch_tdep (gdbarch)->a0_base + 1);
> +		(this_frame, tdep->a0_base + 1);
>   	      cache->prev_sp = read_memory_integer (sp - 12, 4, byte_order);
>   	    }
>   	  else
>   	    {
>   	      /* Read caller's frame SP directly from the previous window.  */
>   	      int regnum = arreg_number
> -			     (gdbarch, gdbarch_tdep (gdbarch)->a0_base + 1,
> +			     (gdbarch, tdep->a0_base + 1,
>   			      cache->wd.wb);
>   
>   	      cache->prev_sp = xtensa_read_register (regnum);
> @@ -1415,6 +1427,7 @@ xtensa_frame_prev_register (struct frame_info *this_frame,
>     struct xtensa_frame_cache *cache;
>     ULONGEST saved_reg = 0;
>     int done = 1;
> +  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     if (*this_cache == NULL)
>       *this_cache = xtensa_frame_cache (this_frame, this_cache);
> @@ -1422,13 +1435,13 @@ xtensa_frame_prev_register (struct frame_info *this_frame,
>   
>     if (regnum ==gdbarch_pc_regnum (gdbarch))
>       saved_reg = cache->ra;
> -  else if (regnum == gdbarch_tdep (gdbarch)->a0_base + 1)
> +  else if (regnum == tdep->a0_base + 1)
>       saved_reg = cache->prev_sp;
>     else if (!cache->call0)
>       {
> -      if (regnum == gdbarch_tdep (gdbarch)->ws_regnum)
> +      if (regnum == tdep->ws_regnum)
>   	saved_reg = cache->wd.ws;
> -      else if (regnum == gdbarch_tdep (gdbarch)->wb_regnum)
> +      else if (regnum == tdep->wb_regnum)
>   	saved_reg = cache->wd.wb;
>         else if (regnum == gdbarch_ps_regnum (gdbarch))
>   	saved_reg = cache->ps;
> @@ -1445,14 +1458,14 @@ xtensa_frame_prev_register (struct frame_info *this_frame,
>       {
>         /* Convert A-register numbers to AR-register numbers,
>   	 if we deal with A-register.  */
> -      if (regnum >= gdbarch_tdep (gdbarch)->a0_base
> -	  && regnum <= gdbarch_tdep (gdbarch)->a0_base + 15)
> +      if (regnum >= tdep->a0_base
> +	  && regnum <= tdep->a0_base + 15)
>   	regnum = arreg_number (gdbarch, regnum, cache->wd.wb);
>   
>         /* Check, if we deal with AR-register saved on stack.  */
> -      if (regnum >= gdbarch_tdep (gdbarch)->ar_base
> -	  && regnum <= (gdbarch_tdep (gdbarch)->ar_base
> -			 + gdbarch_tdep (gdbarch)->num_aregs))
> +      if (regnum >= tdep->ar_base
> +	  && regnum <= (tdep->ar_base
> +			 + tdep->num_aregs))
>   	{
>   	  int areg = areg_number (gdbarch, regnum, cache->wd.wb);
>   
> @@ -1465,10 +1478,10 @@ xtensa_frame_prev_register (struct frame_info *this_frame,
>       }
>     else /* Call0 ABI.  */
>       {
> -      int reg = (regnum >= gdbarch_tdep (gdbarch)->ar_base
> -		&& regnum <= (gdbarch_tdep (gdbarch)->ar_base
> +      int reg = (regnum >= tdep->ar_base
> +		&& regnum <= (tdep->ar_base
>   			       + C0_NREGS))
> -		  ? regnum - gdbarch_tdep (gdbarch)->ar_base : regnum;
> +		  ? regnum - tdep->ar_base : regnum;
>   
>         if (reg < C0_NREGS)
>   	{
> @@ -1543,7 +1556,8 @@ xtensa_extract_return_value (struct type *type,
>   
>     gdb_assert(len > 0);
>   
> -  if (gdbarch_tdep (gdbarch)->call_abi != CallAbiCall0Only)
> +  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +  if (tdep->call_abi != CallAbiCall0Only)
>       {
>         /* First, we have to find the caller window in the register file.  */
>         regcache_raw_read_unsigned (regcache, gdbarch_pc_regnum (gdbarch), &pc);
> @@ -1558,14 +1572,14 @@ xtensa_extract_return_value (struct type *type,
>         /* Get the register offset of the return
>   	 register (A2) in the caller window.  */
>         regcache_raw_read_unsigned
> -	(regcache, gdbarch_tdep (gdbarch)->wb_regnum, &wb);
> +	(regcache, tdep->wb_regnum, &wb);
>         areg = arreg_number (gdbarch,
> -			  gdbarch_tdep (gdbarch)->a0_base + 2 + callsize, wb);
> +			  tdep->a0_base + 2 + callsize, wb);
>       }
>     else
>       {
>         /* No windowing hardware - Call0 ABI.  */
> -      areg = gdbarch_tdep (gdbarch)->a0_base + C0_ARGS;
> +      areg = tdep->a0_base + C0_ARGS;
>       }
>   
>     DEBUGINFO ("[xtensa_extract_return_value] areg %d len %d\n", areg, len);
> @@ -1598,10 +1612,11 @@ xtensa_store_return_value (struct type *type,
>   
>     DEBUGTRACE ("xtensa_store_return_value (...)\n");
>   
> -  if (gdbarch_tdep (gdbarch)->call_abi != CallAbiCall0Only)
> +  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +  if (tdep->call_abi != CallAbiCall0Only)
>       {
>         regcache_raw_read_unsigned
> -	(regcache, gdbarch_tdep (gdbarch)->wb_regnum, &wb);
> +	(regcache, tdep->wb_regnum, &wb);
>         regcache_raw_read_unsigned (regcache, gdbarch_pc_regnum (gdbarch), &pc);
>         callsize = extract_call_winsize (gdbarch, pc);
>   
> @@ -1610,14 +1625,14 @@ xtensa_store_return_value (struct type *type,
>   			_("unimplemented for this length: %s"),
>   			pulongest (TYPE_LENGTH (type)));
>         areg = arreg_number (gdbarch,
> -			   gdbarch_tdep (gdbarch)->a0_base + 2 + callsize, wb);
> +			   tdep->a0_base + 2 + callsize, wb);
>   
>         DEBUGTRACE ("[xtensa_store_return_value] callsize %d wb %d\n",
>   	      callsize, (int) wb);
>       }
>     else
>       {
> -      areg = gdbarch_tdep (gdbarch)->a0_base + C0_ARGS;
> +      areg = tdep->a0_base + C0_ARGS;
>       }
>   
>     if (len < 4 && gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
> @@ -1681,6 +1696,7 @@ xtensa_push_dummy_call (struct gdbarch *gdbarch,
>   			CORE_ADDR struct_addr)
>   {
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
> +  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     int size, onstack_size;
>     gdb_byte *buf = (gdb_byte *) alloca (16);
>     CORE_ADDR ra, ps;
> @@ -1793,7 +1809,7 @@ xtensa_push_dummy_call (struct gdbarch *gdbarch,
>         size = (size + info->align - 1) & ~(info->align - 1);
>         onstack_size = (onstack_size + info->align - 1) & ~(info->align - 1);
>   
> -      if (size + info->length > REGISTER_SIZE * ARG_NOF (gdbarch))
> +      if (size + info->length > REGISTER_SIZE * ARG_NOF (tdep))
>   	{
>   	  info->onstack = 1;
>   	  info->u.offset = onstack_size;
> @@ -1802,7 +1818,7 @@ xtensa_push_dummy_call (struct gdbarch *gdbarch,
>         else
>   	{
>   	  info->onstack = 0;
> -	  info->u.regno = ARG_1ST (gdbarch) + size / REGISTER_SIZE;
> +	  info->u.regno = ARG_1ST (tdep) + size / REGISTER_SIZE;
>   	}
>         size += info->length;
>       }
> @@ -1811,7 +1827,7 @@ xtensa_push_dummy_call (struct gdbarch *gdbarch,
>     sp = align_down (sp - onstack_size, SP_ALIGNMENT);
>   
>     /* Simulate MOVSP, if Windowed ABI.  */
> -  if ((gdbarch_tdep (gdbarch)->call_abi != CallAbiCall0Only)
> +  if ((tdep->call_abi != CallAbiCall0Only)
>         && (sp != osp))
>       {
>         read_memory (osp - 16, buf, 16);
> @@ -1823,7 +1839,7 @@ xtensa_push_dummy_call (struct gdbarch *gdbarch,
>     if (return_method == return_method_struct)
>       {
>         store_unsigned_integer (buf, REGISTER_SIZE, byte_order, struct_addr);
> -      regcache->cooked_write (ARG_1ST (gdbarch), buf);
> +      regcache->cooked_write (ARG_1ST (tdep), buf);
>       }
>   
>     for (int i = 0; i < nargs; i++)
> @@ -1887,7 +1903,7 @@ xtensa_push_dummy_call (struct gdbarch *gdbarch,
>        The return address for the current function (in A0) is
>        saved in the dummy frame, so we can safely overwrite A0 here.  */
>   
> -  if (gdbarch_tdep (gdbarch)->call_abi != CallAbiCall0Only)
> +  if (tdep->call_abi != CallAbiCall0Only)
>       {
>         ULONGEST val;
>   
> @@ -1895,7 +1911,7 @@ xtensa_push_dummy_call (struct gdbarch *gdbarch,
>         regcache_raw_read_unsigned (regcache, gdbarch_ps_regnum (gdbarch), &val);
>         ps = (unsigned long) val & ~0x00030000;
>         regcache_cooked_write_unsigned
> -	(regcache, gdbarch_tdep (gdbarch)->a0_base + 4, ra);
> +	(regcache, tdep->a0_base + 4, ra);
>         regcache_cooked_write_unsigned (regcache,
>   				      gdbarch_ps_regnum (gdbarch),
>   				      ps | 0x00010000);
> @@ -1905,21 +1921,21 @@ xtensa_push_dummy_call (struct gdbarch *gdbarch,
>   	 to modify WINDOWSTART register to make it look like there
>   	 is only one register window corresponding to WINDOWEBASE.  */
>   
> -      regcache->raw_read (gdbarch_tdep (gdbarch)->wb_regnum, buf);
> +      regcache->raw_read (tdep->wb_regnum, buf);
>         regcache_cooked_write_unsigned
> -	(regcache, gdbarch_tdep (gdbarch)->ws_regnum,
> +	(regcache, tdep->ws_regnum,
>   	 1 << extract_unsigned_integer (buf, 4, byte_order));
>       }
>     else
>       {
>         /* Simulate CALL0: write RA into A0 register.  */
>         regcache_cooked_write_unsigned
> -	(regcache, gdbarch_tdep (gdbarch)->a0_base, bp_addr);
> +	(regcache, tdep->a0_base, bp_addr);
>       }
>   
>     /* Set new stack pointer and return it.  */
>     regcache_cooked_write_unsigned (regcache,
> -				  gdbarch_tdep (gdbarch)->a0_base + 1, sp);
> +				  tdep->a0_base + 1, sp);
>     /* Make dummy frame ID unique by adding a constant.  */
>     return sp + SP_ALIGNMENT;
>   }
> @@ -1929,7 +1945,9 @@ xtensa_push_dummy_call (struct gdbarch *gdbarch,
>   static int
>   xtensa_breakpoint_kind_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr)
>   {
> -  if (gdbarch_tdep (gdbarch)->isa_use_density_instructions)
> +  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +
> +  if (tdep->isa_use_density_instructions)
>       return 2;
>     else
>       return 4;
> @@ -2174,6 +2192,7 @@ call0_track_op (struct gdbarch *gdbarch, xtensa_c0reg_t dst[], xtensa_c0reg_t sr
>   {
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>     unsigned litbase, litaddr, litval;
> +  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     switch (opclass)
>       {
> @@ -2264,9 +2283,9 @@ call0_track_op (struct gdbarch *gdbarch, xtensa_c0reg_t dst[], xtensa_c0reg_t sr
>         /* 2 operands: dst, literal offset.  */
>         gdb_assert (nods == 2);
>         /* litbase = xtensa_get_litbase (pc);  can be also used.  */
> -      litbase = (gdbarch_tdep (gdbarch)->litbase_regnum == -1)
> +      litbase = (tdep->litbase_regnum == -1)
>   	? 0 : xtensa_read_register
> -		(gdbarch_tdep (gdbarch)->litbase_regnum);
> +		(tdep->litbase_regnum);
>         litaddr = litbase & 1
>   		  ? (litbase & ~1) + (signed)odv[1]
>   		  : (pc + 3  + (signed)odv[1]) & ~3;
> @@ -2548,9 +2567,10 @@ call0_frame_cache (struct frame_info *this_frame,
>     CORE_ADDR body_pc=UINT_MAX;	/* PC, where prologue analysis stopped.  */
>     CORE_ADDR sp, fp, ra;
>     int fp_regnum = C0_SP, c0_hasfp = 0, c0_frmsz = 0, prev_sp = 0, to_stk;
> +  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>    
>     sp = get_frame_register_unsigned
> -    (this_frame, gdbarch_tdep (gdbarch)->a0_base + 1);
> +    (this_frame, tdep->a0_base + 1);
>     fp = sp; /* Assume FP == SP until proven otherwise.  */
>   
>     /* Find the beginning of the prologue of the function containing the PC
> @@ -2584,12 +2604,12 @@ call0_frame_cache (struct frame_info *this_frame,
>   	 was derived from SP.  Otherwise, it would be C0_FP.  */
>         fp_regnum = c0_hasfp ? C0_FP : C0_SP;
>         c0_frmsz = - cache->c0.c0_rt[fp_regnum].fr_ofs;
> -      fp_regnum += gdbarch_tdep (gdbarch)->a0_base;
> +      fp_regnum += tdep->a0_base;
>       }
>     else  /* No data from the prologue analysis.  */
>       {
>         c0_hasfp = 0;
> -      fp_regnum = gdbarch_tdep (gdbarch)->a0_base + C0_SP;
> +      fp_regnum = tdep->a0_base + C0_SP;
>         c0_frmsz = 0;
>         start_pc = pc;
>      }
> @@ -2613,7 +2633,7 @@ call0_frame_cache (struct frame_info *this_frame,
>         if (cache->c0.c0_sp_ofs == C0_NOSTK)
>   	/* Saved unaligned value of SP is kept in a register.  */
>   	unaligned_sp = get_frame_register_unsigned
> -	  (this_frame, gdbarch_tdep (gdbarch)->a0_base + cache->c0.c0_old_sp);
> +	  (this_frame, tdep->a0_base + cache->c0.c0_old_sp);
>         else
>   	/* Get the value from stack.  */
>   	unaligned_sp = (CORE_ADDR)
> @@ -2673,7 +2693,7 @@ call0_frame_cache (struct frame_info *this_frame,
>   	{
>   	  ra = get_frame_register_unsigned
>   	    (this_frame,
> -	     gdbarch_tdep (gdbarch)->a0_base + cache->c0.c0_rt[i].fr_reg);
> +	     tdep->a0_base + cache->c0.c0_rt[i].fr_reg);
>   	}
>         else ra = 0;
>       }
> @@ -2700,8 +2720,9 @@ static int a11_was_saved;
>   static void
>   execute_l32e (struct gdbarch *gdbarch, int at, int as, int offset, CORE_ADDR wb)
>   {
> -  int atreg = arreg_number (gdbarch, gdbarch_tdep (gdbarch)->a0_base + at, wb);
> -  int asreg = arreg_number (gdbarch, gdbarch_tdep (gdbarch)->a0_base + as, wb);
> +  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +  int atreg = arreg_number (gdbarch, tdep->a0_base + at, wb);
> +  int asreg = arreg_number (gdbarch, tdep->a0_base + as, wb);
>     CORE_ADDR addr = xtensa_read_register (asreg) + offset;
>     unsigned int spilled_value
>       = read_memory_unsigned_integer (addr, 4, gdbarch_byte_order (gdbarch));
> @@ -2729,8 +2750,9 @@ execute_l32e (struct gdbarch *gdbarch, int at, int as, int offset, CORE_ADDR wb)
>   static void
>   execute_s32e (struct gdbarch *gdbarch, int at, int as, int offset, CORE_ADDR wb)
>   {
> -  int atreg = arreg_number (gdbarch, gdbarch_tdep (gdbarch)->a0_base + at, wb);
> -  int asreg = arreg_number (gdbarch, gdbarch_tdep (gdbarch)->a0_base + as, wb);
> +  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +  int atreg = arreg_number (gdbarch, tdep->a0_base + at, wb);
> +  int asreg = arreg_number (gdbarch, tdep->a0_base + as, wb);
>     CORE_ADDR addr = xtensa_read_register (asreg) + offset;
>     ULONGEST spilled_value = xtensa_read_register (atreg);
>   
> @@ -2762,6 +2784,7 @@ execute_code (struct gdbarch *gdbarch, CORE_ADDR current_pc, CORE_ADDR wb)
>     xtensa_opcode opc;
>     int insn_num = 0;
>     void (*func) (struct gdbarch *, int, int, int, CORE_ADDR);
> +  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     uint32_t at, as, offset;
>   
> @@ -2827,7 +2850,7 @@ execute_code (struct gdbarch *gdbarch, CORE_ADDR current_pc, CORE_ADDR wb)
>   	      if (a0_was_saved)
>   		{
>   		  int arreg = arreg_number (gdbarch,
> -					    gdbarch_tdep (gdbarch)->a0_base,
> +					    tdep->a0_base,
>   					    wb);
>   		  xtensa_write_register (arreg, a0_saved);
>   		}
> @@ -2840,7 +2863,7 @@ execute_code (struct gdbarch *gdbarch, CORE_ADDR current_pc, CORE_ADDR wb)
>   		  if (a11_was_saved)
>   		    {
>   		      int arreg = arreg_number (gdbarch,
> -						gdbarch_tdep (gdbarch)->a0_base + 11,
> +						tdep->a0_base + 11,
>   						wb);
>   		      xtensa_write_register (arreg, a11_saved);
>   		    }
> @@ -2848,7 +2871,7 @@ execute_code (struct gdbarch *gdbarch, CORE_ADDR current_pc, CORE_ADDR wb)
>   	      else if (a7_was_saved)
>   		{
>   		  int arreg = arreg_number (gdbarch,
> -					    gdbarch_tdep (gdbarch)->a0_base + 7,
> +					    tdep->a0_base + 7,
>   					    wb);
>   		  xtensa_write_register (arreg, a7_saved);
>   		}
> @@ -2892,12 +2915,13 @@ xtensa_window_interrupt_frame_cache (struct frame_info *this_frame,
>     CORE_ADDR ps, wb, ws, ra;
>     int epc1_regnum, i, regnum;
>     xtensa_exception_handler_t eh_type;
> +  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   
>     /* Read PS, WB, and WS from the hardware. Note that PS register
>        must be present, if Windowed ABI is supported.  */
>     ps = xtensa_read_register (gdbarch_ps_regnum (gdbarch));
> -  wb = xtensa_read_register (gdbarch_tdep (gdbarch)->wb_regnum);
> -  ws = xtensa_read_register (gdbarch_tdep (gdbarch)->ws_regnum);
> +  wb = xtensa_read_register (tdep->wb_regnum);
> +  ws = xtensa_read_register (tdep->ws_regnum);
>   
>     /* Execute all the remaining instructions from Window Interrupt Handler
>        by simulating them on the remote protocol level.  On return, set the
> @@ -2920,7 +2944,7 @@ Unable to decode Xtensa Window Interrupt Handler's code."));
>       cache->wd.ws = ws | (1 << wb);
>   
>     cache->wd.wb = (ps & 0xf00) >> 8; /* Set WB to OWB.  */
> -  regnum = arreg_number (gdbarch, gdbarch_tdep (gdbarch)->a0_base,
> +  regnum = arreg_number (gdbarch, tdep->a0_base,
>   			 cache->wd.wb);
>     ra = xtensa_read_register (regnum);
>     cache->wd.callsize = WINSIZE (ra);
> @@ -2928,7 +2952,7 @@ Unable to decode Xtensa Window Interrupt Handler's code."));
>     /* Set regnum to a frame pointer of the frame being cached.  */
>     regnum = xtensa_scan_prologue (gdbarch, pc);
>     regnum = arreg_number (gdbarch,
> -			 gdbarch_tdep (gdbarch)->a0_base + regnum,
> +			 tdep->a0_base + regnum,
>   			 cache->wd.wb);
>     cache->base = get_frame_register_unsigned (this_frame, regnum);
>   
> @@ -3005,7 +3029,8 @@ xtensa_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc)
>   
>         CORE_ADDR end_func;
>   
> -      if ((gdbarch_tdep (gdbarch)->call_abi == CallAbiCall0Only)
> +      xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +      if ((tdep->call_abi == CallAbiCall0Only)
>   	  && call0_ret (start_pc, prologue_sal.end))
>   	return start_pc;
>   
> @@ -3026,7 +3051,7 @@ xtensa_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc)
>   static void
>   xtensa_verify_config (struct gdbarch *gdbarch)
>   {
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  xtensa_gdbarch_tdep *tdep = (xtensa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>     string_file log;
>   
>     /* Verify that we got a reasonable number of AREGS.  */
> @@ -3064,7 +3089,7 @@ xtensa_verify_config (struct gdbarch *gdbarch)
>   /* Derive specific register numbers from the array of registers.  */
>   
>   static void
> -xtensa_derive_tdep (struct gdbarch_tdep *tdep)
> +xtensa_derive_tdep (xtensa_gdbarch_tdep *tdep)
>   {
>     xtensa_register_t* rmap;
>     int n, max_size = 4;
> @@ -3139,12 +3164,11 @@ xtensa_derive_tdep (struct gdbarch_tdep *tdep)
>   
>   /* Module "constructor" function.  */
>   
> -extern struct gdbarch_tdep xtensa_tdep;
> +extern xtensa_gdbarch_tdep xtensa_tdep;
>   
>   static struct gdbarch *
>   xtensa_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   {
> -  struct gdbarch_tdep *tdep;
>     struct gdbarch *gdbarch;
>   
>     DEBUGTRACE ("gdbarch_init()\n");
> @@ -3155,7 +3179,7 @@ xtensa_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>     /* We have to set the byte order before we call gdbarch_alloc.  */
>     info.byte_order = XCHAL_HAVE_BE ? BFD_ENDIAN_BIG : BFD_ENDIAN_LITTLE;
>   
> -  tdep = &xtensa_tdep;
> +  xtensa_gdbarch_tdep *tdep = &xtensa_tdep;
>     gdbarch = gdbarch_alloc (&info, tdep);
>     xtensa_derive_tdep (tdep);
>   
> diff --git a/gdb/xtensa-tdep.h b/gdb/xtensa-tdep.h
> index 55a2ed491bb..64e4da69dc5 100644
> --- a/gdb/xtensa-tdep.h
> +++ b/gdb/xtensa-tdep.h
> @@ -21,6 +21,8 @@
>   #define XTENSA_TDEP_H
>   
>   #include "arch/xtensa.h"
> +#include "gdbarch.h"
> +#include "xtensa-config.h"
>   
>   /* XTENSA_TDEP_VERSION can/should be changed along with XTENSA_CONFIG_VERSION
>      whenever the "tdep" structure changes in an incompatible way.  */
> @@ -155,137 +157,91 @@ struct ctype_cache
>     struct type *virtual_type;
>   };
>   
> +#ifndef XCHAL_NUM_CONTEXTS
> +# define XCHAL_NUM_CONTEXTS	0
> +#endif
> +
> +#ifndef XCHAL_HAVE_EXCEPTIONS
> +# define XCHAL_HAVE_EXCEPTIONS	1
> +#endif
> +
>   /*  Xtensa-specific target dependencies.  */
>   
> -struct gdbarch_tdep
> +struct xtensa_gdbarch_tdep : gdbarch_tdep
>   {
> -  unsigned int target_flags;
> +  xtensa_gdbarch_tdep (xtensa_register_t *regmap)
> +    : regmap (regmap)
> +  {}
> +
> +  unsigned int target_flags = 0;
>   
>     /* Spill location for TIE register files under ocd.  */
>   
> -  unsigned int spill_location;
> -  unsigned int spill_size;
> +  unsigned int spill_location = (unsigned int) -1;
> +  unsigned int spill_size = 0;
>   
> -  char *unused;				/* Placeholder for compatibility.  */
> -  call_abi_t call_abi;			/* Calling convention.  */
> +  char *unused = nullptr;		/* Placeholder for compatibility.  */
> +
> +  /* Calling convention.  */
> +  call_abi_t call_abi = (XSHAL_ABI == XTHAL_ABI_CALL0
> +			 ? CallAbiCall0Only : CallAbiDefault);
>   
>     /* CPU configuration.  */
>   
> -  unsigned int debug_interrupt_level;
> +  unsigned int debug_interrupt_level = XCHAL_DEBUGLEVEL;
>   
> -  unsigned int icache_line_bytes;
> -  unsigned int dcache_line_bytes;
> -  unsigned int dcache_writeback;
> +  unsigned int icache_line_bytes = XCHAL_ICACHE_LINESIZE;
> +  unsigned int dcache_line_bytes = XCHAL_DCACHE_LINESIZE;
> +  unsigned int dcache_writeback = XCHAL_DCACHE_IS_WRITEBACK;
>   
> -  unsigned int isa_use_windowed_registers;
> -  unsigned int isa_use_density_instructions;
> -  unsigned int isa_use_exceptions;
> -  unsigned int isa_use_ext_l32r;
> -  unsigned int isa_max_insn_size;	/* Maximum instruction length.  */
> -  unsigned int debug_num_ibreaks;	/* Number of IBREAKs.  */
> -  unsigned int debug_num_dbreaks;
> +  unsigned int isa_use_windowed_registers = XSHAL_ABI != XTHAL_ABI_CALL0;
> +  unsigned int isa_use_density_instructions = XCHAL_HAVE_DENSITY;
> +  unsigned int isa_use_exceptions = XCHAL_HAVE_EXCEPTIONS;
> +  unsigned int isa_use_ext_l32r = XSHAL_USE_ABSOLUTE_LITERALS;
> +  unsigned int isa_max_insn_size = XCHAL_MAX_INSTRUCTION_SIZE;	/* Maximum instruction length.  */
> +  unsigned int debug_num_ibreaks = XCHAL_NUM_IBREAK;	/* Number of IBREAKs.  */
> +  unsigned int debug_num_dbreaks = XCHAL_NUM_DBREAK;
>   
>     /* Register map.  */
>   
> -  xtensa_register_t* regmap;
> -
> -  unsigned int num_regs;	/* Number of registers in register map.  */
> -  unsigned int num_nopriv_regs;	/* Number of non-privileged registers.  */
> -  unsigned int num_pseudo_regs;	/* Number of pseudo registers.  */
> -  unsigned int num_aregs;	/* Size of register file.  */
> -  unsigned int num_contexts;
> -
> -  int ar_base;			/* Register number for AR0.  */
> -  int a0_base;			/* Register number for A0 (pseudo).  */
> -  int wb_regnum;		/* Register number for WB.  */
> -  int ws_regnum;		/* Register number for WS.  */
> -  int pc_regnum;		/* Register number for PC.  */
> -  int ps_regnum;		/* Register number for PS.  */
> -  int lbeg_regnum;		/* Register numbers for count regs.  */
> -  int lend_regnum;
> -  int lcount_regnum;
> -  int sar_regnum;		/* Register number of SAR.  */
> -  int litbase_regnum;		/* Register number of LITBASE.  */
> -  int threadptr_regnum;		/* Register number of THREADPTR.  */
> -
> -  int interrupt_regnum;		/* Register number for interrupt.  */
> -  int interrupt2_regnum;	/* Register number for interrupt2.  */
> -  int cpenable_regnum;		/* Register number for cpenable.  */
> -  int debugcause_regnum;	/* Register number for debugcause.  */
> -  int exccause_regnum;		/* Register number for exccause.  */
> -  int excvaddr_regnum;		/* Register number for excvaddr.  */
> -
> -  int max_register_raw_size;
> -  int max_register_virtual_size;
> -  unsigned long *fp_layout;	/* Layout of custom/TIE regs in 'FP' area.  */
> -  unsigned int fp_layout_bytes;	/* Size of layout information (in bytes).  */
> -  unsigned long *gregmap;
> +  xtensa_register_t *regmap;
> +
> +  unsigned int num_regs = 0;		/* Number of registers in register map.  */
> +  unsigned int num_nopriv_regs = 0;	/* Number of non-privileged registers.  */
> +  unsigned int num_pseudo_regs = 0;	/* Number of pseudo registers.  */
> +  unsigned int num_aregs = XCHAL_NUM_AREGS;		/* Size of register file.  */
> +  unsigned int num_contexts = XCHAL_NUM_CONTEXTS;
> +
> +  int ar_base = -1;		/* Register number for AR0.  */
> +  int a0_base = -1;		/* Register number for A0 (pseudo).  */
> +  int wb_regnum = -1;		/* Register number for WB.  */
> +  int ws_regnum = -1;		/* Register number for WS.  */
> +  int pc_regnum = -1;		/* Register number for PC.  */
> +  int ps_regnum = -1;		/* Register number for PS.  */
> +  int lbeg_regnum = -1;		/* Register numbers for count regs.  */
> +  int lend_regnum = -1;
> +  int lcount_regnum = -1;
> +  int sar_regnum = -1;		/* Register number of SAR.  */
> +  int litbase_regnum = -1;	/* Register number of LITBASE.  */
> +  int threadptr_regnum = -1;	/* Register number of THREADPTR.  */
> +
> +  int interrupt_regnum = -1;	/* Register number for interrupt.  */
> +  int interrupt2_regnum = -1;	/* Register number for interrupt2.  */
> +  int cpenable_regnum = -1;	/* Register number for cpenable.  */
> +  int debugcause_regnum = -1;	/* Register number for debugcause.  */
> +  int exccause_regnum = -1;	/* Register number for exccause.  */
> +  int excvaddr_regnum = -1;	/* Register number for excvaddr.  */
> +
> +  int max_register_raw_size = 0;
> +  int max_register_virtual_size = 0;
> +  unsigned long *fp_layout = nullptr;	/* Layout of custom/TIE regs in 'FP' area.  */
> +  unsigned int fp_layout_bytes = 0;	/* Size of layout information (in bytes).  */
> +  unsigned long *gregmap = nullptr;
>   
>     /* Cached register types.  */
> -  struct ctype_cache *type_entries;
> +  struct ctype_cache *type_entries = nullptr;
>   };
>   
> -/* Macro to instantiate a gdbarch_tdep structure.  */
> -
> -#define XTENSA_GDBARCH_TDEP_INSTANTIATE(rmap,spillsz)			\
> -  {									\
> -    0,				/* target_flags */			\
> -    (unsigned) -1,		/* spill_location */	\
> -    (spillsz),			/* spill_size */			\
> -    0,				/* unused */				\
> -    (XSHAL_ABI == XTHAL_ABI_CALL0					\
> -     ? CallAbiCall0Only							\
> -     : CallAbiDefault),		/* call_abi */				\
> -    XCHAL_DEBUGLEVEL,		/* debug_interrupt_level */		\
> -    XCHAL_ICACHE_LINESIZE,	/* icache_line_bytes */			\
> -    XCHAL_DCACHE_LINESIZE,	/* dcache_line_bytes */			\
> -    XCHAL_DCACHE_IS_WRITEBACK,  /* dcache_writeback */			\
> -    (XSHAL_ABI != XTHAL_ABI_CALL0),   /* isa_use_windowed_registers */	\
> -    XCHAL_HAVE_DENSITY,		 /* isa_use_density_instructions */	\
> -    XCHAL_HAVE_EXCEPTIONS,	 /* isa_use_exceptions */		\
> -    XSHAL_USE_ABSOLUTE_LITERALS, /* isa_use_ext_l32r */			\
> -    XCHAL_MAX_INSTRUCTION_SIZE,  /* isa_max_insn_size */		\
> -    XCHAL_NUM_IBREAK,		 /* debug_num_ibreaks */		\
> -    XCHAL_NUM_DBREAK,		 /* debug_num_dbreaks */		\
> -    rmap,			 /* regmap */				\
> -    0,				 /* num_regs */				\
> -    0,				 /* num_nopriv_regs */			\
> -    0,				 /* num_pseudo_regs */			\
> -    XCHAL_NUM_AREGS,		 /* num_aregs */			\
> -    XCHAL_NUM_CONTEXTS,		 /* num_contexts */			\
> -    -1,				 /* ar_base */				\
> -    -1,				 /* a0_base */				\
> -    -1,				 /* wb_regnum */			\
> -    -1,				 /* ws_regnum */			\
> -    -1,				 /* pc_regnum */			\
> -    -1,				 /* ps_regnum */			\
> -    -1,				 /* lbeg_regnum */			\
> -    -1,				 /* lend_regnum */			\
> -    -1,				 /* lcount_regnum */			\
> -    -1,				 /* sar_regnum */			\
> -    -1,				 /* litbase_regnum */			\
> -    -1,				 /* interrupt_regnum */			\
> -    -1,				 /* interrupt2_regnum */		\
> -    -1,				 /* cpenable_regnum */			\
> -    -1,				 /* debugcause_regnum */		\
> -    -1,				 /* exccause_regnum */			\
> -    -1,				 /* excvaddr_regnum */			\
> -    0,				 /* max_register_raw_size */		\
> -    0,				 /* max_register_virtual_size */	\
> -    0,				 /* fp_layout */			\
> -    0,				 /* fp_layout_bytes */			\
> -    0,				 /* gregmap */				\
> -  }
> -#define XTENSA_CONFIG_INSTANTIATE(rmap,spill_size)	\
> -	struct gdbarch_tdep xtensa_tdep = \
> -	  XTENSA_GDBARCH_TDEP_INSTANTIATE(rmap,spill_size);
> -
> -#ifndef XCHAL_NUM_CONTEXTS
> -#define XCHAL_NUM_CONTEXTS	0
> -#endif
> -#ifndef XCHAL_HAVE_EXCEPTIONS
> -#define XCHAL_HAVE_EXCEPTIONS	1
> -#endif
>   #define WB_SHIFT	  2
>   
>   /* We assign fixed numbers to the registers of the "current" window
> diff --git a/gdb/z80-tdep.c b/gdb/z80-tdep.c
> index 7b9a7e23501..9d453cd32b9 100644
> --- a/gdb/z80-tdep.c
> +++ b/gdb/z80-tdep.c
> @@ -54,19 +54,21 @@
>        next frame - frame of caller, which has called current function
>   */
>   
> -struct gdbarch_tdep
> +struct z80_gdbarch_tdep : gdbarch_tdep
>   {
>     /* Number of bytes used for address:
>         2 bytes for all Z80 family
>         3 bytes for eZ80 CPUs operating in ADL mode */
> -  int addr_length;
> +  int addr_length = 0;
>   
>     /* Type for void.  */
> -  struct type *void_type;
> +  struct type *void_type = nullptr;
> +
>     /* Type for a function returning void.  */
> -  struct type *func_void_type;
> +  struct type *func_void_type = nullptr;
> +
>     /* Type for a pointer to a function.  Used for the type of PC.  */
> -  struct type *pc_type;
> +  struct type *pc_type = nullptr;
>   };
>   
>   /* At any time stack frame contains following parts:
> @@ -305,7 +307,8 @@ z80_scan_prologue (struct gdbarch *gdbarch, CORE_ADDR pc_beg, CORE_ADDR pc_end,
>   		   struct z80_unwind_cache *info)
>   {
>     enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
> -  int addr_len = gdbarch_tdep (gdbarch)->addr_length;
> +  z80_gdbarch_tdep *tdep = (z80_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +  int addr_len = tdep->addr_length;
>     gdb_byte prologue[32]; /* max prologue is 24 bytes: __interrupt with local array */
>     int pos = 0;
>     int len;
> @@ -560,7 +563,8 @@ z80_frame_unwind_cache (struct frame_info *this_frame,
>     gdb_byte buf[sizeof(void*)];
>     struct z80_unwind_cache *info;
>     struct gdbarch *gdbarch = get_frame_arch (this_frame);
> -  int addr_len = gdbarch_tdep (gdbarch)->addr_length;
> +  z80_gdbarch_tdep *tdep = (z80_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> +  int addr_len = tdep->addr_length;
>   
>     if (*this_prologue_cache)
>       return (struct z80_unwind_cache *) *this_prologue_cache;
> @@ -692,7 +696,7 @@ z80_frame_prev_register (struct frame_info *this_frame,
>   	  ULONGEST pc;
>   	  gdb_byte buf[3];
>   	  struct gdbarch *gdbarch = get_frame_arch (this_frame);
> -	  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +	  z80_gdbarch_tdep *tdep = (z80_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>   	  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>   
>   	  read_memory (info->saved_regs[Z80_PC_REGNUM].addr (),
> @@ -745,11 +749,12 @@ z80_sw_breakpoint_from_kind (struct gdbarch *gdbarch, int kind, int *size)
>       }
>     else /* kind is non-RST address, use CALL instead, but it is dungerous */
>       {
> +      z80_gdbarch_tdep *tdep = (z80_gdbarch_tdep *) gdbarch_tdep (gdbarch);
>         gdb_byte *p = break_insn;
>         *p++ = 0xcd;
>         *p++ = (kind >> 0) & 0xff;
>         *p++ = (kind >> 8) & 0xff;
> -      if (gdbarch_tdep (gdbarch)->addr_length > 2)
> +      if (tdep->addr_length > 2)
>   	*p++ = (kind >> 16) & 0xff;
>         *size = p - break_insn;
>       }
> @@ -1077,7 +1082,6 @@ static struct gdbarch *
>   z80_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>   {
>     struct gdbarch *gdbarch;
> -  struct gdbarch_tdep *tdep;
>     struct gdbarch_list *best_arch;
>     tdesc_arch_data_up tdesc_data;
>     unsigned long mach = info.bfd_arch_info->mach;
> @@ -1119,7 +1123,7 @@ z80_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>       }
>   
>     /* None found, create a new architecture from the information provided.  */
> -  tdep = XCNEW (struct gdbarch_tdep);
> +  z80_gdbarch_tdep *tdep = new z80_gdbarch_tdep;
>     gdbarch = gdbarch_alloc (&info, tdep);
>   
>     if (mach == bfd_mach_ez80_adl)
> 

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] gdb: fix gdbarch_tdep ODR violation
  2021-11-15 10:45 ` Luis Machado
@ 2021-11-15 16:29   ` Simon Marchi
  2021-11-15 20:42     ` will schmidt
  0 siblings, 1 reply; 10+ messages in thread
From: Simon Marchi @ 2021-11-15 16:29 UTC (permalink / raw)
  To: Luis Machado, Simon Marchi, gdb-patches, John Baldwin

On 2021-11-15 5:45 a.m., Luis Machado via Gdb-patches wrote:
> LGTM

Thanks to you and John for taking a look, I pushed the patch.

Simon


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] gdb: fix gdbarch_tdep ODR violation
  2021-11-12 20:42 [PATCH] gdb: fix gdbarch_tdep ODR violation Simon Marchi
  2021-11-12 21:55 ` John Baldwin
  2021-11-15 10:45 ` Luis Machado
@ 2021-11-15 16:47 ` Pedro Alves
  2021-11-15 16:53   ` Simon Marchi
  2 siblings, 1 reply; 10+ messages in thread
From: Pedro Alves @ 2021-11-15 16:47 UTC (permalink / raw)
  To: Simon Marchi, gdb-patches

On 2021-11-12 20:42, Simon Marchi via Gdb-patches wrote:
> +      aarch64_gdbarch_tdep *tdep
> +	= (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);

I'd think it would be nicer if we added a small wrapper function to each module, like:

static aarch64_gdbarch_tdep *
aarch64_gdbarch_tdep (struct gdbarch *gdbarch)
{
   return (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
}

and then we we'd get rid of all the casts and duplicated type names at the callers, like:

     auto *tdep = aarch64_gdbarch_tdep (gdbarch);

That'd essentially require touching again most lines you already touched, so, yeah, for some
other rainy day...

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] gdb: fix gdbarch_tdep ODR violation
  2021-11-15 16:47 ` Pedro Alves
@ 2021-11-15 16:53   ` Simon Marchi
  0 siblings, 0 replies; 10+ messages in thread
From: Simon Marchi @ 2021-11-15 16:53 UTC (permalink / raw)
  To: Pedro Alves, Simon Marchi, gdb-patches

On 2021-11-15 11:47 a.m., Pedro Alves wrote:
> On 2021-11-12 20:42, Simon Marchi via Gdb-patches wrote:
>> +      aarch64_gdbarch_tdep *tdep
>> +	= (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> 
> I'd think it would be nicer if we added a small wrapper function to each module, like:
> 
> static aarch64_gdbarch_tdep *
> aarch64_gdbarch_tdep (struct gdbarch *gdbarch)
> {
>    return (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
> }
> 
> and then we we'd get rid of all the casts and duplicated type names at the callers, like:
> 
>      auto *tdep = aarch64_gdbarch_tdep (gdbarch);
> 
> That'd essentially require touching again most lines you already touched, so, yeah, for some
> other rainy day...
> 

Hmm good idea.  Perhaps with some sed commands it might not be so bad, I'll see.

Simon

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] gdb: fix gdbarch_tdep ODR violation
  2021-11-15 16:29   ` Simon Marchi
@ 2021-11-15 20:42     ` will schmidt
  2021-11-15 20:43       ` Simon Marchi
  0 siblings, 1 reply; 10+ messages in thread
From: will schmidt @ 2021-11-15 20:42 UTC (permalink / raw)
  To: Simon Marchi, Luis Machado, Simon Marchi, gdb-patches, John Baldwin

On Mon, 2021-11-15 at 11:29 -0500, Simon Marchi wrote:
> On 2021-11-15 5:45 a.m., Luis Machado via Gdb-patches wrote:
> > LGTM
> 
> Thanks to you and John for taking a look, I pushed the patch.
> 
> Simon
> 

Hi, 

I'm now seeing a build failure on powerpc.  (specifically ppc64le, but
i'm not sure it will matter which powerpc variant). 

First failure is 

...
  CXX    ppc-linux-nat.o
ppc-linux-nat.c: In function ‘int ppc_register_u_addr(gdbarch*, int)’:
ppc-linux-nat.c:658:22: error: ‘struct gdbarch_tdep’ has no member
named ‘ppc_gp0_regnum’
  658 |   if (regno >= tdep->ppc_gp0_regnum
...


Assorted other no-such-member errors follow. 



Thanks,
-Will


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] gdb: fix gdbarch_tdep ODR violation
  2021-11-15 20:42     ` will schmidt
@ 2021-11-15 20:43       ` Simon Marchi
  2021-11-15 23:19         ` Luis Machado
  0 siblings, 1 reply; 10+ messages in thread
From: Simon Marchi @ 2021-11-15 20:43 UTC (permalink / raw)
  To: will schmidt, Simon Marchi, Luis Machado, gdb-patches, John Baldwin

On 2021-11-15 3:42 p.m., will schmidt wrote:
> On Mon, 2021-11-15 at 11:29 -0500, Simon Marchi wrote:
>> On 2021-11-15 5:45 a.m., Luis Machado via Gdb-patches wrote:
>>> LGTM
>>
>> Thanks to you and John for taking a look, I pushed the patch.
>>
>> Simon
>>
> 
> Hi, 
> 
> I'm now seeing a build failure on powerpc.  (specifically ppc64le, but
> i'm not sure it will matter which powerpc variant). 
> 
> First failure is 
> 
> ...
>   CXX    ppc-linux-nat.o
> ppc-linux-nat.c: In function ‘int ppc_register_u_addr(gdbarch*, int)’:
> ppc-linux-nat.c:658:22: error: ‘struct gdbarch_tdep’ has no member
> named ‘ppc_gp0_regnum’
>   658 |   if (regno >= tdep->ppc_gp0_regnum
> ...
> 
> 
> Assorted other no-such-member errors follow. 
> 
> 
> 
> Thanks,
> -Will
> 

Yeah, I kind of forgot to look for uses of gdbarch_tdep in native files,
which are not built by default on x86-64 :(.  I'm working on a patch to
fix all of them.

Simon

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] gdb: fix gdbarch_tdep ODR violation
  2021-11-15 20:43       ` Simon Marchi
@ 2021-11-15 23:19         ` Luis Machado
  2021-11-16  2:02           ` Simon Marchi
  0 siblings, 1 reply; 10+ messages in thread
From: Luis Machado @ 2021-11-15 23:19 UTC (permalink / raw)
  To: Simon Marchi, will schmidt, Simon Marchi, gdb-patches, John Baldwin

On 11/15/21 5:43 PM, Simon Marchi wrote:
> On 2021-11-15 3:42 p.m., will schmidt wrote:
>> On Mon, 2021-11-15 at 11:29 -0500, Simon Marchi wrote:
>>> On 2021-11-15 5:45 a.m., Luis Machado via Gdb-patches wrote:
>>>> LGTM
>>>
>>> Thanks to you and John for taking a look, I pushed the patch.
>>>
>>> Simon
>>>
>>
>> Hi,
>>
>> I'm now seeing a build failure on powerpc.  (specifically ppc64le, but
>> i'm not sure it will matter which powerpc variant).
>>
>> First failure is
>>
>> ...
>>    CXX    ppc-linux-nat.o
>> ppc-linux-nat.c: In function ‘int ppc_register_u_addr(gdbarch*, int)’:
>> ppc-linux-nat.c:658:22: error: ‘struct gdbarch_tdep’ has no member
>> named ‘ppc_gp0_regnum’
>>    658 |   if (regno >= tdep->ppc_gp0_regnum
>> ...
>>
>>
>> Assorted other no-such-member errors follow.
>>
>>
>>
>> Thanks,
>> -Will
>>
> 
> Yeah, I kind of forgot to look for uses of gdbarch_tdep in native files,
> which are not built by default on x86-64 :(.  I'm working on a patch to
> fix all of them.

Yeah. I do see some breakage for native arm/aarch64 as well. Do you 
think it might be easier to revert then re-validate the new patch. I 
suppose some targets are tricky to build native files for.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] gdb: fix gdbarch_tdep ODR violation
  2021-11-15 23:19         ` Luis Machado
@ 2021-11-16  2:02           ` Simon Marchi
  0 siblings, 0 replies; 10+ messages in thread
From: Simon Marchi @ 2021-11-16  2:02 UTC (permalink / raw)
  To: Luis Machado, will schmidt, Simon Marchi, gdb-patches, John Baldwin

On 2021-11-15 18:19, Luis Machado wrote:
> Yeah. I do see some breakage for native arm/aarch64 as well. Do you think it might be easier to revert then re-validate the new patch. I suppose some targets are tricky to build native files for.

I have a patch almost ready to send, I'm testing it on as many
configurations as I can reasonably can, then I'll push it.  For the
configurations I can't build, I'll do my best.  If there are still
errors, they should be obvious to fix.

Simon

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2021-11-16  2:02 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-11-12 20:42 [PATCH] gdb: fix gdbarch_tdep ODR violation Simon Marchi
2021-11-12 21:55 ` John Baldwin
2021-11-15 10:45 ` Luis Machado
2021-11-15 16:29   ` Simon Marchi
2021-11-15 20:42     ` will schmidt
2021-11-15 20:43       ` Simon Marchi
2021-11-15 23:19         ` Luis Machado
2021-11-16  2:02           ` Simon Marchi
2021-11-15 16:47 ` Pedro Alves
2021-11-15 16:53   ` Simon Marchi

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).