public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: Andrew Burgess <aburgess@redhat.com>
To: Simon Marchi <simon.marchi@efficios.com>, gdb-patches@sourceware.org
Cc: Simon Marchi <simon.marchi@polymtl.ca>
Subject: Re: [PATCH 05/12] gdb: make gdbarch_alloc take ownership of the tdep
Date: Tue, 06 Dec 2022 17:06:21 +0000	[thread overview]
Message-ID: <87sfhs31iq.fsf@redhat.com> (raw)
In-Reply-To: <20221206135729.3937767-6-simon.marchi@efficios.com>

Simon Marchi via Gdb-patches <gdb-patches@sourceware.org> writes:

> From: Simon Marchi <simon.marchi@polymtl.ca>
>
> It's currently not clear how the ownership of gdbarch_tdep objects
> works.  In fact, nothing ever takes ownership of it.  This is mostly
> fine because we never free gdbarch objects, and thus we never free
> gdbarch_tdep objects.  There is an exception to that however: when
> initialization fails, we do free the gdbarch object that is not going to
> be used, and we free the tdep too.  Currently, i386 and s390 do it.
>
> To make things clearer, change gdbarch_alloc so that it takes ownership
> of the tdep.  The tdep is thus automatically freed if the gdbarch is
> freed.
>
> Change all gdbarch initialization functions to pass a new gdbarch_tdep
> object to gdbarch_alloc and then retrieve a non-owning reference from
> the gdbarch object.
>
> Before this patch, the xtensa architecture had a single global instance
> of xtensa_gdbarch_tdep.  Since we need to pass a dynamically allocated
> gdbarch_tdep_base instance to gdbarch_alloc, remove this global
> instance, and dynamically allocate one as needed, like we do for all
> other architectures.  Make the `rmap` array externally visible and
> rename it to the less collision-prone `xtensa_rmap` name.

LGTM.

Thanks,
Andrew

>
> Change-Id: Id3d70493ef80ce4bdff701c57636f4c79ed8aea2
> ---
>  gdb/aarch64-tdep.c    |  5 +++--
>  gdb/alpha-tdep.c      |  7 +++----
>  gdb/arc-tdep.c        |  6 +++---
>  gdb/arch-utils.c      |  2 +-
>  gdb/arm-tdep.c        |  6 +++---
>  gdb/avr-tdep.c        |  6 +++---
>  gdb/bfin-tdep.c       |  6 +++---
>  gdb/bpf-tdep.c        |  4 ++--
>  gdb/cris-tdep.c       |  6 +++---
>  gdb/csky-tdep.c       |  7 ++++---
>  gdb/frv-tdep.c        | 15 ++++++++-------
>  gdb/ft32-tdep.c       |  6 +++---
>  gdb/gdbarch.c         |  6 +++---
>  gdb/gdbarch.h         |  5 ++++-
>  gdb/hppa-tdep.c       |  7 +++----
>  gdb/i386-tdep.c       |  7 +++----
>  gdb/ia64-tdep.c       |  7 +++----
>  gdb/lm32-tdep.c       |  6 ++----
>  gdb/loongarch-tdep.c  |  6 ++++--
>  gdb/m32c-tdep.c       |  5 ++---
>  gdb/m32r-tdep.c       |  6 ++----
>  gdb/m68hc11-tdep.c    |  7 ++++---
>  gdb/m68k-tdep.c       |  7 ++++---
>  gdb/mep-tdep.c        |  7 +++----
>  gdb/microblaze-tdep.c |  5 ++---
>  gdb/mips-tdep.c       |  7 ++++---
>  gdb/mn10300-tdep.c    |  6 +++---
>  gdb/moxie-tdep.c      |  6 ++----
>  gdb/msp430-tdep.c     |  7 ++++---
>  gdb/nds32-tdep.c      |  8 ++++----
>  gdb/nios2-tdep.c      |  6 +++---
>  gdb/or1k-tdep.c       |  7 ++++---
>  gdb/riscv-tdep.c      |  7 ++++---
>  gdb/rl78-tdep.c       |  7 ++++---
>  gdb/rs6000-tdep.c     |  8 ++++----
>  gdb/rx-tdep.c         |  7 ++++---
>  gdb/s12z-tdep.c       |  4 ++--
>  gdb/s390-tdep.c       | 13 +++++--------
>  gdb/s390-tdep.h       |  2 ++
>  gdb/sh-tdep.c         |  6 ++----
>  gdb/sparc-tdep.c      |  6 +++---
>  gdb/tic6x-tdep.c      |  6 +++---
>  gdb/v850-tdep.c       |  7 ++++---
>  gdb/xtensa-config.c   |  4 +---
>  gdb/xtensa-tdep.c     | 10 +++++-----
>  gdb/z80-tdep.c        |  6 +++---
>  46 files changed, 148 insertions(+), 149 deletions(-)
>
> diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c
> index cf20bb40b78..e59fcf726ae 100644
> --- a/gdb/aarch64-tdep.c
> +++ b/gdb/aarch64-tdep.c
> @@ -3664,8 +3664,9 @@ 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;
>  
> -  aarch64_gdbarch_tdep *tdep = new aarch64_gdbarch_tdep;
> -  struct gdbarch *gdbarch = gdbarch_alloc (&info, tdep);
> +  gdbarch *gdbarch
> +    = gdbarch_alloc (&info, gdbarch_tdep_up (new aarch64_gdbarch_tdep));
> +  aarch64_gdbarch_tdep *tdep = gdbarch_tdep<aarch64_gdbarch_tdep> (gdbarch);
>  
>    /* This should be low enough for everything.  */
>    tdep->lowest_pc = 0x20;
> diff --git a/gdb/alpha-tdep.c b/gdb/alpha-tdep.c
> index 99e51b8afec..2691c9d0055 100644
> --- a/gdb/alpha-tdep.c
> +++ b/gdb/alpha-tdep.c
> @@ -1719,15 +1719,14 @@ alpha_software_single_step (struct regcache *regcache)
>  static struct gdbarch *
>  alpha_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>  {
> -  struct gdbarch *gdbarch;
> -
>    /* Find a candidate among extant architectures.  */
>    arches = gdbarch_list_lookup_by_info (arches, &info);
>    if (arches != NULL)
>      return arches->gdbarch;
>  
> -  alpha_gdbarch_tdep *tdep = new alpha_gdbarch_tdep;
> -  gdbarch = gdbarch_alloc (&info, tdep);
> +  gdbarch *gdbarch
> +    = gdbarch_alloc (&info, gdbarch_tdep_up (new alpha_gdbarch_tdep));
> +  alpha_gdbarch_tdep *tdep = gdbarch_tdep<alpha_gdbarch_tdep> (gdbarch);
>  
>    /* Lowest text address.  This is used by heuristic_proc_start()
>       to decide when to stop looking.  */
> diff --git a/gdb/arc-tdep.c b/gdb/arc-tdep.c
> index 3ab0930bb29..a8c7bdab533 100644
> --- a/gdb/arc-tdep.c
> +++ b/gdb/arc-tdep.c
> @@ -2256,11 +2256,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.  */
> -  std::unique_ptr<arc_gdbarch_tdep> tdep_holder (new arc_gdbarch_tdep);
> -  arc_gdbarch_tdep *tdep = tdep_holder.get ();
> +  gdbarch *gdbarch
> +    = gdbarch_alloc (&info, gdbarch_tdep_up (new arc_gdbarch_tdep));
> +  arc_gdbarch_tdep *tdep = gdbarch_tdep<arc_gdbarch_tdep> (gdbarch);
>    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_holder.release ());
>  
>    /* Data types.  */
>    set_gdbarch_short_bit (gdbarch, 16);
> diff --git a/gdb/arch-utils.c b/gdb/arch-utils.c
> index dbe78647d5e..6afad9ef445 100644
> --- a/gdb/arch-utils.c
> +++ b/gdb/arch-utils.c
> @@ -1195,7 +1195,7 @@ gdbarch_tdep_1 (struct gdbarch *gdbarch)
>  {
>    if (gdbarch_debug >= 2)
>      gdb_printf (gdb_stdlog, "gdbarch_tdep_1 called\n");
> -  return gdbarch->tdep;
> +  return gdbarch->tdep.get ();
>  }
>  
>  registry<gdbarch> *
> diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c
> index 6f02f04b5cb..4ce8f08d908 100644
> --- a/gdb/arm-tdep.c
> +++ b/gdb/arm-tdep.c
> @@ -9990,7 +9990,6 @@ arm_get_pc_address_flags (frame_info_ptr frame, CORE_ADDR pc)
>  static struct gdbarch *
>  arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>  {
> -  struct gdbarch *gdbarch;
>    struct gdbarch_list *best_arch;
>    enum arm_abi_kind arm_abi = arm_abi_global;
>    enum arm_float_model fp_model = arm_fp_model;
> @@ -10534,8 +10533,9 @@ arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>    if (best_arch != NULL)
>      return best_arch->gdbarch;
>  
> -  arm_gdbarch_tdep *tdep = new arm_gdbarch_tdep;
> -  gdbarch = gdbarch_alloc (&info, tdep);
> +  gdbarch *gdbarch
> +    = gdbarch_alloc (&info, gdbarch_tdep_up (new arm_gdbarch_tdep));
> +  arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
>  
>    /* Record additional information about the architecture we are defining.
>       These are gdbarch discriminators, like the OSABI.  */
> diff --git a/gdb/avr-tdep.c b/gdb/avr-tdep.c
> index bac0b3f5008..80ab2750fa8 100644
> --- a/gdb/avr-tdep.c
> +++ b/gdb/avr-tdep.c
> @@ -1426,7 +1426,6 @@ avr_address_class_name_to_type_flags (struct gdbarch *gdbarch,
>  static struct gdbarch *
>  avr_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>  {
> -  struct gdbarch *gdbarch;
>    struct gdbarch_list *best_arch;
>    int call_length;
>  
> @@ -1466,8 +1465,9 @@ avr_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>      }
>  
>    /* None found, create a new architecture from the information provided.  */
> -  avr_gdbarch_tdep *tdep = new avr_gdbarch_tdep;
> -  gdbarch = gdbarch_alloc (&info, tdep);
> +  gdbarch *gdbarch
> +    = gdbarch_alloc (&info, gdbarch_tdep_up (new avr_gdbarch_tdep));
> +  avr_gdbarch_tdep *tdep = gdbarch_tdep<avr_gdbarch_tdep> (gdbarch);
>    
>    tdep->call_length = call_length;
>  
> diff --git a/gdb/bfin-tdep.c b/gdb/bfin-tdep.c
> index f751e278211..0f2b0021bdf 100644
> --- a/gdb/bfin-tdep.c
> +++ b/gdb/bfin-tdep.c
> @@ -778,7 +778,6 @@ bfin_abi (struct gdbarch *gdbarch)
>  static struct gdbarch *
>  bfin_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>  {
> -  struct gdbarch *gdbarch;
>    enum bfin_abi abi;
>  
>    abi = BFIN_ABI_FLAT;
> @@ -798,8 +797,9 @@ bfin_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>        return arches->gdbarch;
>      }
>  
> -  bfin_gdbarch_tdep *tdep = new bfin_gdbarch_tdep;
> -  gdbarch = gdbarch_alloc (&info, tdep);
> +  gdbarch *gdbarch
> +    = gdbarch_alloc (&info, gdbarch_tdep_up (new bfin_gdbarch_tdep));
> +  bfin_gdbarch_tdep *tdep = gdbarch_tdep<bfin_gdbarch_tdep> (gdbarch);
>  
>    tdep->bfin_abi = abi;
>  
> diff --git a/gdb/bpf-tdep.c b/gdb/bpf-tdep.c
> index ea7c1147378..09d1545a4b8 100644
> --- a/gdb/bpf-tdep.c
> +++ b/gdb/bpf-tdep.c
> @@ -321,8 +321,8 @@ bpf_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>      return arches->gdbarch;
>  
>    /* Allocate space for the new architecture.  */
> -  bpf_gdbarch_tdep *tdep = new bpf_gdbarch_tdep;
> -  struct gdbarch *gdbarch = gdbarch_alloc (&info, tdep);
> +  gdbarch *gdbarch
> +    = gdbarch_alloc (&info, gdbarch_tdep_up (new bpf_gdbarch_tdep));
>  
>    /* Information about registers, etc.  */
>    set_gdbarch_num_regs (gdbarch, BPF_NUM_REGS);
> diff --git a/gdb/cris-tdep.c b/gdb/cris-tdep.c
> index d38850aa1af..55cef2606c2 100644
> --- a/gdb/cris-tdep.c
> +++ b/gdb/cris-tdep.c
> @@ -3912,7 +3912,6 @@ set_cris_dwarf2_cfi (const char *ignore_args, int from_tty,
>  static struct gdbarch *
>  cris_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>  {
> -  struct gdbarch *gdbarch;
>    unsigned int cris_version;
>  
>    if (usr_cmd_cris_version_valid)
> @@ -3948,9 +3947,10 @@ cris_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>      }
>  
>    /* No matching architecture was found.  Create a new one.  */
> -  cris_gdbarch_tdep *tdep = new cris_gdbarch_tdep;
>    info.byte_order = BFD_ENDIAN_LITTLE;
> -  gdbarch = gdbarch_alloc (&info, tdep);
> +  gdbarch *gdbarch
> +    = gdbarch_alloc (&info, gdbarch_tdep_up (new cris_gdbarch_tdep));
> +  cris_gdbarch_tdep *tdep = gdbarch_tdep<cris_gdbarch_tdep> (gdbarch);
>  
>    tdep->cris_version = usr_cmd_cris_version;
>    tdep->cris_mode = usr_cmd_cris_mode;
> diff --git a/gdb/csky-tdep.c b/gdb/csky-tdep.c
> index f293d204da2..5b3536f86fe 100644
> --- a/gdb/csky-tdep.c
> +++ b/gdb/csky-tdep.c
> @@ -2671,7 +2671,6 @@ csky_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
>  static struct gdbarch *
>  csky_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>  {
> -  struct gdbarch *gdbarch;
>    /* Analyze info.abfd.  */
>    unsigned int fpu_abi = 0;
>    unsigned int vdsp_version = 0;
> @@ -2761,8 +2760,10 @@ csky_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>  
>    /* None found, create a new architecture from the information
>       provided.  */
> -  csky_gdbarch_tdep *tdep = new csky_gdbarch_tdep;
> -  gdbarch = gdbarch_alloc (&info, tdep);
> +  gdbarch *gdbarch
> +    = gdbarch_alloc (&info, gdbarch_tdep_up (new csky_gdbarch_tdep));
> +  csky_gdbarch_tdep *tdep = gdbarch_tdep<csky_gdbarch_tdep> (gdbarch);
> +
>    tdep->fpu_abi = fpu_abi;
>    tdep->vdsp_version = vdsp_version;
>    tdep->fpu_hardfp = fpu_hardfp;
> diff --git a/gdb/frv-tdep.c b/gdb/frv-tdep.c
> index 056aad3f17e..eacfb6efb14 100644
> --- a/gdb/frv-tdep.c
> +++ b/gdb/frv-tdep.c
> @@ -89,6 +89,8 @@ struct frv_gdbarch_tdep : gdbarch_tdep_base
>    const char **register_names = nullptr;
>  };
>  
> +using frv_gdbarch_tdep_up = std::unique_ptr<frv_gdbarch_tdep>;
> +
>  /* Return the FR-V ABI associated with GDBARCH.  */
>  enum frv_abi
>  frv_abi (struct gdbarch *gdbarch)
> @@ -130,12 +132,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 frv_gdbarch_tdep *
> -new_variant (void)
> +static frv_gdbarch_tdep_up
> +new_variant ()
>  {
>    int r;
>  
> -  frv_gdbarch_tdep *var = new frv_gdbarch_tdep;
> +  frv_gdbarch_tdep_up var (new frv_gdbarch_tdep);
>  
>    var->frv_abi = FRV_ABI_EABI;
>    var->num_gprs = 64;
> @@ -1427,7 +1429,6 @@ static const struct frame_base frv_frame_base = {
>  static struct gdbarch *
>  frv_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>  {
> -  struct gdbarch *gdbarch;
>    int elf_flags = 0;
>  
>    /* Check to see if we've already built an appropriate architecture
> @@ -1437,7 +1438,9 @@ frv_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>      return arches->gdbarch;
>  
>    /* Select the right tdep structure for this variant.  */
> -  frv_gdbarch_tdep *var = new_variant ();
> +  gdbarch *gdbarch = gdbarch_alloc (&info, new_variant ());
> +  frv_gdbarch_tdep *var = gdbarch_tdep<frv_gdbarch_tdep> (gdbarch);
> +
>    switch (info.bfd_arch_info->mach)
>      {
>      case bfd_mach_frv:
> @@ -1471,8 +1474,6 @@ frv_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>    if (elf_flags & EF_FRV_CPU_FR450)
>      set_variant_scratch_registers (var);
>  
> -  gdbarch = gdbarch_alloc (&info, var);
> -
>    set_gdbarch_short_bit (gdbarch, 16);
>    set_gdbarch_int_bit (gdbarch, 32);
>    set_gdbarch_long_bit (gdbarch, 32);
> diff --git a/gdb/ft32-tdep.c b/gdb/ft32-tdep.c
> index 8da3dbae592..0be8a95f298 100644
> --- a/gdb/ft32-tdep.c
> +++ b/gdb/ft32-tdep.c
> @@ -558,7 +558,6 @@ static const struct frame_base ft32_frame_base =
>  static struct gdbarch *
>  ft32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>  {
> -  struct gdbarch *gdbarch;
>    struct type *void_type;
>    struct type *func_void_type;
>  
> @@ -568,8 +567,9 @@ ft32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>      return arches->gdbarch;
>  
>    /* Allocate space for the new architecture.  */
> -  ft32_gdbarch_tdep *tdep = new ft32_gdbarch_tdep;
> -  gdbarch = gdbarch_alloc (&info, tdep);
> +  gdbarch *gdbarch
> +    = gdbarch_alloc (&info, gdbarch_tdep_up (new ft32_gdbarch_tdep));
> +  ft32_gdbarch_tdep *tdep = gdbarch_tdep<ft32_gdbarch_tdep> (gdbarch);
>  
>    /* Create a type for PC.  We can't use builtin types here, as they may not
>       be defined.  */
> diff --git a/gdb/gdbarch.c b/gdb/gdbarch.c
> index 74c12c5e3ff..e4ca74eb44b 100644
> --- a/gdb/gdbarch.c
> +++ b/gdb/gdbarch.c
> @@ -45,7 +45,7 @@ struct gdbarch
>    const struct target_desc * target_desc;
>  
>    /* target specific vector.  */
> -  struct gdbarch_tdep_base *tdep = nullptr;
> +  gdbarch_tdep_up tdep;
>    gdbarch_dump_tdep_ftype *dump_tdep = nullptr;
>  
>    /* per-architecture data-pointers.  */
> @@ -262,13 +262,13 @@ struct gdbarch
>  
>  struct gdbarch *
>  gdbarch_alloc (const struct gdbarch_info *info,
> -	       struct gdbarch_tdep_base *tdep)
> +	       gdbarch_tdep_up tdep)
>  {
>    struct gdbarch *gdbarch;
>  
>    gdbarch = new struct gdbarch;
>  
> -  gdbarch->tdep = tdep;
> +  gdbarch->tdep = std::move (tdep);
>  
>    gdbarch->bfd_arch_info = info->bfd_arch_info;
>    gdbarch->byte_order = info->byte_order;
> diff --git a/gdb/gdbarch.h b/gdb/gdbarch.h
> index aea6c4335d9..196c7981450 100644
> --- a/gdb/gdbarch.h
> +++ b/gdb/gdbarch.h
> @@ -69,6 +69,8 @@ struct gdbarch_tdep_base
>    virtual ~gdbarch_tdep_base() = default;
>  };
>  
> +using gdbarch_tdep_up = std::unique_ptr<gdbarch_tdep_base>;
> +
>  /* The architecture associated with the inferior through the
>     connection to the target.
>  
> @@ -294,7 +296,8 @@ extern struct gdbarch_list *gdbarch_list_lookup_by_info (struct gdbarch_list *ar
>     parameters.  set_gdbarch_*() functions are called to complete the
>     initialization of the object.  */
>  
> -extern struct gdbarch *gdbarch_alloc (const struct gdbarch_info *info, struct gdbarch_tdep_base *tdep);
> +extern struct gdbarch *gdbarch_alloc (const struct gdbarch_info *info,
> +				      gdbarch_tdep_up tdep);
>  
>  
>  /* Helper function.  Free a partially-constructed ``struct gdbarch''.
> diff --git a/gdb/hppa-tdep.c b/gdb/hppa-tdep.c
> index fb4c4b42eab..da5f025d4d4 100644
> --- a/gdb/hppa-tdep.c
> +++ b/gdb/hppa-tdep.c
> @@ -2982,16 +2982,15 @@ hppa_skip_trampoline_code (frame_info_ptr frame, CORE_ADDR pc)
>  static struct gdbarch *
>  hppa_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>  {
> -  struct gdbarch *gdbarch;
> -
>    /* find a candidate among the list of pre-declared architectures.  */
>    arches = gdbarch_list_lookup_by_info (arches, &info);
>    if (arches != NULL)
>      return (arches->gdbarch);
>  
>    /* If none found, then allocate and initialize one.  */
> -  hppa_gdbarch_tdep *tdep = new hppa_gdbarch_tdep;
> -  gdbarch = gdbarch_alloc (&info, tdep);
> +  gdbarch *gdbarch
> +    = gdbarch_alloc (&info, gdbarch_tdep_up (new hppa_gdbarch_tdep));
> +  hppa_gdbarch_tdep *tdep = gdbarch_tdep<hppa_gdbarch_tdep> (gdbarch);
>  
>    /* Determine from the bfd_arch_info structure if we are dealing with
>       a 32 or 64 bits architecture.  If the bfd_arch_info is not available,
> diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c
> index e027df2b9c5..ea7f5b3e2b7 100644
> --- a/gdb/i386-tdep.c
> +++ b/gdb/i386-tdep.c
> @@ -8443,7 +8443,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 *gdbarch;
>    const struct target_desc *tdesc;
>    int mm0_regnum;
>    int ymm0_regnum;
> @@ -8456,8 +8455,9 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>      return arches->gdbarch;
>  
>    /* Allocate space for the new architecture.  Assume i386 for now.  */
> -  i386_gdbarch_tdep *tdep = new i386_gdbarch_tdep;
> -  gdbarch = gdbarch_alloc (&info, tdep);
> +  gdbarch *gdbarch
> +    = gdbarch_alloc (&info, gdbarch_tdep_up (new i386_gdbarch_tdep));
> +  i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch);
>  
>    /* General-purpose registers.  */
>    tdep->gregset_reg_offset = NULL;
> @@ -8700,7 +8700,6 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>  
>    if (!i386_validate_tdesc_p (tdep, tdesc_data.get ()))
>      {
> -      delete tdep;
>        gdbarch_free (gdbarch);
>        return NULL;
>      }
> diff --git a/gdb/ia64-tdep.c b/gdb/ia64-tdep.c
> index 519c956e169..35ae7ab8c46 100644
> --- a/gdb/ia64-tdep.c
> +++ b/gdb/ia64-tdep.c
> @@ -3918,15 +3918,14 @@ ia64_size_of_register_frame (frame_info_ptr this_frame, ULONGEST cfm)
>  static struct gdbarch *
>  ia64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>  {
> -  struct gdbarch *gdbarch;
> -
>    /* If there is already a candidate, use it.  */
>    arches = gdbarch_list_lookup_by_info (arches, &info);
>    if (arches != NULL)
>      return arches->gdbarch;
>  
> -  ia64_gdbarch_tdep *tdep = new ia64_gdbarch_tdep;
> -  gdbarch = gdbarch_alloc (&info, tdep);
> +  gdbarch *gdbarch
> +    = gdbarch_alloc (&info, gdbarch_tdep_up (new ia64_gdbarch_tdep));
> +  ia64_gdbarch_tdep *tdep = gdbarch_tdep<ia64_gdbarch_tdep> (gdbarch);
>  
>    tdep->size_of_register_frame = ia64_size_of_register_frame;
>  
> diff --git a/gdb/lm32-tdep.c b/gdb/lm32-tdep.c
> index dd601320c3a..f534b626ffb 100644
> --- a/gdb/lm32-tdep.c
> +++ b/gdb/lm32-tdep.c
> @@ -479,16 +479,14 @@ lm32_frame_align (struct gdbarch *gdbarch, CORE_ADDR sp)
>  static struct gdbarch *
>  lm32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>  {
> -  struct gdbarch *gdbarch;
> -
>    /* If there is already a candidate, use it.  */
>    arches = gdbarch_list_lookup_by_info (arches, &info);
>    if (arches != NULL)
>      return arches->gdbarch;
>  
>    /* None found, create a new architecture from the information provided.  */
> -  lm32_gdbarch_tdep *tdep = new lm32_gdbarch_tdep;
> -  gdbarch = gdbarch_alloc (&info, tdep);
> +  gdbarch *gdbarch
> +    = gdbarch_alloc (&info, gdbarch_tdep_up (new lm32_gdbarch_tdep));
>  
>    /* Type sizes.  */
>    set_gdbarch_short_bit (gdbarch, 16);
> diff --git a/gdb/loongarch-tdep.c b/gdb/loongarch-tdep.c
> index d727bc85062..62630c34434 100644
> --- a/gdb/loongarch-tdep.c
> +++ b/gdb/loongarch-tdep.c
> @@ -1441,7 +1441,6 @@ loongarch_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>    size_t regnum = 0;
>    struct loongarch_gdbarch_features features;
>    tdesc_arch_data_up tdesc_data = tdesc_data_alloc ();
> -  loongarch_gdbarch_tdep *tdep = new loongarch_gdbarch_tdep;
>    const struct target_desc *tdesc = info.target_desc;
>  
>    /* Ensure we always have a target description.  */
> @@ -1531,7 +1530,10 @@ loongarch_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>      return arches->gdbarch;
>  
>    /* None found, so create a new architecture from the information provided.  */
> -  struct gdbarch *gdbarch = gdbarch_alloc (&info, tdep);
> +  gdbarch *gdbarch
> +    = gdbarch_alloc (&info, gdbarch_tdep_up (new loongarch_gdbarch_tdep));
> +  loongarch_gdbarch_tdep *tdep = gdbarch_tdep<loongarch_gdbarch_tdep> (gdbarch);
> +
>    tdep->abi_features = abi_features;
>  
>    /* Target data types.  */
> diff --git a/gdb/m32c-tdep.c b/gdb/m32c-tdep.c
> index f5101635aed..552eaccf440 100644
> --- a/gdb/m32c-tdep.c
> +++ b/gdb/m32c-tdep.c
> @@ -2587,7 +2587,6 @@ m32c_virtual_frame_pointer (struct gdbarch *gdbarch, CORE_ADDR pc,
>  static struct gdbarch *
>  m32c_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>  {
> -  struct gdbarch *gdbarch;
>    unsigned long mach = info.bfd_arch_info->mach;
>  
>    /* Find a candidate among the list of architectures we've created
> @@ -2597,8 +2596,8 @@ m32c_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>         arches = gdbarch_list_lookup_by_info (arches->next, &info))
>      return arches->gdbarch;
>  
> -  m32c_gdbarch_tdep *tdep = new m32c_gdbarch_tdep;
> -  gdbarch = gdbarch_alloc (&info, tdep);
> +  gdbarch *gdbarch
> +    = gdbarch_alloc (&info, gdbarch_tdep_up (new m32c_gdbarch_tdep));
>  
>    /* Essential types.  */
>    make_types (gdbarch);
> diff --git a/gdb/m32r-tdep.c b/gdb/m32r-tdep.c
> index fc304757a60..d9e19654a6a 100644
> --- a/gdb/m32r-tdep.c
> +++ b/gdb/m32r-tdep.c
> @@ -861,16 +861,14 @@ static gdbarch_init_ftype m32r_gdbarch_init;
>  static struct gdbarch *
>  m32r_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>  {
> -  struct gdbarch *gdbarch;
> -
>    /* If there is already a candidate, use it.  */
>    arches = gdbarch_list_lookup_by_info (arches, &info);
>    if (arches != NULL)
>      return arches->gdbarch;
>  
>    /* Allocate space for the new architecture.  */
> -  m32r_gdbarch_tdep *tdep = new m32r_gdbarch_tdep;
> -  gdbarch = gdbarch_alloc (&info, tdep);
> +  gdbarch *gdbarch
> +    = gdbarch_alloc (&info, gdbarch_tdep_up (new m32r_gdbarch_tdep));
>  
>    set_gdbarch_wchar_bit (gdbarch, 16);
>    set_gdbarch_wchar_signed (gdbarch, 0);
> diff --git a/gdb/m68hc11-tdep.c b/gdb/m68hc11-tdep.c
> index c48fe4424b6..e59e6638042 100644
> --- a/gdb/m68hc11-tdep.c
> +++ b/gdb/m68hc11-tdep.c
> @@ -1396,7 +1396,6 @@ static struct gdbarch *
>  m68hc11_gdbarch_init (struct gdbarch_info info,
>  		      struct gdbarch_list *arches)
>  {
> -  struct gdbarch *gdbarch;
>    int elf_flags;
>  
>    soft_reg_initialized = 0;
> @@ -1423,8 +1422,10 @@ m68hc11_gdbarch_init (struct gdbarch_info info,
>      }
>  
>    /* Need a new architecture.  Fill in a target specific vector.  */
> -  m68gc11_gdbarch_tdep *tdep = new m68gc11_gdbarch_tdep;
> -  gdbarch = gdbarch_alloc (&info, tdep);
> +  gdbarch *gdbarch
> +    = gdbarch_alloc (&info, gdbarch_tdep_up (new m68gc11_gdbarch_tdep));
> +  m68gc11_gdbarch_tdep *tdep = gdbarch_tdep<m68gc11_gdbarch_tdep> (gdbarch);
> +
>    tdep->elf_flags = elf_flags;
>  
>    switch (info.bfd_arch_info->arch)
> diff --git a/gdb/m68k-tdep.c b/gdb/m68k-tdep.c
> index c0a33118814..4556c80ff6a 100644
> --- a/gdb/m68k-tdep.c
> +++ b/gdb/m68k-tdep.c
> @@ -1131,7 +1131,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 *gdbarch;
>    struct gdbarch_list *best_arch;
>    tdesc_arch_data_up tdesc_data;
>    int i;
> @@ -1248,8 +1247,10 @@ m68k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>    if (best_arch != NULL)
>      return best_arch->gdbarch;
>  
> -  m68k_gdbarch_tdep *tdep = new m68k_gdbarch_tdep;
> -  gdbarch = gdbarch_alloc (&info, tdep);
> +  gdbarch *gdbarch
> +    = gdbarch_alloc (&info, gdbarch_tdep_up (new m68k_gdbarch_tdep));
> +  m68k_gdbarch_tdep *tdep = gdbarch_tdep<m68k_gdbarch_tdep> (gdbarch);
> +
>    tdep->fpregs_present = has_fp;
>    tdep->float_return = float_return;
>    tdep->flavour = flavour;
> diff --git a/gdb/mep-tdep.c b/gdb/mep-tdep.c
> index a6416085fe4..8b2d83b0c42 100644
> --- a/gdb/mep-tdep.c
> +++ b/gdb/mep-tdep.c
> @@ -2331,8 +2331,6 @@ mep_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
>  static struct gdbarch *
>  mep_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>  {
> -  struct gdbarch *gdbarch;
> -
>    /* Which me_module are we building a gdbarch object for?  */
>    CONFIG_ATTR me_module;
>  
> @@ -2397,8 +2395,9 @@ mep_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>  	return arches->gdbarch;
>      }
>  
> -  mep_gdbarch_tdep *tdep = new mep_gdbarch_tdep;
> -  gdbarch = gdbarch_alloc (&info, tdep);
> +  gdbarch *gdbarch
> +    = gdbarch_alloc (&info, gdbarch_tdep_up (new mep_gdbarch_tdep));
> +  mep_gdbarch_tdep *tdep = gdbarch_tdep<mep_gdbarch_tdep> (gdbarch);
>  
>    /* Get a CGEN CPU descriptor for this architecture.  */
>    {
> diff --git a/gdb/microblaze-tdep.c b/gdb/microblaze-tdep.c
> index efa1daaa7fc..6c7f5fe71a3 100644
> --- a/gdb/microblaze-tdep.c
> +++ b/gdb/microblaze-tdep.c
> @@ -637,7 +637,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 *gdbarch;
>    tdesc_arch_data_up tdesc_data;
>    const struct target_desc *tdesc = info.target_desc;
>  
> @@ -683,8 +682,8 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>      }
>  
>    /* Allocate space for the new architecture.  */
> -  microblaze_gdbarch_tdep *tdep = new microblaze_gdbarch_tdep;
> -  gdbarch = gdbarch_alloc (&info, tdep);
> +  gdbarch *gdbarch
> +    = gdbarch_alloc (&info, gdbarch_tdep_up (new microblaze_gdbarch_tdep));
>  
>    set_gdbarch_long_double_bit (gdbarch, 128);
>  
> diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c
> index 8c1643585f4..e9432eb760f 100644
> --- a/gdb/mips-tdep.c
> +++ b/gdb/mips-tdep.c
> @@ -8075,7 +8075,6 @@ value_of_mips_user_reg (frame_info_ptr frame, const void *baton)
>  static struct gdbarch *
>  mips_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>  {
> -  struct gdbarch *gdbarch;
>    int elf_flags;
>    enum mips_abi mips_abi, found_abi, wanted_abi;
>    int i, num_regs;
> @@ -8475,8 +8474,10 @@ mips_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>      }
>  
>    /* Need a new architecture.  Fill in a target specific vector.  */
> -  mips_gdbarch_tdep *tdep = new mips_gdbarch_tdep;
> -  gdbarch = gdbarch_alloc (&info, tdep);
> +  gdbarch *gdbarch
> +    = gdbarch_alloc (&info, gdbarch_tdep_up (new mips_gdbarch_tdep));
> +  mips_gdbarch_tdep *tdep = gdbarch_tdep<mips_gdbarch_tdep> (gdbarch);
> +
>    tdep->elf_flags = elf_flags;
>    tdep->mips64_transfers_32bit_regs_p = mips64_transfers_32bit_regs_p;
>    tdep->found_abi = found_abi;
> diff --git a/gdb/mn10300-tdep.c b/gdb/mn10300-tdep.c
> index 815949c67ae..b85845ded12 100644
> --- a/gdb/mn10300-tdep.c
> +++ b/gdb/mn10300-tdep.c
> @@ -1332,15 +1332,15 @@ static struct gdbarch *
>  mn10300_gdbarch_init (struct gdbarch_info info,
>  		      struct gdbarch_list *arches)
>  {
> -  struct gdbarch *gdbarch;
>    int num_regs;
>  
>    arches = gdbarch_list_lookup_by_info (arches, &info);
>    if (arches != NULL)
>      return arches->gdbarch;
>  
> -  mn10300_gdbarch_tdep *tdep = new mn10300_gdbarch_tdep;
> -  gdbarch = gdbarch_alloc (&info, tdep);
> +  gdbarch *gdbarch
> +    = gdbarch_alloc (&info, gdbarch_tdep_up (new mn10300_gdbarch_tdep));
> +  mn10300_gdbarch_tdep *tdep = gdbarch_tdep<mn10300_gdbarch_tdep> (gdbarch);
>  
>    switch (info.bfd_arch_info->mach)
>      {
> diff --git a/gdb/moxie-tdep.c b/gdb/moxie-tdep.c
> index f1841e4e57e..cd8d7d648bc 100644
> --- a/gdb/moxie-tdep.c
> +++ b/gdb/moxie-tdep.c
> @@ -1049,16 +1049,14 @@ moxie_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
>  static struct gdbarch *
>  moxie_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>  {
> -  struct gdbarch *gdbarch;
> -
>    /* If there is already a candidate, use it.  */
>    arches = gdbarch_list_lookup_by_info (arches, &info);
>    if (arches != NULL)
>      return arches->gdbarch;
>  
>    /* Allocate space for the new architecture.  */
> -  moxie_gdbarch_tdep *tdep = new moxie_gdbarch_tdep;
> -  gdbarch = gdbarch_alloc (&info, tdep);
> +  gdbarch *gdbarch
> +    = gdbarch_alloc (&info, gdbarch_tdep_up (new moxie_gdbarch_tdep));
>  
>    set_gdbarch_wchar_bit (gdbarch, 32);
>    set_gdbarch_wchar_signed (gdbarch, 0);
> diff --git a/gdb/msp430-tdep.c b/gdb/msp430-tdep.c
> index 54554247230..5efb081a450 100644
> --- a/gdb/msp430-tdep.c
> +++ b/gdb/msp430-tdep.c
> @@ -835,7 +835,6 @@ msp430_skip_trampoline_code (frame_info_ptr frame, CORE_ADDR pc)
>  static struct gdbarch *
>  msp430_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>  {
> -  struct gdbarch *gdbarch;
>    int elf_flags, isa, code_model;
>  
>    /* Extract the elf_flags if available.  */
> @@ -917,8 +916,10 @@ msp430_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>  
>    /* None found, create a new architecture from the information
>       provided.  */
> -  msp430_gdbarch_tdep *tdep = new msp430_gdbarch_tdep;
> -  gdbarch = gdbarch_alloc (&info, tdep);
> +  gdbarch *gdbarch
> +    = gdbarch_alloc (&info, gdbarch_tdep_up (new msp430_gdbarch_tdep));
> +  msp430_gdbarch_tdep *tdep = gdbarch_tdep<msp430_gdbarch_tdep> (gdbarch);
> +
>    tdep->elf_flags = elf_flags;
>    tdep->isa = isa;
>    tdep->code_model = code_model;
> diff --git a/gdb/nds32-tdep.c b/gdb/nds32-tdep.c
> index 4ab91e67f06..0ace593831f 100644
> --- a/gdb/nds32-tdep.c
> +++ b/gdb/nds32-tdep.c
> @@ -1940,7 +1940,6 @@ nds32_validate_tdesc_p (const struct target_desc *tdesc,
>  static struct gdbarch *
>  nds32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>  {
> -  struct gdbarch *gdbarch;
>    struct gdbarch_list *best_arch;
>    tdesc_arch_data_up tdesc_data;
>    const struct target_desc *tdesc = info.target_desc;
> @@ -1981,14 +1980,15 @@ nds32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>      return NULL;
>  
>    /* Allocate space for the new architecture.  */
> -  nds32_gdbarch_tdep *tdep = new nds32_gdbarch_tdep;
> +  gdbarch *gdbarch
> +    = gdbarch_alloc (&info, gdbarch_tdep_up (new nds32_gdbarch_tdep));
> +  nds32_gdbarch_tdep *tdep = gdbarch_tdep<nds32_gdbarch_tdep> (gdbarch);
> +
>    tdep->fpu_freg = fpu_freg;
>    tdep->use_pseudo_fsrs = use_pseudo_fsrs;
>    tdep->fs0_regnum = -1;
>    tdep->elf_abi = elf_abi;
>  
> -  gdbarch = gdbarch_alloc (&info, tdep);
> -
>    set_gdbarch_wchar_bit (gdbarch, 16);
>    set_gdbarch_wchar_signed (gdbarch, 0);
>  
> diff --git a/gdb/nios2-tdep.c b/gdb/nios2-tdep.c
> index effa10bf97e..4c8e86165da 100644
> --- a/gdb/nios2-tdep.c
> +++ b/gdb/nios2-tdep.c
> @@ -2274,7 +2274,6 @@ nios2_gcc_target_options (struct gdbarch *gdbarch)
>  static struct gdbarch *
>  nios2_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>  {
> -  struct gdbarch *gdbarch;
>    int i;
>    tdesc_arch_data_up tdesc_data;
>    const struct target_desc *tdesc = info.target_desc;
> @@ -2312,8 +2311,9 @@ nios2_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>  
>    /* None found, create a new architecture from the information
>       provided.  */
> -  nios2_gdbarch_tdep *tdep = new nios2_gdbarch_tdep;
> -  gdbarch = gdbarch_alloc (&info, tdep);
> +  gdbarch *gdbarch
> +    = gdbarch_alloc (&info, gdbarch_tdep_up (new nios2_gdbarch_tdep));
> +  nios2_gdbarch_tdep *tdep = gdbarch_tdep<nios2_gdbarch_tdep> (gdbarch);
>  
>    /* longjmp support not enabled by default.  */
>    tdep->jb_pc = -1;
> diff --git a/gdb/or1k-tdep.c b/gdb/or1k-tdep.c
> index efaf8745482..5394e7c2211 100644
> --- a/gdb/or1k-tdep.c
> +++ b/gdb/or1k-tdep.c
> @@ -1142,7 +1142,6 @@ static const struct frame_unwind or1k_frame_unwind = {
>  static struct gdbarch *
>  or1k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>  {
> -  struct gdbarch *gdbarch;
>    const struct bfd_arch_info *binfo;
>    tdesc_arch_data_up tdesc_data;
>    const struct target_desc *tdesc = info.target_desc;
> @@ -1157,10 +1156,12 @@ 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;
> -  or1k_gdbarch_tdep *tdep = new or1k_gdbarch_tdep;
> +  gdbarch *gdbarch
> +    = gdbarch_alloc (&info, gdbarch_tdep_up (new or1k_gdbarch_tdep));
> +  or1k_gdbarch_tdep *tdep = gdbarch_tdep<or1k_gdbarch_tdep> (gdbarch);
> +
>    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);
>  
>    /* Target data types */
>    set_gdbarch_short_bit (gdbarch, 16);
> diff --git a/gdb/riscv-tdep.c b/gdb/riscv-tdep.c
> index 0a050b272ff..d5133493b63 100644
> --- a/gdb/riscv-tdep.c
> +++ b/gdb/riscv-tdep.c
> @@ -3783,7 +3783,6 @@ static struct gdbarch *
>  riscv_gdbarch_init (struct gdbarch_info info,
>  		    struct gdbarch_list *arches)
>  {
> -  struct gdbarch *gdbarch;
>    struct riscv_gdbarch_features features;
>    const struct target_desc *tdesc = info.target_desc;
>  
> @@ -3869,8 +3868,10 @@ riscv_gdbarch_init (struct gdbarch_info info,
>      return arches->gdbarch;
>  
>    /* None found, so create a new architecture from the information provided.  */
> -  riscv_gdbarch_tdep *tdep = new riscv_gdbarch_tdep;
> -  gdbarch = gdbarch_alloc (&info, tdep);
> +  gdbarch *gdbarch
> +    = gdbarch_alloc (&info, gdbarch_tdep_up (new riscv_gdbarch_tdep));
> +  riscv_gdbarch_tdep *tdep = gdbarch_tdep<riscv_gdbarch_tdep> (gdbarch);
> +
>    tdep->isa_features = features;
>    tdep->abi_features = abi_features;
>  
> diff --git a/gdb/rl78-tdep.c b/gdb/rl78-tdep.c
> index 206b9e2794f..edabc7d8602 100644
> --- a/gdb/rl78-tdep.c
> +++ b/gdb/rl78-tdep.c
> @@ -1375,7 +1375,6 @@ rl78_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
>  static struct gdbarch *
>  rl78_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>  {
> -  struct gdbarch *gdbarch;
>    int elf_flags;
>  
>    /* Extract the elf_flags if available.  */
> @@ -1403,8 +1402,10 @@ rl78_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>  
>    /* None found, create a new architecture from the information
>       provided.  */
> -  rl78_gdbarch_tdep * tdep = new rl78_gdbarch_tdep;
> -  gdbarch = gdbarch_alloc (&info, tdep);
> +  gdbarch *gdbarch
> +    = gdbarch_alloc (&info, gdbarch_tdep_up (new rl78_gdbarch_tdep));
> +  rl78_gdbarch_tdep *tdep = gdbarch_tdep<rl78_gdbarch_tdep> (gdbarch);
> +
>    tdep->elf_flags = elf_flags;
>  
>    /* Initialize types.  */
> diff --git a/gdb/rs6000-tdep.c b/gdb/rs6000-tdep.c
> index cbd84514795..52e4a5a7dd9 100644
> --- a/gdb/rs6000-tdep.c
> +++ b/gdb/rs6000-tdep.c
> @@ -7471,7 +7471,6 @@ rs6000_program_breakpoint_here_p (gdbarch *gdbarch, CORE_ADDR address)
>  static struct gdbarch *
>  rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>  {
> -  struct gdbarch *gdbarch;
>    int wordsize, from_xcoff_exec, from_elf_exec;
>    enum bfd_architecture arch;
>    unsigned long mach;
> @@ -8179,15 +8178,16 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>         - "set arch"		trust blindly
>         - GDB startup		useless but harmless */
>  
> -  ppc_gdbarch_tdep *tdep = new ppc_gdbarch_tdep;
> +  gdbarch *gdbarch
> +    = gdbarch_alloc (&info, gdbarch_tdep_up (new ppc_gdbarch_tdep));
> +  ppc_gdbarch_tdep *tdep = gdbarch_tdep<ppc_gdbarch_tdep> (gdbarch);
> +
>    tdep->wordsize = wordsize;
>    tdep->elf_abi = elf_abi;
>    tdep->soft_float = soft_float;
>    tdep->long_double_abi = long_double_abi;
>    tdep->vector_abi = vector_abi;
>  
> -  gdbarch = gdbarch_alloc (&info, tdep);
> -
>    tdep->ppc_gp0_regnum = PPC_R0_REGNUM;
>    tdep->ppc_toc_regnum = PPC_R0_REGNUM + 2;
>    tdep->ppc_ps_regnum = PPC_MSR_REGNUM;
> diff --git a/gdb/rx-tdep.c b/gdb/rx-tdep.c
> index d1c294b9ef0..c588be1f4d7 100644
> --- a/gdb/rx-tdep.c
> +++ b/gdb/rx-tdep.c
> @@ -944,7 +944,6 @@ rx_dwarf_reg_to_regnum (struct gdbarch *gdbarch, int reg)
>  static struct gdbarch *
>  rx_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>  {
> -  struct gdbarch *gdbarch;
>    int elf_flags;
>    tdesc_arch_data_up tdesc_data;
>    const struct target_desc *tdesc = info.target_desc;
> @@ -997,8 +996,10 @@ rx_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>  
>    gdb_assert(tdesc_data != NULL);
>  
> -  rx_gdbarch_tdep *tdep = new rx_gdbarch_tdep;
> -  gdbarch = gdbarch_alloc (&info, tdep);
> +  gdbarch *gdbarch
> +    = gdbarch_alloc (&info, gdbarch_tdep_up (new rx_gdbarch_tdep));
> +  rx_gdbarch_tdep *tdep = gdbarch_tdep<rx_gdbarch_tdep> (gdbarch);
> +
>    tdep->elf_flags = elf_flags;
>  
>    set_gdbarch_num_regs (gdbarch, RX_NUM_REGS);
> diff --git a/gdb/s12z-tdep.c b/gdb/s12z-tdep.c
> index ccc47c99804..79b33f2f8a4 100644
> --- a/gdb/s12z-tdep.c
> +++ b/gdb/s12z-tdep.c
> @@ -616,8 +616,8 @@ show_bdccsr_command (const char *args, int from_tty)
>  static struct gdbarch *
>  s12z_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>  {
> -  s12z_gdbarch_tdep *tdep = new s12z_gdbarch_tdep;
> -  struct gdbarch *gdbarch = gdbarch_alloc (&info, tdep);
> +  gdbarch *gdbarch
> +    = gdbarch_alloc (&info, gdbarch_tdep_up (new s12z_gdbarch_tdep));
>  
>    add_cmd ("bdccsr", class_support, show_bdccsr_command,
>  	   _("Show the current value of the microcontroller's BDCCSR."),
> diff --git a/gdb/s390-tdep.c b/gdb/s390-tdep.c
> index d0dba7654bb..83b8869a87e 100644
> --- a/gdb/s390-tdep.c
> +++ b/gdb/s390-tdep.c
> @@ -6983,13 +6983,12 @@ s390_tdesc_valid (s390_gdbarch_tdep *tdep,
>    return true;
>  }
>  
> -/* Allocate and initialize new gdbarch_tdep.  Caller is responsible to free
> -   memory after use.  */
> +/* Allocate and initialize new gdbarch_tdep.  */
>  
> -static s390_gdbarch_tdep *
> +static s390_gdbarch_tdep_up
>  s390_gdbarch_tdep_alloc ()
>  {
> -  s390_gdbarch_tdep *tdep = new s390_gdbarch_tdep;
> +  s390_gdbarch_tdep_up tdep (new s390_gdbarch_tdep);
>  
>    tdep->tdesc = NULL;
>  
> @@ -7026,8 +7025,8 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>    static const char *const stap_register_indirection_suffixes[] = { ")",
>  								    NULL };
>  
> -  s390_gdbarch_tdep *tdep = s390_gdbarch_tdep_alloc ();
> -  struct gdbarch *gdbarch = gdbarch_alloc (&info, tdep);
> +  gdbarch *gdbarch = gdbarch_alloc (&info, s390_gdbarch_tdep_alloc ());
> +  s390_gdbarch_tdep *tdep = gdbarch_tdep<s390_gdbarch_tdep> (gdbarch);
>    tdesc_arch_data_up tdesc_data = tdesc_data_alloc ();
>    info.tdesc_data = tdesc_data.get ();
>  
> @@ -7156,7 +7155,6 @@ 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 ()))
>      {
> -      delete tdep;
>        gdbarch_free (gdbarch);
>        return NULL;
>      }
> @@ -7189,7 +7187,6 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>        if (tmp->vector_abi != tdep->vector_abi)
>  	continue;
>  
> -      delete tdep;
>        gdbarch_free (gdbarch);
>        return arches->gdbarch;
>      }
> diff --git a/gdb/s390-tdep.h b/gdb/s390-tdep.h
> index f0f7019ac6a..e75ee48df9a 100644
> --- a/gdb/s390-tdep.h
> +++ b/gdb/s390-tdep.h
> @@ -67,6 +67,8 @@ struct s390_gdbarch_tdep : gdbarch_tdep_base
>      = nullptr;
>  };
>  
> +using s390_gdbarch_tdep_up = std::unique_ptr<s390_gdbarch_tdep>;
> +
>  /* Decoding S/390 instructions.  */
>  
>  /* Named opcode values for the S/390 instructions we recognize.  Some
> diff --git a/gdb/sh-tdep.c b/gdb/sh-tdep.c
> index a2e91483229..40c4bdda212 100644
> --- a/gdb/sh-tdep.c
> +++ b/gdb/sh-tdep.c
> @@ -2195,8 +2195,6 @@ sh_return_in_first_hidden_param_p (struct gdbarch *gdbarch,
>  static struct gdbarch *
>  sh_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>  {
> -  struct gdbarch *gdbarch;
> -
>    /* If there is already a candidate, use it.  */
>    arches = gdbarch_list_lookup_by_info (arches, &info);
>    if (arches != NULL)
> @@ -2204,8 +2202,8 @@ sh_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>  
>    /* None found, create a new architecture from the information
>       provided.  */
> -  sh_gdbarch_tdep *tdep = new sh_gdbarch_tdep;
> -  gdbarch = gdbarch_alloc (&info, tdep);
> +  gdbarch *gdbarch
> +    = gdbarch_alloc (&info, gdbarch_tdep_up (new sh_gdbarch_tdep));
>  
>    set_gdbarch_short_bit (gdbarch, 2 * TARGET_CHAR_BIT);
>    set_gdbarch_int_bit (gdbarch, 4 * TARGET_CHAR_BIT);
> diff --git a/gdb/sparc-tdep.c b/gdb/sparc-tdep.c
> index 49c055e43cb..b003ebcb90a 100644
> --- a/gdb/sparc-tdep.c
> +++ b/gdb/sparc-tdep.c
> @@ -1807,7 +1807,6 @@ static struct gdbarch *
>  sparc32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>  {
>    const struct target_desc *tdesc = info.target_desc;
> -  struct gdbarch *gdbarch;
>    int valid_p = 1;
>  
>    /* If there is already a candidate, use it.  */
> @@ -1816,8 +1815,9 @@ sparc32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>      return arches->gdbarch;
>  
>    /* Allocate space for the new architecture.  */
> -  sparc_gdbarch_tdep *tdep = new sparc_gdbarch_tdep;
> -  gdbarch = gdbarch_alloc (&info, tdep);
> +  gdbarch *gdbarch
> +    = gdbarch_alloc (&info, gdbarch_tdep_up (new sparc_gdbarch_tdep));
> +  sparc_gdbarch_tdep *tdep = gdbarch_tdep<sparc_gdbarch_tdep> (gdbarch);
>  
>    tdep->pc_regnum = SPARC32_PC_REGNUM;
>    tdep->npc_regnum = SPARC32_NPC_REGNUM;
> diff --git a/gdb/tic6x-tdep.c b/gdb/tic6x-tdep.c
> index 054f0e6f3b2..b59fbcc2f03 100644
> --- a/gdb/tic6x-tdep.c
> +++ b/gdb/tic6x-tdep.c
> @@ -1136,7 +1136,6 @@ tic6x_return_in_first_hidden_param_p (struct gdbarch *gdbarch,
>  static struct gdbarch *
>  tic6x_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>  {
> -  struct gdbarch *gdbarch;
>    tdesc_arch_data_up tdesc_data;
>    const struct target_desc *tdesc = info.target_desc;
>    int has_gp = 0;
> @@ -1221,10 +1220,11 @@ tic6x_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>  	return arches->gdbarch;
>      }
>  
> -  tic6x_gdbarch_tdep *tdep = new tic6x_gdbarch_tdep;
> +  gdbarch *gdbarch
> +    = gdbarch_alloc (&info, gdbarch_tdep_up (new tic6x_gdbarch_tdep));
> +  tic6x_gdbarch_tdep *tdep = gdbarch_tdep<tic6x_gdbarch_tdep> (gdbarch);
>  
>    tdep->has_gp = has_gp;
> -  gdbarch = gdbarch_alloc (&info, tdep);
>  
>    /* Data type sizes.  */
>    set_gdbarch_ptr_bit (gdbarch, 32);
> diff --git a/gdb/v850-tdep.c b/gdb/v850-tdep.c
> index a40e9abf077..d8406a5f14c 100644
> --- a/gdb/v850-tdep.c
> +++ b/gdb/v850-tdep.c
> @@ -1348,7 +1348,6 @@ static const struct frame_base v850_frame_base = {
>  static struct gdbarch *
>  v850_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>  {
> -  struct gdbarch *gdbarch;
>    int e_flags, e_machine;
>  
>    /* Extract the elf_flags if available.  */
> @@ -1380,7 +1379,10 @@ v850_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>        return arches->gdbarch;
>      }
>  
> -  v850_gdbarch_tdep *tdep = new v850_gdbarch_tdep;
> +  gdbarch *gdbarch
> +    = gdbarch_alloc (&info, gdbarch_tdep_up (new v850_gdbarch_tdep));
> +  v850_gdbarch_tdep *tdep = gdbarch_tdep<v850_gdbarch_tdep> (gdbarch);
> +
>    tdep->e_flags = e_flags;
>    tdep->e_machine = e_machine;
>  
> @@ -1395,7 +1397,6 @@ v850_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>      }
>  
>    tdep->eight_byte_align = (tdep->e_flags & EF_RH850_DATA_ALIGN8) ? 1 : 0;
> -  gdbarch = gdbarch_alloc (&info, tdep);
>  
>    switch (info.bfd_arch_info->mach)
>      {
> diff --git a/gdb/xtensa-config.c b/gdb/xtensa-config.c
> index a28ffd58c96..37f893aa8f1 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.  */
> -static xtensa_register_t rmap[] =
> +xtensa_register_t xtensa_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)
> @@ -212,5 +212,3 @@ static xtensa_register_t rmap[] =
>  	    0,0,&xtensa_mask15,0,0,0)
>    XTREG_END
>  };
> -
> -xtensa_gdbarch_tdep xtensa_tdep (rmap);
> diff --git a/gdb/xtensa-tdep.c b/gdb/xtensa-tdep.c
> index 27634f5f4ce..78b328c50dc 100644
> --- a/gdb/xtensa-tdep.c
> +++ b/gdb/xtensa-tdep.c
> @@ -3145,13 +3145,11 @@ xtensa_derive_tdep (xtensa_gdbarch_tdep *tdep)
>  
>  /* Module "constructor" function.  */
>  
> -extern xtensa_gdbarch_tdep xtensa_tdep;
> +extern xtensa_register_t xtensa_rmap[];
>  
>  static struct gdbarch *
>  xtensa_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>  {
> -  struct gdbarch *gdbarch;
> -
>    DEBUGTRACE ("gdbarch_init()\n");
>  
>    if (!xtensa_default_isa)
> @@ -3160,8 +3158,10 @@ 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;
>  
> -  xtensa_gdbarch_tdep *tdep = &xtensa_tdep;
> -  gdbarch = gdbarch_alloc (&info, tdep);
> +  gdbarch *gdbarch
> +    = gdbarch_alloc (&info,
> +		     gdbarch_tdep_up (new xtensa_gdbarch_tdep (xtensa_rmap)));
> +  xtensa_gdbarch_tdep *tdep = gdbarch_tdep<xtensa_gdbarch_tdep> (gdbarch);
>    xtensa_derive_tdep (tdep);
>  
>    /* Verify our configuration.  */
> diff --git a/gdb/z80-tdep.c b/gdb/z80-tdep.c
> index 3141feb4d80..84a37b2d78d 100644
> --- a/gdb/z80-tdep.c
> +++ b/gdb/z80-tdep.c
> @@ -1081,7 +1081,6 @@ z80_frame_unwind =
>  static struct gdbarch *
>  z80_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>  {
> -  struct gdbarch *gdbarch;
>    struct gdbarch_list *best_arch;
>    tdesc_arch_data_up tdesc_data;
>    unsigned long mach = info.bfd_arch_info->mach;
> @@ -1123,8 +1122,9 @@ z80_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>      }
>  
>    /* None found, create a new architecture from the information provided.  */
> -  z80_gdbarch_tdep *tdep = new z80_gdbarch_tdep;
> -  gdbarch = gdbarch_alloc (&info, tdep);
> +  gdbarch *gdbarch
> +    = gdbarch_alloc (&info, gdbarch_tdep_up (new z80_gdbarch_tdep));
> +  z80_gdbarch_tdep *tdep = gdbarch_tdep<z80_gdbarch_tdep> (gdbarch);
>  
>    if (mach == bfd_mach_ez80_adl)
>      {
> -- 
> 2.38.1


  reply	other threads:[~2022-12-06 17:06 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-12-06 13:57 [PATCH 00/12] Initial support for ROCm platform (AMDGPU) debugging Simon Marchi
2022-12-06 13:57 ` [PATCH 01/12] gdb: add supports_arch_info callback to gdbarch_register Simon Marchi
2022-12-06 16:45   ` Andrew Burgess
2022-12-06 13:57 ` [PATCH 02/12] gdb: make install_breakpoint return a non-owning reference Simon Marchi
2022-12-06 16:46   ` Andrew Burgess
2022-12-06 13:57 ` [PATCH 03/12] gdbsupport: add type definitions for pid, lwp and tid Simon Marchi
2022-12-06 16:36   ` Andrew Burgess
2022-12-07  2:55     ` Simon Marchi
2022-12-06 13:57 ` [PATCH 04/12] gdb: add inferior_pre_detach observable Simon Marchi
2022-12-06 16:39   ` Andrew Burgess
2022-12-06 13:57 ` [PATCH 05/12] gdb: make gdbarch_alloc take ownership of the tdep Simon Marchi
2022-12-06 17:06   ` Andrew Burgess [this message]
2022-12-06 13:57 ` [PATCH 06/12] gdb: add gdbarch_up Simon Marchi
2022-12-06 17:07   ` Andrew Burgess
2022-12-06 13:57 ` [PATCH 07/12] gdbsupport: move libxxhash configure check to gdbsupport Simon Marchi
2022-12-06 17:19   ` Andrew Burgess
2022-12-06 13:57 ` [PATCH 08/12] gdbsupport: move fast_hash to gdbsupport/common-utils.h Simon Marchi
2022-12-06 17:19   ` Andrew Burgess
2022-12-06 13:57 ` [PATCH 09/12] gdbsupport: add gdb::string_view_hash Simon Marchi
2022-12-06 17:19   ` Andrew Burgess
2022-12-06 13:57 ` [PATCH 10/12] gdb/solib-svr4: don't disable probes interface if probe not found Simon Marchi
2022-12-06 13:57 ` [PATCH 11/12] gdb: make gdb_printing_disassembler::stream public Simon Marchi
2022-12-06 17:38   ` Andrew Burgess
2022-12-06 13:57 ` [PATCH 12/12] gdb: initial support for ROCm platform (AMDGPU) debugging Simon Marchi
2022-12-06 15:00   ` Eli Zaretskii
2022-12-06 15:10     ` Simon Marchi
2022-12-06 15:42   ` Eli Zaretskii
2022-12-07  2:17     ` Simon Marchi
2022-12-07 13:29       ` Eli Zaretskii
2022-12-16 17:37         ` Simon Marchi
2023-01-05 19:41 ` [PATCH 00/12] Initial " Simon Marchi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87sfhs31iq.fsf@redhat.com \
    --to=aburgess@redhat.com \
    --cc=gdb-patches@sourceware.org \
    --cc=simon.marchi@efficios.com \
    --cc=simon.marchi@polymtl.ca \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).