public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] gdb: Have allocate_target_description return a unique_ptr
@ 2020-10-05 19:47 Andrew Burgess
  2020-10-05 19:52 ` Simon Marchi
  2020-10-07 11:41 ` Pedro Alves
  0 siblings, 2 replies; 7+ messages in thread
From: Andrew Burgess @ 2020-10-05 19:47 UTC (permalink / raw)
  To: gdb-patches

Below is a rebased version of a patch I posted here:

  https://sourceware.org/pipermail/gdb-patches/2020-July/170639.html

this recieved positive feedback at the time but was buried in some
other thread so may not have been widely seen.  I thought it was
probably worth reposting this before merging just to see if anyone
else had any thoughts.

There's a lot of change here, but all of the *.c files that are marked
'Regenerate' in the ChangeLog follow much the same pattern, review one
of them and you've reviewed them all.

Thanks,
Andrew

---

Update allocate_target_description to return a target_desc_up, a
specialisation of unique_ptr.

This commit does not attempt to make use of the unique_ptr in the
best possible way, in almost all cases we immediately release the
pointer from within the unique_ptr and then continue as before.

There are a few places where it was easy to handle the unique_ptr, and
in these cases I've done that.

Everything under gdb/features/* is auto-regenerated.

There should be no user visible changes after this commit.

gdb/ChangeLog:

	* arch/aarch32.c (aarch32_create_target_description): Release
	unique_ptr returned from allocate_target_description.
	* arch/aarch64.c (aarch64_create_target_description): Likewise.
	* arch/amd64.c (amd64_create_target_description): Likewise.
	* arch/arc.c (arc_create_target_description): Likewise.
	* arch/arm.c (arm_create_target_description): Likewise.
	* arch/i386.c (i386_create_target_description): Likewise.
	* arch/riscv.c (riscv_create_target_description): Update return
	type.  Handle allocate_target_description returning a unique_ptr.
	(riscv_lookup_target_description): Update to handle unique_ptr.
	* arch/tic6x.c (tic6x_create_target_description): Release
	unique_ptr returned from allocate_target_description.
	* features/microblaze-with-stack-protect.c: Regenerate.
	* features/microblaze.c: Regenerate.
	* features/mips-dsp-linux.c: Regenerate.
	* features/mips-linux.c: Regenerate.
	* features/mips64-dsp-linux.c: Regenerate.
	* features/mips64-linux.c: Regenerate.
	* features/nds32.c: Regenerate.
	* features/nios2.c: Regenerate.
	* features/or1k.c: Regenerate.
	* features/rs6000/powerpc-32.c: Regenerate.
	* features/rs6000/powerpc-32l.c: Regenerate.
	* features/rs6000/powerpc-403.c: Regenerate.
	* features/rs6000/powerpc-403gc.c: Regenerate.
	* features/rs6000/powerpc-405.c: Regenerate.
	* features/rs6000/powerpc-505.c: Regenerate.
	* features/rs6000/powerpc-601.c: Regenerate.
	* features/rs6000/powerpc-602.c: Regenerate.
	* features/rs6000/powerpc-603.c: Regenerate.
	* features/rs6000/powerpc-604.c: Regenerate.
	* features/rs6000/powerpc-64.c: Regenerate.
	* features/rs6000/powerpc-64l.c: Regenerate.
	* features/rs6000/powerpc-7400.c: Regenerate.
	* features/rs6000/powerpc-750.c: Regenerate.
	* features/rs6000/powerpc-860.c: Regenerate.
	* features/rs6000/powerpc-altivec32.c: Regenerate.
	* features/rs6000/powerpc-altivec32l.c: Regenerate.
	* features/rs6000/powerpc-altivec64.c: Regenerate.
	* features/rs6000/powerpc-altivec64l.c: Regenerate.
	* features/rs6000/powerpc-e500.c: Regenerate.
	* features/rs6000/powerpc-e500l.c: Regenerate.
	* features/rs6000/powerpc-isa205-32l.c: Regenerate.
	* features/rs6000/powerpc-isa205-64l.c: Regenerate.
	* features/rs6000/powerpc-isa205-altivec32l.c: Regenerate.
	* features/rs6000/powerpc-isa205-altivec64l.c: Regenerate.
	* features/rs6000/powerpc-isa205-ppr-dscr-vsx32l.c: Regenerate.
	* features/rs6000/powerpc-isa205-ppr-dscr-vsx64l.c: Regenerate.
	* features/rs6000/powerpc-isa205-vsx32l.c: Regenerate.
	* features/rs6000/powerpc-isa205-vsx64l.c: Regenerate.
	* features/rs6000/powerpc-isa207-htm-vsx32l.c: Regenerate.
	* features/rs6000/powerpc-isa207-htm-vsx64l.c: Regenerate.
	* features/rs6000/powerpc-isa207-vsx32l.c: Regenerate.
	* features/rs6000/powerpc-isa207-vsx64l.c: Regenerate.
	* features/rs6000/powerpc-vsx32.c: Regenerate.
	* features/rs6000/powerpc-vsx32l.c: Regenerate.
	* features/rs6000/powerpc-vsx64.c: Regenerate.
	* features/rs6000/powerpc-vsx64l.c: Regenerate.
	* features/rs6000/rs6000.c: Regenerate.
	* features/rx.c: Regenerate.
	* features/s390-gs-linux64.c: Regenerate.
	* features/s390-linux32.c: Regenerate.
	* features/s390-linux32v1.c: Regenerate.
	* features/s390-linux32v2.c: Regenerate.
	* features/s390-linux64.c: Regenerate.
	* features/s390-linux64v1.c: Regenerate.
	* features/s390-linux64v2.c: Regenerate.
	* features/s390-te-linux64.c: Regenerate.
	* features/s390-tevx-linux64.c: Regenerate.
	* features/s390-vx-linux64.c: Regenerate.
	* features/s390x-gs-linux64.c: Regenerate.
	* features/s390x-linux64.c: Regenerate.
	* features/s390x-linux64v1.c: Regenerate.
	* features/s390x-linux64v2.c: Regenerate.
	* features/s390x-te-linux64.c: Regenerate.
	* features/s390x-tevx-linux64.c: Regenerate.
	* features/s390x-vx-linux64.c: Regenerate.
	* mips-tdep.c (_initialize_mips_tdep): Release unique_ptr returned
	from allocate_target_description.
	* target-descriptions.c (allocate_target_description): Update
	return type.
	(print_c_tdesc::visit_pre): Release unique_ptr returned from
	allocate_target_description.

gdbserver/ChangeLog:

	* linux-low.cc (linux_process_target::handle_extended_wait):
	Release the unique_ptr returned from allocate_target_description.
	* linux-riscv-low.cc (riscv_target::low_arch_setup): Likewise.
	* linux-x86-low.cc (tdesc_amd64_linux_no_xml): Change type.
	(tdesc_i386_linux_no_xml): Change type.
	(x86_linux_read_description): Borrow pointer from unique_ptr
	object.
	(x86_target::get_ipa_tdesc_idx): Likewise.
	(initialize_low_arch): Likewise.
	* tdesc.cc (allocate_target_description): Update return type.

gdbsupport/ChangeLog:

	* tdesc.h (allocate_target_description): Update return type.
---
 gdb/ChangeLog                                 | 86 +++++++++++++++++++
 gdb/arch/aarch32.c                            |  2 +-
 gdb/arch/aarch64.c                            |  2 +-
 gdb/arch/amd64.c                              |  2 +-
 gdb/arch/arc.c                                |  2 +-
 gdb/arch/arm.c                                |  4 +-
 gdb/arch/i386.c                               |  2 +-
 gdb/arch/riscv.c                              | 27 +++---
 gdb/arch/tic6x.c                              |  2 +-
 gdb/features/microblaze-with-stack-protect.c  |  2 +-
 gdb/features/microblaze.c                     |  2 +-
 gdb/features/mips-dsp-linux.c                 |  2 +-
 gdb/features/mips-linux.c                     |  2 +-
 gdb/features/mips64-dsp-linux.c               |  2 +-
 gdb/features/mips64-linux.c                   |  2 +-
 gdb/features/nds32.c                          |  2 +-
 gdb/features/nios2.c                          |  2 +-
 gdb/features/or1k.c                           |  2 +-
 gdb/features/rs6000/powerpc-32.c              |  2 +-
 gdb/features/rs6000/powerpc-32l.c             |  2 +-
 gdb/features/rs6000/powerpc-403.c             |  2 +-
 gdb/features/rs6000/powerpc-403gc.c           |  2 +-
 gdb/features/rs6000/powerpc-405.c             |  2 +-
 gdb/features/rs6000/powerpc-505.c             |  2 +-
 gdb/features/rs6000/powerpc-601.c             |  2 +-
 gdb/features/rs6000/powerpc-602.c             |  2 +-
 gdb/features/rs6000/powerpc-603.c             |  2 +-
 gdb/features/rs6000/powerpc-604.c             |  2 +-
 gdb/features/rs6000/powerpc-64.c              |  2 +-
 gdb/features/rs6000/powerpc-64l.c             |  2 +-
 gdb/features/rs6000/powerpc-7400.c            |  2 +-
 gdb/features/rs6000/powerpc-750.c             |  2 +-
 gdb/features/rs6000/powerpc-860.c             |  2 +-
 gdb/features/rs6000/powerpc-altivec32.c       |  2 +-
 gdb/features/rs6000/powerpc-altivec32l.c      |  2 +-
 gdb/features/rs6000/powerpc-altivec64.c       |  2 +-
 gdb/features/rs6000/powerpc-altivec64l.c      |  2 +-
 gdb/features/rs6000/powerpc-e500.c            |  2 +-
 gdb/features/rs6000/powerpc-e500l.c           |  2 +-
 gdb/features/rs6000/powerpc-isa205-32l.c      |  2 +-
 gdb/features/rs6000/powerpc-isa205-64l.c      |  2 +-
 .../rs6000/powerpc-isa205-altivec32l.c        |  2 +-
 .../rs6000/powerpc-isa205-altivec64l.c        |  2 +-
 .../rs6000/powerpc-isa205-ppr-dscr-vsx32l.c   |  2 +-
 .../rs6000/powerpc-isa205-ppr-dscr-vsx64l.c   |  2 +-
 gdb/features/rs6000/powerpc-isa205-vsx32l.c   |  2 +-
 gdb/features/rs6000/powerpc-isa205-vsx64l.c   |  2 +-
 .../rs6000/powerpc-isa207-htm-vsx32l.c        |  2 +-
 .../rs6000/powerpc-isa207-htm-vsx64l.c        |  2 +-
 gdb/features/rs6000/powerpc-isa207-vsx32l.c   |  2 +-
 gdb/features/rs6000/powerpc-isa207-vsx64l.c   |  2 +-
 gdb/features/rs6000/powerpc-vsx32.c           |  2 +-
 gdb/features/rs6000/powerpc-vsx32l.c          |  2 +-
 gdb/features/rs6000/powerpc-vsx64.c           |  2 +-
 gdb/features/rs6000/powerpc-vsx64l.c          |  2 +-
 gdb/features/rs6000/rs6000.c                  |  2 +-
 gdb/features/rx.c                             |  2 +-
 gdb/features/s390-gs-linux64.c                |  2 +-
 gdb/features/s390-linux32.c                   |  2 +-
 gdb/features/s390-linux32v1.c                 |  2 +-
 gdb/features/s390-linux32v2.c                 |  2 +-
 gdb/features/s390-linux64.c                   |  2 +-
 gdb/features/s390-linux64v1.c                 |  2 +-
 gdb/features/s390-linux64v2.c                 |  2 +-
 gdb/features/s390-te-linux64.c                |  2 +-
 gdb/features/s390-tevx-linux64.c              |  2 +-
 gdb/features/s390-vx-linux64.c                |  2 +-
 gdb/features/s390x-gs-linux64.c               |  2 +-
 gdb/features/s390x-linux64.c                  |  2 +-
 gdb/features/s390x-linux64v1.c                |  2 +-
 gdb/features/s390x-linux64v2.c                |  2 +-
 gdb/features/s390x-te-linux64.c               |  2 +-
 gdb/features/s390x-tevx-linux64.c             |  2 +-
 gdb/features/s390x-vx-linux64.c               |  2 +-
 gdb/mips-tdep.c                               |  4 +-
 gdb/target-descriptions.c                     |  6 +-
 gdbserver/ChangeLog                           | 13 +++
 gdbserver/linux-low.cc                        |  7 +-
 gdbserver/linux-riscv-low.cc                  |  6 +-
 gdbserver/linux-x86-low.cc                    | 14 +--
 gdbserver/tdesc.cc                            |  4 +-
 gdbsupport/ChangeLog                          |  4 +
 gdbsupport/tdesc.h                            |  2 +-
 83 files changed, 211 insertions(+), 108 deletions(-)

diff --git a/gdb/arch/aarch32.c b/gdb/arch/aarch32.c
index 5bc24a30164..bf7a33230e0 100644
--- a/gdb/arch/aarch32.c
+++ b/gdb/arch/aarch32.c
@@ -26,7 +26,7 @@
 target_desc *
 aarch32_create_target_description ()
 {
-  target_desc *tdesc = allocate_target_description ();
+  target_desc *tdesc = allocate_target_description ().release ();
 
 #ifndef IN_PROCESS_AGENT
   set_tdesc_architecture (tdesc, "arm");
diff --git a/gdb/arch/aarch64.c b/gdb/arch/aarch64.c
index f6115434989..c0af7b0906f 100644
--- a/gdb/arch/aarch64.c
+++ b/gdb/arch/aarch64.c
@@ -29,7 +29,7 @@
 target_desc *
 aarch64_create_target_description (uint64_t vq, bool pauth_p)
 {
-  target_desc *tdesc = allocate_target_description ();
+  target_desc *tdesc = allocate_target_description ().release ();
 
 #ifndef IN_PROCESS_AGENT
   set_tdesc_architecture (tdesc, "aarch64");
diff --git a/gdb/arch/amd64.c b/gdb/arch/amd64.c
index a388c7e49d1..b11a4fdc0fc 100644
--- a/gdb/arch/amd64.c
+++ b/gdb/arch/amd64.c
@@ -40,7 +40,7 @@ target_desc *
 amd64_create_target_description (uint64_t xcr0, bool is_x32, bool is_linux,
 				 bool segments)
 {
-  target_desc *tdesc = allocate_target_description ();
+  target_desc *tdesc = allocate_target_description ().release ();
 
 #ifndef IN_PROCESS_AGENT
   set_tdesc_architecture (tdesc, is_x32 ? "i386:x64-32" : "i386:x86-64");
diff --git a/gdb/arch/arc.c b/gdb/arch/arc.c
index 8e126ca5a82..45aeb429f59 100644
--- a/gdb/arch/arc.c
+++ b/gdb/arch/arc.c
@@ -38,7 +38,7 @@ STATIC_IN_GDB target_desc *
 arc_create_target_description (const struct arc_gdbarch_features &features)
 {
   /* Create a new target description.  */
-  target_desc *tdesc = allocate_target_description ();
+  target_desc *tdesc = allocate_target_description ().release ();
 
 #ifndef IN_PROCESS_AGENT
   std::string arch_name;
diff --git a/gdb/arch/arm.c b/gdb/arch/arm.c
index faa2b4fbd4b..dc67e40f9cf 100644
--- a/gdb/arch/arm.c
+++ b/gdb/arch/arm.c
@@ -374,7 +374,7 @@ shifted_reg_val (struct regcache *regcache, unsigned long inst,
 target_desc *
 arm_create_target_description (arm_fp_type fp_type)
 {
-  target_desc *tdesc = allocate_target_description ();
+  target_desc *tdesc = allocate_target_description ().release ();
 
 #ifndef IN_PROCESS_AGENT
   if (fp_type == ARM_FP_TYPE_IWMMXT)
@@ -416,7 +416,7 @@ arm_create_target_description (arm_fp_type fp_type)
 target_desc *
 arm_create_mprofile_target_description (arm_m_profile_type m_type)
 {
-  target_desc *tdesc = allocate_target_description ();
+  target_desc *tdesc = allocate_target_description ().release ();
 
 #ifndef IN_PROCESS_AGENT
   set_tdesc_architecture (tdesc, "arm");
diff --git a/gdb/arch/i386.c b/gdb/arch/i386.c
index 099a20b98a2..13201db1d74 100644
--- a/gdb/arch/i386.c
+++ b/gdb/arch/i386.c
@@ -35,7 +35,7 @@
 target_desc *
 i386_create_target_description (uint64_t xcr0, bool is_linux, bool segments)
 {
-  target_desc *tdesc = allocate_target_description ();
+  target_desc *tdesc = allocate_target_description ().release ();
 
 #ifndef IN_PROCESS_AGENT
   set_tdesc_architecture (tdesc, "i386");
diff --git a/gdb/arch/riscv.c b/gdb/arch/riscv.c
index 8f5709092e9..a6538dee541 100644
--- a/gdb/arch/riscv.c
+++ b/gdb/arch/riscv.c
@@ -33,11 +33,11 @@
 
 /* See arch/riscv.h.  */
 
-STATIC_IN_GDB target_desc *
+STATIC_IN_GDB target_desc_up
 riscv_create_target_description (const struct riscv_gdbarch_features features)
 {
   /* Now we should create a new target description.  */
-  target_desc *tdesc = allocate_target_description ();
+  target_desc_up tdesc = allocate_target_description ();
 
 #ifndef IN_PROCESS_AGENT
   std::string arch_name = "riscv";
@@ -56,22 +56,22 @@ riscv_create_target_description (const struct riscv_gdbarch_features features)
   else if (features.flen == 16)
     arch_name.append ("q");
 
-  set_tdesc_architecture (tdesc, arch_name.c_str ());
+  set_tdesc_architecture (tdesc.get (), arch_name.c_str ());
 #endif
 
   long regnum = 0;
 
   /* For now we only support creating 32-bit or 64-bit x-registers.  */
   if (features.xlen == 4)
-    regnum = create_feature_riscv_32bit_cpu (tdesc, regnum);
+    regnum = create_feature_riscv_32bit_cpu (tdesc.get (), regnum);
   else if (features.xlen == 8)
-    regnum = create_feature_riscv_64bit_cpu (tdesc, regnum);
+    regnum = create_feature_riscv_64bit_cpu (tdesc.get (), regnum);
 
   /* For now we only support creating 32-bit or 64-bit f-registers.  */
   if (features.flen == 4)
-    regnum = create_feature_riscv_32bit_fpu (tdesc, regnum);
+    regnum = create_feature_riscv_32bit_fpu (tdesc.get (), regnum);
   else if (features.flen == 8)
-    regnum = create_feature_riscv_64bit_fpu (tdesc, regnum);
+    regnum = create_feature_riscv_64bit_fpu (tdesc.get (), regnum);
 
   return tdesc;
 }
@@ -106,13 +106,14 @@ riscv_lookup_target_description (const struct riscv_gdbarch_features features)
   if (it != riscv_tdesc_cache.end ())
     return it->second.get ();
 
-  target_desc *tdesc = riscv_create_target_description (features);
+  target_desc_up tdesc (riscv_create_target_description (features));
 
-  /* Add to the cache.  Work around a problem with g++ 4.8 (PR96537):
-     Call the target_desc_up constructor explictly instead of implicitly.  */
-  riscv_tdesc_cache.emplace (features, target_desc_up (tdesc));
-
-  return tdesc;
+  /* Add to the cache, and return a pointer borrowed from the
+     target_desc_up.  This is safe as the cache (and the pointers
+     contained within it) are not deleted until GDB exits.  */
+  target_desc *ptr = tdesc.get ();
+  riscv_tdesc_cache.emplace (features, std::move (tdesc));
+  return ptr;
 }
 
 #endif /* !GDBSERVER */
diff --git a/gdb/arch/tic6x.c b/gdb/arch/tic6x.c
index 5f14d34750b..dad4dd85a4d 100644
--- a/gdb/arch/tic6x.c
+++ b/gdb/arch/tic6x.c
@@ -28,7 +28,7 @@
 target_desc *
 tic6x_create_target_description (enum c6x_feature feature)
 {
-  target_desc *tdesc = allocate_target_description ();
+  target_desc *tdesc = allocate_target_description ().release ();
 
   set_tdesc_architecture (tdesc, "tic6x");
   set_tdesc_osabi (tdesc, "GNU/Linux");
diff --git a/gdb/features/microblaze-with-stack-protect.c b/gdb/features/microblaze-with-stack-protect.c
index b39aa198874..994750cd29c 100644
--- a/gdb/features/microblaze-with-stack-protect.c
+++ b/gdb/features/microblaze-with-stack-protect.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_microblaze_with_stack_protect;
 static void
 initialize_tdesc_microblaze_with_stack_protect (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   struct tdesc_feature *feature;
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.microblaze.core");
diff --git a/gdb/features/microblaze.c b/gdb/features/microblaze.c
index 6c86fc07700..011e7e685f1 100644
--- a/gdb/features/microblaze.c
+++ b/gdb/features/microblaze.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_microblaze;
 static void
 initialize_tdesc_microblaze (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   struct tdesc_feature *feature;
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.microblaze.core");
diff --git a/gdb/features/mips-dsp-linux.c b/gdb/features/mips-dsp-linux.c
index 26e9c6b01de..4df8db526bc 100644
--- a/gdb/features/mips-dsp-linux.c
+++ b/gdb/features/mips-dsp-linux.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_mips_dsp_linux;
 static void
 initialize_tdesc_mips_dsp_linux (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("mips"));
 
   set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
diff --git a/gdb/features/mips-linux.c b/gdb/features/mips-linux.c
index c9ad3ca7eba..8808ff25780 100644
--- a/gdb/features/mips-linux.c
+++ b/gdb/features/mips-linux.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_mips_linux;
 static void
 initialize_tdesc_mips_linux (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("mips"));
 
   set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
diff --git a/gdb/features/mips64-dsp-linux.c b/gdb/features/mips64-dsp-linux.c
index 05317b70f4f..7a5fa080408 100644
--- a/gdb/features/mips64-dsp-linux.c
+++ b/gdb/features/mips64-dsp-linux.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_mips64_dsp_linux;
 static void
 initialize_tdesc_mips64_dsp_linux (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("mips"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/mips64-linux.c b/gdb/features/mips64-linux.c
index 4814152c430..c1fc8926ff1 100644
--- a/gdb/features/mips64-linux.c
+++ b/gdb/features/mips64-linux.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_mips64_linux;
 static void
 initialize_tdesc_mips64_linux (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("mips"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/nds32.c b/gdb/features/nds32.c
index 89b246b8ce0..e867949ca04 100644
--- a/gdb/features/nds32.c
+++ b/gdb/features/nds32.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_nds32;
 static void
 initialize_tdesc_nds32 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("n1h"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/nios2.c b/gdb/features/nios2.c
index 705f499e65b..fd26781faf4 100644
--- a/gdb/features/nios2.c
+++ b/gdb/features/nios2.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_nios2;
 static void
 initialize_tdesc_nios2 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("nios2"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/or1k.c b/gdb/features/or1k.c
index 9169cae940e..e85f32d0f93 100644
--- a/gdb/features/or1k.c
+++ b/gdb/features/or1k.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_or1k;
 static void
 initialize_tdesc_or1k (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("or1k"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/rs6000/powerpc-32.c b/gdb/features/rs6000/powerpc-32.c
index 39f5b14bb43..addda76ab8e 100644
--- a/gdb/features/rs6000/powerpc-32.c
+++ b/gdb/features/rs6000/powerpc-32.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_powerpc_32;
 static void
 initialize_tdesc_powerpc_32 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/rs6000/powerpc-32l.c b/gdb/features/rs6000/powerpc-32l.c
index 8089c0434ee..22d9c990d8e 100644
--- a/gdb/features/rs6000/powerpc-32l.c
+++ b/gdb/features/rs6000/powerpc-32l.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_powerpc_32l;
 static void
 initialize_tdesc_powerpc_32l (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/rs6000/powerpc-403.c b/gdb/features/rs6000/powerpc-403.c
index a9106f5c536..7c2dbc7c8b5 100644
--- a/gdb/features/rs6000/powerpc-403.c
+++ b/gdb/features/rs6000/powerpc-403.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_powerpc_403;
 static void
 initialize_tdesc_powerpc_403 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   struct tdesc_feature *feature;
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
diff --git a/gdb/features/rs6000/powerpc-403gc.c b/gdb/features/rs6000/powerpc-403gc.c
index 402b747a48f..670f25ba3ec 100644
--- a/gdb/features/rs6000/powerpc-403gc.c
+++ b/gdb/features/rs6000/powerpc-403gc.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_powerpc_403gc;
 static void
 initialize_tdesc_powerpc_403gc (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   struct tdesc_feature *feature;
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
diff --git a/gdb/features/rs6000/powerpc-405.c b/gdb/features/rs6000/powerpc-405.c
index bcfa1445d23..d0113311b9f 100644
--- a/gdb/features/rs6000/powerpc-405.c
+++ b/gdb/features/rs6000/powerpc-405.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_powerpc_405;
 static void
 initialize_tdesc_powerpc_405 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   struct tdesc_feature *feature;
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
diff --git a/gdb/features/rs6000/powerpc-505.c b/gdb/features/rs6000/powerpc-505.c
index 09b0c7a3854..653d1322261 100644
--- a/gdb/features/rs6000/powerpc-505.c
+++ b/gdb/features/rs6000/powerpc-505.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_powerpc_505;
 static void
 initialize_tdesc_powerpc_505 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   struct tdesc_feature *feature;
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
diff --git a/gdb/features/rs6000/powerpc-601.c b/gdb/features/rs6000/powerpc-601.c
index f30f5e66f82..bbf5d03ede0 100644
--- a/gdb/features/rs6000/powerpc-601.c
+++ b/gdb/features/rs6000/powerpc-601.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_powerpc_601;
 static void
 initialize_tdesc_powerpc_601 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   struct tdesc_feature *feature;
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
diff --git a/gdb/features/rs6000/powerpc-602.c b/gdb/features/rs6000/powerpc-602.c
index 769671746ad..8d6b5b5c884 100644
--- a/gdb/features/rs6000/powerpc-602.c
+++ b/gdb/features/rs6000/powerpc-602.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_powerpc_602;
 static void
 initialize_tdesc_powerpc_602 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   struct tdesc_feature *feature;
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
diff --git a/gdb/features/rs6000/powerpc-603.c b/gdb/features/rs6000/powerpc-603.c
index d5dae39b10d..ea74a74b738 100644
--- a/gdb/features/rs6000/powerpc-603.c
+++ b/gdb/features/rs6000/powerpc-603.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_powerpc_603;
 static void
 initialize_tdesc_powerpc_603 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   struct tdesc_feature *feature;
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
diff --git a/gdb/features/rs6000/powerpc-604.c b/gdb/features/rs6000/powerpc-604.c
index 44dc8caf47e..6a4cea921fb 100644
--- a/gdb/features/rs6000/powerpc-604.c
+++ b/gdb/features/rs6000/powerpc-604.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_powerpc_604;
 static void
 initialize_tdesc_powerpc_604 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   struct tdesc_feature *feature;
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
diff --git a/gdb/features/rs6000/powerpc-64.c b/gdb/features/rs6000/powerpc-64.c
index a9760a37d95..0e74d03011a 100644
--- a/gdb/features/rs6000/powerpc-64.c
+++ b/gdb/features/rs6000/powerpc-64.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_powerpc_64;
 static void
 initialize_tdesc_powerpc_64 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/rs6000/powerpc-64l.c b/gdb/features/rs6000/powerpc-64l.c
index 408794e13a0..7eea0b10df2 100644
--- a/gdb/features/rs6000/powerpc-64l.c
+++ b/gdb/features/rs6000/powerpc-64l.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_powerpc_64l;
 static void
 initialize_tdesc_powerpc_64l (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/rs6000/powerpc-7400.c b/gdb/features/rs6000/powerpc-7400.c
index 58f8a69a1e2..afa80c040a2 100644
--- a/gdb/features/rs6000/powerpc-7400.c
+++ b/gdb/features/rs6000/powerpc-7400.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_powerpc_7400;
 static void
 initialize_tdesc_powerpc_7400 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   struct tdesc_feature *feature;
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
diff --git a/gdb/features/rs6000/powerpc-750.c b/gdb/features/rs6000/powerpc-750.c
index 099a478518f..91e7c97058e 100644
--- a/gdb/features/rs6000/powerpc-750.c
+++ b/gdb/features/rs6000/powerpc-750.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_powerpc_750;
 static void
 initialize_tdesc_powerpc_750 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   struct tdesc_feature *feature;
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
diff --git a/gdb/features/rs6000/powerpc-860.c b/gdb/features/rs6000/powerpc-860.c
index 0692feb2a5e..3050a1ffbfd 100644
--- a/gdb/features/rs6000/powerpc-860.c
+++ b/gdb/features/rs6000/powerpc-860.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_powerpc_860;
 static void
 initialize_tdesc_powerpc_860 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   struct tdesc_feature *feature;
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
diff --git a/gdb/features/rs6000/powerpc-altivec32.c b/gdb/features/rs6000/powerpc-altivec32.c
index bbb36c8aa59..6928801830a 100644
--- a/gdb/features/rs6000/powerpc-altivec32.c
+++ b/gdb/features/rs6000/powerpc-altivec32.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_powerpc_altivec32;
 static void
 initialize_tdesc_powerpc_altivec32 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/rs6000/powerpc-altivec32l.c b/gdb/features/rs6000/powerpc-altivec32l.c
index 81862cb9ef4..05cf5c39311 100644
--- a/gdb/features/rs6000/powerpc-altivec32l.c
+++ b/gdb/features/rs6000/powerpc-altivec32l.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_powerpc_altivec32l;
 static void
 initialize_tdesc_powerpc_altivec32l (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/rs6000/powerpc-altivec64.c b/gdb/features/rs6000/powerpc-altivec64.c
index f7a7c729637..fd5de0a4dac 100644
--- a/gdb/features/rs6000/powerpc-altivec64.c
+++ b/gdb/features/rs6000/powerpc-altivec64.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_powerpc_altivec64;
 static void
 initialize_tdesc_powerpc_altivec64 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/rs6000/powerpc-altivec64l.c b/gdb/features/rs6000/powerpc-altivec64l.c
index ce0bc86137e..c8f427b8c93 100644
--- a/gdb/features/rs6000/powerpc-altivec64l.c
+++ b/gdb/features/rs6000/powerpc-altivec64l.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_powerpc_altivec64l;
 static void
 initialize_tdesc_powerpc_altivec64l (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/rs6000/powerpc-e500.c b/gdb/features/rs6000/powerpc-e500.c
index 4466bc79a9b..447eab49bd3 100644
--- a/gdb/features/rs6000/powerpc-e500.c
+++ b/gdb/features/rs6000/powerpc-e500.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_powerpc_e500;
 static void
 initialize_tdesc_powerpc_e500 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:e500"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/rs6000/powerpc-e500l.c b/gdb/features/rs6000/powerpc-e500l.c
index 61acbf3dd31..1d0b798aee6 100644
--- a/gdb/features/rs6000/powerpc-e500l.c
+++ b/gdb/features/rs6000/powerpc-e500l.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_powerpc_e500l;
 static void
 initialize_tdesc_powerpc_e500l (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:e500"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/rs6000/powerpc-isa205-32l.c b/gdb/features/rs6000/powerpc-isa205-32l.c
index de6548fdf7c..bab1945411a 100644
--- a/gdb/features/rs6000/powerpc-isa205-32l.c
+++ b/gdb/features/rs6000/powerpc-isa205-32l.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_powerpc_isa205_32l;
 static void
 initialize_tdesc_powerpc_isa205_32l (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/rs6000/powerpc-isa205-64l.c b/gdb/features/rs6000/powerpc-isa205-64l.c
index cd3b2c10a6c..12e166aa9ac 100644
--- a/gdb/features/rs6000/powerpc-isa205-64l.c
+++ b/gdb/features/rs6000/powerpc-isa205-64l.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_powerpc_isa205_64l;
 static void
 initialize_tdesc_powerpc_isa205_64l (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/rs6000/powerpc-isa205-altivec32l.c b/gdb/features/rs6000/powerpc-isa205-altivec32l.c
index 09f5c075c8a..fe9d1356c58 100644
--- a/gdb/features/rs6000/powerpc-isa205-altivec32l.c
+++ b/gdb/features/rs6000/powerpc-isa205-altivec32l.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_powerpc_isa205_altivec32l;
 static void
 initialize_tdesc_powerpc_isa205_altivec32l (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/rs6000/powerpc-isa205-altivec64l.c b/gdb/features/rs6000/powerpc-isa205-altivec64l.c
index 246fcef085c..e28b5a945a9 100644
--- a/gdb/features/rs6000/powerpc-isa205-altivec64l.c
+++ b/gdb/features/rs6000/powerpc-isa205-altivec64l.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_powerpc_isa205_altivec64l;
 static void
 initialize_tdesc_powerpc_isa205_altivec64l (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx32l.c b/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx32l.c
index c8f56ea0294..8ec604b1a89 100644
--- a/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx32l.c
+++ b/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx32l.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_powerpc_isa205_ppr_dscr_vsx32l;
 static void
 initialize_tdesc_powerpc_isa205_ppr_dscr_vsx32l (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx64l.c b/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx64l.c
index 76e32f3b1b6..febb8542f10 100644
--- a/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx64l.c
+++ b/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx64l.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_powerpc_isa205_ppr_dscr_vsx64l;
 static void
 initialize_tdesc_powerpc_isa205_ppr_dscr_vsx64l (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/rs6000/powerpc-isa205-vsx32l.c b/gdb/features/rs6000/powerpc-isa205-vsx32l.c
index 2a6e232e994..6814536c4f2 100644
--- a/gdb/features/rs6000/powerpc-isa205-vsx32l.c
+++ b/gdb/features/rs6000/powerpc-isa205-vsx32l.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_powerpc_isa205_vsx32l;
 static void
 initialize_tdesc_powerpc_isa205_vsx32l (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/rs6000/powerpc-isa205-vsx64l.c b/gdb/features/rs6000/powerpc-isa205-vsx64l.c
index d0e32f29b1b..836f8e914bd 100644
--- a/gdb/features/rs6000/powerpc-isa205-vsx64l.c
+++ b/gdb/features/rs6000/powerpc-isa205-vsx64l.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_powerpc_isa205_vsx64l;
 static void
 initialize_tdesc_powerpc_isa205_vsx64l (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/rs6000/powerpc-isa207-htm-vsx32l.c b/gdb/features/rs6000/powerpc-isa207-htm-vsx32l.c
index e1b933c8fb3..4edb5b37350 100644
--- a/gdb/features/rs6000/powerpc-isa207-htm-vsx32l.c
+++ b/gdb/features/rs6000/powerpc-isa207-htm-vsx32l.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_powerpc_isa207_htm_vsx32l;
 static void
 initialize_tdesc_powerpc_isa207_htm_vsx32l (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/rs6000/powerpc-isa207-htm-vsx64l.c b/gdb/features/rs6000/powerpc-isa207-htm-vsx64l.c
index 0d818d01593..decebc1a331 100644
--- a/gdb/features/rs6000/powerpc-isa207-htm-vsx64l.c
+++ b/gdb/features/rs6000/powerpc-isa207-htm-vsx64l.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_powerpc_isa207_htm_vsx64l;
 static void
 initialize_tdesc_powerpc_isa207_htm_vsx64l (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/rs6000/powerpc-isa207-vsx32l.c b/gdb/features/rs6000/powerpc-isa207-vsx32l.c
index 8fe0f5e4384..9156b704789 100644
--- a/gdb/features/rs6000/powerpc-isa207-vsx32l.c
+++ b/gdb/features/rs6000/powerpc-isa207-vsx32l.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_powerpc_isa207_vsx32l;
 static void
 initialize_tdesc_powerpc_isa207_vsx32l (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/rs6000/powerpc-isa207-vsx64l.c b/gdb/features/rs6000/powerpc-isa207-vsx64l.c
index 0af1879e10a..0bfdaa39504 100644
--- a/gdb/features/rs6000/powerpc-isa207-vsx64l.c
+++ b/gdb/features/rs6000/powerpc-isa207-vsx64l.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_powerpc_isa207_vsx64l;
 static void
 initialize_tdesc_powerpc_isa207_vsx64l (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/rs6000/powerpc-vsx32.c b/gdb/features/rs6000/powerpc-vsx32.c
index 9eafb1c4823..11c2b05c5fd 100644
--- a/gdb/features/rs6000/powerpc-vsx32.c
+++ b/gdb/features/rs6000/powerpc-vsx32.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_powerpc_vsx32;
 static void
 initialize_tdesc_powerpc_vsx32 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/rs6000/powerpc-vsx32l.c b/gdb/features/rs6000/powerpc-vsx32l.c
index f08df14f9e8..41411f3b969 100644
--- a/gdb/features/rs6000/powerpc-vsx32l.c
+++ b/gdb/features/rs6000/powerpc-vsx32l.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_powerpc_vsx32l;
 static void
 initialize_tdesc_powerpc_vsx32l (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/rs6000/powerpc-vsx64.c b/gdb/features/rs6000/powerpc-vsx64.c
index 7991115cf6e..67ba593a969 100644
--- a/gdb/features/rs6000/powerpc-vsx64.c
+++ b/gdb/features/rs6000/powerpc-vsx64.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_powerpc_vsx64;
 static void
 initialize_tdesc_powerpc_vsx64 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/rs6000/powerpc-vsx64l.c b/gdb/features/rs6000/powerpc-vsx64l.c
index 1726e6754fd..6ead95b5cb6 100644
--- a/gdb/features/rs6000/powerpc-vsx64l.c
+++ b/gdb/features/rs6000/powerpc-vsx64l.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_powerpc_vsx64l;
 static void
 initialize_tdesc_powerpc_vsx64l (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/rs6000/rs6000.c b/gdb/features/rs6000/rs6000.c
index 709b5da405d..39c2601c4e0 100644
--- a/gdb/features/rs6000/rs6000.c
+++ b/gdb/features/rs6000/rs6000.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_rs6000;
 static void
 initialize_tdesc_rs6000 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("rs6000:6000"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/rx.c b/gdb/features/rx.c
index d2c29c126f7..038b48b9db1 100644
--- a/gdb/features/rx.c
+++ b/gdb/features/rx.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_rx;
 static void
 initialize_tdesc_rx (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   struct tdesc_feature *feature;
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.rx.core");
diff --git a/gdb/features/s390-gs-linux64.c b/gdb/features/s390-gs-linux64.c
index 1416183d3db..2bd52258c51 100644
--- a/gdb/features/s390-gs-linux64.c
+++ b/gdb/features/s390-gs-linux64.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_s390_gs_linux64;
 static void
 initialize_tdesc_s390_gs_linux64 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("s390:31-bit"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/s390-linux32.c b/gdb/features/s390-linux32.c
index 01c136c933e..9336ee55d01 100644
--- a/gdb/features/s390-linux32.c
+++ b/gdb/features/s390-linux32.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_s390_linux32;
 static void
 initialize_tdesc_s390_linux32 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("s390:31-bit"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/s390-linux32v1.c b/gdb/features/s390-linux32v1.c
index 65a4a504d33..c9d9818e973 100644
--- a/gdb/features/s390-linux32v1.c
+++ b/gdb/features/s390-linux32v1.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_s390_linux32v1;
 static void
 initialize_tdesc_s390_linux32v1 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("s390:31-bit"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/s390-linux32v2.c b/gdb/features/s390-linux32v2.c
index b5d25ec75bf..bbf031fca85 100644
--- a/gdb/features/s390-linux32v2.c
+++ b/gdb/features/s390-linux32v2.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_s390_linux32v2;
 static void
 initialize_tdesc_s390_linux32v2 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("s390:31-bit"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/s390-linux64.c b/gdb/features/s390-linux64.c
index 531d3a1ca82..d3144b9e7bc 100644
--- a/gdb/features/s390-linux64.c
+++ b/gdb/features/s390-linux64.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_s390_linux64;
 static void
 initialize_tdesc_s390_linux64 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("s390:31-bit"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/s390-linux64v1.c b/gdb/features/s390-linux64v1.c
index d75deca23fa..fccee9d3629 100644
--- a/gdb/features/s390-linux64v1.c
+++ b/gdb/features/s390-linux64v1.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_s390_linux64v1;
 static void
 initialize_tdesc_s390_linux64v1 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("s390:31-bit"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/s390-linux64v2.c b/gdb/features/s390-linux64v2.c
index bd10ee8ffe3..5dd076b793c 100644
--- a/gdb/features/s390-linux64v2.c
+++ b/gdb/features/s390-linux64v2.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_s390_linux64v2;
 static void
 initialize_tdesc_s390_linux64v2 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("s390:31-bit"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/s390-te-linux64.c b/gdb/features/s390-te-linux64.c
index fe2020ac65a..260560e472f 100644
--- a/gdb/features/s390-te-linux64.c
+++ b/gdb/features/s390-te-linux64.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_s390_te_linux64;
 static void
 initialize_tdesc_s390_te_linux64 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("s390:31-bit"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/s390-tevx-linux64.c b/gdb/features/s390-tevx-linux64.c
index ae62e8de372..a03399e598e 100644
--- a/gdb/features/s390-tevx-linux64.c
+++ b/gdb/features/s390-tevx-linux64.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_s390_tevx_linux64;
 static void
 initialize_tdesc_s390_tevx_linux64 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("s390:31-bit"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/s390-vx-linux64.c b/gdb/features/s390-vx-linux64.c
index d3ec0814608..cb632669d3e 100644
--- a/gdb/features/s390-vx-linux64.c
+++ b/gdb/features/s390-vx-linux64.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_s390_vx_linux64;
 static void
 initialize_tdesc_s390_vx_linux64 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("s390:31-bit"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/s390x-gs-linux64.c b/gdb/features/s390x-gs-linux64.c
index d253a09997a..3a822dd7646 100644
--- a/gdb/features/s390x-gs-linux64.c
+++ b/gdb/features/s390x-gs-linux64.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_s390x_gs_linux64;
 static void
 initialize_tdesc_s390x_gs_linux64 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("s390:64-bit"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/s390x-linux64.c b/gdb/features/s390x-linux64.c
index 9d48ea332bd..5b590cdea1a 100644
--- a/gdb/features/s390x-linux64.c
+++ b/gdb/features/s390x-linux64.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_s390x_linux64;
 static void
 initialize_tdesc_s390x_linux64 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("s390:64-bit"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/s390x-linux64v1.c b/gdb/features/s390x-linux64v1.c
index b95f1c4ccc2..4a36ecbe4ed 100644
--- a/gdb/features/s390x-linux64v1.c
+++ b/gdb/features/s390x-linux64v1.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_s390x_linux64v1;
 static void
 initialize_tdesc_s390x_linux64v1 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("s390:64-bit"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/s390x-linux64v2.c b/gdb/features/s390x-linux64v2.c
index 9aab89f458c..dc40e811d97 100644
--- a/gdb/features/s390x-linux64v2.c
+++ b/gdb/features/s390x-linux64v2.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_s390x_linux64v2;
 static void
 initialize_tdesc_s390x_linux64v2 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("s390:64-bit"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/s390x-te-linux64.c b/gdb/features/s390x-te-linux64.c
index babd3bdb03d..ce10bb6805e 100644
--- a/gdb/features/s390x-te-linux64.c
+++ b/gdb/features/s390x-te-linux64.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_s390x_te_linux64;
 static void
 initialize_tdesc_s390x_te_linux64 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("s390:64-bit"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/s390x-tevx-linux64.c b/gdb/features/s390x-tevx-linux64.c
index 1ac3249a054..7d6884b00e0 100644
--- a/gdb/features/s390x-tevx-linux64.c
+++ b/gdb/features/s390x-tevx-linux64.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_s390x_tevx_linux64;
 static void
 initialize_tdesc_s390x_tevx_linux64 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("s390:64-bit"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/features/s390x-vx-linux64.c b/gdb/features/s390x-vx-linux64.c
index 2e3d3824a26..c40c880646c 100644
--- a/gdb/features/s390x-vx-linux64.c
+++ b/gdb/features/s390x-vx-linux64.c
@@ -9,7 +9,7 @@ struct target_desc *tdesc_s390x_vx_linux64;
 static void
 initialize_tdesc_s390x_vx_linux64 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  struct target_desc *result = allocate_target_description ().release ();
   set_tdesc_architecture (result, bfd_scan_arch ("s390:64-bit"));
 
   struct tdesc_feature *feature;
diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c
index b4ed734c5fb..317c7d092f1 100644
--- a/gdb/mips-tdep.c
+++ b/gdb/mips-tdep.c
@@ -8938,10 +8938,10 @@ _initialize_mips_tdep ()
 
   /* Create feature sets with the appropriate properties.  The values
      are not important.  */
-  mips_tdesc_gp32 = allocate_target_description ();
+  mips_tdesc_gp32 = allocate_target_description ().release ();
   set_tdesc_property (mips_tdesc_gp32, PROPERTY_GP32, "");
 
-  mips_tdesc_gp64 = allocate_target_description ();
+  mips_tdesc_gp64 = allocate_target_description ().release ();
   set_tdesc_property (mips_tdesc_gp64, PROPERTY_GP64, "");
 
   /* Add root prefix command for all "set mips"/"show mips" commands.  */
diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c
index 19dbcbeac39..33a8b28d193 100644
--- a/gdb/target-descriptions.c
+++ b/gdb/target-descriptions.c
@@ -1207,10 +1207,10 @@ tdesc_create_feature (struct target_desc *tdesc, const char *name)
 
 /* See gdbsupport/tdesc.h.  */
 
-struct target_desc *
+target_desc_up
 allocate_target_description (void)
 {
-  return new target_desc ();
+  return target_desc_up (new target_desc ());
 }
 
 /* See gdbsupport/tdesc.h.  */
@@ -1377,7 +1377,7 @@ class print_c_tdesc : public tdesc_element_visitor
     printf_unfiltered ("initialize_tdesc_%s (void)\n", m_function);
     printf_unfiltered ("{\n");
     printf_unfiltered
-      ("  struct target_desc *result = allocate_target_description ();\n");
+      ("  struct target_desc *result = allocate_target_description ().release ();\n");
 
     if (tdesc_architecture (e) != NULL)
       {
diff --git a/gdbserver/linux-low.cc b/gdbserver/linux-low.cc
index 1ae72a21d6c..06ce2f090ab 100644
--- a/gdbserver/linux-low.cc
+++ b/gdbserver/linux-low.cc
@@ -497,7 +497,6 @@ linux_process_target::handle_extended_wait (lwp_info **orig_event_lwp,
 	  struct process_info *child_proc;
 	  struct lwp_info *child_lwp;
 	  struct thread_info *child_thr;
-	  struct target_desc *tdesc;
 
 	  ptid = ptid_t (new_pid, new_pid, 0);
 
@@ -553,9 +552,9 @@ linux_process_target::handle_extended_wait (lwp_info **orig_event_lwp,
 
 	  clone_all_breakpoints (child_thr, event_thr);
 
-	  tdesc = allocate_target_description ();
-	  copy_target_description (tdesc, parent_proc->tdesc);
-	  child_proc->tdesc = tdesc;
+	  target_desc_up tdesc = allocate_target_description ();
+	  copy_target_description (tdesc.get (), parent_proc->tdesc);
+	  child_proc->tdesc = tdesc.release ();
 
 	  /* Clone arch-specific process data.  */
 	  low_new_fork (parent_proc, child_proc);
diff --git a/gdbserver/linux-riscv-low.cc b/gdbserver/linux-riscv-low.cc
index 1c6e8c44dd9..32f191ea851 100644
--- a/gdbserver/linux-riscv-low.cc
+++ b/gdbserver/linux-riscv-low.cc
@@ -88,11 +88,11 @@ riscv_target::low_arch_setup ()
 
   const riscv_gdbarch_features features
     = riscv_linux_read_features (lwpid_of (current_thread));
-  target_desc *tdesc = riscv_create_target_description (features);
+  target_desc_up tdesc = riscv_create_target_description (features);
 
   if (!tdesc->expedite_regs)
-    init_target_desc (tdesc, expedite_regs);
-  current_process ()->tdesc = tdesc;
+    init_target_desc (tdesc.get (), expedite_regs);
+  current_process ()->tdesc = tdesc.release ();
 }
 
 /* Collect GPRs from REGCACHE into BUF.  */
diff --git a/gdbserver/linux-x86-low.cc b/gdbserver/linux-x86-low.cc
index eeaced8c8d5..65a0c075705 100644
--- a/gdbserver/linux-x86-low.cc
+++ b/gdbserver/linux-x86-low.cc
@@ -48,9 +48,9 @@
 #include "linux-x86-tdesc.h"
 
 #ifdef __x86_64__
-static struct target_desc *tdesc_amd64_linux_no_xml;
+static target_desc_up tdesc_amd64_linux_no_xml;
 #endif
-static struct target_desc *tdesc_i386_linux_no_xml;
+static target_desc_up tdesc_i386_linux_no_xml;
 
 
 static unsigned char jump_insn[] = { 0xe9, 0, 0, 0, 0 };
@@ -899,10 +899,10 @@ x86_linux_read_description (void)
       /* Don't use XML.  */
 #ifdef __x86_64__
       if (machine == EM_X86_64)
-	return tdesc_amd64_linux_no_xml;
+	return tdesc_amd64_linux_no_xml.get ();
       else
 #endif
-	return tdesc_i386_linux_no_xml;
+	return tdesc_i386_linux_no_xml.get ();
     }
 
   if (have_ptrace_getregset == -1)
@@ -2955,7 +2955,7 @@ x86_target::get_ipa_tdesc_idx ()
   return amd64_get_ipa_tdesc_idx (tdesc);
 #endif
 
-  if (tdesc == tdesc_i386_linux_no_xml)
+  if (tdesc == tdesc_i386_linux_no_xml.get ())
     return X86_TDESC_SSE;
 
   return i386_get_ipa_tdesc_idx (tdesc);
@@ -2971,14 +2971,14 @@ initialize_low_arch (void)
   /* Initialize the Linux target descriptions.  */
 #ifdef __x86_64__
   tdesc_amd64_linux_no_xml = allocate_target_description ();
-  copy_target_description (tdesc_amd64_linux_no_xml,
+  copy_target_description (tdesc_amd64_linux_no_xml.get (),
 			   amd64_linux_read_description (X86_XSTATE_SSE_MASK,
 							 false));
   tdesc_amd64_linux_no_xml->xmltarget = xmltarget_amd64_linux_no_xml;
 #endif
 
   tdesc_i386_linux_no_xml = allocate_target_description ();
-  copy_target_description (tdesc_i386_linux_no_xml,
+  copy_target_description (tdesc_i386_linux_no_xml.get (),
 			   i386_linux_read_description (X86_XSTATE_SSE_MASK));
   tdesc_i386_linux_no_xml->xmltarget = xmltarget_i386_linux_no_xml;
 
diff --git a/gdbserver/tdesc.cc b/gdbserver/tdesc.cc
index e639017cc31..b7e6057ccbe 100644
--- a/gdbserver/tdesc.cc
+++ b/gdbserver/tdesc.cc
@@ -95,10 +95,10 @@ init_target_desc (struct target_desc *tdesc,
 
 /* See gdbsupport/tdesc.h.  */
 
-struct target_desc *
+target_desc_up
 allocate_target_description (void)
 {
-  return new target_desc ();
+  return target_desc_up (new target_desc ());
 }
 
 /* See gdbsupport/tdesc.h.  */
diff --git a/gdbsupport/tdesc.h b/gdbsupport/tdesc.h
index 14b5b5fc9b3..b70a56457da 100644
--- a/gdbsupport/tdesc.h
+++ b/gdbsupport/tdesc.h
@@ -328,7 +328,7 @@ struct target_desc_deleter
 typedef std::unique_ptr<target_desc, target_desc_deleter> target_desc_up;
 
 /* Allocate a new target_desc.  */
-target_desc *allocate_target_description (void);
+target_desc_up allocate_target_description (void);
 
 /* Set TARGET_DESC's architecture by NAME.  */
 void set_tdesc_architecture (target_desc *target_desc,
-- 
2.25.4


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

* Re: [PATCH] gdb: Have allocate_target_description return a unique_ptr
  2020-10-05 19:47 [PATCH] gdb: Have allocate_target_description return a unique_ptr Andrew Burgess
@ 2020-10-05 19:52 ` Simon Marchi
  2020-10-07 11:41 ` Pedro Alves
  1 sibling, 0 replies; 7+ messages in thread
From: Simon Marchi @ 2020-10-05 19:52 UTC (permalink / raw)
  To: Andrew Burgess, gdb-patches

On 2020-10-05 3:47 p.m., Andrew Burgess wrote:
> Below is a rebased version of a patch I posted here:
>
>   https://sourceware.org/pipermail/gdb-patches/2020-July/170639.html
>
> this recieved positive feedback at the time but was buried in some
> other thread so may not have been widely seen.  I thought it was
> probably worth reposting this before merging just to see if anyone
> else had any thoughts.
>
> There's a lot of change here, but all of the *.c files that are marked
> 'Regenerate' in the ChangeLog follow much the same pattern, review one
> of them and you've reviewed them all.
>
> Thanks,
> Andrew

You already have a +1 from me on this (I was the one who pushed you to
do it :)).

Simon

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

* Re: [PATCH] gdb: Have allocate_target_description return a unique_ptr
  2020-10-05 19:47 [PATCH] gdb: Have allocate_target_description return a unique_ptr Andrew Burgess
  2020-10-05 19:52 ` Simon Marchi
@ 2020-10-07 11:41 ` Pedro Alves
  2020-10-08  9:28   ` Andrew Burgess
  1 sibling, 1 reply; 7+ messages in thread
From: Pedro Alves @ 2020-10-07 11:41 UTC (permalink / raw)
  To: Andrew Burgess, gdb-patches

On 10/5/20 8:47 PM, Andrew Burgess wrote:
> --- a/gdb/features/rs6000/powerpc-601.c
> +++ b/gdb/features/rs6000/powerpc-601.c
> @@ -9,7 +9,7 @@ struct target_desc *tdesc_powerpc_601;
>  static void
>  initialize_tdesc_powerpc_601 (void)
>  {
> -  struct target_desc *result = allocate_target_description ();
> +  struct target_desc *result = allocate_target_description ().release ();
>    struct tdesc_feature *feature;
>  

Curious that you didn't tweak target-descriptions.c to output the more
pedantically correct:

  target_desc_up result = allocate_target_description ();

  ...

  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.core");

  ...

  tdesc_powerpc_601 = result.release ();


Anyhow, I like this change too, with or without the change above.

Pedro Alves

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

* Re: [PATCH] gdb: Have allocate_target_description return a unique_ptr
  2020-10-07 11:41 ` Pedro Alves
@ 2020-10-08  9:28   ` Andrew Burgess
  2020-10-08 15:17     ` [PATCH] gdb: Delay releasing target_desc_up in more cases Andrew Burgess
  0 siblings, 1 reply; 7+ messages in thread
From: Andrew Burgess @ 2020-10-08  9:28 UTC (permalink / raw)
  To: Pedro Alves; +Cc: gdb-patches

* Pedro Alves <pedro@palves.net> [2020-10-07 12:41:37 +0100]:

> On 10/5/20 8:47 PM, Andrew Burgess wrote:
> > --- a/gdb/features/rs6000/powerpc-601.c
> > +++ b/gdb/features/rs6000/powerpc-601.c
> > @@ -9,7 +9,7 @@ struct target_desc *tdesc_powerpc_601;
> >  static void
> >  initialize_tdesc_powerpc_601 (void)
> >  {
> > -  struct target_desc *result = allocate_target_description ();
> > +  struct target_desc *result = allocate_target_description ().release ();
> >    struct tdesc_feature *feature;
> >  
> 
> Curious that you didn't tweak target-descriptions.c to output the more
> pedantically correct:
> 
>   target_desc_up result = allocate_target_description ();
> 
>   ...
> 
>   feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.core");
> 
>   ...
> 
>   tdesc_powerpc_601 = result.release ();
> 
> 

I made this change and pushed this patch....

.... and then realised that I missed updating gdb/arch*.c.

There's no functional issues with what I pushed, it just calls release
earlier than you'd have liked.

I'll roll a fix for this.

What I actually pushed is included below.

Thanks,
Andrew

---

commit 51a948fdf0e14fb69ab9e0c79ae8b2415801f9a3
Author: Andrew Burgess <andrew.burgess@embecosm.com>
Date:   Mon Jul 20 14:18:04 2020 +0100

    gdb: Have allocate_target_description return a unique_ptr
    
    Update allocate_target_description to return a target_desc_up, a
    specialisation of unique_ptr.
    
    This commit does not attempt to make use of the unique_ptr in the
    best possible way, in almost all cases we immediately release the
    pointer from within the unique_ptr and then continue as before.
    
    There are a few places where it was easy to handle the unique_ptr, and
    in these cases I've done that.
    
    Everything under gdb/features/* is auto-regenerated.
    
    There should be no user visible changes after this commit.
    
    gdb/ChangeLog:
    
            * arch/aarch32.c (aarch32_create_target_description): Release
            unique_ptr returned from allocate_target_description.
            * arch/aarch64.c (aarch64_create_target_description): Likewise.
            * arch/amd64.c (amd64_create_target_description): Likewise.
            * arch/arc.c (arc_create_target_description): Likewise.
            * arch/arm.c (arm_create_target_description): Likewise.
            * arch/i386.c (i386_create_target_description): Likewise.
            * arch/riscv.c (riscv_create_target_description): Update return
            type.  Handle allocate_target_description returning a unique_ptr.
            (riscv_lookup_target_description): Update to handle unique_ptr.
            * arch/tic6x.c (tic6x_create_target_description): Release
            unique_ptr returned from allocate_target_description.
            * features/microblaze-with-stack-protect.c: Regenerate.
            * features/microblaze.c: Regenerate.
            * features/mips-dsp-linux.c: Regenerate.
            * features/mips-linux.c: Regenerate.
            * features/mips64-dsp-linux.c: Regenerate.
            * features/mips64-linux.c: Regenerate.
            * features/nds32.c: Regenerate.
            * features/nios2.c: Regenerate.
            * features/or1k.c: Regenerate.
            * features/rs6000/powerpc-32.c: Regenerate.
            * features/rs6000/powerpc-32l.c: Regenerate.
            * features/rs6000/powerpc-403.c: Regenerate.
            * features/rs6000/powerpc-403gc.c: Regenerate.
            * features/rs6000/powerpc-405.c: Regenerate.
            * features/rs6000/powerpc-505.c: Regenerate.
            * features/rs6000/powerpc-601.c: Regenerate.
            * features/rs6000/powerpc-602.c: Regenerate.
            * features/rs6000/powerpc-603.c: Regenerate.
            * features/rs6000/powerpc-604.c: Regenerate.
            * features/rs6000/powerpc-64.c: Regenerate.
            * features/rs6000/powerpc-64l.c: Regenerate.
            * features/rs6000/powerpc-7400.c: Regenerate.
            * features/rs6000/powerpc-750.c: Regenerate.
            * features/rs6000/powerpc-860.c: Regenerate.
            * features/rs6000/powerpc-altivec32.c: Regenerate.
            * features/rs6000/powerpc-altivec32l.c: Regenerate.
            * features/rs6000/powerpc-altivec64.c: Regenerate.
            * features/rs6000/powerpc-altivec64l.c: Regenerate.
            * features/rs6000/powerpc-e500.c: Regenerate.
            * features/rs6000/powerpc-e500l.c: Regenerate.
            * features/rs6000/powerpc-isa205-32l.c: Regenerate.
            * features/rs6000/powerpc-isa205-64l.c: Regenerate.
            * features/rs6000/powerpc-isa205-altivec32l.c: Regenerate.
            * features/rs6000/powerpc-isa205-altivec64l.c: Regenerate.
            * features/rs6000/powerpc-isa205-ppr-dscr-vsx32l.c: Regenerate.
            * features/rs6000/powerpc-isa205-ppr-dscr-vsx64l.c: Regenerate.
            * features/rs6000/powerpc-isa205-vsx32l.c: Regenerate.
            * features/rs6000/powerpc-isa205-vsx64l.c: Regenerate.
            * features/rs6000/powerpc-isa207-htm-vsx32l.c: Regenerate.
            * features/rs6000/powerpc-isa207-htm-vsx64l.c: Regenerate.
            * features/rs6000/powerpc-isa207-vsx32l.c: Regenerate.
            * features/rs6000/powerpc-isa207-vsx64l.c: Regenerate.
            * features/rs6000/powerpc-vsx32.c: Regenerate.
            * features/rs6000/powerpc-vsx32l.c: Regenerate.
            * features/rs6000/powerpc-vsx64.c: Regenerate.
            * features/rs6000/powerpc-vsx64l.c: Regenerate.
            * features/rs6000/rs6000.c: Regenerate.
            * features/rx.c: Regenerate.
            * features/s390-gs-linux64.c: Regenerate.
            * features/s390-linux32.c: Regenerate.
            * features/s390-linux32v1.c: Regenerate.
            * features/s390-linux32v2.c: Regenerate.
            * features/s390-linux64.c: Regenerate.
            * features/s390-linux64v1.c: Regenerate.
            * features/s390-linux64v2.c: Regenerate.
            * features/s390-te-linux64.c: Regenerate.
            * features/s390-tevx-linux64.c: Regenerate.
            * features/s390-vx-linux64.c: Regenerate.
            * features/s390x-gs-linux64.c: Regenerate.
            * features/s390x-linux64.c: Regenerate.
            * features/s390x-linux64v1.c: Regenerate.
            * features/s390x-linux64v2.c: Regenerate.
            * features/s390x-te-linux64.c: Regenerate.
            * features/s390x-tevx-linux64.c: Regenerate.
            * features/s390x-vx-linux64.c: Regenerate.
            * mips-tdep.c (_initialize_mips_tdep): Release unique_ptr returned
            from allocate_target_description.
            * target-descriptions.c (allocate_target_description): Update
            return type.
            (print_c_tdesc::visit_pre): Release unique_ptr returned from
            allocate_target_description.
    
    gdbserver/ChangeLog:
    
            * linux-low.cc (linux_process_target::handle_extended_wait):
            Release the unique_ptr returned from allocate_target_description.
            * linux-riscv-low.cc (riscv_target::low_arch_setup): Likewise.
            * linux-x86-low.cc (tdesc_amd64_linux_no_xml): Change type.
            (tdesc_i386_linux_no_xml): Change type.
            (x86_linux_read_description): Borrow pointer from unique_ptr
            object.
            (x86_target::get_ipa_tdesc_idx): Likewise.
            (initialize_low_arch): Likewise.
            * tdesc.cc (allocate_target_description): Update return type.
    
    gdbsupport/ChangeLog:
    
            * tdesc.h (allocate_target_description): Update return type.

diff --git a/gdb/arch/aarch32.c b/gdb/arch/aarch32.c
index 5bc24a30164..bf7a33230e0 100644
--- a/gdb/arch/aarch32.c
+++ b/gdb/arch/aarch32.c
@@ -26,7 +26,7 @@
 target_desc *
 aarch32_create_target_description ()
 {
-  target_desc *tdesc = allocate_target_description ();
+  target_desc *tdesc = allocate_target_description ().release ();
 
 #ifndef IN_PROCESS_AGENT
   set_tdesc_architecture (tdesc, "arm");
diff --git a/gdb/arch/aarch64.c b/gdb/arch/aarch64.c
index f6115434989..c0af7b0906f 100644
--- a/gdb/arch/aarch64.c
+++ b/gdb/arch/aarch64.c
@@ -29,7 +29,7 @@
 target_desc *
 aarch64_create_target_description (uint64_t vq, bool pauth_p)
 {
-  target_desc *tdesc = allocate_target_description ();
+  target_desc *tdesc = allocate_target_description ().release ();
 
 #ifndef IN_PROCESS_AGENT
   set_tdesc_architecture (tdesc, "aarch64");
diff --git a/gdb/arch/amd64.c b/gdb/arch/amd64.c
index a388c7e49d1..b11a4fdc0fc 100644
--- a/gdb/arch/amd64.c
+++ b/gdb/arch/amd64.c
@@ -40,7 +40,7 @@ target_desc *
 amd64_create_target_description (uint64_t xcr0, bool is_x32, bool is_linux,
 				 bool segments)
 {
-  target_desc *tdesc = allocate_target_description ();
+  target_desc *tdesc = allocate_target_description ().release ();
 
 #ifndef IN_PROCESS_AGENT
   set_tdesc_architecture (tdesc, is_x32 ? "i386:x64-32" : "i386:x86-64");
diff --git a/gdb/arch/arc.c b/gdb/arch/arc.c
index 3808f9fe292..dff457576e1 100644
--- a/gdb/arch/arc.c
+++ b/gdb/arch/arc.c
@@ -38,7 +38,7 @@ STATIC_IN_GDB target_desc *
 arc_create_target_description (const struct arc_arch_features &features)
 {
   /* Create a new target description.  */
-  target_desc *tdesc = allocate_target_description ();
+  target_desc *tdesc = allocate_target_description ().release ();
 
 #ifndef IN_PROCESS_AGENT
   std::string arch_name;
diff --git a/gdb/arch/arm.c b/gdb/arch/arm.c
index faa2b4fbd4b..dc67e40f9cf 100644
--- a/gdb/arch/arm.c
+++ b/gdb/arch/arm.c
@@ -374,7 +374,7 @@ shifted_reg_val (struct regcache *regcache, unsigned long inst,
 target_desc *
 arm_create_target_description (arm_fp_type fp_type)
 {
-  target_desc *tdesc = allocate_target_description ();
+  target_desc *tdesc = allocate_target_description ().release ();
 
 #ifndef IN_PROCESS_AGENT
   if (fp_type == ARM_FP_TYPE_IWMMXT)
@@ -416,7 +416,7 @@ arm_create_target_description (arm_fp_type fp_type)
 target_desc *
 arm_create_mprofile_target_description (arm_m_profile_type m_type)
 {
-  target_desc *tdesc = allocate_target_description ();
+  target_desc *tdesc = allocate_target_description ().release ();
 
 #ifndef IN_PROCESS_AGENT
   set_tdesc_architecture (tdesc, "arm");
diff --git a/gdb/arch/i386.c b/gdb/arch/i386.c
index 099a20b98a2..13201db1d74 100644
--- a/gdb/arch/i386.c
+++ b/gdb/arch/i386.c
@@ -35,7 +35,7 @@
 target_desc *
 i386_create_target_description (uint64_t xcr0, bool is_linux, bool segments)
 {
-  target_desc *tdesc = allocate_target_description ();
+  target_desc *tdesc = allocate_target_description ().release ();
 
 #ifndef IN_PROCESS_AGENT
   set_tdesc_architecture (tdesc, "i386");
diff --git a/gdb/arch/riscv.c b/gdb/arch/riscv.c
index 8f5709092e9..a6538dee541 100644
--- a/gdb/arch/riscv.c
+++ b/gdb/arch/riscv.c
@@ -33,11 +33,11 @@
 
 /* See arch/riscv.h.  */
 
-STATIC_IN_GDB target_desc *
+STATIC_IN_GDB target_desc_up
 riscv_create_target_description (const struct riscv_gdbarch_features features)
 {
   /* Now we should create a new target description.  */
-  target_desc *tdesc = allocate_target_description ();
+  target_desc_up tdesc = allocate_target_description ();
 
 #ifndef IN_PROCESS_AGENT
   std::string arch_name = "riscv";
@@ -56,22 +56,22 @@ riscv_create_target_description (const struct riscv_gdbarch_features features)
   else if (features.flen == 16)
     arch_name.append ("q");
 
-  set_tdesc_architecture (tdesc, arch_name.c_str ());
+  set_tdesc_architecture (tdesc.get (), arch_name.c_str ());
 #endif
 
   long regnum = 0;
 
   /* For now we only support creating 32-bit or 64-bit x-registers.  */
   if (features.xlen == 4)
-    regnum = create_feature_riscv_32bit_cpu (tdesc, regnum);
+    regnum = create_feature_riscv_32bit_cpu (tdesc.get (), regnum);
   else if (features.xlen == 8)
-    regnum = create_feature_riscv_64bit_cpu (tdesc, regnum);
+    regnum = create_feature_riscv_64bit_cpu (tdesc.get (), regnum);
 
   /* For now we only support creating 32-bit or 64-bit f-registers.  */
   if (features.flen == 4)
-    regnum = create_feature_riscv_32bit_fpu (tdesc, regnum);
+    regnum = create_feature_riscv_32bit_fpu (tdesc.get (), regnum);
   else if (features.flen == 8)
-    regnum = create_feature_riscv_64bit_fpu (tdesc, regnum);
+    regnum = create_feature_riscv_64bit_fpu (tdesc.get (), regnum);
 
   return tdesc;
 }
@@ -106,13 +106,14 @@ riscv_lookup_target_description (const struct riscv_gdbarch_features features)
   if (it != riscv_tdesc_cache.end ())
     return it->second.get ();
 
-  target_desc *tdesc = riscv_create_target_description (features);
+  target_desc_up tdesc (riscv_create_target_description (features));
 
-  /* Add to the cache.  Work around a problem with g++ 4.8 (PR96537):
-     Call the target_desc_up constructor explictly instead of implicitly.  */
-  riscv_tdesc_cache.emplace (features, target_desc_up (tdesc));
-
-  return tdesc;
+  /* Add to the cache, and return a pointer borrowed from the
+     target_desc_up.  This is safe as the cache (and the pointers
+     contained within it) are not deleted until GDB exits.  */
+  target_desc *ptr = tdesc.get ();
+  riscv_tdesc_cache.emplace (features, std::move (tdesc));
+  return ptr;
 }
 
 #endif /* !GDBSERVER */
diff --git a/gdb/arch/tic6x.c b/gdb/arch/tic6x.c
index 5f14d34750b..dad4dd85a4d 100644
--- a/gdb/arch/tic6x.c
+++ b/gdb/arch/tic6x.c
@@ -28,7 +28,7 @@
 target_desc *
 tic6x_create_target_description (enum c6x_feature feature)
 {
-  target_desc *tdesc = allocate_target_description ();
+  target_desc *tdesc = allocate_target_description ().release ();
 
   set_tdesc_architecture (tdesc, "tic6x");
   set_tdesc_osabi (tdesc, "GNU/Linux");
diff --git a/gdb/features/microblaze-with-stack-protect.c b/gdb/features/microblaze-with-stack-protect.c
index b39aa198874..aa180bf35d5 100644
--- a/gdb/features/microblaze-with-stack-protect.c
+++ b/gdb/features/microblaze-with-stack-protect.c
@@ -9,10 +9,10 @@ struct target_desc *tdesc_microblaze_with_stack_protect;
 static void
 initialize_tdesc_microblaze_with_stack_protect (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  target_desc_up result = allocate_target_description ();
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.microblaze.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.microblaze.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "data_ptr");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "int");
@@ -71,9 +71,9 @@ initialize_tdesc_microblaze_with_stack_protect (void)
   tdesc_create_reg (feature, "rtlblo", 55, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "rtlbhi", 56, 1, NULL, 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.microblaze.stack-protect");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.microblaze.stack-protect");
   tdesc_create_reg (feature, "rslr", 57, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "rshr", 58, 1, NULL, 32, "int");
 
-  tdesc_microblaze_with_stack_protect = result;
+  tdesc_microblaze_with_stack_protect = result.release ();
 }
diff --git a/gdb/features/microblaze.c b/gdb/features/microblaze.c
index 6c86fc07700..ef2c64c720e 100644
--- a/gdb/features/microblaze.c
+++ b/gdb/features/microblaze.c
@@ -9,10 +9,10 @@ struct target_desc *tdesc_microblaze;
 static void
 initialize_tdesc_microblaze (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  target_desc_up result = allocate_target_description ();
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.microblaze.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.microblaze.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "data_ptr");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "int");
@@ -71,5 +71,5 @@ initialize_tdesc_microblaze (void)
   tdesc_create_reg (feature, "rtlblo", 55, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "rtlbhi", 56, 1, NULL, 32, "int");
 
-  tdesc_microblaze = result;
+  tdesc_microblaze = result.release ();
 }
diff --git a/gdb/features/mips-dsp-linux.c b/gdb/features/mips-dsp-linux.c
index 26e9c6b01de..76a91775e26 100644
--- a/gdb/features/mips-dsp-linux.c
+++ b/gdb/features/mips-dsp-linux.c
@@ -9,14 +9,14 @@ struct target_desc *tdesc_mips_dsp_linux;
 static void
 initialize_tdesc_mips_dsp_linux (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("mips"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("mips"));
 
-  set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
+  set_tdesc_osabi (result.get (), osabi_from_tdesc_string ("GNU/Linux"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.mips.cpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.mips.cpu");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "int");
@@ -53,12 +53,12 @@ initialize_tdesc_mips_dsp_linux (void)
   tdesc_create_reg (feature, "hi", 34, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "pc", 37, 1, NULL, 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.mips.cp0");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.mips.cp0");
   tdesc_create_reg (feature, "status", 32, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "badvaddr", 35, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "cause", 36, 1, NULL, 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.mips.fpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.mips.fpu");
   tdesc_create_reg (feature, "f0", 38, 1, NULL, 32, "ieee_single");
   tdesc_create_reg (feature, "f1", 39, 1, NULL, 32, "ieee_single");
   tdesc_create_reg (feature, "f2", 40, 1, NULL, 32, "ieee_single");
@@ -94,7 +94,7 @@ initialize_tdesc_mips_dsp_linux (void)
   tdesc_create_reg (feature, "fcsr", 70, 1, "float", 32, "int");
   tdesc_create_reg (feature, "fir", 71, 1, "float", 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.mips.dsp");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.mips.dsp");
   tdesc_create_reg (feature, "hi1", 72, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "lo1", 73, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "hi2", 74, 1, NULL, 32, "int");
@@ -103,8 +103,8 @@ initialize_tdesc_mips_dsp_linux (void)
   tdesc_create_reg (feature, "lo3", 77, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "dspctl", 78, 1, NULL, 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.mips.linux");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.mips.linux");
   tdesc_create_reg (feature, "restart", 79, 1, "system", 32, "int");
 
-  tdesc_mips_dsp_linux = result;
+  tdesc_mips_dsp_linux = result.release ();
 }
diff --git a/gdb/features/mips-linux.c b/gdb/features/mips-linux.c
index c9ad3ca7eba..f97232c8a75 100644
--- a/gdb/features/mips-linux.c
+++ b/gdb/features/mips-linux.c
@@ -9,14 +9,14 @@ struct target_desc *tdesc_mips_linux;
 static void
 initialize_tdesc_mips_linux (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("mips"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("mips"));
 
-  set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
+  set_tdesc_osabi (result.get (), osabi_from_tdesc_string ("GNU/Linux"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.mips.cpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.mips.cpu");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "int");
@@ -53,12 +53,12 @@ initialize_tdesc_mips_linux (void)
   tdesc_create_reg (feature, "hi", 34, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "pc", 37, 1, NULL, 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.mips.cp0");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.mips.cp0");
   tdesc_create_reg (feature, "status", 32, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "badvaddr", 35, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "cause", 36, 1, NULL, 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.mips.fpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.mips.fpu");
   tdesc_create_reg (feature, "f0", 38, 1, NULL, 32, "ieee_single");
   tdesc_create_reg (feature, "f1", 39, 1, NULL, 32, "ieee_single");
   tdesc_create_reg (feature, "f2", 40, 1, NULL, 32, "ieee_single");
@@ -94,8 +94,8 @@ initialize_tdesc_mips_linux (void)
   tdesc_create_reg (feature, "fcsr", 70, 1, "float", 32, "int");
   tdesc_create_reg (feature, "fir", 71, 1, "float", 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.mips.linux");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.mips.linux");
   tdesc_create_reg (feature, "restart", 72, 1, "system", 32, "int");
 
-  tdesc_mips_linux = result;
+  tdesc_mips_linux = result.release ();
 }
diff --git a/gdb/features/mips64-dsp-linux.c b/gdb/features/mips64-dsp-linux.c
index 05317b70f4f..48d212ad907 100644
--- a/gdb/features/mips64-dsp-linux.c
+++ b/gdb/features/mips64-dsp-linux.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_mips64_dsp_linux;
 static void
 initialize_tdesc_mips64_dsp_linux (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("mips"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("mips"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.mips.cpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.mips.cpu");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 64, "int");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 64, "int");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 64, "int");
@@ -51,12 +51,12 @@ initialize_tdesc_mips64_dsp_linux (void)
   tdesc_create_reg (feature, "hi", 34, 1, NULL, 64, "int");
   tdesc_create_reg (feature, "pc", 37, 1, NULL, 64, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.mips.cp0");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.mips.cp0");
   tdesc_create_reg (feature, "status", 32, 1, NULL, 64, "int");
   tdesc_create_reg (feature, "badvaddr", 35, 1, NULL, 64, "int");
   tdesc_create_reg (feature, "cause", 36, 1, NULL, 64, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.mips.fpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.mips.fpu");
   tdesc_create_reg (feature, "f0", 38, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 39, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f2", 40, 1, NULL, 64, "ieee_double");
@@ -92,7 +92,7 @@ initialize_tdesc_mips64_dsp_linux (void)
   tdesc_create_reg (feature, "fcsr", 70, 1, "float", 64, "int");
   tdesc_create_reg (feature, "fir", 71, 1, "float", 64, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.mips.dsp");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.mips.dsp");
   tdesc_create_reg (feature, "hi1", 72, 1, NULL, 64, "int");
   tdesc_create_reg (feature, "lo1", 73, 1, NULL, 64, "int");
   tdesc_create_reg (feature, "hi2", 74, 1, NULL, 64, "int");
@@ -101,8 +101,8 @@ initialize_tdesc_mips64_dsp_linux (void)
   tdesc_create_reg (feature, "lo3", 77, 1, NULL, 64, "int");
   tdesc_create_reg (feature, "dspctl", 78, 1, NULL, 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.mips.linux");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.mips.linux");
   tdesc_create_reg (feature, "restart", 79, 1, "system", 64, "int");
 
-  tdesc_mips64_dsp_linux = result;
+  tdesc_mips64_dsp_linux = result.release ();
 }
diff --git a/gdb/features/mips64-linux.c b/gdb/features/mips64-linux.c
index 4814152c430..4b37d3ddb12 100644
--- a/gdb/features/mips64-linux.c
+++ b/gdb/features/mips64-linux.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_mips64_linux;
 static void
 initialize_tdesc_mips64_linux (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("mips"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("mips"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.mips.cpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.mips.cpu");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 64, "int");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 64, "int");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 64, "int");
@@ -51,12 +51,12 @@ initialize_tdesc_mips64_linux (void)
   tdesc_create_reg (feature, "hi", 34, 1, NULL, 64, "int");
   tdesc_create_reg (feature, "pc", 37, 1, NULL, 64, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.mips.cp0");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.mips.cp0");
   tdesc_create_reg (feature, "status", 32, 1, NULL, 64, "int");
   tdesc_create_reg (feature, "badvaddr", 35, 1, NULL, 64, "int");
   tdesc_create_reg (feature, "cause", 36, 1, NULL, 64, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.mips.fpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.mips.fpu");
   tdesc_create_reg (feature, "f0", 38, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 39, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f2", 40, 1, NULL, 64, "ieee_double");
@@ -92,8 +92,8 @@ initialize_tdesc_mips64_linux (void)
   tdesc_create_reg (feature, "fcsr", 70, 1, "float", 64, "int");
   tdesc_create_reg (feature, "fir", 71, 1, "float", 64, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.mips.linux");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.mips.linux");
   tdesc_create_reg (feature, "restart", 72, 1, "system", 64, "int");
 
-  tdesc_mips64_linux = result;
+  tdesc_mips64_linux = result.release ();
 }
diff --git a/gdb/features/nds32.c b/gdb/features/nds32.c
index 89b246b8ce0..ed535b5ab9f 100644
--- a/gdb/features/nds32.c
+++ b/gdb/features/nds32.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_nds32;
 static void
 initialize_tdesc_nds32 (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("n1h"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("n1h"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.nds32.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.nds32.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "int");
@@ -49,7 +49,7 @@ initialize_tdesc_nds32 (void)
   tdesc_create_reg (feature, "sp", 31, 1, NULL, 32, "data_ptr");
   tdesc_create_reg (feature, "pc", 32, 1, NULL, 32, "code_ptr");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.nds32.fpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.nds32.fpu");
   tdesc_create_reg (feature, "fd0", 33, 1, "float", 64, "ieee_double");
   tdesc_create_reg (feature, "fd1", 34, 1, "float", 64, "ieee_double");
   tdesc_create_reg (feature, "fd2", 35, 1, "float", 64, "ieee_double");
@@ -83,10 +83,10 @@ initialize_tdesc_nds32 (void)
   tdesc_create_reg (feature, "fd30", 63, 1, "float", 64, "ieee_double");
   tdesc_create_reg (feature, "fd31", 64, 1, "float", 64, "ieee_double");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.nds32.system");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.nds32.system");
   tdesc_create_reg (feature, "ir0", 65, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "itb", 66, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "ifc_lp", 67, 1, NULL, 32, "int");
 
-  tdesc_nds32 = result;
+  tdesc_nds32 = result.release ();
 }
diff --git a/gdb/features/nios2.c b/gdb/features/nios2.c
index 705f499e65b..6872aaea02d 100644
--- a/gdb/features/nios2.c
+++ b/gdb/features/nios2.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_nios2;
 static void
 initialize_tdesc_nios2 (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("nios2"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("nios2"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.nios2.cpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.nios2.cpu");
   tdesc_create_reg (feature, "zero", 0, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "at", 1, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "uint32");
@@ -65,5 +65,5 @@ initialize_tdesc_nios2 (void)
   tdesc_create_reg (feature, "mpubase", 47, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "mpuacc", 48, 1, NULL, 32, "uint32");
 
-  tdesc_nios2 = result;
+  tdesc_nios2 = result.release ();
 }
diff --git a/gdb/features/or1k.c b/gdb/features/or1k.c
index 9169cae940e..c1fd26ce8d6 100644
--- a/gdb/features/or1k.c
+++ b/gdb/features/or1k.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_or1k;
 static void
 initialize_tdesc_or1k (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("or1k"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("or1k"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.or1k.group0");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.or1k.group0");
   tdesc_type_with_fields *type_with_fields;
   type_with_fields = tdesc_create_flags (feature, "sr_flags", 4);
   tdesc_add_flag (type_with_fields, 0, "SM");
@@ -72,5 +72,5 @@ initialize_tdesc_or1k (void)
   tdesc_create_reg (feature, "npc", 33, 1, NULL, 32, "code_ptr");
   tdesc_create_reg (feature, "sr", 34, 1, NULL, 32, "sr_flags");
 
-  tdesc_or1k = result;
+  tdesc_or1k = result.release ();
 }
diff --git a/gdb/features/rs6000/powerpc-32.c b/gdb/features/rs6000/powerpc-32.c
index 39f5b14bb43..4c766b7bf0e 100644
--- a/gdb/features/rs6000/powerpc-32.c
+++ b/gdb/features/rs6000/powerpc-32.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_powerpc_32;
 static void
 initialize_tdesc_powerpc_32 (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("powerpc:common"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "uint32");
@@ -54,7 +54,7 @@ initialize_tdesc_powerpc_32 (void)
   tdesc_create_reg (feature, "ctr", 68, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.fpu");
   tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
@@ -89,5 +89,5 @@ initialize_tdesc_powerpc_32 (void)
   tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "fpscr", 70, 1, "float", 32, "int");
 
-  tdesc_powerpc_32 = result;
+  tdesc_powerpc_32 = result.release ();
 }
diff --git a/gdb/features/rs6000/powerpc-32l.c b/gdb/features/rs6000/powerpc-32l.c
index 8089c0434ee..34cba5d8a82 100644
--- a/gdb/features/rs6000/powerpc-32l.c
+++ b/gdb/features/rs6000/powerpc-32l.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_powerpc_32l;
 static void
 initialize_tdesc_powerpc_32l (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("powerpc:common"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "uint32");
@@ -54,7 +54,7 @@ initialize_tdesc_powerpc_32l (void)
   tdesc_create_reg (feature, "ctr", 68, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.fpu");
   tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
@@ -89,9 +89,9 @@ initialize_tdesc_powerpc_32l (void)
   tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "fpscr", 70, 1, "float", 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.linux");
   tdesc_create_reg (feature, "orig_r3", 71, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "trap", 72, 1, NULL, 32, "int");
 
-  tdesc_powerpc_32l = result;
+  tdesc_powerpc_32l = result.release ();
 }
diff --git a/gdb/features/rs6000/powerpc-403.c b/gdb/features/rs6000/powerpc-403.c
index a9106f5c536..1b16e081c61 100644
--- a/gdb/features/rs6000/powerpc-403.c
+++ b/gdb/features/rs6000/powerpc-403.c
@@ -9,10 +9,10 @@ struct target_desc *tdesc_powerpc_403;
 static void
 initialize_tdesc_powerpc_403 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  target_desc_up result = allocate_target_description ();
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "uint32");
@@ -52,7 +52,7 @@ initialize_tdesc_powerpc_403 (void)
   tdesc_create_reg (feature, "ctr", 68, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.fpu");
   tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
@@ -87,7 +87,7 @@ initialize_tdesc_powerpc_403 (void)
   tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "fpscr", 70, 1, "float", 32, "int");
 
-  feature = tdesc_create_feature (result, "OEA");
+  feature = tdesc_create_feature (result.get (), "OEA");
   tdesc_create_reg (feature, "sr0", 71, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "sr1", 72, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "sr2", 73, 1, NULL, 32, "int");
@@ -137,7 +137,7 @@ initialize_tdesc_powerpc_403 (void)
   tdesc_create_reg (feature, "dabr", 117, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "ear", 118, 1, NULL, 32, "int");
 
-  feature = tdesc_create_feature (result, "403");
+  feature = tdesc_create_feature (result.get (), "403");
   tdesc_create_reg (feature, "icdbdr", 119, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "esr", 120, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "dear", 121, 1, NULL, 32, "int");
@@ -163,5 +163,5 @@ initialize_tdesc_powerpc_403 (void)
   tdesc_create_reg (feature, "pbl2", 141, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "pbu2", 142, 1, NULL, 32, "int");
 
-  tdesc_powerpc_403 = result;
+  tdesc_powerpc_403 = result.release ();
 }
diff --git a/gdb/features/rs6000/powerpc-403gc.c b/gdb/features/rs6000/powerpc-403gc.c
index 402b747a48f..4ff844dcd73 100644
--- a/gdb/features/rs6000/powerpc-403gc.c
+++ b/gdb/features/rs6000/powerpc-403gc.c
@@ -9,10 +9,10 @@ struct target_desc *tdesc_powerpc_403gc;
 static void
 initialize_tdesc_powerpc_403gc (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  target_desc_up result = allocate_target_description ();
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "uint32");
@@ -52,7 +52,7 @@ initialize_tdesc_powerpc_403gc (void)
   tdesc_create_reg (feature, "ctr", 68, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.fpu");
   tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
@@ -87,7 +87,7 @@ initialize_tdesc_powerpc_403gc (void)
   tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "fpscr", 70, 1, "float", 32, "int");
 
-  feature = tdesc_create_feature (result, "OEA");
+  feature = tdesc_create_feature (result.get (), "OEA");
   tdesc_create_reg (feature, "sr0", 71, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "sr1", 72, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "sr2", 73, 1, NULL, 32, "int");
@@ -137,7 +137,7 @@ initialize_tdesc_powerpc_403gc (void)
   tdesc_create_reg (feature, "dabr", 117, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "ear", 118, 1, NULL, 32, "int");
 
-  feature = tdesc_create_feature (result, "403GC");
+  feature = tdesc_create_feature (result.get (), "403GC");
   tdesc_create_reg (feature, "icdbdr", 119, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "esr", 120, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "dear", 121, 1, NULL, 32, "int");
@@ -169,5 +169,5 @@ initialize_tdesc_powerpc_403gc (void)
   tdesc_create_reg (feature, "tbhu", 147, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "tblu", 148, 1, NULL, 32, "int");
 
-  tdesc_powerpc_403gc = result;
+  tdesc_powerpc_403gc = result.release ();
 }
diff --git a/gdb/features/rs6000/powerpc-405.c b/gdb/features/rs6000/powerpc-405.c
index bcfa1445d23..4c97aa5ef62 100644
--- a/gdb/features/rs6000/powerpc-405.c
+++ b/gdb/features/rs6000/powerpc-405.c
@@ -9,10 +9,10 @@ struct target_desc *tdesc_powerpc_405;
 static void
 initialize_tdesc_powerpc_405 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  target_desc_up result = allocate_target_description ();
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "uint32");
@@ -52,7 +52,7 @@ initialize_tdesc_powerpc_405 (void)
   tdesc_create_reg (feature, "ctr", 68, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.fpu");
   tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
@@ -87,7 +87,7 @@ initialize_tdesc_powerpc_405 (void)
   tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "fpscr", 70, 1, "float", 32, "int");
 
-  feature = tdesc_create_feature (result, "405");
+  feature = tdesc_create_feature (result.get (), "405");
   tdesc_create_reg (feature, "pvr", 87, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "sprg0", 108, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "sprg1", 109, 1, NULL, 32, "int");
@@ -132,5 +132,5 @@ initialize_tdesc_powerpc_405 (void)
   tdesc_create_reg (feature, "su0r", 160, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "usprg0", 161, 1, NULL, 32, "int");
 
-  tdesc_powerpc_405 = result;
+  tdesc_powerpc_405 = result.release ();
 }
diff --git a/gdb/features/rs6000/powerpc-505.c b/gdb/features/rs6000/powerpc-505.c
index 09b0c7a3854..b9cae668aac 100644
--- a/gdb/features/rs6000/powerpc-505.c
+++ b/gdb/features/rs6000/powerpc-505.c
@@ -9,10 +9,10 @@ struct target_desc *tdesc_powerpc_505;
 static void
 initialize_tdesc_powerpc_505 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  target_desc_up result = allocate_target_description ();
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "uint32");
@@ -52,7 +52,7 @@ initialize_tdesc_powerpc_505 (void)
   tdesc_create_reg (feature, "ctr", 68, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.fpu");
   tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
@@ -87,7 +87,7 @@ initialize_tdesc_powerpc_505 (void)
   tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "fpscr", 70, 1, "float", 32, "int");
 
-  feature = tdesc_create_feature (result, "OEA");
+  feature = tdesc_create_feature (result.get (), "OEA");
   tdesc_create_reg (feature, "sr0", 71, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "sr1", 72, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "sr2", 73, 1, NULL, 32, "int");
@@ -137,10 +137,10 @@ initialize_tdesc_powerpc_505 (void)
   tdesc_create_reg (feature, "dabr", 117, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "ear", 118, 1, NULL, 32, "int");
 
-  feature = tdesc_create_feature (result, "505");
+  feature = tdesc_create_feature (result.get (), "505");
   tdesc_create_reg (feature, "eie", 119, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "eid", 120, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "nri", 121, 1, NULL, 32, "int");
 
-  tdesc_powerpc_505 = result;
+  tdesc_powerpc_505 = result.release ();
 }
diff --git a/gdb/features/rs6000/powerpc-601.c b/gdb/features/rs6000/powerpc-601.c
index f30f5e66f82..ba35dc97bf2 100644
--- a/gdb/features/rs6000/powerpc-601.c
+++ b/gdb/features/rs6000/powerpc-601.c
@@ -9,10 +9,10 @@ struct target_desc *tdesc_powerpc_601;
 static void
 initialize_tdesc_powerpc_601 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  target_desc_up result = allocate_target_description ();
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "int");
@@ -53,7 +53,7 @@ initialize_tdesc_powerpc_601 (void)
   tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "mq", 124, 1, NULL, 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.fpu");
   tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
@@ -88,7 +88,7 @@ initialize_tdesc_powerpc_601 (void)
   tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "fpscr", 70, 1, "float", 32, "int");
 
-  feature = tdesc_create_feature (result, "OEA");
+  feature = tdesc_create_feature (result.get (), "OEA");
   tdesc_create_reg (feature, "sr0", 71, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "sr1", 72, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "sr2", 73, 1, NULL, 32, "int");
@@ -138,7 +138,7 @@ initialize_tdesc_powerpc_601 (void)
   tdesc_create_reg (feature, "dabr", 117, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "ear", 118, 1, NULL, 32, "int");
 
-  feature = tdesc_create_feature (result, "601");
+  feature = tdesc_create_feature (result.get (), "601");
   tdesc_create_reg (feature, "hid0", 119, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "hid1", 120, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "iabr", 121, 1, NULL, 32, "int");
@@ -146,5 +146,5 @@ initialize_tdesc_powerpc_601 (void)
   tdesc_create_reg (feature, "rtcu", 125, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "rtcl", 126, 1, NULL, 32, "int");
 
-  tdesc_powerpc_601 = result;
+  tdesc_powerpc_601 = result.release ();
 }
diff --git a/gdb/features/rs6000/powerpc-602.c b/gdb/features/rs6000/powerpc-602.c
index 769671746ad..7f69f44ca34 100644
--- a/gdb/features/rs6000/powerpc-602.c
+++ b/gdb/features/rs6000/powerpc-602.c
@@ -9,10 +9,10 @@ struct target_desc *tdesc_powerpc_602;
 static void
 initialize_tdesc_powerpc_602 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  target_desc_up result = allocate_target_description ();
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "uint32");
@@ -52,7 +52,7 @@ initialize_tdesc_powerpc_602 (void)
   tdesc_create_reg (feature, "ctr", 68, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.fpu");
   tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
@@ -87,7 +87,7 @@ initialize_tdesc_powerpc_602 (void)
   tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "fpscr", 70, 1, "float", 32, "int");
 
-  feature = tdesc_create_feature (result, "OEA");
+  feature = tdesc_create_feature (result.get (), "OEA");
   tdesc_create_reg (feature, "sr0", 71, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "sr1", 72, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "sr2", 73, 1, NULL, 32, "int");
@@ -137,7 +137,7 @@ initialize_tdesc_powerpc_602 (void)
   tdesc_create_reg (feature, "dabr", 117, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "ear", 118, 1, NULL, 32, "int");
 
-  feature = tdesc_create_feature (result, "602");
+  feature = tdesc_create_feature (result.get (), "602");
   tdesc_create_reg (feature, "hid0", 119, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "hid1", 120, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "iabr", 121, 1, NULL, 32, "int");
@@ -149,5 +149,5 @@ initialize_tdesc_powerpc_602 (void)
   tdesc_create_reg (feature, "sp", 129, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "lt", 130, 1, NULL, 32, "int");
 
-  tdesc_powerpc_602 = result;
+  tdesc_powerpc_602 = result.release ();
 }
diff --git a/gdb/features/rs6000/powerpc-603.c b/gdb/features/rs6000/powerpc-603.c
index d5dae39b10d..28c3628dbf5 100644
--- a/gdb/features/rs6000/powerpc-603.c
+++ b/gdb/features/rs6000/powerpc-603.c
@@ -9,10 +9,10 @@ struct target_desc *tdesc_powerpc_603;
 static void
 initialize_tdesc_powerpc_603 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  target_desc_up result = allocate_target_description ();
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "uint32");
@@ -52,7 +52,7 @@ initialize_tdesc_powerpc_603 (void)
   tdesc_create_reg (feature, "ctr", 68, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.fpu");
   tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
@@ -87,7 +87,7 @@ initialize_tdesc_powerpc_603 (void)
   tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "fpscr", 70, 1, "float", 32, "int");
 
-  feature = tdesc_create_feature (result, "OEA");
+  feature = tdesc_create_feature (result.get (), "OEA");
   tdesc_create_reg (feature, "sr0", 71, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "sr1", 72, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "sr2", 73, 1, NULL, 32, "int");
@@ -137,7 +137,7 @@ initialize_tdesc_powerpc_603 (void)
   tdesc_create_reg (feature, "dabr", 117, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "ear", 118, 1, NULL, 32, "int");
 
-  feature = tdesc_create_feature (result, "603");
+  feature = tdesc_create_feature (result.get (), "603");
   tdesc_create_reg (feature, "hid0", 119, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "hid1", 120, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "iabr", 121, 1, NULL, 32, "int");
@@ -149,5 +149,5 @@ initialize_tdesc_powerpc_603 (void)
   tdesc_create_reg (feature, "icmp", 129, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "rpa", 130, 1, NULL, 32, "int");
 
-  tdesc_powerpc_603 = result;
+  tdesc_powerpc_603 = result.release ();
 }
diff --git a/gdb/features/rs6000/powerpc-604.c b/gdb/features/rs6000/powerpc-604.c
index 44dc8caf47e..fe0fe2fc7e4 100644
--- a/gdb/features/rs6000/powerpc-604.c
+++ b/gdb/features/rs6000/powerpc-604.c
@@ -9,10 +9,10 @@ struct target_desc *tdesc_powerpc_604;
 static void
 initialize_tdesc_powerpc_604 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  target_desc_up result = allocate_target_description ();
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "uint32");
@@ -52,7 +52,7 @@ initialize_tdesc_powerpc_604 (void)
   tdesc_create_reg (feature, "ctr", 68, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.fpu");
   tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
@@ -87,7 +87,7 @@ initialize_tdesc_powerpc_604 (void)
   tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "fpscr", 70, 1, "float", 32, "int");
 
-  feature = tdesc_create_feature (result, "OEA");
+  feature = tdesc_create_feature (result.get (), "OEA");
   tdesc_create_reg (feature, "sr0", 71, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "sr1", 72, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "sr2", 73, 1, NULL, 32, "int");
@@ -137,7 +137,7 @@ initialize_tdesc_powerpc_604 (void)
   tdesc_create_reg (feature, "dabr", 117, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "ear", 118, 1, NULL, 32, "int");
 
-  feature = tdesc_create_feature (result, "604");
+  feature = tdesc_create_feature (result.get (), "604");
   tdesc_create_reg (feature, "hid0", 119, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "hid1", 120, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "iabr", 121, 1, NULL, 32, "int");
@@ -149,5 +149,5 @@ initialize_tdesc_powerpc_604 (void)
   tdesc_create_reg (feature, "sia", 127, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "sda", 128, 1, NULL, 32, "int");
 
-  tdesc_powerpc_604 = result;
+  tdesc_powerpc_604 = result.release ();
 }
diff --git a/gdb/features/rs6000/powerpc-64.c b/gdb/features/rs6000/powerpc-64.c
index a9760a37d95..d0688ee28eb 100644
--- a/gdb/features/rs6000/powerpc-64.c
+++ b/gdb/features/rs6000/powerpc-64.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_powerpc_64;
 static void
 initialize_tdesc_powerpc_64 (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("powerpc:common64"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 64, "uint64");
@@ -54,7 +54,7 @@ initialize_tdesc_powerpc_64 (void)
   tdesc_create_reg (feature, "ctr", 68, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.fpu");
   tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
@@ -89,5 +89,5 @@ initialize_tdesc_powerpc_64 (void)
   tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "fpscr", 70, 1, "float", 32, "int");
 
-  tdesc_powerpc_64 = result;
+  tdesc_powerpc_64 = result.release ();
 }
diff --git a/gdb/features/rs6000/powerpc-64l.c b/gdb/features/rs6000/powerpc-64l.c
index 408794e13a0..465c023696a 100644
--- a/gdb/features/rs6000/powerpc-64l.c
+++ b/gdb/features/rs6000/powerpc-64l.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_powerpc_64l;
 static void
 initialize_tdesc_powerpc_64l (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("powerpc:common64"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 64, "uint64");
@@ -54,7 +54,7 @@ initialize_tdesc_powerpc_64l (void)
   tdesc_create_reg (feature, "ctr", 68, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.fpu");
   tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
@@ -89,9 +89,9 @@ initialize_tdesc_powerpc_64l (void)
   tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "fpscr", 70, 1, "float", 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.linux");
   tdesc_create_reg (feature, "orig_r3", 71, 1, NULL, 64, "int");
   tdesc_create_reg (feature, "trap", 72, 1, NULL, 64, "int");
 
-  tdesc_powerpc_64l = result;
+  tdesc_powerpc_64l = result.release ();
 }
diff --git a/gdb/features/rs6000/powerpc-7400.c b/gdb/features/rs6000/powerpc-7400.c
index 58f8a69a1e2..0e71dd7c2bb 100644
--- a/gdb/features/rs6000/powerpc-7400.c
+++ b/gdb/features/rs6000/powerpc-7400.c
@@ -9,10 +9,10 @@ struct target_desc *tdesc_powerpc_7400;
 static void
 initialize_tdesc_powerpc_7400 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  target_desc_up result = allocate_target_description ();
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "uint32");
@@ -52,7 +52,7 @@ initialize_tdesc_powerpc_7400 (void)
   tdesc_create_reg (feature, "ctr", 68, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.fpu");
   tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
@@ -87,7 +87,7 @@ initialize_tdesc_powerpc_7400 (void)
   tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "fpscr", 70, 1, "float", 32, "int");
 
-  feature = tdesc_create_feature (result, "OEA");
+  feature = tdesc_create_feature (result.get (), "OEA");
   tdesc_create_reg (feature, "sr0", 71, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "sr1", 72, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "sr2", 73, 1, NULL, 32, "int");
@@ -137,7 +137,7 @@ initialize_tdesc_powerpc_7400 (void)
   tdesc_create_reg (feature, "dabr", 117, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "ear", 118, 1, NULL, 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.altivec");
   tdesc_type *element_type;
   element_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", element_type, 4);
@@ -200,5 +200,5 @@ initialize_tdesc_powerpc_7400 (void)
   tdesc_create_reg (feature, "vscr", 151, 1, "vector", 32, "int");
   tdesc_create_reg (feature, "vrsave", 152, 1, "vector", 32, "int");
 
-  tdesc_powerpc_7400 = result;
+  tdesc_powerpc_7400 = result.release ();
 }
diff --git a/gdb/features/rs6000/powerpc-750.c b/gdb/features/rs6000/powerpc-750.c
index 099a478518f..396ec456651 100644
--- a/gdb/features/rs6000/powerpc-750.c
+++ b/gdb/features/rs6000/powerpc-750.c
@@ -9,10 +9,10 @@ struct target_desc *tdesc_powerpc_750;
 static void
 initialize_tdesc_powerpc_750 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  target_desc_up result = allocate_target_description ();
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "uint32");
@@ -52,7 +52,7 @@ initialize_tdesc_powerpc_750 (void)
   tdesc_create_reg (feature, "ctr", 68, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.fpu");
   tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
@@ -87,7 +87,7 @@ initialize_tdesc_powerpc_750 (void)
   tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "fpscr", 70, 1, "float", 32, "int");
 
-  feature = tdesc_create_feature (result, "OEA");
+  feature = tdesc_create_feature (result.get (), "OEA");
   tdesc_create_reg (feature, "sr0", 71, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "sr1", 72, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "sr2", 73, 1, NULL, 32, "int");
@@ -137,7 +137,7 @@ initialize_tdesc_powerpc_750 (void)
   tdesc_create_reg (feature, "dabr", 117, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "ear", 118, 1, NULL, 32, "int");
 
-  feature = tdesc_create_feature (result, "750");
+  feature = tdesc_create_feature (result.get (), "750");
   tdesc_create_reg (feature, "hid0", 119, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "hid1", 120, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "iabr", 121, 1, NULL, 32, "int");
@@ -162,5 +162,5 @@ initialize_tdesc_powerpc_750 (void)
   tdesc_create_reg (feature, "thrm2", 141, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "thrm3", 142, 1, NULL, 32, "int");
 
-  tdesc_powerpc_750 = result;
+  tdesc_powerpc_750 = result.release ();
 }
diff --git a/gdb/features/rs6000/powerpc-860.c b/gdb/features/rs6000/powerpc-860.c
index 0692feb2a5e..328ad195772 100644
--- a/gdb/features/rs6000/powerpc-860.c
+++ b/gdb/features/rs6000/powerpc-860.c
@@ -9,10 +9,10 @@ struct target_desc *tdesc_powerpc_860;
 static void
 initialize_tdesc_powerpc_860 (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  target_desc_up result = allocate_target_description ();
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "uint32");
@@ -52,7 +52,7 @@ initialize_tdesc_powerpc_860 (void)
   tdesc_create_reg (feature, "ctr", 68, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.fpu");
   tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
@@ -87,7 +87,7 @@ initialize_tdesc_powerpc_860 (void)
   tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "fpscr", 70, 1, "float", 32, "int");
 
-  feature = tdesc_create_feature (result, "OEA");
+  feature = tdesc_create_feature (result.get (), "OEA");
   tdesc_create_reg (feature, "sr0", 71, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "sr1", 72, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "sr2", 73, 1, NULL, 32, "int");
@@ -137,7 +137,7 @@ initialize_tdesc_powerpc_860 (void)
   tdesc_create_reg (feature, "dabr", 117, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "ear", 118, 1, NULL, 32, "int");
 
-  feature = tdesc_create_feature (result, "860");
+  feature = tdesc_create_feature (result.get (), "860");
   tdesc_create_reg (feature, "eie", 119, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "eid", 120, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "nri", 121, 1, NULL, 32, "int");
@@ -186,5 +186,5 @@ initialize_tdesc_powerpc_860 (void)
   tdesc_create_reg (feature, "md_dbram0", 164, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "md_dbram1", 165, 1, NULL, 32, "int");
 
-  tdesc_powerpc_860 = result;
+  tdesc_powerpc_860 = result.release ();
 }
diff --git a/gdb/features/rs6000/powerpc-altivec32.c b/gdb/features/rs6000/powerpc-altivec32.c
index bbb36c8aa59..743ca06fdd1 100644
--- a/gdb/features/rs6000/powerpc-altivec32.c
+++ b/gdb/features/rs6000/powerpc-altivec32.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_powerpc_altivec32;
 static void
 initialize_tdesc_powerpc_altivec32 (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("powerpc:common"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "uint32");
@@ -54,7 +54,7 @@ initialize_tdesc_powerpc_altivec32 (void)
   tdesc_create_reg (feature, "ctr", 68, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.fpu");
   tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
@@ -89,7 +89,7 @@ initialize_tdesc_powerpc_altivec32 (void)
   tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "fpscr", 70, 1, "float", 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.altivec");
   tdesc_type *element_type;
   element_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", element_type, 4);
@@ -152,5 +152,5 @@ initialize_tdesc_powerpc_altivec32 (void)
   tdesc_create_reg (feature, "vscr", 103, 1, "vector", 32, "int");
   tdesc_create_reg (feature, "vrsave", 104, 1, "vector", 32, "int");
 
-  tdesc_powerpc_altivec32 = result;
+  tdesc_powerpc_altivec32 = result.release ();
 }
diff --git a/gdb/features/rs6000/powerpc-altivec32l.c b/gdb/features/rs6000/powerpc-altivec32l.c
index 81862cb9ef4..a19016bbac4 100644
--- a/gdb/features/rs6000/powerpc-altivec32l.c
+++ b/gdb/features/rs6000/powerpc-altivec32l.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_powerpc_altivec32l;
 static void
 initialize_tdesc_powerpc_altivec32l (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("powerpc:common"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "uint32");
@@ -54,7 +54,7 @@ initialize_tdesc_powerpc_altivec32l (void)
   tdesc_create_reg (feature, "ctr", 68, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.fpu");
   tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
@@ -89,11 +89,11 @@ initialize_tdesc_powerpc_altivec32l (void)
   tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "fpscr", 70, 1, "float", 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.linux");
   tdesc_create_reg (feature, "orig_r3", 71, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "trap", 72, 1, NULL, 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.altivec");
   tdesc_type *element_type;
   element_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", element_type, 4);
@@ -156,5 +156,5 @@ initialize_tdesc_powerpc_altivec32l (void)
   tdesc_create_reg (feature, "vscr", 105, 1, "vector", 32, "int");
   tdesc_create_reg (feature, "vrsave", 106, 1, "vector", 32, "int");
 
-  tdesc_powerpc_altivec32l = result;
+  tdesc_powerpc_altivec32l = result.release ();
 }
diff --git a/gdb/features/rs6000/powerpc-altivec64.c b/gdb/features/rs6000/powerpc-altivec64.c
index f7a7c729637..b8a157bb98e 100644
--- a/gdb/features/rs6000/powerpc-altivec64.c
+++ b/gdb/features/rs6000/powerpc-altivec64.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_powerpc_altivec64;
 static void
 initialize_tdesc_powerpc_altivec64 (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("powerpc:common64"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 64, "uint64");
@@ -54,7 +54,7 @@ initialize_tdesc_powerpc_altivec64 (void)
   tdesc_create_reg (feature, "ctr", 68, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.fpu");
   tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
@@ -89,7 +89,7 @@ initialize_tdesc_powerpc_altivec64 (void)
   tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "fpscr", 70, 1, "float", 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.altivec");
   tdesc_type *element_type;
   element_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", element_type, 4);
@@ -152,5 +152,5 @@ initialize_tdesc_powerpc_altivec64 (void)
   tdesc_create_reg (feature, "vscr", 103, 1, "vector", 32, "int");
   tdesc_create_reg (feature, "vrsave", 104, 1, "vector", 32, "int");
 
-  tdesc_powerpc_altivec64 = result;
+  tdesc_powerpc_altivec64 = result.release ();
 }
diff --git a/gdb/features/rs6000/powerpc-altivec64l.c b/gdb/features/rs6000/powerpc-altivec64l.c
index ce0bc86137e..1846d067330 100644
--- a/gdb/features/rs6000/powerpc-altivec64l.c
+++ b/gdb/features/rs6000/powerpc-altivec64l.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_powerpc_altivec64l;
 static void
 initialize_tdesc_powerpc_altivec64l (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("powerpc:common64"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 64, "uint64");
@@ -54,7 +54,7 @@ initialize_tdesc_powerpc_altivec64l (void)
   tdesc_create_reg (feature, "ctr", 68, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.fpu");
   tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
@@ -89,11 +89,11 @@ initialize_tdesc_powerpc_altivec64l (void)
   tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "fpscr", 70, 1, "float", 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.linux");
   tdesc_create_reg (feature, "orig_r3", 71, 1, NULL, 64, "int");
   tdesc_create_reg (feature, "trap", 72, 1, NULL, 64, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.altivec");
   tdesc_type *element_type;
   element_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", element_type, 4);
@@ -156,5 +156,5 @@ initialize_tdesc_powerpc_altivec64l (void)
   tdesc_create_reg (feature, "vscr", 105, 1, "vector", 32, "int");
   tdesc_create_reg (feature, "vrsave", 106, 1, "vector", 32, "int");
 
-  tdesc_powerpc_altivec64l = result;
+  tdesc_powerpc_altivec64l = result.release ();
 }
diff --git a/gdb/features/rs6000/powerpc-e500.c b/gdb/features/rs6000/powerpc-e500.c
index 4466bc79a9b..bf6240561d0 100644
--- a/gdb/features/rs6000/powerpc-e500.c
+++ b/gdb/features/rs6000/powerpc-e500.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_powerpc_e500;
 static void
 initialize_tdesc_powerpc_e500 (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("powerpc:e500"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("powerpc:e500"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "uint32");
@@ -54,7 +54,7 @@ initialize_tdesc_powerpc_e500 (void)
   tdesc_create_reg (feature, "ctr", 68, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.spe");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.spe");
   tdesc_create_reg (feature, "ev0h", 32, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "ev1h", 33, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "ev2h", 34, 1, NULL, 32, "int");
@@ -90,5 +90,5 @@ initialize_tdesc_powerpc_e500 (void)
   tdesc_create_reg (feature, "acc", 73, 1, NULL, 64, "int");
   tdesc_create_reg (feature, "spefscr", 74, 1, NULL, 32, "int");
 
-  tdesc_powerpc_e500 = result;
+  tdesc_powerpc_e500 = result.release ();
 }
diff --git a/gdb/features/rs6000/powerpc-e500l.c b/gdb/features/rs6000/powerpc-e500l.c
index 61acbf3dd31..8199989d3a1 100644
--- a/gdb/features/rs6000/powerpc-e500l.c
+++ b/gdb/features/rs6000/powerpc-e500l.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_powerpc_e500l;
 static void
 initialize_tdesc_powerpc_e500l (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("powerpc:e500"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("powerpc:e500"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "uint32");
@@ -54,7 +54,7 @@ initialize_tdesc_powerpc_e500l (void)
   tdesc_create_reg (feature, "ctr", 68, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.spe");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.spe");
   tdesc_create_reg (feature, "ev0h", 32, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "ev1h", 33, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "ev2h", 34, 1, NULL, 32, "int");
@@ -90,9 +90,9 @@ initialize_tdesc_powerpc_e500l (void)
   tdesc_create_reg (feature, "acc", 73, 1, NULL, 64, "int");
   tdesc_create_reg (feature, "spefscr", 74, 1, NULL, 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.linux");
   tdesc_create_reg (feature, "orig_r3", 71, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "trap", 72, 1, NULL, 32, "int");
 
-  tdesc_powerpc_e500l = result;
+  tdesc_powerpc_e500l = result.release ();
 }
diff --git a/gdb/features/rs6000/powerpc-isa205-32l.c b/gdb/features/rs6000/powerpc-isa205-32l.c
index de6548fdf7c..7791fa7e029 100644
--- a/gdb/features/rs6000/powerpc-isa205-32l.c
+++ b/gdb/features/rs6000/powerpc-isa205-32l.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_powerpc_isa205_32l;
 static void
 initialize_tdesc_powerpc_isa205_32l (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("powerpc:common"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "uint32");
@@ -54,7 +54,7 @@ initialize_tdesc_powerpc_isa205_32l (void)
   tdesc_create_reg (feature, "ctr", 68, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.fpu");
   tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
@@ -89,9 +89,9 @@ initialize_tdesc_powerpc_isa205_32l (void)
   tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "fpscr", 70, 1, "float", 64, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.linux");
   tdesc_create_reg (feature, "orig_r3", 71, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "trap", 72, 1, NULL, 32, "int");
 
-  tdesc_powerpc_isa205_32l = result;
+  tdesc_powerpc_isa205_32l = result.release ();
 }
diff --git a/gdb/features/rs6000/powerpc-isa205-64l.c b/gdb/features/rs6000/powerpc-isa205-64l.c
index cd3b2c10a6c..fb05df7911b 100644
--- a/gdb/features/rs6000/powerpc-isa205-64l.c
+++ b/gdb/features/rs6000/powerpc-isa205-64l.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_powerpc_isa205_64l;
 static void
 initialize_tdesc_powerpc_isa205_64l (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("powerpc:common64"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 64, "uint64");
@@ -54,7 +54,7 @@ initialize_tdesc_powerpc_isa205_64l (void)
   tdesc_create_reg (feature, "ctr", 68, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.fpu");
   tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
@@ -89,9 +89,9 @@ initialize_tdesc_powerpc_isa205_64l (void)
   tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "fpscr", 70, 1, "float", 64, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.linux");
   tdesc_create_reg (feature, "orig_r3", 71, 1, NULL, 64, "int");
   tdesc_create_reg (feature, "trap", 72, 1, NULL, 64, "int");
 
-  tdesc_powerpc_isa205_64l = result;
+  tdesc_powerpc_isa205_64l = result.release ();
 }
diff --git a/gdb/features/rs6000/powerpc-isa205-altivec32l.c b/gdb/features/rs6000/powerpc-isa205-altivec32l.c
index 09f5c075c8a..a510931ea3c 100644
--- a/gdb/features/rs6000/powerpc-isa205-altivec32l.c
+++ b/gdb/features/rs6000/powerpc-isa205-altivec32l.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_powerpc_isa205_altivec32l;
 static void
 initialize_tdesc_powerpc_isa205_altivec32l (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("powerpc:common"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "uint32");
@@ -54,7 +54,7 @@ initialize_tdesc_powerpc_isa205_altivec32l (void)
   tdesc_create_reg (feature, "ctr", 68, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.fpu");
   tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
@@ -89,11 +89,11 @@ initialize_tdesc_powerpc_isa205_altivec32l (void)
   tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "fpscr", 70, 1, "float", 64, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.linux");
   tdesc_create_reg (feature, "orig_r3", 71, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "trap", 72, 1, NULL, 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.altivec");
   tdesc_type *element_type;
   element_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", element_type, 4);
@@ -156,5 +156,5 @@ initialize_tdesc_powerpc_isa205_altivec32l (void)
   tdesc_create_reg (feature, "vscr", 105, 1, "vector", 32, "int");
   tdesc_create_reg (feature, "vrsave", 106, 1, "vector", 32, "int");
 
-  tdesc_powerpc_isa205_altivec32l = result;
+  tdesc_powerpc_isa205_altivec32l = result.release ();
 }
diff --git a/gdb/features/rs6000/powerpc-isa205-altivec64l.c b/gdb/features/rs6000/powerpc-isa205-altivec64l.c
index 246fcef085c..f91c2e84518 100644
--- a/gdb/features/rs6000/powerpc-isa205-altivec64l.c
+++ b/gdb/features/rs6000/powerpc-isa205-altivec64l.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_powerpc_isa205_altivec64l;
 static void
 initialize_tdesc_powerpc_isa205_altivec64l (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("powerpc:common64"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 64, "uint64");
@@ -54,7 +54,7 @@ initialize_tdesc_powerpc_isa205_altivec64l (void)
   tdesc_create_reg (feature, "ctr", 68, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.fpu");
   tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
@@ -89,11 +89,11 @@ initialize_tdesc_powerpc_isa205_altivec64l (void)
   tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "fpscr", 70, 1, "float", 64, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.linux");
   tdesc_create_reg (feature, "orig_r3", 71, 1, NULL, 64, "int");
   tdesc_create_reg (feature, "trap", 72, 1, NULL, 64, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.altivec");
   tdesc_type *element_type;
   element_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", element_type, 4);
@@ -156,5 +156,5 @@ initialize_tdesc_powerpc_isa205_altivec64l (void)
   tdesc_create_reg (feature, "vscr", 105, 1, "vector", 32, "int");
   tdesc_create_reg (feature, "vrsave", 106, 1, "vector", 32, "int");
 
-  tdesc_powerpc_isa205_altivec64l = result;
+  tdesc_powerpc_isa205_altivec64l = result.release ();
 }
diff --git a/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx32l.c b/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx32l.c
index c8f56ea0294..28a7c3b2c4f 100644
--- a/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx32l.c
+++ b/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx32l.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_powerpc_isa205_ppr_dscr_vsx32l;
 static void
 initialize_tdesc_powerpc_isa205_ppr_dscr_vsx32l (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("powerpc:common"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "uint32");
@@ -54,7 +54,7 @@ initialize_tdesc_powerpc_isa205_ppr_dscr_vsx32l (void)
   tdesc_create_reg (feature, "ctr", 68, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.fpu");
   tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
@@ -89,11 +89,11 @@ initialize_tdesc_powerpc_isa205_ppr_dscr_vsx32l (void)
   tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "fpscr", 70, 1, "float", 64, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.linux");
   tdesc_create_reg (feature, "orig_r3", 71, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "trap", 72, 1, NULL, 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.altivec");
   tdesc_type *element_type;
   element_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", element_type, 4);
@@ -156,7 +156,7 @@ initialize_tdesc_powerpc_isa205_ppr_dscr_vsx32l (void)
   tdesc_create_reg (feature, "vscr", 105, 1, "vector", 32, "int");
   tdesc_create_reg (feature, "vrsave", 106, 1, "vector", 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.vsx");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.vsx");
   tdesc_create_reg (feature, "vs0h", 107, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "vs1h", 108, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "vs2h", 109, 1, NULL, 64, "uint64");
@@ -190,11 +190,11 @@ initialize_tdesc_powerpc_isa205_ppr_dscr_vsx32l (void)
   tdesc_create_reg (feature, "vs30h", 137, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "vs31h", 138, 1, NULL, 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.ppr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.ppr");
   tdesc_create_reg (feature, "ppr", 139, 1, NULL, 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.dscr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.dscr");
   tdesc_create_reg (feature, "dscr", 140, 1, NULL, 64, "uint64");
 
-  tdesc_powerpc_isa205_ppr_dscr_vsx32l = result;
+  tdesc_powerpc_isa205_ppr_dscr_vsx32l = result.release ();
 }
diff --git a/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx64l.c b/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx64l.c
index 76e32f3b1b6..d34a197b4f5 100644
--- a/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx64l.c
+++ b/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx64l.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_powerpc_isa205_ppr_dscr_vsx64l;
 static void
 initialize_tdesc_powerpc_isa205_ppr_dscr_vsx64l (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("powerpc:common64"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 64, "uint64");
@@ -54,7 +54,7 @@ initialize_tdesc_powerpc_isa205_ppr_dscr_vsx64l (void)
   tdesc_create_reg (feature, "ctr", 68, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.fpu");
   tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
@@ -89,11 +89,11 @@ initialize_tdesc_powerpc_isa205_ppr_dscr_vsx64l (void)
   tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "fpscr", 70, 1, "float", 64, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.linux");
   tdesc_create_reg (feature, "orig_r3", 71, 1, NULL, 64, "int");
   tdesc_create_reg (feature, "trap", 72, 1, NULL, 64, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.altivec");
   tdesc_type *element_type;
   element_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", element_type, 4);
@@ -156,7 +156,7 @@ initialize_tdesc_powerpc_isa205_ppr_dscr_vsx64l (void)
   tdesc_create_reg (feature, "vscr", 105, 1, "vector", 32, "int");
   tdesc_create_reg (feature, "vrsave", 106, 1, "vector", 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.vsx");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.vsx");
   tdesc_create_reg (feature, "vs0h", 107, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "vs1h", 108, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "vs2h", 109, 1, NULL, 64, "uint64");
@@ -190,11 +190,11 @@ initialize_tdesc_powerpc_isa205_ppr_dscr_vsx64l (void)
   tdesc_create_reg (feature, "vs30h", 137, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "vs31h", 138, 1, NULL, 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.ppr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.ppr");
   tdesc_create_reg (feature, "ppr", 139, 1, NULL, 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.dscr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.dscr");
   tdesc_create_reg (feature, "dscr", 140, 1, NULL, 64, "uint64");
 
-  tdesc_powerpc_isa205_ppr_dscr_vsx64l = result;
+  tdesc_powerpc_isa205_ppr_dscr_vsx64l = result.release ();
 }
diff --git a/gdb/features/rs6000/powerpc-isa205-vsx32l.c b/gdb/features/rs6000/powerpc-isa205-vsx32l.c
index 2a6e232e994..763915502c0 100644
--- a/gdb/features/rs6000/powerpc-isa205-vsx32l.c
+++ b/gdb/features/rs6000/powerpc-isa205-vsx32l.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_powerpc_isa205_vsx32l;
 static void
 initialize_tdesc_powerpc_isa205_vsx32l (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("powerpc:common"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "uint32");
@@ -54,7 +54,7 @@ initialize_tdesc_powerpc_isa205_vsx32l (void)
   tdesc_create_reg (feature, "ctr", 68, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.fpu");
   tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
@@ -89,11 +89,11 @@ initialize_tdesc_powerpc_isa205_vsx32l (void)
   tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "fpscr", 70, 1, "float", 64, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.linux");
   tdesc_create_reg (feature, "orig_r3", 71, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "trap", 72, 1, NULL, 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.altivec");
   tdesc_type *element_type;
   element_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", element_type, 4);
@@ -156,7 +156,7 @@ initialize_tdesc_powerpc_isa205_vsx32l (void)
   tdesc_create_reg (feature, "vscr", 105, 1, "vector", 32, "int");
   tdesc_create_reg (feature, "vrsave", 106, 1, "vector", 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.vsx");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.vsx");
   tdesc_create_reg (feature, "vs0h", 107, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "vs1h", 108, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "vs2h", 109, 1, NULL, 64, "uint64");
@@ -190,5 +190,5 @@ initialize_tdesc_powerpc_isa205_vsx32l (void)
   tdesc_create_reg (feature, "vs30h", 137, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "vs31h", 138, 1, NULL, 64, "uint64");
 
-  tdesc_powerpc_isa205_vsx32l = result;
+  tdesc_powerpc_isa205_vsx32l = result.release ();
 }
diff --git a/gdb/features/rs6000/powerpc-isa205-vsx64l.c b/gdb/features/rs6000/powerpc-isa205-vsx64l.c
index d0e32f29b1b..fad4227b095 100644
--- a/gdb/features/rs6000/powerpc-isa205-vsx64l.c
+++ b/gdb/features/rs6000/powerpc-isa205-vsx64l.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_powerpc_isa205_vsx64l;
 static void
 initialize_tdesc_powerpc_isa205_vsx64l (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("powerpc:common64"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 64, "uint64");
@@ -54,7 +54,7 @@ initialize_tdesc_powerpc_isa205_vsx64l (void)
   tdesc_create_reg (feature, "ctr", 68, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.fpu");
   tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
@@ -89,11 +89,11 @@ initialize_tdesc_powerpc_isa205_vsx64l (void)
   tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "fpscr", 70, 1, "float", 64, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.linux");
   tdesc_create_reg (feature, "orig_r3", 71, 1, NULL, 64, "int");
   tdesc_create_reg (feature, "trap", 72, 1, NULL, 64, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.altivec");
   tdesc_type *element_type;
   element_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", element_type, 4);
@@ -156,7 +156,7 @@ initialize_tdesc_powerpc_isa205_vsx64l (void)
   tdesc_create_reg (feature, "vscr", 105, 1, "vector", 32, "int");
   tdesc_create_reg (feature, "vrsave", 106, 1, "vector", 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.vsx");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.vsx");
   tdesc_create_reg (feature, "vs0h", 107, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "vs1h", 108, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "vs2h", 109, 1, NULL, 64, "uint64");
@@ -190,5 +190,5 @@ initialize_tdesc_powerpc_isa205_vsx64l (void)
   tdesc_create_reg (feature, "vs30h", 137, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "vs31h", 138, 1, NULL, 64, "uint64");
 
-  tdesc_powerpc_isa205_vsx64l = result;
+  tdesc_powerpc_isa205_vsx64l = result.release ();
 }
diff --git a/gdb/features/rs6000/powerpc-isa207-htm-vsx32l.c b/gdb/features/rs6000/powerpc-isa207-htm-vsx32l.c
index e1b933c8fb3..78f2047272a 100644
--- a/gdb/features/rs6000/powerpc-isa207-htm-vsx32l.c
+++ b/gdb/features/rs6000/powerpc-isa207-htm-vsx32l.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_powerpc_isa207_htm_vsx32l;
 static void
 initialize_tdesc_powerpc_isa207_htm_vsx32l (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("powerpc:common"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "uint32");
@@ -54,7 +54,7 @@ initialize_tdesc_powerpc_isa207_htm_vsx32l (void)
   tdesc_create_reg (feature, "ctr", 68, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.fpu");
   tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
@@ -89,11 +89,11 @@ initialize_tdesc_powerpc_isa207_htm_vsx32l (void)
   tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "fpscr", 70, 1, "float", 64, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.linux");
   tdesc_create_reg (feature, "orig_r3", 71, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "trap", 72, 1, NULL, 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.altivec");
   tdesc_type *element_type;
   element_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", element_type, 4);
@@ -156,7 +156,7 @@ initialize_tdesc_powerpc_isa207_htm_vsx32l (void)
   tdesc_create_reg (feature, "vscr", 105, 1, "vector", 32, "int");
   tdesc_create_reg (feature, "vrsave", 106, 1, "vector", 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.vsx");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.vsx");
   tdesc_create_reg (feature, "vs0h", 107, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "vs1h", 108, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "vs2h", 109, 1, NULL, 64, "uint64");
@@ -190,33 +190,33 @@ initialize_tdesc_powerpc_isa207_htm_vsx32l (void)
   tdesc_create_reg (feature, "vs30h", 137, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "vs31h", 138, 1, NULL, 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.ppr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.ppr");
   tdesc_create_reg (feature, "ppr", 139, 1, NULL, 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.dscr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.dscr");
   tdesc_create_reg (feature, "dscr", 140, 1, NULL, 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.tar");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.tar");
   tdesc_create_reg (feature, "tar", 141, 1, NULL, 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.ebb");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.ebb");
   tdesc_create_reg (feature, "bescr", 142, 0, NULL, 64, "uint64");
   tdesc_create_reg (feature, "ebbhr", 143, 0, NULL, 64, "uint64");
   tdesc_create_reg (feature, "ebbrr", 144, 0, NULL, 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux.pmu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.linux.pmu");
   tdesc_create_reg (feature, "mmcr0", 145, 0, NULL, 64, "uint64");
   tdesc_create_reg (feature, "mmcr2", 146, 0, NULL, 64, "uint64");
   tdesc_create_reg (feature, "siar", 147, 0, NULL, 64, "uint64");
   tdesc_create_reg (feature, "sdar", 148, 0, NULL, 64, "uint64");
   tdesc_create_reg (feature, "sier", 149, 0, NULL, 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.spr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.htm.spr");
   tdesc_create_reg (feature, "tfhar", 150, 0, NULL, 64, "uint64");
   tdesc_create_reg (feature, "texasr", 151, 0, NULL, 64, "uint64");
   tdesc_create_reg (feature, "tfiar", 152, 0, NULL, 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.htm.core");
   tdesc_create_reg (feature, "cr0", 153, 0, NULL, 32, "uint32");
   tdesc_create_reg (feature, "cr1", 154, 0, NULL, 32, "uint32");
   tdesc_create_reg (feature, "cr2", 155, 0, NULL, 32, "uint32");
@@ -254,7 +254,7 @@ initialize_tdesc_powerpc_isa207_htm_vsx32l (void)
   tdesc_create_reg (feature, "clr", 187, 0, NULL, 32, "code_ptr");
   tdesc_create_reg (feature, "cctr", 188, 0, NULL, 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.fpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.htm.fpu");
   tdesc_create_reg (feature, "cf0", 189, 0, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "cf1", 190, 0, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "cf2", 191, 0, NULL, 64, "ieee_double");
@@ -289,7 +289,7 @@ initialize_tdesc_powerpc_isa207_htm_vsx32l (void)
   tdesc_create_reg (feature, "cf31", 220, 0, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "cfpscr", 221, 0, "float", 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.altivec");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.htm.altivec");
   element_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", element_type, 4);
 
@@ -349,7 +349,7 @@ initialize_tdesc_powerpc_isa207_htm_vsx32l (void)
   tdesc_create_reg (feature, "cvscr", 254, 0, "vector", 32, "int");
   tdesc_create_reg (feature, "cvrsave", 255, 0, "vector", 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.vsx");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.htm.vsx");
   tdesc_create_reg (feature, "cvs0h", 256, 0, NULL, 64, "uint64");
   tdesc_create_reg (feature, "cvs1h", 257, 0, NULL, 64, "uint64");
   tdesc_create_reg (feature, "cvs2h", 258, 0, NULL, 64, "uint64");
@@ -383,14 +383,14 @@ initialize_tdesc_powerpc_isa207_htm_vsx32l (void)
   tdesc_create_reg (feature, "cvs30h", 286, 0, NULL, 64, "uint64");
   tdesc_create_reg (feature, "cvs31h", 287, 0, NULL, 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.ppr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.htm.ppr");
   tdesc_create_reg (feature, "cppr", 288, 0, NULL, 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.dscr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.htm.dscr");
   tdesc_create_reg (feature, "cdscr", 289, 0, NULL, 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.tar");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.htm.tar");
   tdesc_create_reg (feature, "ctar", 290, 0, NULL, 64, "uint64");
 
-  tdesc_powerpc_isa207_htm_vsx32l = result;
+  tdesc_powerpc_isa207_htm_vsx32l = result.release ();
 }
diff --git a/gdb/features/rs6000/powerpc-isa207-htm-vsx64l.c b/gdb/features/rs6000/powerpc-isa207-htm-vsx64l.c
index 0d818d01593..5517201043f 100644
--- a/gdb/features/rs6000/powerpc-isa207-htm-vsx64l.c
+++ b/gdb/features/rs6000/powerpc-isa207-htm-vsx64l.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_powerpc_isa207_htm_vsx64l;
 static void
 initialize_tdesc_powerpc_isa207_htm_vsx64l (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("powerpc:common64"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 64, "uint64");
@@ -54,7 +54,7 @@ initialize_tdesc_powerpc_isa207_htm_vsx64l (void)
   tdesc_create_reg (feature, "ctr", 68, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.fpu");
   tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
@@ -89,11 +89,11 @@ initialize_tdesc_powerpc_isa207_htm_vsx64l (void)
   tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "fpscr", 70, 1, "float", 64, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.linux");
   tdesc_create_reg (feature, "orig_r3", 71, 1, NULL, 64, "int");
   tdesc_create_reg (feature, "trap", 72, 1, NULL, 64, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.altivec");
   tdesc_type *element_type;
   element_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", element_type, 4);
@@ -156,7 +156,7 @@ initialize_tdesc_powerpc_isa207_htm_vsx64l (void)
   tdesc_create_reg (feature, "vscr", 105, 1, "vector", 32, "int");
   tdesc_create_reg (feature, "vrsave", 106, 1, "vector", 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.vsx");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.vsx");
   tdesc_create_reg (feature, "vs0h", 107, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "vs1h", 108, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "vs2h", 109, 1, NULL, 64, "uint64");
@@ -190,33 +190,33 @@ initialize_tdesc_powerpc_isa207_htm_vsx64l (void)
   tdesc_create_reg (feature, "vs30h", 137, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "vs31h", 138, 1, NULL, 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.ppr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.ppr");
   tdesc_create_reg (feature, "ppr", 139, 1, NULL, 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.dscr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.dscr");
   tdesc_create_reg (feature, "dscr", 140, 1, NULL, 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.tar");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.tar");
   tdesc_create_reg (feature, "tar", 141, 1, NULL, 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.ebb");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.ebb");
   tdesc_create_reg (feature, "bescr", 142, 0, NULL, 64, "uint64");
   tdesc_create_reg (feature, "ebbhr", 143, 0, NULL, 64, "uint64");
   tdesc_create_reg (feature, "ebbrr", 144, 0, NULL, 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux.pmu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.linux.pmu");
   tdesc_create_reg (feature, "mmcr0", 145, 0, NULL, 64, "uint64");
   tdesc_create_reg (feature, "mmcr2", 146, 0, NULL, 64, "uint64");
   tdesc_create_reg (feature, "siar", 147, 0, NULL, 64, "uint64");
   tdesc_create_reg (feature, "sdar", 148, 0, NULL, 64, "uint64");
   tdesc_create_reg (feature, "sier", 149, 0, NULL, 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.spr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.htm.spr");
   tdesc_create_reg (feature, "tfhar", 150, 0, NULL, 64, "uint64");
   tdesc_create_reg (feature, "texasr", 151, 0, NULL, 64, "uint64");
   tdesc_create_reg (feature, "tfiar", 152, 0, NULL, 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.htm.core");
   tdesc_create_reg (feature, "cr0", 153, 0, NULL, 64, "uint64");
   tdesc_create_reg (feature, "cr1", 154, 0, NULL, 64, "uint64");
   tdesc_create_reg (feature, "cr2", 155, 0, NULL, 64, "uint64");
@@ -254,7 +254,7 @@ initialize_tdesc_powerpc_isa207_htm_vsx64l (void)
   tdesc_create_reg (feature, "clr", 187, 0, NULL, 64, "code_ptr");
   tdesc_create_reg (feature, "cctr", 188, 0, NULL, 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.fpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.htm.fpu");
   tdesc_create_reg (feature, "cf0", 189, 0, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "cf1", 190, 0, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "cf2", 191, 0, NULL, 64, "ieee_double");
@@ -289,7 +289,7 @@ initialize_tdesc_powerpc_isa207_htm_vsx64l (void)
   tdesc_create_reg (feature, "cf31", 220, 0, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "cfpscr", 221, 0, "float", 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.altivec");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.htm.altivec");
   element_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", element_type, 4);
 
@@ -349,7 +349,7 @@ initialize_tdesc_powerpc_isa207_htm_vsx64l (void)
   tdesc_create_reg (feature, "cvscr", 254, 0, "vector", 32, "int");
   tdesc_create_reg (feature, "cvrsave", 255, 0, "vector", 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.vsx");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.htm.vsx");
   tdesc_create_reg (feature, "cvs0h", 256, 0, NULL, 64, "uint64");
   tdesc_create_reg (feature, "cvs1h", 257, 0, NULL, 64, "uint64");
   tdesc_create_reg (feature, "cvs2h", 258, 0, NULL, 64, "uint64");
@@ -383,14 +383,14 @@ initialize_tdesc_powerpc_isa207_htm_vsx64l (void)
   tdesc_create_reg (feature, "cvs30h", 286, 0, NULL, 64, "uint64");
   tdesc_create_reg (feature, "cvs31h", 287, 0, NULL, 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.ppr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.htm.ppr");
   tdesc_create_reg (feature, "cppr", 288, 0, NULL, 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.dscr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.htm.dscr");
   tdesc_create_reg (feature, "cdscr", 289, 0, NULL, 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.tar");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.htm.tar");
   tdesc_create_reg (feature, "ctar", 290, 0, NULL, 64, "uint64");
 
-  tdesc_powerpc_isa207_htm_vsx64l = result;
+  tdesc_powerpc_isa207_htm_vsx64l = result.release ();
 }
diff --git a/gdb/features/rs6000/powerpc-isa207-vsx32l.c b/gdb/features/rs6000/powerpc-isa207-vsx32l.c
index 8fe0f5e4384..7fc15bfbfbd 100644
--- a/gdb/features/rs6000/powerpc-isa207-vsx32l.c
+++ b/gdb/features/rs6000/powerpc-isa207-vsx32l.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_powerpc_isa207_vsx32l;
 static void
 initialize_tdesc_powerpc_isa207_vsx32l (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("powerpc:common"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "uint32");
@@ -54,7 +54,7 @@ initialize_tdesc_powerpc_isa207_vsx32l (void)
   tdesc_create_reg (feature, "ctr", 68, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.fpu");
   tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
@@ -89,11 +89,11 @@ initialize_tdesc_powerpc_isa207_vsx32l (void)
   tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "fpscr", 70, 1, "float", 64, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.linux");
   tdesc_create_reg (feature, "orig_r3", 71, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "trap", 72, 1, NULL, 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.altivec");
   tdesc_type *element_type;
   element_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", element_type, 4);
@@ -156,7 +156,7 @@ initialize_tdesc_powerpc_isa207_vsx32l (void)
   tdesc_create_reg (feature, "vscr", 105, 1, "vector", 32, "int");
   tdesc_create_reg (feature, "vrsave", 106, 1, "vector", 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.vsx");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.vsx");
   tdesc_create_reg (feature, "vs0h", 107, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "vs1h", 108, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "vs2h", 109, 1, NULL, 64, "uint64");
@@ -190,26 +190,26 @@ initialize_tdesc_powerpc_isa207_vsx32l (void)
   tdesc_create_reg (feature, "vs30h", 137, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "vs31h", 138, 1, NULL, 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.ppr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.ppr");
   tdesc_create_reg (feature, "ppr", 139, 1, NULL, 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.dscr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.dscr");
   tdesc_create_reg (feature, "dscr", 140, 1, NULL, 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.tar");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.tar");
   tdesc_create_reg (feature, "tar", 141, 1, NULL, 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.ebb");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.ebb");
   tdesc_create_reg (feature, "bescr", 142, 0, NULL, 64, "uint64");
   tdesc_create_reg (feature, "ebbhr", 143, 0, NULL, 64, "uint64");
   tdesc_create_reg (feature, "ebbrr", 144, 0, NULL, 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux.pmu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.linux.pmu");
   tdesc_create_reg (feature, "mmcr0", 145, 0, NULL, 64, "uint64");
   tdesc_create_reg (feature, "mmcr2", 146, 0, NULL, 64, "uint64");
   tdesc_create_reg (feature, "siar", 147, 0, NULL, 64, "uint64");
   tdesc_create_reg (feature, "sdar", 148, 0, NULL, 64, "uint64");
   tdesc_create_reg (feature, "sier", 149, 0, NULL, 64, "uint64");
 
-  tdesc_powerpc_isa207_vsx32l = result;
+  tdesc_powerpc_isa207_vsx32l = result.release ();
 }
diff --git a/gdb/features/rs6000/powerpc-isa207-vsx64l.c b/gdb/features/rs6000/powerpc-isa207-vsx64l.c
index 0af1879e10a..3ad55f75658 100644
--- a/gdb/features/rs6000/powerpc-isa207-vsx64l.c
+++ b/gdb/features/rs6000/powerpc-isa207-vsx64l.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_powerpc_isa207_vsx64l;
 static void
 initialize_tdesc_powerpc_isa207_vsx64l (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("powerpc:common64"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 64, "uint64");
@@ -54,7 +54,7 @@ initialize_tdesc_powerpc_isa207_vsx64l (void)
   tdesc_create_reg (feature, "ctr", 68, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.fpu");
   tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
@@ -89,11 +89,11 @@ initialize_tdesc_powerpc_isa207_vsx64l (void)
   tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "fpscr", 70, 1, "float", 64, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.linux");
   tdesc_create_reg (feature, "orig_r3", 71, 1, NULL, 64, "int");
   tdesc_create_reg (feature, "trap", 72, 1, NULL, 64, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.altivec");
   tdesc_type *element_type;
   element_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", element_type, 4);
@@ -156,7 +156,7 @@ initialize_tdesc_powerpc_isa207_vsx64l (void)
   tdesc_create_reg (feature, "vscr", 105, 1, "vector", 32, "int");
   tdesc_create_reg (feature, "vrsave", 106, 1, "vector", 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.vsx");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.vsx");
   tdesc_create_reg (feature, "vs0h", 107, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "vs1h", 108, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "vs2h", 109, 1, NULL, 64, "uint64");
@@ -190,26 +190,26 @@ initialize_tdesc_powerpc_isa207_vsx64l (void)
   tdesc_create_reg (feature, "vs30h", 137, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "vs31h", 138, 1, NULL, 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.ppr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.ppr");
   tdesc_create_reg (feature, "ppr", 139, 1, NULL, 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.dscr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.dscr");
   tdesc_create_reg (feature, "dscr", 140, 1, NULL, 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.tar");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.tar");
   tdesc_create_reg (feature, "tar", 141, 1, NULL, 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.ebb");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.ebb");
   tdesc_create_reg (feature, "bescr", 142, 0, NULL, 64, "uint64");
   tdesc_create_reg (feature, "ebbhr", 143, 0, NULL, 64, "uint64");
   tdesc_create_reg (feature, "ebbrr", 144, 0, NULL, 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux.pmu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.linux.pmu");
   tdesc_create_reg (feature, "mmcr0", 145, 0, NULL, 64, "uint64");
   tdesc_create_reg (feature, "mmcr2", 146, 0, NULL, 64, "uint64");
   tdesc_create_reg (feature, "siar", 147, 0, NULL, 64, "uint64");
   tdesc_create_reg (feature, "sdar", 148, 0, NULL, 64, "uint64");
   tdesc_create_reg (feature, "sier", 149, 0, NULL, 64, "uint64");
 
-  tdesc_powerpc_isa207_vsx64l = result;
+  tdesc_powerpc_isa207_vsx64l = result.release ();
 }
diff --git a/gdb/features/rs6000/powerpc-vsx32.c b/gdb/features/rs6000/powerpc-vsx32.c
index 9eafb1c4823..d7278d9a52b 100644
--- a/gdb/features/rs6000/powerpc-vsx32.c
+++ b/gdb/features/rs6000/powerpc-vsx32.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_powerpc_vsx32;
 static void
 initialize_tdesc_powerpc_vsx32 (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("powerpc:common"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "uint32");
@@ -54,7 +54,7 @@ initialize_tdesc_powerpc_vsx32 (void)
   tdesc_create_reg (feature, "ctr", 68, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.fpu");
   tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
@@ -89,7 +89,7 @@ initialize_tdesc_powerpc_vsx32 (void)
   tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "fpscr", 70, 1, "float", 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.altivec");
   tdesc_type *element_type;
   element_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", element_type, 4);
@@ -152,7 +152,7 @@ initialize_tdesc_powerpc_vsx32 (void)
   tdesc_create_reg (feature, "vscr", 103, 1, "vector", 32, "int");
   tdesc_create_reg (feature, "vrsave", 104, 1, "vector", 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.vsx");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.vsx");
   tdesc_create_reg (feature, "vs0h", 105, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "vs1h", 106, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "vs2h", 107, 1, NULL, 64, "uint64");
@@ -186,5 +186,5 @@ initialize_tdesc_powerpc_vsx32 (void)
   tdesc_create_reg (feature, "vs30h", 135, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "vs31h", 136, 1, NULL, 64, "uint64");
 
-  tdesc_powerpc_vsx32 = result;
+  tdesc_powerpc_vsx32 = result.release ();
 }
diff --git a/gdb/features/rs6000/powerpc-vsx32l.c b/gdb/features/rs6000/powerpc-vsx32l.c
index f08df14f9e8..7097ffac8c6 100644
--- a/gdb/features/rs6000/powerpc-vsx32l.c
+++ b/gdb/features/rs6000/powerpc-vsx32l.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_powerpc_vsx32l;
 static void
 initialize_tdesc_powerpc_vsx32l (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("powerpc:common"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "uint32");
@@ -54,7 +54,7 @@ initialize_tdesc_powerpc_vsx32l (void)
   tdesc_create_reg (feature, "ctr", 68, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.fpu");
   tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
@@ -89,11 +89,11 @@ initialize_tdesc_powerpc_vsx32l (void)
   tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "fpscr", 70, 1, "float", 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.linux");
   tdesc_create_reg (feature, "orig_r3", 71, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "trap", 72, 1, NULL, 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.altivec");
   tdesc_type *element_type;
   element_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", element_type, 4);
@@ -156,7 +156,7 @@ initialize_tdesc_powerpc_vsx32l (void)
   tdesc_create_reg (feature, "vscr", 105, 1, "vector", 32, "int");
   tdesc_create_reg (feature, "vrsave", 106, 1, "vector", 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.vsx");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.vsx");
   tdesc_create_reg (feature, "vs0h", 107, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "vs1h", 108, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "vs2h", 109, 1, NULL, 64, "uint64");
@@ -190,5 +190,5 @@ initialize_tdesc_powerpc_vsx32l (void)
   tdesc_create_reg (feature, "vs30h", 137, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "vs31h", 138, 1, NULL, 64, "uint64");
 
-  tdesc_powerpc_vsx32l = result;
+  tdesc_powerpc_vsx32l = result.release ();
 }
diff --git a/gdb/features/rs6000/powerpc-vsx64.c b/gdb/features/rs6000/powerpc-vsx64.c
index 7991115cf6e..7e9055991e2 100644
--- a/gdb/features/rs6000/powerpc-vsx64.c
+++ b/gdb/features/rs6000/powerpc-vsx64.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_powerpc_vsx64;
 static void
 initialize_tdesc_powerpc_vsx64 (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("powerpc:common64"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 64, "uint64");
@@ -54,7 +54,7 @@ initialize_tdesc_powerpc_vsx64 (void)
   tdesc_create_reg (feature, "ctr", 68, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.fpu");
   tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
@@ -89,7 +89,7 @@ initialize_tdesc_powerpc_vsx64 (void)
   tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "fpscr", 70, 1, "float", 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.altivec");
   tdesc_type *element_type;
   element_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", element_type, 4);
@@ -152,7 +152,7 @@ initialize_tdesc_powerpc_vsx64 (void)
   tdesc_create_reg (feature, "vscr", 103, 1, "vector", 32, "int");
   tdesc_create_reg (feature, "vrsave", 104, 1, "vector", 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.vsx");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.vsx");
   tdesc_create_reg (feature, "vs0h", 105, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "vs1h", 106, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "vs2h", 107, 1, NULL, 64, "uint64");
@@ -186,5 +186,5 @@ initialize_tdesc_powerpc_vsx64 (void)
   tdesc_create_reg (feature, "vs30h", 135, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "vs31h", 136, 1, NULL, 64, "uint64");
 
-  tdesc_powerpc_vsx64 = result;
+  tdesc_powerpc_vsx64 = result.release ();
 }
diff --git a/gdb/features/rs6000/powerpc-vsx64l.c b/gdb/features/rs6000/powerpc-vsx64l.c
index 1726e6754fd..4affa35d0cc 100644
--- a/gdb/features/rs6000/powerpc-vsx64l.c
+++ b/gdb/features/rs6000/powerpc-vsx64l.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_powerpc_vsx64l;
 static void
 initialize_tdesc_powerpc_vsx64l (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("powerpc:common64"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 64, "uint64");
@@ -54,7 +54,7 @@ initialize_tdesc_powerpc_vsx64l (void)
   tdesc_create_reg (feature, "ctr", 68, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.fpu");
   tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
@@ -89,11 +89,11 @@ initialize_tdesc_powerpc_vsx64l (void)
   tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "fpscr", 70, 1, "float", 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.linux");
   tdesc_create_reg (feature, "orig_r3", 71, 1, NULL, 64, "int");
   tdesc_create_reg (feature, "trap", 72, 1, NULL, 64, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.altivec");
   tdesc_type *element_type;
   element_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", element_type, 4);
@@ -156,7 +156,7 @@ initialize_tdesc_powerpc_vsx64l (void)
   tdesc_create_reg (feature, "vscr", 105, 1, "vector", 32, "int");
   tdesc_create_reg (feature, "vrsave", 106, 1, "vector", 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.vsx");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.vsx");
   tdesc_create_reg (feature, "vs0h", 107, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "vs1h", 108, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "vs2h", 109, 1, NULL, 64, "uint64");
@@ -190,5 +190,5 @@ initialize_tdesc_powerpc_vsx64l (void)
   tdesc_create_reg (feature, "vs30h", 137, 1, NULL, 64, "uint64");
   tdesc_create_reg (feature, "vs31h", 138, 1, NULL, 64, "uint64");
 
-  tdesc_powerpc_vsx64l = result;
+  tdesc_powerpc_vsx64l = result.release ();
 }
diff --git a/gdb/features/rs6000/rs6000.c b/gdb/features/rs6000/rs6000.c
index 709b5da405d..826d9ad7582 100644
--- a/gdb/features/rs6000/rs6000.c
+++ b/gdb/features/rs6000/rs6000.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_rs6000;
 static void
 initialize_tdesc_rs6000 (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("rs6000:6000"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("rs6000:6000"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "int");
@@ -55,7 +55,7 @@ initialize_tdesc_rs6000 (void)
   tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "mq", 70, 1, NULL, 32, "int");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.fpu");
   tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
@@ -90,5 +90,5 @@ initialize_tdesc_rs6000 (void)
   tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
   tdesc_create_reg (feature, "fpscr", 71, 1, "float", 32, "int");
 
-  tdesc_rs6000 = result;
+  tdesc_rs6000 = result.release ();
 }
diff --git a/gdb/features/rx.c b/gdb/features/rx.c
index d2c29c126f7..ebbc504ec35 100644
--- a/gdb/features/rx.c
+++ b/gdb/features/rx.c
@@ -9,10 +9,10 @@ struct target_desc *tdesc_rx;
 static void
 initialize_tdesc_rx (void)
 {
-  struct target_desc *result = allocate_target_description ();
+  target_desc_up result = allocate_target_description ();
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.rx.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.rx.core");
   tdesc_type_with_fields *type_with_fields;
   type_with_fields = tdesc_create_flags (feature, "psw_flags", 4);
   tdesc_add_flag (type_with_fields, 0, "C");
@@ -76,5 +76,5 @@ initialize_tdesc_rx (void)
   tdesc_create_reg (feature, "fpsw", 24, 1, NULL, 32, "fpsw_flags");
   tdesc_create_reg (feature, "acc", 25, 1, NULL, 64, "uint64");
 
-  tdesc_rx = result;
+  tdesc_rx = result.release ();
 }
diff --git a/gdb/features/s390-gs-linux64.c b/gdb/features/s390-gs-linux64.c
index 1416183d3db..331b6e27e8c 100644
--- a/gdb/features/s390-gs-linux64.c
+++ b/gdb/features/s390-gs-linux64.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_s390_gs_linux64;
 static void
 initialize_tdesc_s390_gs_linux64 (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("s390:31-bit"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("s390:31-bit"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.core");
   tdesc_create_reg (feature, "pswm", 0, 1, "psw", 32, "uint32");
   tdesc_create_reg (feature, "pswa", 1, 1, "psw", 32, "uint32");
   tdesc_create_reg (feature, "r0h", 2, 1, "upper", 32, "uint32");
@@ -50,7 +50,7 @@ initialize_tdesc_s390_gs_linux64 (void)
   tdesc_create_reg (feature, "r15h", 32, 1, "upper", 32, "uint32");
   tdesc_create_reg (feature, "r15l", 33, 1, "lower", 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.acr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.acr");
   tdesc_create_reg (feature, "acr0", 34, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr1", 35, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr2", 36, 1, "access", 32, "uint32");
@@ -68,7 +68,7 @@ initialize_tdesc_s390_gs_linux64 (void)
   tdesc_create_reg (feature, "acr14", 48, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr15", 49, 1, "access", 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.fpr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.fpr");
   tdesc_create_reg (feature, "fpc", 50, 1, "float", 32, "uint32");
   tdesc_create_reg (feature, "f0", 51, 1, "float", 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 52, 1, "float", 64, "ieee_double");
@@ -87,12 +87,12 @@ initialize_tdesc_s390_gs_linux64 (void)
   tdesc_create_reg (feature, "f14", 65, 1, "float", 64, "ieee_double");
   tdesc_create_reg (feature, "f15", 66, 1, "float", 64, "ieee_double");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.linux");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.linux");
   tdesc_create_reg (feature, "orig_r2", 67, 1, "system", 32, "uint32");
   tdesc_create_reg (feature, "last_break", 68, 0, "system", 32, "code_ptr");
   tdesc_create_reg (feature, "system_call", 69, 1, "system", 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.tdb");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.tdb");
   tdesc_create_reg (feature, "tdb0", 70, 1, "tdb", 64, "uint64");
   tdesc_create_reg (feature, "tac", 71, 1, "tdb", 64, "uint64");
   tdesc_create_reg (feature, "tct", 72, 1, "tdb", 64, "uint64");
@@ -114,7 +114,7 @@ initialize_tdesc_s390_gs_linux64 (void)
   tdesc_create_reg (feature, "tr14", 88, 1, "tdb", 64, "uint64");
   tdesc_create_reg (feature, "tr15", 89, 1, "tdb", 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.vx");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.vx");
   tdesc_type *element_type;
   element_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", element_type, 4);
@@ -185,15 +185,15 @@ initialize_tdesc_s390_gs_linux64 (void)
   tdesc_create_reg (feature, "v30", 120, 1, NULL, 128, "vec128");
   tdesc_create_reg (feature, "v31", 121, 1, NULL, 128, "vec128");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.gs");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.gs");
   tdesc_create_reg (feature, "gsd", 122, 1, "gs", 64, "uint64");
   tdesc_create_reg (feature, "gssm", 123, 1, "gs", 64, "uint64");
   tdesc_create_reg (feature, "gsepla", 124, 1, "gs", 64, "data_ptr");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.gsbc");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.gsbc");
   tdesc_create_reg (feature, "bc_gsd", 125, 1, "gs", 64, "uint64");
   tdesc_create_reg (feature, "bc_gssm", 126, 1, "gs", 64, "uint64");
   tdesc_create_reg (feature, "bc_gsepla", 127, 1, "gs", 64, "data_ptr");
 
-  tdesc_s390_gs_linux64 = result;
+  tdesc_s390_gs_linux64 = result.release ();
 }
diff --git a/gdb/features/s390-linux32.c b/gdb/features/s390-linux32.c
index 01c136c933e..18b0d0f37be 100644
--- a/gdb/features/s390-linux32.c
+++ b/gdb/features/s390-linux32.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_s390_linux32;
 static void
 initialize_tdesc_s390_linux32 (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("s390:31-bit"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("s390:31-bit"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.core");
   tdesc_create_reg (feature, "pswm", 0, 1, "psw", 32, "uint32");
   tdesc_create_reg (feature, "pswa", 1, 1, "psw", 32, "uint32");
   tdesc_create_reg (feature, "r0", 2, 1, "general", 32, "uint32");
@@ -34,7 +34,7 @@ initialize_tdesc_s390_linux32 (void)
   tdesc_create_reg (feature, "r14", 16, 1, "general", 32, "uint32");
   tdesc_create_reg (feature, "r15", 17, 1, "general", 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.acr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.acr");
   tdesc_create_reg (feature, "acr0", 18, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr1", 19, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr2", 20, 1, "access", 32, "uint32");
@@ -52,7 +52,7 @@ initialize_tdesc_s390_linux32 (void)
   tdesc_create_reg (feature, "acr14", 32, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr15", 33, 1, "access", 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.fpr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.fpr");
   tdesc_create_reg (feature, "fpc", 34, 1, "float", 32, "uint32");
   tdesc_create_reg (feature, "f0", 35, 1, "float", 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 36, 1, "float", 64, "ieee_double");
@@ -71,8 +71,8 @@ initialize_tdesc_s390_linux32 (void)
   tdesc_create_reg (feature, "f14", 49, 1, "float", 64, "ieee_double");
   tdesc_create_reg (feature, "f15", 50, 1, "float", 64, "ieee_double");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.linux");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.linux");
   tdesc_create_reg (feature, "orig_r2", 51, 1, "system", 32, "uint32");
 
-  tdesc_s390_linux32 = result;
+  tdesc_s390_linux32 = result.release ();
 }
diff --git a/gdb/features/s390-linux32v1.c b/gdb/features/s390-linux32v1.c
index 65a4a504d33..d1180f98b28 100644
--- a/gdb/features/s390-linux32v1.c
+++ b/gdb/features/s390-linux32v1.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_s390_linux32v1;
 static void
 initialize_tdesc_s390_linux32v1 (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("s390:31-bit"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("s390:31-bit"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.core");
   tdesc_create_reg (feature, "pswm", 0, 1, "psw", 32, "uint32");
   tdesc_create_reg (feature, "pswa", 1, 1, "psw", 32, "uint32");
   tdesc_create_reg (feature, "r0", 2, 1, "general", 32, "uint32");
@@ -34,7 +34,7 @@ initialize_tdesc_s390_linux32v1 (void)
   tdesc_create_reg (feature, "r14", 16, 1, "general", 32, "uint32");
   tdesc_create_reg (feature, "r15", 17, 1, "general", 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.acr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.acr");
   tdesc_create_reg (feature, "acr0", 18, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr1", 19, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr2", 20, 1, "access", 32, "uint32");
@@ -52,7 +52,7 @@ initialize_tdesc_s390_linux32v1 (void)
   tdesc_create_reg (feature, "acr14", 32, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr15", 33, 1, "access", 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.fpr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.fpr");
   tdesc_create_reg (feature, "fpc", 34, 1, "float", 32, "uint32");
   tdesc_create_reg (feature, "f0", 35, 1, "float", 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 36, 1, "float", 64, "ieee_double");
@@ -71,9 +71,9 @@ initialize_tdesc_s390_linux32v1 (void)
   tdesc_create_reg (feature, "f14", 49, 1, "float", 64, "ieee_double");
   tdesc_create_reg (feature, "f15", 50, 1, "float", 64, "ieee_double");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.linux");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.linux");
   tdesc_create_reg (feature, "orig_r2", 51, 1, "system", 32, "uint32");
   tdesc_create_reg (feature, "last_break", 52, 0, "system", 32, "code_ptr");
 
-  tdesc_s390_linux32v1 = result;
+  tdesc_s390_linux32v1 = result.release ();
 }
diff --git a/gdb/features/s390-linux32v2.c b/gdb/features/s390-linux32v2.c
index b5d25ec75bf..d1da31a7c9a 100644
--- a/gdb/features/s390-linux32v2.c
+++ b/gdb/features/s390-linux32v2.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_s390_linux32v2;
 static void
 initialize_tdesc_s390_linux32v2 (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("s390:31-bit"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("s390:31-bit"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.core");
   tdesc_create_reg (feature, "pswm", 0, 1, "psw", 32, "uint32");
   tdesc_create_reg (feature, "pswa", 1, 1, "psw", 32, "uint32");
   tdesc_create_reg (feature, "r0", 2, 1, "general", 32, "uint32");
@@ -34,7 +34,7 @@ initialize_tdesc_s390_linux32v2 (void)
   tdesc_create_reg (feature, "r14", 16, 1, "general", 32, "uint32");
   tdesc_create_reg (feature, "r15", 17, 1, "general", 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.acr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.acr");
   tdesc_create_reg (feature, "acr0", 18, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr1", 19, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr2", 20, 1, "access", 32, "uint32");
@@ -52,7 +52,7 @@ initialize_tdesc_s390_linux32v2 (void)
   tdesc_create_reg (feature, "acr14", 32, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr15", 33, 1, "access", 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.fpr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.fpr");
   tdesc_create_reg (feature, "fpc", 34, 1, "float", 32, "uint32");
   tdesc_create_reg (feature, "f0", 35, 1, "float", 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 36, 1, "float", 64, "ieee_double");
@@ -71,10 +71,10 @@ initialize_tdesc_s390_linux32v2 (void)
   tdesc_create_reg (feature, "f14", 49, 1, "float", 64, "ieee_double");
   tdesc_create_reg (feature, "f15", 50, 1, "float", 64, "ieee_double");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.linux");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.linux");
   tdesc_create_reg (feature, "orig_r2", 51, 1, "system", 32, "uint32");
   tdesc_create_reg (feature, "last_break", 52, 0, "system", 32, "code_ptr");
   tdesc_create_reg (feature, "system_call", 53, 1, "system", 32, "uint32");
 
-  tdesc_s390_linux32v2 = result;
+  tdesc_s390_linux32v2 = result.release ();
 }
diff --git a/gdb/features/s390-linux64.c b/gdb/features/s390-linux64.c
index 531d3a1ca82..235da0f63c2 100644
--- a/gdb/features/s390-linux64.c
+++ b/gdb/features/s390-linux64.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_s390_linux64;
 static void
 initialize_tdesc_s390_linux64 (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("s390:31-bit"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("s390:31-bit"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.core");
   tdesc_create_reg (feature, "pswm", 0, 1, "psw", 32, "uint32");
   tdesc_create_reg (feature, "pswa", 1, 1, "psw", 32, "uint32");
   tdesc_create_reg (feature, "r0h", 2, 1, "upper", 32, "uint32");
@@ -50,7 +50,7 @@ initialize_tdesc_s390_linux64 (void)
   tdesc_create_reg (feature, "r15h", 32, 1, "upper", 32, "uint32");
   tdesc_create_reg (feature, "r15l", 33, 1, "lower", 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.acr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.acr");
   tdesc_create_reg (feature, "acr0", 34, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr1", 35, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr2", 36, 1, "access", 32, "uint32");
@@ -68,7 +68,7 @@ initialize_tdesc_s390_linux64 (void)
   tdesc_create_reg (feature, "acr14", 48, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr15", 49, 1, "access", 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.fpr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.fpr");
   tdesc_create_reg (feature, "fpc", 50, 1, "float", 32, "uint32");
   tdesc_create_reg (feature, "f0", 51, 1, "float", 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 52, 1, "float", 64, "ieee_double");
@@ -87,8 +87,8 @@ initialize_tdesc_s390_linux64 (void)
   tdesc_create_reg (feature, "f14", 65, 1, "float", 64, "ieee_double");
   tdesc_create_reg (feature, "f15", 66, 1, "float", 64, "ieee_double");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.linux");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.linux");
   tdesc_create_reg (feature, "orig_r2", 67, 1, "system", 32, "uint32");
 
-  tdesc_s390_linux64 = result;
+  tdesc_s390_linux64 = result.release ();
 }
diff --git a/gdb/features/s390-linux64v1.c b/gdb/features/s390-linux64v1.c
index d75deca23fa..108c0ef404f 100644
--- a/gdb/features/s390-linux64v1.c
+++ b/gdb/features/s390-linux64v1.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_s390_linux64v1;
 static void
 initialize_tdesc_s390_linux64v1 (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("s390:31-bit"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("s390:31-bit"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.core");
   tdesc_create_reg (feature, "pswm", 0, 1, "psw", 32, "uint32");
   tdesc_create_reg (feature, "pswa", 1, 1, "psw", 32, "uint32");
   tdesc_create_reg (feature, "r0h", 2, 1, "upper", 32, "uint32");
@@ -50,7 +50,7 @@ initialize_tdesc_s390_linux64v1 (void)
   tdesc_create_reg (feature, "r15h", 32, 1, "upper", 32, "uint32");
   tdesc_create_reg (feature, "r15l", 33, 1, "lower", 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.acr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.acr");
   tdesc_create_reg (feature, "acr0", 34, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr1", 35, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr2", 36, 1, "access", 32, "uint32");
@@ -68,7 +68,7 @@ initialize_tdesc_s390_linux64v1 (void)
   tdesc_create_reg (feature, "acr14", 48, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr15", 49, 1, "access", 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.fpr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.fpr");
   tdesc_create_reg (feature, "fpc", 50, 1, "float", 32, "uint32");
   tdesc_create_reg (feature, "f0", 51, 1, "float", 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 52, 1, "float", 64, "ieee_double");
@@ -87,9 +87,9 @@ initialize_tdesc_s390_linux64v1 (void)
   tdesc_create_reg (feature, "f14", 65, 1, "float", 64, "ieee_double");
   tdesc_create_reg (feature, "f15", 66, 1, "float", 64, "ieee_double");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.linux");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.linux");
   tdesc_create_reg (feature, "orig_r2", 67, 1, "system", 32, "uint32");
   tdesc_create_reg (feature, "last_break", 68, 0, "system", 32, "code_ptr");
 
-  tdesc_s390_linux64v1 = result;
+  tdesc_s390_linux64v1 = result.release ();
 }
diff --git a/gdb/features/s390-linux64v2.c b/gdb/features/s390-linux64v2.c
index bd10ee8ffe3..057a12978a7 100644
--- a/gdb/features/s390-linux64v2.c
+++ b/gdb/features/s390-linux64v2.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_s390_linux64v2;
 static void
 initialize_tdesc_s390_linux64v2 (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("s390:31-bit"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("s390:31-bit"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.core");
   tdesc_create_reg (feature, "pswm", 0, 1, "psw", 32, "uint32");
   tdesc_create_reg (feature, "pswa", 1, 1, "psw", 32, "uint32");
   tdesc_create_reg (feature, "r0h", 2, 1, "upper", 32, "uint32");
@@ -50,7 +50,7 @@ initialize_tdesc_s390_linux64v2 (void)
   tdesc_create_reg (feature, "r15h", 32, 1, "upper", 32, "uint32");
   tdesc_create_reg (feature, "r15l", 33, 1, "lower", 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.acr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.acr");
   tdesc_create_reg (feature, "acr0", 34, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr1", 35, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr2", 36, 1, "access", 32, "uint32");
@@ -68,7 +68,7 @@ initialize_tdesc_s390_linux64v2 (void)
   tdesc_create_reg (feature, "acr14", 48, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr15", 49, 1, "access", 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.fpr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.fpr");
   tdesc_create_reg (feature, "fpc", 50, 1, "float", 32, "uint32");
   tdesc_create_reg (feature, "f0", 51, 1, "float", 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 52, 1, "float", 64, "ieee_double");
@@ -87,10 +87,10 @@ initialize_tdesc_s390_linux64v2 (void)
   tdesc_create_reg (feature, "f14", 65, 1, "float", 64, "ieee_double");
   tdesc_create_reg (feature, "f15", 66, 1, "float", 64, "ieee_double");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.linux");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.linux");
   tdesc_create_reg (feature, "orig_r2", 67, 1, "system", 32, "uint32");
   tdesc_create_reg (feature, "last_break", 68, 0, "system", 32, "code_ptr");
   tdesc_create_reg (feature, "system_call", 69, 1, "system", 32, "uint32");
 
-  tdesc_s390_linux64v2 = result;
+  tdesc_s390_linux64v2 = result.release ();
 }
diff --git a/gdb/features/s390-te-linux64.c b/gdb/features/s390-te-linux64.c
index fe2020ac65a..f8f2217c69b 100644
--- a/gdb/features/s390-te-linux64.c
+++ b/gdb/features/s390-te-linux64.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_s390_te_linux64;
 static void
 initialize_tdesc_s390_te_linux64 (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("s390:31-bit"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("s390:31-bit"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.core");
   tdesc_create_reg (feature, "pswm", 0, 1, "psw", 32, "uint32");
   tdesc_create_reg (feature, "pswa", 1, 1, "psw", 32, "uint32");
   tdesc_create_reg (feature, "r0h", 2, 1, "upper", 32, "uint32");
@@ -50,7 +50,7 @@ initialize_tdesc_s390_te_linux64 (void)
   tdesc_create_reg (feature, "r15h", 32, 1, "upper", 32, "uint32");
   tdesc_create_reg (feature, "r15l", 33, 1, "lower", 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.acr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.acr");
   tdesc_create_reg (feature, "acr0", 34, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr1", 35, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr2", 36, 1, "access", 32, "uint32");
@@ -68,7 +68,7 @@ initialize_tdesc_s390_te_linux64 (void)
   tdesc_create_reg (feature, "acr14", 48, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr15", 49, 1, "access", 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.fpr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.fpr");
   tdesc_create_reg (feature, "fpc", 50, 1, "float", 32, "uint32");
   tdesc_create_reg (feature, "f0", 51, 1, "float", 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 52, 1, "float", 64, "ieee_double");
@@ -87,12 +87,12 @@ initialize_tdesc_s390_te_linux64 (void)
   tdesc_create_reg (feature, "f14", 65, 1, "float", 64, "ieee_double");
   tdesc_create_reg (feature, "f15", 66, 1, "float", 64, "ieee_double");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.linux");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.linux");
   tdesc_create_reg (feature, "orig_r2", 67, 1, "system", 32, "uint32");
   tdesc_create_reg (feature, "last_break", 68, 0, "system", 32, "code_ptr");
   tdesc_create_reg (feature, "system_call", 69, 1, "system", 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.tdb");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.tdb");
   tdesc_create_reg (feature, "tdb0", 70, 1, "tdb", 64, "uint64");
   tdesc_create_reg (feature, "tac", 71, 1, "tdb", 64, "uint64");
   tdesc_create_reg (feature, "tct", 72, 1, "tdb", 64, "uint64");
@@ -114,5 +114,5 @@ initialize_tdesc_s390_te_linux64 (void)
   tdesc_create_reg (feature, "tr14", 88, 1, "tdb", 64, "uint64");
   tdesc_create_reg (feature, "tr15", 89, 1, "tdb", 64, "uint64");
 
-  tdesc_s390_te_linux64 = result;
+  tdesc_s390_te_linux64 = result.release ();
 }
diff --git a/gdb/features/s390-tevx-linux64.c b/gdb/features/s390-tevx-linux64.c
index ae62e8de372..cbc20775cc6 100644
--- a/gdb/features/s390-tevx-linux64.c
+++ b/gdb/features/s390-tevx-linux64.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_s390_tevx_linux64;
 static void
 initialize_tdesc_s390_tevx_linux64 (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("s390:31-bit"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("s390:31-bit"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.core");
   tdesc_create_reg (feature, "pswm", 0, 1, "psw", 32, "uint32");
   tdesc_create_reg (feature, "pswa", 1, 1, "psw", 32, "uint32");
   tdesc_create_reg (feature, "r0h", 2, 1, "upper", 32, "uint32");
@@ -50,7 +50,7 @@ initialize_tdesc_s390_tevx_linux64 (void)
   tdesc_create_reg (feature, "r15h", 32, 1, "upper", 32, "uint32");
   tdesc_create_reg (feature, "r15l", 33, 1, "lower", 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.acr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.acr");
   tdesc_create_reg (feature, "acr0", 34, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr1", 35, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr2", 36, 1, "access", 32, "uint32");
@@ -68,7 +68,7 @@ initialize_tdesc_s390_tevx_linux64 (void)
   tdesc_create_reg (feature, "acr14", 48, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr15", 49, 1, "access", 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.fpr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.fpr");
   tdesc_create_reg (feature, "fpc", 50, 1, "float", 32, "uint32");
   tdesc_create_reg (feature, "f0", 51, 1, "float", 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 52, 1, "float", 64, "ieee_double");
@@ -87,12 +87,12 @@ initialize_tdesc_s390_tevx_linux64 (void)
   tdesc_create_reg (feature, "f14", 65, 1, "float", 64, "ieee_double");
   tdesc_create_reg (feature, "f15", 66, 1, "float", 64, "ieee_double");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.linux");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.linux");
   tdesc_create_reg (feature, "orig_r2", 67, 1, "system", 32, "uint32");
   tdesc_create_reg (feature, "last_break", 68, 0, "system", 32, "code_ptr");
   tdesc_create_reg (feature, "system_call", 69, 1, "system", 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.tdb");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.tdb");
   tdesc_create_reg (feature, "tdb0", 70, 1, "tdb", 64, "uint64");
   tdesc_create_reg (feature, "tac", 71, 1, "tdb", 64, "uint64");
   tdesc_create_reg (feature, "tct", 72, 1, "tdb", 64, "uint64");
@@ -114,7 +114,7 @@ initialize_tdesc_s390_tevx_linux64 (void)
   tdesc_create_reg (feature, "tr14", 88, 1, "tdb", 64, "uint64");
   tdesc_create_reg (feature, "tr15", 89, 1, "tdb", 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.vx");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.vx");
   tdesc_type *element_type;
   element_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", element_type, 4);
@@ -185,5 +185,5 @@ initialize_tdesc_s390_tevx_linux64 (void)
   tdesc_create_reg (feature, "v30", 120, 1, NULL, 128, "vec128");
   tdesc_create_reg (feature, "v31", 121, 1, NULL, 128, "vec128");
 
-  tdesc_s390_tevx_linux64 = result;
+  tdesc_s390_tevx_linux64 = result.release ();
 }
diff --git a/gdb/features/s390-vx-linux64.c b/gdb/features/s390-vx-linux64.c
index d3ec0814608..779332ca5e4 100644
--- a/gdb/features/s390-vx-linux64.c
+++ b/gdb/features/s390-vx-linux64.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_s390_vx_linux64;
 static void
 initialize_tdesc_s390_vx_linux64 (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("s390:31-bit"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("s390:31-bit"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.core");
   tdesc_create_reg (feature, "pswm", 0, 1, "psw", 32, "uint32");
   tdesc_create_reg (feature, "pswa", 1, 1, "psw", 32, "uint32");
   tdesc_create_reg (feature, "r0h", 2, 1, "upper", 32, "uint32");
@@ -50,7 +50,7 @@ initialize_tdesc_s390_vx_linux64 (void)
   tdesc_create_reg (feature, "r15h", 32, 1, "upper", 32, "uint32");
   tdesc_create_reg (feature, "r15l", 33, 1, "lower", 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.acr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.acr");
   tdesc_create_reg (feature, "acr0", 34, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr1", 35, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr2", 36, 1, "access", 32, "uint32");
@@ -68,7 +68,7 @@ initialize_tdesc_s390_vx_linux64 (void)
   tdesc_create_reg (feature, "acr14", 48, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr15", 49, 1, "access", 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.fpr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.fpr");
   tdesc_create_reg (feature, "fpc", 50, 1, "float", 32, "uint32");
   tdesc_create_reg (feature, "f0", 51, 1, "float", 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 52, 1, "float", 64, "ieee_double");
@@ -87,12 +87,12 @@ initialize_tdesc_s390_vx_linux64 (void)
   tdesc_create_reg (feature, "f14", 65, 1, "float", 64, "ieee_double");
   tdesc_create_reg (feature, "f15", 66, 1, "float", 64, "ieee_double");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.linux");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.linux");
   tdesc_create_reg (feature, "orig_r2", 67, 1, "system", 32, "uint32");
   tdesc_create_reg (feature, "last_break", 68, 0, "system", 32, "code_ptr");
   tdesc_create_reg (feature, "system_call", 69, 1, "system", 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.vx");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.vx");
   tdesc_type *element_type;
   element_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", element_type, 4);
@@ -163,5 +163,5 @@ initialize_tdesc_s390_vx_linux64 (void)
   tdesc_create_reg (feature, "v30", 100, 1, NULL, 128, "vec128");
   tdesc_create_reg (feature, "v31", 101, 1, NULL, 128, "vec128");
 
-  tdesc_s390_vx_linux64 = result;
+  tdesc_s390_vx_linux64 = result.release ();
 }
diff --git a/gdb/features/s390x-gs-linux64.c b/gdb/features/s390x-gs-linux64.c
index d253a09997a..a779dafe6c3 100644
--- a/gdb/features/s390x-gs-linux64.c
+++ b/gdb/features/s390x-gs-linux64.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_s390x_gs_linux64;
 static void
 initialize_tdesc_s390x_gs_linux64 (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("s390:64-bit"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("s390:64-bit"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.core");
   tdesc_create_reg (feature, "pswm", 0, 1, "psw", 64, "uint64");
   tdesc_create_reg (feature, "pswa", 1, 1, "psw", 64, "uint64");
   tdesc_create_reg (feature, "r0", 2, 1, "general", 64, "uint64");
@@ -34,7 +34,7 @@ initialize_tdesc_s390x_gs_linux64 (void)
   tdesc_create_reg (feature, "r14", 16, 1, "general", 64, "uint64");
   tdesc_create_reg (feature, "r15", 17, 1, "general", 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.acr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.acr");
   tdesc_create_reg (feature, "acr0", 18, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr1", 19, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr2", 20, 1, "access", 32, "uint32");
@@ -52,7 +52,7 @@ initialize_tdesc_s390x_gs_linux64 (void)
   tdesc_create_reg (feature, "acr14", 32, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr15", 33, 1, "access", 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.fpr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.fpr");
   tdesc_create_reg (feature, "fpc", 34, 1, "float", 32, "uint32");
   tdesc_create_reg (feature, "f0", 35, 1, "float", 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 36, 1, "float", 64, "ieee_double");
@@ -71,12 +71,12 @@ initialize_tdesc_s390x_gs_linux64 (void)
   tdesc_create_reg (feature, "f14", 49, 1, "float", 64, "ieee_double");
   tdesc_create_reg (feature, "f15", 50, 1, "float", 64, "ieee_double");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.linux");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.linux");
   tdesc_create_reg (feature, "orig_r2", 51, 1, "system", 64, "uint64");
   tdesc_create_reg (feature, "last_break", 52, 0, "system", 64, "code_ptr");
   tdesc_create_reg (feature, "system_call", 53, 1, "system", 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.tdb");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.tdb");
   tdesc_create_reg (feature, "tdb0", 54, 1, "tdb", 64, "uint64");
   tdesc_create_reg (feature, "tac", 55, 1, "tdb", 64, "uint64");
   tdesc_create_reg (feature, "tct", 56, 1, "tdb", 64, "uint64");
@@ -98,7 +98,7 @@ initialize_tdesc_s390x_gs_linux64 (void)
   tdesc_create_reg (feature, "tr14", 72, 1, "tdb", 64, "uint64");
   tdesc_create_reg (feature, "tr15", 73, 1, "tdb", 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.vx");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.vx");
   tdesc_type *element_type;
   element_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", element_type, 4);
@@ -169,15 +169,15 @@ initialize_tdesc_s390x_gs_linux64 (void)
   tdesc_create_reg (feature, "v30", 104, 1, NULL, 128, "vec128");
   tdesc_create_reg (feature, "v31", 105, 1, NULL, 128, "vec128");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.gs");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.gs");
   tdesc_create_reg (feature, "gsd", 106, 1, "gs", 64, "uint64");
   tdesc_create_reg (feature, "gssm", 107, 1, "gs", 64, "uint64");
   tdesc_create_reg (feature, "gsepla", 108, 1, "gs", 64, "data_ptr");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.gsbc");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.gsbc");
   tdesc_create_reg (feature, "bc_gsd", 109, 1, "gs", 64, "uint64");
   tdesc_create_reg (feature, "bc_gssm", 110, 1, "gs", 64, "uint64");
   tdesc_create_reg (feature, "bc_gsepla", 111, 1, "gs", 64, "data_ptr");
 
-  tdesc_s390x_gs_linux64 = result;
+  tdesc_s390x_gs_linux64 = result.release ();
 }
diff --git a/gdb/features/s390x-linux64.c b/gdb/features/s390x-linux64.c
index 9d48ea332bd..f8097e94d5b 100644
--- a/gdb/features/s390x-linux64.c
+++ b/gdb/features/s390x-linux64.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_s390x_linux64;
 static void
 initialize_tdesc_s390x_linux64 (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("s390:64-bit"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("s390:64-bit"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.core");
   tdesc_create_reg (feature, "pswm", 0, 1, "psw", 64, "uint64");
   tdesc_create_reg (feature, "pswa", 1, 1, "psw", 64, "uint64");
   tdesc_create_reg (feature, "r0", 2, 1, "general", 64, "uint64");
@@ -34,7 +34,7 @@ initialize_tdesc_s390x_linux64 (void)
   tdesc_create_reg (feature, "r14", 16, 1, "general", 64, "uint64");
   tdesc_create_reg (feature, "r15", 17, 1, "general", 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.acr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.acr");
   tdesc_create_reg (feature, "acr0", 18, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr1", 19, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr2", 20, 1, "access", 32, "uint32");
@@ -52,7 +52,7 @@ initialize_tdesc_s390x_linux64 (void)
   tdesc_create_reg (feature, "acr14", 32, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr15", 33, 1, "access", 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.fpr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.fpr");
   tdesc_create_reg (feature, "fpc", 34, 1, "float", 32, "uint32");
   tdesc_create_reg (feature, "f0", 35, 1, "float", 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 36, 1, "float", 64, "ieee_double");
@@ -71,8 +71,8 @@ initialize_tdesc_s390x_linux64 (void)
   tdesc_create_reg (feature, "f14", 49, 1, "float", 64, "ieee_double");
   tdesc_create_reg (feature, "f15", 50, 1, "float", 64, "ieee_double");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.linux");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.linux");
   tdesc_create_reg (feature, "orig_r2", 51, 1, "system", 64, "uint64");
 
-  tdesc_s390x_linux64 = result;
+  tdesc_s390x_linux64 = result.release ();
 }
diff --git a/gdb/features/s390x-linux64v1.c b/gdb/features/s390x-linux64v1.c
index b95f1c4ccc2..c79ee40efb9 100644
--- a/gdb/features/s390x-linux64v1.c
+++ b/gdb/features/s390x-linux64v1.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_s390x_linux64v1;
 static void
 initialize_tdesc_s390x_linux64v1 (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("s390:64-bit"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("s390:64-bit"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.core");
   tdesc_create_reg (feature, "pswm", 0, 1, "psw", 64, "uint64");
   tdesc_create_reg (feature, "pswa", 1, 1, "psw", 64, "uint64");
   tdesc_create_reg (feature, "r0", 2, 1, "general", 64, "uint64");
@@ -34,7 +34,7 @@ initialize_tdesc_s390x_linux64v1 (void)
   tdesc_create_reg (feature, "r14", 16, 1, "general", 64, "uint64");
   tdesc_create_reg (feature, "r15", 17, 1, "general", 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.acr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.acr");
   tdesc_create_reg (feature, "acr0", 18, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr1", 19, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr2", 20, 1, "access", 32, "uint32");
@@ -52,7 +52,7 @@ initialize_tdesc_s390x_linux64v1 (void)
   tdesc_create_reg (feature, "acr14", 32, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr15", 33, 1, "access", 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.fpr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.fpr");
   tdesc_create_reg (feature, "fpc", 34, 1, "float", 32, "uint32");
   tdesc_create_reg (feature, "f0", 35, 1, "float", 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 36, 1, "float", 64, "ieee_double");
@@ -71,9 +71,9 @@ initialize_tdesc_s390x_linux64v1 (void)
   tdesc_create_reg (feature, "f14", 49, 1, "float", 64, "ieee_double");
   tdesc_create_reg (feature, "f15", 50, 1, "float", 64, "ieee_double");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.linux");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.linux");
   tdesc_create_reg (feature, "orig_r2", 51, 1, "system", 64, "uint64");
   tdesc_create_reg (feature, "last_break", 52, 0, "system", 64, "code_ptr");
 
-  tdesc_s390x_linux64v1 = result;
+  tdesc_s390x_linux64v1 = result.release ();
 }
diff --git a/gdb/features/s390x-linux64v2.c b/gdb/features/s390x-linux64v2.c
index 9aab89f458c..95009170fe8 100644
--- a/gdb/features/s390x-linux64v2.c
+++ b/gdb/features/s390x-linux64v2.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_s390x_linux64v2;
 static void
 initialize_tdesc_s390x_linux64v2 (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("s390:64-bit"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("s390:64-bit"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.core");
   tdesc_create_reg (feature, "pswm", 0, 1, "psw", 64, "uint64");
   tdesc_create_reg (feature, "pswa", 1, 1, "psw", 64, "uint64");
   tdesc_create_reg (feature, "r0", 2, 1, "general", 64, "uint64");
@@ -34,7 +34,7 @@ initialize_tdesc_s390x_linux64v2 (void)
   tdesc_create_reg (feature, "r14", 16, 1, "general", 64, "uint64");
   tdesc_create_reg (feature, "r15", 17, 1, "general", 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.acr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.acr");
   tdesc_create_reg (feature, "acr0", 18, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr1", 19, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr2", 20, 1, "access", 32, "uint32");
@@ -52,7 +52,7 @@ initialize_tdesc_s390x_linux64v2 (void)
   tdesc_create_reg (feature, "acr14", 32, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr15", 33, 1, "access", 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.fpr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.fpr");
   tdesc_create_reg (feature, "fpc", 34, 1, "float", 32, "uint32");
   tdesc_create_reg (feature, "f0", 35, 1, "float", 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 36, 1, "float", 64, "ieee_double");
@@ -71,10 +71,10 @@ initialize_tdesc_s390x_linux64v2 (void)
   tdesc_create_reg (feature, "f14", 49, 1, "float", 64, "ieee_double");
   tdesc_create_reg (feature, "f15", 50, 1, "float", 64, "ieee_double");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.linux");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.linux");
   tdesc_create_reg (feature, "orig_r2", 51, 1, "system", 64, "uint64");
   tdesc_create_reg (feature, "last_break", 52, 0, "system", 64, "code_ptr");
   tdesc_create_reg (feature, "system_call", 53, 1, "system", 32, "uint32");
 
-  tdesc_s390x_linux64v2 = result;
+  tdesc_s390x_linux64v2 = result.release ();
 }
diff --git a/gdb/features/s390x-te-linux64.c b/gdb/features/s390x-te-linux64.c
index babd3bdb03d..64a0fe599df 100644
--- a/gdb/features/s390x-te-linux64.c
+++ b/gdb/features/s390x-te-linux64.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_s390x_te_linux64;
 static void
 initialize_tdesc_s390x_te_linux64 (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("s390:64-bit"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("s390:64-bit"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.core");
   tdesc_create_reg (feature, "pswm", 0, 1, "psw", 64, "uint64");
   tdesc_create_reg (feature, "pswa", 1, 1, "psw", 64, "uint64");
   tdesc_create_reg (feature, "r0", 2, 1, "general", 64, "uint64");
@@ -34,7 +34,7 @@ initialize_tdesc_s390x_te_linux64 (void)
   tdesc_create_reg (feature, "r14", 16, 1, "general", 64, "uint64");
   tdesc_create_reg (feature, "r15", 17, 1, "general", 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.acr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.acr");
   tdesc_create_reg (feature, "acr0", 18, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr1", 19, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr2", 20, 1, "access", 32, "uint32");
@@ -52,7 +52,7 @@ initialize_tdesc_s390x_te_linux64 (void)
   tdesc_create_reg (feature, "acr14", 32, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr15", 33, 1, "access", 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.fpr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.fpr");
   tdesc_create_reg (feature, "fpc", 34, 1, "float", 32, "uint32");
   tdesc_create_reg (feature, "f0", 35, 1, "float", 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 36, 1, "float", 64, "ieee_double");
@@ -71,12 +71,12 @@ initialize_tdesc_s390x_te_linux64 (void)
   tdesc_create_reg (feature, "f14", 49, 1, "float", 64, "ieee_double");
   tdesc_create_reg (feature, "f15", 50, 1, "float", 64, "ieee_double");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.linux");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.linux");
   tdesc_create_reg (feature, "orig_r2", 51, 1, "system", 64, "uint64");
   tdesc_create_reg (feature, "last_break", 52, 0, "system", 64, "code_ptr");
   tdesc_create_reg (feature, "system_call", 53, 1, "system", 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.tdb");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.tdb");
   tdesc_create_reg (feature, "tdb0", 54, 1, "tdb", 64, "uint64");
   tdesc_create_reg (feature, "tac", 55, 1, "tdb", 64, "uint64");
   tdesc_create_reg (feature, "tct", 56, 1, "tdb", 64, "uint64");
@@ -98,5 +98,5 @@ initialize_tdesc_s390x_te_linux64 (void)
   tdesc_create_reg (feature, "tr14", 72, 1, "tdb", 64, "uint64");
   tdesc_create_reg (feature, "tr15", 73, 1, "tdb", 64, "uint64");
 
-  tdesc_s390x_te_linux64 = result;
+  tdesc_s390x_te_linux64 = result.release ();
 }
diff --git a/gdb/features/s390x-tevx-linux64.c b/gdb/features/s390x-tevx-linux64.c
index 1ac3249a054..ec68e702f7c 100644
--- a/gdb/features/s390x-tevx-linux64.c
+++ b/gdb/features/s390x-tevx-linux64.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_s390x_tevx_linux64;
 static void
 initialize_tdesc_s390x_tevx_linux64 (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("s390:64-bit"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("s390:64-bit"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.core");
   tdesc_create_reg (feature, "pswm", 0, 1, "psw", 64, "uint64");
   tdesc_create_reg (feature, "pswa", 1, 1, "psw", 64, "uint64");
   tdesc_create_reg (feature, "r0", 2, 1, "general", 64, "uint64");
@@ -34,7 +34,7 @@ initialize_tdesc_s390x_tevx_linux64 (void)
   tdesc_create_reg (feature, "r14", 16, 1, "general", 64, "uint64");
   tdesc_create_reg (feature, "r15", 17, 1, "general", 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.acr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.acr");
   tdesc_create_reg (feature, "acr0", 18, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr1", 19, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr2", 20, 1, "access", 32, "uint32");
@@ -52,7 +52,7 @@ initialize_tdesc_s390x_tevx_linux64 (void)
   tdesc_create_reg (feature, "acr14", 32, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr15", 33, 1, "access", 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.fpr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.fpr");
   tdesc_create_reg (feature, "fpc", 34, 1, "float", 32, "uint32");
   tdesc_create_reg (feature, "f0", 35, 1, "float", 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 36, 1, "float", 64, "ieee_double");
@@ -71,12 +71,12 @@ initialize_tdesc_s390x_tevx_linux64 (void)
   tdesc_create_reg (feature, "f14", 49, 1, "float", 64, "ieee_double");
   tdesc_create_reg (feature, "f15", 50, 1, "float", 64, "ieee_double");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.linux");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.linux");
   tdesc_create_reg (feature, "orig_r2", 51, 1, "system", 64, "uint64");
   tdesc_create_reg (feature, "last_break", 52, 0, "system", 64, "code_ptr");
   tdesc_create_reg (feature, "system_call", 53, 1, "system", 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.tdb");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.tdb");
   tdesc_create_reg (feature, "tdb0", 54, 1, "tdb", 64, "uint64");
   tdesc_create_reg (feature, "tac", 55, 1, "tdb", 64, "uint64");
   tdesc_create_reg (feature, "tct", 56, 1, "tdb", 64, "uint64");
@@ -98,7 +98,7 @@ initialize_tdesc_s390x_tevx_linux64 (void)
   tdesc_create_reg (feature, "tr14", 72, 1, "tdb", 64, "uint64");
   tdesc_create_reg (feature, "tr15", 73, 1, "tdb", 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.vx");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.vx");
   tdesc_type *element_type;
   element_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", element_type, 4);
@@ -169,5 +169,5 @@ initialize_tdesc_s390x_tevx_linux64 (void)
   tdesc_create_reg (feature, "v30", 104, 1, NULL, 128, "vec128");
   tdesc_create_reg (feature, "v31", 105, 1, NULL, 128, "vec128");
 
-  tdesc_s390x_tevx_linux64 = result;
+  tdesc_s390x_tevx_linux64 = result.release ();
 }
diff --git a/gdb/features/s390x-vx-linux64.c b/gdb/features/s390x-vx-linux64.c
index 2e3d3824a26..4362e53ad3f 100644
--- a/gdb/features/s390x-vx-linux64.c
+++ b/gdb/features/s390x-vx-linux64.c
@@ -9,12 +9,12 @@ struct target_desc *tdesc_s390x_vx_linux64;
 static void
 initialize_tdesc_s390x_vx_linux64 (void)
 {
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("s390:64-bit"));
+  target_desc_up result = allocate_target_description ();
+  set_tdesc_architecture (result.get (), bfd_scan_arch ("s390:64-bit"));
 
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.core");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.core");
   tdesc_create_reg (feature, "pswm", 0, 1, "psw", 64, "uint64");
   tdesc_create_reg (feature, "pswa", 1, 1, "psw", 64, "uint64");
   tdesc_create_reg (feature, "r0", 2, 1, "general", 64, "uint64");
@@ -34,7 +34,7 @@ initialize_tdesc_s390x_vx_linux64 (void)
   tdesc_create_reg (feature, "r14", 16, 1, "general", 64, "uint64");
   tdesc_create_reg (feature, "r15", 17, 1, "general", 64, "uint64");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.acr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.acr");
   tdesc_create_reg (feature, "acr0", 18, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr1", 19, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr2", 20, 1, "access", 32, "uint32");
@@ -52,7 +52,7 @@ initialize_tdesc_s390x_vx_linux64 (void)
   tdesc_create_reg (feature, "acr14", 32, 1, "access", 32, "uint32");
   tdesc_create_reg (feature, "acr15", 33, 1, "access", 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.fpr");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.fpr");
   tdesc_create_reg (feature, "fpc", 34, 1, "float", 32, "uint32");
   tdesc_create_reg (feature, "f0", 35, 1, "float", 64, "ieee_double");
   tdesc_create_reg (feature, "f1", 36, 1, "float", 64, "ieee_double");
@@ -71,12 +71,12 @@ initialize_tdesc_s390x_vx_linux64 (void)
   tdesc_create_reg (feature, "f14", 49, 1, "float", 64, "ieee_double");
   tdesc_create_reg (feature, "f15", 50, 1, "float", 64, "ieee_double");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.linux");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.linux");
   tdesc_create_reg (feature, "orig_r2", 51, 1, "system", 64, "uint64");
   tdesc_create_reg (feature, "last_break", 52, 0, "system", 64, "code_ptr");
   tdesc_create_reg (feature, "system_call", 53, 1, "system", 32, "uint32");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.s390.vx");
+  feature = tdesc_create_feature (result.get (), "org.gnu.gdb.s390.vx");
   tdesc_type *element_type;
   element_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", element_type, 4);
@@ -147,5 +147,5 @@ initialize_tdesc_s390x_vx_linux64 (void)
   tdesc_create_reg (feature, "v30", 84, 1, NULL, 128, "vec128");
   tdesc_create_reg (feature, "v31", 85, 1, NULL, 128, "vec128");
 
-  tdesc_s390x_vx_linux64 = result;
+  tdesc_s390x_vx_linux64 = result.release ();
 }
diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c
index b4ed734c5fb..317c7d092f1 100644
--- a/gdb/mips-tdep.c
+++ b/gdb/mips-tdep.c
@@ -8938,10 +8938,10 @@ _initialize_mips_tdep ()
 
   /* Create feature sets with the appropriate properties.  The values
      are not important.  */
-  mips_tdesc_gp32 = allocate_target_description ();
+  mips_tdesc_gp32 = allocate_target_description ().release ();
   set_tdesc_property (mips_tdesc_gp32, PROPERTY_GP32, "");
 
-  mips_tdesc_gp64 = allocate_target_description ();
+  mips_tdesc_gp64 = allocate_target_description ().release ();
   set_tdesc_property (mips_tdesc_gp64, PROPERTY_GP64, "");
 
   /* Add root prefix command for all "set mips"/"show mips" commands.  */
diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c
index 19dbcbeac39..6d0905b90b8 100644
--- a/gdb/target-descriptions.c
+++ b/gdb/target-descriptions.c
@@ -1207,10 +1207,10 @@ tdesc_create_feature (struct target_desc *tdesc, const char *name)
 
 /* See gdbsupport/tdesc.h.  */
 
-struct target_desc *
+target_desc_up
 allocate_target_description (void)
 {
-  return new target_desc ();
+  return target_desc_up (new target_desc ());
 }
 
 /* See gdbsupport/tdesc.h.  */
@@ -1377,12 +1377,12 @@ class print_c_tdesc : public tdesc_element_visitor
     printf_unfiltered ("initialize_tdesc_%s (void)\n", m_function);
     printf_unfiltered ("{\n");
     printf_unfiltered
-      ("  struct target_desc *result = allocate_target_description ();\n");
+      ("  target_desc_up result = allocate_target_description ();\n");
 
     if (tdesc_architecture (e) != NULL)
       {
 	printf_unfiltered
-	  ("  set_tdesc_architecture (result, bfd_scan_arch (\"%s\"));\n",
+	  ("  set_tdesc_architecture (result.get (), bfd_scan_arch (\"%s\"));\n",
 	   tdesc_architecture (e)->printable_name);
 	printf_unfiltered ("\n");
       }
@@ -1390,21 +1390,21 @@ class print_c_tdesc : public tdesc_element_visitor
 	&& tdesc_osabi (e) < GDB_OSABI_INVALID)
       {
 	printf_unfiltered
-	  ("  set_tdesc_osabi (result, osabi_from_tdesc_string (\"%s\"));\n",
+	  ("  set_tdesc_osabi (result.get (), osabi_from_tdesc_string (\"%s\"));\n",
 	   gdbarch_osabi_name (tdesc_osabi (e)));
 	printf_unfiltered ("\n");
       }
 
     for (const tdesc_compatible_info_up &compatible : e->compatible)
       printf_unfiltered
-	("  tdesc_add_compatible (result, bfd_scan_arch (\"%s\"));\n",
+	("  tdesc_add_compatible (result.get (), bfd_scan_arch (\"%s\"));\n",
 	 compatible->arch ()->printable_name);
 
     if (!e->compatible.empty ())
       printf_unfiltered ("\n");
 
     for (const property &prop : e->properties)
-      printf_unfiltered ("  set_tdesc_property (result, \"%s\", \"%s\");\n",
+      printf_unfiltered ("  set_tdesc_property (result.get (), \"%s\", \"%s\");\n",
 			 prop.key.c_str (), prop.value.c_str ());
 
     printf_unfiltered ("  struct tdesc_feature *feature;\n");
@@ -1412,7 +1412,7 @@ class print_c_tdesc : public tdesc_element_visitor
 
   void visit_pre (const tdesc_feature *e) override
   {
-    printf_unfiltered ("\n  feature = tdesc_create_feature (result, \"%s\");\n",
+    printf_unfiltered ("\n  feature = tdesc_create_feature (result.get (), \"%s\");\n",
 		       e->name.c_str ());
   }
 
@@ -1421,7 +1421,7 @@ class print_c_tdesc : public tdesc_element_visitor
 
   void visit_post (const target_desc *e) override
   {
-    printf_unfiltered ("\n  tdesc_%s = result;\n", m_function);
+    printf_unfiltered ("\n  tdesc_%s = result.release ();\n", m_function);
     printf_unfiltered ("}\n");
   }
 
diff --git a/gdbserver/linux-low.cc b/gdbserver/linux-low.cc
index 1ae72a21d6c..06ce2f090ab 100644
--- a/gdbserver/linux-low.cc
+++ b/gdbserver/linux-low.cc
@@ -497,7 +497,6 @@ linux_process_target::handle_extended_wait (lwp_info **orig_event_lwp,
 	  struct process_info *child_proc;
 	  struct lwp_info *child_lwp;
 	  struct thread_info *child_thr;
-	  struct target_desc *tdesc;
 
 	  ptid = ptid_t (new_pid, new_pid, 0);
 
@@ -553,9 +552,9 @@ linux_process_target::handle_extended_wait (lwp_info **orig_event_lwp,
 
 	  clone_all_breakpoints (child_thr, event_thr);
 
-	  tdesc = allocate_target_description ();
-	  copy_target_description (tdesc, parent_proc->tdesc);
-	  child_proc->tdesc = tdesc;
+	  target_desc_up tdesc = allocate_target_description ();
+	  copy_target_description (tdesc.get (), parent_proc->tdesc);
+	  child_proc->tdesc = tdesc.release ();
 
 	  /* Clone arch-specific process data.  */
 	  low_new_fork (parent_proc, child_proc);
diff --git a/gdbserver/linux-riscv-low.cc b/gdbserver/linux-riscv-low.cc
index 1c6e8c44dd9..32f191ea851 100644
--- a/gdbserver/linux-riscv-low.cc
+++ b/gdbserver/linux-riscv-low.cc
@@ -88,11 +88,11 @@ riscv_target::low_arch_setup ()
 
   const riscv_gdbarch_features features
     = riscv_linux_read_features (lwpid_of (current_thread));
-  target_desc *tdesc = riscv_create_target_description (features);
+  target_desc_up tdesc = riscv_create_target_description (features);
 
   if (!tdesc->expedite_regs)
-    init_target_desc (tdesc, expedite_regs);
-  current_process ()->tdesc = tdesc;
+    init_target_desc (tdesc.get (), expedite_regs);
+  current_process ()->tdesc = tdesc.release ();
 }
 
 /* Collect GPRs from REGCACHE into BUF.  */
diff --git a/gdbserver/linux-x86-low.cc b/gdbserver/linux-x86-low.cc
index eeaced8c8d5..65a0c075705 100644
--- a/gdbserver/linux-x86-low.cc
+++ b/gdbserver/linux-x86-low.cc
@@ -48,9 +48,9 @@
 #include "linux-x86-tdesc.h"
 
 #ifdef __x86_64__
-static struct target_desc *tdesc_amd64_linux_no_xml;
+static target_desc_up tdesc_amd64_linux_no_xml;
 #endif
-static struct target_desc *tdesc_i386_linux_no_xml;
+static target_desc_up tdesc_i386_linux_no_xml;
 
 
 static unsigned char jump_insn[] = { 0xe9, 0, 0, 0, 0 };
@@ -899,10 +899,10 @@ x86_linux_read_description (void)
       /* Don't use XML.  */
 #ifdef __x86_64__
       if (machine == EM_X86_64)
-	return tdesc_amd64_linux_no_xml;
+	return tdesc_amd64_linux_no_xml.get ();
       else
 #endif
-	return tdesc_i386_linux_no_xml;
+	return tdesc_i386_linux_no_xml.get ();
     }
 
   if (have_ptrace_getregset == -1)
@@ -2955,7 +2955,7 @@ x86_target::get_ipa_tdesc_idx ()
   return amd64_get_ipa_tdesc_idx (tdesc);
 #endif
 
-  if (tdesc == tdesc_i386_linux_no_xml)
+  if (tdesc == tdesc_i386_linux_no_xml.get ())
     return X86_TDESC_SSE;
 
   return i386_get_ipa_tdesc_idx (tdesc);
@@ -2971,14 +2971,14 @@ initialize_low_arch (void)
   /* Initialize the Linux target descriptions.  */
 #ifdef __x86_64__
   tdesc_amd64_linux_no_xml = allocate_target_description ();
-  copy_target_description (tdesc_amd64_linux_no_xml,
+  copy_target_description (tdesc_amd64_linux_no_xml.get (),
 			   amd64_linux_read_description (X86_XSTATE_SSE_MASK,
 							 false));
   tdesc_amd64_linux_no_xml->xmltarget = xmltarget_amd64_linux_no_xml;
 #endif
 
   tdesc_i386_linux_no_xml = allocate_target_description ();
-  copy_target_description (tdesc_i386_linux_no_xml,
+  copy_target_description (tdesc_i386_linux_no_xml.get (),
 			   i386_linux_read_description (X86_XSTATE_SSE_MASK));
   tdesc_i386_linux_no_xml->xmltarget = xmltarget_i386_linux_no_xml;
 
diff --git a/gdbserver/tdesc.cc b/gdbserver/tdesc.cc
index e639017cc31..b7e6057ccbe 100644
--- a/gdbserver/tdesc.cc
+++ b/gdbserver/tdesc.cc
@@ -95,10 +95,10 @@ init_target_desc (struct target_desc *tdesc,
 
 /* See gdbsupport/tdesc.h.  */
 
-struct target_desc *
+target_desc_up
 allocate_target_description (void)
 {
-  return new target_desc ();
+  return target_desc_up (new target_desc ());
 }
 
 /* See gdbsupport/tdesc.h.  */
diff --git a/gdbsupport/tdesc.h b/gdbsupport/tdesc.h
index 14b5b5fc9b3..b70a56457da 100644
--- a/gdbsupport/tdesc.h
+++ b/gdbsupport/tdesc.h
@@ -328,7 +328,7 @@ struct target_desc_deleter
 typedef std::unique_ptr<target_desc, target_desc_deleter> target_desc_up;
 
 /* Allocate a new target_desc.  */
-target_desc *allocate_target_description (void);
+target_desc_up allocate_target_description (void);
 
 /* Set TARGET_DESC's architecture by NAME.  */
 void set_tdesc_architecture (target_desc *target_desc,

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

* [PATCH] gdb: Delay releasing target_desc_up in more cases
  2020-10-08  9:28   ` Andrew Burgess
@ 2020-10-08 15:17     ` Andrew Burgess
  2020-10-08 16:54       ` Shahab Vahedi
  0 siblings, 1 reply; 7+ messages in thread
From: Andrew Burgess @ 2020-10-08 15:17 UTC (permalink / raw)
  To: gdb-patches, Shahab Vahedi

This fixes up the places that I missed in the previous commit.

Shahab, this makes a minor change to the ARC gdbserver that I have not
tested.  It's a trivial change so I'm 99.9% sure it's fine... if you
had time to apply this and rebuild just to confirm it's all good that
would be awesome.

Thanks,
Andrew

---

After commit:

  commit 51a948fdf0e14fb69ab9e0c79ae8b2415801f9a3
  Date:   Mon Jul 20 14:18:04 2020 +0100

      gdb: Have allocate_target_description return a unique_ptr

There were a few places where we could (should?) have delayed
releasing the target_desc_up until a little later.  This commit
catches these cases.

In the case of ARC, the target_desc_up is now exposed right out to
gdbserver, which means making a small change there too.

There should be no user visible changes after this commit.

gdb/ChangeLog:

	* arch/aarch32.c (aarch32_create_target_description): Release the
	target_desc_up as late as possible.
	* arch/aarch64.c (aarch64_create_target_description): Likewise.
	* arch/amd64.c (amd64_create_target_description): Likewise.
	* arch/arc.c (arc_create_target_description): Return a
	target_desc_up, don't release it.
	(arc_lookup_target_description): Move target_desc_up into the
	cache, and return a borrowed pointer.
	* arch/arm.c (arm_create_target_description): Release the
	target_desc_up as late as possible.
	* arch/i386.c (i386_create_target_description): Likewise.
	* arch/tic6x.c (tic6x_create_target_description): Likewise.

gdbserver/ChangeLog:

	* linux-arc-low.cc (arc_linux_read_description): Release the
	unique_ptr returned from arc_create_target_description.
---
 gdb/ChangeLog              | 15 +++++++++++++++
 gdb/arch/aarch32.c         | 12 ++++++------
 gdb/arch/aarch64.c         | 14 +++++++-------
 gdb/arch/amd64.c           | 27 ++++++++++++++-------------
 gdb/arch/arc.c             | 25 ++++++++++++++-----------
 gdb/arch/arm.c             | 16 ++++++++--------
 gdb/arch/i386.c            | 24 ++++++++++++------------
 gdb/arch/tic6x.c           | 14 +++++++-------
 gdbserver/ChangeLog        |  5 +++++
 gdbserver/linux-arc-low.cc |  6 +++---
 10 files changed, 91 insertions(+), 67 deletions(-)

diff --git a/gdb/arch/aarch32.c b/gdb/arch/aarch32.c
index bf7a33230e0..0a869ec9b91 100644
--- a/gdb/arch/aarch32.c
+++ b/gdb/arch/aarch32.c
@@ -26,18 +26,18 @@
 target_desc *
 aarch32_create_target_description ()
 {
-  target_desc *tdesc = allocate_target_description ().release ();
+  target_desc_up tdesc = allocate_target_description ();
 
 #ifndef IN_PROCESS_AGENT
-  set_tdesc_architecture (tdesc, "arm");
+  set_tdesc_architecture (tdesc.get (), "arm");
 #endif
 
   long regnum = 0;
 
-  regnum = create_feature_arm_arm_core (tdesc, regnum);
+  regnum = create_feature_arm_arm_core (tdesc.get (), regnum);
   /* Create a vfpv3 feature, then a blank NEON feature.  */
-  regnum = create_feature_arm_arm_vfpv3 (tdesc, regnum);
-  tdesc_create_feature (tdesc, "org.gnu.gdb.arm.neon");
+  regnum = create_feature_arm_arm_vfpv3 (tdesc.get (), regnum);
+  tdesc_create_feature (tdesc.get (), "org.gnu.gdb.arm.neon");
 
-  return tdesc;
+  return tdesc.release ();
 }
diff --git a/gdb/arch/aarch64.c b/gdb/arch/aarch64.c
index c0af7b0906f..f89d5e014df 100644
--- a/gdb/arch/aarch64.c
+++ b/gdb/arch/aarch64.c
@@ -29,23 +29,23 @@
 target_desc *
 aarch64_create_target_description (uint64_t vq, bool pauth_p)
 {
-  target_desc *tdesc = allocate_target_description ().release ();
+  target_desc_up tdesc = allocate_target_description ();
 
 #ifndef IN_PROCESS_AGENT
-  set_tdesc_architecture (tdesc, "aarch64");
+  set_tdesc_architecture (tdesc.get (), "aarch64");
 #endif
 
   long regnum = 0;
 
-  regnum = create_feature_aarch64_core (tdesc, regnum);
+  regnum = create_feature_aarch64_core (tdesc.get (), regnum);
 
   if (vq == 0)
-    regnum = create_feature_aarch64_fpu (tdesc, regnum);
+    regnum = create_feature_aarch64_fpu (tdesc.get (), regnum);
   else
-    regnum = create_feature_aarch64_sve (tdesc, regnum, vq);
+    regnum = create_feature_aarch64_sve (tdesc.get (), regnum, vq);
 
   if (pauth_p)
-    regnum = create_feature_aarch64_pauth (tdesc, regnum);
+    regnum = create_feature_aarch64_pauth (tdesc.get (), regnum);
 
-  return tdesc;
+  return tdesc.release ();
 }
diff --git a/gdb/arch/amd64.c b/gdb/arch/amd64.c
index b11a4fdc0fc..60d997dbee6 100644
--- a/gdb/arch/amd64.c
+++ b/gdb/arch/amd64.c
@@ -40,39 +40,40 @@ target_desc *
 amd64_create_target_description (uint64_t xcr0, bool is_x32, bool is_linux,
 				 bool segments)
 {
-  target_desc *tdesc = allocate_target_description ().release ();
+  target_desc_up tdesc = allocate_target_description ();
 
 #ifndef IN_PROCESS_AGENT
-  set_tdesc_architecture (tdesc, is_x32 ? "i386:x64-32" : "i386:x86-64");
+  set_tdesc_architecture (tdesc.get (),
+			  is_x32 ? "i386:x64-32" : "i386:x86-64");
 
   if (is_linux)
-    set_tdesc_osabi (tdesc, "GNU/Linux");
+    set_tdesc_osabi (tdesc.get (), "GNU/Linux");
 #endif
 
   long regnum = 0;
 
   if (is_x32)
-    regnum = create_feature_i386_x32_core (tdesc, regnum);
+    regnum = create_feature_i386_x32_core (tdesc.get (), regnum);
   else
-    regnum = create_feature_i386_64bit_core (tdesc, regnum);
+    regnum = create_feature_i386_64bit_core (tdesc.get (), regnum);
 
-  regnum = create_feature_i386_64bit_sse (tdesc, regnum);
+  regnum = create_feature_i386_64bit_sse (tdesc.get (), regnum);
   if (is_linux)
-    regnum = create_feature_i386_64bit_linux (tdesc, regnum);
+    regnum = create_feature_i386_64bit_linux (tdesc.get (), regnum);
   if (segments)
-    regnum = create_feature_i386_64bit_segments (tdesc, regnum);
+    regnum = create_feature_i386_64bit_segments (tdesc.get (), regnum);
 
   if (xcr0 & X86_XSTATE_AVX)
-    regnum = create_feature_i386_64bit_avx (tdesc, regnum);
+    regnum = create_feature_i386_64bit_avx (tdesc.get (), regnum);
 
   if ((xcr0 & X86_XSTATE_MPX) && !is_x32)
-    regnum = create_feature_i386_64bit_mpx (tdesc, regnum);
+    regnum = create_feature_i386_64bit_mpx (tdesc.get (), regnum);
 
   if (xcr0 & X86_XSTATE_AVX512)
-    regnum = create_feature_i386_64bit_avx512 (tdesc, regnum);
+    regnum = create_feature_i386_64bit_avx512 (tdesc.get (), regnum);
 
   if ((xcr0 & X86_XSTATE_PKRU) && !is_x32)
-    regnum = create_feature_i386_64bit_pkeys (tdesc, regnum);
+    regnum = create_feature_i386_64bit_pkeys (tdesc.get (), regnum);
 
-  return tdesc;
+  return tdesc.release ();
 }
diff --git a/gdb/arch/arc.c b/gdb/arch/arc.c
index dff457576e1..abed8a66847 100644
--- a/gdb/arch/arc.c
+++ b/gdb/arch/arc.c
@@ -34,11 +34,11 @@
 #define STATIC_IN_GDB
 #endif
 
-STATIC_IN_GDB target_desc *
+STATIC_IN_GDB target_desc_up
 arc_create_target_description (const struct arc_arch_features &features)
 {
   /* Create a new target description.  */
-  target_desc *tdesc = allocate_target_description ().release ();
+  target_desc_up tdesc = allocate_target_description ();
 
 #ifndef IN_PROCESS_AGENT
   std::string arch_name;
@@ -57,7 +57,7 @@ arc_create_target_description (const struct arc_arch_features &features)
       gdb_assert_not_reached (msg.c_str ());
     }
 
-  set_tdesc_architecture (tdesc, arch_name.c_str ());
+  set_tdesc_architecture (tdesc.get (), arch_name.c_str ());
 #endif
 
   long regnum = 0;
@@ -65,12 +65,12 @@ arc_create_target_description (const struct arc_arch_features &features)
   switch (features.isa)
     {
     case ARC_ISA_ARCV1:
-      regnum = create_feature_arc_v1_core (tdesc, regnum);
-      regnum = create_feature_arc_v1_aux (tdesc, regnum);
+      regnum = create_feature_arc_v1_core (tdesc.get (), regnum);
+      regnum = create_feature_arc_v1_aux (tdesc.get (), regnum);
       break;
     case ARC_ISA_ARCV2:
-      regnum = create_feature_arc_v2_core (tdesc, regnum);
-      regnum = create_feature_arc_v2_aux (tdesc, regnum);
+      regnum = create_feature_arc_v2_core (tdesc.get (), regnum);
+      regnum = create_feature_arc_v2_aux (tdesc.get (), regnum);
       break;
     default:
       std::string msg = string_printf
@@ -111,12 +111,15 @@ arc_lookup_target_description (const struct arc_arch_features &features)
   if (it != arc_tdesc_cache.end ())
     return it->second.get ();
 
-  target_desc *tdesc = arc_create_target_description (features);
+  target_desc_up tdesc = arc_create_target_description (features);
 
-  /* Add the newly created target description to the repertoire.  */
-  arc_tdesc_cache.emplace (features, tdesc);
 
-  return tdesc;
+  /* Add to the cache, and return a pointer borrowed from the
+     target_desc_up.  This is safe as the cache (and the pointers
+     contained within it) are not deleted until GDB exits.  */
+  target_desc *ptr = tdesc.get ();
+  arc_tdesc_cache.emplace (features, std::move (tdesc));
+  return ptr;
 }
 
 #endif /* !GDBSERVER */
diff --git a/gdb/arch/arm.c b/gdb/arch/arm.c
index dc67e40f9cf..406a8e72915 100644
--- a/gdb/arch/arm.c
+++ b/gdb/arch/arm.c
@@ -374,18 +374,18 @@ shifted_reg_val (struct regcache *regcache, unsigned long inst,
 target_desc *
 arm_create_target_description (arm_fp_type fp_type)
 {
-  target_desc *tdesc = allocate_target_description ().release ();
+  target_desc_up tdesc = allocate_target_description ();
 
 #ifndef IN_PROCESS_AGENT
   if (fp_type == ARM_FP_TYPE_IWMMXT)
-    set_tdesc_architecture (tdesc, "iwmmxt");
+    set_tdesc_architecture (tdesc.get (), "iwmmxt");
   else
-    set_tdesc_architecture (tdesc, "arm");
+    set_tdesc_architecture (tdesc.get (), "arm");
 #endif
 
   long regnum = 0;
 
-  regnum = create_feature_arm_arm_core (tdesc, regnum);
+  regnum = create_feature_arm_arm_core (tdesc.get (), regnum);
 
   switch (fp_type)
     {
@@ -393,22 +393,22 @@ arm_create_target_description (arm_fp_type fp_type)
       break;
 
     case ARM_FP_TYPE_VFPV2:
-      regnum = create_feature_arm_arm_vfpv2 (tdesc, regnum);
+      regnum = create_feature_arm_arm_vfpv2 (tdesc.get (), regnum);
       break;
 
     case ARM_FP_TYPE_VFPV3:
-      regnum = create_feature_arm_arm_vfpv3 (tdesc, regnum);
+      regnum = create_feature_arm_arm_vfpv3 (tdesc.get (), regnum);
       break;
 
     case ARM_FP_TYPE_IWMMXT:
-      regnum = create_feature_arm_xscale_iwmmxt (tdesc, regnum);
+      regnum = create_feature_arm_xscale_iwmmxt (tdesc.get (), regnum);
       break;
 
     default:
       error (_("Invalid Arm FP type: %d"), fp_type);
     }
 
-  return tdesc;
+  return tdesc.release ();
 }
 
 /* See arch/arm.h.  */
diff --git a/gdb/arch/i386.c b/gdb/arch/i386.c
index 13201db1d74..d823c1ac32a 100644
--- a/gdb/arch/i386.c
+++ b/gdb/arch/i386.c
@@ -35,39 +35,39 @@
 target_desc *
 i386_create_target_description (uint64_t xcr0, bool is_linux, bool segments)
 {
-  target_desc *tdesc = allocate_target_description ().release ();
+  target_desc_up tdesc = allocate_target_description ();
 
 #ifndef IN_PROCESS_AGENT
-  set_tdesc_architecture (tdesc, "i386");
+  set_tdesc_architecture (tdesc.get (), "i386");
   if (is_linux)
-    set_tdesc_osabi (tdesc, "GNU/Linux");
+    set_tdesc_osabi (tdesc.get (), "GNU/Linux");
 #endif
 
   long regnum = 0;
 
   if (xcr0 & X86_XSTATE_X87)
-    regnum = create_feature_i386_32bit_core (tdesc, regnum);
+    regnum = create_feature_i386_32bit_core (tdesc.get (), regnum);
 
   if (xcr0 & X86_XSTATE_SSE)
-    regnum = create_feature_i386_32bit_sse (tdesc, regnum);
+    regnum = create_feature_i386_32bit_sse (tdesc.get (), regnum);
 
   if (is_linux)
-    regnum = create_feature_i386_32bit_linux (tdesc, regnum);
+    regnum = create_feature_i386_32bit_linux (tdesc.get (), regnum);
 
   if (segments)
-    regnum = create_feature_i386_32bit_segments (tdesc, regnum);
+    regnum = create_feature_i386_32bit_segments (tdesc.get (), regnum);
 
   if (xcr0 & X86_XSTATE_AVX)
-    regnum = create_feature_i386_32bit_avx (tdesc, regnum);
+    regnum = create_feature_i386_32bit_avx (tdesc.get (), regnum);
 
   if (xcr0 & X86_XSTATE_MPX)
-    regnum = create_feature_i386_32bit_mpx (tdesc, regnum);
+    regnum = create_feature_i386_32bit_mpx (tdesc.get (), regnum);
 
   if (xcr0 & X86_XSTATE_AVX512)
-    regnum = create_feature_i386_32bit_avx512 (tdesc, regnum);
+    regnum = create_feature_i386_32bit_avx512 (tdesc.get (), regnum);
 
   if (xcr0 & X86_XSTATE_PKRU)
-    regnum = create_feature_i386_32bit_pkeys (tdesc, regnum);
+    regnum = create_feature_i386_32bit_pkeys (tdesc.get (), regnum);
 
-  return tdesc;
+  return tdesc.release ();
 }
diff --git a/gdb/arch/tic6x.c b/gdb/arch/tic6x.c
index dad4dd85a4d..d52ec3ac7b5 100644
--- a/gdb/arch/tic6x.c
+++ b/gdb/arch/tic6x.c
@@ -28,20 +28,20 @@
 target_desc *
 tic6x_create_target_description (enum c6x_feature feature)
 {
-  target_desc *tdesc = allocate_target_description ().release ();
+  target_desc_up tdesc = allocate_target_description ();
 
-  set_tdesc_architecture (tdesc, "tic6x");
-  set_tdesc_osabi (tdesc, "GNU/Linux");
+  set_tdesc_architecture (tdesc.get (), "tic6x");
+  set_tdesc_osabi (tdesc.get (), "GNU/Linux");
 
   long regnum = 0;
 
-  regnum = create_feature_tic6x_core (tdesc, regnum);
+  regnum = create_feature_tic6x_core (tdesc.get (), regnum);
 
   if (feature == C6X_GP || feature == C6X_C6XP)
-    regnum = create_feature_tic6x_gp (tdesc, regnum);
+    regnum = create_feature_tic6x_gp (tdesc.get (), regnum);
 
   if (feature == C6X_C6XP)
-    regnum = create_feature_tic6x_c6xp (tdesc, regnum);
+    regnum = create_feature_tic6x_c6xp (tdesc.get (), regnum);
 
-  return tdesc;
+  return tdesc.release ();
 }
diff --git a/gdbserver/linux-arc-low.cc b/gdbserver/linux-arc-low.cc
index 1f370ef7964..d101bd250eb 100644
--- a/gdbserver/linux-arc-low.cc
+++ b/gdbserver/linux-arc-low.cc
@@ -112,12 +112,12 @@ arc_linux_read_description (void)
 #else
   arc_arch_features features (4, ARC_ISA_ARCV2);
 #endif
-  struct target_desc *tdesc = arc_create_target_description (features);
+  target_desc_up tdesc = arc_create_target_description (features);
 
   static const char *expedite_regs[] = { "sp", "status32", nullptr };
-  init_target_desc (tdesc, expedite_regs);
+  init_target_desc (tdesc.get (), expedite_regs);
 
-  return tdesc;
+  return tdesc.release ();
 }
 
 void
-- 
2.25.4


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

* Re: [PATCH] gdb: Delay releasing target_desc_up in more cases
  2020-10-08 15:17     ` [PATCH] gdb: Delay releasing target_desc_up in more cases Andrew Burgess
@ 2020-10-08 16:54       ` Shahab Vahedi
  2020-10-09 10:47         ` Andrew Burgess
  0 siblings, 1 reply; 7+ messages in thread
From: Shahab Vahedi @ 2020-10-08 16:54 UTC (permalink / raw)
  To: Andrew Burgess, gdb-patches; +Cc: Shahab Vahedi

Hi Andrew,

With a little bit of an extra change [1], everything works fine. Thank you for
fixing this in ARC port as well.


Cheers,
Shahab


[1] Changing the "arc_create_traget_description" proto type in the header file
diff --git a/gdb/arch/arc.h b/gdb/arch/arc.h
index 16257596748..1e0e8cd9635 100644
--- a/gdb/arch/arc.h
+++ b/gdb/arch/arc.h
@@ -70,7 +70,7 @@ struct arc_arch_features
    The only external client of this must be the gdbserver which manipulates
    the returned data.  */
 
-target_desc *arc_create_target_description
+target_desc_up arc_create_target_description
        (const struct arc_arch_features &features);
 
 #else


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

* Re: [PATCH] gdb: Delay releasing target_desc_up in more cases
  2020-10-08 16:54       ` Shahab Vahedi
@ 2020-10-09 10:47         ` Andrew Burgess
  0 siblings, 0 replies; 7+ messages in thread
From: Andrew Burgess @ 2020-10-09 10:47 UTC (permalink / raw)
  To: Shahab Vahedi; +Cc: gdb-patches

* Shahab Vahedi <Shahab.Vahedi@synopsys.com> [2020-10-08 16:54:31 +0000]:

> Hi Andrew,
> 
> With a little bit of an extra change [1], everything works fine. Thank you for
> fixing this in ARC port as well.
> 
> 
> Cheers,
> Shahab
> 
> 
> [1] Changing the "arc_create_traget_description" proto type in the header file
> diff --git a/gdb/arch/arc.h b/gdb/arch/arc.h
> index 16257596748..1e0e8cd9635 100644
> --- a/gdb/arch/arc.h
> +++ b/gdb/arch/arc.h
> @@ -70,7 +70,7 @@ struct arc_arch_features
>     The only external client of this must be the gdbserver which manipulates
>     the returned data.  */
>  
> -target_desc *arc_create_target_description
> +target_desc_up arc_create_target_description
>         (const struct arc_arch_features &features);
>  
>  #else
> 

Thanks. I pushed this patch with your fix applied.

Andrew


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

end of thread, other threads:[~2020-10-09 10:47 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-10-05 19:47 [PATCH] gdb: Have allocate_target_description return a unique_ptr Andrew Burgess
2020-10-05 19:52 ` Simon Marchi
2020-10-07 11:41 ` Pedro Alves
2020-10-08  9:28   ` Andrew Burgess
2020-10-08 15:17     ` [PATCH] gdb: Delay releasing target_desc_up in more cases Andrew Burgess
2020-10-08 16:54       ` Shahab Vahedi
2020-10-09 10:47         ` Andrew Burgess

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).