public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [PATCH 03/26] Add optional argument to command "maint prints c-tdesc"
  2017-07-10 13:56 [PATCH 00/26 v3] Make GDB builtin target descriptions more flexible Yao Qi
  2017-07-10 13:55 ` [PATCH 01/26] Improve doc about "maint print c-tdesc" Yao Qi
  2017-07-10 13:55 ` [PATCH 04/26] Centralize i386 linux target descriptions Yao Qi
@ 2017-07-10 13:55 ` Yao Qi
  2017-07-10 17:21   ` Eli Zaretskii
  2017-07-10 13:56 ` [PATCH 12/26] [GDBserver] Centralize tdesc for i386-linux Yao Qi
                   ` (23 subsequent siblings)
  26 siblings, 1 reply; 30+ messages in thread
From: Yao Qi @ 2017-07-10 13:55 UTC (permalink / raw)
  To: gdb-patches

Nowadays, we need two steps to print c files for xml target description,
that is, 1) read xml target description in, update the current tdesc,
2) visit the current tdesc, print the c file.  It is unnecessary to
involve in current tdesc, and some validations in each gdbarch are
performed unnecessarily, which will reject some target descriptions if
they are missing some mandatory feature.

This patch adds an optional argument to "maint print c-tdesc", which
is an XML file target description, so that we can combine the two
steps above into one step, and don't have to involve in global current
tdesc.

gdb:

2017-06-30  Yao Qi  <yao.qi@linaro.org>

	* NEWS: Mention it.
	* features/Makefile (%.c: %.xml): Pass the xml file name to
	command "maint print c-tdesc".
	* target-descriptions.c (maint_print_c_tdesc_cmd): Get file
	name from 'arg'.

gdb/doc:

2017-06-30  Yao Qi  <yao.qi@linaro.org>

	* gdb.texinfo (Maintenance Commands): Document optional
	argument of "maint print c-tdesc".
---
 gdb/NEWS                  |  3 +++
 gdb/doc/gdb.texinfo       | 14 +++++++++-----
 gdb/features/Makefile     |  3 +--
 gdb/target-descriptions.c | 25 ++++++++++++++++++-------
 4 files changed, 31 insertions(+), 14 deletions(-)

diff --git a/gdb/NEWS b/gdb/NEWS
index 7c8a8f6..9cd1df1 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -17,6 +17,9 @@
 QStartupWithShell
   Indicates whether the inferior must be started with a shell or not.
 
+* The "maintenance print c-tdesc" command now takes an optional
+  argument which is the file name of XML target description.
+
 * New commands
 
 set debug separate-debug-file
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index 5f55a67..08a7681 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -34687,12 +34687,16 @@ checksum.
 Print the entire architecture configuration.  The optional argument
 @var{file} names the file where the output goes.
 
-@kindex maint print c-tdesc
+@kindex maint print c-tdesc @r{[}@var{file}@r{]}
 @item maint print c-tdesc
-Print the current target description (@pxref{Target Descriptions}) as
-a C source file.  The created source file is built into @value{GDBN}
-when @value{GDBN} is built again.  This command is used by developers
-after they add or modify XML target descriptions.
+Print the target description (@pxref{Target Descriptions}) as
+a C source file.  By default, the target description is for the current
+target, but if the optional argument @var{file} is provided, that file
+is used to produce the description.  The @var{file} should be an XML
+document, of the form described in @ref{Target Description Format}.
+The created source file is built into @value{GDBN} when @value{GDBN} is
+built again.  This command is used by developers after they add or
+modify XML target descriptions.
 
 @kindex maint print dummy-frames
 @item maint print dummy-frames
diff --git a/gdb/features/Makefile b/gdb/features/Makefile
index 3bc8b5a..dd0f28a 100644
--- a/gdb/features/Makefile
+++ b/gdb/features/Makefile
@@ -254,8 +254,7 @@ $(outdir)/%.dat: %.xml number-regs.xsl sort-regs.xsl gdbserver-regs.xsl
 
 cfiles: $(CFILES)
 %.c: %.xml
-	$(GDB) -nx -q -batch \
-	  -ex "set tdesc filename $<" -ex 'maint print c-tdesc' > $@.tmp
+	$(GDB) -nx -q -batch -ex 'maint print c-tdesc $<' > $@.tmp
 	sh ../../move-if-change $@.tmp $@
 
 # Other dependencies.
diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c
index ffabc71..e782084 100644
--- a/gdb/target-descriptions.c
+++ b/gdb/target-descriptions.c
@@ -1726,18 +1726,29 @@ maint_print_c_tdesc_cmd (char *args, int from_tty)
   int ix, ix2, ix3;
   int printed_field_type = 0;
 
-  /* Use the global target-supplied description, not the current
-     architecture's.  This lets a GDB for one architecture generate C
-     for another architecture's description, even though the gdbarch
-     initialization code will reject the new description.  */
-  tdesc = current_target_desc;
+  if (args == NULL)
+    {
+      /* Use the global target-supplied description, not the current
+	 architecture's.  This lets a GDB for one architecture generate C
+	 for another architecture's description, even though the gdbarch
+	 initialization code will reject the new description.  */
+      tdesc = current_target_desc;
+      filename = target_description_filename;
+    }
+  else
+    {
+      /* Use the target description from the XML file.  */
+      filename = args;
+      tdesc = file_read_description_xml (filename);
+    }
+
   if (tdesc == NULL)
     error (_("There is no target description to print."));
 
-  if (target_description_filename == NULL)
+  if (filename == NULL)
     error (_("The current target description did not come from an XML file."));
 
-  filename = lbasename (target_description_filename);
+  filename = lbasename (filename);
   function = (char *) alloca (strlen (filename) + 1);
   for (inp = filename, outp = function; *inp != '\0'; inp++)
     if (*inp == '.')
-- 
1.9.1

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

* [PATCH 04/26] Centralize i386 linux target descriptions
  2017-07-10 13:56 [PATCH 00/26 v3] Make GDB builtin target descriptions more flexible Yao Qi
  2017-07-10 13:55 ` [PATCH 01/26] Improve doc about "maint print c-tdesc" Yao Qi
@ 2017-07-10 13:55 ` Yao Qi
  2017-07-10 13:55 ` [PATCH 03/26] Add optional argument to command "maint prints c-tdesc" Yao Qi
                   ` (24 subsequent siblings)
  26 siblings, 0 replies; 30+ messages in thread
From: Yao Qi @ 2017-07-10 13:55 UTC (permalink / raw)
  To: gdb-patches

This patch moves all the tdesc_i386*_linux target descriptions to a
function i386_linux_read_description, which returns the right target
description according to xcr0.  This also remove the duplication in
getting target descriptions in corefile and native target.

 v3: Add comment and remove an extra space.

gdb:

2017-04-27  Yao Qi  <yao.qi@linaro.org>

	* i386-linux-tdep.c (i386_linux_read_description): New function.
	(i386_linux_core_read_description): Call
	i386_linux_read_description.
	* i386-linux-tdep.h (i386_linux_read_description): Declare.
	(tdesc_i386_linux, tdesc_i386_mmx_linux): Remove declarations.
	(tdesc_i386_avx_linux, tdesc_i386_mpx_linux): Likewise
	(tdesc_i386_avx_mpx_linux, tdesc_i386_avx_avx512_linux): Likewise.
	(tdesc_i386_avx_mpx_avx512_pku_linux): Likewise.
	* x86-linux-nat.c (x86_linux_read_description): Call
	i386_linux_read_description.
---
 gdb/i386-linux-tdep.c | 34 +++++++++++++++++++++++-----------
 gdb/i386-linux-tdep.h | 10 ++--------
 gdb/x86-linux-nat.c   | 24 ++++++++----------------
 3 files changed, 33 insertions(+), 35 deletions(-)

diff --git a/gdb/i386-linux-tdep.c b/gdb/i386-linux-tdep.c
index d381e41..e986d6f 100644
--- a/gdb/i386-linux-tdep.c
+++ b/gdb/i386-linux-tdep.c
@@ -678,16 +678,11 @@ i386_linux_core_read_xcr0 (bfd *abfd)
   return xcr0;
 }
 
-/* Get Linux/x86 target description from core dump.  */
+/* See i386-linux-tdep.h.  */
 
-static const struct target_desc *
-i386_linux_core_read_description (struct gdbarch *gdbarch,
-				  struct target_ops *target,
-				  bfd *abfd)
+const struct target_desc *
+i386_linux_read_description (uint64_t xcr0)
 {
-  /* Linux/i386.  */
-  uint64_t xcr0 = i386_linux_core_read_xcr0 (abfd);
-
   switch ((xcr0 & X86_XSTATE_ALL_MASK))
     {
     case X86_XSTATE_AVX_MPX_AVX512_PKU_MASK:
@@ -708,10 +703,27 @@ i386_linux_core_read_description (struct gdbarch *gdbarch,
       break;
     }
 
+  return NULL;
+}
+
+/* Get Linux/x86 target description from core dump.  */
+
+static const struct target_desc *
+i386_linux_core_read_description (struct gdbarch *gdbarch,
+				  struct target_ops *target,
+				  bfd *abfd)
+{
+  /* Linux/i386.  */
+  uint64_t xcr0 = i386_linux_core_read_xcr0 (abfd);
+  const struct target_desc *tdesc = i386_linux_read_description (xcr0);
+
+  if (tdesc != NULL)
+    return tdesc;
+
   if (bfd_get_section_by_name (abfd, ".reg-xfp") != NULL)
-    return tdesc_i386_linux;
+    return i386_linux_read_description (X86_XSTATE_SSE_MASK);
   else
-    return tdesc_i386_mmx_linux;
+    return i386_linux_read_description (X86_XSTATE_X87_MASK);
 }
 
 /* Similar to i386_supply_fpregset, but use XSAVE extended state.  */
@@ -835,7 +847,7 @@ i386_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
   set_gdbarch_num_regs (gdbarch, I386_LINUX_NUM_REGS);
 
   if (! tdesc_has_registers (tdesc))
-    tdesc = tdesc_i386_linux;
+    tdesc = i386_linux_read_description (X86_XSTATE_SSE_MASK);
   tdep->tdesc = tdesc;
 
   feature = tdesc_find_feature (tdesc, "org.gnu.gdb.i386.linux");
diff --git a/gdb/i386-linux-tdep.h b/gdb/i386-linux-tdep.h
index 8d4c7ca..1ca8d6b 100644
--- a/gdb/i386-linux-tdep.h
+++ b/gdb/i386-linux-tdep.h
@@ -42,14 +42,8 @@ extern uint64_t i386_linux_core_read_xcr0 (bfd *abfd);
 extern void i386_linux_handle_segmentation_fault (struct gdbarch *gdbarch,
 						  struct ui_out *uiout);
 
-/* Linux target description.  */
-extern struct target_desc *tdesc_i386_linux;
-extern struct target_desc *tdesc_i386_mmx_linux;
-extern struct target_desc *tdesc_i386_avx_linux;
-extern struct target_desc *tdesc_i386_mpx_linux;
-extern struct target_desc *tdesc_i386_avx_mpx_linux;
-extern struct target_desc *tdesc_i386_avx_avx512_linux;
-extern struct target_desc *tdesc_i386_avx_mpx_avx512_pku_linux;
+/* Return the target description according to XCR0.  */
+extern const struct target_desc *i386_linux_read_description (uint64_t xcr0);
 
 /* Format of XSAVE extended state is:
  	struct
diff --git a/gdb/x86-linux-nat.c b/gdb/x86-linux-nat.c
index 7362282..2c4afb1 100644
--- a/gdb/x86-linux-nat.c
+++ b/gdb/x86-linux-nat.c
@@ -153,7 +153,7 @@ x86_linux_read_description (struct target_ops *ops)
 	{
 	  have_ptrace_getfpxregs = 0;
 	  have_ptrace_getregset = TRIBOOL_FALSE;
-	  return tdesc_i386_mmx_linux;
+	  return i386_linux_read_description (X86_XSTATE_X87_MASK);
 	}
     }
 #endif
@@ -230,21 +230,13 @@ x86_linux_read_description (struct target_ops *ops)
     }
   else
     {
-      switch (xcr0_features_bits)
-	{
-	case X86_XSTATE_AVX_MPX_AVX512_PKU_MASK:
-	  return tdesc_i386_avx_mpx_avx512_pku_linux;
-	case X86_XSTATE_AVX_AVX512_MASK:
-	  return tdesc_i386_avx_avx512_linux;
-	case X86_XSTATE_MPX_MASK:
-	  return tdesc_i386_mpx_linux;
-	case X86_XSTATE_AVX_MPX_MASK:
-	  return tdesc_i386_avx_mpx_linux;
-	case X86_XSTATE_AVX_MASK:
-	  return tdesc_i386_avx_linux;
-	default:
-	  return tdesc_i386_linux;
-	}
+      const struct target_desc * tdesc
+	= i386_linux_read_description (xcr0_features_bits);
+
+      if (tdesc == NULL)
+	tdesc = i386_linux_read_description (X86_XSTATE_SSE_MASK);
+
+      return tdesc;
     }
 
   gdb_assert_not_reached ("failed to return tdesc");
-- 
1.9.1

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

* [PATCH 01/26] Improve doc about "maint print c-tdesc"
  2017-07-10 13:56 [PATCH 00/26 v3] Make GDB builtin target descriptions more flexible Yao Qi
@ 2017-07-10 13:55 ` Yao Qi
  2017-07-18 11:40   ` Yao Qi
  2017-07-10 13:55 ` [PATCH 04/26] Centralize i386 linux target descriptions Yao Qi
                   ` (25 subsequent siblings)
  26 siblings, 1 reply; 30+ messages in thread
From: Yao Qi @ 2017-07-10 13:55 UTC (permalink / raw)
  To: gdb-patches

In my patch extending command "maint print c-tdesc"
(https://sourceware.org/ml/gdb-patches/2017-06/msg00286.html), Eli
raised some questions on the existing doc to this command.  It is not
very clear, so this patch improves it.  Eli approved it.

gdb/doc:

2017-06-30  Yao Qi  <yao.qi@linaro.org>

	* gdb.texinfo (Maintenance Commands): Improve the doc to
	command "maint print c-tdesc".
---
 gdb/doc/gdb.texinfo | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index c167a86..5f55a67 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -34690,8 +34690,9 @@ Print the entire architecture configuration.  The optional argument
 @kindex maint print c-tdesc
 @item maint print c-tdesc
 Print the current target description (@pxref{Target Descriptions}) as
-a C source file.  The created source file can be used in @value{GDBN}
-when an XML parser is not available to parse the description.
+a C source file.  The created source file is built into @value{GDBN}
+when @value{GDBN} is built again.  This command is used by developers
+after they add or modify XML target descriptions.
 
 @kindex maint print dummy-frames
 @item maint print dummy-frames
-- 
1.9.1

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

* [PATCH 15/26] Dynamically composite xml in reply to GDB
  2017-07-10 13:56 [PATCH 00/26 v3] Make GDB builtin target descriptions more flexible Yao Qi
                   ` (14 preceding siblings ...)
  2017-07-10 13:56 ` [PATCH 18/26] [GDBserver] Use pre-generated tdesc as test Yao Qi
@ 2017-07-10 13:56 ` Yao Qi
  2017-07-10 13:56 ` [PATCH 08/26] Add "maint check xml-descriptions" to test builtin xml target descriptions Yao Qi
                   ` (10 subsequent siblings)
  26 siblings, 0 replies; 30+ messages in thread
From: Yao Qi @ 2017-07-10 13:56 UTC (permalink / raw)
  To: gdb-patches

GDBserver still uses pre-generated target descriptions in order to
reply to GDB's query on target description (see xml-builtin-generated.c
in GDBserver build directory).  This patch teaches GDBserver to
create XML contents according to the target descriptions rather than
using pre-generated ones.

First, change target feature c files to pass the feature xml file
name to tdesc_create_feature, so that target description in GDBserver
can record them, and create XML contents from these features in
buffer, like

  ...
  <xi:include href="$FEATURE1_XML_NAME"/>
  <xi:include href="$FEATURE2_XML_NAME"/>
  ...

and send this buffer back to GDB.

Note that this patch reuses target_desc.xmltarget a little bit, which is
to hold the XML contents dynamically generated in tdesc_get_features_xml.
However, it is not xfree'ed in ~target_desc, because we can't tell it is
from xstrdup or a literal string.  Since we don't delete target_desc,
there is no memory leak yet.  After we change all target descriptions to
the new style, target_desc.xmltarget is from xstrdup, then, we can safely
xfree it in ~target_desc.

gdb:

2017-07-07  Yao Qi  <yao.qi@linaro.org>

	* arch/tdesc.h (tdesc_create_feature): Add an argument xml.
	* target-descriptions.c (tdesc_create_feature): Likewise, and
	adjust code.
	* features/i386/32bit-avx.c: Re-generated.
	* features/i386/32bit-avx512.c: Re-generated.
	* features/i386/32bit-core.c: Re-generated.
	* features/i386/32bit-linux.c: Re-generated.
	* features/i386/32bit-mpx.c: Re-generated.
	* features/i386/32bit-pkeys.c: Re-generated.
	* features/i386/32bit-sse.c: Re-generated.

gdb/gdbserver:

2017-07-03  Yao Qi  <yao.qi@linaro.org>

	* linux-x86-tdesc.c: Don't include <inttypes.h>.
	(i386_linux_read_description) [!IN_PROCESS_AGENT]: Call
	set_tdesc_architecture and set_tdesc_osabi.  Remove code setting
	.xmltarget.
	* server.c (get_features_xml): Call tdesc_get_features_xml.
	* tdesc.c (set_tdesc_architecture): New function.
	(set_tdesc_osabi): New function.
	(tdesc_get_features_xml): New function.
	(tdesc_create_feature): Add an argument.
	* tdesc.h (struct target_desc) <features>: New field.
	<arch, osabi>: New field.
	(~target_desc): xfree features, arch, and osabi.
	(target_desc::oerator==): Don't compare .xmltarget.
	[!IN_PROCESS_AGENT] (set_tdesc_architecture): Declare.
	(set_tdesc_osabi): Likewise.
	(tdesc_get_features_xml): Likewise.
---
 gdb/arch/tdesc.h                 |  4 ++-
 gdb/features/i386/32bit-avx.c    |  2 +-
 gdb/features/i386/32bit-avx512.c |  2 +-
 gdb/features/i386/32bit-core.c   |  2 +-
 gdb/features/i386/32bit-linux.c  |  2 +-
 gdb/features/i386/32bit-mpx.c    |  2 +-
 gdb/features/i386/32bit-pkeys.c  |  2 +-
 gdb/features/i386/32bit-sse.c    |  2 +-
 gdb/gdbserver/linux-x86-tdesc.c  | 24 ++++------------
 gdb/gdbserver/server.c           | 10 ++++---
 gdb/gdbserver/tdesc.c            | 62 +++++++++++++++++++++++++++++++++++++++-
 gdb/gdbserver/tdesc.h            | 34 +++++++++++++++++++---
 gdb/target-descriptions.c        |  9 ++++--
 13 files changed, 118 insertions(+), 39 deletions(-)

diff --git a/gdb/arch/tdesc.h b/gdb/arch/tdesc.h
index 872df68..bf50e24 100644
--- a/gdb/arch/tdesc.h
+++ b/gdb/arch/tdesc.h
@@ -30,7 +30,9 @@ struct tdesc_type *tdesc_named_type (const struct tdesc_feature *feature,
 
 /* Return the created feature named NAME in target description TDESC.  */
 struct tdesc_feature *tdesc_create_feature (struct target_desc *tdesc,
-					    const char *name);
+					    const char *name,
+					    const char *xml = nullptr);
+
 
 /* Return the created vector tdesc_type named NAME in FEATURE.  */
 struct tdesc_type *tdesc_create_vector (struct tdesc_feature *feature,
diff --git a/gdb/features/i386/32bit-avx.c b/gdb/features/i386/32bit-avx.c
index 3a98936..8a0c356 100644
--- a/gdb/features/i386/32bit-avx.c
+++ b/gdb/features/i386/32bit-avx.c
@@ -8,7 +8,7 @@ create_feature_i386_32bit_avx (struct target_desc *result, long regnum)
 {
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx");
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx", "32bit-avx.xml");
   tdesc_create_reg (feature, "ymm0h", regnum++, 1, NULL, 128, "uint128");
   tdesc_create_reg (feature, "ymm1h", regnum++, 1, NULL, 128, "uint128");
   tdesc_create_reg (feature, "ymm2h", regnum++, 1, NULL, 128, "uint128");
diff --git a/gdb/features/i386/32bit-avx512.c b/gdb/features/i386/32bit-avx512.c
index b13e1d3..82b20c5 100644
--- a/gdb/features/i386/32bit-avx512.c
+++ b/gdb/features/i386/32bit-avx512.c
@@ -8,7 +8,7 @@ create_feature_i386_32bit_avx512 (struct target_desc *result, long regnum)
 {
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx512");
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx512", "32bit-avx512.xml");
   struct tdesc_type *field_type;
   field_type = tdesc_named_type (feature, "uint128");
   tdesc_create_vector (feature, "v2ui128", field_type, 2);
diff --git a/gdb/features/i386/32bit-core.c b/gdb/features/i386/32bit-core.c
index ea6db93..ec903f3 100644
--- a/gdb/features/i386/32bit-core.c
+++ b/gdb/features/i386/32bit-core.c
@@ -8,7 +8,7 @@ create_feature_i386_32bit_core (struct target_desc *result, long regnum)
 {
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core", "32bit-core.xml");
   struct tdesc_type *field_type;
   struct tdesc_type *type;
   type = tdesc_create_flags (feature, "i386_eflags", 4);
diff --git a/gdb/features/i386/32bit-linux.c b/gdb/features/i386/32bit-linux.c
index 1ba932d..136e3d7 100644
--- a/gdb/features/i386/32bit-linux.c
+++ b/gdb/features/i386/32bit-linux.c
@@ -8,7 +8,7 @@ create_feature_i386_32bit_linux (struct target_desc *result, long regnum)
 {
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.linux");
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.linux", "32bit-linux.xml");
   regnum = 41;
   tdesc_create_reg (feature, "orig_eax", regnum++, 1, NULL, 32, "int");
   return regnum;
diff --git a/gdb/features/i386/32bit-mpx.c b/gdb/features/i386/32bit-mpx.c
index f7d2ef0..25a3fb1 100644
--- a/gdb/features/i386/32bit-mpx.c
+++ b/gdb/features/i386/32bit-mpx.c
@@ -8,7 +8,7 @@ create_feature_i386_32bit_mpx (struct target_desc *result, long regnum)
 {
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.mpx");
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.mpx", "32bit-mpx.xml");
   struct tdesc_type *field_type;
   struct tdesc_type *type;
   type = tdesc_create_struct (feature, "br128");
diff --git a/gdb/features/i386/32bit-pkeys.c b/gdb/features/i386/32bit-pkeys.c
index 89f1a5b..4ad7649 100644
--- a/gdb/features/i386/32bit-pkeys.c
+++ b/gdb/features/i386/32bit-pkeys.c
@@ -8,7 +8,7 @@ create_feature_i386_32bit_pkeys (struct target_desc *result, long regnum)
 {
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.pkeys");
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.pkeys", "32bit-pkeys.xml");
   tdesc_create_reg (feature, "pkru", regnum++, 1, NULL, 32, "uint32");
   return regnum;
 }
diff --git a/gdb/features/i386/32bit-sse.c b/gdb/features/i386/32bit-sse.c
index 98f4cd0..01b2058 100644
--- a/gdb/features/i386/32bit-sse.c
+++ b/gdb/features/i386/32bit-sse.c
@@ -8,7 +8,7 @@ create_feature_i386_32bit_sse (struct target_desc *result, long regnum)
 {
   struct tdesc_feature *feature;
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.sse");
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.sse", "32bit-sse.xml");
   struct tdesc_type *field_type;
   field_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", field_type, 4);
diff --git a/gdb/gdbserver/linux-x86-tdesc.c b/gdb/gdbserver/linux-x86-tdesc.c
index 65ab0e3..f17e303 100644
--- a/gdb/gdbserver/linux-x86-tdesc.c
+++ b/gdb/gdbserver/linux-x86-tdesc.c
@@ -21,7 +21,6 @@
 #include "tdesc.h"
 #include "linux-x86-tdesc.h"
 #include "x86-xstate.h"
-#include <inttypes.h>
 
 #if defined __i386__ || !defined IN_PROCESS_AGENT
 #include "../features/i386/32bit-core.c"
@@ -145,6 +144,11 @@ i386_linux_read_description (uint64_t xcr0)
     {
       *tdesc = new target_desc ();
 
+#ifndef IN_PROCESS_AGENT
+      set_tdesc_architecture (*tdesc, "i386");
+      set_tdesc_osabi (*tdesc, "GNU/Linux");
+#endif
+
       long regnum = 0;
 
       if (xcr0 & X86_XSTATE_X87)
@@ -172,24 +176,6 @@ i386_linux_read_description (uint64_t xcr0)
 #ifndef IN_PROCESS_AGENT
       static const char *expedite_regs_i386[] = { "ebp", "esp", "eip", NULL };
       (*tdesc)->expedite_regs = expedite_regs_i386;
-
-      if (xcr0 & X86_XSTATE_PKRU)
-	(*tdesc)->xmltarget = "i386-avx-mpx-avx512-pku-linux.xml";
-      else if (xcr0 & X86_XSTATE_AVX512)
-	(*tdesc)->xmltarget = "i386-avx-avx512-linux.xml";
-      else if ((xcr0 & X86_XSTATE_AVX_MPX_MASK) == X86_XSTATE_AVX_MPX_MASK)
-	(*tdesc)->xmltarget = "i386-avx-mpx-linux.xml";
-      else if (xcr0 & X86_XSTATE_MPX)
-	(*tdesc)->xmltarget = "i386-mpx-linux.xml";
-      else if (xcr0 & X86_XSTATE_AVX)
-	(*tdesc)->xmltarget = "i386-avx-linux.xml";
-      else if (xcr0 & X86_XSTATE_SSE)
-	(*tdesc)->xmltarget = "i386-linux.xml";
-      else if (xcr0 & X86_XSTATE_X87)
-	(*tdesc)->xmltarget = "i386-mmx-linux.xml";
-      else
-	internal_error (__FILE__, __LINE__,
-			"unknown xcr0: %" PRIu64, xcr0);
 #endif
     }
 
diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c
index 4ca09dd..7bd78cc 100644
--- a/gdb/gdbserver/server.c
+++ b/gdb/gdbserver/server.c
@@ -812,12 +812,14 @@ get_features_xml (const char *annex)
      This variable is set up from the auto-generated
      init_registers_... routine for the current target.  */
 
-  if (desc->xmltarget != NULL && strcmp (annex, "target.xml") == 0)
+  if (strcmp (annex, "target.xml") == 0)
     {
-      if (*desc->xmltarget == '@')
-	return desc->xmltarget + 1;
+      const char *ret = tdesc_get_features_xml ((target_desc*) desc);
+
+      if (*ret == '@')
+	return ret + 1;
       else
-	annex = desc->xmltarget;
+	annex = ret;
     }
 
 #ifdef USE_XML
diff --git a/gdb/gdbserver/tdesc.c b/gdb/gdbserver/tdesc.c
index 4504c9b..0b5096b 100644
--- a/gdb/gdbserver/tdesc.c
+++ b/gdb/gdbserver/tdesc.c
@@ -61,6 +61,62 @@ current_target_desc (void)
 
   return current_process ()->tdesc;
 }
+
+void
+set_tdesc_architecture (struct target_desc *target_desc,
+			const char *name)
+{
+  target_desc->arch = xstrdup (name);
+}
+
+void
+set_tdesc_osabi (struct target_desc *target_desc, const char *name)
+{
+  target_desc->osabi = xstrdup (name);
+}
+
+/* Return a string which is of XML format, including XML target
+   description to be sent to GDB.  */
+
+const char *
+tdesc_get_features_xml (target_desc *tdesc)
+{
+  /* Either .xmltarget or .features is not NULL.  */
+  gdb_assert (tdesc->xmltarget != NULL
+	      || (tdesc->features != NULL
+		  && tdesc->arch != NULL
+		  && tdesc->osabi != NULL));
+
+  if (tdesc->xmltarget == NULL)
+    {
+      std::string buffer ("@<?xml version=\"1.0\"?>");
+
+      buffer += "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">";
+      buffer += "<target>";
+      buffer += "<architecture>";
+      buffer += tdesc->arch;
+      buffer += "</architecture>";
+
+      buffer += "<osabi>";
+      buffer += tdesc->osabi;
+      buffer += "</osabi>";
+
+      char *xml;
+
+      for (int i = 0; VEC_iterate (char_ptr, tdesc->features, i, xml); i++)
+	{
+	  buffer += "<xi:include href=\"";
+	  buffer += xml;
+	  buffer += "\"/>";
+	}
+
+      buffer += "</target>";
+
+      tdesc->xmltarget = xstrdup (buffer.c_str ());
+    }
+
+  return tdesc->xmltarget;
+}
 #endif
 
 struct tdesc_type
@@ -69,8 +125,12 @@ struct tdesc_type
 /* See arch/tdesc.h.  */
 
 struct tdesc_feature *
-tdesc_create_feature (struct target_desc *tdesc, const char *name)
+tdesc_create_feature (struct target_desc *tdesc, const char *name,
+		      const char *xml)
 {
+#ifndef IN_PROCESS_AGENT
+  VEC_safe_push (char_ptr, tdesc->features, xstrdup (xml));
+#endif
   return tdesc;
 }
 
diff --git a/gdb/gdbserver/tdesc.h b/gdb/gdbserver/tdesc.h
index 49c82c6..fe3c78f 100644
--- a/gdb/gdbserver/tdesc.h
+++ b/gdb/gdbserver/tdesc.h
@@ -49,9 +49,21 @@ struct target_desc : tdesc_feature
   /* Defines what to return when looking for the "target.xml" file in
      response to qXfer:features:read.  Its contents can either be
      verbatim XML code (prefixed with a '@') or else the name of the
-     actual XML file to be used in place of "target.xml".  */
+     actual XML file to be used in place of "target.xml".
+
+     It can be NULL, then, its content is got from the following three
+     fields features, arch, and osabi in tdesc_get_features_xml.  */
   const char *xmltarget = NULL;
 
+  /* XML features in this target description.  */
+  VEC (char_ptr) *features = NULL;
+
+  /* The value of <architecture> element in the XML, replying GDB.  */
+  const char *arch = NULL;
+
+  /* The value of <osabi> element in the XML, replying GDB.  */
+  const char *osabi = NULL;
+
 public:
   target_desc ()
     : reg_defs (NULL), registers_size (0)
@@ -65,6 +77,15 @@ public:
     for (i = 0; VEC_iterate (tdesc_reg_p, reg_defs, i, reg); i++)
       xfree (reg);
     VEC_free (tdesc_reg_p, reg_defs);
+
+    xfree ((char *) arch);
+    xfree ((char *) osabi);
+
+    char *f;
+
+    for (i = 0; VEC_iterate (char_ptr, features, i, f); i++)
+      xfree (f);
+    VEC_free (char_ptr, features);
   }
 
   bool operator== (const target_desc &other) const
@@ -96,9 +117,6 @@ public:
     if (other.expedite_regs[i] != NULL)
       return false;
 
-    if (strcmp (xmltarget, other.xmltarget) != 0)
-      return false;
-
     return true;
   }
 
@@ -123,4 +141,12 @@ void init_target_desc (struct target_desc *tdesc);
 
 const struct target_desc *current_target_desc (void);
 
+#ifndef IN_PROCESS_AGENT
+void set_tdesc_architecture (struct target_desc *target_desc,
+			     const char *name);
+void set_tdesc_osabi (struct target_desc *target_desc, const char *name);
+
+const char *tdesc_get_features_xml (struct target_desc *tdesc);
+#endif
+
 #endif /* TDESC_H */
diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c
index 35bd761..3aeeeaf 100644
--- a/gdb/target-descriptions.c
+++ b/gdb/target-descriptions.c
@@ -1747,7 +1747,8 @@ tdesc_add_enum_value (struct tdesc_type *type, int value,
 /* See arch/tdesc.h.  */
 
 struct tdesc_feature *
-tdesc_create_feature (struct target_desc *tdesc, const char *name)
+tdesc_create_feature (struct target_desc *tdesc, const char *name,
+		      const char *xml)
 {
   struct tdesc_feature *new_feature = new tdesc_feature (name);
 
@@ -2199,8 +2200,10 @@ public:
 
     printf_unfiltered ("{\n");
     printf_unfiltered ("  struct tdesc_feature *feature;\n");
-    printf_unfiltered ("\n  feature = tdesc_create_feature (result, \"%s\");\n",
-		       e->name);
+
+    printf_unfiltered
+      ("\n  feature = tdesc_create_feature (result, \"%s\", \"%s\");\n",
+       e->name, lbasename (m_filename_after_features.c_str ()));
   }
 
   void visit_post (const tdesc_feature *e) override
-- 
1.9.1

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

* [PATCH 14/26] [GDBserver] unit test to i386_tdesc
  2017-07-10 13:56 [PATCH 00/26 v3] Make GDB builtin target descriptions more flexible Yao Qi
                   ` (11 preceding siblings ...)
  2017-07-10 13:56 ` [PATCH 16/26] Share i386-linux target description between GDB and GDBserver Yao Qi
@ 2017-07-10 13:56 ` Yao Qi
  2017-07-10 13:56 ` [PATCH 05/26] Use visitor pattern for "maint print c-tdesc" Yao Qi
                   ` (13 subsequent siblings)
  26 siblings, 0 replies; 30+ messages in thread
From: Yao Qi @ 2017-07-10 13:56 UTC (permalink / raw)
  To: gdb-patches

This patch adds a unit test in GDBserver to test dynamically created
target descriptions equal these pre-generated ones.

gdb/gdbserver:

2017-07-07  Yao Qi  <yao.qi@linaro.org>

	* linux-x86-tdesc.c: Include selftest.h.
	(i386_tdesc_test): New function.
	(initialize_low_tdesc): Call register_self_test.
	* tdesc.h: Include regdef.h.
	(target_desc): Override operator == and !=.

gdb:

2017-07-07  Yao Qi  <yao.qi@linaro.org>

	* regformats/regdef.h (struct reg): Override operator == and !=.
---
 gdb/gdbserver/linux-x86-tdesc.c | 37 ++++++++++++++++++++++++++++++++++++
 gdb/gdbserver/tdesc.h           | 42 ++++++++++++++++++++++++++++++++++++++++-
 gdb/regformats/regdef.h         | 12 ++++++++++++
 3 files changed, 90 insertions(+), 1 deletion(-)

diff --git a/gdb/gdbserver/linux-x86-tdesc.c b/gdb/gdbserver/linux-x86-tdesc.c
index 0d0be83..65ab0e3 100644
--- a/gdb/gdbserver/linux-x86-tdesc.c
+++ b/gdb/gdbserver/linux-x86-tdesc.c
@@ -63,6 +63,39 @@ extern const struct target_desc *tdesc_i386_mpx_linux;
 
 static struct target_desc *i386_tdescs[X86_TDESC_LAST] = { };
 
+#if defined GDB_SELF_TEST && !defined IN_PROCESS_AGENT
+#include "selftest.h"
+
+namespace selftests {
+namespace tdesc {
+static void
+i386_tdesc_test ()
+{
+  struct
+  {
+    unsigned int mask;
+    const target_desc *tdesc;
+  } tdesc_tests[] = {
+    { X86_XSTATE_X87, tdesc_i386_mmx_linux },
+    { X86_XSTATE_SSE_MASK, tdesc_i386_linux },
+    { X86_XSTATE_AVX_MASK, tdesc_i386_avx_linux },
+    { X86_XSTATE_MPX_MASK, tdesc_i386_mpx_linux },
+    { X86_XSTATE_AVX_MPX_MASK, tdesc_i386_avx_mpx_linux },
+    { X86_XSTATE_AVX_AVX512_MASK, tdesc_i386_avx_avx512_linux },
+    { X86_XSTATE_AVX_MPX_AVX512_PKU_MASK, tdesc_i386_avx_mpx_avx512_pku_linux }
+  };
+
+  for (auto &elem : tdesc_tests)
+    {
+      const target_desc *tdesc = i386_linux_read_description (elem.mask);
+
+      SELF_CHECK (*tdesc == *elem.tdesc);
+    }
+}
+}
+} // namespace selftests
+#endif /* GDB_SELF_TEST */
+
 void
 initialize_low_tdesc ()
 {
@@ -74,6 +107,10 @@ initialize_low_tdesc ()
   init_registers_i386_avx_mpx_linux ();
   init_registers_i386_avx_avx512_linux ();
   init_registers_i386_avx_mpx_avx512_pku_linux ();
+
+#if GDB_SELF_TEST && !defined IN_PROCESS_AGENT
+  register_self_test (selftests::tdesc::i386_tdesc_test);
+#endif
 #endif
 }
 
diff --git a/gdb/gdbserver/tdesc.h b/gdb/gdbserver/tdesc.h
index 50d0364..49c82c6 100644
--- a/gdb/gdbserver/tdesc.h
+++ b/gdb/gdbserver/tdesc.h
@@ -21,7 +21,7 @@
 
 #include "arch/tdesc.h"
 
-struct reg;
+#include "regdef.h"
 
 typedef struct reg *tdesc_reg_p;
 DEF_VEC_P(tdesc_reg_p);
@@ -66,6 +66,46 @@ public:
       xfree (reg);
     VEC_free (tdesc_reg_p, reg_defs);
   }
+
+  bool operator== (const target_desc &other) const
+  {
+    if (VEC_length (tdesc_reg_p, reg_defs)
+	!= VEC_length (tdesc_reg_p, other.reg_defs))
+      return false;
+
+    struct reg *reg;
+
+    for (int ix = 0;
+	 VEC_iterate (tdesc_reg_p, reg_defs, ix, reg);
+	 ix++)
+      {
+	struct reg *reg2
+	  = VEC_index (tdesc_reg_p, other.reg_defs, ix);
+
+	if (reg != reg2 && *reg != *reg2)
+	  return false;
+      }
+
+    /* Compare expedite_regs.  */
+    int i = 0;
+    for (; expedite_regs[i] != NULL; i++)
+      {
+	if (strcmp (expedite_regs[i], other.expedite_regs[i]) != 0)
+	  return false;
+      }
+    if (other.expedite_regs[i] != NULL)
+      return false;
+
+    if (strcmp (xmltarget, other.xmltarget) != 0)
+      return false;
+
+    return true;
+  }
+
+  bool operator!= (const target_desc &other) const
+  {
+    return !(*this == other);
+  }
 #endif
 };
 
diff --git a/gdb/regformats/regdef.h b/gdb/regformats/regdef.h
index de7a010..ff1d40b 100644
--- a/gdb/regformats/regdef.h
+++ b/gdb/regformats/regdef.h
@@ -34,6 +34,18 @@ struct reg
 
   /* The size (in bits) of the value of this register, as transmitted.  */
   int size;
+
+  bool operator== (const reg &other) const
+  {
+    return (strcmp (name, other.name) == 0
+	    && offset == other.offset
+	    && size == other.size);
+  }
+
+  bool operator!= (const reg &other) const
+  {
+    return !(*this == other);
+  }
 };
 
 #endif /* REGDEF_H */
-- 
1.9.1

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

* [PATCH 06/26] Generate c for feature instead of tdesc
  2017-07-10 13:56 [PATCH 00/26 v3] Make GDB builtin target descriptions more flexible Yao Qi
                   ` (16 preceding siblings ...)
  2017-07-10 13:56 ` [PATCH 08/26] Add "maint check xml-descriptions" to test builtin xml target descriptions Yao Qi
@ 2017-07-10 13:56 ` Yao Qi
  2017-07-10 13:56 ` [PATCH 25/26] [GDBserver] shorten srv_amd64_linux_xmlfiles Yao Qi
                   ` (8 subsequent siblings)
  26 siblings, 0 replies; 30+ messages in thread
From: Yao Qi @ 2017-07-10 13:56 UTC (permalink / raw)
  To: gdb-patches

This patch changes Makefile and command "maint print c-files" so
that GDB can print c files for features instead target description.
Previously, we feed GDB a target description xml file, which generate
c files including multiple features.

With this patch, in Makefile, we wrap each feature xml file, and
create a temp target description which include only one feature.
Then, adjust the target description printer for them, and print
a c function for each given feature, so that we can use these
c functions later to create target description in a flexible way.

v3:
 - Add comments,
 - Use startswith,
 - Rename CFILES with TDESC_CFILES,
 - Split the code adding an optional argument in "maint print c-files",

gdb:

2017-07-10  Yao Qi  <yao.qi@linaro.org>

	* features/Makefile (CFILES): Rename with TDESC_CFILES.
	(FEATURE_XMLFILES): New.
	(FEATURE_CFILES): New.
	New rules.
	(clean-cfiles): Remove generated c files.
	* features/i386/32bit-avx.c: Generated.
 	* features/i386/32bit-avx512.c: Generated.
 	* features/i386/32bit-core.c: Generated.
 	* features/i386/32bit-linux.c: Generated.
 	* features/i386/32bit-mpx.c: Generated.
 	* features/i386/32bit-pkeys.c: Generated.
 	* features/i386/32bit-sse.c: Generated.
 	* target-descriptions.c: Include algorithm.
	(tdesc_element_visitor): Add method visit_end.
	(print_c_tdesc): Implement visit_end.
	(print_c_tdesc:: m_filename_after_features): Move it to
	protected.
	(print_c_feature): New class.
	(maint_print_c_tdesc_cmd): Use print_c_feature if XML file
	name starts with "i386/32bit-".
---
 gdb/features/Makefile            |  37 ++++++++++++--
 gdb/features/i386/32bit-avx.c    |  21 ++++++++
 gdb/features/i386/32bit-avx512.c |  33 +++++++++++++
 gdb/features/i386/32bit-core.c   |  66 +++++++++++++++++++++++++
 gdb/features/i386/32bit-linux.c  |  14 ++++++
 gdb/features/i386/32bit-mpx.c    |  51 +++++++++++++++++++
 gdb/features/i386/32bit-pkeys.c  |  14 ++++++
 gdb/features/i386/32bit-sse.c    |  74 ++++++++++++++++++++++++++++
 gdb/target-descriptions.c        | 104 ++++++++++++++++++++++++++++++++++++---
 9 files changed, 402 insertions(+), 12 deletions(-)
 create mode 100644 gdb/features/i386/32bit-avx.c
 create mode 100644 gdb/features/i386/32bit-avx512.c
 create mode 100644 gdb/features/i386/32bit-core.c
 create mode 100644 gdb/features/i386/32bit-linux.c
 create mode 100644 gdb/features/i386/32bit-mpx.c
 create mode 100644 gdb/features/i386/32bit-pkeys.c
 create mode 100644 gdb/features/i386/32bit-sse.c

diff --git a/gdb/features/Makefile b/gdb/features/Makefile
index dd0f28a..db9a58e 100644
--- a/gdb/features/Makefile
+++ b/gdb/features/Makefile
@@ -235,7 +235,7 @@ XMLTOC = \
 	tic6x-c64xp-linux.xml \
 	tic6x-c64xp.xml
 
-CFILES = $(patsubst %.xml,%.c,$(XMLTOC))
+TDESC_CFILES = $(patsubst %.xml,%.c,$(XMLTOC))
 GDB = false
 
 all: $(OUTPUTS)
@@ -252,11 +252,40 @@ $(outdir)/%.dat: %.xml number-regs.xsl sort-regs.xsl gdbserver-regs.xsl
 	  $(XSLTPROC) gdbserver-regs.xsl - >> $(outdir)/$*.tmp
 	sh ../../move-if-change $(outdir)/$*.tmp $(outdir)/$*.dat
 
-cfiles: $(CFILES)
-%.c: %.xml
+FEATURE_XMLFILES = i386/32bit-core.xml \
+	i386/32bit-sse.xml \
+	i386/32bit-linux.xml \
+	i386/32bit-avx.xml \
+	i386/32bit-mpx.xml \
+	i386/32bit-avx512.xml \
+	i386/32bit-pkeys.xml
+
+FEATURE_CFILES = $(patsubst %.xml,%.c,$(FEATURE_XMLFILES))
+
+cfiles: $(TDESC_CFILES) $(FEATURE_CFILES)
+
+$(TDESC_CFILES): %.c: %.xml
 	$(GDB) -nx -q -batch -ex 'maint print c-tdesc $<' > $@.tmp
 	sh ../../move-if-change $@.tmp $@
 
+$(FEATURE_CFILES): %.c: %.xml.tmp
+	$(GDB) -nx -q -batch \
+	  -ex 'maint print c-tdesc $<' > $@.tmp
+	sh ../../move-if-change $@.tmp $@
+	rm $<
+
+# %.xml is the XML file for each target description feature, and
+# %.xml.tmp is the XML file target description which only includes
+# one target description feature.
+
+%.xml.tmp: %.xml
+	echo "<?xml version=\"1.0\"?>" > $@.tmp
+	echo "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">" >> $@.tmp
+	echo "<target>" >> $@.tmp
+	echo "  <xi:include href=\"$(notdir $<)\"/>" >> $@.tmp
+	echo "</target>" >> $@.tmp
+	sh ../../move-if-change $@.tmp $@
+
 # Other dependencies.
 $(outdir)/arm/arm-with-iwmmxt.dat: arm/arm-core.xml arm/xscale-iwmmxt.xml
 $(outdir)/i386/i386.dat: i386/32bit-core.xml i386/32bit-sse.xml
@@ -325,7 +354,7 @@ $(outdir)/i386/x32-avx-avx512-linux.dat: i386/x32-core.xml i386/64bit-avx.xml \
 # 'all' doesn't build the C files, so don't delete them in 'clean'
 # either.
 clean-cfiles:
-	rm -f $(CFILES)
+	rm -f $(TDESC_CFILES) $(FEATURE_CFILES)
 
 clean:
 	rm -f $(OUTPUTS)
diff --git a/gdb/features/i386/32bit-avx.c b/gdb/features/i386/32bit-avx.c
new file mode 100644
index 0000000..0e71515
--- /dev/null
+++ b/gdb/features/i386/32bit-avx.c
@@ -0,0 +1,21 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: 32bit-avx.xml */
+
+#include "target-descriptions.h"
+
+static int
+create_feature_i386_32bit_avx (struct target_desc *result, long regnum)
+{
+  struct tdesc_feature *feature;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx");
+  tdesc_create_reg (feature, "ymm0h", regnum++, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm1h", regnum++, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm2h", regnum++, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm3h", regnum++, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm4h", regnum++, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm5h", regnum++, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm6h", regnum++, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm7h", regnum++, 1, NULL, 128, "uint128");
+  return regnum;
+}
diff --git a/gdb/features/i386/32bit-avx512.c b/gdb/features/i386/32bit-avx512.c
new file mode 100644
index 0000000..034f557
--- /dev/null
+++ b/gdb/features/i386/32bit-avx512.c
@@ -0,0 +1,33 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: 32bit-avx512.xml */
+
+#include "target-descriptions.h"
+
+static int
+create_feature_i386_32bit_avx512 (struct target_desc *result, long regnum)
+{
+  struct tdesc_feature *feature;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx512");
+  struct tdesc_type *field_type;
+  field_type = tdesc_named_type (feature, "uint128");
+  tdesc_create_vector (feature, "v2ui128", field_type, 2);
+
+  tdesc_create_reg (feature, "k0", regnum++, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k1", regnum++, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k2", regnum++, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k3", regnum++, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k4", regnum++, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k5", regnum++, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k6", regnum++, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k7", regnum++, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "zmm0h", regnum++, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm1h", regnum++, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm2h", regnum++, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm3h", regnum++, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm4h", regnum++, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm5h", regnum++, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm6h", regnum++, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm7h", regnum++, 1, NULL, 256, "v2ui128");
+  return regnum;
+}
diff --git a/gdb/features/i386/32bit-core.c b/gdb/features/i386/32bit-core.c
new file mode 100644
index 0000000..b43de4d
--- /dev/null
+++ b/gdb/features/i386/32bit-core.c
@@ -0,0 +1,66 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: 32bit-core.xml */
+
+#include "target-descriptions.h"
+
+static int
+create_feature_i386_32bit_core (struct target_desc *result, long regnum)
+{
+  struct tdesc_feature *feature;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
+  type = tdesc_create_flags (feature, "i386_eflags", 4);
+  tdesc_add_flag (type, 0, "CF");
+  tdesc_add_flag (type, 1, "");
+  tdesc_add_flag (type, 2, "PF");
+  tdesc_add_flag (type, 4, "AF");
+  tdesc_add_flag (type, 6, "ZF");
+  tdesc_add_flag (type, 7, "SF");
+  tdesc_add_flag (type, 8, "TF");
+  tdesc_add_flag (type, 9, "IF");
+  tdesc_add_flag (type, 10, "DF");
+  tdesc_add_flag (type, 11, "OF");
+  tdesc_add_flag (type, 14, "NT");
+  tdesc_add_flag (type, 16, "RF");
+  tdesc_add_flag (type, 17, "VM");
+  tdesc_add_flag (type, 18, "AC");
+  tdesc_add_flag (type, 19, "VIF");
+  tdesc_add_flag (type, 20, "VIP");
+  tdesc_add_flag (type, 21, "ID");
+
+  tdesc_create_reg (feature, "eax", regnum++, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "ecx", regnum++, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "edx", regnum++, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "ebx", regnum++, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "esp", regnum++, 1, NULL, 32, "data_ptr");
+  tdesc_create_reg (feature, "ebp", regnum++, 1, NULL, 32, "data_ptr");
+  tdesc_create_reg (feature, "esi", regnum++, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "edi", regnum++, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "eip", regnum++, 1, NULL, 32, "code_ptr");
+  tdesc_create_reg (feature, "eflags", regnum++, 1, NULL, 32, "i386_eflags");
+  tdesc_create_reg (feature, "cs", regnum++, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "ss", regnum++, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "ds", regnum++, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "es", regnum++, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "fs", regnum++, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "gs", regnum++, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "st0", regnum++, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st1", regnum++, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st2", regnum++, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st3", regnum++, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st4", regnum++, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st5", regnum++, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st6", regnum++, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st7", regnum++, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "fctrl", regnum++, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "fstat", regnum++, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "ftag", regnum++, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "fiseg", regnum++, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "fioff", regnum++, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "foseg", regnum++, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "fooff", regnum++, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "fop", regnum++, 1, "float", 32, "int");
+  return regnum;
+}
diff --git a/gdb/features/i386/32bit-linux.c b/gdb/features/i386/32bit-linux.c
new file mode 100644
index 0000000..686a2f1
--- /dev/null
+++ b/gdb/features/i386/32bit-linux.c
@@ -0,0 +1,14 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: 32bit-linux.xml */
+
+#include "target-descriptions.h"
+
+static int
+create_feature_i386_32bit_linux (struct target_desc *result, long regnum)
+{
+  struct tdesc_feature *feature;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.linux");
+  tdesc_create_reg (feature, "orig_eax", regnum++, 1, NULL, 32, "int");
+  return regnum;
+}
diff --git a/gdb/features/i386/32bit-mpx.c b/gdb/features/i386/32bit-mpx.c
new file mode 100644
index 0000000..6ed3b2e
--- /dev/null
+++ b/gdb/features/i386/32bit-mpx.c
@@ -0,0 +1,51 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: 32bit-mpx.xml */
+
+#include "target-descriptions.h"
+
+static int
+create_feature_i386_32bit_mpx (struct target_desc *result, long regnum)
+{
+  struct tdesc_feature *feature;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.mpx");
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
+  type = tdesc_create_struct (feature, "br128");
+  field_type = tdesc_named_type (feature, "uint64");
+  tdesc_add_field (type, "lbound", field_type);
+  field_type = tdesc_named_type (feature, "uint64");
+  tdesc_add_field (type, "ubound_raw", field_type);
+
+  type = tdesc_create_struct (feature, "_bndstatus");
+  tdesc_set_struct_size (type, 8);
+  tdesc_add_bitfield (type, "bde", 2, 31);
+  tdesc_add_bitfield (type, "error", 0, 1);
+
+  type = tdesc_create_union (feature, "status");
+  field_type = tdesc_named_type (feature, "data_ptr");
+  tdesc_add_field (type, "raw", field_type);
+  field_type = tdesc_named_type (feature, "_bndstatus");
+  tdesc_add_field (type, "status", field_type);
+
+  type = tdesc_create_struct (feature, "_bndcfgu");
+  tdesc_set_struct_size (type, 8);
+  tdesc_add_bitfield (type, "base", 12, 31);
+  tdesc_add_bitfield (type, "reserved", 2, 11);
+  tdesc_add_bitfield (type, "preserved", 1, 1);
+  tdesc_add_bitfield (type, "enabled", 0, 0);
+
+  type = tdesc_create_union (feature, "cfgu");
+  field_type = tdesc_named_type (feature, "data_ptr");
+  tdesc_add_field (type, "raw", field_type);
+  field_type = tdesc_named_type (feature, "_bndcfgu");
+  tdesc_add_field (type, "config", field_type);
+
+  tdesc_create_reg (feature, "bnd0raw", regnum++, 1, NULL, 128, "br128");
+  tdesc_create_reg (feature, "bnd1raw", regnum++, 1, NULL, 128, "br128");
+  tdesc_create_reg (feature, "bnd2raw", regnum++, 1, NULL, 128, "br128");
+  tdesc_create_reg (feature, "bnd3raw", regnum++, 1, NULL, 128, "br128");
+  tdesc_create_reg (feature, "bndcfgu", regnum++, 1, NULL, 64, "cfgu");
+  tdesc_create_reg (feature, "bndstatus", regnum++, 1, NULL, 64, "status");
+  return regnum;
+}
diff --git a/gdb/features/i386/32bit-pkeys.c b/gdb/features/i386/32bit-pkeys.c
new file mode 100644
index 0000000..24a40aa
--- /dev/null
+++ b/gdb/features/i386/32bit-pkeys.c
@@ -0,0 +1,14 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: 32bit-pkeys.xml */
+
+#include "target-descriptions.h"
+
+static int
+create_feature_i386_32bit_pkeys (struct target_desc *result, long regnum)
+{
+  struct tdesc_feature *feature;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.pkeys");
+  tdesc_create_reg (feature, "pkru", regnum++, 1, NULL, 32, "uint32");
+  return regnum;
+}
diff --git a/gdb/features/i386/32bit-sse.c b/gdb/features/i386/32bit-sse.c
new file mode 100644
index 0000000..032623e
--- /dev/null
+++ b/gdb/features/i386/32bit-sse.c
@@ -0,0 +1,74 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: 32bit-sse.xml */
+
+#include "target-descriptions.h"
+
+static int
+create_feature_i386_32bit_sse (struct target_desc *result, long regnum)
+{
+  struct tdesc_feature *feature;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.sse");
+  struct tdesc_type *field_type;
+  field_type = tdesc_named_type (feature, "ieee_single");
+  tdesc_create_vector (feature, "v4f", field_type, 4);
+
+  field_type = tdesc_named_type (feature, "ieee_double");
+  tdesc_create_vector (feature, "v2d", field_type, 2);
+
+  field_type = tdesc_named_type (feature, "int8");
+  tdesc_create_vector (feature, "v16i8", field_type, 16);
+
+  field_type = tdesc_named_type (feature, "int16");
+  tdesc_create_vector (feature, "v8i16", field_type, 8);
+
+  field_type = tdesc_named_type (feature, "int32");
+  tdesc_create_vector (feature, "v4i32", field_type, 4);
+
+  field_type = tdesc_named_type (feature, "int64");
+  tdesc_create_vector (feature, "v2i64", field_type, 2);
+
+  struct tdesc_type *type;
+  type = tdesc_create_union (feature, "vec128");
+  field_type = tdesc_named_type (feature, "v4f");
+  tdesc_add_field (type, "v4_float", field_type);
+  field_type = tdesc_named_type (feature, "v2d");
+  tdesc_add_field (type, "v2_double", field_type);
+  field_type = tdesc_named_type (feature, "v16i8");
+  tdesc_add_field (type, "v16_int8", field_type);
+  field_type = tdesc_named_type (feature, "v8i16");
+  tdesc_add_field (type, "v8_int16", field_type);
+  field_type = tdesc_named_type (feature, "v4i32");
+  tdesc_add_field (type, "v4_int32", field_type);
+  field_type = tdesc_named_type (feature, "v2i64");
+  tdesc_add_field (type, "v2_int64", field_type);
+  field_type = tdesc_named_type (feature, "uint128");
+  tdesc_add_field (type, "uint128", field_type);
+
+  type = tdesc_create_flags (feature, "i386_mxcsr", 4);
+  tdesc_add_flag (type, 0, "IE");
+  tdesc_add_flag (type, 1, "DE");
+  tdesc_add_flag (type, 2, "ZE");
+  tdesc_add_flag (type, 3, "OE");
+  tdesc_add_flag (type, 4, "UE");
+  tdesc_add_flag (type, 5, "PE");
+  tdesc_add_flag (type, 6, "DAZ");
+  tdesc_add_flag (type, 7, "IM");
+  tdesc_add_flag (type, 8, "DM");
+  tdesc_add_flag (type, 9, "ZM");
+  tdesc_add_flag (type, 10, "OM");
+  tdesc_add_flag (type, 11, "UM");
+  tdesc_add_flag (type, 12, "PM");
+  tdesc_add_flag (type, 15, "FZ");
+
+  tdesc_create_reg (feature, "xmm0", regnum++, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm1", regnum++, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm2", regnum++, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm3", regnum++, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm4", regnum++, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm5", regnum++, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm6", regnum++, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm7", regnum++, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "mxcsr", regnum++, 1, "vector", 32, "i386_mxcsr");
+  return regnum;
+}
diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c
index f2194f4..518f2dc 100644
--- a/gdb/target-descriptions.c
+++ b/gdb/target-descriptions.c
@@ -34,6 +34,7 @@
 #include "gdb_obstack.h"
 #include "hashtab.h"
 #include "inferior.h"
+#include <algorithm>
 
 /* The interface to visit different elements of target description.  */
 
@@ -43,7 +44,9 @@ public:
   virtual void visit_pre (const target_desc *e) = 0;
   virtual void visit_post (const target_desc *e) = 0;
 
-  virtual void visit (const tdesc_feature *e) = 0;
+  virtual void visit_pre (const tdesc_feature *e) = 0;
+  virtual void visit_post (const tdesc_feature *e) = 0;
+
   virtual void visit (const tdesc_type *e) = 0;
   virtual void visit (const tdesc_reg *e) = 0;
 };
@@ -290,7 +293,7 @@ typedef struct tdesc_feature : tdesc_element
 
   void accept (tdesc_element_visitor &v) const override
   {
-    v.visit (this);
+    v.visit_pre (this);
 
     struct tdesc_type *type;
 
@@ -306,8 +309,9 @@ typedef struct tdesc_feature : tdesc_element
 	 ix++)
       reg->accept (v);
 
-  }
 
+    v.visit_post (this);
+  }
 } *tdesc_feature_p;
 DEF_VEC_P(tdesc_feature_p);
 
@@ -1803,7 +1807,6 @@ public:
     printf_unfiltered ("/* THIS FILE IS GENERATED.  "
 		       "-*- buffer-read-only: t -*- vi"
 		       ":set ro:\n");
-    printf_unfiltered ("  Original: %s */\n\n", filename);
   }
 
   ~print_c_tdesc ()
@@ -1813,6 +1816,9 @@ public:
 
   void visit_pre (const target_desc *e) override
   {
+    printf_unfiltered ("  Original: %s */\n\n",
+		       lbasename (m_filename_after_features.c_str ()));
+
     printf_unfiltered ("#include \"defs.h\"\n");
     printf_unfiltered ("#include \"osabi.h\"\n");
     printf_unfiltered ("#include \"target-descriptions.h\"\n");
@@ -1865,12 +1871,15 @@ public:
     printf_unfiltered ("  struct tdesc_feature *feature;\n");
   }
 
-  void visit (const tdesc_feature *e) override
+  void visit_pre (const tdesc_feature *e) override
   {
     printf_unfiltered ("\n  feature = tdesc_create_feature (result, \"%s\");\n",
 		       e->name);
   }
 
+  void visit_post (const tdesc_feature *e) override
+  {}
+
   void visit_post (const target_desc *e) override
   {
     printf_unfiltered ("\n  tdesc_%s = result;\n", m_function);
@@ -2029,13 +2038,80 @@ public:
     printf_unfiltered ("%d, \"%s\");\n", reg->bitsize, reg->type);
   }
 
+protected:
+  std::string m_filename_after_features;
+
 private:
   char *m_function;
-  std::string m_filename_after_features;
   bool m_printed_field_type = false;
   bool m_printed_type = false;
 };
 
+/* Print target description feature in C.  */
+
+class print_c_feature : public print_c_tdesc
+{
+public:
+  print_c_feature (std::string &file)
+    : print_c_tdesc (file)
+  {
+    /* Trim ".tmp".  */
+    auto const pos = m_filename_after_features.find_last_of ('.');
+
+    m_filename_after_features = m_filename_after_features.substr (0, pos);
+  }
+
+  void visit_pre (const target_desc *e) override
+  {
+    printf_unfiltered ("  Original: %s */\n\n",
+		       lbasename (m_filename_after_features.c_str ()));
+
+    printf_unfiltered ("#include \"target-descriptions.h\"\n");
+    printf_unfiltered ("\n");
+  }
+
+  void visit_post (const target_desc *e) override
+  {}
+
+  void visit_pre (const tdesc_feature *e) override
+  {
+    std::string name (m_filename_after_features);
+
+    auto pos = name.find_first_of ('.');
+
+    name = name.substr (0, pos);
+    std::replace (name.begin (), name.end (), '/', '_');
+    std::replace (name.begin (), name.end (), '-', '_');
+
+    printf_unfiltered ("static int\n");
+    printf_unfiltered ("create_feature_%s ", name.c_str ());
+    printf_unfiltered ("(struct target_desc *result, long regnum)\n");
+
+    printf_unfiltered ("{\n");
+    printf_unfiltered ("  struct tdesc_feature *feature;\n");
+    printf_unfiltered ("\n  feature = tdesc_create_feature (result, \"%s\");\n",
+		       e->name);
+  }
+
+  void visit_post (const tdesc_feature *e) override
+  {
+    printf_unfiltered ("  return regnum;\n");
+    printf_unfiltered ("}\n");
+  }
+
+  void visit (const tdesc_reg *reg) override
+  {
+    printf_unfiltered ("  tdesc_create_reg (feature, \"%s\", regnum++, %d, ",
+		       reg->name, reg->save_restore);
+    if (reg->group)
+      printf_unfiltered ("\"%s\", ", reg->group);
+    else
+      printf_unfiltered ("NULL, ");
+    printf_unfiltered ("%d, \"%s\");\n", reg->bitsize, reg->type);
+  }
+
+};
+
 static void
 maint_print_c_tdesc_cmd (char *args, int from_tty)
 {
@@ -2070,9 +2146,21 @@ maint_print_c_tdesc_cmd (char *args, int from_tty)
   if (loc != std::string::npos)
     filename_after_features = filename_after_features.substr (loc + 10);
 
-  print_c_tdesc v (filename_after_features);
+  /* Print c files for target features instead of target descriptions,
+     because c files got from target features are more flexible than the
+     counterparts.  */
+  if (startswith (filename_after_features.c_str (), "i386/32bit-"))
+    {
+      print_c_feature v (filename_after_features);
 
-  tdesc->accept (v);
+      tdesc->accept (v);
+    }
+  else
+    {
+      print_c_tdesc v (filename_after_features);
+
+      tdesc->accept (v);
+    }
 }
 
 /* Provide a prototype to silence -Wmissing-prototypes.  */
-- 
1.9.1

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

* [PATCH 23/26] Convert amd64-linux target descriptions
  2017-07-10 13:56 [PATCH 00/26 v3] Make GDB builtin target descriptions more flexible Yao Qi
                   ` (6 preceding siblings ...)
  2017-07-10 13:56 ` [PATCH 11/26] Return X86_TDESC_MMX in x86_get_ipa_tdesc_idx Yao Qi
@ 2017-07-10 13:56 ` Yao Qi
  2017-07-10 13:56 ` [PATCH 24/26] [GDBserver] Use pre-generated amd64-linux tdesc as test Yao Qi
                   ` (18 subsequent siblings)
  26 siblings, 0 replies; 30+ messages in thread
From: Yao Qi @ 2017-07-10 13:56 UTC (permalink / raw)
  To: gdb-patches

This patch changes amd64-linux target descriptions so that they can be
dynamically generated in both GDB and GDBserver.

gdb/gdbserver:

2017-06-09  Yao Qi  <yao.qi@linaro.org>

	* Makefile.in (arch-amd64.o): New rule.
	* configure.srv: Append arch-amd64.o.
	* linux-amd64-ipa.c: Include common/x86-xstate.h.
	(get_ipa_tdesc): Call amd64_linux_read_description.
	(initialize_low_tracepoint): Don't call init_registers_x32_XXX
	and init_registers_amd64_XXX.
	* linux-x86-low.c (x86_linux_read_description): Call
	amd64_linux_read_description.
	(x86_get_ipa_tdesc_idx): Call amd64_get_ipa_tdesc_idx.
	(initialize_low_arch): Don't call init_registers_x32_XXX and
	init_registers_amd64_XXX.
	* linux-x86-tdesc-selftest.c: Declare init_registers_amd64_XXX
	and tdesc_amd64_XXX.
	[__x86_64__] (amd64_tdesc_test): New function.
	(initialize_low_tdesc) [__x86_64__]: Call init_registers_x32_XXX
	and init_registers_amd64_XXX.
	* linux-x86-tdesc.c: Include arch/amd64.h.
	(xcr0_to_tdesc_idx): New function.
	(i386_linux_read_description): New function.
	(amd64_get_ipa_tdesc_idx): New function.
	* linux-x86-tdesc.h (amd64_get_ipa_tdesc_idx): Declare.
	(amd64_get_ipa_tdesc): Declare.

gdb:

2017-07-03  Yao Qi  <yao.qi@linaro.org>

	* amd64-linux-tdep.c: Include arch/amd64.h.  Don't include
	features/i386/*.c.
	(amd64_linux_read_description): Call
	amd64_create_target_description.
	* arch/amd64.c: New file.
	* arch/amd64.h: New file.
	* configure.tgt (x86_64-*-linux*): Append amd64.o.
	* Makefile.in (ALL_64_TARGET_OBS): Append amd64.o.
---
 gdb/Makefile.in                          |   1 +
 gdb/amd64-linux-tdep.c                   |  44 +----------
 gdb/arch/amd64.c                         |  71 ++++++++++++++++++
 gdb/arch/amd64.h                         |  21 ++++++
 gdb/configure.tgt                        |   2 +-
 gdb/gdbserver/Makefile.in                |   4 +
 gdb/gdbserver/configure.srv              |   3 +-
 gdb/gdbserver/linux-amd64-ipa.c          |  55 ++++++--------
 gdb/gdbserver/linux-x86-low.c            |  86 +++-------------------
 gdb/gdbserver/linux-x86-tdesc-selftest.c |  90 +++++++++++++++++++++++
 gdb/gdbserver/linux-x86-tdesc.c          | 122 ++++++++++++++++++++++++++-----
 gdb/gdbserver/linux-x86-tdesc.h          |  49 ++-----------
 12 files changed, 339 insertions(+), 209 deletions(-)
 create mode 100644 gdb/arch/amd64.c
 create mode 100644 gdb/arch/amd64.h

diff --git a/gdb/Makefile.in b/gdb/Makefile.in
index c9af3f6..0bb383a 100644
--- a/gdb/Makefile.in
+++ b/gdb/Makefile.in
@@ -761,6 +761,7 @@ ALL_64_TARGET_OBS = \
 	alpha-nbsd-tdep.o \
 	alpha-obsd-tdep.o \
 	alpha-tdep.o \
+	amd64.o \
 	amd64-darwin-tdep.o \
 	amd64-dicos-tdep.o \
 	amd64-fbsd-tdep.o \
diff --git a/gdb/amd64-linux-tdep.c b/gdb/amd64-linux-tdep.c
index 903c88b..2ce6ca7 100644
--- a/gdb/amd64-linux-tdep.c
+++ b/gdb/amd64-linux-tdep.c
@@ -39,19 +39,9 @@
 #include "solib-svr4.h"
 #include "xml-syscall.h"
 #include "glibc-tdep.h"
+#include "arch/amd64.h"
 #include "target-descriptions.h"
 
-#include "features/i386/64bit-avx.c"
-#include "features/i386/64bit-avx512.c"
-#include "features/i386/64bit-core.c"
-#include "features/i386/64bit-linux.c"
-#include "features/i386/64bit-mpx.c"
-#include "features/i386/64bit-pkeys.c"
-#include "features/i386/64bit-segments.c"
-#include "features/i386/64bit-sse.c"
-
-#include "features/i386/x32-core.c"
-
 /* The syscall's XML filename for i386.  */
 #define XML_SYSCALL_FILENAME_AMD64 "syscalls/amd64-linux.xml"
 
@@ -1599,37 +1589,7 @@ amd64_linux_read_description (uint64_t xcr0_features_bit, bool is_x32)
     }
 
   if (*tdesc == NULL)
-    {
-      *tdesc = allocate_target_description ();
-
-      set_tdesc_architecture (*tdesc,
-			      is_x32 ? "i386:x64-32" : "i386:x86-64");
-
-      set_tdesc_osabi (*tdesc, osabi_from_tdesc_string ("GNU/Linux"));
-
-      long regnum = 0;
-
-      if (is_x32)
-	regnum = create_feature_i386_x32_core (*tdesc, regnum);
-      else
-	regnum = create_feature_i386_64bit_core (*tdesc, regnum);
-
-      regnum = create_feature_i386_64bit_sse (*tdesc, regnum);
-      regnum = create_feature_i386_64bit_linux (*tdesc, regnum);
-      regnum = create_feature_i386_64bit_segments (*tdesc, regnum);
-
-      if (xcr0_features_bit & X86_XSTATE_AVX)
-	regnum = create_feature_i386_64bit_avx (*tdesc, regnum);
-
-      if ((xcr0_features_bit & X86_XSTATE_MPX) && !is_x32)
-	regnum = create_feature_i386_64bit_mpx (*tdesc, regnum);
-
-      if (xcr0_features_bit & X86_XSTATE_AVX512)
-	regnum = create_feature_i386_64bit_avx512 (*tdesc, regnum);
-
-      if ((xcr0_features_bit & X86_XSTATE_PKRU) && !is_x32)
-	regnum = create_feature_i386_64bit_pkeys (*tdesc, regnum);
-    }
+    *tdesc = amd64_create_target_description (xcr0_features_bit, is_x32);
 
   return *tdesc;
 }
diff --git a/gdb/arch/amd64.c b/gdb/arch/amd64.c
new file mode 100644
index 0000000..626733d
--- /dev/null
+++ b/gdb/arch/amd64.c
@@ -0,0 +1,71 @@
+/* Copyright (C) 2017 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "amd64.h"
+#include "x86-xstate.h"
+#include <stdlib.h>
+
+#include "../features/i386/64bit-avx.c"
+#include "../features/i386/64bit-avx512.c"
+#include "../features/i386/64bit-core.c"
+#include "../features/i386/64bit-linux.c"
+#include "../features/i386/64bit-mpx.c"
+#include "../features/i386/64bit-pkeys.c"
+#include "../features/i386/64bit-segments.c"
+#include "../features/i386/64bit-sse.c"
+
+#include "../features/i386/x32-core.c"
+
+/* Create amd64 target descriptions according to XCR0.  If IS_X32 is
+   true, create the x32 ones.  */
+
+target_desc *
+amd64_create_target_description (uint64_t xcr0, bool is_x32)
+{
+  target_desc *tdesc = allocate_target_description ();
+
+#ifndef IN_PROCESS_AGENT
+  set_tdesc_architecture (tdesc, is_x32 ? "i386:x64-32" : "i386:x86-64");
+
+  set_tdesc_osabi (tdesc, "GNU/Linux");
+#endif
+
+  long regnum = 0;
+
+  if (is_x32)
+    regnum = create_feature_i386_x32_core (tdesc, regnum);
+  else
+    regnum = create_feature_i386_64bit_core (tdesc, regnum);
+
+  regnum = create_feature_i386_64bit_sse (tdesc, regnum);
+  regnum = create_feature_i386_64bit_linux (tdesc, regnum);
+  regnum = create_feature_i386_64bit_segments (tdesc, regnum);
+
+  if (xcr0 & X86_XSTATE_AVX)
+    regnum = create_feature_i386_64bit_avx (tdesc, regnum);
+
+  if ((xcr0 & X86_XSTATE_MPX) && !is_x32)
+    regnum = create_feature_i386_64bit_mpx (tdesc, regnum);
+
+  if (xcr0 & X86_XSTATE_AVX512)
+    regnum = create_feature_i386_64bit_avx512 (tdesc, regnum);
+
+  if ((xcr0 & X86_XSTATE_PKRU) && !is_x32)
+    regnum = create_feature_i386_64bit_pkeys (tdesc, regnum);
+
+  return tdesc;
+}
diff --git a/gdb/arch/amd64.h b/gdb/arch/amd64.h
new file mode 100644
index 0000000..0821a7c
--- /dev/null
+++ b/gdb/arch/amd64.h
@@ -0,0 +1,21 @@
+/* Copyright (C) 2017 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "tdesc.h"
+#include <stdint.h>
+
+target_desc *amd64_create_target_description (uint64_t xcr0, bool is_x32);
diff --git a/gdb/configure.tgt b/gdb/configure.tgt
index 1f263515..402d6ba 100644
--- a/gdb/configure.tgt
+++ b/gdb/configure.tgt
@@ -678,7 +678,7 @@ x86_64-*-elf*)
 	;;
 x86_64-*-linux*)
 	# Target: GNU/Linux x86-64
-	gdb_target_obs="amd64-tdep.o amd64-linux-tdep.o i386-tdep.o \
+	gdb_target_obs="amd64-tdep.o amd64-linux-tdep.o amd64.o i386-tdep.o \
 			i387-tdep.o i386.o i386-linux-tdep.o glibc-tdep.o \
 			solib-svr4.o symfile-mem.o linux-tdep.o linux-record.o"
 	build_gdbserver=yes
diff --git a/gdb/gdbserver/Makefile.in b/gdb/gdbserver/Makefile.in
index 5f9b2fe..5cc4220 100644
--- a/gdb/gdbserver/Makefile.in
+++ b/gdb/gdbserver/Makefile.in
@@ -532,6 +532,10 @@ arch-i386.o: ../arch/i386.c
 	$(COMPILE) $<
 	$(POSTCOMPILE)
 
+arch-amd64.o: ../arch/amd64.c
+	$(COMPILE) $<
+	$(POSTCOMPILE)
+
 # Rules for objects that go in the in-process agent.
 
 %-ipa.o: %-generated.c
diff --git a/gdb/gdbserver/configure.srv b/gdb/gdbserver/configure.srv
index 55985d6..05cc99e 100644
--- a/gdb/gdbserver/configure.srv
+++ b/gdb/gdbserver/configure.srv
@@ -364,7 +364,7 @@ case "${target}" in
 			;;
   x86_64-*-linux*)	srv_regobj="$srv_amd64_linux_regobj $srv_i386_linux_regobj"
 			srv_tgtobj="$srv_linux_obj linux-x86-low.o x86-low.o x86-dregs.o i387-fp.o"
-			srv_tgtobj="${srv_tgtobj} arch-i386.o"
+			srv_tgtobj="${srv_tgtobj} arch-i386.o arch-amd64.o"
 			srv_tgtobj="${srv_tgtobj} linux-x86-tdesc.o"
 			srv_tgtobj="${srv_tgtobj} linux-btrace.o x86-linux.o"
 			srv_tgtobj="${srv_tgtobj} x86-linux-dregs.o"
@@ -380,6 +380,7 @@ case "${target}" in
 			    ipa_obj="${ipa_amd64_linux_regobj}"
 			fi
 			ipa_obj="${ipa_obj} linux-amd64-ipa.o linux-x86-tdesc-ipa.o"
+			ipa_obj="${ipa_obj} amd64-ipa.o"
 			;;
   x86_64-*-mingw*)	srv_regobj="$srv_amd64_regobj"
 			srv_tgtobj="x86-low.o x86-dregs.o i387-fp.o win32-low.o win32-i386-low.o"
diff --git a/gdb/gdbserver/linux-amd64-ipa.c b/gdb/gdbserver/linux-amd64-ipa.c
index 67f36c2..1d56093 100644
--- a/gdb/gdbserver/linux-amd64-ipa.c
+++ b/gdb/gdbserver/linux-amd64-ipa.c
@@ -22,6 +22,7 @@
 #include <sys/mman.h>
 #include "tracepoint.h"
 #include "linux-x86-tdesc.h"
+#include "common/x86-xstate.h"
 
 /* Defined in auto-generated file amd64-linux.c.  */
 void init_registers_amd64_linux (void);
@@ -174,38 +175,38 @@ supply_static_tracepoint_registers (struct regcache *regcache,
 const struct target_desc *
 get_ipa_tdesc (int idx)
 {
+  if (idx >= X86_TDESC_LAST)
+    {
+      internal_error (__FILE__, __LINE__,
+		      "unknown ipa tdesc index: %d", idx);
+    }
+
 #if defined __ILP32__
   switch (idx)
     {
     case X86_TDESC_SSE:
-      return tdesc_x32_linux;
+      return amd64_linux_read_description (X86_XSTATE_SSE_MASK, true);
     case X86_TDESC_AVX:
       return tdesc_x32_avx_linux;
+      return amd64_linux_read_description (X86_XSTATE_AVX_MASK, true);
     case X86_TDESC_AVX512:
-      return tdesc_x32_avx512_linux;
+      return amd64_linux_read_description (X86_XSTATE_AVX512_MASK, true);
     default:
       break;
     }
 #else
-  switch (idx)
-    {
-    case X86_TDESC_SSE:
-      return tdesc_amd64_linux;
-    case X86_TDESC_AVX:
-      return tdesc_amd64_avx_linux;
-    case X86_TDESC_MPX:
-      return tdesc_amd64_mpx_linux;
-    case X86_TDESC_AVX_MPX:
-      return tdesc_amd64_avx_mpx_linux;
-    case X86_TDESC_AVX_MPX_AVX512_PKU:
-      return tdesc_amd64_avx_mpx_avx512_pku_linux;
-    case X86_TDESC_AVX_AVX512:
-      return tdesc_amd64_avx_avx512_linux;
-    default:
-      internal_error (__FILE__, __LINE__,
-		      "unknown ipa tdesc index: %d", idx);
-      return tdesc_amd64_linux;
-    }
+  /* Map the tdesc index to xcr0 mask.  */
+  uint64_t idx2mask[X86_TDESC_LAST] = {
+    X86_XSTATE_X87_MASK,
+    X86_XSTATE_SSE_MASK,
+    X86_XSTATE_AVX_MASK,
+    X86_XSTATE_MPX_MASK,
+    X86_XSTATE_AVX_MPX_MASK,
+    X86_XSTATE_AVX_AVX512_MASK,
+    X86_XSTATE_AVX_MPX_AVX512_PKU_MASK,
+  };
+
+  return amd64_linux_read_description (idx2mask[idx], false);
 #endif
 
   internal_error (__FILE__, __LINE__,
@@ -276,16 +277,4 @@ alloc_jump_pad_buffer (size_t size)
 void
 initialize_low_tracepoint (void)
 {
-#if defined __ILP32__
-  init_registers_x32_linux ();
-  init_registers_x32_avx_linux ();
-  init_registers_x32_avx512_linux ();
-#else
-  init_registers_amd64_linux ();
-  init_registers_amd64_avx_linux ();
-  init_registers_amd64_mpx_linux ();
-  init_registers_amd64_avx_mpx_linux ();
-  init_registers_amd64_avx_avx512_linux ();
-  init_registers_amd64_avx_mpx_avx512_pku_linux ();
-#endif
 }
diff --git a/gdb/gdbserver/linux-x86-low.c b/gdb/gdbserver/linux-x86-low.c
index 54be82f..f09871a 100644
--- a/gdb/gdbserver/linux-x86-low.c
+++ b/gdb/gdbserver/linux-x86-low.c
@@ -817,58 +817,17 @@ x86_linux_read_description (void)
   if (machine == EM_X86_64)
     {
 #ifdef __x86_64__
-      if (is_elf64)
-	{
-	  if (xcr0_features)
-	    {
-	      switch (xcr0 & X86_XSTATE_ALL_MASK)
-	        {
-		case X86_XSTATE_AVX_MPX_AVX512_PKU_MASK:
-		  return tdesc_amd64_avx_mpx_avx512_pku_linux;
-
-		case X86_XSTATE_AVX_AVX512_MASK:
-		  return tdesc_amd64_avx_avx512_linux;
-
-		case X86_XSTATE_AVX_MPX_MASK:
-		  return tdesc_amd64_avx_mpx_linux;
-
-		case X86_XSTATE_MPX_MASK:
-		  return tdesc_amd64_mpx_linux;
-
-		case X86_XSTATE_AVX_MASK:
-		  return tdesc_amd64_avx_linux;
+      const target_desc *tdesc = NULL;
 
-		default:
-		  return tdesc_amd64_linux;
-		}
-	    }
-	  else
-	    return tdesc_amd64_linux;
-	}
-      else
+      if (xcr0_features)
 	{
-	  if (xcr0_features)
-	    {
-	      switch (xcr0 & X86_XSTATE_ALL_MASK)
-	        {
-		case X86_XSTATE_AVX_MPX_AVX512_PKU_MASK:
-		  /* No x32 MPX and PKU, fall back to avx_avx512.  */
-		  return tdesc_x32_avx_avx512_linux;
-
-		case X86_XSTATE_AVX_AVX512_MASK:
-		  return tdesc_x32_avx_avx512_linux;
-
-		case X86_XSTATE_MPX_MASK: /* No MPX on x32.  */
-		case X86_XSTATE_AVX_MASK:
-		  return tdesc_x32_avx_linux;
-
-		default:
-		  return tdesc_x32_linux;
-		}
-	    }
-	  else
-	    return tdesc_x32_linux;
+	  tdesc = amd64_linux_read_description (xcr0 & X86_XSTATE_ALL_MASK,
+						!is_elf64);
 	}
+
+      if (tdesc == NULL)
+	tdesc = amd64_linux_read_description (X86_XSTATE_SSE_MASK, !is_elf64);
+      return tdesc;
 #endif
     }
   else
@@ -2881,19 +2840,7 @@ x86_get_ipa_tdesc_idx (void)
   const struct target_desc *tdesc = regcache->tdesc;
 
 #ifdef __x86_64__
-  if (tdesc == tdesc_amd64_linux || tdesc == tdesc_amd64_linux_no_xml
-      || tdesc == tdesc_x32_linux)
-    return X86_TDESC_SSE;
-  if (tdesc == tdesc_amd64_avx_linux || tdesc == tdesc_x32_avx_linux)
-    return X86_TDESC_AVX;
-  if (tdesc == tdesc_amd64_mpx_linux)
-    return X86_TDESC_MPX;
-  if (tdesc == tdesc_amd64_avx_mpx_linux)
-    return X86_TDESC_AVX_MPX;
-  if (tdesc == tdesc_amd64_avx_mpx_avx512_pku_linux || tdesc == tdesc_x32_avx_avx512_linux)
-    return X86_TDESC_AVX_MPX_AVX512_PKU;
-  if (tdesc == tdesc_amd64_avx_avx512_linux)
-    return X86_TDESC_AVX_AVX512;
+  return amd64_get_ipa_tdesc_idx (tdesc);
 #endif
 
   if (tdesc == tdesc_i386_linux_no_xml)
@@ -2953,19 +2900,10 @@ initialize_low_arch (void)
 {
   /* Initialize the Linux target descriptions.  */
 #ifdef __x86_64__
-  init_registers_amd64_linux ();
-  init_registers_amd64_avx_linux ();
-  init_registers_amd64_mpx_linux ();
-  init_registers_amd64_avx_mpx_linux ();
-  init_registers_amd64_avx_avx512_linux ();
-  init_registers_amd64_avx_mpx_avx512_pku_linux ();
-
-  init_registers_x32_linux ();
-  init_registers_x32_avx_linux ();
-  init_registers_x32_avx_avx512_linux ();
-
   tdesc_amd64_linux_no_xml = XNEW (struct target_desc);
-  copy_target_description (tdesc_amd64_linux_no_xml, tdesc_amd64_linux);
+  copy_target_description (tdesc_amd64_linux_no_xml,
+			   amd64_linux_read_description (X86_XSTATE_SSE_MASK,
+							 false));
   tdesc_amd64_linux_no_xml->xmltarget = xmltarget_amd64_linux_no_xml;
 #endif
 
diff --git a/gdb/gdbserver/linux-x86-tdesc-selftest.c b/gdb/gdbserver/linux-x86-tdesc-selftest.c
index dfb566b..6859834 100644
--- a/gdb/gdbserver/linux-x86-tdesc-selftest.c
+++ b/gdb/gdbserver/linux-x86-tdesc-selftest.c
@@ -49,6 +49,46 @@ extern const struct target_desc *tdesc_i386_avx_mpx_avx512_pku_linux;
 void init_registers_i386_mpx_linux (void);
 extern const struct target_desc *tdesc_i386_mpx_linux;
 
+#ifdef __x86_64__
+
+/* Defined in auto-generated file amd64-linux.c.  */
+void init_registers_amd64_linux (void);
+extern const struct target_desc *tdesc_amd64_linux;
+
+/* Defined in auto-generated file amd64-avx-linux.c.  */
+void init_registers_amd64_avx_linux (void);
+extern const struct target_desc *tdesc_amd64_avx_linux;
+
+/* Defined in auto-generated file amd64-avx-avx512-linux.c.  */
+void init_registers_amd64_avx_avx512_linux (void);
+extern const struct target_desc *tdesc_amd64_avx_avx512_linux;
+
+/* Defined in auto-generated file amd64-avx-mpx-avx512-pku-linux.c.  */
+void init_registers_amd64_avx_mpx_avx512_pku_linux (void);
+extern const struct target_desc *tdesc_amd64_avx_mpx_avx512_pku_linux;
+
+/* Defined in auto-generated file amd64-avx-mpx-linux.c.  */
+void init_registers_amd64_avx_mpx_linux (void);
+extern const struct target_desc *tdesc_amd64_avx_mpx_linux;
+
+/* Defined in auto-generated file amd64-mpx-linux.c.  */
+void init_registers_amd64_mpx_linux (void);
+extern const struct target_desc *tdesc_amd64_mpx_linux;
+
+/* Defined in auto-generated file x32-linux.c.  */
+void init_registers_x32_linux (void);
+extern const struct target_desc *tdesc_x32_linux;
+
+/* Defined in auto-generated file x32-avx-linux.c.  */
+void init_registers_x32_avx_linux (void);
+extern const struct target_desc *tdesc_x32_avx_linux;
+
+/* Defined in auto-generated file x32-avx-avx512-linux.c.  */
+void init_registers_x32_avx_avx512_linux (void);
+extern const struct target_desc *tdesc_x32_avx_avx512_linux;
+
+#endif
+
 namespace selftests {
 namespace tdesc {
 static void
@@ -75,6 +115,41 @@ i386_tdesc_test ()
       SELF_CHECK (*tdesc == *elem.tdesc);
     }
 }
+
+#ifdef __x86_64__
+
+static void
+amd64_tdesc_test ()
+{
+  struct
+  {
+    unsigned int mask;
+    const target_desc *tdesc[2];
+  } tdesc_tests[] = {
+    { X86_XSTATE_SSE_MASK, { tdesc_amd64_linux, tdesc_x32_linux } },
+    { X86_XSTATE_AVX_MASK, { tdesc_amd64_avx_linux, tdesc_x32_avx_linux } },
+    { X86_XSTATE_MPX_MASK, { tdesc_amd64_mpx_linux, tdesc_x32_avx_linux } },
+    { X86_XSTATE_AVX_MPX_MASK, { tdesc_amd64_avx_mpx_linux,
+				 tdesc_x32_avx_linux } },
+    { X86_XSTATE_AVX_AVX512_MASK, { tdesc_amd64_avx_avx512_linux,
+      tdesc_x32_avx_avx512_linux } },
+    { X86_XSTATE_AVX_MPX_AVX512_PKU_MASK,
+      { tdesc_amd64_avx_mpx_avx512_pku_linux,  tdesc_x32_avx_avx512_linux } },
+  };
+
+  for (auto &elem : tdesc_tests)
+    {
+      for (int i = 0; i < 2; i++)
+	{
+	  const target_desc *tdesc = amd64_linux_read_description (elem.mask,
+								   i);
+
+	  SELF_CHECK (*tdesc == *elem.tdesc[i]);
+	}
+    }
+}
+
+#endif
 }
 } // namespace selftests
 
@@ -90,4 +165,19 @@ initialize_low_tdesc ()
   init_registers_i386_avx_mpx_avx512_pku_linux ();
 
   register_self_test (selftests::tdesc::i386_tdesc_test);
+
+#ifdef __x86_64__
+  init_registers_x32_linux ();
+  init_registers_x32_avx_linux ();
+  init_registers_x32_avx_avx512_linux ();
+
+  init_registers_amd64_linux ();
+  init_registers_amd64_avx_linux ();
+  init_registers_amd64_mpx_linux ();
+  init_registers_amd64_avx_mpx_linux ();
+  init_registers_amd64_avx_avx512_linux ();
+  init_registers_amd64_avx_mpx_avx512_pku_linux ();
+
+  register_self_test (selftests::tdesc::amd64_tdesc_test);
+#endif
 }
diff --git a/gdb/gdbserver/linux-x86-tdesc.c b/gdb/gdbserver/linux-x86-tdesc.c
index d1e262c..9eb61a7 100644
--- a/gdb/gdbserver/linux-x86-tdesc.c
+++ b/gdb/gdbserver/linux-x86-tdesc.c
@@ -22,36 +22,68 @@
 #include "linux-x86-tdesc.h"
 #include "arch/i386.h"
 #include "common/x86-xstate.h"
+#ifdef __x86_64__
+#include "arch/amd64.h"
+#endif
 
-static struct target_desc *i386_tdescs[X86_TDESC_LAST] = { };
+/* Return the right x86_linux_tdesc index for a given XCR0.  Return
+   X86_TDESC_LAST if can't find a match.  */
 
-#if defined __i386__ || !defined IN_PROCESS_AGENT
-
-/* Return the target description according to XCR0.  */
-
-const struct target_desc *
-i386_linux_read_description (uint64_t xcr0)
+static enum x86_linux_tdesc
+xcr0_to_tdesc_idx (uint64_t xcr0, bool is_x32)
 {
-  struct target_desc **tdesc = NULL;
-
   if (xcr0 & X86_XSTATE_PKRU)
-     tdesc = &i386_tdescs[X86_TDESC_AVX_MPX_AVX512_PKU];
+    {
+      if (is_x32)
+	{
+	  /* No x32 MPX and PKU, fall back to avx_avx512.  */
+	  return X86_TDESC_AVX_AVX512;
+	}
+      else
+	return X86_TDESC_AVX_MPX_AVX512_PKU;
+    }
   else if (xcr0 & X86_XSTATE_AVX512)
-    tdesc = &i386_tdescs[X86_TDESC_AVX_AVX512];
+    return X86_TDESC_AVX_AVX512;
   else if ((xcr0 & X86_XSTATE_AVX_MPX_MASK) == X86_XSTATE_AVX_MPX_MASK)
-    tdesc = &i386_tdescs[X86_TDESC_AVX_MPX];
+    {
+      if (is_x32) /* No MPX on x32.  */
+	return X86_TDESC_AVX;
+      else
+	return X86_TDESC_AVX_MPX;
+    }
   else if (xcr0 & X86_XSTATE_MPX)
-    tdesc = &i386_tdescs[X86_TDESC_MPX];
+    {
+      if (is_x32) /* No MPX on x32.  */
+	return X86_TDESC_AVX;
+      else
+	return X86_TDESC_MPX;
+    }
   else if (xcr0 & X86_XSTATE_AVX)
-    tdesc = &i386_tdescs[X86_TDESC_AVX];
+    return X86_TDESC_AVX;
   else if (xcr0 & X86_XSTATE_SSE)
-    tdesc = &i386_tdescs[X86_TDESC_SSE];
+    return X86_TDESC_SSE;
   else if (xcr0 & X86_XSTATE_X87)
-    tdesc = &i386_tdescs[X86_TDESC_MMX];
+    return X86_TDESC_MMX;
+  else
+    return X86_TDESC_LAST;
+}
 
-  if (tdesc == NULL)
+static struct target_desc *i386_tdescs[X86_TDESC_LAST] = { };
+
+#if defined __i386__ || !defined IN_PROCESS_AGENT
+
+/* Return the target description according to XCR0.  */
+
+const struct target_desc *
+i386_linux_read_description (uint64_t xcr0)
+{
+  enum x86_linux_tdesc idx = xcr0_to_tdesc_idx (xcr0, false);
+
+  if (idx == X86_TDESC_LAST)
     return NULL;
 
+  struct target_desc **tdesc = &i386_tdescs[idx];
+
   if (*tdesc == NULL)
     {
       *tdesc = i386_create_target_description (xcr0);
@@ -68,7 +100,44 @@ i386_linux_read_description (uint64_t xcr0)
 }
 #endif
 
+#ifdef __x86_64__
+
+static target_desc *amd64_tdescs[X86_TDESC_LAST] = { };
+static target_desc *x32_tdescs[X86_TDESC_LAST] = { };
+
+const struct target_desc *
+amd64_linux_read_description (uint64_t xcr0, bool is_x32)
+{
+  enum x86_linux_tdesc idx = xcr0_to_tdesc_idx (xcr0, is_x32);
+
+  if (idx == X86_TDESC_LAST)
+    return NULL;
+
+  struct target_desc **tdesc = NULL;
+
+  if (is_x32)
+    tdesc = &x32_tdescs[idx];
+  else
+    tdesc = &amd64_tdescs[idx];
+
+  if (*tdesc == NULL)
+    {
+      *tdesc = amd64_create_target_description (xcr0, is_x32);
+
+      init_target_desc (*tdesc);
+
+#ifndef IN_PROCESS_AGENT
+      static const char *expedite_regs_amd64[] = { "rbp", "rsp", "rip", NULL };
+      (*tdesc)->expedite_regs = expedite_regs_amd64;
+#endif
+    }
+  return *tdesc;
+}
+
+#endif
+
 #ifndef IN_PROCESS_AGENT
+
 int
 i386_get_ipa_tdesc_idx (const struct target_desc *tdesc)
 {
@@ -82,4 +151,23 @@ i386_get_ipa_tdesc_idx (const struct target_desc *tdesc)
   return X86_TDESC_MMX;
 }
 
+#if defined __x86_64__
+int
+amd64_get_ipa_tdesc_idx (const struct target_desc *tdesc)
+{
+  for (int i = 0; i < X86_TDESC_LAST; i++)
+    {
+      if (tdesc == amd64_tdescs[i])
+	return i;
+    }
+  for (int i = 0; i < X86_TDESC_LAST; i++)
+    {
+      if (tdesc == x32_tdescs[i])
+	return i;
+    }
+
+  return X86_TDESC_SSE;
+}
+
+#endif
 #endif
diff --git a/gdb/gdbserver/linux-x86-tdesc.h b/gdb/gdbserver/linux-x86-tdesc.h
index 03bd1f1..a6dc330 100644
--- a/gdb/gdbserver/linux-x86-tdesc.h
+++ b/gdb/gdbserver/linux-x86-tdesc.h
@@ -33,52 +33,19 @@ enum x86_linux_tdesc {
   X86_TDESC_LAST = 7,
 };
 
-#ifdef __x86_64__
-
-#if defined __LP64__  || !defined IN_PROCESS_AGENT
-/* Defined in auto-generated file amd64-linux.c.  */
-void init_registers_amd64_linux (void);
-extern const struct target_desc *tdesc_amd64_linux;
-
-/* Defined in auto-generated file amd64-avx-linux.c.  */
-void init_registers_amd64_avx_linux (void);
-extern const struct target_desc *tdesc_amd64_avx_linux;
-
-/* Defined in auto-generated file amd64-avx-avx512-linux.c.  */
-void init_registers_amd64_avx_avx512_linux (void);
-extern const struct target_desc *tdesc_amd64_avx_avx512_linux;
-
-/* Defined in auto-generated file amd64-avx-mpx-avx512-pku-linux.c.  */
-void init_registers_amd64_avx_mpx_avx512_pku_linux (void);
-extern const struct target_desc *tdesc_amd64_avx_mpx_avx512_pku_linux;
-
-/* Defined in auto-generated file amd64-avx-mpx-linux.c.  */
-void init_registers_amd64_avx_mpx_linux (void);
-extern const struct target_desc *tdesc_amd64_avx_mpx_linux;
-
-/* Defined in auto-generated file amd64-mpx-linux.c.  */
-void init_registers_amd64_mpx_linux (void);
-extern const struct target_desc *tdesc_amd64_mpx_linux;
+#if defined __i386__ || !defined IN_PROCESS_AGENT
+int i386_get_ipa_tdesc_idx (const struct target_desc *tdesc);
 #endif
 
-#if defined __ILP32__ || !defined IN_PROCESS_AGENT
-/* Defined in auto-generated file x32-linux.c.  */
-void init_registers_x32_linux (void);
-extern const struct target_desc *tdesc_x32_linux;
-
-/* Defined in auto-generated file x32-avx-linux.c.  */
-void init_registers_x32_avx_linux (void);
-extern const struct target_desc *tdesc_x32_avx_linux;
-
-/* Defined in auto-generated file x32-avx-avx512-linux.c.  */
-void init_registers_x32_avx_avx512_linux (void);
-extern const struct target_desc *tdesc_x32_avx_avx512_linux;
+#if defined __x86_64__ && !defined IN_PROCESS_AGENT
+int amd64_get_ipa_tdesc_idx (const struct target_desc *tdesc);
 #endif
 
-#endif
+const struct target_desc *i386_get_ipa_tdesc (int idx);
 
-#if defined __i386__ || !defined IN_PROCESS_AGENT
-int i386_get_ipa_tdesc_idx (const struct target_desc *tdesc);
+#ifdef __x86_64__
+const struct target_desc *amd64_linux_read_description (uint64_t xcr0,
+							bool is_x32);
 #endif
 
 const struct target_desc *i386_linux_read_description (uint64_t xcr0);
-- 
1.9.1

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

* [PATCH 22/26] Lazily and dynamically create amd64-linux target descriptions
  2017-07-10 13:56 [PATCH 00/26 v3] Make GDB builtin target descriptions more flexible Yao Qi
                   ` (19 preceding siblings ...)
  2017-07-10 13:56 ` [PATCH 13/26] GDBserver self test Yao Qi
@ 2017-07-10 13:56 ` Yao Qi
  2017-07-10 13:56 ` [PATCH 07/26] Lazily and dynamically create i386-linux " Yao Qi
                   ` (5 subsequent siblings)
  26 siblings, 0 replies; 30+ messages in thread
From: Yao Qi @ 2017-07-10 13:56 UTC (permalink / raw)
  To: gdb-patches

This patch starts to use the generate c feature files to dynamically
create amd64-linux target descriptions.

gdb:

2017-06-08  Yao Qi  <yao.qi@linaro.org>

	* amd64-linux-tdep.c: Don't include amd64-XXX-linux and
	x32-XXX-linux.c.  Include 64bit-XX.c and x32-XX.c.
	(amd64_linux_read_description): Create target descriptions.
	(_initialize_amd64_linux_tdep): Don't call initialize_tdesc_XXX
	functions.  Add unit tests.
	* features/Makefile (FEATURE_XMLFILES): Append 64bit-XXX.xml and
	x32-core.xml.
	* features/i386/64bit-avx.c: Generated.
	* features/i386/64bit-avx512.c: Generated.
	* features/i386/64bit-core.c: Generated.
	* features/i386/64bit-linux.c: Generated.
	* features/i386/64bit-mpx.c: Generated.
	* features/i386/64bit-pkeys.c: Generated.
	* features/i386/64bit-segments.c: Generated.
	* features/i386/64bit-sse.c: Generated.
	* features/i386/x32-core.c: Generated.
	* target-descriptions.c (maint_print_c_tdesc_cmd): Print feature
	c files for amd64-linux and x32-linux.
---
 gdb/amd64-linux-tdep.c             | 138 +++++++++++++++++++++++--------------
 gdb/features/Makefile              |  11 ++-
 gdb/features/i386/64bit-avx.c      |  29 ++++++++
 gdb/features/i386/64bit-avx512.c   | 124 +++++++++++++++++++++++++++++++++
 gdb/features/i386/64bit-core.c     |  74 ++++++++++++++++++++
 gdb/features/i386/64bit-linux.c    |  15 ++++
 gdb/features/i386/64bit-mpx.c      |  51 ++++++++++++++
 gdb/features/i386/64bit-pkeys.c    |  14 ++++
 gdb/features/i386/64bit-segments.c |  15 ++++
 gdb/features/i386/64bit-sse.c      |  83 ++++++++++++++++++++++
 gdb/features/i386/x32-core.c       |  74 ++++++++++++++++++++
 gdb/target-descriptions.c          |   4 +-
 12 files changed, 578 insertions(+), 54 deletions(-)
 create mode 100644 gdb/features/i386/64bit-avx.c
 create mode 100644 gdb/features/i386/64bit-avx512.c
 create mode 100644 gdb/features/i386/64bit-core.c
 create mode 100644 gdb/features/i386/64bit-linux.c
 create mode 100644 gdb/features/i386/64bit-mpx.c
 create mode 100644 gdb/features/i386/64bit-pkeys.c
 create mode 100644 gdb/features/i386/64bit-segments.c
 create mode 100644 gdb/features/i386/64bit-sse.c
 create mode 100644 gdb/features/i386/x32-core.c

diff --git a/gdb/amd64-linux-tdep.c b/gdb/amd64-linux-tdep.c
index aa0d9dd..903c88b 100644
--- a/gdb/amd64-linux-tdep.c
+++ b/gdb/amd64-linux-tdep.c
@@ -39,17 +39,18 @@
 #include "solib-svr4.h"
 #include "xml-syscall.h"
 #include "glibc-tdep.h"
+#include "target-descriptions.h"
 
-#include "features/i386/amd64-linux.c"
-#include "features/i386/amd64-avx-linux.c"
-#include "features/i386/amd64-mpx-linux.c"
-#include "features/i386/amd64-avx-mpx-linux.c"
-#include "features/i386/amd64-avx-avx512-linux.c"
-#include "features/i386/amd64-avx-mpx-avx512-pku-linux.c"
+#include "features/i386/64bit-avx.c"
+#include "features/i386/64bit-avx512.c"
+#include "features/i386/64bit-core.c"
+#include "features/i386/64bit-linux.c"
+#include "features/i386/64bit-mpx.c"
+#include "features/i386/64bit-pkeys.c"
+#include "features/i386/64bit-segments.c"
+#include "features/i386/64bit-sse.c"
 
-#include "features/i386/x32-linux.c"
-#include "features/i386/x32-avx-linux.c"
-#include "features/i386/x32-avx-avx512-linux.c"
+#include "features/i386/x32-core.c"
 
 /* The syscall's XML filename for i386.  */
 #define XML_SYSCALL_FILENAME_AMD64 "syscalls/amd64-linux.xml"
@@ -1578,42 +1579,59 @@ amd64_linux_record_signal (struct gdbarch *gdbarch,
 const target_desc *
 amd64_linux_read_description (uint64_t xcr0_features_bit, bool is_x32)
 {
-  switch (xcr0_features_bit)
+  static target_desc *amd64_linux_tdescs \
+    [2/*AVX*/][2/*MPX*/][2/*AVX512*/][2/*PKRU*/] = {};
+  static target_desc *x32_linux_tdescs[2/*AVX*/][2/*AVX512*/] = {};
+
+  target_desc **tdesc;
+
+  if (is_x32)
     {
-    case X86_XSTATE_AVX_MPX_AVX512_PKU_MASK:
-      if (is_x32)
-	/* No MPX, PKU on x32, fallback to AVX-AVX512.  */
-	return tdesc_x32_avx_avx512_linux;
-      else
-	return tdesc_amd64_avx_mpx_avx512_pku_linux;
-    case X86_XSTATE_AVX_AVX512_MASK:
-      if (is_x32)
-	return tdesc_x32_avx_avx512_linux;
-      else
-	return tdesc_amd64_avx_avx512_linux;
-    case X86_XSTATE_MPX_MASK:
-      if (is_x32)
-	/* No MPX on x32, fallback to AVX.  */
-	return tdesc_x32_avx_linux;
-      else
-	return tdesc_amd64_mpx_linux;
-    case X86_XSTATE_AVX_MPX_MASK:
-      if (is_x32)
-	/* No MPX on x32, fallback to AVX.  */
-	return tdesc_x32_avx_linux;
-      else
-	return tdesc_amd64_avx_mpx_linux;
-    case X86_XSTATE_AVX_MASK:
-      if (is_x32)
-	return tdesc_x32_avx_linux;
-      else
-	return tdesc_amd64_avx_linux;
-    default:
+      tdesc = &x32_linux_tdescs[(xcr0_features_bit & X86_XSTATE_AVX) ? 1 : 0 ]
+	[(xcr0_features_bit & X86_XSTATE_AVX512) ? 1 : 0];
+    }
+  else
+    {
+      tdesc = &amd64_linux_tdescs[(xcr0_features_bit & X86_XSTATE_AVX) ? 1 : 0]
+	[(xcr0_features_bit & X86_XSTATE_MPX) ? 1 : 0]
+	[(xcr0_features_bit & X86_XSTATE_AVX512) ? 1 : 0]
+	[(xcr0_features_bit & X86_XSTATE_PKRU) ? 1 : 0];
+    }
+
+  if (*tdesc == NULL)
+    {
+      *tdesc = allocate_target_description ();
+
+      set_tdesc_architecture (*tdesc,
+			      is_x32 ? "i386:x64-32" : "i386:x86-64");
+
+      set_tdesc_osabi (*tdesc, osabi_from_tdesc_string ("GNU/Linux"));
+
+      long regnum = 0;
+
       if (is_x32)
-	return tdesc_x32_linux;
+	regnum = create_feature_i386_x32_core (*tdesc, regnum);
       else
-	return tdesc_amd64_linux;
+	regnum = create_feature_i386_64bit_core (*tdesc, regnum);
+
+      regnum = create_feature_i386_64bit_sse (*tdesc, regnum);
+      regnum = create_feature_i386_64bit_linux (*tdesc, regnum);
+      regnum = create_feature_i386_64bit_segments (*tdesc, regnum);
+
+      if (xcr0_features_bit & X86_XSTATE_AVX)
+	regnum = create_feature_i386_64bit_avx (*tdesc, regnum);
+
+      if ((xcr0_features_bit & X86_XSTATE_MPX) && !is_x32)
+	regnum = create_feature_i386_64bit_mpx (*tdesc, regnum);
+
+      if (xcr0_features_bit & X86_XSTATE_AVX512)
+	regnum = create_feature_i386_64bit_avx512 (*tdesc, regnum);
+
+      if ((xcr0_features_bit & X86_XSTATE_PKRU) && !is_x32)
+	regnum = create_feature_i386_64bit_pkeys (*tdesc, regnum);
     }
+
+  return *tdesc;
 }
 
 /* Get Linux/x86 target description from core dump.  */
@@ -2305,15 +2323,31 @@ _initialize_amd64_linux_tdep (void)
   gdbarch_register_osabi (bfd_arch_i386, bfd_mach_x64_32,
 			  GDB_OSABI_LINUX, amd64_x32_linux_init_abi);
 
-  /* Initialize the Linux target description.  */
-  initialize_tdesc_amd64_linux ();
-  initialize_tdesc_amd64_avx_linux ();
-  initialize_tdesc_amd64_mpx_linux ();
-  initialize_tdesc_amd64_avx_mpx_linux ();
-  initialize_tdesc_amd64_avx_avx512_linux ();
-  initialize_tdesc_amd64_avx_mpx_avx512_pku_linux ();
-
-  initialize_tdesc_x32_linux ();
-  initialize_tdesc_x32_avx_linux ();
-  initialize_tdesc_x32_avx_avx512_linux ();
+#if GDB_SELF_TEST
+  struct
+  {
+    const char *xml;
+    uint64_t mask;
+  } xml_masks[] = {
+    { "i386/amd64-linux.xml", X86_XSTATE_SSE_MASK },
+    { "i386/amd64-avx-linux.xml", X86_XSTATE_AVX_MASK },
+    { "i386/amd64-mpx-linux.xml", X86_XSTATE_MPX_MASK },
+    { "i386/amd64-avx-mpx-linux.xml", X86_XSTATE_AVX_MPX_MASK },
+    { "i386/amd64-avx-avx512-linux.xml", X86_XSTATE_AVX_AVX512_MASK },
+    { "i386/amd64-avx-mpx-avx512-pku-linux.xml",
+      X86_XSTATE_AVX_MPX_AVX512_PKU_MASK },
+    { "i386/x32-linux.xml", X86_XSTATE_SSE_MASK },
+    { "i386/x32-avx-linux.xml", X86_XSTATE_AVX_MASK },
+    { "i386/x32-avx-avx512-linux.xml", X86_XSTATE_AVX_AVX512_MASK },
+  };
+
+  for (auto &a : xml_masks)
+    {
+      auto tdesc = amd64_linux_read_description (a.mask,
+						 startswith (a.xml,
+							     "i386/x32"));
+
+      selftests::record_xml_tdesc (a.xml, tdesc);
+    }
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/Makefile b/gdb/features/Makefile
index 3fd6979..d8567d2 100644
--- a/gdb/features/Makefile
+++ b/gdb/features/Makefile
@@ -251,7 +251,16 @@ FEATURE_XMLFILES = i386/32bit-core.xml \
 	i386/32bit-avx.xml \
 	i386/32bit-mpx.xml \
 	i386/32bit-avx512.xml \
-	i386/32bit-pkeys.xml
+	i386/32bit-pkeys.xml \
+	i386/64bit-avx512.xml \
+	i386/64bit-core.xml \
+	i386/64bit-mpx.xml \
+	i386/64bit-segments.xml \
+	i386/64bit-avx.xml \
+	i386/64bit-linux.xml \
+	i386/64bit-pkeys.xml \
+	i386/64bit-sse.xml \
+	i386/x32-core.xml
 
 FEATURE_CFILES = $(patsubst %.xml,%.c,$(FEATURE_XMLFILES))
 
diff --git a/gdb/features/i386/64bit-avx.c b/gdb/features/i386/64bit-avx.c
new file mode 100644
index 0000000..d8e3914
--- /dev/null
+++ b/gdb/features/i386/64bit-avx.c
@@ -0,0 +1,29 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: 64bit-avx.xml */
+
+#include "arch/tdesc.h"
+
+static int
+create_feature_i386_64bit_avx (struct target_desc *result, long regnum)
+{
+  struct tdesc_feature *feature;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx", "64bit-avx.xml");
+  tdesc_create_reg (feature, "ymm0h", regnum++, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm1h", regnum++, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm2h", regnum++, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm3h", regnum++, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm4h", regnum++, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm5h", regnum++, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm6h", regnum++, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm7h", regnum++, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm8h", regnum++, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm9h", regnum++, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm10h", regnum++, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm11h", regnum++, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm12h", regnum++, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm13h", regnum++, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm14h", regnum++, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm15h", regnum++, 1, NULL, 128, "uint128");
+  return regnum;
+}
diff --git a/gdb/features/i386/64bit-avx512.c b/gdb/features/i386/64bit-avx512.c
new file mode 100644
index 0000000..fb50960
--- /dev/null
+++ b/gdb/features/i386/64bit-avx512.c
@@ -0,0 +1,124 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: 64bit-avx512.xml */
+
+#include "arch/tdesc.h"
+
+static int
+create_feature_i386_64bit_avx512 (struct target_desc *result, long regnum)
+{
+  struct tdesc_feature *feature;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx512", "64bit-avx512.xml");
+  struct tdesc_type *field_type;
+  field_type = tdesc_named_type (feature, "ieee_single");
+  tdesc_create_vector (feature, "v4f", field_type, 4);
+
+  field_type = tdesc_named_type (feature, "ieee_double");
+  tdesc_create_vector (feature, "v2d", field_type, 2);
+
+  field_type = tdesc_named_type (feature, "int8");
+  tdesc_create_vector (feature, "v16i8", field_type, 16);
+
+  field_type = tdesc_named_type (feature, "int16");
+  tdesc_create_vector (feature, "v8i16", field_type, 8);
+
+  field_type = tdesc_named_type (feature, "int32");
+  tdesc_create_vector (feature, "v4i32", field_type, 4);
+
+  field_type = tdesc_named_type (feature, "int64");
+  tdesc_create_vector (feature, "v2i64", field_type, 2);
+
+  struct tdesc_type *type;
+  type = tdesc_create_union (feature, "vec128");
+  field_type = tdesc_named_type (feature, "v4f");
+  tdesc_add_field (type, "v4_float", field_type);
+  field_type = tdesc_named_type (feature, "v2d");
+  tdesc_add_field (type, "v2_double", field_type);
+  field_type = tdesc_named_type (feature, "v16i8");
+  tdesc_add_field (type, "v16_int8", field_type);
+  field_type = tdesc_named_type (feature, "v8i16");
+  tdesc_add_field (type, "v8_int16", field_type);
+  field_type = tdesc_named_type (feature, "v4i32");
+  tdesc_add_field (type, "v4_int32", field_type);
+  field_type = tdesc_named_type (feature, "v2i64");
+  tdesc_add_field (type, "v2_int64", field_type);
+  field_type = tdesc_named_type (feature, "uint128");
+  tdesc_add_field (type, "uint128", field_type);
+
+  field_type = tdesc_named_type (feature, "uint128");
+  tdesc_create_vector (feature, "v2ui128", field_type, 2);
+
+  tdesc_create_reg (feature, "xmm16", regnum++, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm17", regnum++, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm18", regnum++, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm19", regnum++, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm20", regnum++, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm21", regnum++, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm22", regnum++, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm23", regnum++, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm24", regnum++, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm25", regnum++, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm26", regnum++, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm27", regnum++, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm28", regnum++, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm29", regnum++, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm30", regnum++, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm31", regnum++, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "ymm16h", regnum++, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm17h", regnum++, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm18h", regnum++, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm19h", regnum++, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm20h", regnum++, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm21h", regnum++, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm22h", regnum++, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm23h", regnum++, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm24h", regnum++, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm25h", regnum++, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm26h", regnum++, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm27h", regnum++, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm28h", regnum++, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm29h", regnum++, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm30h", regnum++, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm31h", regnum++, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "k0", regnum++, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k1", regnum++, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k2", regnum++, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k3", regnum++, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k4", regnum++, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k5", regnum++, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k6", regnum++, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k7", regnum++, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "zmm0h", regnum++, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm1h", regnum++, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm2h", regnum++, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm3h", regnum++, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm4h", regnum++, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm5h", regnum++, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm6h", regnum++, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm7h", regnum++, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm8h", regnum++, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm9h", regnum++, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm10h", regnum++, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm11h", regnum++, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm12h", regnum++, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm13h", regnum++, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm14h", regnum++, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm15h", regnum++, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm16h", regnum++, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm17h", regnum++, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm18h", regnum++, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm19h", regnum++, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm20h", regnum++, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm21h", regnum++, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm22h", regnum++, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm23h", regnum++, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm24h", regnum++, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm25h", regnum++, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm26h", regnum++, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm27h", regnum++, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm28h", regnum++, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm29h", regnum++, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm30h", regnum++, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm31h", regnum++, 1, NULL, 256, "v2ui128");
+  return regnum;
+}
diff --git a/gdb/features/i386/64bit-core.c b/gdb/features/i386/64bit-core.c
new file mode 100644
index 0000000..14d4a19
--- /dev/null
+++ b/gdb/features/i386/64bit-core.c
@@ -0,0 +1,74 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: 64bit-core.xml */
+
+#include "arch/tdesc.h"
+
+static int
+create_feature_i386_64bit_core (struct target_desc *result, long regnum)
+{
+  struct tdesc_feature *feature;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core", "64bit-core.xml");
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
+  type = tdesc_create_flags (feature, "i386_eflags", 4);
+  tdesc_add_flag (type, 0, "CF");
+  tdesc_add_flag (type, 1, "");
+  tdesc_add_flag (type, 2, "PF");
+  tdesc_add_flag (type, 4, "AF");
+  tdesc_add_flag (type, 6, "ZF");
+  tdesc_add_flag (type, 7, "SF");
+  tdesc_add_flag (type, 8, "TF");
+  tdesc_add_flag (type, 9, "IF");
+  tdesc_add_flag (type, 10, "DF");
+  tdesc_add_flag (type, 11, "OF");
+  tdesc_add_flag (type, 14, "NT");
+  tdesc_add_flag (type, 16, "RF");
+  tdesc_add_flag (type, 17, "VM");
+  tdesc_add_flag (type, 18, "AC");
+  tdesc_add_flag (type, 19, "VIF");
+  tdesc_add_flag (type, 20, "VIP");
+  tdesc_add_flag (type, 21, "ID");
+
+  tdesc_create_reg (feature, "rax", regnum++, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "rbx", regnum++, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "rcx", regnum++, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "rdx", regnum++, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "rsi", regnum++, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "rdi", regnum++, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "rbp", regnum++, 1, NULL, 64, "data_ptr");
+  tdesc_create_reg (feature, "rsp", regnum++, 1, NULL, 64, "data_ptr");
+  tdesc_create_reg (feature, "r8", regnum++, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "r9", regnum++, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "r10", regnum++, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "r11", regnum++, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "r12", regnum++, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "r13", regnum++, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "r14", regnum++, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "r15", regnum++, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "rip", regnum++, 1, NULL, 64, "code_ptr");
+  tdesc_create_reg (feature, "eflags", regnum++, 1, NULL, 32, "i386_eflags");
+  tdesc_create_reg (feature, "cs", regnum++, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "ss", regnum++, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "ds", regnum++, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "es", regnum++, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "fs", regnum++, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "gs", regnum++, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "st0", regnum++, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st1", regnum++, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st2", regnum++, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st3", regnum++, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st4", regnum++, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st5", regnum++, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st6", regnum++, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st7", regnum++, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "fctrl", regnum++, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "fstat", regnum++, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "ftag", regnum++, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "fiseg", regnum++, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "fioff", regnum++, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "foseg", regnum++, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "fooff", regnum++, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "fop", regnum++, 1, "float", 32, "int");
+  return regnum;
+}
diff --git a/gdb/features/i386/64bit-linux.c b/gdb/features/i386/64bit-linux.c
new file mode 100644
index 0000000..570910b
--- /dev/null
+++ b/gdb/features/i386/64bit-linux.c
@@ -0,0 +1,15 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: 64bit-linux.xml */
+
+#include "arch/tdesc.h"
+
+static int
+create_feature_i386_64bit_linux (struct target_desc *result, long regnum)
+{
+  struct tdesc_feature *feature;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.linux", "64bit-linux.xml");
+  regnum = 57;
+  tdesc_create_reg (feature, "orig_rax", regnum++, 1, NULL, 64, "int");
+  return regnum;
+}
diff --git a/gdb/features/i386/64bit-mpx.c b/gdb/features/i386/64bit-mpx.c
new file mode 100644
index 0000000..2751e03
--- /dev/null
+++ b/gdb/features/i386/64bit-mpx.c
@@ -0,0 +1,51 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: 64bit-mpx.xml */
+
+#include "arch/tdesc.h"
+
+static int
+create_feature_i386_64bit_mpx (struct target_desc *result, long regnum)
+{
+  struct tdesc_feature *feature;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.mpx", "64bit-mpx.xml");
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
+  type = tdesc_create_struct (feature, "br128");
+  field_type = tdesc_named_type (feature, "uint64");
+  tdesc_add_field (type, "lbound", field_type);
+  field_type = tdesc_named_type (feature, "uint64");
+  tdesc_add_field (type, "ubound_raw", field_type);
+
+  type = tdesc_create_struct (feature, "_bndstatus");
+  tdesc_set_struct_size (type, 8);
+  tdesc_add_bitfield (type, "bde", 2, 63);
+  tdesc_add_bitfield (type, "error", 0, 1);
+
+  type = tdesc_create_union (feature, "status");
+  field_type = tdesc_named_type (feature, "data_ptr");
+  tdesc_add_field (type, "raw", field_type);
+  field_type = tdesc_named_type (feature, "_bndstatus");
+  tdesc_add_field (type, "status", field_type);
+
+  type = tdesc_create_struct (feature, "_bndcfgu");
+  tdesc_set_struct_size (type, 8);
+  tdesc_add_bitfield (type, "base", 12, 63);
+  tdesc_add_bitfield (type, "reserved", 2, 11);
+  tdesc_add_bitfield (type, "preserved", 1, 1);
+  tdesc_add_bitfield (type, "enabled", 0, 0);
+
+  type = tdesc_create_union (feature, "cfgu");
+  field_type = tdesc_named_type (feature, "data_ptr");
+  tdesc_add_field (type, "raw", field_type);
+  field_type = tdesc_named_type (feature, "_bndcfgu");
+  tdesc_add_field (type, "config", field_type);
+
+  tdesc_create_reg (feature, "bnd0raw", regnum++, 1, NULL, 128, "br128");
+  tdesc_create_reg (feature, "bnd1raw", regnum++, 1, NULL, 128, "br128");
+  tdesc_create_reg (feature, "bnd2raw", regnum++, 1, NULL, 128, "br128");
+  tdesc_create_reg (feature, "bnd3raw", regnum++, 1, NULL, 128, "br128");
+  tdesc_create_reg (feature, "bndcfgu", regnum++, 1, NULL, 64, "cfgu");
+  tdesc_create_reg (feature, "bndstatus", regnum++, 1, NULL, 64, "status");
+  return regnum;
+}
diff --git a/gdb/features/i386/64bit-pkeys.c b/gdb/features/i386/64bit-pkeys.c
new file mode 100644
index 0000000..9d974c3
--- /dev/null
+++ b/gdb/features/i386/64bit-pkeys.c
@@ -0,0 +1,14 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: 64bit-pkeys.xml */
+
+#include "arch/tdesc.h"
+
+static int
+create_feature_i386_64bit_pkeys (struct target_desc *result, long regnum)
+{
+  struct tdesc_feature *feature;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.pkeys", "64bit-pkeys.xml");
+  tdesc_create_reg (feature, "pkru", regnum++, 1, NULL, 32, "uint32");
+  return regnum;
+}
diff --git a/gdb/features/i386/64bit-segments.c b/gdb/features/i386/64bit-segments.c
new file mode 100644
index 0000000..7a1fbf5
--- /dev/null
+++ b/gdb/features/i386/64bit-segments.c
@@ -0,0 +1,15 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: 64bit-segments.xml */
+
+#include "arch/tdesc.h"
+
+static int
+create_feature_i386_64bit_segments (struct target_desc *result, long regnum)
+{
+  struct tdesc_feature *feature;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.segments", "64bit-segments.xml");
+  tdesc_create_reg (feature, "fs_base", regnum++, 1, NULL, 64, "int");
+  tdesc_create_reg (feature, "gs_base", regnum++, 1, NULL, 64, "int");
+  return regnum;
+}
diff --git a/gdb/features/i386/64bit-sse.c b/gdb/features/i386/64bit-sse.c
new file mode 100644
index 0000000..bc38498
--- /dev/null
+++ b/gdb/features/i386/64bit-sse.c
@@ -0,0 +1,83 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: 64bit-sse.xml */
+
+#include "arch/tdesc.h"
+
+static int
+create_feature_i386_64bit_sse (struct target_desc *result, long regnum)
+{
+  struct tdesc_feature *feature;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.sse", "64bit-sse.xml");
+  struct tdesc_type *field_type;
+  field_type = tdesc_named_type (feature, "ieee_single");
+  tdesc_create_vector (feature, "v4f", field_type, 4);
+
+  field_type = tdesc_named_type (feature, "ieee_double");
+  tdesc_create_vector (feature, "v2d", field_type, 2);
+
+  field_type = tdesc_named_type (feature, "int8");
+  tdesc_create_vector (feature, "v16i8", field_type, 16);
+
+  field_type = tdesc_named_type (feature, "int16");
+  tdesc_create_vector (feature, "v8i16", field_type, 8);
+
+  field_type = tdesc_named_type (feature, "int32");
+  tdesc_create_vector (feature, "v4i32", field_type, 4);
+
+  field_type = tdesc_named_type (feature, "int64");
+  tdesc_create_vector (feature, "v2i64", field_type, 2);
+
+  struct tdesc_type *type;
+  type = tdesc_create_union (feature, "vec128");
+  field_type = tdesc_named_type (feature, "v4f");
+  tdesc_add_field (type, "v4_float", field_type);
+  field_type = tdesc_named_type (feature, "v2d");
+  tdesc_add_field (type, "v2_double", field_type);
+  field_type = tdesc_named_type (feature, "v16i8");
+  tdesc_add_field (type, "v16_int8", field_type);
+  field_type = tdesc_named_type (feature, "v8i16");
+  tdesc_add_field (type, "v8_int16", field_type);
+  field_type = tdesc_named_type (feature, "v4i32");
+  tdesc_add_field (type, "v4_int32", field_type);
+  field_type = tdesc_named_type (feature, "v2i64");
+  tdesc_add_field (type, "v2_int64", field_type);
+  field_type = tdesc_named_type (feature, "uint128");
+  tdesc_add_field (type, "uint128", field_type);
+
+  type = tdesc_create_flags (feature, "i386_mxcsr", 4);
+  tdesc_add_flag (type, 0, "IE");
+  tdesc_add_flag (type, 1, "DE");
+  tdesc_add_flag (type, 2, "ZE");
+  tdesc_add_flag (type, 3, "OE");
+  tdesc_add_flag (type, 4, "UE");
+  tdesc_add_flag (type, 5, "PE");
+  tdesc_add_flag (type, 6, "DAZ");
+  tdesc_add_flag (type, 7, "IM");
+  tdesc_add_flag (type, 8, "DM");
+  tdesc_add_flag (type, 9, "ZM");
+  tdesc_add_flag (type, 10, "OM");
+  tdesc_add_flag (type, 11, "UM");
+  tdesc_add_flag (type, 12, "PM");
+  tdesc_add_flag (type, 15, "FZ");
+
+  regnum = 40;
+  tdesc_create_reg (feature, "xmm0", regnum++, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm1", regnum++, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm2", regnum++, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm3", regnum++, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm4", regnum++, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm5", regnum++, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm6", regnum++, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm7", regnum++, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm8", regnum++, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm9", regnum++, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm10", regnum++, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm11", regnum++, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm12", regnum++, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm13", regnum++, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm14", regnum++, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm15", regnum++, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "mxcsr", regnum++, 1, "vector", 32, "i386_mxcsr");
+  return regnum;
+}
diff --git a/gdb/features/i386/x32-core.c b/gdb/features/i386/x32-core.c
new file mode 100644
index 0000000..3939abc
--- /dev/null
+++ b/gdb/features/i386/x32-core.c
@@ -0,0 +1,74 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: x32-core.xml */
+
+#include "arch/tdesc.h"
+
+static int
+create_feature_i386_x32_core (struct target_desc *result, long regnum)
+{
+  struct tdesc_feature *feature;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core", "x32-core.xml");
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
+  type = tdesc_create_flags (feature, "i386_eflags", 4);
+  tdesc_add_flag (type, 0, "CF");
+  tdesc_add_flag (type, 1, "");
+  tdesc_add_flag (type, 2, "PF");
+  tdesc_add_flag (type, 4, "AF");
+  tdesc_add_flag (type, 6, "ZF");
+  tdesc_add_flag (type, 7, "SF");
+  tdesc_add_flag (type, 8, "TF");
+  tdesc_add_flag (type, 9, "IF");
+  tdesc_add_flag (type, 10, "DF");
+  tdesc_add_flag (type, 11, "OF");
+  tdesc_add_flag (type, 14, "NT");
+  tdesc_add_flag (type, 16, "RF");
+  tdesc_add_flag (type, 17, "VM");
+  tdesc_add_flag (type, 18, "AC");
+  tdesc_add_flag (type, 19, "VIF");
+  tdesc_add_flag (type, 20, "VIP");
+  tdesc_add_flag (type, 21, "ID");
+
+  tdesc_create_reg (feature, "rax", regnum++, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "rbx", regnum++, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "rcx", regnum++, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "rdx", regnum++, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "rsi", regnum++, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "rdi", regnum++, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "rbp", regnum++, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "rsp", regnum++, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "r8", regnum++, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "r9", regnum++, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "r10", regnum++, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "r11", regnum++, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "r12", regnum++, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "r13", regnum++, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "r14", regnum++, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "r15", regnum++, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "rip", regnum++, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "eflags", regnum++, 1, NULL, 32, "i386_eflags");
+  tdesc_create_reg (feature, "cs", regnum++, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "ss", regnum++, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "ds", regnum++, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "es", regnum++, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "fs", regnum++, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "gs", regnum++, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "st0", regnum++, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st1", regnum++, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st2", regnum++, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st3", regnum++, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st4", regnum++, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st5", regnum++, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st6", regnum++, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st7", regnum++, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "fctrl", regnum++, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "fstat", regnum++, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "ftag", regnum++, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "fiseg", regnum++, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "fioff", regnum++, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "foseg", regnum++, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "fooff", regnum++, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "fop", regnum++, 1, "float", 32, "int");
+  return regnum;
+}
diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c
index 996c91c..1c6e2e3 100644
--- a/gdb/target-descriptions.c
+++ b/gdb/target-descriptions.c
@@ -2326,7 +2326,9 @@ maint_print_c_tdesc_cmd (char *args, int from_tty)
   /* Print c files for target features instead of target descriptions,
      because c files got from target features are more flexible than the
      counterparts.  */
-  if (startswith (filename_after_features.c_str (), "i386/32bit-"))
+  if (startswith (filename_after_features.c_str (), "i386/32bit-")
+      || startswith (filename_after_features.c_str (), "i386/64bit-")
+      || startswith (filename_after_features.c_str (), "i386/x32-core.xml"))
     {
       print_c_feature v (filename_after_features);
 
-- 
1.9.1

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

* [PATCH 24/26] [GDBserver] Use pre-generated amd64-linux tdesc as test
  2017-07-10 13:56 [PATCH 00/26 v3] Make GDB builtin target descriptions more flexible Yao Qi
                   ` (7 preceding siblings ...)
  2017-07-10 13:56 ` [PATCH 23/26] Convert amd64-linux target descriptions Yao Qi
@ 2017-07-10 13:56 ` Yao Qi
  2017-07-10 13:56 ` [PATCH 10/26] Use VEC for target_desc.reg_defs Yao Qi
                   ` (17 subsequent siblings)
  26 siblings, 0 replies; 30+ messages in thread
From: Yao Qi @ 2017-07-10 13:56 UTC (permalink / raw)
  To: gdb-patches

Now, all these amd64-linux pre-generated tdesc can be used as test, so
don't need to build them if $development is false.

Note that this patch wants to remove ipa_x32_linux_regobj, but it was
removed by mistake by 22049425ce40324139be82d9a6ec518c46b65815.

gdb/gdbserver:

2017-06-09  Yao Qi  <yao.qi@linaro.org>

	* configure.srv: Empty srv_amd64_linux_regobj if $development is
	false.
	(ipa_amd64_linux_regobj): Remove.
---
 gdb/gdbserver/configure.srv | 11 +++--------
 1 file changed, 3 insertions(+), 8 deletions(-)

diff --git a/gdb/gdbserver/configure.srv b/gdb/gdbserver/configure.srv
index 05cc99e..605649e 100644
--- a/gdb/gdbserver/configure.srv
+++ b/gdb/gdbserver/configure.srv
@@ -28,14 +28,14 @@ srv_i386_regobj="i386.o i386-avx.o i386-avx-avx512.o i386-avx-mpx-avx512-pku.o i
 
 if $development; then
    srv_i386_linux_regobj="i386-linux.o i386-avx-linux.o i386-avx-avx512-linux.o i386-avx-mpx-avx512-pku-linux.o i386-mpx-linux.o i386-avx-mpx-linux.o i386-mmx-linux.o linux-x86-tdesc-selftest.o"
+   srv_amd64_linux_regobj="amd64-linux.o amd64-avx-linux.o amd64-avx-avx512-linux.o amd64-avx-mpx-avx512-pku-linux.o amd64-mpx-linux.o amd64-avx-mpx-linux.o x32-linux.o x32-avx-linux.o x32-avx-avx512-linux.o"
 else
    srv_i386_linux_regobj=""
+   srv_amd64_linux_regobj=""
 fi
 
 srv_amd64_regobj="amd64.o amd64-avx.o amd64-avx-avx512.o amd64-avx-mpx-avx512-pku.o amd64-mpx.o amd64-avx-mpx.o x32.o x32-avx.o x32-avx-avx512.o"
-srv_amd64_linux_regobj="amd64-linux.o amd64-avx-linux.o amd64-avx-avx512-linux.o amd64-avx-mpx-avx512-pku-linux.o amd64-mpx-linux.o amd64-avx-mpx-linux.o x32-linux.o x32-avx-linux.o x32-avx-avx512-linux.o"
 
-ipa_amd64_linux_regobj="amd64-linux-ipa.o amd64-avx-linux-ipa.o amd64-avx-mpx-linux-ipa.o amd64-avx-avx512-linux-ipa.o amd64-avx-mpx-avx512-pku-linux-ipa.o amd64-mpx-linux-ipa.o"
 ipa_ppc_linux_regobj="powerpc-32l-ipa.o powerpc-altivec32l-ipa.o powerpc-cell32l-ipa.o powerpc-vsx32l-ipa.o powerpc-isa205-32l-ipa.o powerpc-isa205-altivec32l-ipa.o powerpc-isa205-vsx32l-ipa.o powerpc-e500l-ipa.o powerpc-64l-ipa.o powerpc-altivec64l-ipa.o powerpc-cell64l-ipa.o powerpc-vsx64l-ipa.o powerpc-isa205-64l-ipa.o powerpc-isa205-altivec64l-ipa.o powerpc-isa205-vsx64l-ipa.o"
 
 srv_i386_32bit_xmlfiles="i386/32bit-core.xml i386/32bit-sse.xml i386/32bit-avx.xml i386/32bit-avx512.xml i386/32bit-mpx.xml i386/32bit-pkeys.xml"
@@ -374,12 +374,7 @@ case "${target}" in
 			srv_linux_regsets=yes
 			srv_linux_thread_db=yes
 			srv_linux_btrace=yes
-			if test "$gdb_cv_x86_is_x32" = yes ; then
-			    ipa_obj="${ipa_x32_linux_regobj}"
-			else
-			    ipa_obj="${ipa_amd64_linux_regobj}"
-			fi
-			ipa_obj="${ipa_obj} linux-amd64-ipa.o linux-x86-tdesc-ipa.o"
+			ipa_obj="linux-amd64-ipa.o linux-x86-tdesc-ipa.o"
 			ipa_obj="${ipa_obj} amd64-ipa.o"
 			;;
   x86_64-*-mingw*)	srv_regobj="$srv_amd64_regobj"
-- 
1.9.1

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

* [PATCH 02/26] Class-fy target_desc
  2017-07-10 13:56 [PATCH 00/26 v3] Make GDB builtin target descriptions more flexible Yao Qi
                   ` (23 preceding siblings ...)
  2017-07-10 13:56 ` [PATCH 19/26] [GDBserver] Shorten srv_i386_linux_xmlfiles Yao Qi
@ 2017-07-10 13:56 ` Yao Qi
  2017-07-10 13:57 ` [PATCH 26/26] Remove features/i386/amd64-*linux.c and features/i386/x32-*linux.c Yao Qi
  2017-07-26 13:59 ` [PATCH 00/26 v3] Make GDB builtin target descriptions more flexible Yao Qi
  26 siblings, 0 replies; 30+ messages in thread
From: Yao Qi @ 2017-07-10 13:56 UTC (permalink / raw)
  To: gdb-patches

This patch adds ctor and dtor in target_desc.

gdb:

2017-06-30  Yao Qi  <yao.qi@linaro.org>

	* target-descriptions.c (target_desc): Add ctor and dtor.  Do
	in-class initialization.
	(tdesc_create_feature): Call new instead of XCNEW.
	(free_target_description): Ue delete.
---
 gdb/target-descriptions.c | 61 ++++++++++++++++++++++++++---------------------
 1 file changed, 34 insertions(+), 27 deletions(-)

diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c
index 0b5b46f..ffabc71 100644
--- a/gdb/target-descriptions.c
+++ b/gdb/target-descriptions.c
@@ -267,21 +267,48 @@ DEF_VEC_P(arch_p);
 
 struct target_desc
 {
+  target_desc ()
+  {}
+
+  ~target_desc ()
+  {
+    struct tdesc_feature *feature;
+    struct property *prop;
+    int ix;
+
+    for (ix = 0;
+	 VEC_iterate (tdesc_feature_p, features, ix, feature);
+	 ix++)
+      delete feature;
+    VEC_free (tdesc_feature_p, features);
+
+    for (ix = 0;
+	 VEC_iterate (property_s, properties, ix, prop);
+	 ix++)
+      {
+	xfree (prop->key);
+	xfree (prop->value);
+      }
+
+    VEC_free (property_s, properties);
+    VEC_free (arch_p, compatible);
+  }
+
   /* The architecture reported by the target, if any.  */
-  const struct bfd_arch_info *arch;
+  const struct bfd_arch_info *arch = NULL;
 
   /* The osabi reported by the target, if any; GDB_OSABI_UNKNOWN
      otherwise.  */
-  enum gdb_osabi osabi;
+  enum gdb_osabi osabi = GDB_OSABI_UNKNOWN;
 
   /* The list of compatible architectures reported by the target.  */
-  VEC(arch_p) *compatible;
+  VEC(arch_p) *compatible = NULL;
 
   /* Any architecture-specific properties specified by the target.  */
-  VEC(property_s) *properties;
+  VEC(property_s) *properties = NULL;
 
   /* The features associated with this target.  */
-  VEC(tdesc_feature_p) *features;
+  VEC(tdesc_feature_p) *features = NULL;
 };
 
 /* Per-architecture data associated with a target description.  The
@@ -1551,35 +1578,15 @@ tdesc_create_feature (struct target_desc *tdesc, const char *name)
 struct target_desc *
 allocate_target_description (void)
 {
-  return XCNEW (struct target_desc);
+  return new target_desc ();
 }
 
 static void
 free_target_description (void *arg)
 {
   struct target_desc *target_desc = (struct target_desc *) arg;
-  struct tdesc_feature *feature;
-  struct property *prop;
-  int ix;
-
-  for (ix = 0;
-       VEC_iterate (tdesc_feature_p, target_desc->features, ix, feature);
-       ix++)
-    delete feature;
-  VEC_free (tdesc_feature_p, target_desc->features);
-
-  for (ix = 0;
-       VEC_iterate (property_s, target_desc->properties, ix, prop);
-       ix++)
-    {
-      xfree (prop->key);
-      xfree (prop->value);
-    }
-  VEC_free (property_s, target_desc->properties);
-
-  VEC_free (arch_p, target_desc->compatible);
 
-  xfree (target_desc);
+  delete target_desc;
 }
 
 struct cleanup *
-- 
1.9.1

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

* [PATCH 17/26] Remove features/i386/i386-*linux.c
  2017-07-10 13:56 [PATCH 00/26 v3] Make GDB builtin target descriptions more flexible Yao Qi
                   ` (9 preceding siblings ...)
  2017-07-10 13:56 ` [PATCH 10/26] Use VEC for target_desc.reg_defs Yao Qi
@ 2017-07-10 13:56 ` Yao Qi
  2017-07-10 13:56 ` [PATCH 16/26] Share i386-linux target description between GDB and GDBserver Yao Qi
                   ` (15 subsequent siblings)
  26 siblings, 0 replies; 30+ messages in thread
From: Yao Qi @ 2017-07-10 13:56 UTC (permalink / raw)
  To: gdb-patches

Now, features/i386/i386-XXX-linux.c are not used, remove them.

gdb:

2017-05-26  Yao Qi  <yao.qi@linaro.org>

	* features/Makefile (XMLTOC): Remove i386/i386-XX-linux.xml.
	* features/i386/i386-avx-avx512-linux.c: Remove.
	* features/i386/i386-avx-linux.c: Remove.
	* features/i386/i386-avx-mpx-avx512-pku-linux.c: Remove.
	* features/i386/i386-avx-mpx-linux.c: Remove.
	* features/i386/i386-linux.c: Remove.
	* features/i386/i386-mmx-linux.c: Remove.
	* features/i386/i386-mpx-linux.c: Remove.
---
 gdb/features/Makefile                             |   7 -
 gdb/features/i386/i386-avx-avx512-linux.c         | 170 -----------------
 gdb/features/i386/i386-avx-linux.c                | 149 ---------------
 gdb/features/i386/i386-avx-mpx-avx512-pku-linux.c | 211 ----------------------
 gdb/features/i386/i386-avx-mpx-linux.c            | 187 -------------------
 gdb/features/i386/i386-linux.c                    | 139 --------------
 gdb/features/i386/i386-mmx-linux.c                |  78 --------
 gdb/features/i386/i386-mpx-linux.c                | 177 ------------------
 8 files changed, 1118 deletions(-)
 delete mode 100644 gdb/features/i386/i386-avx-avx512-linux.c
 delete mode 100644 gdb/features/i386/i386-avx-linux.c
 delete mode 100644 gdb/features/i386/i386-avx-mpx-avx512-pku-linux.c
 delete mode 100644 gdb/features/i386/i386-avx-mpx-linux.c
 delete mode 100644 gdb/features/i386/i386-linux.c
 delete mode 100644 gdb/features/i386/i386-mmx-linux.c
 delete mode 100644 gdb/features/i386/i386-mpx-linux.c

diff --git a/gdb/features/Makefile b/gdb/features/Makefile
index db9a58e..3fd6979 100644
--- a/gdb/features/Makefile
+++ b/gdb/features/Makefile
@@ -150,18 +150,11 @@ XMLTOC = \
 	i386/amd64-avx-mpx-linux.xml \
 	i386/amd64-avx-mpx.xml \
 	i386/amd64.xml \
-	i386/i386-avx-linux.xml \
 	i386/i386-avx.xml \
-	i386/i386-avx-avx512-linux.xml \
 	i386/i386-avx-avx512.xml \
-	i386/i386-avx-mpx-avx512-pku-linux.xml \
 	i386/i386-avx-mpx-avx512-pku.xml \
-	i386/i386-linux.xml \
-	i386/i386-mmx-linux.xml \
 	i386/i386-mmx.xml \
-	i386/i386-mpx-linux.xml \
 	i386/i386-mpx.xml \
-	i386/i386-avx-mpx-linux.xml \
 	i386/i386-avx-mpx.xml \
 	i386/i386.xml \
 	i386/x32-avx-linux.xml \
diff --git a/gdb/features/i386/i386-avx-avx512-linux.c b/gdb/features/i386/i386-avx-avx512-linux.c
deleted file mode 100644
index 545149d..0000000
--- a/gdb/features/i386/i386-avx-avx512-linux.c
+++ /dev/null
@@ -1,170 +0,0 @@
-/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
-  Original: i386-avx-avx512-linux.xml */
-
-#include "defs.h"
-#include "osabi.h"
-#include "target-descriptions.h"
-
-struct target_desc *tdesc_i386_avx_avx512_linux;
-static void
-initialize_tdesc_i386_avx_avx512_linux (void)
-{
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("i386"));
-
-  set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
-
-  struct tdesc_feature *feature;
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-  type = tdesc_create_flags (feature, "i386_eflags", 4);
-  tdesc_add_flag (type, 0, "CF");
-  tdesc_add_flag (type, 1, "");
-  tdesc_add_flag (type, 2, "PF");
-  tdesc_add_flag (type, 4, "AF");
-  tdesc_add_flag (type, 6, "ZF");
-  tdesc_add_flag (type, 7, "SF");
-  tdesc_add_flag (type, 8, "TF");
-  tdesc_add_flag (type, 9, "IF");
-  tdesc_add_flag (type, 10, "DF");
-  tdesc_add_flag (type, 11, "OF");
-  tdesc_add_flag (type, 14, "NT");
-  tdesc_add_flag (type, 16, "RF");
-  tdesc_add_flag (type, 17, "VM");
-  tdesc_add_flag (type, 18, "AC");
-  tdesc_add_flag (type, 19, "VIF");
-  tdesc_add_flag (type, 20, "VIP");
-  tdesc_add_flag (type, 21, "ID");
-
-  tdesc_create_reg (feature, "eax", 0, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ecx", 1, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "edx", 2, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ebx", 3, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "esp", 4, 1, NULL, 32, "data_ptr");
-  tdesc_create_reg (feature, "ebp", 5, 1, NULL, 32, "data_ptr");
-  tdesc_create_reg (feature, "esi", 6, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "edi", 7, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "eip", 8, 1, NULL, 32, "code_ptr");
-  tdesc_create_reg (feature, "eflags", 9, 1, NULL, 32, "i386_eflags");
-  tdesc_create_reg (feature, "cs", 10, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ss", 11, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ds", 12, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "es", 13, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "fs", 14, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "gs", 15, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "st0", 16, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st1", 17, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st2", 18, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st3", 19, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st4", 20, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st5", 21, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st6", 22, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st7", 23, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "fctrl", 24, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fstat", 25, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "ftag", 26, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fiseg", 27, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fioff", 28, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "foseg", 29, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fooff", 30, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fop", 31, 1, "float", 32, "int");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.sse");
-  field_type = tdesc_named_type (feature, "ieee_single");
-  tdesc_create_vector (feature, "v4f", field_type, 4);
-
-  field_type = tdesc_named_type (feature, "ieee_double");
-  tdesc_create_vector (feature, "v2d", field_type, 2);
-
-  field_type = tdesc_named_type (feature, "int8");
-  tdesc_create_vector (feature, "v16i8", field_type, 16);
-
-  field_type = tdesc_named_type (feature, "int16");
-  tdesc_create_vector (feature, "v8i16", field_type, 8);
-
-  field_type = tdesc_named_type (feature, "int32");
-  tdesc_create_vector (feature, "v4i32", field_type, 4);
-
-  field_type = tdesc_named_type (feature, "int64");
-  tdesc_create_vector (feature, "v2i64", field_type, 2);
-
-  type = tdesc_create_union (feature, "vec128");
-  field_type = tdesc_named_type (feature, "v4f");
-  tdesc_add_field (type, "v4_float", field_type);
-  field_type = tdesc_named_type (feature, "v2d");
-  tdesc_add_field (type, "v2_double", field_type);
-  field_type = tdesc_named_type (feature, "v16i8");
-  tdesc_add_field (type, "v16_int8", field_type);
-  field_type = tdesc_named_type (feature, "v8i16");
-  tdesc_add_field (type, "v8_int16", field_type);
-  field_type = tdesc_named_type (feature, "v4i32");
-  tdesc_add_field (type, "v4_int32", field_type);
-  field_type = tdesc_named_type (feature, "v2i64");
-  tdesc_add_field (type, "v2_int64", field_type);
-  field_type = tdesc_named_type (feature, "uint128");
-  tdesc_add_field (type, "uint128", field_type);
-
-  type = tdesc_create_flags (feature, "i386_mxcsr", 4);
-  tdesc_add_flag (type, 0, "IE");
-  tdesc_add_flag (type, 1, "DE");
-  tdesc_add_flag (type, 2, "ZE");
-  tdesc_add_flag (type, 3, "OE");
-  tdesc_add_flag (type, 4, "UE");
-  tdesc_add_flag (type, 5, "PE");
-  tdesc_add_flag (type, 6, "DAZ");
-  tdesc_add_flag (type, 7, "IM");
-  tdesc_add_flag (type, 8, "DM");
-  tdesc_add_flag (type, 9, "ZM");
-  tdesc_add_flag (type, 10, "OM");
-  tdesc_add_flag (type, 11, "UM");
-  tdesc_add_flag (type, 12, "PM");
-  tdesc_add_flag (type, 15, "FZ");
-
-  tdesc_create_reg (feature, "xmm0", 32, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm1", 33, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm2", 34, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm3", 35, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm4", 36, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm5", 37, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm6", 38, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm7", 39, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "mxcsr", 40, 1, "vector", 32, "i386_mxcsr");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.linux");
-  tdesc_create_reg (feature, "orig_eax", 41, 1, NULL, 32, "int");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx");
-  tdesc_create_reg (feature, "ymm0h", 42, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm1h", 43, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm2h", 44, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm3h", 45, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm4h", 46, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm5h", 47, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm6h", 48, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm7h", 49, 1, NULL, 128, "uint128");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx512");
-  field_type = tdesc_named_type (feature, "uint128");
-  tdesc_create_vector (feature, "v2ui128", field_type, 2);
-
-  tdesc_create_reg (feature, "k0", 50, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k1", 51, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k2", 52, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k3", 53, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k4", 54, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k5", 55, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k6", 56, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k7", 57, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "zmm0h", 58, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm1h", 59, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm2h", 60, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm3h", 61, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm4h", 62, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm5h", 63, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm6h", 64, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm7h", 65, 1, NULL, 256, "v2ui128");
-
-  tdesc_i386_avx_avx512_linux = result;
-}
diff --git a/gdb/features/i386/i386-avx-linux.c b/gdb/features/i386/i386-avx-linux.c
deleted file mode 100644
index 3ef087d..0000000
--- a/gdb/features/i386/i386-avx-linux.c
+++ /dev/null
@@ -1,149 +0,0 @@
-/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
-  Original: i386-avx-linux.xml */
-
-#include "defs.h"
-#include "osabi.h"
-#include "target-descriptions.h"
-
-struct target_desc *tdesc_i386_avx_linux;
-static void
-initialize_tdesc_i386_avx_linux (void)
-{
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("i386"));
-
-  set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
-
-  struct tdesc_feature *feature;
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-  type = tdesc_create_flags (feature, "i386_eflags", 4);
-  tdesc_add_flag (type, 0, "CF");
-  tdesc_add_flag (type, 1, "");
-  tdesc_add_flag (type, 2, "PF");
-  tdesc_add_flag (type, 4, "AF");
-  tdesc_add_flag (type, 6, "ZF");
-  tdesc_add_flag (type, 7, "SF");
-  tdesc_add_flag (type, 8, "TF");
-  tdesc_add_flag (type, 9, "IF");
-  tdesc_add_flag (type, 10, "DF");
-  tdesc_add_flag (type, 11, "OF");
-  tdesc_add_flag (type, 14, "NT");
-  tdesc_add_flag (type, 16, "RF");
-  tdesc_add_flag (type, 17, "VM");
-  tdesc_add_flag (type, 18, "AC");
-  tdesc_add_flag (type, 19, "VIF");
-  tdesc_add_flag (type, 20, "VIP");
-  tdesc_add_flag (type, 21, "ID");
-
-  tdesc_create_reg (feature, "eax", 0, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ecx", 1, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "edx", 2, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ebx", 3, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "esp", 4, 1, NULL, 32, "data_ptr");
-  tdesc_create_reg (feature, "ebp", 5, 1, NULL, 32, "data_ptr");
-  tdesc_create_reg (feature, "esi", 6, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "edi", 7, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "eip", 8, 1, NULL, 32, "code_ptr");
-  tdesc_create_reg (feature, "eflags", 9, 1, NULL, 32, "i386_eflags");
-  tdesc_create_reg (feature, "cs", 10, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ss", 11, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ds", 12, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "es", 13, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "fs", 14, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "gs", 15, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "st0", 16, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st1", 17, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st2", 18, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st3", 19, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st4", 20, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st5", 21, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st6", 22, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st7", 23, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "fctrl", 24, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fstat", 25, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "ftag", 26, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fiseg", 27, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fioff", 28, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "foseg", 29, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fooff", 30, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fop", 31, 1, "float", 32, "int");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.sse");
-  field_type = tdesc_named_type (feature, "ieee_single");
-  tdesc_create_vector (feature, "v4f", field_type, 4);
-
-  field_type = tdesc_named_type (feature, "ieee_double");
-  tdesc_create_vector (feature, "v2d", field_type, 2);
-
-  field_type = tdesc_named_type (feature, "int8");
-  tdesc_create_vector (feature, "v16i8", field_type, 16);
-
-  field_type = tdesc_named_type (feature, "int16");
-  tdesc_create_vector (feature, "v8i16", field_type, 8);
-
-  field_type = tdesc_named_type (feature, "int32");
-  tdesc_create_vector (feature, "v4i32", field_type, 4);
-
-  field_type = tdesc_named_type (feature, "int64");
-  tdesc_create_vector (feature, "v2i64", field_type, 2);
-
-  type = tdesc_create_union (feature, "vec128");
-  field_type = tdesc_named_type (feature, "v4f");
-  tdesc_add_field (type, "v4_float", field_type);
-  field_type = tdesc_named_type (feature, "v2d");
-  tdesc_add_field (type, "v2_double", field_type);
-  field_type = tdesc_named_type (feature, "v16i8");
-  tdesc_add_field (type, "v16_int8", field_type);
-  field_type = tdesc_named_type (feature, "v8i16");
-  tdesc_add_field (type, "v8_int16", field_type);
-  field_type = tdesc_named_type (feature, "v4i32");
-  tdesc_add_field (type, "v4_int32", field_type);
-  field_type = tdesc_named_type (feature, "v2i64");
-  tdesc_add_field (type, "v2_int64", field_type);
-  field_type = tdesc_named_type (feature, "uint128");
-  tdesc_add_field (type, "uint128", field_type);
-
-  type = tdesc_create_flags (feature, "i386_mxcsr", 4);
-  tdesc_add_flag (type, 0, "IE");
-  tdesc_add_flag (type, 1, "DE");
-  tdesc_add_flag (type, 2, "ZE");
-  tdesc_add_flag (type, 3, "OE");
-  tdesc_add_flag (type, 4, "UE");
-  tdesc_add_flag (type, 5, "PE");
-  tdesc_add_flag (type, 6, "DAZ");
-  tdesc_add_flag (type, 7, "IM");
-  tdesc_add_flag (type, 8, "DM");
-  tdesc_add_flag (type, 9, "ZM");
-  tdesc_add_flag (type, 10, "OM");
-  tdesc_add_flag (type, 11, "UM");
-  tdesc_add_flag (type, 12, "PM");
-  tdesc_add_flag (type, 15, "FZ");
-
-  tdesc_create_reg (feature, "xmm0", 32, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm1", 33, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm2", 34, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm3", 35, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm4", 36, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm5", 37, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm6", 38, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm7", 39, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "mxcsr", 40, 1, "vector", 32, "i386_mxcsr");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.linux");
-  tdesc_create_reg (feature, "orig_eax", 41, 1, NULL, 32, "int");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx");
-  tdesc_create_reg (feature, "ymm0h", 42, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm1h", 43, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm2h", 44, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm3h", 45, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm4h", 46, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm5h", 47, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm6h", 48, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm7h", 49, 1, NULL, 128, "uint128");
-
-  tdesc_i386_avx_linux = result;
-}
diff --git a/gdb/features/i386/i386-avx-mpx-avx512-pku-linux.c b/gdb/features/i386/i386-avx-mpx-avx512-pku-linux.c
deleted file mode 100644
index e6eebf1..0000000
--- a/gdb/features/i386/i386-avx-mpx-avx512-pku-linux.c
+++ /dev/null
@@ -1,211 +0,0 @@
-/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
-  Original: i386-avx-mpx-avx512-pku-linux.xml */
-
-#include "defs.h"
-#include "osabi.h"
-#include "target-descriptions.h"
-
-struct target_desc *tdesc_i386_avx_mpx_avx512_pku_linux;
-static void
-initialize_tdesc_i386_avx_mpx_avx512_pku_linux (void)
-{
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("i386"));
-
-  set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
-
-  struct tdesc_feature *feature;
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-  type = tdesc_create_flags (feature, "i386_eflags", 4);
-  tdesc_add_flag (type, 0, "CF");
-  tdesc_add_flag (type, 1, "");
-  tdesc_add_flag (type, 2, "PF");
-  tdesc_add_flag (type, 4, "AF");
-  tdesc_add_flag (type, 6, "ZF");
-  tdesc_add_flag (type, 7, "SF");
-  tdesc_add_flag (type, 8, "TF");
-  tdesc_add_flag (type, 9, "IF");
-  tdesc_add_flag (type, 10, "DF");
-  tdesc_add_flag (type, 11, "OF");
-  tdesc_add_flag (type, 14, "NT");
-  tdesc_add_flag (type, 16, "RF");
-  tdesc_add_flag (type, 17, "VM");
-  tdesc_add_flag (type, 18, "AC");
-  tdesc_add_flag (type, 19, "VIF");
-  tdesc_add_flag (type, 20, "VIP");
-  tdesc_add_flag (type, 21, "ID");
-
-  tdesc_create_reg (feature, "eax", 0, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ecx", 1, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "edx", 2, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ebx", 3, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "esp", 4, 1, NULL, 32, "data_ptr");
-  tdesc_create_reg (feature, "ebp", 5, 1, NULL, 32, "data_ptr");
-  tdesc_create_reg (feature, "esi", 6, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "edi", 7, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "eip", 8, 1, NULL, 32, "code_ptr");
-  tdesc_create_reg (feature, "eflags", 9, 1, NULL, 32, "i386_eflags");
-  tdesc_create_reg (feature, "cs", 10, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ss", 11, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ds", 12, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "es", 13, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "fs", 14, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "gs", 15, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "st0", 16, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st1", 17, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st2", 18, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st3", 19, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st4", 20, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st5", 21, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st6", 22, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st7", 23, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "fctrl", 24, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fstat", 25, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "ftag", 26, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fiseg", 27, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fioff", 28, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "foseg", 29, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fooff", 30, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fop", 31, 1, "float", 32, "int");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.sse");
-  field_type = tdesc_named_type (feature, "ieee_single");
-  tdesc_create_vector (feature, "v4f", field_type, 4);
-
-  field_type = tdesc_named_type (feature, "ieee_double");
-  tdesc_create_vector (feature, "v2d", field_type, 2);
-
-  field_type = tdesc_named_type (feature, "int8");
-  tdesc_create_vector (feature, "v16i8", field_type, 16);
-
-  field_type = tdesc_named_type (feature, "int16");
-  tdesc_create_vector (feature, "v8i16", field_type, 8);
-
-  field_type = tdesc_named_type (feature, "int32");
-  tdesc_create_vector (feature, "v4i32", field_type, 4);
-
-  field_type = tdesc_named_type (feature, "int64");
-  tdesc_create_vector (feature, "v2i64", field_type, 2);
-
-  type = tdesc_create_union (feature, "vec128");
-  field_type = tdesc_named_type (feature, "v4f");
-  tdesc_add_field (type, "v4_float", field_type);
-  field_type = tdesc_named_type (feature, "v2d");
-  tdesc_add_field (type, "v2_double", field_type);
-  field_type = tdesc_named_type (feature, "v16i8");
-  tdesc_add_field (type, "v16_int8", field_type);
-  field_type = tdesc_named_type (feature, "v8i16");
-  tdesc_add_field (type, "v8_int16", field_type);
-  field_type = tdesc_named_type (feature, "v4i32");
-  tdesc_add_field (type, "v4_int32", field_type);
-  field_type = tdesc_named_type (feature, "v2i64");
-  tdesc_add_field (type, "v2_int64", field_type);
-  field_type = tdesc_named_type (feature, "uint128");
-  tdesc_add_field (type, "uint128", field_type);
-
-  type = tdesc_create_flags (feature, "i386_mxcsr", 4);
-  tdesc_add_flag (type, 0, "IE");
-  tdesc_add_flag (type, 1, "DE");
-  tdesc_add_flag (type, 2, "ZE");
-  tdesc_add_flag (type, 3, "OE");
-  tdesc_add_flag (type, 4, "UE");
-  tdesc_add_flag (type, 5, "PE");
-  tdesc_add_flag (type, 6, "DAZ");
-  tdesc_add_flag (type, 7, "IM");
-  tdesc_add_flag (type, 8, "DM");
-  tdesc_add_flag (type, 9, "ZM");
-  tdesc_add_flag (type, 10, "OM");
-  tdesc_add_flag (type, 11, "UM");
-  tdesc_add_flag (type, 12, "PM");
-  tdesc_add_flag (type, 15, "FZ");
-
-  tdesc_create_reg (feature, "xmm0", 32, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm1", 33, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm2", 34, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm3", 35, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm4", 36, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm5", 37, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm6", 38, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm7", 39, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "mxcsr", 40, 1, "vector", 32, "i386_mxcsr");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.linux");
-  tdesc_create_reg (feature, "orig_eax", 41, 1, NULL, 32, "int");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx");
-  tdesc_create_reg (feature, "ymm0h", 42, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm1h", 43, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm2h", 44, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm3h", 45, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm4h", 46, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm5h", 47, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm6h", 48, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm7h", 49, 1, NULL, 128, "uint128");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.mpx");
-  type = tdesc_create_struct (feature, "br128");
-  field_type = tdesc_named_type (feature, "uint64");
-  tdesc_add_field (type, "lbound", field_type);
-  field_type = tdesc_named_type (feature, "uint64");
-  tdesc_add_field (type, "ubound_raw", field_type);
-
-  type = tdesc_create_struct (feature, "_bndstatus");
-  tdesc_set_struct_size (type, 8);
-  tdesc_add_bitfield (type, "bde", 2, 31);
-  tdesc_add_bitfield (type, "error", 0, 1);
-
-  type = tdesc_create_union (feature, "status");
-  field_type = tdesc_named_type (feature, "data_ptr");
-  tdesc_add_field (type, "raw", field_type);
-  field_type = tdesc_named_type (feature, "_bndstatus");
-  tdesc_add_field (type, "status", field_type);
-
-  type = tdesc_create_struct (feature, "_bndcfgu");
-  tdesc_set_struct_size (type, 8);
-  tdesc_add_bitfield (type, "base", 12, 31);
-  tdesc_add_bitfield (type, "reserved", 2, 11);
-  tdesc_add_bitfield (type, "preserved", 1, 1);
-  tdesc_add_bitfield (type, "enabled", 0, 0);
-
-  type = tdesc_create_union (feature, "cfgu");
-  field_type = tdesc_named_type (feature, "data_ptr");
-  tdesc_add_field (type, "raw", field_type);
-  field_type = tdesc_named_type (feature, "_bndcfgu");
-  tdesc_add_field (type, "config", field_type);
-
-  tdesc_create_reg (feature, "bnd0raw", 50, 1, NULL, 128, "br128");
-  tdesc_create_reg (feature, "bnd1raw", 51, 1, NULL, 128, "br128");
-  tdesc_create_reg (feature, "bnd2raw", 52, 1, NULL, 128, "br128");
-  tdesc_create_reg (feature, "bnd3raw", 53, 1, NULL, 128, "br128");
-  tdesc_create_reg (feature, "bndcfgu", 54, 1, NULL, 64, "cfgu");
-  tdesc_create_reg (feature, "bndstatus", 55, 1, NULL, 64, "status");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx512");
-  field_type = tdesc_named_type (feature, "uint128");
-  tdesc_create_vector (feature, "v2ui128", field_type, 2);
-
-  tdesc_create_reg (feature, "k0", 56, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k1", 57, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k2", 58, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k3", 59, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k4", 60, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k5", 61, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k6", 62, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k7", 63, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "zmm0h", 64, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm1h", 65, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm2h", 66, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm3h", 67, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm4h", 68, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm5h", 69, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm6h", 70, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm7h", 71, 1, NULL, 256, "v2ui128");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.pkeys");
-  tdesc_create_reg (feature, "pkru", 72, 1, NULL, 32, "uint32");
-
-  tdesc_i386_avx_mpx_avx512_pku_linux = result;
-}
diff --git a/gdb/features/i386/i386-avx-mpx-linux.c b/gdb/features/i386/i386-avx-mpx-linux.c
deleted file mode 100644
index f62c487..0000000
--- a/gdb/features/i386/i386-avx-mpx-linux.c
+++ /dev/null
@@ -1,187 +0,0 @@
-/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
-  Original: i386-avx-mpx-linux.xml */
-
-#include "defs.h"
-#include "osabi.h"
-#include "target-descriptions.h"
-
-struct target_desc *tdesc_i386_avx_mpx_linux;
-static void
-initialize_tdesc_i386_avx_mpx_linux (void)
-{
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("i386"));
-
-  set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
-
-  struct tdesc_feature *feature;
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-  type = tdesc_create_flags (feature, "i386_eflags", 4);
-  tdesc_add_flag (type, 0, "CF");
-  tdesc_add_flag (type, 1, "");
-  tdesc_add_flag (type, 2, "PF");
-  tdesc_add_flag (type, 4, "AF");
-  tdesc_add_flag (type, 6, "ZF");
-  tdesc_add_flag (type, 7, "SF");
-  tdesc_add_flag (type, 8, "TF");
-  tdesc_add_flag (type, 9, "IF");
-  tdesc_add_flag (type, 10, "DF");
-  tdesc_add_flag (type, 11, "OF");
-  tdesc_add_flag (type, 14, "NT");
-  tdesc_add_flag (type, 16, "RF");
-  tdesc_add_flag (type, 17, "VM");
-  tdesc_add_flag (type, 18, "AC");
-  tdesc_add_flag (type, 19, "VIF");
-  tdesc_add_flag (type, 20, "VIP");
-  tdesc_add_flag (type, 21, "ID");
-
-  tdesc_create_reg (feature, "eax", 0, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ecx", 1, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "edx", 2, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ebx", 3, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "esp", 4, 1, NULL, 32, "data_ptr");
-  tdesc_create_reg (feature, "ebp", 5, 1, NULL, 32, "data_ptr");
-  tdesc_create_reg (feature, "esi", 6, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "edi", 7, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "eip", 8, 1, NULL, 32, "code_ptr");
-  tdesc_create_reg (feature, "eflags", 9, 1, NULL, 32, "i386_eflags");
-  tdesc_create_reg (feature, "cs", 10, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ss", 11, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ds", 12, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "es", 13, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "fs", 14, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "gs", 15, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "st0", 16, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st1", 17, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st2", 18, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st3", 19, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st4", 20, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st5", 21, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st6", 22, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st7", 23, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "fctrl", 24, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fstat", 25, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "ftag", 26, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fiseg", 27, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fioff", 28, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "foseg", 29, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fooff", 30, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fop", 31, 1, "float", 32, "int");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.sse");
-  field_type = tdesc_named_type (feature, "ieee_single");
-  tdesc_create_vector (feature, "v4f", field_type, 4);
-
-  field_type = tdesc_named_type (feature, "ieee_double");
-  tdesc_create_vector (feature, "v2d", field_type, 2);
-
-  field_type = tdesc_named_type (feature, "int8");
-  tdesc_create_vector (feature, "v16i8", field_type, 16);
-
-  field_type = tdesc_named_type (feature, "int16");
-  tdesc_create_vector (feature, "v8i16", field_type, 8);
-
-  field_type = tdesc_named_type (feature, "int32");
-  tdesc_create_vector (feature, "v4i32", field_type, 4);
-
-  field_type = tdesc_named_type (feature, "int64");
-  tdesc_create_vector (feature, "v2i64", field_type, 2);
-
-  type = tdesc_create_union (feature, "vec128");
-  field_type = tdesc_named_type (feature, "v4f");
-  tdesc_add_field (type, "v4_float", field_type);
-  field_type = tdesc_named_type (feature, "v2d");
-  tdesc_add_field (type, "v2_double", field_type);
-  field_type = tdesc_named_type (feature, "v16i8");
-  tdesc_add_field (type, "v16_int8", field_type);
-  field_type = tdesc_named_type (feature, "v8i16");
-  tdesc_add_field (type, "v8_int16", field_type);
-  field_type = tdesc_named_type (feature, "v4i32");
-  tdesc_add_field (type, "v4_int32", field_type);
-  field_type = tdesc_named_type (feature, "v2i64");
-  tdesc_add_field (type, "v2_int64", field_type);
-  field_type = tdesc_named_type (feature, "uint128");
-  tdesc_add_field (type, "uint128", field_type);
-
-  type = tdesc_create_flags (feature, "i386_mxcsr", 4);
-  tdesc_add_flag (type, 0, "IE");
-  tdesc_add_flag (type, 1, "DE");
-  tdesc_add_flag (type, 2, "ZE");
-  tdesc_add_flag (type, 3, "OE");
-  tdesc_add_flag (type, 4, "UE");
-  tdesc_add_flag (type, 5, "PE");
-  tdesc_add_flag (type, 6, "DAZ");
-  tdesc_add_flag (type, 7, "IM");
-  tdesc_add_flag (type, 8, "DM");
-  tdesc_add_flag (type, 9, "ZM");
-  tdesc_add_flag (type, 10, "OM");
-  tdesc_add_flag (type, 11, "UM");
-  tdesc_add_flag (type, 12, "PM");
-  tdesc_add_flag (type, 15, "FZ");
-
-  tdesc_create_reg (feature, "xmm0", 32, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm1", 33, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm2", 34, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm3", 35, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm4", 36, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm5", 37, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm6", 38, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm7", 39, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "mxcsr", 40, 1, "vector", 32, "i386_mxcsr");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.linux");
-  tdesc_create_reg (feature, "orig_eax", 41, 1, NULL, 32, "int");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx");
-  tdesc_create_reg (feature, "ymm0h", 42, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm1h", 43, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm2h", 44, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm3h", 45, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm4h", 46, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm5h", 47, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm6h", 48, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm7h", 49, 1, NULL, 128, "uint128");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.mpx");
-  type = tdesc_create_struct (feature, "br128");
-  field_type = tdesc_named_type (feature, "uint64");
-  tdesc_add_field (type, "lbound", field_type);
-  field_type = tdesc_named_type (feature, "uint64");
-  tdesc_add_field (type, "ubound_raw", field_type);
-
-  type = tdesc_create_struct (feature, "_bndstatus");
-  tdesc_set_struct_size (type, 8);
-  tdesc_add_bitfield (type, "bde", 2, 31);
-  tdesc_add_bitfield (type, "error", 0, 1);
-
-  type = tdesc_create_union (feature, "status");
-  field_type = tdesc_named_type (feature, "data_ptr");
-  tdesc_add_field (type, "raw", field_type);
-  field_type = tdesc_named_type (feature, "_bndstatus");
-  tdesc_add_field (type, "status", field_type);
-
-  type = tdesc_create_struct (feature, "_bndcfgu");
-  tdesc_set_struct_size (type, 8);
-  tdesc_add_bitfield (type, "base", 12, 31);
-  tdesc_add_bitfield (type, "reserved", 2, 11);
-  tdesc_add_bitfield (type, "preserved", 1, 1);
-  tdesc_add_bitfield (type, "enabled", 0, 0);
-
-  type = tdesc_create_union (feature, "cfgu");
-  field_type = tdesc_named_type (feature, "data_ptr");
-  tdesc_add_field (type, "raw", field_type);
-  field_type = tdesc_named_type (feature, "_bndcfgu");
-  tdesc_add_field (type, "config", field_type);
-
-  tdesc_create_reg (feature, "bnd0raw", 50, 1, NULL, 128, "br128");
-  tdesc_create_reg (feature, "bnd1raw", 51, 1, NULL, 128, "br128");
-  tdesc_create_reg (feature, "bnd2raw", 52, 1, NULL, 128, "br128");
-  tdesc_create_reg (feature, "bnd3raw", 53, 1, NULL, 128, "br128");
-  tdesc_create_reg (feature, "bndcfgu", 54, 1, NULL, 64, "cfgu");
-  tdesc_create_reg (feature, "bndstatus", 55, 1, NULL, 64, "status");
-
-  tdesc_i386_avx_mpx_linux = result;
-}
diff --git a/gdb/features/i386/i386-linux.c b/gdb/features/i386/i386-linux.c
deleted file mode 100644
index 0394842..0000000
--- a/gdb/features/i386/i386-linux.c
+++ /dev/null
@@ -1,139 +0,0 @@
-/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
-  Original: i386-linux.xml */
-
-#include "defs.h"
-#include "osabi.h"
-#include "target-descriptions.h"
-
-struct target_desc *tdesc_i386_linux;
-static void
-initialize_tdesc_i386_linux (void)
-{
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("i386"));
-
-  set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
-
-  struct tdesc_feature *feature;
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-  type = tdesc_create_flags (feature, "i386_eflags", 4);
-  tdesc_add_flag (type, 0, "CF");
-  tdesc_add_flag (type, 1, "");
-  tdesc_add_flag (type, 2, "PF");
-  tdesc_add_flag (type, 4, "AF");
-  tdesc_add_flag (type, 6, "ZF");
-  tdesc_add_flag (type, 7, "SF");
-  tdesc_add_flag (type, 8, "TF");
-  tdesc_add_flag (type, 9, "IF");
-  tdesc_add_flag (type, 10, "DF");
-  tdesc_add_flag (type, 11, "OF");
-  tdesc_add_flag (type, 14, "NT");
-  tdesc_add_flag (type, 16, "RF");
-  tdesc_add_flag (type, 17, "VM");
-  tdesc_add_flag (type, 18, "AC");
-  tdesc_add_flag (type, 19, "VIF");
-  tdesc_add_flag (type, 20, "VIP");
-  tdesc_add_flag (type, 21, "ID");
-
-  tdesc_create_reg (feature, "eax", 0, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ecx", 1, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "edx", 2, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ebx", 3, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "esp", 4, 1, NULL, 32, "data_ptr");
-  tdesc_create_reg (feature, "ebp", 5, 1, NULL, 32, "data_ptr");
-  tdesc_create_reg (feature, "esi", 6, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "edi", 7, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "eip", 8, 1, NULL, 32, "code_ptr");
-  tdesc_create_reg (feature, "eflags", 9, 1, NULL, 32, "i386_eflags");
-  tdesc_create_reg (feature, "cs", 10, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ss", 11, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ds", 12, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "es", 13, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "fs", 14, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "gs", 15, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "st0", 16, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st1", 17, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st2", 18, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st3", 19, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st4", 20, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st5", 21, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st6", 22, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st7", 23, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "fctrl", 24, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fstat", 25, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "ftag", 26, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fiseg", 27, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fioff", 28, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "foseg", 29, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fooff", 30, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fop", 31, 1, "float", 32, "int");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.sse");
-  field_type = tdesc_named_type (feature, "ieee_single");
-  tdesc_create_vector (feature, "v4f", field_type, 4);
-
-  field_type = tdesc_named_type (feature, "ieee_double");
-  tdesc_create_vector (feature, "v2d", field_type, 2);
-
-  field_type = tdesc_named_type (feature, "int8");
-  tdesc_create_vector (feature, "v16i8", field_type, 16);
-
-  field_type = tdesc_named_type (feature, "int16");
-  tdesc_create_vector (feature, "v8i16", field_type, 8);
-
-  field_type = tdesc_named_type (feature, "int32");
-  tdesc_create_vector (feature, "v4i32", field_type, 4);
-
-  field_type = tdesc_named_type (feature, "int64");
-  tdesc_create_vector (feature, "v2i64", field_type, 2);
-
-  type = tdesc_create_union (feature, "vec128");
-  field_type = tdesc_named_type (feature, "v4f");
-  tdesc_add_field (type, "v4_float", field_type);
-  field_type = tdesc_named_type (feature, "v2d");
-  tdesc_add_field (type, "v2_double", field_type);
-  field_type = tdesc_named_type (feature, "v16i8");
-  tdesc_add_field (type, "v16_int8", field_type);
-  field_type = tdesc_named_type (feature, "v8i16");
-  tdesc_add_field (type, "v8_int16", field_type);
-  field_type = tdesc_named_type (feature, "v4i32");
-  tdesc_add_field (type, "v4_int32", field_type);
-  field_type = tdesc_named_type (feature, "v2i64");
-  tdesc_add_field (type, "v2_int64", field_type);
-  field_type = tdesc_named_type (feature, "uint128");
-  tdesc_add_field (type, "uint128", field_type);
-
-  type = tdesc_create_flags (feature, "i386_mxcsr", 4);
-  tdesc_add_flag (type, 0, "IE");
-  tdesc_add_flag (type, 1, "DE");
-  tdesc_add_flag (type, 2, "ZE");
-  tdesc_add_flag (type, 3, "OE");
-  tdesc_add_flag (type, 4, "UE");
-  tdesc_add_flag (type, 5, "PE");
-  tdesc_add_flag (type, 6, "DAZ");
-  tdesc_add_flag (type, 7, "IM");
-  tdesc_add_flag (type, 8, "DM");
-  tdesc_add_flag (type, 9, "ZM");
-  tdesc_add_flag (type, 10, "OM");
-  tdesc_add_flag (type, 11, "UM");
-  tdesc_add_flag (type, 12, "PM");
-  tdesc_add_flag (type, 15, "FZ");
-
-  tdesc_create_reg (feature, "xmm0", 32, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm1", 33, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm2", 34, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm3", 35, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm4", 36, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm5", 37, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm6", 38, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm7", 39, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "mxcsr", 40, 1, "vector", 32, "i386_mxcsr");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.linux");
-  tdesc_create_reg (feature, "orig_eax", 41, 1, NULL, 32, "int");
-
-  tdesc_i386_linux = result;
-}
diff --git a/gdb/features/i386/i386-mmx-linux.c b/gdb/features/i386/i386-mmx-linux.c
deleted file mode 100644
index 1577972..0000000
--- a/gdb/features/i386/i386-mmx-linux.c
+++ /dev/null
@@ -1,78 +0,0 @@
-/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
-  Original: i386-mmx-linux.xml */
-
-#include "defs.h"
-#include "osabi.h"
-#include "target-descriptions.h"
-
-struct target_desc *tdesc_i386_mmx_linux;
-static void
-initialize_tdesc_i386_mmx_linux (void)
-{
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("i386"));
-
-  set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
-
-  struct tdesc_feature *feature;
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-  type = tdesc_create_flags (feature, "i386_eflags", 4);
-  tdesc_add_flag (type, 0, "CF");
-  tdesc_add_flag (type, 1, "");
-  tdesc_add_flag (type, 2, "PF");
-  tdesc_add_flag (type, 4, "AF");
-  tdesc_add_flag (type, 6, "ZF");
-  tdesc_add_flag (type, 7, "SF");
-  tdesc_add_flag (type, 8, "TF");
-  tdesc_add_flag (type, 9, "IF");
-  tdesc_add_flag (type, 10, "DF");
-  tdesc_add_flag (type, 11, "OF");
-  tdesc_add_flag (type, 14, "NT");
-  tdesc_add_flag (type, 16, "RF");
-  tdesc_add_flag (type, 17, "VM");
-  tdesc_add_flag (type, 18, "AC");
-  tdesc_add_flag (type, 19, "VIF");
-  tdesc_add_flag (type, 20, "VIP");
-  tdesc_add_flag (type, 21, "ID");
-
-  tdesc_create_reg (feature, "eax", 0, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ecx", 1, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "edx", 2, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ebx", 3, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "esp", 4, 1, NULL, 32, "data_ptr");
-  tdesc_create_reg (feature, "ebp", 5, 1, NULL, 32, "data_ptr");
-  tdesc_create_reg (feature, "esi", 6, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "edi", 7, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "eip", 8, 1, NULL, 32, "code_ptr");
-  tdesc_create_reg (feature, "eflags", 9, 1, NULL, 32, "i386_eflags");
-  tdesc_create_reg (feature, "cs", 10, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ss", 11, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ds", 12, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "es", 13, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "fs", 14, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "gs", 15, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "st0", 16, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st1", 17, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st2", 18, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st3", 19, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st4", 20, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st5", 21, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st6", 22, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st7", 23, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "fctrl", 24, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fstat", 25, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "ftag", 26, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fiseg", 27, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fioff", 28, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "foseg", 29, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fooff", 30, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fop", 31, 1, "float", 32, "int");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.linux");
-  tdesc_create_reg (feature, "orig_eax", 41, 1, NULL, 32, "int");
-
-  tdesc_i386_mmx_linux = result;
-}
diff --git a/gdb/features/i386/i386-mpx-linux.c b/gdb/features/i386/i386-mpx-linux.c
deleted file mode 100644
index 6dea8e0..0000000
--- a/gdb/features/i386/i386-mpx-linux.c
+++ /dev/null
@@ -1,177 +0,0 @@
-/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
-  Original: i386-mpx-linux.xml */
-
-#include "defs.h"
-#include "osabi.h"
-#include "target-descriptions.h"
-
-struct target_desc *tdesc_i386_mpx_linux;
-static void
-initialize_tdesc_i386_mpx_linux (void)
-{
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("i386"));
-
-  set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
-
-  struct tdesc_feature *feature;
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-  type = tdesc_create_flags (feature, "i386_eflags", 4);
-  tdesc_add_flag (type, 0, "CF");
-  tdesc_add_flag (type, 1, "");
-  tdesc_add_flag (type, 2, "PF");
-  tdesc_add_flag (type, 4, "AF");
-  tdesc_add_flag (type, 6, "ZF");
-  tdesc_add_flag (type, 7, "SF");
-  tdesc_add_flag (type, 8, "TF");
-  tdesc_add_flag (type, 9, "IF");
-  tdesc_add_flag (type, 10, "DF");
-  tdesc_add_flag (type, 11, "OF");
-  tdesc_add_flag (type, 14, "NT");
-  tdesc_add_flag (type, 16, "RF");
-  tdesc_add_flag (type, 17, "VM");
-  tdesc_add_flag (type, 18, "AC");
-  tdesc_add_flag (type, 19, "VIF");
-  tdesc_add_flag (type, 20, "VIP");
-  tdesc_add_flag (type, 21, "ID");
-
-  tdesc_create_reg (feature, "eax", 0, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ecx", 1, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "edx", 2, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ebx", 3, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "esp", 4, 1, NULL, 32, "data_ptr");
-  tdesc_create_reg (feature, "ebp", 5, 1, NULL, 32, "data_ptr");
-  tdesc_create_reg (feature, "esi", 6, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "edi", 7, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "eip", 8, 1, NULL, 32, "code_ptr");
-  tdesc_create_reg (feature, "eflags", 9, 1, NULL, 32, "i386_eflags");
-  tdesc_create_reg (feature, "cs", 10, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ss", 11, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ds", 12, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "es", 13, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "fs", 14, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "gs", 15, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "st0", 16, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st1", 17, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st2", 18, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st3", 19, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st4", 20, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st5", 21, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st6", 22, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st7", 23, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "fctrl", 24, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fstat", 25, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "ftag", 26, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fiseg", 27, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fioff", 28, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "foseg", 29, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fooff", 30, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fop", 31, 1, "float", 32, "int");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.sse");
-  field_type = tdesc_named_type (feature, "ieee_single");
-  tdesc_create_vector (feature, "v4f", field_type, 4);
-
-  field_type = tdesc_named_type (feature, "ieee_double");
-  tdesc_create_vector (feature, "v2d", field_type, 2);
-
-  field_type = tdesc_named_type (feature, "int8");
-  tdesc_create_vector (feature, "v16i8", field_type, 16);
-
-  field_type = tdesc_named_type (feature, "int16");
-  tdesc_create_vector (feature, "v8i16", field_type, 8);
-
-  field_type = tdesc_named_type (feature, "int32");
-  tdesc_create_vector (feature, "v4i32", field_type, 4);
-
-  field_type = tdesc_named_type (feature, "int64");
-  tdesc_create_vector (feature, "v2i64", field_type, 2);
-
-  type = tdesc_create_union (feature, "vec128");
-  field_type = tdesc_named_type (feature, "v4f");
-  tdesc_add_field (type, "v4_float", field_type);
-  field_type = tdesc_named_type (feature, "v2d");
-  tdesc_add_field (type, "v2_double", field_type);
-  field_type = tdesc_named_type (feature, "v16i8");
-  tdesc_add_field (type, "v16_int8", field_type);
-  field_type = tdesc_named_type (feature, "v8i16");
-  tdesc_add_field (type, "v8_int16", field_type);
-  field_type = tdesc_named_type (feature, "v4i32");
-  tdesc_add_field (type, "v4_int32", field_type);
-  field_type = tdesc_named_type (feature, "v2i64");
-  tdesc_add_field (type, "v2_int64", field_type);
-  field_type = tdesc_named_type (feature, "uint128");
-  tdesc_add_field (type, "uint128", field_type);
-
-  type = tdesc_create_flags (feature, "i386_mxcsr", 4);
-  tdesc_add_flag (type, 0, "IE");
-  tdesc_add_flag (type, 1, "DE");
-  tdesc_add_flag (type, 2, "ZE");
-  tdesc_add_flag (type, 3, "OE");
-  tdesc_add_flag (type, 4, "UE");
-  tdesc_add_flag (type, 5, "PE");
-  tdesc_add_flag (type, 6, "DAZ");
-  tdesc_add_flag (type, 7, "IM");
-  tdesc_add_flag (type, 8, "DM");
-  tdesc_add_flag (type, 9, "ZM");
-  tdesc_add_flag (type, 10, "OM");
-  tdesc_add_flag (type, 11, "UM");
-  tdesc_add_flag (type, 12, "PM");
-  tdesc_add_flag (type, 15, "FZ");
-
-  tdesc_create_reg (feature, "xmm0", 32, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm1", 33, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm2", 34, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm3", 35, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm4", 36, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm5", 37, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm6", 38, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm7", 39, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "mxcsr", 40, 1, "vector", 32, "i386_mxcsr");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.linux");
-  tdesc_create_reg (feature, "orig_eax", 41, 1, NULL, 32, "int");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.mpx");
-  type = tdesc_create_struct (feature, "br128");
-  field_type = tdesc_named_type (feature, "uint64");
-  tdesc_add_field (type, "lbound", field_type);
-  field_type = tdesc_named_type (feature, "uint64");
-  tdesc_add_field (type, "ubound_raw", field_type);
-
-  type = tdesc_create_struct (feature, "_bndstatus");
-  tdesc_set_struct_size (type, 8);
-  tdesc_add_bitfield (type, "bde", 2, 31);
-  tdesc_add_bitfield (type, "error", 0, 1);
-
-  type = tdesc_create_union (feature, "status");
-  field_type = tdesc_named_type (feature, "data_ptr");
-  tdesc_add_field (type, "raw", field_type);
-  field_type = tdesc_named_type (feature, "_bndstatus");
-  tdesc_add_field (type, "status", field_type);
-
-  type = tdesc_create_struct (feature, "_bndcfgu");
-  tdesc_set_struct_size (type, 8);
-  tdesc_add_bitfield (type, "base", 12, 31);
-  tdesc_add_bitfield (type, "reserved", 2, 11);
-  tdesc_add_bitfield (type, "preserved", 1, 1);
-  tdesc_add_bitfield (type, "enabled", 0, 0);
-
-  type = tdesc_create_union (feature, "cfgu");
-  field_type = tdesc_named_type (feature, "data_ptr");
-  tdesc_add_field (type, "raw", field_type);
-  field_type = tdesc_named_type (feature, "_bndcfgu");
-  tdesc_add_field (type, "config", field_type);
-
-  tdesc_create_reg (feature, "bnd0raw", 42, 1, NULL, 128, "br128");
-  tdesc_create_reg (feature, "bnd1raw", 43, 1, NULL, 128, "br128");
-  tdesc_create_reg (feature, "bnd2raw", 44, 1, NULL, 128, "br128");
-  tdesc_create_reg (feature, "bnd3raw", 45, 1, NULL, 128, "br128");
-  tdesc_create_reg (feature, "bndcfgu", 46, 1, NULL, 64, "cfgu");
-  tdesc_create_reg (feature, "bndstatus", 47, 1, NULL, 64, "status");
-
-  tdesc_i386_mpx_linux = result;
-}
-- 
1.9.1

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

* [PATCH 19/26] [GDBserver] Shorten srv_i386_linux_xmlfiles
  2017-07-10 13:56 [PATCH 00/26 v3] Make GDB builtin target descriptions more flexible Yao Qi
                   ` (22 preceding siblings ...)
  2017-07-10 13:56 ` [PATCH 21/26] Centralize amd64-linux " Yao Qi
@ 2017-07-10 13:56 ` Yao Qi
  2017-07-10 13:56 ` [PATCH 02/26] Class-fy target_desc Yao Qi
                   ` (2 subsequent siblings)
  26 siblings, 0 replies; 30+ messages in thread
From: Yao Qi @ 2017-07-10 13:56 UTC (permalink / raw)
  To: gdb-patches

GDBserver now is able to generate target descriptions from features, so
don't need to remember these target description files.

gdb/gdbserver:

2017-07-07  Yao Qi  <yao.qi@linaro.org>

	* configure.srv (srv_i386_linux_xmlfiles): Remove
	i386/i386-XXX-linux.xml from it.
---
 gdb/gdbserver/configure.srv | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/gdb/gdbserver/configure.srv b/gdb/gdbserver/configure.srv
index fb41ff4..55985d6 100644
--- a/gdb/gdbserver/configure.srv
+++ b/gdb/gdbserver/configure.srv
@@ -42,7 +42,7 @@ srv_i386_32bit_xmlfiles="i386/32bit-core.xml i386/32bit-sse.xml i386/32bit-avx.x
 srv_i386_64bit_xmlfiles="i386/64bit-core.xml i386/64bit-segments.xml i386/64bit-sse.xml i386/64bit-avx.xml i386/64bit-avx512.xml i386/x32-core.xml i386/64bit-mpx.xml i386/64bit-pkeys.xml"
 srv_i386_xmlfiles="i386/i386.xml i386/i386-avx.xml i386/i386-avx-avx512.xml i386/i386-avx-mpx-avx512-pku.xml i386/i386-mpx.xml i386/i386-avx-mpx.xml i386/i386-mmx.xml $srv_i386_32bit_xmlfiles"
 srv_amd64_xmlfiles="i386/amd64.xml i386/amd64-avx.xml i386/amd64-avx-avx512.xml i386/amd64-avx-mpx-avx512-pku.xml i386/x32.xml i386/x32-avx.xml i386/x32-avx-avx512.xml i386/amd64-mpx.xml i386/amd64-avx-mpx.xml  $srv_i386_64bit_xmlfiles"
-srv_i386_linux_xmlfiles="i386/i386-linux.xml i386/i386-avx-linux.xml i386/i386-avx-avx512-linux.xml i386/i386-avx-mpx-avx512-pku-linux.xml i386/i386-mmx-linux.xml i386/32bit-linux.xml i386/i386-mpx-linux.xml i386/i386-avx-mpx-linux.xml $srv_i386_32bit_xmlfiles"
+srv_i386_linux_xmlfiles="i386/32bit-linux.xml $srv_i386_32bit_xmlfiles"
 srv_amd64_linux_xmlfiles="i386/amd64-linux.xml i386/amd64-avx-linux.xml i386/amd64-avx-avx512.xml i386/amd64-avx-mpx-avx512-pku-linux.xml i386/64bit-linux.xml i386/amd64-mpx-linux.xml i386/amd64-avx-mpx-linux.xml i386/x32-linux.xml i386/x32-avx-linux.xml i386/x32-avx-avx512-linux.xml $srv_i386_64bit_xmlfiles"
 
 
-- 
1.9.1

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

* [PATCH 18/26] [GDBserver] Use pre-generated tdesc as test
  2017-07-10 13:56 [PATCH 00/26 v3] Make GDB builtin target descriptions more flexible Yao Qi
                   ` (13 preceding siblings ...)
  2017-07-10 13:56 ` [PATCH 05/26] Use visitor pattern for "maint print c-tdesc" Yao Qi
@ 2017-07-10 13:56 ` Yao Qi
  2017-07-10 13:56 ` [PATCH 15/26] Dynamically composite xml in reply to GDB Yao Qi
                   ` (11 subsequent siblings)
  26 siblings, 0 replies; 30+ messages in thread
From: Yao Qi @ 2017-07-10 13:56 UTC (permalink / raw)
  To: gdb-patches

Now, these *-generate.c files are only used in GDBserver for unit test.
If $development is false (in release), these *-generate.c files won't be
used at all.

gdb/gdbserver:

2017-07-07  Yao Qi  <yao.qi@linaro.org>

	* configure.srv: Set srv_i386_linux_regobj empty if $development
	is false.
	* linux-i386-ipa.c (initialize_low_tracepoint): Don't call
	initialize_low_tdesc.
	* linux-x86-low.c (initialize_low_arch): Wrap initialize_low_tdesc
	with #if initialize_low_tdesc.
	* linux-x86-tdesc-selftest.c: New file.
	* linux-x86-tdesc.c: Move code to linux-x86-tdesc-selftest.c.
---
 gdb/gdbserver/configure.srv              | 11 ++--
 gdb/gdbserver/linux-i386-ipa.c           |  2 -
 gdb/gdbserver/linux-x86-low.c            |  2 +
 gdb/gdbserver/linux-x86-tdesc-selftest.c | 93 ++++++++++++++++++++++++++++++++
 gdb/gdbserver/linux-x86-tdesc.c          | 82 ----------------------------
 5 files changed, 103 insertions(+), 87 deletions(-)
 create mode 100644 gdb/gdbserver/linux-x86-tdesc-selftest.c

diff --git a/gdb/gdbserver/configure.srv b/gdb/gdbserver/configure.srv
index c724fec..fb41ff4 100644
--- a/gdb/gdbserver/configure.srv
+++ b/gdb/gdbserver/configure.srv
@@ -25,11 +25,16 @@
 srv_hostio_err_objs="hostio-errno.o"
 
 srv_i386_regobj="i386.o i386-avx.o i386-avx-avx512.o i386-avx-mpx-avx512-pku.o i386-mpx.o i386-avx-mpx.o i386-mmx.o"
-srv_i386_linux_regobj="i386-linux.o i386-avx-linux.o i386-avx-avx512-linux.o i386-avx-mpx-avx512-pku-linux.o i386-mpx-linux.o i386-avx-mpx-linux.o i386-mmx-linux.o"
+
+if $development; then
+   srv_i386_linux_regobj="i386-linux.o i386-avx-linux.o i386-avx-avx512-linux.o i386-avx-mpx-avx512-pku-linux.o i386-mpx-linux.o i386-avx-mpx-linux.o i386-mmx-linux.o linux-x86-tdesc-selftest.o"
+else
+   srv_i386_linux_regobj=""
+fi
+
 srv_amd64_regobj="amd64.o amd64-avx.o amd64-avx-avx512.o amd64-avx-mpx-avx512-pku.o amd64-mpx.o amd64-avx-mpx.o x32.o x32-avx.o x32-avx-avx512.o"
 srv_amd64_linux_regobj="amd64-linux.o amd64-avx-linux.o amd64-avx-avx512-linux.o amd64-avx-mpx-avx512-pku-linux.o amd64-mpx-linux.o amd64-avx-mpx-linux.o x32-linux.o x32-avx-linux.o x32-avx-avx512-linux.o"
 
-ipa_i386_linux_regobj="i386-linux-ipa.o i386-avx-linux-ipa.o  i386-avx-mpx-linux-ipa.o i386-avx-avx512-linux-ipa.o i386-avx-mpx-avx512-pku-linux-ipa.o i386-mpx-linux-ipa.o i386-mmx-linux-ipa.o"
 ipa_amd64_linux_regobj="amd64-linux-ipa.o amd64-avx-linux-ipa.o amd64-avx-mpx-linux-ipa.o amd64-avx-avx512-linux-ipa.o amd64-avx-mpx-avx512-pku-linux-ipa.o amd64-mpx-linux-ipa.o"
 ipa_ppc_linux_regobj="powerpc-32l-ipa.o powerpc-altivec32l-ipa.o powerpc-cell32l-ipa.o powerpc-vsx32l-ipa.o powerpc-isa205-32l-ipa.o powerpc-isa205-altivec32l-ipa.o powerpc-isa205-vsx32l-ipa.o powerpc-e500l-ipa.o powerpc-64l-ipa.o powerpc-altivec64l-ipa.o powerpc-cell64l-ipa.o powerpc-vsx64l-ipa.o powerpc-isa205-64l-ipa.o powerpc-isa205-altivec64l-ipa.o powerpc-isa205-vsx64l-ipa.o"
 
@@ -130,7 +135,7 @@ case "${target}" in
 			srv_linux_regsets=yes
 			srv_linux_thread_db=yes
 			srv_linux_btrace=yes
-			ipa_obj="${ipa_i386_linux_regobj} linux-i386-ipa.o linux-x86-tdesc-ipa.o"
+			ipa_obj="linux-i386-ipa.o linux-x86-tdesc-ipa.o"
 			ipa_obj="${ipa_obj} i386-ipa.o"
 			;;
   i[34567]86-*-lynxos*)	srv_regobj="i386.o"
diff --git a/gdb/gdbserver/linux-i386-ipa.c b/gdb/gdbserver/linux-i386-ipa.c
index 54608da..785a63e 100644
--- a/gdb/gdbserver/linux-i386-ipa.c
+++ b/gdb/gdbserver/linux-i386-ipa.c
@@ -289,7 +289,5 @@ alloc_jump_pad_buffer (size_t size)
 void
 initialize_low_tracepoint (void)
 {
-  initialize_low_tdesc ();
-
   initialize_fast_tracepoint_trampoline_buffer ();
 }
diff --git a/gdb/gdbserver/linux-x86-low.c b/gdb/gdbserver/linux-x86-low.c
index 24b76a7..54be82f 100644
--- a/gdb/gdbserver/linux-x86-low.c
+++ b/gdb/gdbserver/linux-x86-low.c
@@ -2969,7 +2969,9 @@ initialize_low_arch (void)
   tdesc_amd64_linux_no_xml->xmltarget = xmltarget_amd64_linux_no_xml;
 #endif
 
+#if GDB_SELF_TEST
   initialize_low_tdesc ();
+#endif
 
   tdesc_i386_linux_no_xml = XNEW (struct target_desc);
   copy_target_description (tdesc_i386_linux_no_xml,
diff --git a/gdb/gdbserver/linux-x86-tdesc-selftest.c b/gdb/gdbserver/linux-x86-tdesc-selftest.c
new file mode 100644
index 0000000..dfb566b
--- /dev/null
+++ b/gdb/gdbserver/linux-x86-tdesc-selftest.c
@@ -0,0 +1,93 @@
+/* Copyright (C) 2017 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "server.h"
+#include "linux-x86-tdesc.h"
+#include "tdesc.h"
+#include "common/selftest.h"
+#include "x86-xstate.h"
+
+/* Defined in auto-generated file i386-linux.c.  */
+void init_registers_i386_linux (void);
+extern const struct target_desc *tdesc_i386_linux;
+
+/* Defined in auto-generated file i386-mmx-linux.c.  */
+void init_registers_i386_mmx_linux (void);
+extern const struct target_desc *tdesc_i386_mmx_linux;
+
+/* Defined in auto-generated file i386-avx-linux.c.  */
+void init_registers_i386_avx_linux (void);
+extern const struct target_desc *tdesc_i386_avx_linux;
+
+/* Defined in auto-generated file i386-avx-mpx-linux.c.  */
+void init_registers_i386_avx_mpx_linux (void);
+extern const struct target_desc *tdesc_i386_avx_mpx_linux;
+
+/* Defined in auto-generated file i386-avx-avx512-linux.c.  */
+void init_registers_i386_avx_avx512_linux (void);
+extern const struct target_desc *tdesc_i386_avx_avx512_linux;
+
+/* Defined in auto-generated file i386-avx-mpx-avx512-linux.c.  */
+void init_registers_i386_avx_mpx_avx512_pku_linux (void);
+extern const struct target_desc *tdesc_i386_avx_mpx_avx512_pku_linux;
+
+/* Defined in auto-generated file i386-mpx-linux.c.  */
+void init_registers_i386_mpx_linux (void);
+extern const struct target_desc *tdesc_i386_mpx_linux;
+
+namespace selftests {
+namespace tdesc {
+static void
+i386_tdesc_test ()
+{
+  struct
+  {
+    unsigned int mask;
+    const target_desc *tdesc;
+  } tdesc_tests[] = {
+    { X86_XSTATE_X87, tdesc_i386_mmx_linux },
+    { X86_XSTATE_SSE_MASK, tdesc_i386_linux },
+    { X86_XSTATE_AVX_MASK, tdesc_i386_avx_linux },
+    { X86_XSTATE_MPX_MASK, tdesc_i386_mpx_linux },
+    { X86_XSTATE_AVX_MPX_MASK, tdesc_i386_avx_mpx_linux },
+    { X86_XSTATE_AVX_AVX512_MASK, tdesc_i386_avx_avx512_linux },
+    { X86_XSTATE_AVX_MPX_AVX512_PKU_MASK, tdesc_i386_avx_mpx_avx512_pku_linux }
+  };
+
+  for (auto &elem : tdesc_tests)
+    {
+      const target_desc *tdesc = i386_linux_read_description (elem.mask);
+
+      SELF_CHECK (*tdesc == *elem.tdesc);
+    }
+}
+}
+} // namespace selftests
+
+void
+initialize_low_tdesc ()
+{
+  init_registers_i386_linux ();
+  init_registers_i386_mmx_linux ();
+  init_registers_i386_avx_linux ();
+  init_registers_i386_mpx_linux ();
+  init_registers_i386_avx_mpx_linux ();
+  init_registers_i386_avx_avx512_linux ();
+  init_registers_i386_avx_mpx_avx512_pku_linux ();
+
+  register_self_test (selftests::tdesc::i386_tdesc_test);
+}
diff --git a/gdb/gdbserver/linux-x86-tdesc.c b/gdb/gdbserver/linux-x86-tdesc.c
index fb75ad3..d1e262c 100644
--- a/gdb/gdbserver/linux-x86-tdesc.c
+++ b/gdb/gdbserver/linux-x86-tdesc.c
@@ -23,90 +23,8 @@
 #include "arch/i386.h"
 #include "common/x86-xstate.h"
 
-#if defined __i386__ || !defined IN_PROCESS_AGENT
-
-/* Defined in auto-generated file i386-linux.c.  */
-void init_registers_i386_linux (void);
-extern const struct target_desc *tdesc_i386_linux;
-
-/* Defined in auto-generated file i386-mmx-linux.c.  */
-void init_registers_i386_mmx_linux (void);
-extern const struct target_desc *tdesc_i386_mmx_linux;
-
-/* Defined in auto-generated file i386-avx-linux.c.  */
-void init_registers_i386_avx_linux (void);
-extern const struct target_desc *tdesc_i386_avx_linux;
-
-/* Defined in auto-generated file i386-avx-mpx-linux.c.  */
-void init_registers_i386_avx_mpx_linux (void);
-extern const struct target_desc *tdesc_i386_avx_mpx_linux;
-
-/* Defined in auto-generated file i386-avx-avx512-linux.c.  */
-void init_registers_i386_avx_avx512_linux (void);
-extern const struct target_desc *tdesc_i386_avx_avx512_linux;
-
-/* Defined in auto-generated file i386-avx-mpx-avx512-linux.c.  */
-void init_registers_i386_avx_mpx_avx512_pku_linux (void);
-extern const struct target_desc *tdesc_i386_avx_mpx_avx512_pku_linux;
-
-/* Defined in auto-generated file i386-mpx-linux.c.  */
-void init_registers_i386_mpx_linux (void);
-extern const struct target_desc *tdesc_i386_mpx_linux;
-#endif
-
 static struct target_desc *i386_tdescs[X86_TDESC_LAST] = { };
 
-#if defined GDB_SELF_TEST && !defined IN_PROCESS_AGENT
-#include "selftest.h"
-
-namespace selftests {
-namespace tdesc {
-static void
-i386_tdesc_test ()
-{
-  struct
-  {
-    unsigned int mask;
-    const target_desc *tdesc;
-  } tdesc_tests[] = {
-    { X86_XSTATE_X87, tdesc_i386_mmx_linux },
-    { X86_XSTATE_SSE_MASK, tdesc_i386_linux },
-    { X86_XSTATE_AVX_MASK, tdesc_i386_avx_linux },
-    { X86_XSTATE_MPX_MASK, tdesc_i386_mpx_linux },
-    { X86_XSTATE_AVX_MPX_MASK, tdesc_i386_avx_mpx_linux },
-    { X86_XSTATE_AVX_AVX512_MASK, tdesc_i386_avx_avx512_linux },
-    { X86_XSTATE_AVX_MPX_AVX512_PKU_MASK, tdesc_i386_avx_mpx_avx512_pku_linux }
-  };
-
-  for (auto &elem : tdesc_tests)
-    {
-      const target_desc *tdesc = i386_linux_read_description (elem.mask);
-
-      SELF_CHECK (*tdesc == *elem.tdesc);
-    }
-}
-}
-} // namespace selftests
-#endif /* GDB_SELF_TEST */
-
-void
-initialize_low_tdesc ()
-{
-#if defined __i386__ || !defined IN_PROCESS_AGENT
-  init_registers_i386_linux ();
-  init_registers_i386_mmx_linux ();
-  init_registers_i386_avx_linux ();
-  init_registers_i386_mpx_linux ();
-  init_registers_i386_avx_mpx_linux ();
-  init_registers_i386_avx_avx512_linux ();
-  init_registers_i386_avx_mpx_avx512_pku_linux ();
-
-#if GDB_SELF_TEST && !defined IN_PROCESS_AGENT
-  register_self_test (selftests::tdesc::i386_tdesc_test);
-#endif
-#endif
-}
-
 #if defined __i386__ || !defined IN_PROCESS_AGENT
 
 /* Return the target description according to XCR0.  */
-- 
1.9.1

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

* [PATCH 10/26] Use VEC for target_desc.reg_defs
  2017-07-10 13:56 [PATCH 00/26 v3] Make GDB builtin target descriptions more flexible Yao Qi
                   ` (8 preceding siblings ...)
  2017-07-10 13:56 ` [PATCH 24/26] [GDBserver] Use pre-generated amd64-linux tdesc as test Yao Qi
@ 2017-07-10 13:56 ` Yao Qi
  2017-07-10 13:56 ` [PATCH 17/26] Remove features/i386/i386-*linux.c Yao Qi
                   ` (16 subsequent siblings)
  26 siblings, 0 replies; 30+ messages in thread
From: Yao Qi @ 2017-07-10 13:56 UTC (permalink / raw)
  To: gdb-patches

Nowadays, target_desc.reg_defs is a pointer points to a pre-generated
array, which is not flexible.  This patch changes it from an array
to a VEC so that GDBserver can create target descriptions dynamically
later.  Instead of using pre-generated array, the -generated.c calls
VEC_safe_push to add each register to vector.

Since target_desc.reg_defs is used in IPA, we need to build common/vec.c
for IPA too.

gdb/gdbserver:

2017-05-23  Yao Qi  <yao.qi@linaro.org>

	* Makefile.in (IPA_OBJS): Add vec-ipa.o
	* regcache.c (get_thread_regcache): Use VEC_length.
	(init_register_cache): Likewise.
	(regcache_cpy): Likewise.
	(registers_to_string): Iterate reg_defs via VEC_iterate.
	(find_regno): Likewise.
	(find_register_by_number): Use VEC_index.
	(register_size): Call find_register_by_number.
	(register_data): Call find_register_by_number.
	(supply_regblock): Use VEC_length.
	(regcache_raw_read_unsigned): Likewise.
	* tdesc.c (init_target_desc): Iterate reg_defs via
	VEC_iterate.
	(default_description): Update initializer.
	(copy_target_description): Don't update field num_registers.
	* tdesc.h (struct target_desc) <reg_defs>: Change it to VEC.
	<num_registers>: Remove.

gdb:

2017-05-23  Yao Qi  <yao.qi@linaro.org>

	* regformats/regdat.sh: Update generated code.
---
 gdb/gdbserver/Makefile.in |  1 +
 gdb/gdbserver/regcache.c  | 34 +++++++++++++++++++---------------
 gdb/gdbserver/tdesc.c     | 10 +++++-----
 gdb/gdbserver/tdesc.h     | 11 +++++------
 gdb/regformats/regdat.sh  | 13 +++++++------
 5 files changed, 37 insertions(+), 32 deletions(-)

diff --git a/gdb/gdbserver/Makefile.in b/gdb/gdbserver/Makefile.in
index 4e0080e..89f91aa 100644
--- a/gdb/gdbserver/Makefile.in
+++ b/gdb/gdbserver/Makefile.in
@@ -399,6 +399,7 @@ IPA_OBJS = \
 	tdesc-ipa.o \
 	tracepoint-ipa.o \
 	utils-ipa.o \
+	vec-ipa.o \
 	${IPA_DEPFILES}
 
 IPA_LIB = libinproctrace.so
diff --git a/gdb/gdbserver/regcache.c b/gdb/gdbserver/regcache.c
index 0f16f60..d1bcdc3 100644
--- a/gdb/gdbserver/regcache.c
+++ b/gdb/gdbserver/regcache.c
@@ -54,7 +54,7 @@ get_thread_regcache (struct thread_info *thread, int fetch)
       current_thread = thread;
       /* Invalidate all registers, to prevent stale left-overs.  */
       memset (regcache->register_status, REG_UNAVAILABLE,
-	      regcache->tdesc->num_registers);
+	      VEC_length (tdesc_reg_p, regcache->tdesc->reg_defs));
       fetch_inferior_registers (regcache, -1);
       current_thread = saved_thread;
       regcache->registers_valid = 1;
@@ -145,9 +145,9 @@ init_register_cache (struct regcache *regcache,
 	= (unsigned char *) xcalloc (1, tdesc->registers_size);
       regcache->registers_owned = 1;
       regcache->register_status
-	= (unsigned char *) xmalloc (tdesc->num_registers);
+	= (unsigned char *) xmalloc (VEC_length (tdesc_reg_p, tdesc->reg_defs));
       memset ((void *) regcache->register_status, REG_UNAVAILABLE,
-	      tdesc->num_registers);
+	      VEC_length (tdesc_reg_p, tdesc->reg_defs));
 #else
       gdb_assert_not_reached ("can't allocate memory from the heap");
 #endif
@@ -204,7 +204,7 @@ regcache_cpy (struct regcache *dst, struct regcache *src)
 #ifndef IN_PROCESS_AGENT
   if (dst->register_status != NULL && src->register_status != NULL)
     memcpy (dst->register_status, src->register_status,
-	    src->tdesc->num_registers);
+	    VEC_length (tdesc_reg_p, src->tdesc->reg_defs));
 #endif
   dst->registers_valid = src->registers_valid;
 }
@@ -218,8 +218,9 @@ registers_to_string (struct regcache *regcache, char *buf)
   unsigned char *registers = regcache->registers;
   const struct target_desc *tdesc = regcache->tdesc;
   int i;
+  reg *reg;
 
-  for (i = 0; i < tdesc->num_registers; i++)
+  for (i = 0; VEC_iterate (tdesc_reg_p, tdesc->reg_defs, i, reg); i++)
     {
       if (regcache->register_status[i] == REG_VALID)
 	{
@@ -257,22 +258,23 @@ int
 find_regno (const struct target_desc *tdesc, const char *name)
 {
   int i;
+  reg *reg;
 
-  for (i = 0; i < tdesc->num_registers; i++)
-    if (strcmp (name, tdesc->reg_defs[i].name) == 0)
+  for (i = 0; VEC_iterate (tdesc_reg_p, tdesc->reg_defs, i, reg); i++)
+    if (strcmp (name, reg->name) == 0)
       return i;
   internal_error (__FILE__, __LINE__, "Unknown register %s requested",
 		  name);
 }
 
+#endif
+
 struct reg *
 find_register_by_number (const struct target_desc *tdesc, int n)
 {
-  return &tdesc->reg_defs[n];
+  return VEC_index (tdesc_reg_p, tdesc->reg_defs, n);
 }
 
-#endif
-
 #ifndef IN_PROCESS_AGENT
 static void
 free_register_cache_thread (struct thread_info *thread)
@@ -312,7 +314,7 @@ register_cache_size (const struct target_desc *tdesc)
 int
 register_size (const struct target_desc *tdesc, int n)
 {
-  return tdesc->reg_defs[n].size / 8;
+  return find_register_by_number (tdesc, n)->size / 8;
 }
 
 /* See common/common-regcache.h.  */
@@ -326,7 +328,8 @@ regcache_register_size (const struct regcache *regcache, int n)
 static unsigned char *
 register_data (struct regcache *regcache, int n, int fetch)
 {
-  return regcache->registers + regcache->tdesc->reg_defs[n].offset / 8;
+  return (regcache->registers
+	  + find_register_by_number (regcache->tdesc, n)->offset / 8);
 }
 
 /* Supply register N, whose contents are stored in BUF, to REGCACHE.
@@ -385,7 +388,7 @@ supply_regblock (struct regcache *regcache, const void *buf)
       {
 	int i;
 
-	for (i = 0; i < tdesc->num_registers; i++)
+	for (i = 0; i < VEC_length (tdesc_reg_p, tdesc->reg_defs); i++)
 	  regcache->register_status[i] = REG_VALID;
       }
 #endif
@@ -399,7 +402,7 @@ supply_regblock (struct regcache *regcache, const void *buf)
       {
 	int i;
 
-	for (i = 0; i < tdesc->num_registers; i++)
+	for (i = 0; i < VEC_length (tdesc_reg_p, tdesc->reg_defs); i++)
 	  regcache->register_status[i] = REG_UNAVAILABLE;
       }
 #endif
@@ -431,7 +434,8 @@ regcache_raw_read_unsigned (struct regcache *regcache, int regnum,
   int size;
 
   gdb_assert (regcache != NULL);
-  gdb_assert (regnum >= 0 && regnum < regcache->tdesc->num_registers);
+  gdb_assert (regnum >= 0
+	      && regnum < VEC_length (tdesc_reg_p, regcache->tdesc->reg_defs));
 
   size = register_size (regcache->tdesc, regnum);
 
diff --git a/gdb/gdbserver/tdesc.c b/gdb/gdbserver/tdesc.c
index fdd35197..1b1882e 100644
--- a/gdb/gdbserver/tdesc.c
+++ b/gdb/gdbserver/tdesc.c
@@ -23,12 +23,13 @@ void
 init_target_desc (struct target_desc *tdesc)
 {
   int offset, i;
+  struct reg *reg;
 
   offset = 0;
-  for (i = 0; i < tdesc->num_registers; i++)
+  for (i = 0; VEC_iterate (tdesc_reg_p, tdesc->reg_defs, i, reg); i++)
     {
-      tdesc->reg_defs[i].offset = offset;
-      offset += tdesc->reg_defs[i].size;
+      reg->offset = offset;
+      offset += reg->size;
     }
 
   tdesc->registers_size = offset / 8;
@@ -40,14 +41,13 @@ init_target_desc (struct target_desc *tdesc)
 
 #ifndef IN_PROCESS_AGENT
 
-static const struct target_desc default_description = { 0 };
+static const struct target_desc default_description = { NULL, 0, NULL, NULL };
 
 void
 copy_target_description (struct target_desc *dest,
 			 const struct target_desc *src)
 {
   dest->reg_defs = src->reg_defs;
-  dest->num_registers = src->num_registers;
   dest->expedite_regs = src->expedite_regs;
   dest->registers_size = src->registers_size;
   dest->xmltarget = src->xmltarget;
diff --git a/gdb/gdbserver/tdesc.h b/gdb/gdbserver/tdesc.h
index 0341278..424a2fd 100644
--- a/gdb/gdbserver/tdesc.h
+++ b/gdb/gdbserver/tdesc.h
@@ -21,17 +21,16 @@
 
 struct reg;
 
+typedef struct reg *tdesc_reg_p;
+DEF_VEC_P(tdesc_reg_p);
+
 /* A target description.  */
 
 struct target_desc
 {
-  /* An array of NUM_REGISTERS elements of register definitions that
+  /* A vector of elements of register definitions that
      describe the inferior's register set.  */
-  struct reg *reg_defs;
-
-  /* The number of registers in inferior's register set (and thus in
-     the regcache).  */
-  int num_registers;
+  VEC(tdesc_reg_p) *reg_defs;
 
   /* The register cache size, in bytes.  */
   int registers_size;
diff --git a/gdb/regformats/regdat.sh b/gdb/regformats/regdat.sh
index 2c764cd..236cd93 100755
--- a/gdb/regformats/regdat.sh
+++ b/gdb/regformats/regdat.sh
@@ -131,8 +131,8 @@ do
     echo "{"
     echo "  static struct target_desc tdesc_${name}_s;"
     echo "  struct target_desc *result = &tdesc_${name}_s;"
+    echo "  memset (result, 0, sizeof (*result));"
 
-    echo "static struct reg regs_${name}[] = {"
     continue
   elif test "${type}" = "xmltarget"; then
     xmltarget="${entry}"
@@ -150,13 +150,17 @@ do
     echo "$0: $1 does not specify \`\`name''." 1>&2
     exit 1
   else
-    echo "  { \"${entry}\", ${offset}, ${type} },"
+    echo "  {struct reg *reg = XCNEW (struct reg);"
+    echo "  reg->name = \"${entry}\";"
+    echo "  reg->offset = ${offset};"
+    echo "  reg->size = ${type};"
+    echo "  VEC_safe_push (tdesc_reg_p, result->reg_defs, reg);"
+    echo "  };"
     offset=`expr ${offset} + ${type}`
     i=`expr $i + 1`
   fi
 done
 
-echo "};"
 echo
 echo "static const char *expedite_regs_${name}[] = { \"`echo ${expedite} | sed 's/,/", "/g'`\", 0 };"
 if test "${xmltarget}" = x; then
@@ -178,9 +182,6 @@ fi
 echo
 
 cat <<EOF
-  result->reg_defs = regs_${name};
-  result->num_registers = sizeof (regs_${name}) / sizeof (regs_${name}[0]);
-
 #ifndef IN_PROCESS_AGENT
   result->expedite_regs = expedite_regs_${name};
   result->xmltarget = xmltarget_${name};
-- 
1.9.1

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

* [PATCH 05/26] Use visitor pattern for "maint print c-tdesc"
  2017-07-10 13:56 [PATCH 00/26 v3] Make GDB builtin target descriptions more flexible Yao Qi
                   ` (12 preceding siblings ...)
  2017-07-10 13:56 ` [PATCH 14/26] [GDBserver] unit test to i386_tdesc Yao Qi
@ 2017-07-10 13:56 ` Yao Qi
  2017-07-10 13:56 ` [PATCH 18/26] [GDBserver] Use pre-generated tdesc as test Yao Qi
                   ` (12 subsequent siblings)
  26 siblings, 0 replies; 30+ messages in thread
From: Yao Qi @ 2017-07-10 13:56 UTC (permalink / raw)
  To: gdb-patches

Target description can be modeled as a tree, the target description
is the root node, features are children nodes, registers and types are
grand-children nodes.  So command "maint print c-tdesc" in effect
traverse/visit each node, and print them in c.  This can be
implemented by visitor pattern, this is the first reason.  Secondly,
I want to this command prints c files in a different way for some
specific xml files, but still print c files the same way for the rest
of xml files.  Third, I even want to print xml files from target
descriptions, so that GDBserver can use it to reply GDB's query
qXfer:features:read:target.xml.

gdb:

2017-05-25  Yao Qi  <yao.qi@linaro.org>

	* target-descriptions.c (tdesc_element_visitor): New class.
	(tdesc_element): New class.
	(tdesc_reg): Inherit from tdesc_element.
	(tdesc_reg::accept): New function.
	(tdesc_type): Inherit from tdesc_element.
	(tdesc_type::accept): New function.
	(tdesc_feature): Inherit from tdesc_element.
	(tdesc_feature::accept): New function.
	(target_desc): Inherit from tdesc_element.
	(target_desc::target_desc): New.
	(target_desc::~target_desc): New.
	(target_desc::accept): New.
	(allocate_target_description): Use new.
	(free_target_description): Use delete.
	(print_c_tdesc): New class.
	(maint_print_c_tdesc_cmd): Adjust.

	* features/aarch64.c: Re-generated.
	* features/arc-arcompact.c: Re-generated.
	* features/arc-v2.c: Re-generated.
	* features/arm/arm-with-iwmmxt.c: Re-generated.
	* features/arm/arm-with-m.c: Re-generated.
	* features/arm/arm-with-m-fpa-layout.c: Re-generated.
	* features/arm/arm-with-m-vfp-d16.c: Re-generated.
	* features/arm/arm-with-neon.c: Re-generated.
	* features/arm/arm-with-vfpv2.c: Re-generated.
	* features/arm/arm-with-vfpv3.c: Re-generated.
	* features/i386/amd64-avx-avx512.c: Re-generated.
	* features/i386/amd64-avx-avx512-linux.c: Re-generated.
	* features/i386/amd64-avx.c: Re-generated.
	* features/i386/amd64-avx-linux.c: Re-generated.
	* features/i386/amd64-avx-mpx-avx512-pku.c: Re-generated.
	* features/i386/amd64-avx-mpx-avx512-pku-linux.c: Re-generated.
	* features/i386/amd64-avx-mpx.c: Re-generated.
	* features/i386/amd64-avx-mpx-linux.c: Re-generated.
	* features/i386/amd64.c: Re-generated.
	* features/i386/amd64-linux.c: Re-generated.
	* features/i386/amd64-mpx.c: Re-generated.
	* features/i386/amd64-mpx-linux.c: Re-generated.
	* features/i386/i386-avx-avx512.c: Re-generated.
	* features/i386/i386-avx-avx512-linux.c: Re-generated.
	* features/i386/i386-avx.c: Re-generated.
	* features/i386/i386-avx-linux.c: Re-generated.
	* features/i386/i386-avx-mpx-avx512-pku.c: Re-generated.
	* features/i386/i386-avx-mpx-avx512-pku-linux.c: Re-generated.
	* features/i386/i386-avx-mpx.c: Re-generated.
	* features/i386/i386-avx-mpx-linux.c: Re-generated.
	* features/i386/i386.c: Re-generated.
	* features/i386/i386-linux.c: Re-generated.
	* features/i386/i386-mmx.c: Re-generated.
	* features/i386/i386-mmx-linux.c: Re-generated.
	* features/i386/i386-mpx.c: Re-generated.
	* features/i386/i386-mpx-linux.c: Re-generated.
	* features/i386/x32-avx-avx512.c: Re-generated.
	* features/i386/x32-avx-avx512-linux.c: Re-generated.
	* features/i386/x32-avx.c: Re-generated.
	* features/i386/x32-avx-linux.c: Re-generated.
	* features/i386/x32.c: Re-generated.
	* features/i386/x32-linux.c: Re-generated.
	* features/microblaze.c: Re-generated.
	* features/microblaze-with-stack-protect.c: Re-generated.
	* features/mips64-dsp-linux.c: Re-generated.
	* features/mips64-linux.c: Re-generated.
	* features/mips-dsp-linux.c: Re-generated.
	* features/mips-linux.c: Re-generated.
	* features/nds32.c: Re-generated.
	* features/nios2.c: Re-generated.
	* features/nios2-linux.c: Re-generated.
	* features/rs6000/powerpc-32.c: Re-generated.
	* features/rs6000/powerpc-32l.c: Re-generated.
	* features/rs6000/powerpc-403.c: Re-generated.
	* features/rs6000/powerpc-403gc.c : Re-generated.
	* features/rs6000/powerpc-405.c: Re-generated.
	* features/rs6000/powerpc-505.c: Re-generated.
	* features/rs6000/powerpc-601.c: Re-generated.
	* features/rs6000/powerpc-602.c: Re-generated.
	* features/rs6000/powerpc-603.c: Re-generated.
	* features/rs6000/powerpc-604.c: Re-generated.
	* features/rs6000/powerpc-64.c: Re-generated.
	* features/rs6000/powerpc-64l.c: Re-generated.
	* features/rs6000/powerpc-7400.c: Re-generated.
	* features/rs6000/powerpc-750.c: Re-generated.
	* features/rs6000/powerpc-860.c: Re-generated.
	* features/rs6000/powerpc-altivec32.c: Re-generated.
	* features/rs6000/powerpc-altivec32l.c: Re-generated.
	* features/rs6000/powerpc-altivec64.c: Re-generated.
	* features/rs6000/powerpc-altivec64l.c: Re-generated.
	* features/rs6000/powerpc-cell32l.c: Re-generated.
	* features/rs6000/powerpc-cell64l.c: Re-generated.
	* features/rs6000/powerpc-e500.c: Re-generated.
	* features/rs6000/powerpc-e500l.c: Re-generated.
	* features/rs6000/powerpc-isa205-32l.c: Re-generated.
	* features/rs6000/powerpc-isa205-64l.c: Re-generated.
	* features/rs6000/powerpc-isa205-altivec32l.c: Re-generated.
	* features/rs6000/powerpc-isa205-altivec64l.c: Re-generated.
	* features/rs6000/powerpc-isa205-vsx32l.c: Re-generated.
	* features/rs6000/powerpc-isa205-vsx64l.c: Re-generated.
	* features/rs6000/powerpc-vsx32.c: Re-generated.
	* features/rs6000/powerpc-vsx32l.c: Re-generated.
	* features/rs6000/powerpc-vsx64.c: Re-generated.
	* features/rs6000/powerpc-vsx64l.c: Re-generated.
	* features/rs6000/rs6000.c: Re-generated.
	* features/s390-linux32.c: Re-generated.
	* features/s390-linux32v1.c: Re-generated.
	* features/s390-linux32v2.c: Re-generated.
	* features/s390-linux64.c: Re-generated.
	* features/s390-linux64v1.c: Re-generated.
	* features/s390-linux64v2.c: Re-generated.
	* features/s390-te-linux64.c: Re-generated.
	* features/s390-tevx-linux64.c: Re-generated.
	* features/s390-vx-linux64.c: Re-generated.
	* features/s390x-linux64.c: Re-generated.
	* features/s390x-linux64v1.c: Re-generated.
	* features/s390x-linux64v2.c: Re-generated.
	* features/s390x-te-linux64.c: Re-generated.
	* features/s390x-tevx-linux64.c: Re-generated.
	* features/s390x-vx-linux64.c: Re-generated.
	* features/sparc/sparc32-solaris.c: Re-generated.
	* features/sparc/sparc64-solaris.c: Re-generated.
	* features/tic6x-c62x.c: Re-generated.
	* features/tic6x-c62x-linux.c: Re-generated.
	* features/tic6x-c64x.c: Re-generated.
	* features/tic6x-c64x-linux.c: Re-generated.
	* features/tic6x-c64xp.c: Re-generated.
	* features/tic6x-c64xp-linux.c: Re-generated.
---
 gdb/features/aarch64.c                             |   8 +-
 gdb/features/arc-arcompact.c                       |   8 +-
 gdb/features/arc-v2.c                              |   8 +-
 gdb/features/arm/arm-with-iwmmxt.c                 |   8 +-
 gdb/features/arm/arm-with-m-fpa-layout.c           |   4 +-
 gdb/features/arm/arm-with-m-vfp-d16.c              |   4 +-
 gdb/features/arm/arm-with-m.c                      |   4 +-
 gdb/features/arm/arm-with-neon.c                   |   4 +-
 gdb/features/arm/arm-with-vfpv2.c                  |   4 +-
 gdb/features/arm/arm-with-vfpv3.c                  |   4 +-
 gdb/features/i386/amd64-avx-avx512-linux.c         |   8 +-
 gdb/features/i386/amd64-avx-avx512.c               |   8 +-
 gdb/features/i386/amd64-avx-linux.c                |   8 +-
 gdb/features/i386/amd64-avx-mpx-avx512-pku-linux.c |   8 +-
 gdb/features/i386/amd64-avx-mpx-avx512-pku.c       |   8 +-
 gdb/features/i386/amd64-avx-mpx-linux.c            |   8 +-
 gdb/features/i386/amd64-avx-mpx.c                  |   8 +-
 gdb/features/i386/amd64-avx.c                      |   8 +-
 gdb/features/i386/amd64-linux.c                    |   8 +-
 gdb/features/i386/amd64-mpx-linux.c                |   8 +-
 gdb/features/i386/amd64-mpx.c                      |   8 +-
 gdb/features/i386/amd64.c                          |   8 +-
 gdb/features/i386/i386-avx-avx512-linux.c          |   8 +-
 gdb/features/i386/i386-avx-avx512.c                |   8 +-
 gdb/features/i386/i386-avx-linux.c                 |   8 +-
 gdb/features/i386/i386-avx-mpx-avx512-pku-linux.c  |   8 +-
 gdb/features/i386/i386-avx-mpx-avx512-pku.c        |   8 +-
 gdb/features/i386/i386-avx-mpx-linux.c             |   8 +-
 gdb/features/i386/i386-avx-mpx.c                   |   8 +-
 gdb/features/i386/i386-avx.c                       |   8 +-
 gdb/features/i386/i386-linux.c                     |   8 +-
 gdb/features/i386/i386-mmx-linux.c                 |   8 +-
 gdb/features/i386/i386-mmx.c                       |   8 +-
 gdb/features/i386/i386-mpx-linux.c                 |   8 +-
 gdb/features/i386/i386-mpx.c                       |   8 +-
 gdb/features/i386/i386.c                           |   8 +-
 gdb/features/i386/x32-avx-avx512-linux.c           |   8 +-
 gdb/features/i386/x32-avx-avx512.c                 |   8 +-
 gdb/features/i386/x32-avx-linux.c                  |   8 +-
 gdb/features/i386/x32-avx.c                        |   8 +-
 gdb/features/i386/x32-linux.c                      |   8 +-
 gdb/features/i386/x32.c                            |   8 +-
 gdb/features/mips-dsp-linux.c                      |   4 +-
 gdb/features/mips-linux.c                          |   4 +-
 gdb/features/mips64-dsp-linux.c                    |   4 +-
 gdb/features/mips64-linux.c                        |   4 +-
 gdb/features/nds32.c                               |   4 +-
 gdb/features/nios2-linux.c                         |   4 +-
 gdb/features/nios2.c                               |   4 +-
 gdb/features/rs6000/powerpc-32.c                   |   4 +-
 gdb/features/rs6000/powerpc-32l.c                  |   4 +-
 gdb/features/rs6000/powerpc-64.c                   |   4 +-
 gdb/features/rs6000/powerpc-64l.c                  |   4 +-
 gdb/features/rs6000/powerpc-7400.c                 |   4 +-
 gdb/features/rs6000/powerpc-altivec32.c            |   8 +-
 gdb/features/rs6000/powerpc-altivec32l.c           |   8 +-
 gdb/features/rs6000/powerpc-altivec64.c            |   8 +-
 gdb/features/rs6000/powerpc-altivec64l.c           |   8 +-
 gdb/features/rs6000/powerpc-cell32l.c              |   8 +-
 gdb/features/rs6000/powerpc-cell64l.c              |   8 +-
 gdb/features/rs6000/powerpc-e500.c                 |   4 +-
 gdb/features/rs6000/powerpc-e500l.c                |   4 +-
 gdb/features/rs6000/powerpc-isa205-32l.c           |   4 +-
 gdb/features/rs6000/powerpc-isa205-64l.c           |   4 +-
 gdb/features/rs6000/powerpc-isa205-altivec32l.c    |   8 +-
 gdb/features/rs6000/powerpc-isa205-altivec64l.c    |   8 +-
 gdb/features/rs6000/powerpc-isa205-vsx32l.c        |   8 +-
 gdb/features/rs6000/powerpc-isa205-vsx64l.c        |   8 +-
 gdb/features/rs6000/powerpc-vsx32.c                |   8 +-
 gdb/features/rs6000/powerpc-vsx32l.c               |   8 +-
 gdb/features/rs6000/powerpc-vsx64.c                |   8 +-
 gdb/features/rs6000/powerpc-vsx64l.c               |   8 +-
 gdb/features/rs6000/rs6000.c                       |   4 +-
 gdb/features/s390-linux32.c                        |   4 +-
 gdb/features/s390-linux32v1.c                      |   4 +-
 gdb/features/s390-linux32v2.c                      |   4 +-
 gdb/features/s390-linux64.c                        |   4 +-
 gdb/features/s390-linux64v1.c                      |   4 +-
 gdb/features/s390-linux64v2.c                      |   4 +-
 gdb/features/s390-te-linux64.c                     |   4 +-
 gdb/features/s390-tevx-linux64.c                   |   8 +-
 gdb/features/s390-vx-linux64.c                     |   8 +-
 gdb/features/s390x-linux64.c                       |   4 +-
 gdb/features/s390x-linux64v1.c                     |   4 +-
 gdb/features/s390x-linux64v2.c                     |   4 +-
 gdb/features/s390x-te-linux64.c                    |   4 +-
 gdb/features/s390x-tevx-linux64.c                  |   8 +-
 gdb/features/s390x-vx-linux64.c                    |   8 +-
 gdb/features/tic6x-c62x-linux.c                    |   4 +-
 gdb/features/tic6x-c62x.c                          |   4 +-
 gdb/features/tic6x-c64x-linux.c                    |   4 +-
 gdb/features/tic6x-c64x.c                          |   4 +-
 gdb/features/tic6x-c64xp-linux.c                   |   4 +-
 gdb/features/tic6x-c64xp.c                         |   4 +-
 gdb/target-descriptions.c                          | 602 ++++++++++++---------
 95 files changed, 636 insertions(+), 558 deletions(-)

diff --git a/gdb/features/aarch64.c b/gdb/features/aarch64.c
index e9eaed8..7411cac 100644
--- a/gdb/features/aarch64.c
+++ b/gdb/features/aarch64.c
@@ -10,13 +10,13 @@ static void
 initialize_tdesc_aarch64 (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("aarch64"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.aarch64.core");
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
   type = tdesc_create_flags (feature, "cpsr_flags", 4);
   tdesc_add_flag (type, 0, "SP");
   tdesc_add_flag (type, 1, "");
diff --git a/gdb/features/arc-arcompact.c b/gdb/features/arc-arcompact.c
index a527cc2..ea84a40 100644
--- a/gdb/features/arc-arcompact.c
+++ b/gdb/features/arc-arcompact.c
@@ -10,12 +10,10 @@ static void
 initialize_tdesc_arc_arcompact (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("ARC700"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.arc.core.arcompact");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "int");
@@ -53,6 +51,8 @@ initialize_tdesc_arc_arcompact (void)
   tdesc_create_reg (feature, "pcl", 33, 1, "", 32, "code_ptr");
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.arc.aux-minimal");
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
   type = tdesc_create_flags (feature, "status32_type", 4);
   tdesc_add_flag (type, 0, "H");
   tdesc_add_bitfield (type, "E", 1, 2);
diff --git a/gdb/features/arc-v2.c b/gdb/features/arc-v2.c
index b2bdfb5..1eefc24 100644
--- a/gdb/features/arc-v2.c
+++ b/gdb/features/arc-v2.c
@@ -10,12 +10,10 @@ static void
 initialize_tdesc_arc_v2 (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("ARCv2"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.arc.core.v2");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "int");
@@ -53,6 +51,8 @@ initialize_tdesc_arc_v2 (void)
   tdesc_create_reg (feature, "pcl", 33, 1, "", 32, "code_ptr");
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.arc.aux-minimal");
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
   type = tdesc_create_flags (feature, "status32_type", 4);
   tdesc_add_flag (type, 0, "H");
   tdesc_add_bitfield (type, "E", 1, 4);
diff --git a/gdb/features/arm/arm-with-iwmmxt.c b/gdb/features/arm/arm-with-iwmmxt.c
index 1770e03..5f839a0 100644
--- a/gdb/features/arm/arm-with-iwmmxt.c
+++ b/gdb/features/arm/arm-with-iwmmxt.c
@@ -10,12 +10,10 @@ static void
 initialize_tdesc_arm_with_iwmmxt (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("iwmmxt"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.arm.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "uint32");
@@ -36,6 +34,7 @@ initialize_tdesc_arm_with_iwmmxt (void)
   tdesc_create_reg (feature, "cpsr", 25, 1, NULL, 32, "int");
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.xscale.iwmmxt");
+  struct tdesc_type *field_type;
   field_type = tdesc_named_type (feature, "uint8");
   tdesc_create_vector (feature, "iwmmxt_v8u8", field_type, 8);
 
@@ -45,6 +44,7 @@ initialize_tdesc_arm_with_iwmmxt (void)
   field_type = tdesc_named_type (feature, "uint32");
   tdesc_create_vector (feature, "iwmmxt_v2u32", field_type, 2);
 
+  struct tdesc_type *type;
   type = tdesc_create_union (feature, "iwmmxt_vec64i");
   field_type = tdesc_named_type (feature, "iwmmxt_v8u8");
   tdesc_add_field (type, "u8", field_type);
diff --git a/gdb/features/arm/arm-with-m-fpa-layout.c b/gdb/features/arm/arm-with-m-fpa-layout.c
index f720614..99bebc3 100644
--- a/gdb/features/arm/arm-with-m-fpa-layout.c
+++ b/gdb/features/arm/arm-with-m-fpa-layout.c
@@ -10,10 +10,10 @@ static void
 initialize_tdesc_arm_with_m_fpa_layout (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-
   set_tdesc_architecture (result, bfd_scan_arch ("arm"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.arm.m-profile");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "int");
diff --git a/gdb/features/arm/arm-with-m-vfp-d16.c b/gdb/features/arm/arm-with-m-vfp-d16.c
index 069baac..ab91673 100644
--- a/gdb/features/arm/arm-with-m-vfp-d16.c
+++ b/gdb/features/arm/arm-with-m-vfp-d16.c
@@ -10,10 +10,10 @@ static void
 initialize_tdesc_arm_with_m_vfp_d16 (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-
   set_tdesc_architecture (result, bfd_scan_arch ("arm"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.arm.m-profile");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "int");
diff --git a/gdb/features/arm/arm-with-m.c b/gdb/features/arm/arm-with-m.c
index 64d31bb..619fd72 100644
--- a/gdb/features/arm/arm-with-m.c
+++ b/gdb/features/arm/arm-with-m.c
@@ -10,10 +10,10 @@ static void
 initialize_tdesc_arm_with_m (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-
   set_tdesc_architecture (result, bfd_scan_arch ("arm"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.arm.m-profile");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "int");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "int");
diff --git a/gdb/features/arm/arm-with-neon.c b/gdb/features/arm/arm-with-neon.c
index d365c0f..682ad75 100644
--- a/gdb/features/arm/arm-with-neon.c
+++ b/gdb/features/arm/arm-with-neon.c
@@ -10,10 +10,10 @@ static void
 initialize_tdesc_arm_with_neon (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-
   set_tdesc_architecture (result, bfd_scan_arch ("arm"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.arm.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "uint32");
diff --git a/gdb/features/arm/arm-with-vfpv2.c b/gdb/features/arm/arm-with-vfpv2.c
index 0ebbfef..368256c 100644
--- a/gdb/features/arm/arm-with-vfpv2.c
+++ b/gdb/features/arm/arm-with-vfpv2.c
@@ -10,10 +10,10 @@ static void
 initialize_tdesc_arm_with_vfpv2 (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-
   set_tdesc_architecture (result, bfd_scan_arch ("arm"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.arm.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "uint32");
diff --git a/gdb/features/arm/arm-with-vfpv3.c b/gdb/features/arm/arm-with-vfpv3.c
index e235dfa..ade7c95 100644
--- a/gdb/features/arm/arm-with-vfpv3.c
+++ b/gdb/features/arm/arm-with-vfpv3.c
@@ -10,10 +10,10 @@ static void
 initialize_tdesc_arm_with_vfpv3 (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-
   set_tdesc_architecture (result, bfd_scan_arch ("arm"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.arm.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "uint32");
diff --git a/gdb/features/i386/amd64-avx-avx512-linux.c b/gdb/features/i386/amd64-avx-avx512-linux.c
index 00fbf3a..de58f06 100644
--- a/gdb/features/i386/amd64-avx-avx512-linux.c
+++ b/gdb/features/i386/amd64-avx-avx512-linux.c
@@ -10,15 +10,15 @@ static void
 initialize_tdesc_amd64_avx_avx512_linux (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("i386:x86-64"));
 
   set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
   type = tdesc_create_flags (feature, "i386_eflags", 4);
   tdesc_add_flag (type, 0, "CF");
   tdesc_add_flag (type, 1, "");
diff --git a/gdb/features/i386/amd64-avx-avx512.c b/gdb/features/i386/amd64-avx-avx512.c
index 8a185c1..070bb5c 100644
--- a/gdb/features/i386/amd64-avx-avx512.c
+++ b/gdb/features/i386/amd64-avx-avx512.c
@@ -10,13 +10,13 @@ static void
 initialize_tdesc_amd64_avx_avx512 (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("i386:x86-64"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
   type = tdesc_create_flags (feature, "i386_eflags", 4);
   tdesc_add_flag (type, 0, "CF");
   tdesc_add_flag (type, 1, "");
diff --git a/gdb/features/i386/amd64-avx-linux.c b/gdb/features/i386/amd64-avx-linux.c
index 1d56dbf..00dfd3c 100644
--- a/gdb/features/i386/amd64-avx-linux.c
+++ b/gdb/features/i386/amd64-avx-linux.c
@@ -10,15 +10,15 @@ static void
 initialize_tdesc_amd64_avx_linux (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("i386:x86-64"));
 
   set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
   type = tdesc_create_flags (feature, "i386_eflags", 4);
   tdesc_add_flag (type, 0, "CF");
   tdesc_add_flag (type, 1, "");
diff --git a/gdb/features/i386/amd64-avx-mpx-avx512-pku-linux.c b/gdb/features/i386/amd64-avx-mpx-avx512-pku-linux.c
index 4e4ced7..7fd016f 100644
--- a/gdb/features/i386/amd64-avx-mpx-avx512-pku-linux.c
+++ b/gdb/features/i386/amd64-avx-mpx-avx512-pku-linux.c
@@ -10,15 +10,15 @@ static void
 initialize_tdesc_amd64_avx_mpx_avx512_pku_linux (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("i386:x86-64"));
 
   set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
   type = tdesc_create_flags (feature, "i386_eflags", 4);
   tdesc_add_flag (type, 0, "CF");
   tdesc_add_flag (type, 1, "");
diff --git a/gdb/features/i386/amd64-avx-mpx-avx512-pku.c b/gdb/features/i386/amd64-avx-mpx-avx512-pku.c
index dfe7d77..3e53d5c 100644
--- a/gdb/features/i386/amd64-avx-mpx-avx512-pku.c
+++ b/gdb/features/i386/amd64-avx-mpx-avx512-pku.c
@@ -10,13 +10,13 @@ static void
 initialize_tdesc_amd64_avx_mpx_avx512_pku (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("i386:x86-64"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
   type = tdesc_create_flags (feature, "i386_eflags", 4);
   tdesc_add_flag (type, 0, "CF");
   tdesc_add_flag (type, 1, "");
diff --git a/gdb/features/i386/amd64-avx-mpx-linux.c b/gdb/features/i386/amd64-avx-mpx-linux.c
index 26c1339..5fe1127 100644
--- a/gdb/features/i386/amd64-avx-mpx-linux.c
+++ b/gdb/features/i386/amd64-avx-mpx-linux.c
@@ -10,15 +10,15 @@ static void
 initialize_tdesc_amd64_avx_mpx_linux (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("i386:x86-64"));
 
   set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
   type = tdesc_create_flags (feature, "i386_eflags", 4);
   tdesc_add_flag (type, 0, "CF");
   tdesc_add_flag (type, 1, "");
diff --git a/gdb/features/i386/amd64-avx-mpx.c b/gdb/features/i386/amd64-avx-mpx.c
index ab56f42..2030a81 100644
--- a/gdb/features/i386/amd64-avx-mpx.c
+++ b/gdb/features/i386/amd64-avx-mpx.c
@@ -10,13 +10,13 @@ static void
 initialize_tdesc_amd64_avx_mpx (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("i386:x86-64"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
   type = tdesc_create_flags (feature, "i386_eflags", 4);
   tdesc_add_flag (type, 0, "CF");
   tdesc_add_flag (type, 1, "");
diff --git a/gdb/features/i386/amd64-avx.c b/gdb/features/i386/amd64-avx.c
index 42bd69a..f83b72d 100644
--- a/gdb/features/i386/amd64-avx.c
+++ b/gdb/features/i386/amd64-avx.c
@@ -10,13 +10,13 @@ static void
 initialize_tdesc_amd64_avx (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("i386:x86-64"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
   type = tdesc_create_flags (feature, "i386_eflags", 4);
   tdesc_add_flag (type, 0, "CF");
   tdesc_add_flag (type, 1, "");
diff --git a/gdb/features/i386/amd64-linux.c b/gdb/features/i386/amd64-linux.c
index 0e921ba9..58c4405 100644
--- a/gdb/features/i386/amd64-linux.c
+++ b/gdb/features/i386/amd64-linux.c
@@ -10,15 +10,15 @@ static void
 initialize_tdesc_amd64_linux (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("i386:x86-64"));
 
   set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
   type = tdesc_create_flags (feature, "i386_eflags", 4);
   tdesc_add_flag (type, 0, "CF");
   tdesc_add_flag (type, 1, "");
diff --git a/gdb/features/i386/amd64-mpx-linux.c b/gdb/features/i386/amd64-mpx-linux.c
index e26a74a..dcf92f9 100644
--- a/gdb/features/i386/amd64-mpx-linux.c
+++ b/gdb/features/i386/amd64-mpx-linux.c
@@ -10,15 +10,15 @@ static void
 initialize_tdesc_amd64_mpx_linux (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("i386:x86-64"));
 
   set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
   type = tdesc_create_flags (feature, "i386_eflags", 4);
   tdesc_add_flag (type, 0, "CF");
   tdesc_add_flag (type, 1, "");
diff --git a/gdb/features/i386/amd64-mpx.c b/gdb/features/i386/amd64-mpx.c
index 41f0e78..a5e6545 100644
--- a/gdb/features/i386/amd64-mpx.c
+++ b/gdb/features/i386/amd64-mpx.c
@@ -10,13 +10,13 @@ static void
 initialize_tdesc_amd64_mpx (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("i386:x86-64"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
   type = tdesc_create_flags (feature, "i386_eflags", 4);
   tdesc_add_flag (type, 0, "CF");
   tdesc_add_flag (type, 1, "");
diff --git a/gdb/features/i386/amd64.c b/gdb/features/i386/amd64.c
index b875a9b..c2e625dc 100644
--- a/gdb/features/i386/amd64.c
+++ b/gdb/features/i386/amd64.c
@@ -10,13 +10,13 @@ static void
 initialize_tdesc_amd64 (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("i386:x86-64"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
   type = tdesc_create_flags (feature, "i386_eflags", 4);
   tdesc_add_flag (type, 0, "CF");
   tdesc_add_flag (type, 1, "");
diff --git a/gdb/features/i386/i386-avx-avx512-linux.c b/gdb/features/i386/i386-avx-avx512-linux.c
index 81149d5..545149d 100644
--- a/gdb/features/i386/i386-avx-avx512-linux.c
+++ b/gdb/features/i386/i386-avx-avx512-linux.c
@@ -10,15 +10,15 @@ static void
 initialize_tdesc_i386_avx_avx512_linux (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("i386"));
 
   set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
   type = tdesc_create_flags (feature, "i386_eflags", 4);
   tdesc_add_flag (type, 0, "CF");
   tdesc_add_flag (type, 1, "");
diff --git a/gdb/features/i386/i386-avx-avx512.c b/gdb/features/i386/i386-avx-avx512.c
index 1075ca0..585a0ac 100644
--- a/gdb/features/i386/i386-avx-avx512.c
+++ b/gdb/features/i386/i386-avx-avx512.c
@@ -10,13 +10,13 @@ static void
 initialize_tdesc_i386_avx_avx512 (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("i386"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
   type = tdesc_create_flags (feature, "i386_eflags", 4);
   tdesc_add_flag (type, 0, "CF");
   tdesc_add_flag (type, 1, "");
diff --git a/gdb/features/i386/i386-avx-linux.c b/gdb/features/i386/i386-avx-linux.c
index 4a8c6b5..3ef087d 100644
--- a/gdb/features/i386/i386-avx-linux.c
+++ b/gdb/features/i386/i386-avx-linux.c
@@ -10,15 +10,15 @@ static void
 initialize_tdesc_i386_avx_linux (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("i386"));
 
   set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
   type = tdesc_create_flags (feature, "i386_eflags", 4);
   tdesc_add_flag (type, 0, "CF");
   tdesc_add_flag (type, 1, "");
diff --git a/gdb/features/i386/i386-avx-mpx-avx512-pku-linux.c b/gdb/features/i386/i386-avx-mpx-avx512-pku-linux.c
index f90c834..e6eebf1 100644
--- a/gdb/features/i386/i386-avx-mpx-avx512-pku-linux.c
+++ b/gdb/features/i386/i386-avx-mpx-avx512-pku-linux.c
@@ -10,15 +10,15 @@ static void
 initialize_tdesc_i386_avx_mpx_avx512_pku_linux (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("i386"));
 
   set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
   type = tdesc_create_flags (feature, "i386_eflags", 4);
   tdesc_add_flag (type, 0, "CF");
   tdesc_add_flag (type, 1, "");
diff --git a/gdb/features/i386/i386-avx-mpx-avx512-pku.c b/gdb/features/i386/i386-avx-mpx-avx512-pku.c
index 08d9b4b..d7dd3bb 100644
--- a/gdb/features/i386/i386-avx-mpx-avx512-pku.c
+++ b/gdb/features/i386/i386-avx-mpx-avx512-pku.c
@@ -10,13 +10,13 @@ static void
 initialize_tdesc_i386_avx_mpx_avx512_pku (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("i386"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
   type = tdesc_create_flags (feature, "i386_eflags", 4);
   tdesc_add_flag (type, 0, "CF");
   tdesc_add_flag (type, 1, "");
diff --git a/gdb/features/i386/i386-avx-mpx-linux.c b/gdb/features/i386/i386-avx-mpx-linux.c
index 4b27bfc..f62c487 100644
--- a/gdb/features/i386/i386-avx-mpx-linux.c
+++ b/gdb/features/i386/i386-avx-mpx-linux.c
@@ -10,15 +10,15 @@ static void
 initialize_tdesc_i386_avx_mpx_linux (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("i386"));
 
   set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
   type = tdesc_create_flags (feature, "i386_eflags", 4);
   tdesc_add_flag (type, 0, "CF");
   tdesc_add_flag (type, 1, "");
diff --git a/gdb/features/i386/i386-avx-mpx.c b/gdb/features/i386/i386-avx-mpx.c
index b27b40a..f479bda 100644
--- a/gdb/features/i386/i386-avx-mpx.c
+++ b/gdb/features/i386/i386-avx-mpx.c
@@ -10,13 +10,13 @@ static void
 initialize_tdesc_i386_avx_mpx (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("i386"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
   type = tdesc_create_flags (feature, "i386_eflags", 4);
   tdesc_add_flag (type, 0, "CF");
   tdesc_add_flag (type, 1, "");
diff --git a/gdb/features/i386/i386-avx.c b/gdb/features/i386/i386-avx.c
index 1cb0f9e..f888335 100644
--- a/gdb/features/i386/i386-avx.c
+++ b/gdb/features/i386/i386-avx.c
@@ -10,13 +10,13 @@ static void
 initialize_tdesc_i386_avx (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("i386"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
   type = tdesc_create_flags (feature, "i386_eflags", 4);
   tdesc_add_flag (type, 0, "CF");
   tdesc_add_flag (type, 1, "");
diff --git a/gdb/features/i386/i386-linux.c b/gdb/features/i386/i386-linux.c
index c7796c3..0394842 100644
--- a/gdb/features/i386/i386-linux.c
+++ b/gdb/features/i386/i386-linux.c
@@ -10,15 +10,15 @@ static void
 initialize_tdesc_i386_linux (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("i386"));
 
   set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
   type = tdesc_create_flags (feature, "i386_eflags", 4);
   tdesc_add_flag (type, 0, "CF");
   tdesc_add_flag (type, 1, "");
diff --git a/gdb/features/i386/i386-mmx-linux.c b/gdb/features/i386/i386-mmx-linux.c
index e53b55f..1577972 100644
--- a/gdb/features/i386/i386-mmx-linux.c
+++ b/gdb/features/i386/i386-mmx-linux.c
@@ -10,15 +10,15 @@ static void
 initialize_tdesc_i386_mmx_linux (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("i386"));
 
   set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
   type = tdesc_create_flags (feature, "i386_eflags", 4);
   tdesc_add_flag (type, 0, "CF");
   tdesc_add_flag (type, 1, "");
diff --git a/gdb/features/i386/i386-mmx.c b/gdb/features/i386/i386-mmx.c
index 74f67ed..02aee89 100644
--- a/gdb/features/i386/i386-mmx.c
+++ b/gdb/features/i386/i386-mmx.c
@@ -10,13 +10,13 @@ static void
 initialize_tdesc_i386_mmx (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("i386"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
   type = tdesc_create_flags (feature, "i386_eflags", 4);
   tdesc_add_flag (type, 0, "CF");
   tdesc_add_flag (type, 1, "");
diff --git a/gdb/features/i386/i386-mpx-linux.c b/gdb/features/i386/i386-mpx-linux.c
index 43ea192..6dea8e0 100644
--- a/gdb/features/i386/i386-mpx-linux.c
+++ b/gdb/features/i386/i386-mpx-linux.c
@@ -10,15 +10,15 @@ static void
 initialize_tdesc_i386_mpx_linux (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("i386"));
 
   set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
   type = tdesc_create_flags (feature, "i386_eflags", 4);
   tdesc_add_flag (type, 0, "CF");
   tdesc_add_flag (type, 1, "");
diff --git a/gdb/features/i386/i386-mpx.c b/gdb/features/i386/i386-mpx.c
index e832d2e..d08441b 100644
--- a/gdb/features/i386/i386-mpx.c
+++ b/gdb/features/i386/i386-mpx.c
@@ -10,13 +10,13 @@ static void
 initialize_tdesc_i386_mpx (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("i386"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
   type = tdesc_create_flags (feature, "i386_eflags", 4);
   tdesc_add_flag (type, 0, "CF");
   tdesc_add_flag (type, 1, "");
diff --git a/gdb/features/i386/i386.c b/gdb/features/i386/i386.c
index ede73fc..eb9a266 100644
--- a/gdb/features/i386/i386.c
+++ b/gdb/features/i386/i386.c
@@ -10,13 +10,13 @@ static void
 initialize_tdesc_i386 (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("i386"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
   type = tdesc_create_flags (feature, "i386_eflags", 4);
   tdesc_add_flag (type, 0, "CF");
   tdesc_add_flag (type, 1, "");
diff --git a/gdb/features/i386/x32-avx-avx512-linux.c b/gdb/features/i386/x32-avx-avx512-linux.c
index 0467d87..c023a10 100644
--- a/gdb/features/i386/x32-avx-avx512-linux.c
+++ b/gdb/features/i386/x32-avx-avx512-linux.c
@@ -10,15 +10,15 @@ static void
 initialize_tdesc_x32_avx_avx512_linux (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("i386:x64-32"));
 
   set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
   type = tdesc_create_flags (feature, "i386_eflags", 4);
   tdesc_add_flag (type, 0, "CF");
   tdesc_add_flag (type, 1, "");
diff --git a/gdb/features/i386/x32-avx-avx512.c b/gdb/features/i386/x32-avx-avx512.c
index a7a2d52..9630c99 100644
--- a/gdb/features/i386/x32-avx-avx512.c
+++ b/gdb/features/i386/x32-avx-avx512.c
@@ -10,13 +10,13 @@ static void
 initialize_tdesc_x32_avx_avx512 (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("i386:x64-32"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
   type = tdesc_create_flags (feature, "i386_eflags", 4);
   tdesc_add_flag (type, 0, "CF");
   tdesc_add_flag (type, 1, "");
diff --git a/gdb/features/i386/x32-avx-linux.c b/gdb/features/i386/x32-avx-linux.c
index 8406815..211d138 100644
--- a/gdb/features/i386/x32-avx-linux.c
+++ b/gdb/features/i386/x32-avx-linux.c
@@ -10,15 +10,15 @@ static void
 initialize_tdesc_x32_avx_linux (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("i386:x64-32"));
 
   set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
   type = tdesc_create_flags (feature, "i386_eflags", 4);
   tdesc_add_flag (type, 0, "CF");
   tdesc_add_flag (type, 1, "");
diff --git a/gdb/features/i386/x32-avx.c b/gdb/features/i386/x32-avx.c
index 7f62e8f..775e834 100644
--- a/gdb/features/i386/x32-avx.c
+++ b/gdb/features/i386/x32-avx.c
@@ -10,13 +10,13 @@ static void
 initialize_tdesc_x32_avx (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("i386:x64-32"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
   type = tdesc_create_flags (feature, "i386_eflags", 4);
   tdesc_add_flag (type, 0, "CF");
   tdesc_add_flag (type, 1, "");
diff --git a/gdb/features/i386/x32-linux.c b/gdb/features/i386/x32-linux.c
index ae49549..05d502b 100644
--- a/gdb/features/i386/x32-linux.c
+++ b/gdb/features/i386/x32-linux.c
@@ -10,15 +10,15 @@ static void
 initialize_tdesc_x32_linux (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("i386:x64-32"));
 
   set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
   type = tdesc_create_flags (feature, "i386_eflags", 4);
   tdesc_add_flag (type, 0, "CF");
   tdesc_add_flag (type, 1, "");
diff --git a/gdb/features/i386/x32.c b/gdb/features/i386/x32.c
index 6005d99..728b5ce 100644
--- a/gdb/features/i386/x32.c
+++ b/gdb/features/i386/x32.c
@@ -10,13 +10,13 @@ static void
 initialize_tdesc_x32 (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("i386:x64-32"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
   type = tdesc_create_flags (feature, "i386_eflags", 4);
   tdesc_add_flag (type, 0, "CF");
   tdesc_add_flag (type, 1, "");
diff --git a/gdb/features/mips-dsp-linux.c b/gdb/features/mips-dsp-linux.c
index 80ceb22..26e9c6b 100644
--- a/gdb/features/mips-dsp-linux.c
+++ b/gdb/features/mips-dsp-linux.c
@@ -10,12 +10,12 @@ static void
 initialize_tdesc_mips_dsp_linux (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-
   set_tdesc_architecture (result, bfd_scan_arch ("mips"));
 
   set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "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");
diff --git a/gdb/features/mips-linux.c b/gdb/features/mips-linux.c
index c990119..c9ad3ca 100644
--- a/gdb/features/mips-linux.c
+++ b/gdb/features/mips-linux.c
@@ -10,12 +10,12 @@ static void
 initialize_tdesc_mips_linux (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-
   set_tdesc_architecture (result, bfd_scan_arch ("mips"));
 
   set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "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");
diff --git a/gdb/features/mips64-dsp-linux.c b/gdb/features/mips64-dsp-linux.c
index bc09078..05317b7 100644
--- a/gdb/features/mips64-dsp-linux.c
+++ b/gdb/features/mips64-dsp-linux.c
@@ -10,10 +10,10 @@ static void
 initialize_tdesc_mips64_dsp_linux (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-
   set_tdesc_architecture (result, bfd_scan_arch ("mips"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "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");
diff --git a/gdb/features/mips64-linux.c b/gdb/features/mips64-linux.c
index 2ecda9b..4814152 100644
--- a/gdb/features/mips64-linux.c
+++ b/gdb/features/mips64-linux.c
@@ -10,10 +10,10 @@ static void
 initialize_tdesc_mips64_linux (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-
   set_tdesc_architecture (result, bfd_scan_arch ("mips"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "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");
diff --git a/gdb/features/nds32.c b/gdb/features/nds32.c
index 21f63f5..89b246b 100644
--- a/gdb/features/nds32.c
+++ b/gdb/features/nds32.c
@@ -10,10 +10,10 @@ static void
 initialize_tdesc_nds32 (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-
   set_tdesc_architecture (result, bfd_scan_arch ("n1h"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "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");
diff --git a/gdb/features/nios2-linux.c b/gdb/features/nios2-linux.c
index 3288f79..0368567 100644
--- a/gdb/features/nios2-linux.c
+++ b/gdb/features/nios2-linux.c
@@ -10,12 +10,12 @@ static void
 initialize_tdesc_nios2_linux (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-
   set_tdesc_architecture (result, bfd_scan_arch ("nios2"));
 
   set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "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");
diff --git a/gdb/features/nios2.c b/gdb/features/nios2.c
index 0cedc12..705f499 100644
--- a/gdb/features/nios2.c
+++ b/gdb/features/nios2.c
@@ -10,10 +10,10 @@ static void
 initialize_tdesc_nios2 (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-
   set_tdesc_architecture (result, bfd_scan_arch ("nios2"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "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");
diff --git a/gdb/features/rs6000/powerpc-32.c b/gdb/features/rs6000/powerpc-32.c
index 5ee5d9c..39f5b14 100644
--- a/gdb/features/rs6000/powerpc-32.c
+++ b/gdb/features/rs6000/powerpc-32.c
@@ -10,10 +10,10 @@ static void
 initialize_tdesc_powerpc_32 (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "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");
diff --git a/gdb/features/rs6000/powerpc-32l.c b/gdb/features/rs6000/powerpc-32l.c
index 971fd4b..8089c04 100644
--- a/gdb/features/rs6000/powerpc-32l.c
+++ b/gdb/features/rs6000/powerpc-32l.c
@@ -10,10 +10,10 @@ static void
 initialize_tdesc_powerpc_32l (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "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");
diff --git a/gdb/features/rs6000/powerpc-64.c b/gdb/features/rs6000/powerpc-64.c
index 160d122..a9760a3 100644
--- a/gdb/features/rs6000/powerpc-64.c
+++ b/gdb/features/rs6000/powerpc-64.c
@@ -10,10 +10,10 @@ static void
 initialize_tdesc_powerpc_64 (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "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");
diff --git a/gdb/features/rs6000/powerpc-64l.c b/gdb/features/rs6000/powerpc-64l.c
index 16a766e..408794e 100644
--- a/gdb/features/rs6000/powerpc-64l.c
+++ b/gdb/features/rs6000/powerpc-64l.c
@@ -10,10 +10,10 @@ static void
 initialize_tdesc_powerpc_64l (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "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");
diff --git a/gdb/features/rs6000/powerpc-7400.c b/gdb/features/rs6000/powerpc-7400.c
index 69d20c4..32b6995 100644
--- a/gdb/features/rs6000/powerpc-7400.c
+++ b/gdb/features/rs6000/powerpc-7400.c
@@ -11,8 +11,6 @@ initialize_tdesc_powerpc_7400 (void)
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
@@ -140,6 +138,7 @@ initialize_tdesc_powerpc_7400 (void)
   tdesc_create_reg (feature, "ear", 118, 1, NULL, 32, "int");
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
+  struct tdesc_type *field_type;
   field_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", field_type, 4);
 
@@ -152,6 +151,7 @@ initialize_tdesc_powerpc_7400 (void)
   field_type = tdesc_named_type (feature, "int8");
   tdesc_create_vector (feature, "v16i8", field_type, 16);
 
+  struct tdesc_type *type;
   type = tdesc_create_union (feature, "vec128");
   field_type = tdesc_named_type (feature, "uint128");
   tdesc_add_field (type, "uint128", field_type);
diff --git a/gdb/features/rs6000/powerpc-altivec32.c b/gdb/features/rs6000/powerpc-altivec32.c
index 285e87d..e97132e 100644
--- a/gdb/features/rs6000/powerpc-altivec32.c
+++ b/gdb/features/rs6000/powerpc-altivec32.c
@@ -10,12 +10,10 @@ static void
 initialize_tdesc_powerpc_altivec32 (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "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");
@@ -92,6 +90,7 @@ initialize_tdesc_powerpc_altivec32 (void)
   tdesc_create_reg (feature, "fpscr", 70, 1, "float", 32, "int");
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
+  struct tdesc_type *field_type;
   field_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", field_type, 4);
 
@@ -104,6 +103,7 @@ initialize_tdesc_powerpc_altivec32 (void)
   field_type = tdesc_named_type (feature, "int8");
   tdesc_create_vector (feature, "v16i8", field_type, 16);
 
+  struct tdesc_type *type;
   type = tdesc_create_union (feature, "vec128");
   field_type = tdesc_named_type (feature, "uint128");
   tdesc_add_field (type, "uint128", field_type);
diff --git a/gdb/features/rs6000/powerpc-altivec32l.c b/gdb/features/rs6000/powerpc-altivec32l.c
index 447ed47..a9445d9 100644
--- a/gdb/features/rs6000/powerpc-altivec32l.c
+++ b/gdb/features/rs6000/powerpc-altivec32l.c
@@ -10,12 +10,10 @@ static void
 initialize_tdesc_powerpc_altivec32l (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "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");
@@ -96,6 +94,7 @@ initialize_tdesc_powerpc_altivec32l (void)
   tdesc_create_reg (feature, "trap", 72, 1, NULL, 32, "int");
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
+  struct tdesc_type *field_type;
   field_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", field_type, 4);
 
@@ -108,6 +107,7 @@ initialize_tdesc_powerpc_altivec32l (void)
   field_type = tdesc_named_type (feature, "int8");
   tdesc_create_vector (feature, "v16i8", field_type, 16);
 
+  struct tdesc_type *type;
   type = tdesc_create_union (feature, "vec128");
   field_type = tdesc_named_type (feature, "uint128");
   tdesc_add_field (type, "uint128", field_type);
diff --git a/gdb/features/rs6000/powerpc-altivec64.c b/gdb/features/rs6000/powerpc-altivec64.c
index 1e9a61d..3b626a9 100644
--- a/gdb/features/rs6000/powerpc-altivec64.c
+++ b/gdb/features/rs6000/powerpc-altivec64.c
@@ -10,12 +10,10 @@ static void
 initialize_tdesc_powerpc_altivec64 (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "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");
@@ -92,6 +90,7 @@ initialize_tdesc_powerpc_altivec64 (void)
   tdesc_create_reg (feature, "fpscr", 70, 1, "float", 32, "int");
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
+  struct tdesc_type *field_type;
   field_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", field_type, 4);
 
@@ -104,6 +103,7 @@ initialize_tdesc_powerpc_altivec64 (void)
   field_type = tdesc_named_type (feature, "int8");
   tdesc_create_vector (feature, "v16i8", field_type, 16);
 
+  struct tdesc_type *type;
   type = tdesc_create_union (feature, "vec128");
   field_type = tdesc_named_type (feature, "uint128");
   tdesc_add_field (type, "uint128", field_type);
diff --git a/gdb/features/rs6000/powerpc-altivec64l.c b/gdb/features/rs6000/powerpc-altivec64l.c
index 10ecd8a..cca5353 100644
--- a/gdb/features/rs6000/powerpc-altivec64l.c
+++ b/gdb/features/rs6000/powerpc-altivec64l.c
@@ -10,12 +10,10 @@ static void
 initialize_tdesc_powerpc_altivec64l (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "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");
@@ -96,6 +94,7 @@ initialize_tdesc_powerpc_altivec64l (void)
   tdesc_create_reg (feature, "trap", 72, 1, NULL, 64, "int");
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
+  struct tdesc_type *field_type;
   field_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", field_type, 4);
 
@@ -108,6 +107,7 @@ initialize_tdesc_powerpc_altivec64l (void)
   field_type = tdesc_named_type (feature, "int8");
   tdesc_create_vector (feature, "v16i8", field_type, 16);
 
+  struct tdesc_type *type;
   type = tdesc_create_union (feature, "vec128");
   field_type = tdesc_named_type (feature, "uint128");
   tdesc_add_field (type, "uint128", field_type);
diff --git a/gdb/features/rs6000/powerpc-cell32l.c b/gdb/features/rs6000/powerpc-cell32l.c
index 7d33dc2..c615b8d 100644
--- a/gdb/features/rs6000/powerpc-cell32l.c
+++ b/gdb/features/rs6000/powerpc-cell32l.c
@@ -10,14 +10,12 @@ static void
 initialize_tdesc_powerpc_cell32l (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
 
   tdesc_add_compatible (result, bfd_scan_arch ("spu:256K"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "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");
@@ -98,6 +96,7 @@ initialize_tdesc_powerpc_cell32l (void)
   tdesc_create_reg (feature, "trap", 72, 1, NULL, 32, "int");
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
+  struct tdesc_type *field_type;
   field_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", field_type, 4);
 
@@ -110,6 +109,7 @@ initialize_tdesc_powerpc_cell32l (void)
   field_type = tdesc_named_type (feature, "int8");
   tdesc_create_vector (feature, "v16i8", field_type, 16);
 
+  struct tdesc_type *type;
   type = tdesc_create_union (feature, "vec128");
   field_type = tdesc_named_type (feature, "uint128");
   tdesc_add_field (type, "uint128", field_type);
diff --git a/gdb/features/rs6000/powerpc-cell64l.c b/gdb/features/rs6000/powerpc-cell64l.c
index 6054c26..5040e5e 100644
--- a/gdb/features/rs6000/powerpc-cell64l.c
+++ b/gdb/features/rs6000/powerpc-cell64l.c
@@ -10,14 +10,12 @@ static void
 initialize_tdesc_powerpc_cell64l (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
 
   tdesc_add_compatible (result, bfd_scan_arch ("spu:256K"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "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");
@@ -98,6 +96,7 @@ initialize_tdesc_powerpc_cell64l (void)
   tdesc_create_reg (feature, "trap", 72, 1, NULL, 64, "int");
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
+  struct tdesc_type *field_type;
   field_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", field_type, 4);
 
@@ -110,6 +109,7 @@ initialize_tdesc_powerpc_cell64l (void)
   field_type = tdesc_named_type (feature, "int8");
   tdesc_create_vector (feature, "v16i8", field_type, 16);
 
+  struct tdesc_type *type;
   type = tdesc_create_union (feature, "vec128");
   field_type = tdesc_named_type (feature, "uint128");
   tdesc_add_field (type, "uint128", field_type);
diff --git a/gdb/features/rs6000/powerpc-e500.c b/gdb/features/rs6000/powerpc-e500.c
index aaca3a7..4466bc7 100644
--- a/gdb/features/rs6000/powerpc-e500.c
+++ b/gdb/features/rs6000/powerpc-e500.c
@@ -10,10 +10,10 @@ static void
 initialize_tdesc_powerpc_e500 (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:e500"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "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");
diff --git a/gdb/features/rs6000/powerpc-e500l.c b/gdb/features/rs6000/powerpc-e500l.c
index de03862..61acbf3 100644
--- a/gdb/features/rs6000/powerpc-e500l.c
+++ b/gdb/features/rs6000/powerpc-e500l.c
@@ -10,10 +10,10 @@ static void
 initialize_tdesc_powerpc_e500l (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:e500"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "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");
diff --git a/gdb/features/rs6000/powerpc-isa205-32l.c b/gdb/features/rs6000/powerpc-isa205-32l.c
index 1b5bd6d..de6548f 100644
--- a/gdb/features/rs6000/powerpc-isa205-32l.c
+++ b/gdb/features/rs6000/powerpc-isa205-32l.c
@@ -10,10 +10,10 @@ static void
 initialize_tdesc_powerpc_isa205_32l (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "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");
diff --git a/gdb/features/rs6000/powerpc-isa205-64l.c b/gdb/features/rs6000/powerpc-isa205-64l.c
index 31bfc87..cd3b2c1 100644
--- a/gdb/features/rs6000/powerpc-isa205-64l.c
+++ b/gdb/features/rs6000/powerpc-isa205-64l.c
@@ -10,10 +10,10 @@ static void
 initialize_tdesc_powerpc_isa205_64l (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "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");
diff --git a/gdb/features/rs6000/powerpc-isa205-altivec32l.c b/gdb/features/rs6000/powerpc-isa205-altivec32l.c
index 6c216ce..943d02d 100644
--- a/gdb/features/rs6000/powerpc-isa205-altivec32l.c
+++ b/gdb/features/rs6000/powerpc-isa205-altivec32l.c
@@ -10,12 +10,10 @@ static void
 initialize_tdesc_powerpc_isa205_altivec32l (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "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");
@@ -96,6 +94,7 @@ initialize_tdesc_powerpc_isa205_altivec32l (void)
   tdesc_create_reg (feature, "trap", 72, 1, NULL, 32, "int");
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
+  struct tdesc_type *field_type;
   field_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", field_type, 4);
 
@@ -108,6 +107,7 @@ initialize_tdesc_powerpc_isa205_altivec32l (void)
   field_type = tdesc_named_type (feature, "int8");
   tdesc_create_vector (feature, "v16i8", field_type, 16);
 
+  struct tdesc_type *type;
   type = tdesc_create_union (feature, "vec128");
   field_type = tdesc_named_type (feature, "uint128");
   tdesc_add_field (type, "uint128", field_type);
diff --git a/gdb/features/rs6000/powerpc-isa205-altivec64l.c b/gdb/features/rs6000/powerpc-isa205-altivec64l.c
index 2c206aa..d454bac 100644
--- a/gdb/features/rs6000/powerpc-isa205-altivec64l.c
+++ b/gdb/features/rs6000/powerpc-isa205-altivec64l.c
@@ -10,12 +10,10 @@ static void
 initialize_tdesc_powerpc_isa205_altivec64l (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "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");
@@ -96,6 +94,7 @@ initialize_tdesc_powerpc_isa205_altivec64l (void)
   tdesc_create_reg (feature, "trap", 72, 1, NULL, 64, "int");
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
+  struct tdesc_type *field_type;
   field_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", field_type, 4);
 
@@ -108,6 +107,7 @@ initialize_tdesc_powerpc_isa205_altivec64l (void)
   field_type = tdesc_named_type (feature, "int8");
   tdesc_create_vector (feature, "v16i8", field_type, 16);
 
+  struct tdesc_type *type;
   type = tdesc_create_union (feature, "vec128");
   field_type = tdesc_named_type (feature, "uint128");
   tdesc_add_field (type, "uint128", field_type);
diff --git a/gdb/features/rs6000/powerpc-isa205-vsx32l.c b/gdb/features/rs6000/powerpc-isa205-vsx32l.c
index 4659ce1..09fd5ce 100644
--- a/gdb/features/rs6000/powerpc-isa205-vsx32l.c
+++ b/gdb/features/rs6000/powerpc-isa205-vsx32l.c
@@ -10,12 +10,10 @@ static void
 initialize_tdesc_powerpc_isa205_vsx32l (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "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");
@@ -96,6 +94,7 @@ initialize_tdesc_powerpc_isa205_vsx32l (void)
   tdesc_create_reg (feature, "trap", 72, 1, NULL, 32, "int");
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
+  struct tdesc_type *field_type;
   field_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", field_type, 4);
 
@@ -108,6 +107,7 @@ initialize_tdesc_powerpc_isa205_vsx32l (void)
   field_type = tdesc_named_type (feature, "int8");
   tdesc_create_vector (feature, "v16i8", field_type, 16);
 
+  struct tdesc_type *type;
   type = tdesc_create_union (feature, "vec128");
   field_type = tdesc_named_type (feature, "uint128");
   tdesc_add_field (type, "uint128", field_type);
diff --git a/gdb/features/rs6000/powerpc-isa205-vsx64l.c b/gdb/features/rs6000/powerpc-isa205-vsx64l.c
index 64b12b9..d295ab7 100644
--- a/gdb/features/rs6000/powerpc-isa205-vsx64l.c
+++ b/gdb/features/rs6000/powerpc-isa205-vsx64l.c
@@ -10,12 +10,10 @@ static void
 initialize_tdesc_powerpc_isa205_vsx64l (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "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");
@@ -96,6 +94,7 @@ initialize_tdesc_powerpc_isa205_vsx64l (void)
   tdesc_create_reg (feature, "trap", 72, 1, NULL, 64, "int");
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
+  struct tdesc_type *field_type;
   field_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", field_type, 4);
 
@@ -108,6 +107,7 @@ initialize_tdesc_powerpc_isa205_vsx64l (void)
   field_type = tdesc_named_type (feature, "int8");
   tdesc_create_vector (feature, "v16i8", field_type, 16);
 
+  struct tdesc_type *type;
   type = tdesc_create_union (feature, "vec128");
   field_type = tdesc_named_type (feature, "uint128");
   tdesc_add_field (type, "uint128", field_type);
diff --git a/gdb/features/rs6000/powerpc-vsx32.c b/gdb/features/rs6000/powerpc-vsx32.c
index ba1fcb6..8cf7562 100644
--- a/gdb/features/rs6000/powerpc-vsx32.c
+++ b/gdb/features/rs6000/powerpc-vsx32.c
@@ -10,12 +10,10 @@ static void
 initialize_tdesc_powerpc_vsx32 (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "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");
@@ -92,6 +90,7 @@ initialize_tdesc_powerpc_vsx32 (void)
   tdesc_create_reg (feature, "fpscr", 70, 1, "float", 32, "int");
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
+  struct tdesc_type *field_type;
   field_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", field_type, 4);
 
@@ -104,6 +103,7 @@ initialize_tdesc_powerpc_vsx32 (void)
   field_type = tdesc_named_type (feature, "int8");
   tdesc_create_vector (feature, "v16i8", field_type, 16);
 
+  struct tdesc_type *type;
   type = tdesc_create_union (feature, "vec128");
   field_type = tdesc_named_type (feature, "uint128");
   tdesc_add_field (type, "uint128", field_type);
diff --git a/gdb/features/rs6000/powerpc-vsx32l.c b/gdb/features/rs6000/powerpc-vsx32l.c
index 013e392..e8c1881 100644
--- a/gdb/features/rs6000/powerpc-vsx32l.c
+++ b/gdb/features/rs6000/powerpc-vsx32l.c
@@ -10,12 +10,10 @@ static void
 initialize_tdesc_powerpc_vsx32l (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "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");
@@ -96,6 +94,7 @@ initialize_tdesc_powerpc_vsx32l (void)
   tdesc_create_reg (feature, "trap", 72, 1, NULL, 32, "int");
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
+  struct tdesc_type *field_type;
   field_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", field_type, 4);
 
@@ -108,6 +107,7 @@ initialize_tdesc_powerpc_vsx32l (void)
   field_type = tdesc_named_type (feature, "int8");
   tdesc_create_vector (feature, "v16i8", field_type, 16);
 
+  struct tdesc_type *type;
   type = tdesc_create_union (feature, "vec128");
   field_type = tdesc_named_type (feature, "uint128");
   tdesc_add_field (type, "uint128", field_type);
diff --git a/gdb/features/rs6000/powerpc-vsx64.c b/gdb/features/rs6000/powerpc-vsx64.c
index ca02323..30953c5 100644
--- a/gdb/features/rs6000/powerpc-vsx64.c
+++ b/gdb/features/rs6000/powerpc-vsx64.c
@@ -10,12 +10,10 @@ static void
 initialize_tdesc_powerpc_vsx64 (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "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");
@@ -92,6 +90,7 @@ initialize_tdesc_powerpc_vsx64 (void)
   tdesc_create_reg (feature, "fpscr", 70, 1, "float", 32, "int");
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
+  struct tdesc_type *field_type;
   field_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", field_type, 4);
 
@@ -104,6 +103,7 @@ initialize_tdesc_powerpc_vsx64 (void)
   field_type = tdesc_named_type (feature, "int8");
   tdesc_create_vector (feature, "v16i8", field_type, 16);
 
+  struct tdesc_type *type;
   type = tdesc_create_union (feature, "vec128");
   field_type = tdesc_named_type (feature, "uint128");
   tdesc_add_field (type, "uint128", field_type);
diff --git a/gdb/features/rs6000/powerpc-vsx64l.c b/gdb/features/rs6000/powerpc-vsx64l.c
index 31bb224..5f12650 100644
--- a/gdb/features/rs6000/powerpc-vsx64l.c
+++ b/gdb/features/rs6000/powerpc-vsx64l.c
@@ -10,12 +10,10 @@ static void
 initialize_tdesc_powerpc_vsx64l (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "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");
@@ -96,6 +94,7 @@ initialize_tdesc_powerpc_vsx64l (void)
   tdesc_create_reg (feature, "trap", 72, 1, NULL, 64, "int");
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
+  struct tdesc_type *field_type;
   field_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", field_type, 4);
 
@@ -108,6 +107,7 @@ initialize_tdesc_powerpc_vsx64l (void)
   field_type = tdesc_named_type (feature, "int8");
   tdesc_create_vector (feature, "v16i8", field_type, 16);
 
+  struct tdesc_type *type;
   type = tdesc_create_union (feature, "vec128");
   field_type = tdesc_named_type (feature, "uint128");
   tdesc_add_field (type, "uint128", field_type);
diff --git a/gdb/features/rs6000/rs6000.c b/gdb/features/rs6000/rs6000.c
index d4e93a5..709b5da 100644
--- a/gdb/features/rs6000/rs6000.c
+++ b/gdb/features/rs6000/rs6000.c
@@ -10,10 +10,10 @@ static void
 initialize_tdesc_rs6000 (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-
   set_tdesc_architecture (result, bfd_scan_arch ("rs6000:6000"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "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");
diff --git a/gdb/features/s390-linux32.c b/gdb/features/s390-linux32.c
index 6d13094..01c136c 100644
--- a/gdb/features/s390-linux32.c
+++ b/gdb/features/s390-linux32.c
@@ -10,10 +10,10 @@ static void
 initialize_tdesc_s390_linux32 (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-
   set_tdesc_architecture (result, bfd_scan_arch ("s390:31-bit"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "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");
diff --git a/gdb/features/s390-linux32v1.c b/gdb/features/s390-linux32v1.c
index f773fc1..65a4a50 100644
--- a/gdb/features/s390-linux32v1.c
+++ b/gdb/features/s390-linux32v1.c
@@ -10,10 +10,10 @@ static void
 initialize_tdesc_s390_linux32v1 (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-
   set_tdesc_architecture (result, bfd_scan_arch ("s390:31-bit"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "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");
diff --git a/gdb/features/s390-linux32v2.c b/gdb/features/s390-linux32v2.c
index 2317752..b5d25ec 100644
--- a/gdb/features/s390-linux32v2.c
+++ b/gdb/features/s390-linux32v2.c
@@ -10,10 +10,10 @@ static void
 initialize_tdesc_s390_linux32v2 (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-
   set_tdesc_architecture (result, bfd_scan_arch ("s390:31-bit"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "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");
diff --git a/gdb/features/s390-linux64.c b/gdb/features/s390-linux64.c
index 3c7145b..531d3a1 100644
--- a/gdb/features/s390-linux64.c
+++ b/gdb/features/s390-linux64.c
@@ -10,10 +10,10 @@ static void
 initialize_tdesc_s390_linux64 (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-
   set_tdesc_architecture (result, bfd_scan_arch ("s390:31-bit"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "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");
diff --git a/gdb/features/s390-linux64v1.c b/gdb/features/s390-linux64v1.c
index 72bd894..d75deca 100644
--- a/gdb/features/s390-linux64v1.c
+++ b/gdb/features/s390-linux64v1.c
@@ -10,10 +10,10 @@ static void
 initialize_tdesc_s390_linux64v1 (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-
   set_tdesc_architecture (result, bfd_scan_arch ("s390:31-bit"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "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");
diff --git a/gdb/features/s390-linux64v2.c b/gdb/features/s390-linux64v2.c
index a1757da..bd10ee8 100644
--- a/gdb/features/s390-linux64v2.c
+++ b/gdb/features/s390-linux64v2.c
@@ -10,10 +10,10 @@ static void
 initialize_tdesc_s390_linux64v2 (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-
   set_tdesc_architecture (result, bfd_scan_arch ("s390:31-bit"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "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");
diff --git a/gdb/features/s390-te-linux64.c b/gdb/features/s390-te-linux64.c
index 0a3aedf..fe2020a 100644
--- a/gdb/features/s390-te-linux64.c
+++ b/gdb/features/s390-te-linux64.c
@@ -10,10 +10,10 @@ static void
 initialize_tdesc_s390_te_linux64 (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-
   set_tdesc_architecture (result, bfd_scan_arch ("s390:31-bit"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "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");
diff --git a/gdb/features/s390-tevx-linux64.c b/gdb/features/s390-tevx-linux64.c
index 5bc3eec..d9b18d3 100644
--- a/gdb/features/s390-tevx-linux64.c
+++ b/gdb/features/s390-tevx-linux64.c
@@ -10,12 +10,10 @@ static void
 initialize_tdesc_s390_tevx_linux64 (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("s390:31-bit"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "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");
@@ -117,6 +115,7 @@ initialize_tdesc_s390_tevx_linux64 (void)
   tdesc_create_reg (feature, "tr15", 89, 1, "tdb", 64, "uint64");
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.s390.vx");
+  struct tdesc_type *field_type;
   field_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", field_type, 4);
 
@@ -135,6 +134,7 @@ initialize_tdesc_s390_tevx_linux64 (void)
   field_type = tdesc_named_type (feature, "int64");
   tdesc_create_vector (feature, "v2i64", field_type, 2);
 
+  struct tdesc_type *type;
   type = tdesc_create_union (feature, "vec128");
   field_type = tdesc_named_type (feature, "v4f");
   tdesc_add_field (type, "v4_float", field_type);
diff --git a/gdb/features/s390-vx-linux64.c b/gdb/features/s390-vx-linux64.c
index c3ffa16..b2138dd 100644
--- a/gdb/features/s390-vx-linux64.c
+++ b/gdb/features/s390-vx-linux64.c
@@ -10,12 +10,10 @@ static void
 initialize_tdesc_s390_vx_linux64 (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("s390:31-bit"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "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");
@@ -95,6 +93,7 @@ initialize_tdesc_s390_vx_linux64 (void)
   tdesc_create_reg (feature, "system_call", 69, 1, "system", 32, "uint32");
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.s390.vx");
+  struct tdesc_type *field_type;
   field_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", field_type, 4);
 
@@ -113,6 +112,7 @@ initialize_tdesc_s390_vx_linux64 (void)
   field_type = tdesc_named_type (feature, "int64");
   tdesc_create_vector (feature, "v2i64", field_type, 2);
 
+  struct tdesc_type *type;
   type = tdesc_create_union (feature, "vec128");
   field_type = tdesc_named_type (feature, "v4f");
   tdesc_add_field (type, "v4_float", field_type);
diff --git a/gdb/features/s390x-linux64.c b/gdb/features/s390x-linux64.c
index 04502c6..9d48ea3 100644
--- a/gdb/features/s390x-linux64.c
+++ b/gdb/features/s390x-linux64.c
@@ -10,10 +10,10 @@ static void
 initialize_tdesc_s390x_linux64 (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-
   set_tdesc_architecture (result, bfd_scan_arch ("s390:64-bit"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "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");
diff --git a/gdb/features/s390x-linux64v1.c b/gdb/features/s390x-linux64v1.c
index 05bfd53..b95f1c4 100644
--- a/gdb/features/s390x-linux64v1.c
+++ b/gdb/features/s390x-linux64v1.c
@@ -10,10 +10,10 @@ static void
 initialize_tdesc_s390x_linux64v1 (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-
   set_tdesc_architecture (result, bfd_scan_arch ("s390:64-bit"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "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");
diff --git a/gdb/features/s390x-linux64v2.c b/gdb/features/s390x-linux64v2.c
index 4108cc0..9aab89f 100644
--- a/gdb/features/s390x-linux64v2.c
+++ b/gdb/features/s390x-linux64v2.c
@@ -10,10 +10,10 @@ static void
 initialize_tdesc_s390x_linux64v2 (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-
   set_tdesc_architecture (result, bfd_scan_arch ("s390:64-bit"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "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");
diff --git a/gdb/features/s390x-te-linux64.c b/gdb/features/s390x-te-linux64.c
index f75d900..babd3bd 100644
--- a/gdb/features/s390x-te-linux64.c
+++ b/gdb/features/s390x-te-linux64.c
@@ -10,10 +10,10 @@ static void
 initialize_tdesc_s390x_te_linux64 (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-
   set_tdesc_architecture (result, bfd_scan_arch ("s390:64-bit"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "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");
diff --git a/gdb/features/s390x-tevx-linux64.c b/gdb/features/s390x-tevx-linux64.c
index 327cd23..02afd3a 100644
--- a/gdb/features/s390x-tevx-linux64.c
+++ b/gdb/features/s390x-tevx-linux64.c
@@ -10,12 +10,10 @@ static void
 initialize_tdesc_s390x_tevx_linux64 (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("s390:64-bit"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "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");
@@ -101,6 +99,7 @@ initialize_tdesc_s390x_tevx_linux64 (void)
   tdesc_create_reg (feature, "tr15", 73, 1, "tdb", 64, "uint64");
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.s390.vx");
+  struct tdesc_type *field_type;
   field_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", field_type, 4);
 
@@ -119,6 +118,7 @@ initialize_tdesc_s390x_tevx_linux64 (void)
   field_type = tdesc_named_type (feature, "int64");
   tdesc_create_vector (feature, "v2i64", field_type, 2);
 
+  struct tdesc_type *type;
   type = tdesc_create_union (feature, "vec128");
   field_type = tdesc_named_type (feature, "v4f");
   tdesc_add_field (type, "v4_float", field_type);
diff --git a/gdb/features/s390x-vx-linux64.c b/gdb/features/s390x-vx-linux64.c
index e66da70..120db53 100644
--- a/gdb/features/s390x-vx-linux64.c
+++ b/gdb/features/s390x-vx-linux64.c
@@ -10,12 +10,10 @@ static void
 initialize_tdesc_s390x_vx_linux64 (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-
   set_tdesc_architecture (result, bfd_scan_arch ("s390:64-bit"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "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");
@@ -79,6 +77,7 @@ initialize_tdesc_s390x_vx_linux64 (void)
   tdesc_create_reg (feature, "system_call", 53, 1, "system", 32, "uint32");
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.s390.vx");
+  struct tdesc_type *field_type;
   field_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", field_type, 4);
 
@@ -97,6 +96,7 @@ initialize_tdesc_s390x_vx_linux64 (void)
   field_type = tdesc_named_type (feature, "int64");
   tdesc_create_vector (feature, "v2i64", field_type, 2);
 
+  struct tdesc_type *type;
   type = tdesc_create_union (feature, "vec128");
   field_type = tdesc_named_type (feature, "v4f");
   tdesc_add_field (type, "v4_float", field_type);
diff --git a/gdb/features/tic6x-c62x-linux.c b/gdb/features/tic6x-c62x-linux.c
index 8dd426d..86b905d 100644
--- a/gdb/features/tic6x-c62x-linux.c
+++ b/gdb/features/tic6x-c62x-linux.c
@@ -10,12 +10,12 @@ static void
 initialize_tdesc_tic6x_c62x_linux (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-
   set_tdesc_architecture (result, bfd_scan_arch ("tic6x"));
 
   set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.tic6x.core");
   tdesc_create_reg (feature, "A0", 0, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "A1", 1, 1, NULL, 32, "uint32");
diff --git a/gdb/features/tic6x-c62x.c b/gdb/features/tic6x-c62x.c
index 2089aaf..7dbf615 100644
--- a/gdb/features/tic6x-c62x.c
+++ b/gdb/features/tic6x-c62x.c
@@ -10,10 +10,10 @@ static void
 initialize_tdesc_tic6x_c62x (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-
   set_tdesc_architecture (result, bfd_scan_arch ("tic6x"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.tic6x.core");
   tdesc_create_reg (feature, "A0", 0, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "A1", 1, 1, NULL, 32, "uint32");
diff --git a/gdb/features/tic6x-c64x-linux.c b/gdb/features/tic6x-c64x-linux.c
index 2752358..b52048f 100644
--- a/gdb/features/tic6x-c64x-linux.c
+++ b/gdb/features/tic6x-c64x-linux.c
@@ -10,12 +10,12 @@ static void
 initialize_tdesc_tic6x_c64x_linux (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-
   set_tdesc_architecture (result, bfd_scan_arch ("tic6x"));
 
   set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.tic6x.core");
   tdesc_create_reg (feature, "A0", 0, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "A1", 1, 1, NULL, 32, "uint32");
diff --git a/gdb/features/tic6x-c64x.c b/gdb/features/tic6x-c64x.c
index 0feda24..618f802 100644
--- a/gdb/features/tic6x-c64x.c
+++ b/gdb/features/tic6x-c64x.c
@@ -10,10 +10,10 @@ static void
 initialize_tdesc_tic6x_c64x (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-
   set_tdesc_architecture (result, bfd_scan_arch ("tic6x"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.tic6x.core");
   tdesc_create_reg (feature, "A0", 0, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "A1", 1, 1, NULL, 32, "uint32");
diff --git a/gdb/features/tic6x-c64xp-linux.c b/gdb/features/tic6x-c64xp-linux.c
index c1bee4c..ca8c505 100644
--- a/gdb/features/tic6x-c64xp-linux.c
+++ b/gdb/features/tic6x-c64xp-linux.c
@@ -10,12 +10,12 @@ static void
 initialize_tdesc_tic6x_c64xp_linux (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-
   set_tdesc_architecture (result, bfd_scan_arch ("tic6x"));
 
   set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.tic6x.core");
   tdesc_create_reg (feature, "A0", 0, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "A1", 1, 1, NULL, 32, "uint32");
diff --git a/gdb/features/tic6x-c64xp.c b/gdb/features/tic6x-c64xp.c
index 160b854..4ca5125 100644
--- a/gdb/features/tic6x-c64xp.c
+++ b/gdb/features/tic6x-c64xp.c
@@ -10,10 +10,10 @@ static void
 initialize_tdesc_tic6x_c64xp (void)
 {
   struct target_desc *result = allocate_target_description ();
-  struct tdesc_feature *feature;
-
   set_tdesc_architecture (result, bfd_scan_arch ("tic6x"));
 
+  struct tdesc_feature *feature;
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.tic6x.core");
   tdesc_create_reg (feature, "A0", 0, 1, NULL, 32, "uint32");
   tdesc_create_reg (feature, "A1", 1, 1, NULL, 32, "uint32");
diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c
index e782084..f2194f4 100644
--- a/gdb/target-descriptions.c
+++ b/gdb/target-descriptions.c
@@ -35,6 +35,25 @@
 #include "hashtab.h"
 #include "inferior.h"
 
+/* The interface to visit different elements of target description.  */
+
+class tdesc_element_visitor
+{
+public:
+  virtual void visit_pre (const target_desc *e) = 0;
+  virtual void visit_post (const target_desc *e) = 0;
+
+  virtual void visit (const tdesc_feature *e) = 0;
+  virtual void visit (const tdesc_type *e) = 0;
+  virtual void visit (const tdesc_reg *e) = 0;
+};
+
+class tdesc_element
+{
+public:
+  virtual void accept (tdesc_element_visitor &v) const = 0;
+};
+
 /* Types.  */
 
 typedef struct property
@@ -46,7 +65,7 @@ DEF_VEC_O(property_s);
 
 /* An individual register from a target description.  */
 
-typedef struct tdesc_reg
+typedef struct tdesc_reg : tdesc_element
 {
   tdesc_reg (struct tdesc_feature *feature, const char *name_,
 	     int regnum, int save_restore_, const char *group_,
@@ -62,7 +81,7 @@ typedef struct tdesc_reg
     tdesc_type = tdesc_named_type (feature, type);
   }
 
-  ~tdesc_reg ()
+  virtual ~tdesc_reg ()
   {
     xfree (name);
     xfree (type);
@@ -106,6 +125,12 @@ typedef struct tdesc_reg
 
   /* The target-described type corresponding to TYPE, if found.  */
   struct tdesc_type *tdesc_type;
+
+  void accept (tdesc_element_visitor &v) const override
+  {
+    v.visit (this);
+  }
+
 } *tdesc_reg_p;
 DEF_VEC_P(tdesc_reg_p);
 
@@ -151,7 +176,7 @@ enum tdesc_type_kind
   TDESC_TYPE_ENUM
 };
 
-typedef struct tdesc_type
+typedef struct tdesc_type : tdesc_element
 {
   tdesc_type (const char *name_, enum tdesc_type_kind kind_)
     : name (xstrdup (name_)), kind (kind_)
@@ -159,7 +184,7 @@ typedef struct tdesc_type
     memset (&u, 0, sizeof (u));
   }
 
-  ~tdesc_type ()
+  virtual ~tdesc_type ()
   {
     switch (kind)
       {
@@ -214,19 +239,25 @@ typedef struct tdesc_type
       int size;
     } u;
   } u;
+
+  void accept (tdesc_element_visitor &v) const override
+  {
+    v.visit (this);
+  }
+
 } *tdesc_type_p;
 DEF_VEC_P(tdesc_type_p);
 
 /* A feature from a target description.  Each feature is a collection
    of other elements, e.g. registers and types.  */
 
-typedef struct tdesc_feature
+typedef struct tdesc_feature : tdesc_element
 {
   tdesc_feature (const char *name_)
     : name (xstrdup (name_))
   {}
 
-  ~tdesc_feature ()
+  virtual ~tdesc_feature ()
   {
     struct tdesc_reg *reg;
     struct tdesc_type *type;
@@ -256,6 +287,27 @@ typedef struct tdesc_feature
 
   /* The types associated with this feature.  */
   VEC(tdesc_type_p) *types = NULL;
+
+  void accept (tdesc_element_visitor &v) const override
+  {
+    v.visit (this);
+
+    struct tdesc_type *type;
+
+    for (int ix = 0;
+	 VEC_iterate (tdesc_type_p, types, ix, type);
+	 ix++)
+      type->accept (v);
+
+    struct tdesc_reg *reg;
+
+    for (int ix = 0;
+	 VEC_iterate (tdesc_reg_p, registers, ix, reg);
+	 ix++)
+      reg->accept (v);
+
+  }
+
 } *tdesc_feature_p;
 DEF_VEC_P(tdesc_feature_p);
 
@@ -265,12 +317,12 @@ DEF_VEC_P(arch_p);
 
 /* A target description.  */
 
-struct target_desc
+struct target_desc : tdesc_element
 {
   target_desc ()
   {}
 
-  ~target_desc ()
+  virtual ~target_desc ()
   {
     struct tdesc_feature *feature;
     struct property *prop;
@@ -309,6 +361,20 @@ struct target_desc
 
   /* The features associated with this target.  */
   VEC(tdesc_feature_p) *features = NULL;
+
+  void accept (tdesc_element_visitor &v) const override
+  {
+    v.visit_pre (this);
+
+    struct tdesc_feature *feature;
+
+    for (int ix = 0;
+	 VEC_iterate (tdesc_feature_p, features, ix, feature);
+	 ix++)
+      feature->accept (v);
+
+    v.visit_post (this);
+  }
 };
 
 /* Per-architecture data associated with a target description.  The
@@ -1711,20 +1777,270 @@ unset_tdesc_filename_cmd (char *args, int from_tty)
   target_find_description ();
 }
 
+/* Print target description in C.  */
+
+class print_c_tdesc : public tdesc_element_visitor
+{
+public:
+  print_c_tdesc (std::string &filename_after_features)
+    : m_filename_after_features (filename_after_features)
+  {
+    const char *inp;
+    char *outp;
+    const char *filename = lbasename (m_filename_after_features.c_str ());
+
+    m_function = (char *) xmalloc (strlen (filename) + 1);
+    for (inp = filename, outp = m_function; *inp != '\0'; inp++)
+      if (*inp == '.')
+	break;
+      else if (*inp == '-')
+	*outp++ = '_';
+      else
+	*outp++ = *inp;
+    *outp = '\0';
+
+    /* Standard boilerplate.  */
+    printf_unfiltered ("/* THIS FILE IS GENERATED.  "
+		       "-*- buffer-read-only: t -*- vi"
+		       ":set ro:\n");
+    printf_unfiltered ("  Original: %s */\n\n", filename);
+  }
+
+  ~print_c_tdesc ()
+  {
+    xfree (m_function);
+  }
+
+  void visit_pre (const target_desc *e) override
+  {
+    printf_unfiltered ("#include \"defs.h\"\n");
+    printf_unfiltered ("#include \"osabi.h\"\n");
+    printf_unfiltered ("#include \"target-descriptions.h\"\n");
+    printf_unfiltered ("\n");
+
+    printf_unfiltered ("struct target_desc *tdesc_%s;\n", m_function);
+    printf_unfiltered ("static void\n");
+    printf_unfiltered ("initialize_tdesc_%s (void)\n", m_function);
+    printf_unfiltered ("{\n");
+    printf_unfiltered
+      ("  struct target_desc *result = allocate_target_description ();\n");
+
+    if (tdesc_architecture (e) != NULL)
+      {
+	printf_unfiltered
+	  ("  set_tdesc_architecture (result, bfd_scan_arch (\"%s\"));\n",
+	   tdesc_architecture (e)->printable_name);
+	printf_unfiltered ("\n");
+      }
+    if (tdesc_osabi (e) > GDB_OSABI_UNKNOWN
+	&& tdesc_osabi (e) < GDB_OSABI_INVALID)
+      {
+	printf_unfiltered
+	  ("  set_tdesc_osabi (result, osabi_from_tdesc_string (\"%s\"));\n",
+	   gdbarch_osabi_name (tdesc_osabi (e)));
+	printf_unfiltered ("\n");
+      }
+
+    int ix;
+    const struct bfd_arch_info *compatible;
+    struct property *prop;
+
+    for (ix = 0; VEC_iterate (arch_p, e->compatible, ix, compatible);
+	 ix++)
+      {
+	printf_unfiltered
+	  ("  tdesc_add_compatible (result, bfd_scan_arch (\"%s\"));\n",
+	   compatible->printable_name);
+      }
+
+    if (ix)
+      printf_unfiltered ("\n");
+
+    for (ix = 0; VEC_iterate (property_s, e->properties, ix, prop);
+	 ix++)
+      {
+	printf_unfiltered ("  set_tdesc_property (result, \"%s\", \"%s\");\n",
+			   prop->key, prop->value);
+      }
+    printf_unfiltered ("  struct tdesc_feature *feature;\n");
+  }
+
+  void visit (const tdesc_feature *e) override
+  {
+    printf_unfiltered ("\n  feature = tdesc_create_feature (result, \"%s\");\n",
+		       e->name);
+  }
+
+  void visit_post (const target_desc *e) override
+  {
+    printf_unfiltered ("\n  tdesc_%s = result;\n", m_function);
+    printf_unfiltered ("}\n");
+  }
+
+  void visit (const tdesc_type *type) override
+  {
+    struct tdesc_type_field *f;
+
+    /* Now we do some "filtering" in order to know which variables to
+       declare.  This is needed because otherwise we would declare unused
+       variables `field_type' and `type'.  */
+    if (!m_printed_field_type)
+      {
+	printf_unfiltered ("  struct tdesc_type *field_type;\n");
+	m_printed_field_type = true;
+      }
+
+    if ((type->kind == TDESC_TYPE_UNION
+	 || type->kind == TDESC_TYPE_STRUCT
+	 || type->kind == TDESC_TYPE_FLAGS
+	 || type->kind == TDESC_TYPE_ENUM)
+	&& VEC_length (tdesc_type_field, type->u.u.fields) > 0
+	&& !m_printed_type)
+      {
+	printf_unfiltered ("  struct tdesc_type *type;\n");
+	m_printed_type = true;
+      }
+
+    switch (type->kind)
+      {
+      case TDESC_TYPE_VECTOR:
+	printf_unfiltered
+	  ("  field_type = tdesc_named_type (feature, \"%s\");\n",
+	   type->u.v.type->name);
+	printf_unfiltered
+	  ("  tdesc_create_vector (feature, \"%s\", field_type, %d);\n",
+	   type->name, type->u.v.count);
+	break;
+      case TDESC_TYPE_STRUCT:
+      case TDESC_TYPE_FLAGS:
+	if (type->kind == TDESC_TYPE_STRUCT)
+	  {
+	    printf_unfiltered
+	      ("  type = tdesc_create_struct (feature, \"%s\");\n",
+	       type->name);
+	    if (type->u.u.size != 0)
+	      printf_unfiltered
+		("  tdesc_set_struct_size (type, %d);\n",
+		 type->u.u.size);
+	  }
+	else
+	  {
+	    printf_unfiltered
+	      ("  type = tdesc_create_flags (feature, \"%s\", %d);\n",
+	       type->name, type->u.u.size);
+	  }
+	for (int ix3 = 0;
+	     VEC_iterate (tdesc_type_field, type->u.u.fields, ix3, f);
+	     ix3++)
+	  {
+	    const char *type_name;
+
+	    gdb_assert (f->type != NULL);
+	    type_name = f->type->name;
+
+	    /* To minimize changes to generated files, don't emit type
+	       info for fields that have defaulted types.  */
+	    if (f->start != -1)
+	      {
+		gdb_assert (f->end != -1);
+		if (f->type->kind == TDESC_TYPE_BOOL)
+		  {
+		    gdb_assert (f->start == f->end);
+		    printf_unfiltered
+		      ("  tdesc_add_flag (type, %d, \"%s\");\n",
+		       f->start, f->name);
+		  }
+		else if ((type->u.u.size == 4
+			  && f->type->kind == TDESC_TYPE_UINT32)
+			 || (type->u.u.size == 8
+			     && f->type->kind == TDESC_TYPE_UINT64))
+		  {
+		    printf_unfiltered
+		      ("  tdesc_add_bitfield (type, \"%s\", %d, %d);\n",
+		       f->name, f->start, f->end);
+		  }
+		else
+		  {
+		    printf_unfiltered
+		      ("  field_type = tdesc_named_type (feature,"
+		       " \"%s\");\n",
+		       type_name);
+		    printf_unfiltered
+		      ("  tdesc_add_typed_bitfield (type, \"%s\","
+		       " %d, %d, field_type);\n",
+		       f->name, f->start, f->end);
+		  }
+	      }
+	    else /* Not a bitfield.  */
+	      {
+		gdb_assert (f->end == -1);
+		gdb_assert (type->kind == TDESC_TYPE_STRUCT);
+		printf_unfiltered
+		  ("  field_type = tdesc_named_type (feature,"
+		   " \"%s\");\n",
+		   type_name);
+		printf_unfiltered
+		  ("  tdesc_add_field (type, \"%s\", field_type);\n",
+		   f->name);
+	      }
+	  }
+	break;
+      case TDESC_TYPE_UNION:
+	printf_unfiltered
+	  ("  type = tdesc_create_union (feature, \"%s\");\n",
+	   type->name);
+	for (int ix3 = 0;
+	     VEC_iterate (tdesc_type_field, type->u.u.fields, ix3, f);
+	     ix3++)
+	  {
+	    printf_unfiltered
+	      ("  field_type = tdesc_named_type (feature, \"%s\");\n",
+	       f->type->name);
+	    printf_unfiltered
+	      ("  tdesc_add_field (type, \"%s\", field_type);\n",
+	       f->name);
+	  }
+	break;
+      case TDESC_TYPE_ENUM:
+	printf_unfiltered
+	  ("  type = tdesc_create_enum (feature, \"%s\", %d);\n",
+	   type->name, type->u.u.size);
+	for (int ix3 = 0;
+	     VEC_iterate (tdesc_type_field, type->u.u.fields, ix3, f);
+	     ix3++)
+	  printf_unfiltered
+	    ("  tdesc_add_enum_value (type, %d, \"%s\");\n",
+	     f->start, f->name);
+	break;
+      default:
+	error (_("C output is not supported type \"%s\"."), type->name);
+      }
+    printf_unfiltered ("\n");
+  }
+
+  void visit (const tdesc_reg *reg) override
+  {
+    printf_unfiltered ("  tdesc_create_reg (feature, \"%s\", %ld, %d, ",
+		       reg->name, reg->target_regnum, reg->save_restore);
+    if (reg->group)
+      printf_unfiltered ("\"%s\", ", reg->group);
+    else
+      printf_unfiltered ("NULL, ");
+    printf_unfiltered ("%d, \"%s\");\n", reg->bitsize, reg->type);
+  }
+
+private:
+  char *m_function;
+  std::string m_filename_after_features;
+  bool m_printed_field_type = false;
+  bool m_printed_type = false;
+};
+
 static void
 maint_print_c_tdesc_cmd (char *args, int from_tty)
 {
   const struct target_desc *tdesc;
-  const struct bfd_arch_info *compatible;
-  const char *filename, *inp;
-  char *function, *outp;
-  struct property *prop;
-  struct tdesc_feature *feature;
-  struct tdesc_reg *reg;
-  struct tdesc_type *type;
-  struct tdesc_type_field *f;
-  int ix, ix2, ix3;
-  int printed_field_type = 0;
+  const char *filename;
 
   if (args == NULL)
     {
@@ -1748,253 +2064,15 @@ maint_print_c_tdesc_cmd (char *args, int from_tty)
   if (filename == NULL)
     error (_("The current target description did not come from an XML file."));
 
-  filename = lbasename (filename);
-  function = (char *) alloca (strlen (filename) + 1);
-  for (inp = filename, outp = function; *inp != '\0'; inp++)
-    if (*inp == '.')
-      break;
-    else if (*inp == '-')
-      *outp++ = '_';
-    else
-      *outp++ = *inp;
-  *outp = '\0';
-
-  /* Standard boilerplate.  */
-  printf_unfiltered ("/* THIS FILE IS GENERATED.  "
-		     "-*- buffer-read-only: t -*- vi"
-		     ":set ro:\n");
-  printf_unfiltered ("  Original: %s */\n\n", filename);
-  printf_unfiltered ("#include \"defs.h\"\n");
-  printf_unfiltered ("#include \"osabi.h\"\n");
-  printf_unfiltered ("#include \"target-descriptions.h\"\n");
-  printf_unfiltered ("\n");
-
-  printf_unfiltered ("struct target_desc *tdesc_%s;\n", function);
-  printf_unfiltered ("static void\n");
-  printf_unfiltered ("initialize_tdesc_%s (void)\n", function);
-  printf_unfiltered ("{\n");
-  printf_unfiltered
-    ("  struct target_desc *result = allocate_target_description ();\n");
-  printf_unfiltered ("  struct tdesc_feature *feature;\n");
-
-  /* Now we do some "filtering" in order to know which variables to
-     declare.  This is needed because otherwise we would declare unused
-     variables `field_type' and `type'.  */
-  for (ix = 0;
-       VEC_iterate (tdesc_feature_p, tdesc->features, ix, feature);
-       ix++)
-    {
-      int printed_desc_type = 0;
+  std::string filename_after_features (filename);
+  auto loc = filename_after_features.rfind ("/features/");
 
-      for (ix2 = 0;
-	   VEC_iterate (tdesc_type_p, feature->types, ix2, type);
-	   ix2++)
-	{
-	  if (!printed_field_type)
-	    {
-	      printf_unfiltered ("  struct tdesc_type *field_type;\n");
-	      printed_field_type = 1;
-	    }
+  if (loc != std::string::npos)
+    filename_after_features = filename_after_features.substr (loc + 10);
 
-	  if ((type->kind == TDESC_TYPE_UNION
-	       || type->kind == TDESC_TYPE_STRUCT
-	       || type->kind == TDESC_TYPE_FLAGS
-	       || type->kind == TDESC_TYPE_ENUM)
-	      && VEC_length (tdesc_type_field, type->u.u.fields) > 0)
-	    {
-	      printf_unfiltered ("  struct tdesc_type *type;\n");
-	      printed_desc_type = 1;
-	      break;
-	    }
-	}
-
-      if (printed_desc_type)
-	break;
-    }
-
-  printf_unfiltered ("\n");
-
-  if (tdesc_architecture (tdesc) != NULL)
-    {
-      printf_unfiltered
-	("  set_tdesc_architecture (result, bfd_scan_arch (\"%s\"));\n",
-	 tdesc_architecture (tdesc)->printable_name);
-      printf_unfiltered ("\n");
-    }
-
-  if (tdesc_osabi (tdesc) > GDB_OSABI_UNKNOWN
-      && tdesc_osabi (tdesc) < GDB_OSABI_INVALID)
-    {
-      printf_unfiltered
-	("  set_tdesc_osabi (result, osabi_from_tdesc_string (\"%s\"));\n",
-	 gdbarch_osabi_name (tdesc_osabi (tdesc)));
-      printf_unfiltered ("\n");
-    }
-
-  for (ix = 0; VEC_iterate (arch_p, tdesc->compatible, ix, compatible);
-       ix++)
-    {
-      printf_unfiltered
-	("  tdesc_add_compatible (result, bfd_scan_arch (\"%s\"));\n",
-	 compatible->printable_name);
-    }
-  if (ix)
-    printf_unfiltered ("\n");
-
-  for (ix = 0; VEC_iterate (property_s, tdesc->properties, ix, prop);
-       ix++)
-    {
-      printf_unfiltered ("  set_tdesc_property (result, \"%s\", \"%s\");\n",
-	      prop->key, prop->value);
-    }
-
-  for (ix = 0;
-       VEC_iterate (tdesc_feature_p, tdesc->features, ix, feature);
-       ix++)
-    {
-      printf_unfiltered ("  \
-feature = tdesc_create_feature (result, \"%s\");\n",
-			 feature->name);
-
-      for (ix2 = 0;
-	   VEC_iterate (tdesc_type_p, feature->types, ix2, type);
-	   ix2++)
-	{
-	  switch (type->kind)
-	    {
-	    case TDESC_TYPE_VECTOR:
-	      printf_unfiltered
-		("  field_type = tdesc_named_type (feature, \"%s\");\n",
-		 type->u.v.type->name);
-	      printf_unfiltered
-		("  tdesc_create_vector (feature, \"%s\", field_type, %d);\n",
-		 type->name, type->u.v.count);
-	      break;
-	    case TDESC_TYPE_STRUCT:
-	    case TDESC_TYPE_FLAGS:
-	      if (type->kind == TDESC_TYPE_STRUCT)
-		{
-		  printf_unfiltered
-		    ("  type = tdesc_create_struct (feature, \"%s\");\n",
-		     type->name);
-		  if (type->u.u.size != 0)
-		    printf_unfiltered
-		      ("  tdesc_set_struct_size (type, %d);\n",
-		       type->u.u.size);
-		}
-	      else
-		{
-		  printf_unfiltered
-		    ("  type = tdesc_create_flags (feature, \"%s\", %d);\n",
-		     type->name, type->u.u.size);
-		}
-	      for (ix3 = 0;
-		   VEC_iterate (tdesc_type_field, type->u.u.fields, ix3, f);
-		   ix3++)
-		{
-		  const char *type_name;
-
-		  gdb_assert (f->type != NULL);
-		  type_name = f->type->name;
-
-		  /* To minimize changes to generated files, don't emit type
-		     info for fields that have defaulted types.  */
-		  if (f->start != -1)
-		    {
-		      gdb_assert (f->end != -1);
-		      if (f->type->kind == TDESC_TYPE_BOOL)
-			{
-			  gdb_assert (f->start == f->end);
-			  printf_unfiltered
-			    ("  tdesc_add_flag (type, %d, \"%s\");\n",
-			     f->start, f->name);
-			}
-		      else if ((type->u.u.size == 4
-				&& f->type->kind == TDESC_TYPE_UINT32)
-			       || (type->u.u.size == 8
-				   && f->type->kind == TDESC_TYPE_UINT64))
-			{
-			  printf_unfiltered
-			    ("  tdesc_add_bitfield (type, \"%s\", %d, %d);\n",
-			     f->name, f->start, f->end);
-			}
-		      else
-			{
-			  printf_unfiltered
-			    ("  field_type = tdesc_named_type (feature,"
-			     " \"%s\");\n",
-			     type_name);
-			  printf_unfiltered
-			    ("  tdesc_add_typed_bitfield (type, \"%s\","
-			     " %d, %d, field_type);\n",
-			     f->name, f->start, f->end);
-			}
-		    }
-		  else /* Not a bitfield.  */
-		    {
-		      gdb_assert (f->end == -1);
-		      gdb_assert (type->kind == TDESC_TYPE_STRUCT);
-		      printf_unfiltered
-			("  field_type = tdesc_named_type (feature,"
-			 " \"%s\");\n",
-			 type_name);
-		      printf_unfiltered
-			("  tdesc_add_field (type, \"%s\", field_type);\n",
-			 f->name);
-		    }
-		}
-	      break;
-	    case TDESC_TYPE_UNION:
-	      printf_unfiltered
-		("  type = tdesc_create_union (feature, \"%s\");\n",
-		 type->name);
-	      for (ix3 = 0;
-		   VEC_iterate (tdesc_type_field, type->u.u.fields, ix3, f);
-		   ix3++)
-		{
-		  printf_unfiltered
-		    ("  field_type = tdesc_named_type (feature, \"%s\");\n",
-		     f->type->name);
-		  printf_unfiltered
-		    ("  tdesc_add_field (type, \"%s\", field_type);\n",
-		     f->name);
-		}
-	      break;
-	    case TDESC_TYPE_ENUM:
-	      printf_unfiltered
-		("  type = tdesc_create_enum (feature, \"%s\", %d);\n",
-		 type->name, type->u.u.size);
-	      for (ix3 = 0;
-		   VEC_iterate (tdesc_type_field, type->u.u.fields, ix3, f);
-		   ix3++)
-		printf_unfiltered
-		  ("  tdesc_add_enum_value (type, %d, \"%s\");\n",
-		   f->start, f->name);
-	      break;
-	    default:
-	      error (_("C output is not supported type \"%s\"."), type->name);
-	    }
-	  printf_unfiltered ("\n");
-	}
-
-      for (ix2 = 0;
-	   VEC_iterate (tdesc_reg_p, feature->registers, ix2, reg);
-	   ix2++)
-	{
-	  printf_unfiltered ("  tdesc_create_reg (feature, \"%s\", %ld, %d, ",
-			     reg->name, reg->target_regnum, reg->save_restore);
-	  if (reg->group)
-	    printf_unfiltered ("\"%s\", ", reg->group);
-	  else
-	    printf_unfiltered ("NULL, ");
-	  printf_unfiltered ("%d, \"%s\");\n", reg->bitsize, reg->type);
-	}
-
-      printf_unfiltered ("\n");
-    }
+  print_c_tdesc v (filename_after_features);
 
-  printf_unfiltered ("  tdesc_%s = result;\n", function);
-  printf_unfiltered ("}\n");
+  tdesc->accept (v);
 }
 
 /* Provide a prototype to silence -Wmissing-prototypes.  */
-- 
1.9.1

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

* [PATCH 11/26] Return X86_TDESC_MMX in x86_get_ipa_tdesc_idx
  2017-07-10 13:56 [PATCH 00/26 v3] Make GDB builtin target descriptions more flexible Yao Qi
                   ` (5 preceding siblings ...)
  2017-07-10 13:56 ` [PATCH 20/26] Update comments in amd64_linux_core_read_description Yao Qi
@ 2017-07-10 13:56 ` Yao Qi
  2017-07-10 13:56 ` [PATCH 23/26] Convert amd64-linux target descriptions Yao Qi
                   ` (19 subsequent siblings)
  26 siblings, 0 replies; 30+ messages in thread
From: Yao Qi @ 2017-07-10 13:56 UTC (permalink / raw)
  To: gdb-patches

gdb/gdbserver:

2017-07-10  Yao Qi  <yao.qi@linaro.org>

	* linux-x86-low.c (x86_get_ipa_tdesc_idx): Use X86_TDESC_MMX
	instead of 0.
---
 gdb/gdbserver/linux-x86-low.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/gdb/gdbserver/linux-x86-low.c b/gdb/gdbserver/linux-x86-low.c
index 12c7a1b..5c56a5d 100644
--- a/gdb/gdbserver/linux-x86-low.c
+++ b/gdb/gdbserver/linux-x86-low.c
@@ -2927,7 +2927,8 @@ x86_get_ipa_tdesc_idx (void)
   if (tdesc == tdesc_i386_avx_avx512_linux)
     return X86_TDESC_AVX_AVX512;
 
-  return 0;
+  /* If none tdesc is found, return the one with minimum features.  */
+  return X86_TDESC_MMX;
 }
 
 /* This is initialized assuming an amd64 target.
-- 
1.9.1

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

* [PATCH 12/26] [GDBserver] Centralize tdesc for i386-linux
  2017-07-10 13:56 [PATCH 00/26 v3] Make GDB builtin target descriptions more flexible Yao Qi
                   ` (2 preceding siblings ...)
  2017-07-10 13:55 ` [PATCH 03/26] Add optional argument to command "maint prints c-tdesc" Yao Qi
@ 2017-07-10 13:56 ` Yao Qi
  2017-07-10 13:56 ` [PATCH 09/26] Adjust code generated by regformats/regdat.sh Yao Qi
                   ` (22 subsequent siblings)
  26 siblings, 0 replies; 30+ messages in thread
From: Yao Qi @ 2017-07-10 13:56 UTC (permalink / raw)
  To: gdb-patches

tdesc_i386_XXX_linux is used in many places in linux-x86-low.c and this
patch adds a new function i386_linux_read_description to return the right
tdesc according to xcr0.  i386_linux_read_description is quite similar to
the counterpart in GDB, and the following patch will share the duplicated
code, so this patch adds arch/tdesc.h includes the declarations of various
tdesc apis which are used by the shared code.  The generated c feature
files can include arch/tdesc.h only.

gdb/gdbserver:

2017-07-10  Yao Qi  <yao.qi@linaro.org>

	* configure.srv (srv_tgtobj): Append linux-x86-tdesc.o.
	(ipa_obj): Likewise.
	* linux-i386-ipa.c: Include common/x86-xstate.h
	(get_ipa_tdesc): Call i386_linux_read_description.
	(initialize_low_tracepoint): Don't call  init_registers_XXX
	functions, call initialize_low_tdesc instead.
	* linux-x86-low.c (x86_linux_read_description): Call
	i386_linux_read_description.
	(initialize_low_arch): Don't call init_registers_i386_XXX
	functions, call initialize_low_tdesc.
	* linux-x86-tdesc.c: New file.
	* linux-x86-tdesc.h (x86_linux_tdesc): New X86_TDESC_LAST.
	(i386_get_ipa_tdesc_idx): Declare.
	(i386_get_ipa_tdesc): Declare.
	(initialize_low_tdesc): Declare.

gdb:

2017-07-10  Yao Qi  <yao.qi@linaro.org>

	* arch/tdesc.h: New file.
	* regformats/regdat.sh: Generate code using tdesc_create_reg.
	* target-descriptions.c: Update comments.
	* target-descriptions.h: Include "arch/tdesc.h".  Remove the
	declarations.
	* features/i386/32bit-avx.c: Re-generated.
	* features/i386/32bit-avx512.c: Re-generated.
	* features/i386/32bit-core.c: Re-generated.
	* features/i386/32bit-linux.c: Re-generated.
	* features/i386/32bit-mpx.c: Re-generated.
	* features/i386/32bit-pkeys.c: Re-generated.
	* features/i386/32bit-sse.c: Re-generated.
---
 gdb/arch/tdesc.h                 |  80 ++++++++++++++++++
 gdb/features/i386/32bit-avx.c    |   2 +-
 gdb/features/i386/32bit-avx512.c |   2 +-
 gdb/features/i386/32bit-core.c   |   2 +-
 gdb/features/i386/32bit-linux.c  |   2 +-
 gdb/features/i386/32bit-mpx.c    |   2 +-
 gdb/features/i386/32bit-pkeys.c  |   2 +-
 gdb/features/i386/32bit-sse.c    |   2 +-
 gdb/gdbserver/configure.srv      |   6 +-
 gdb/gdbserver/linux-i386-ipa.c   |  39 ++++-----
 gdb/gdbserver/linux-x86-low.c    |  59 +++----------
 gdb/gdbserver/linux-x86-tdesc.c  | 177 +++++++++++++++++++++++++++++++++++++++
 gdb/gdbserver/linux-x86-tdesc.h  |  31 ++-----
 gdb/gdbserver/tdesc.c            | 110 +++++++++++++++++++++++-
 gdb/gdbserver/tdesc.h            |  29 ++++++-
 gdb/i386-linux-tdep.c            |   1 +
 gdb/regformats/regdat.sh         |  10 +--
 gdb/target-descriptions.c        |  32 +++----
 gdb/target-descriptions.h        |  36 +-------
 19 files changed, 458 insertions(+), 166 deletions(-)
 create mode 100644 gdb/arch/tdesc.h
 create mode 100644 gdb/gdbserver/linux-x86-tdesc.c

diff --git a/gdb/arch/tdesc.h b/gdb/arch/tdesc.h
new file mode 100644
index 0000000..872df68
--- /dev/null
+++ b/gdb/arch/tdesc.h
@@ -0,0 +1,80 @@
+/* Copyright (C) 2006-2017 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef ARCH_TDESC_H
+#define ARCH_TDESC_H 1
+
+struct tdesc_feature;
+struct tdesc_type;
+struct tdesc_reg;
+struct target_desc;
+
+/* Return the type associated with ID in the context of FEATURE, or
+   NULL if none.  */
+struct tdesc_type *tdesc_named_type (const struct tdesc_feature *feature,
+				     const char *id);
+
+/* Return the created feature named NAME in target description TDESC.  */
+struct tdesc_feature *tdesc_create_feature (struct target_desc *tdesc,
+					    const char *name);
+
+/* Return the created vector tdesc_type named NAME in FEATURE.  */
+struct tdesc_type *tdesc_create_vector (struct tdesc_feature *feature,
+					const char *name,
+					struct tdesc_type *field_type,
+					int count);
+
+/* Return the created struct tdesc_type named NAME in FEATURE.  */
+struct tdesc_type *tdesc_create_struct (struct tdesc_feature *feature,
+					const char *name);
+
+/* Return the created union tdesc_type named NAME in FEATURE.  */
+struct tdesc_type *tdesc_create_union (struct tdesc_feature *feature,
+				       const char *name);
+
+/* Return the created flags tdesc_type named NAME in FEATURE.  */
+struct tdesc_type *tdesc_create_flags (struct tdesc_feature *feature,
+				       const char *name,
+				       int size);
+
+/* Add a new field to TYPE.  FIELD_NAME is its name, and FIELD_TYPE is
+   its type.  */
+void tdesc_add_field (struct tdesc_type *type, const char *field_name,
+		      struct tdesc_type *field_type);
+
+/* Set the total length of TYPE.  Structs which contain bitfields may
+   omit the reserved bits, so the end of the last field may not
+   suffice.  */
+void tdesc_set_struct_size (struct tdesc_type *type, int size);
+
+/* Add a new untyped bitfield to TYPE.
+   Untyped bitfields become either uint32 or uint64 depending on the size
+   of the underlying type.  */
+void tdesc_add_bitfield (struct tdesc_type *type, const char *field_name,
+			 int start, int end);
+
+/* A flag is just a typed(bool) single-bit bitfield.
+   This function is kept to minimize changes in generated files.  */
+void tdesc_add_flag (struct tdesc_type *type, int start,
+		     const char *flag_name);
+
+/* Create a register in feature FEATURE.  */
+void tdesc_create_reg (struct tdesc_feature *feature, const char *name,
+		       int regnum, int save_restore, const char *group,
+		       int bitsize, const char *type);
+
+#endif /* ARCH_TDESC_H */
diff --git a/gdb/features/i386/32bit-avx.c b/gdb/features/i386/32bit-avx.c
index 0e71515..3a98936 100644
--- a/gdb/features/i386/32bit-avx.c
+++ b/gdb/features/i386/32bit-avx.c
@@ -1,7 +1,7 @@
 /* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
   Original: 32bit-avx.xml */
 
-#include "target-descriptions.h"
+#include "arch/tdesc.h"
 
 static int
 create_feature_i386_32bit_avx (struct target_desc *result, long regnum)
diff --git a/gdb/features/i386/32bit-avx512.c b/gdb/features/i386/32bit-avx512.c
index 034f557..b13e1d3 100644
--- a/gdb/features/i386/32bit-avx512.c
+++ b/gdb/features/i386/32bit-avx512.c
@@ -1,7 +1,7 @@
 /* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
   Original: 32bit-avx512.xml */
 
-#include "target-descriptions.h"
+#include "arch/tdesc.h"
 
 static int
 create_feature_i386_32bit_avx512 (struct target_desc *result, long regnum)
diff --git a/gdb/features/i386/32bit-core.c b/gdb/features/i386/32bit-core.c
index b43de4d..ea6db93 100644
--- a/gdb/features/i386/32bit-core.c
+++ b/gdb/features/i386/32bit-core.c
@@ -1,7 +1,7 @@
 /* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
   Original: 32bit-core.xml */
 
-#include "target-descriptions.h"
+#include "arch/tdesc.h"
 
 static int
 create_feature_i386_32bit_core (struct target_desc *result, long regnum)
diff --git a/gdb/features/i386/32bit-linux.c b/gdb/features/i386/32bit-linux.c
index 1b50882..1ba932d 100644
--- a/gdb/features/i386/32bit-linux.c
+++ b/gdb/features/i386/32bit-linux.c
@@ -1,7 +1,7 @@
 /* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
   Original: 32bit-linux.xml */
 
-#include "target-descriptions.h"
+#include "arch/tdesc.h"
 
 static int
 create_feature_i386_32bit_linux (struct target_desc *result, long regnum)
diff --git a/gdb/features/i386/32bit-mpx.c b/gdb/features/i386/32bit-mpx.c
index 6ed3b2e..f7d2ef0 100644
--- a/gdb/features/i386/32bit-mpx.c
+++ b/gdb/features/i386/32bit-mpx.c
@@ -1,7 +1,7 @@
 /* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
   Original: 32bit-mpx.xml */
 
-#include "target-descriptions.h"
+#include "arch/tdesc.h"
 
 static int
 create_feature_i386_32bit_mpx (struct target_desc *result, long regnum)
diff --git a/gdb/features/i386/32bit-pkeys.c b/gdb/features/i386/32bit-pkeys.c
index 24a40aa..89f1a5b 100644
--- a/gdb/features/i386/32bit-pkeys.c
+++ b/gdb/features/i386/32bit-pkeys.c
@@ -1,7 +1,7 @@
 /* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
   Original: 32bit-pkeys.xml */
 
-#include "target-descriptions.h"
+#include "arch/tdesc.h"
 
 static int
 create_feature_i386_32bit_pkeys (struct target_desc *result, long regnum)
diff --git a/gdb/features/i386/32bit-sse.c b/gdb/features/i386/32bit-sse.c
index c0684fb..98f4cd0 100644
--- a/gdb/features/i386/32bit-sse.c
+++ b/gdb/features/i386/32bit-sse.c
@@ -1,7 +1,7 @@
 /* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
   Original: 32bit-sse.xml */
 
-#include "target-descriptions.h"
+#include "arch/tdesc.h"
 
 static int
 create_feature_i386_32bit_sse (struct target_desc *result, long regnum)
diff --git a/gdb/gdbserver/configure.srv b/gdb/gdbserver/configure.srv
index 43f90c9..1a5801a 100644
--- a/gdb/gdbserver/configure.srv
+++ b/gdb/gdbserver/configure.srv
@@ -122,13 +122,14 @@ case "${target}" in
 			    srv_tgtobj="amd64-linux-siginfo.o"
 			fi
 			srv_tgtobj="${srv_tgtobj} $srv_linux_obj linux-x86-low.o x86-low.o x86-dregs.o i387-fp.o"
+			srv_tgtobj="${srv_tgtobj} linux-x86-tdesc.o"
 			srv_tgtobj="${srv_tgtobj} linux-btrace.o x86-linux.o"
 			srv_tgtobj="${srv_tgtobj} x86-linux-dregs.o"
 			srv_linux_usrregs=yes
 			srv_linux_regsets=yes
 			srv_linux_thread_db=yes
 			srv_linux_btrace=yes
-			ipa_obj="${ipa_i386_linux_regobj} linux-i386-ipa.o"
+			ipa_obj="${ipa_i386_linux_regobj} linux-i386-ipa.o linux-x86-tdesc-ipa.o"
 			;;
   i[34567]86-*-lynxos*)	srv_regobj="i386.o"
 			srv_tgtobj="lynx-low.o lynx-i386-low.o fork-child.o fork-inferior.o"
@@ -356,6 +357,7 @@ case "${target}" in
 			;;
   x86_64-*-linux*)	srv_regobj="$srv_amd64_linux_regobj $srv_i386_linux_regobj"
 			srv_tgtobj="$srv_linux_obj linux-x86-low.o x86-low.o x86-dregs.o i387-fp.o"
+			srv_tgtobj="${srv_tgtobj} linux-x86-tdesc.o"
 			srv_tgtobj="${srv_tgtobj} linux-btrace.o x86-linux.o"
 			srv_tgtobj="${srv_tgtobj} x86-linux-dregs.o"
 			srv_tgtobj="${srv_tgtobj} amd64-linux-siginfo.o"
@@ -369,7 +371,7 @@ case "${target}" in
 			else
 			    ipa_obj="${ipa_amd64_linux_regobj}"
 			fi
-			ipa_obj="${ipa_obj} linux-amd64-ipa.o"
+			ipa_obj="${ipa_obj} linux-amd64-ipa.o linux-x86-tdesc-ipa.o"
 			;;
   x86_64-*-mingw*)	srv_regobj="$srv_amd64_regobj"
 			srv_tgtobj="x86-low.o x86-dregs.o i387-fp.o win32-low.o win32-i386-low.o"
diff --git a/gdb/gdbserver/linux-i386-ipa.c b/gdb/gdbserver/linux-i386-ipa.c
index e9ac78b..54608da 100644
--- a/gdb/gdbserver/linux-i386-ipa.c
+++ b/gdb/gdbserver/linux-i386-ipa.c
@@ -22,6 +22,7 @@
 #include <sys/mman.h>
 #include "tracepoint.h"
 #include "linux-x86-tdesc.h"
+#include "common/x86-xstate.h"
 
 /* GDB register numbers.  */
 
@@ -250,27 +251,24 @@ initialize_fast_tracepoint_trampoline_buffer (void)
 const struct target_desc *
 get_ipa_tdesc (int idx)
 {
-  switch (idx)
+  if (idx >= X86_TDESC_LAST)
     {
-    case X86_TDESC_MMX:
-      return tdesc_i386_mmx_linux;
-    case X86_TDESC_SSE:
-      return tdesc_i386_linux;
-    case X86_TDESC_AVX:
-      return tdesc_i386_avx_linux;
-    case X86_TDESC_MPX:
-      return tdesc_i386_mpx_linux;
-    case X86_TDESC_AVX_MPX:
-      return tdesc_i386_avx_mpx_linux;
-    case X86_TDESC_AVX_AVX512:
-      return tdesc_i386_avx_avx512_linux;
-    case X86_TDESC_AVX_MPX_AVX512_PKU:
-      return tdesc_i386_avx_mpx_avx512_pku_linux;
-    default:
       internal_error (__FILE__, __LINE__,
 		      "unknown ipa tdesc index: %d", idx);
-      return tdesc_i386_linux;
     }
+
+  /* Map the tdesc index to xcr0 mask.  */
+  uint64_t idx2mask[X86_TDESC_LAST] = {
+    X86_XSTATE_X87_MASK,
+    X86_XSTATE_SSE_MASK,
+    X86_XSTATE_AVX_MASK,
+    X86_XSTATE_MPX_MASK,
+    X86_XSTATE_AVX_MPX_MASK,
+    X86_XSTATE_AVX_AVX512_MASK,
+    X86_XSTATE_AVX_MPX_AVX512_PKU_MASK,
+  };
+
+  return i386_linux_read_description (idx2mask[idx]);
 }
 
 /* Allocate buffer for the jump pads.  On i386, we can reach an arbitrary
@@ -291,12 +289,7 @@ alloc_jump_pad_buffer (size_t size)
 void
 initialize_low_tracepoint (void)
 {
-  init_registers_i386_mmx_linux ();
-  init_registers_i386_linux ();
-  init_registers_i386_avx_linux ();
-  init_registers_i386_mpx_linux ();
-  init_registers_i386_avx_avx512_linux ();
-  init_registers_i386_avx_mpx_avx512_pku_linux ();
+  initialize_low_tdesc ();
 
   initialize_fast_tracepoint_trampoline_buffer ();
 }
diff --git a/gdb/gdbserver/linux-x86-low.c b/gdb/gdbserver/linux-x86-low.c
index 5c56a5d..24b76a7 100644
--- a/gdb/gdbserver/linux-x86-low.c
+++ b/gdb/gdbserver/linux-x86-low.c
@@ -757,7 +757,7 @@ x86_linux_read_description (void)
 	{
 	  have_ptrace_getfpxregs = 0;
 	  have_ptrace_getregset = 0;
-	  return tdesc_i386_mmx_linux;
+	  return i386_linux_read_description (X86_XSTATE_X87);
 	}
       else
 	have_ptrace_getfpxregs = 1;
@@ -873,31 +873,15 @@ x86_linux_read_description (void)
     }
   else
     {
-      if (xcr0_features)
-	{
-	  switch (xcr0 & X86_XSTATE_ALL_MASK)
-	    {
-	    case X86_XSTATE_AVX_MPX_AVX512_PKU_MASK:
-	      return tdesc_i386_avx_mpx_avx512_pku_linux;
-
-	    case (X86_XSTATE_AVX_AVX512_MASK):
-	      return tdesc_i386_avx_avx512_linux;
+      const target_desc *tdesc = NULL;
 
-	    case (X86_XSTATE_MPX_MASK):
-	      return tdesc_i386_mpx_linux;
-
-	    case (X86_XSTATE_AVX_MPX_MASK):
-	      return tdesc_i386_avx_mpx_linux;
+      if (xcr0_features)
+	  tdesc = i386_linux_read_description (xcr0 & X86_XSTATE_ALL_MASK);
 
-	    case (X86_XSTATE_AVX_MASK):
-	      return tdesc_i386_avx_linux;
+      if (tdesc == NULL)
+	tdesc = i386_linux_read_description (X86_XSTATE_SSE);
 
-	    default:
-	      return tdesc_i386_linux;
-	    }
-	}
-      else
-	return tdesc_i386_linux;
+      return tdesc;
     }
 
   gdb_assert_not_reached ("failed to return tdesc");
@@ -2912,23 +2896,10 @@ x86_get_ipa_tdesc_idx (void)
     return X86_TDESC_AVX_AVX512;
 #endif
 
-  if (tdesc == tdesc_i386_mmx_linux)
-    return X86_TDESC_MMX;
-  if (tdesc == tdesc_i386_linux || tdesc == tdesc_i386_linux_no_xml)
+  if (tdesc == tdesc_i386_linux_no_xml)
     return X86_TDESC_SSE;
-  if (tdesc == tdesc_i386_avx_linux)
-    return X86_TDESC_AVX;
-  if (tdesc == tdesc_i386_mpx_linux)
-    return X86_TDESC_MPX;
-  if (tdesc == tdesc_i386_avx_mpx_linux)
-    return X86_TDESC_AVX_MPX;
-  if (tdesc == tdesc_i386_avx_mpx_avx512_pku_linux)
-    return X86_TDESC_AVX_MPX_AVX512_PKU;
-  if (tdesc == tdesc_i386_avx_avx512_linux)
-    return X86_TDESC_AVX_AVX512;
 
-  /* If none tdesc is found, return the one with minimum features.  */
-  return X86_TDESC_MMX;
+  return i386_get_ipa_tdesc_idx (tdesc);
 }
 
 /* This is initialized assuming an amd64 target.
@@ -2997,16 +2968,12 @@ initialize_low_arch (void)
   copy_target_description (tdesc_amd64_linux_no_xml, tdesc_amd64_linux);
   tdesc_amd64_linux_no_xml->xmltarget = xmltarget_amd64_linux_no_xml;
 #endif
-  init_registers_i386_linux ();
-  init_registers_i386_mmx_linux ();
-  init_registers_i386_avx_linux ();
-  init_registers_i386_mpx_linux ();
-  init_registers_i386_avx_mpx_linux ();
-  init_registers_i386_avx_avx512_linux ();
-  init_registers_i386_avx_mpx_avx512_pku_linux ();
+
+  initialize_low_tdesc ();
 
   tdesc_i386_linux_no_xml = XNEW (struct target_desc);
-  copy_target_description (tdesc_i386_linux_no_xml, tdesc_i386_linux);
+  copy_target_description (tdesc_i386_linux_no_xml,
+			   i386_linux_read_description (X86_XSTATE_SSE_MASK));
   tdesc_i386_linux_no_xml->xmltarget = xmltarget_i386_linux_no_xml;
 
   initialize_regsets_info (&x86_regsets_info);
diff --git a/gdb/gdbserver/linux-x86-tdesc.c b/gdb/gdbserver/linux-x86-tdesc.c
new file mode 100644
index 0000000..0d0be83
--- /dev/null
+++ b/gdb/gdbserver/linux-x86-tdesc.c
@@ -0,0 +1,177 @@
+/* GNU/Linux/x86-64 specific target description, for the remote server
+   for GDB.
+   Copyright (C) 2017 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "server.h"
+#include "tdesc.h"
+#include "linux-x86-tdesc.h"
+#include "x86-xstate.h"
+#include <inttypes.h>
+
+#if defined __i386__ || !defined IN_PROCESS_AGENT
+#include "../features/i386/32bit-core.c"
+#include "../features/i386/32bit-linux.c"
+#include "../features/i386/32bit-sse.c"
+#include "../features/i386/32bit-avx.c"
+#include "../features/i386/32bit-avx512.c"
+#include "../features/i386/32bit-mpx.c"
+#include "../features/i386/32bit-pkeys.c"
+
+/* Defined in auto-generated file i386-linux.c.  */
+void init_registers_i386_linux (void);
+extern const struct target_desc *tdesc_i386_linux;
+
+/* Defined in auto-generated file i386-mmx-linux.c.  */
+void init_registers_i386_mmx_linux (void);
+extern const struct target_desc *tdesc_i386_mmx_linux;
+
+/* Defined in auto-generated file i386-avx-linux.c.  */
+void init_registers_i386_avx_linux (void);
+extern const struct target_desc *tdesc_i386_avx_linux;
+
+/* Defined in auto-generated file i386-avx-mpx-linux.c.  */
+void init_registers_i386_avx_mpx_linux (void);
+extern const struct target_desc *tdesc_i386_avx_mpx_linux;
+
+/* Defined in auto-generated file i386-avx-avx512-linux.c.  */
+void init_registers_i386_avx_avx512_linux (void);
+extern const struct target_desc *tdesc_i386_avx_avx512_linux;
+
+/* Defined in auto-generated file i386-avx-mpx-avx512-linux.c.  */
+void init_registers_i386_avx_mpx_avx512_pku_linux (void);
+extern const struct target_desc *tdesc_i386_avx_mpx_avx512_pku_linux;
+
+/* Defined in auto-generated file i386-mpx-linux.c.  */
+void init_registers_i386_mpx_linux (void);
+extern const struct target_desc *tdesc_i386_mpx_linux;
+#endif
+
+static struct target_desc *i386_tdescs[X86_TDESC_LAST] = { };
+
+void
+initialize_low_tdesc ()
+{
+#if defined __i386__ || !defined IN_PROCESS_AGENT
+  init_registers_i386_linux ();
+  init_registers_i386_mmx_linux ();
+  init_registers_i386_avx_linux ();
+  init_registers_i386_mpx_linux ();
+  init_registers_i386_avx_mpx_linux ();
+  init_registers_i386_avx_avx512_linux ();
+  init_registers_i386_avx_mpx_avx512_pku_linux ();
+#endif
+}
+
+#if defined __i386__ || !defined IN_PROCESS_AGENT
+
+/* Return the target description according to XCR0.  */
+
+const struct target_desc *
+i386_linux_read_description (uint64_t xcr0)
+{
+  struct target_desc **tdesc = NULL;
+
+  if (xcr0 & X86_XSTATE_PKRU)
+     tdesc = &i386_tdescs[X86_TDESC_AVX_MPX_AVX512_PKU];
+  else if (xcr0 & X86_XSTATE_AVX512)
+    tdesc = &i386_tdescs[X86_TDESC_AVX_AVX512];
+  else if ((xcr0 & X86_XSTATE_AVX_MPX_MASK) == X86_XSTATE_AVX_MPX_MASK)
+    tdesc = &i386_tdescs[X86_TDESC_AVX_MPX];
+  else if (xcr0 & X86_XSTATE_MPX)
+    tdesc = &i386_tdescs[X86_TDESC_MPX];
+  else if (xcr0 & X86_XSTATE_AVX)
+    tdesc = &i386_tdescs[X86_TDESC_AVX];
+  else if (xcr0 & X86_XSTATE_SSE)
+    tdesc = &i386_tdescs[X86_TDESC_SSE];
+  else if (xcr0 & X86_XSTATE_X87)
+    tdesc = &i386_tdescs[X86_TDESC_MMX];
+
+  if (tdesc == NULL)
+    return NULL;
+
+  if (*tdesc == NULL)
+    {
+      *tdesc = new target_desc ();
+
+      long regnum = 0;
+
+      if (xcr0 & X86_XSTATE_X87)
+	regnum = create_feature_i386_32bit_core (*tdesc, regnum);
+
+      if (xcr0 & X86_XSTATE_SSE)
+	regnum = create_feature_i386_32bit_sse (*tdesc, regnum);
+
+      regnum = create_feature_i386_32bit_linux (*tdesc, regnum);
+
+      if (xcr0 & X86_XSTATE_AVX)
+	regnum = create_feature_i386_32bit_avx (*tdesc, regnum);
+
+      if (xcr0 & X86_XSTATE_MPX)
+	regnum = create_feature_i386_32bit_mpx (*tdesc, regnum);
+
+      if (xcr0 & X86_XSTATE_AVX512)
+	regnum = create_feature_i386_32bit_avx512 (*tdesc, regnum);
+
+      if (xcr0 & X86_XSTATE_PKRU)
+	regnum = create_feature_i386_32bit_pkeys (*tdesc, regnum);
+
+      init_target_desc (*tdesc);
+
+#ifndef IN_PROCESS_AGENT
+      static const char *expedite_regs_i386[] = { "ebp", "esp", "eip", NULL };
+      (*tdesc)->expedite_regs = expedite_regs_i386;
+
+      if (xcr0 & X86_XSTATE_PKRU)
+	(*tdesc)->xmltarget = "i386-avx-mpx-avx512-pku-linux.xml";
+      else if (xcr0 & X86_XSTATE_AVX512)
+	(*tdesc)->xmltarget = "i386-avx-avx512-linux.xml";
+      else if ((xcr0 & X86_XSTATE_AVX_MPX_MASK) == X86_XSTATE_AVX_MPX_MASK)
+	(*tdesc)->xmltarget = "i386-avx-mpx-linux.xml";
+      else if (xcr0 & X86_XSTATE_MPX)
+	(*tdesc)->xmltarget = "i386-mpx-linux.xml";
+      else if (xcr0 & X86_XSTATE_AVX)
+	(*tdesc)->xmltarget = "i386-avx-linux.xml";
+      else if (xcr0 & X86_XSTATE_SSE)
+	(*tdesc)->xmltarget = "i386-linux.xml";
+      else if (xcr0 & X86_XSTATE_X87)
+	(*tdesc)->xmltarget = "i386-mmx-linux.xml";
+      else
+	internal_error (__FILE__, __LINE__,
+			"unknown xcr0: %" PRIu64, xcr0);
+#endif
+    }
+
+  return *tdesc;;
+}
+#endif
+
+#ifndef IN_PROCESS_AGENT
+int
+i386_get_ipa_tdesc_idx (const struct target_desc *tdesc)
+{
+  for (int i = 0; i < X86_TDESC_LAST; i++)
+    {
+      if (tdesc == i386_tdescs[i])
+	return i;
+    }
+
+  /* If none tdesc is found, return the one with minimum features.  */
+  return X86_TDESC_MMX;
+}
+
+#endif
diff --git a/gdb/gdbserver/linux-x86-tdesc.h b/gdb/gdbserver/linux-x86-tdesc.h
index bbe4078..03bd1f1 100644
--- a/gdb/gdbserver/linux-x86-tdesc.h
+++ b/gdb/gdbserver/linux-x86-tdesc.h
@@ -30,6 +30,7 @@ enum x86_linux_tdesc {
   X86_TDESC_AVX_MPX = 4,
   X86_TDESC_AVX_AVX512 = 5,
   X86_TDESC_AVX_MPX_AVX512_PKU = 6,
+  X86_TDESC_LAST = 7,
 };
 
 #ifdef __x86_64__
@@ -77,31 +78,9 @@ extern const struct target_desc *tdesc_x32_avx_avx512_linux;
 #endif
 
 #if defined __i386__ || !defined IN_PROCESS_AGENT
-/* Defined in auto-generated file i386-linux.c.  */
-void init_registers_i386_linux (void);
-extern const struct target_desc *tdesc_i386_linux;
-
-/* Defined in auto-generated file i386-mmx-linux.c.  */
-void init_registers_i386_mmx_linux (void);
-extern const struct target_desc *tdesc_i386_mmx_linux;
-
-/* Defined in auto-generated file i386-avx-linux.c.  */
-void init_registers_i386_avx_linux (void);
-extern const struct target_desc *tdesc_i386_avx_linux;
-
-/* Defined in auto-generated file i386-avx-mpx-linux.c.  */
-void init_registers_i386_avx_mpx_linux (void);
-extern const struct target_desc *tdesc_i386_avx_mpx_linux;
-
-/* Defined in auto-generated file i386-avx-avx512-linux.c.  */
-void init_registers_i386_avx_avx512_linux (void);
-extern const struct target_desc *tdesc_i386_avx_avx512_linux;
+int i386_get_ipa_tdesc_idx (const struct target_desc *tdesc);
+#endif
 
-/* Defined in auto-generated file i386-avx-mpx-avx512-linux.c.  */
-void init_registers_i386_avx_mpx_avx512_pku_linux (void);
-extern const struct target_desc *tdesc_i386_avx_mpx_avx512_pku_linux;
+const struct target_desc *i386_linux_read_description (uint64_t xcr0);
 
-/* Defined in auto-generated file i386-mpx-linux.c.  */
-void init_registers_i386_mpx_linux (void);
-extern const struct target_desc *tdesc_i386_mpx_linux;
-#endif
+void initialize_low_tdesc ();
diff --git a/gdb/gdbserver/tdesc.c b/gdb/gdbserver/tdesc.c
index 1b1882e..4504c9b 100644
--- a/gdb/gdbserver/tdesc.c
+++ b/gdb/gdbserver/tdesc.c
@@ -41,7 +41,7 @@ init_target_desc (struct target_desc *tdesc)
 
 #ifndef IN_PROCESS_AGENT
 
-static const struct target_desc default_description = { NULL, 0, NULL, NULL };
+static const struct target_desc default_description {};
 
 void
 copy_target_description (struct target_desc *dest,
@@ -61,5 +61,111 @@ current_target_desc (void)
 
   return current_process ()->tdesc;
 }
-
 #endif
+
+struct tdesc_type
+{};
+
+/* See arch/tdesc.h.  */
+
+struct tdesc_feature *
+tdesc_create_feature (struct target_desc *tdesc, const char *name)
+{
+  return tdesc;
+}
+
+/* See arch/tdesc.h.  */
+
+struct tdesc_type *
+tdesc_create_flags (struct tdesc_feature *feature, const char *name,
+		    int size)
+{
+  return NULL;
+}
+
+/* See arch/tdesc.h.  */
+
+void
+tdesc_add_flag (struct tdesc_type *type, int start,
+		const char *flag_name)
+{}
+
+/* See arch/tdesc.h.  */
+
+struct tdesc_type *
+tdesc_named_type (const struct tdesc_feature *feature, const char *id)
+{
+  return NULL;
+}
+
+/* See arch/tdesc.h.  */
+
+struct tdesc_type *
+tdesc_create_union (struct tdesc_feature *feature, const char *id)
+{
+  return NULL;
+}
+
+/* See arch/tdesc.h.  */
+
+struct tdesc_type *
+tdesc_create_struct (struct tdesc_feature *feature, const char *id)
+{
+  return NULL;
+}
+
+/* See arch/tdesc.h.  */
+
+void
+tdesc_create_reg (struct tdesc_feature *feature, const char *name,
+		  int regnum, int save_restore, const char *group,
+		  int bitsize, const char *type)
+{
+  struct target_desc *tdesc = (struct target_desc *) feature;
+
+  while (VEC_length (tdesc_reg_p, tdesc->reg_defs) < regnum)
+    {
+      struct reg *reg = XCNEW (struct reg);
+
+      reg->name = "";
+      reg->size = 0;
+      VEC_safe_push (tdesc_reg_p, tdesc->reg_defs, reg);
+    }
+
+  gdb_assert (regnum == 0
+	      || regnum == VEC_length (tdesc_reg_p, tdesc->reg_defs));
+
+  struct reg *reg = XCNEW (struct reg);
+
+  reg->name = name;
+  reg->size = bitsize;
+  VEC_safe_push (tdesc_reg_p, tdesc->reg_defs, reg);
+}
+
+/* See arch/tdesc.h.  */
+
+struct tdesc_type *
+tdesc_create_vector (struct tdesc_feature *feature, const char *name,
+		     struct tdesc_type *field_type, int count)
+{
+  return NULL;
+}
+
+void
+tdesc_add_bitfield (struct tdesc_type *type, const char *field_name,
+		    int start, int end)
+{}
+
+/* See arch/tdesc.h.  */
+
+void
+tdesc_add_field (struct tdesc_type *type, const char *field_name,
+		 struct tdesc_type *field_type)
+{}
+
+/* See arch/tdesc.h.  */
+
+void
+tdesc_set_struct_size (struct tdesc_type *type, int size)
+{
+}
diff --git a/gdb/gdbserver/tdesc.h b/gdb/gdbserver/tdesc.h
index 424a2fd..50d0364 100644
--- a/gdb/gdbserver/tdesc.h
+++ b/gdb/gdbserver/tdesc.h
@@ -19,14 +19,20 @@
 #ifndef TDESC_H
 #define TDESC_H
 
+#include "arch/tdesc.h"
+
 struct reg;
 
 typedef struct reg *tdesc_reg_p;
 DEF_VEC_P(tdesc_reg_p);
 
-/* A target description.  */
+struct tdesc_feature
+{};
+
+/* A target description.  Inherit from tdesc_feature so that target_desc
+   can be used as tdesc_feature.  */
 
-struct target_desc
+struct target_desc : tdesc_feature
 {
   /* A vector of elements of register definitions that
      describe the inferior's register set.  */
@@ -38,13 +44,28 @@ struct target_desc
 #ifndef IN_PROCESS_AGENT
   /* An array of register names.  These are the "expedite" registers:
      registers whose values are sent along with stop replies.  */
-  const char **expedite_regs;
+  const char **expedite_regs = NULL;
 
   /* Defines what to return when looking for the "target.xml" file in
      response to qXfer:features:read.  Its contents can either be
      verbatim XML code (prefixed with a '@') or else the name of the
      actual XML file to be used in place of "target.xml".  */
-  const char *xmltarget;
+  const char *xmltarget = NULL;
+
+public:
+  target_desc ()
+    : reg_defs (NULL), registers_size (0)
+  {}
+
+  ~target_desc ()
+  {
+    int i;
+    struct reg *reg;
+
+    for (i = 0; VEC_iterate (tdesc_reg_p, reg_defs, i, reg); i++)
+      xfree (reg);
+    VEC_free (tdesc_reg_p, reg_defs);
+  }
 #endif
 };
 
diff --git a/gdb/i386-linux-tdep.c b/gdb/i386-linux-tdep.c
index 708de97..9059d24 100644
--- a/gdb/i386-linux-tdep.c
+++ b/gdb/i386-linux-tdep.c
@@ -53,6 +53,7 @@
 #include "features/i386/32bit-mpx.c"
 #include "features/i386/32bit-avx512.c"
 #include "features/i386/32bit-pkeys.c"
+#include "target-descriptions.h"
 
 /* Return non-zero, when the register is in the corresponding register
    group.  Put the LINUX_ORIG_EAX register in the system group.  */
diff --git a/gdb/regformats/regdat.sh b/gdb/regformats/regdat.sh
index 236cd93..66449cc 100755
--- a/gdb/regformats/regdat.sh
+++ b/gdb/regformats/regdat.sh
@@ -131,7 +131,6 @@ do
     echo "{"
     echo "  static struct target_desc tdesc_${name}_s;"
     echo "  struct target_desc *result = &tdesc_${name}_s;"
-    echo "  memset (result, 0, sizeof (*result));"
 
     continue
   elif test "${type}" = "xmltarget"; then
@@ -150,12 +149,9 @@ do
     echo "$0: $1 does not specify \`\`name''." 1>&2
     exit 1
   else
-    echo "  {struct reg *reg = XCNEW (struct reg);"
-    echo "  reg->name = \"${entry}\";"
-    echo "  reg->offset = ${offset};"
-    echo "  reg->size = ${type};"
-    echo "  VEC_safe_push (tdesc_reg_p, result->reg_defs, reg);"
-    echo "  };"
+    echo "  tdesc_create_reg ((struct tdesc_feature *) result, \"${entry}\","
+    echo "  0, 0, NULL, ${type}, NULL);"
+
     offset=`expr ${offset} + ${type}`
     i=`expr $i + 1`
   fi
diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c
index 0962792..35bd761 100644
--- a/gdb/target-descriptions.c
+++ b/gdb/target-descriptions.c
@@ -843,8 +843,7 @@ tdesc_predefined_type (enum tdesc_type_kind kind)
   gdb_assert_not_reached ("bad predefined tdesc type");
 }
 
-/* Return the type associated with ID in the context of FEATURE, or
-   NULL if none.  */
+/* See arch/tdesc.h.  */
 
 struct tdesc_type *
 tdesc_named_type (const struct tdesc_feature *feature, const char *id)
@@ -1563,6 +1562,8 @@ tdesc_use_registers (struct gdbarch *gdbarch,
 }
 \f
 
+/* See arch/tdesc.h.  */
+
 void
 tdesc_create_reg (struct tdesc_feature *feature, const char *name,
 		  int regnum, int save_restore, const char *group,
@@ -1574,6 +1575,8 @@ tdesc_create_reg (struct tdesc_feature *feature, const char *name,
   VEC_safe_push (tdesc_reg_p, feature->registers, reg);
 }
 
+/* See arch/tdesc.h.  */
+
 struct tdesc_type *
 tdesc_create_vector (struct tdesc_feature *feature, const char *name,
 		     struct tdesc_type *field_type, int count)
@@ -1587,6 +1590,8 @@ tdesc_create_vector (struct tdesc_feature *feature, const char *name,
   return type;
 }
 
+/* See arch/tdesc.h.  */
+
 struct tdesc_type *
 tdesc_create_struct (struct tdesc_feature *feature, const char *name)
 {
@@ -1596,9 +1601,7 @@ tdesc_create_struct (struct tdesc_feature *feature, const char *name)
   return type;
 }
 
-/* Set the total length of TYPE.  Structs which contain bitfields may
-   omit the reserved bits, so the end of the last field may not
-   suffice.  */
+/* See arch/tdesc.h.  */
 
 void
 tdesc_set_struct_size (struct tdesc_type *type, int size)
@@ -1608,6 +1611,8 @@ tdesc_set_struct_size (struct tdesc_type *type, int size)
   type->u.u.size = size;
 }
 
+/* See arch/tdesc.h.  */
+
 struct tdesc_type *
 tdesc_create_union (struct tdesc_feature *feature, const char *name)
 {
@@ -1617,6 +1622,8 @@ tdesc_create_union (struct tdesc_feature *feature, const char *name)
   return type;
 }
 
+/* See arch/tdesc.h.  */
+
 struct tdesc_type *
 tdesc_create_flags (struct tdesc_feature *feature, const char *name,
 		    int size)
@@ -1645,7 +1652,7 @@ tdesc_create_enum (struct tdesc_feature *feature, const char *name,
   return type;
 }
 
-/* Add a new field to TYPE.  */
+/* See arch/tdesc.h.  */
 
 void
 tdesc_add_field (struct tdesc_type *type, const char *field_name,
@@ -1666,8 +1673,6 @@ tdesc_add_field (struct tdesc_type *type, const char *field_name,
   VEC_safe_push (tdesc_type_field, type->u.u.fields, &f);
 }
 
-/* Add a new typed bitfield to TYPE.  */
-
 void
 tdesc_add_typed_bitfield (struct tdesc_type *type, const char *field_name,
 			  int start, int end, struct tdesc_type *field_type)
@@ -1686,9 +1691,7 @@ tdesc_add_typed_bitfield (struct tdesc_type *type, const char *field_name,
   VEC_safe_push (tdesc_type_field, type->u.u.fields, &f);
 }
 
-/* Add a new untyped bitfield to TYPE.
-   Untyped bitfields become either uint32 or uint64 depending on the size
-   of the underlying type.  */
+/* See arch/tdesc.h.  */
 
 void
 tdesc_add_bitfield (struct tdesc_type *type, const char *field_name,
@@ -1706,8 +1709,7 @@ tdesc_add_bitfield (struct tdesc_type *type, const char *field_name,
   tdesc_add_typed_bitfield (type, field_name, start, end, field_type);
 }
 
-/* A flag is just a typed(bool) single-bit bitfield.
-   This function is kept to minimize changes in generated files.  */
+/* See arch/tdesc.h.  */
 
 void
 tdesc_add_flag (struct tdesc_type *type, int start,
@@ -1742,6 +1744,8 @@ tdesc_add_enum_value (struct tdesc_type *type, int value,
   VEC_safe_push (tdesc_type_field, type->u.u.fields, &f);
 }
 
+/* See arch/tdesc.h.  */
+
 struct tdesc_feature *
 tdesc_create_feature (struct target_desc *tdesc, const char *name)
 {
@@ -2172,7 +2176,7 @@ public:
     printf_unfiltered ("  Original: %s */\n\n",
 		       lbasename (m_filename_after_features.c_str ()));
 
-    printf_unfiltered ("#include \"target-descriptions.h\"\n");
+    printf_unfiltered ("#include \"arch/tdesc.h\"\n");
     printf_unfiltered ("\n");
   }
 
diff --git a/gdb/target-descriptions.h b/gdb/target-descriptions.h
index 591da15..c4f9b92 100644
--- a/gdb/target-descriptions.h
+++ b/gdb/target-descriptions.h
@@ -21,14 +21,10 @@
 
 #ifndef TARGET_DESCRIPTIONS_H
 #define TARGET_DESCRIPTIONS_H 1
+#include "arch/tdesc.h"
 
-struct tdesc_feature;
 struct tdesc_arch_data;
-struct tdesc_type;
-struct tdesc_reg;
-struct target_desc;
 struct target_ops;
-struct target_desc;
 /* An inferior's target description info is stored in this opaque
    object.  There's one such object per inferior.  */
 struct target_desc_info;
@@ -182,12 +178,6 @@ const struct tdesc_feature *tdesc_find_feature (const struct target_desc *,
 
 const char *tdesc_feature_name (const struct tdesc_feature *feature);
 
-/* Return the type associated with ID in the context of FEATURE, or
-   NULL if none.  */
-
-struct tdesc_type *tdesc_named_type (const struct tdesc_feature *feature,
-				     const char *id);
-
 /* Return the name of register REGNO, from the target description or
    from an architecture-provided pseudo_register_name method.  */
 
@@ -220,38 +210,14 @@ void set_tdesc_property (struct target_desc *,
 			 const char *key, const char *value);
 void tdesc_add_compatible (struct target_desc *,
 			   const struct bfd_arch_info *);
-
-struct tdesc_feature *tdesc_create_feature (struct target_desc *tdesc,
-					    const char *name);
-struct tdesc_type *tdesc_create_vector (struct tdesc_feature *feature,
-					const char *name,
-					struct tdesc_type *field_type,
-					int count);
-struct tdesc_type *tdesc_create_struct (struct tdesc_feature *feature,
-					const char *name);
-void tdesc_set_struct_size (struct tdesc_type *type, int size);
-struct tdesc_type *tdesc_create_union (struct tdesc_feature *feature,
-				       const char *name);
-struct tdesc_type *tdesc_create_flags (struct tdesc_feature *feature,
-				       const char *name,
-				       int size);
 struct tdesc_type *tdesc_create_enum (struct tdesc_feature *feature,
 				      const char *name,
 				      int size);
-void tdesc_add_field (struct tdesc_type *type, const char *field_name,
-		      struct tdesc_type *field_type);
 void tdesc_add_typed_bitfield (struct tdesc_type *type, const char *field_name,
 			       int start, int end,
 			       struct tdesc_type *field_type);
-void tdesc_add_bitfield (struct tdesc_type *type, const char *field_name,
-			 int start, int end);
-void tdesc_add_flag (struct tdesc_type *type, int start,
-		     const char *flag_name);
 void tdesc_add_enum_value (struct tdesc_type *type, int value,
 			   const char *name);
-void tdesc_create_reg (struct tdesc_feature *feature, const char *name,
-		       int regnum, int save_restore, const char *group,
-		       int bitsize, const char *type);
 
 #if GDB_SELF_TEST
 namespace selftests {
-- 
1.9.1

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

* [PATCH 08/26] Add "maint check xml-descriptions" to test builtin xml target descriptions
  2017-07-10 13:56 [PATCH 00/26 v3] Make GDB builtin target descriptions more flexible Yao Qi
                   ` (15 preceding siblings ...)
  2017-07-10 13:56 ` [PATCH 15/26] Dynamically composite xml in reply to GDB Yao Qi
@ 2017-07-10 13:56 ` Yao Qi
  2017-07-10 13:56 ` [PATCH 06/26] Generate c for feature instead of tdesc Yao Qi
                   ` (9 subsequent siblings)
  26 siblings, 0 replies; 30+ messages in thread
From: Yao Qi @ 2017-07-10 13:56 UTC (permalink / raw)
  To: gdb-patches

Now, GDB is able to dynamically create i386-linux target descriptions
from features, instead of using pre-generated target descriptions.  These
pre-generated target descriptions are no longer used by GDB (note that
they are still used by GDBserver).

This patch add a new maint command "maint check xml-descriptions" to test
dynamically generated tdesc are identical to these generated from xml files.

v3:
 - Update doc, swap the implementation of operator == and !=,
 - Use filename_completer,
 - Use tilde_expand,

gdb:

2017-07-10  Yao Qi  <yao.qi@linaro.org>

	* cli/cli-cmds.c (maintenancechecklist): New variable.
	* gdbcmd.h (maintenancechecklist): Declare it.
	* i386-linux-tdep.c (_initialize_i386_linux_tdep) [GDB_SELF_TEST]:
	Call i386_linux_read_description with different masks.
	* maint.c (maintenance_check_command): New function.
	(_initialize_maint_cmds): Call add_prefix_cmd.
	* target-descriptions.c (tdesc_reg): override operator != and ==.
	(tdesc_type): Likewise.
	(tdesc_feature): Likewise.
	(target_desc): Likewise.
	[GDB_SELF_TEST] (selftests::record_xml_tdesc): New function.
	(maintenance_check_xml_descriptions): New function.
	(_initialize_target_descriptions) Add command "xml-descriptions".
	* target-descriptions.h (selftests::record_xml_tdesc): Declare.

gdb/testsuite:

2017-07-10  Yao Qi  <yao.qi@linaro.org>

	* gdb.gdb/unittest.exp: Invoke command
	"maintenance check xml-descriptions".

gdb/doc:

2017-06-06  Yao Qi  <yao.qi@linaro.org>

	* gdb.texinfo (Maintenance Commands): Document command
	"maint check xml-descriptions".
---
 gdb/cli/cli-cmds.c                 |   4 +
 gdb/doc/gdb.texinfo                |   5 ++
 gdb/gdbcmd.h                       |   4 +
 gdb/i386-linux-tdep.c              |  24 ++++++
 gdb/maint.c                        |  18 +++++
 gdb/target-descriptions.c          | 160 +++++++++++++++++++++++++++++++++++++
 gdb/target-descriptions.h          |  12 +++
 gdb/testsuite/gdb.gdb/unittest.exp |   5 ++
 8 files changed, 232 insertions(+)

diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c
index 0930342..6d7532b 100644
--- a/gdb/cli/cli-cmds.c
+++ b/gdb/cli/cli-cmds.c
@@ -168,6 +168,10 @@ struct cmd_list_element *maintenanceinfolist;
 
 struct cmd_list_element *maintenanceprintlist;
 
+/* Chain containing all defined "maintenance check" subcommands.  */
+
+struct cmd_list_element *maintenancechecklist;
+
 struct cmd_list_element *setprintlist;
 
 struct cmd_list_element *showprintlist;
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index 08a7681..17b4c69 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -34698,6 +34698,11 @@ The created source file is built into @value{GDBN} when @value{GDBN} is
 built again.  This command is used by developers after they add or
 modify XML target descriptions.
 
+@kindex maint check xml-descriptions
+@item maint check xml-descriptions @var{dir}
+Check that the target descriptions dynamically created by @value{GDBN}
+equal the descriptions created from XML files found in @var{dir}.
+
 @kindex maint print dummy-frames
 @item maint print dummy-frames
 Prints the contents of @value{GDBN}'s internal dummy-frame stack.
diff --git a/gdb/gdbcmd.h b/gdb/gdbcmd.h
index fbd0cb9..14c7f4e 100644
--- a/gdb/gdbcmd.h
+++ b/gdb/gdbcmd.h
@@ -95,6 +95,10 @@ extern struct cmd_list_element *maintenanceinfolist;
 
 extern struct cmd_list_element *maintenanceprintlist;
 
+/* Chain containing all defined "maintenance check" subcommands.  */
+
+extern struct cmd_list_element *maintenancechecklist;
+
 /* Chain containing all defined "maintenance set" subcommands.  */
 
 extern struct cmd_list_element *maintenance_set_cmdlist;
diff --git a/gdb/i386-linux-tdep.c b/gdb/i386-linux-tdep.c
index 4c0f597..708de97 100644
--- a/gdb/i386-linux-tdep.c
+++ b/gdb/i386-linux-tdep.c
@@ -1116,4 +1116,28 @@ _initialize_i386_linux_tdep (void)
 {
   gdbarch_register_osabi (bfd_arch_i386, 0, GDB_OSABI_LINUX,
 			  i386_linux_init_abi);
+
+#if GDB_SELF_TEST
+  struct
+  {
+    const char *xml;
+    uint64_t mask;
+  } xml_masks[] = {
+    { "i386/i386-linux.xml", X86_XSTATE_SSE_MASK },
+    { "i386/i386-mmx-linux.xml", X86_XSTATE_X87_MASK },
+    { "i386/i386-avx-linux.xml", X86_XSTATE_AVX_MASK },
+    { "i386/i386-mpx-linux.xml", X86_XSTATE_MPX_MASK },
+    { "i386/i386-avx-mpx-linux.xml", X86_XSTATE_AVX_MPX_MASK },
+    { "i386/i386-avx-avx512-linux.xml", X86_XSTATE_AVX_AVX512_MASK },
+    { "i386/i386-avx-mpx-avx512-pku-linux.xml",
+      X86_XSTATE_AVX_MPX_AVX512_PKU_MASK },
+  };
+
+  for (auto &a : xml_masks)
+    {
+      auto tdesc = i386_linux_read_description (a.mask);
+
+      selftests::record_xml_tdesc (a.xml, tdesc);
+    }
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/maint.c b/gdb/maint.c
index d95f658..a0d43ec 100644
--- a/gdb/maint.c
+++ b/gdb/maint.c
@@ -178,6 +178,19 @@ maintenance_info_command (char *arg, int from_tty)
 	     gdb_stdout);
 }
 
+/* The "maintenance check" command is defined as a prefix, with
+   allow_unknown 0.  Therefore, its own definition is called only for
+   "maintenance check" with no args.  */
+
+static void
+maintenance_check_command (char *arg, int from_tty)
+{
+  printf_unfiltered (_("\"maintenance check\" must be followed "
+		       "by the name of a check command.\n"));
+  help_list (maintenancechecklist, "maintenance check ", all_commands,
+	     gdb_stdout);
+}
+
 /* Mini tokenizing lexer for 'maint info sections' command.  */
 
 static int
@@ -1104,6 +1117,11 @@ Print the internal architecture configuration.\n\
 Takes an optional file parameter."),
 	   &maintenanceprintlist);
 
+  add_prefix_cmd ("check", class_maintenance, maintenance_check_command, _("\
+Commands for checking internal gdb state."),
+		  &maintenancechecklist, "maintenance check ", 0,
+		  &maintenancelist);
+
   add_cmd ("translate-address", class_maintenance,
 	   maintenance_translate_address,
 	   _("Translate a section name and address to a symbol."),
diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c
index d1755f4..0962792 100644
--- a/gdb/target-descriptions.c
+++ b/gdb/target-descriptions.c
@@ -35,6 +35,8 @@
 #include "hashtab.h"
 #include "inferior.h"
 #include <algorithm>
+#include "completer.h"
+#include "readline/tilde.h" /* tilde_expand */
 
 /* The interface to visit different elements of target description.  */
 
@@ -134,6 +136,20 @@ typedef struct tdesc_reg : tdesc_element
     v.visit (this);
   }
 
+  bool operator== (const tdesc_reg &other) const
+  {
+    return (streq (name, other.name)
+	    && target_regnum == other.target_regnum
+	    && save_restore == other.save_restore
+	    && bitsize == other.bitsize
+	    && (group == other.group || streq (group, other.group))
+	    && streq (type, other.type));
+  }
+
+  bool operator!= (const tdesc_reg &other) const
+  {
+    return !(*this == other);
+  }
 } *tdesc_reg_p;
 DEF_VEC_P(tdesc_reg_p);
 
@@ -248,6 +264,15 @@ typedef struct tdesc_type : tdesc_element
     v.visit (this);
   }
 
+  bool operator== (const tdesc_type &other) const
+  {
+    return (streq (name, other.name) && kind == other.kind);
+  }
+
+  bool operator!= (const tdesc_type &other) const
+  {
+    return !(*this == other);
+  }
 } *tdesc_type_p;
 DEF_VEC_P(tdesc_type_p);
 
@@ -312,6 +337,54 @@ typedef struct tdesc_feature : tdesc_element
 
     v.visit_post (this);
   }
+
+  bool operator== (const tdesc_feature &other) const
+  {
+    if (strcmp (name, other.name) != 0)
+      return false;
+
+    if (VEC_length (tdesc_reg_p, registers)
+	!= VEC_length (tdesc_reg_p, other.registers))
+      return false;
+
+    struct tdesc_reg *reg;
+
+    for (int ix = 0;
+	 VEC_iterate (tdesc_reg_p, registers, ix, reg);
+	 ix++)
+      {
+	tdesc_reg *reg2
+	  = VEC_index (tdesc_reg_p, other.registers, ix);
+
+	if (reg != reg2 && *reg != *reg2)
+	  return false;
+      }
+
+    if (VEC_length (tdesc_type_p, types)
+	!= VEC_length (tdesc_type_p, other.types))
+      return false;
+
+    tdesc_type *type;
+
+    for (int ix = 0;
+	 VEC_iterate (tdesc_type_p, types, ix, type);
+	 ix++)
+      {
+	tdesc_type *type2
+	  = VEC_index (tdesc_type_p, other.types, ix);
+
+	if (type != type2 && *type != *type2)
+	  return false;
+      }
+
+    return true;
+  }
+
+  bool operator!= (const tdesc_feature &other) const
+  {
+    return !(*this == other);
+  }
+
 } *tdesc_feature_p;
 DEF_VEC_P(tdesc_feature_p);
 
@@ -379,6 +452,39 @@ struct target_desc : tdesc_element
 
     v.visit_post (this);
   }
+
+  bool operator== (const target_desc &other) const
+  {
+    if (arch != other.arch)
+      return false;
+
+    if (osabi != other.osabi)
+      return false;
+
+    if (VEC_length (tdesc_feature_p, features)
+	!= VEC_length (tdesc_feature_p, other.features))
+      return false;
+
+    struct tdesc_feature *feature;
+
+    for (int ix = 0;
+	 VEC_iterate (tdesc_feature_p, features, ix, feature);
+	 ix++)
+      {
+	struct tdesc_feature *feature2
+	  = VEC_index (tdesc_feature_p, other.features, ix);
+
+	if (feature != feature2 && *feature != *feature2)
+	  return false;
+      }
+
+    return true;
+  }
+
+  bool operator!= (const target_desc &other) const
+  {
+    return !(*this == other);
+  }
 };
 
 /* Per-architecture data associated with a target description.  The
@@ -2210,6 +2316,50 @@ maint_print_c_tdesc_cmd (char *args, int from_tty)
     }
 }
 
+namespace selftests {
+
+static std::vector<std::pair<const char*, const target_desc *>> xml_tdesc;
+
+#if GDB_SELF_TEST
+
+/* See target-descritpions.h.  */
+
+void
+record_xml_tdesc (const char *xml_file, const struct target_desc *tdesc)
+{
+  xml_tdesc.emplace_back (xml_file, tdesc);
+}
+#endif
+
+}
+
+/* Check that the target descriptions created dynamically by
+   architecture-specific code equal the descriptions created from XML files
+   found in the specified directory DIR.  */
+
+static void
+maintenance_check_xml_descriptions (char *dir, int from_tty)
+{
+  if (dir == NULL)
+    error (_("Missing dir name"));
+
+  gdb::unique_xmalloc_ptr<char> dir1 (tilde_expand (dir));
+  std::string feature_dir (dir1.get ());
+  unsigned int failed = 0;
+
+  for (auto const &e : selftests::xml_tdesc)
+    {
+      std::string tdesc_xml = (feature_dir + SLASH_STRING + e.first);
+      const target_desc *tdesc
+	= file_read_description_xml (tdesc_xml.data ());
+
+      if (tdesc == NULL || *tdesc != *e.second)
+	failed++;
+    }
+  printf_filtered (_("Tested %lu XML files, %d failed\n"),
+		   (long) selftests::xml_tdesc.size (), failed);
+}
+
 /* Provide a prototype to silence -Wmissing-prototypes.  */
 extern initialize_file_ftype _initialize_target_descriptions;
 
@@ -2250,4 +2400,14 @@ GDB will read the description from the target."),
   add_cmd ("c-tdesc", class_maintenance, maint_print_c_tdesc_cmd, _("\
 Print the current target description as a C source file."),
 	   &maintenanceprintlist);
+
+  cmd_list_element *cmd;
+
+  cmd = add_cmd ("xml-descriptions", class_maintenance,
+		 maintenance_check_xml_descriptions, _("\
+Check the target descriptions created in GDB equal the descriptions\n\
+created from XML files in the directory.\n\
+The parameter is the directory name."),
+		 &maintenancechecklist);
+  set_cmd_completer (cmd, filename_completer);
 }
diff --git a/gdb/target-descriptions.h b/gdb/target-descriptions.h
index 361ac97..591da15 100644
--- a/gdb/target-descriptions.h
+++ b/gdb/target-descriptions.h
@@ -253,4 +253,16 @@ void tdesc_create_reg (struct tdesc_feature *feature, const char *name,
 		       int regnum, int save_restore, const char *group,
 		       int bitsize, const char *type);
 
+#if GDB_SELF_TEST
+namespace selftests {
+
+/* Record that XML_FILE should generate a target description that equals
+   TDESC, to be verified by the "maintenance check xml-descriptions"
+   command.  */
+
+void record_xml_tdesc (const char *xml_file,
+		       const struct target_desc *tdesc);
+}
+#endif
+
 #endif /* TARGET_DESCRIPTIONS_H */
diff --git a/gdb/testsuite/gdb.gdb/unittest.exp b/gdb/testsuite/gdb.gdb/unittest.exp
index d6fc3de..c3e36e6 100644
--- a/gdb/testsuite/gdb.gdb/unittest.exp
+++ b/gdb/testsuite/gdb.gdb/unittest.exp
@@ -15,3 +15,8 @@
 
 gdb_start
 gdb_test "maintenance selftest" "Ran $decimal unit tests, 0 failed"
+
+if { ![is_remote host] } {
+    gdb_test "maintenance check xml-descriptions ${srcdir}/../features" \
+	"Tested $decimal XML files, 0 failed"
+}
-- 
1.9.1

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

* [PATCH 07/26] Lazily and dynamically create i386-linux target descriptions
  2017-07-10 13:56 [PATCH 00/26 v3] Make GDB builtin target descriptions more flexible Yao Qi
                   ` (20 preceding siblings ...)
  2017-07-10 13:56 ` [PATCH 22/26] Lazily and dynamically create amd64-linux target descriptions Yao Qi
@ 2017-07-10 13:56 ` Yao Qi
  2017-07-10 13:56 ` [PATCH 21/26] Centralize amd64-linux " Yao Qi
                   ` (4 subsequent siblings)
  26 siblings, 0 replies; 30+ messages in thread
From: Yao Qi @ 2017-07-10 13:56 UTC (permalink / raw)
  To: gdb-patches

Instead of using pre-generated target descriptions, this patch
changes GDB to lazily and dynamically create target descriptions
according to the target hardware capability (xcr0 in i386).
This support any combination of target features.

Some reg in target description has "regnum" attribute, so its register
number is got from the attribute value instead from sequential allocation.

  <reg name="xmm0" bitsize="128" type="vec128" regnum="32"/>

when target description is created, it should match the regnum, so this
patch adds a new field m_next_regnum to track it, if attribute number is
greater than the m_next_regnum, print the code to set register number
explicitly.

v3:
 - Add sanity check, use error rather than gdb_assert, because it checks
   GDB input (The invalid input shouldn't trigger gdb internal error).
 - Add comments,

gdb:

2017-07-07  Yao Qi  <yao.qi@linaro.org>

	* i386-linux-tdep.c: Don't include features/i386/i386-*linux.c.
	Include features/i386/32bit-*.c.
	(i386_linux_read_description): Generate target description if it
	doesn't exist.
	(_initialize_i386_linux_tdep): Don't call _initialize_tdesc_i386
	functions.
	* features/i386/32bit-linux.c: Re-generated.
	* features/i386/32bit-sse.c: Likewise.
	* target-descriptions.c (print_c_feature::visit): Print code to
	set register number if needed.
	(print_c_feature) <m_next_regnum>: New field.
---
 gdb/features/i386/32bit-linux.c |  1 +
 gdb/features/i386/32bit-sse.c   |  1 +
 gdb/i386-linux-tdep.c           | 83 ++++++++++++++++++++++++-----------------
 gdb/target-descriptions.c       | 47 +++++++++++++++++++++++
 4 files changed, 98 insertions(+), 34 deletions(-)

diff --git a/gdb/features/i386/32bit-linux.c b/gdb/features/i386/32bit-linux.c
index 686a2f1..1b50882 100644
--- a/gdb/features/i386/32bit-linux.c
+++ b/gdb/features/i386/32bit-linux.c
@@ -9,6 +9,7 @@ create_feature_i386_32bit_linux (struct target_desc *result, long regnum)
   struct tdesc_feature *feature;
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.linux");
+  regnum = 41;
   tdesc_create_reg (feature, "orig_eax", regnum++, 1, NULL, 32, "int");
   return regnum;
 }
diff --git a/gdb/features/i386/32bit-sse.c b/gdb/features/i386/32bit-sse.c
index 032623e..c0684fb 100644
--- a/gdb/features/i386/32bit-sse.c
+++ b/gdb/features/i386/32bit-sse.c
@@ -61,6 +61,7 @@ create_feature_i386_32bit_sse (struct target_desc *result, long regnum)
   tdesc_add_flag (type, 12, "PM");
   tdesc_add_flag (type, 15, "FZ");
 
+  regnum = 32;
   tdesc_create_reg (feature, "xmm0", regnum++, 1, NULL, 128, "vec128");
   tdesc_create_reg (feature, "xmm1", regnum++, 1, NULL, 128, "vec128");
   tdesc_create_reg (feature, "xmm2", regnum++, 1, NULL, 128, "vec128");
diff --git a/gdb/i386-linux-tdep.c b/gdb/i386-linux-tdep.c
index e986d6f..4c0f597 100644
--- a/gdb/i386-linux-tdep.c
+++ b/gdb/i386-linux-tdep.c
@@ -45,13 +45,14 @@
 
 #include "record-full.h"
 #include "linux-record.h"
-#include "features/i386/i386-linux.c"
-#include "features/i386/i386-mmx-linux.c"
-#include "features/i386/i386-mpx-linux.c"
-#include "features/i386/i386-avx-mpx-linux.c"
-#include "features/i386/i386-avx-linux.c"
-#include "features/i386/i386-avx-avx512-linux.c"
-#include "features/i386/i386-avx-mpx-avx512-pku-linux.c"
+
+#include "features/i386/32bit-core.c"
+#include "features/i386/32bit-sse.c"
+#include "features/i386/32bit-linux.c"
+#include "features/i386/32bit-avx.c"
+#include "features/i386/32bit-mpx.c"
+#include "features/i386/32bit-avx512.c"
+#include "features/i386/32bit-pkeys.c"
 
 /* Return non-zero, when the register is in the corresponding register
    group.  Put the LINUX_ORIG_EAX register in the system group.  */
@@ -683,27 +684,50 @@ i386_linux_core_read_xcr0 (bfd *abfd)
 const struct target_desc *
 i386_linux_read_description (uint64_t xcr0)
 {
-  switch ((xcr0 & X86_XSTATE_ALL_MASK))
+  if (xcr0 == 0)
+    return NULL;
+
+  static struct target_desc *i386_linux_tdescs \
+    [2/*X87*/][2/*SSE*/][2/*AVX*/][2/*MPX*/][2/*AVX512*/][2/*PKRU*/] = {};
+  struct target_desc **tdesc;
+
+  tdesc = &i386_linux_tdescs[(xcr0 & X86_XSTATE_X87) ? 1 : 0]
+    [(xcr0 & X86_XSTATE_SSE) ? 1 : 0]
+    [(xcr0 & X86_XSTATE_AVX) ? 1 : 0]
+    [(xcr0 & X86_XSTATE_MPX) ? 1 : 0]
+    [(xcr0 & X86_XSTATE_AVX512) ? 1 : 0]
+    [(xcr0 & X86_XSTATE_PKRU) ? 1 : 0];
+
+  if (*tdesc == NULL)
     {
-    case X86_XSTATE_AVX_MPX_AVX512_PKU_MASK:
-      return tdesc_i386_avx_mpx_avx512_pku_linux;
-    case X86_XSTATE_AVX_AVX512_MASK:
-      return tdesc_i386_avx_avx512_linux;
-    case X86_XSTATE_MPX_MASK:
-      return tdesc_i386_mpx_linux;
-    case X86_XSTATE_AVX_MPX_MASK:
-      return tdesc_i386_avx_mpx_linux;
-    case X86_XSTATE_AVX_MASK:
-      return tdesc_i386_avx_linux;
-    case X86_XSTATE_SSE_MASK:
-      return tdesc_i386_linux;
-    case X86_XSTATE_X87_MASK:
-      return tdesc_i386_mmx_linux;
-    default:
-      break;
+      *tdesc = allocate_target_description ();
+      set_tdesc_architecture (*tdesc, bfd_scan_arch ("i386"));
+      set_tdesc_osabi (*tdesc, osabi_from_tdesc_string ("GNU/Linux"));
+
+      long regnum = 0;
+
+      if (xcr0 & X86_XSTATE_X87)
+	regnum = create_feature_i386_32bit_core (*tdesc, regnum);
+
+      if (xcr0 & X86_XSTATE_SSE)
+	regnum = create_feature_i386_32bit_sse (*tdesc, regnum);
+
+      regnum = create_feature_i386_32bit_linux (*tdesc, regnum);
+
+      if (xcr0 & X86_XSTATE_AVX)
+	regnum = create_feature_i386_32bit_avx (*tdesc, regnum);
+
+      if (xcr0 & X86_XSTATE_MPX)
+	regnum = create_feature_i386_32bit_mpx (*tdesc, regnum);
+
+      if (xcr0 & X86_XSTATE_AVX512)
+	regnum = create_feature_i386_32bit_avx512 (*tdesc, regnum);
+
+      if (xcr0 & X86_XSTATE_PKRU)
+	regnum = create_feature_i386_32bit_pkeys (*tdesc, regnum);
     }
 
-  return NULL;
+  return *tdesc;
 }
 
 /* Get Linux/x86 target description from core dump.  */
@@ -1092,13 +1116,4 @@ _initialize_i386_linux_tdep (void)
 {
   gdbarch_register_osabi (bfd_arch_i386, 0, GDB_OSABI_LINUX,
 			  i386_linux_init_abi);
-
-  /* Initialize the Linux target description.  */
-  initialize_tdesc_i386_linux ();
-  initialize_tdesc_i386_mmx_linux ();
-  initialize_tdesc_i386_avx_linux ();
-  initialize_tdesc_i386_mpx_linux ();
-  initialize_tdesc_i386_avx_mpx_linux ();
-  initialize_tdesc_i386_avx_avx512_linux ();
-  initialize_tdesc_i386_avx_mpx_avx512_pku_linux ();
 }
diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c
index 518f2dc..d1755f4 100644
--- a/gdb/target-descriptions.c
+++ b/gdb/target-descriptions.c
@@ -2101,6 +2101,48 @@ public:
 
   void visit (const tdesc_reg *reg) override
   {
+    /* Most "reg" in XML target descriptions don't have "regnum"
+       attribute, so the register number is allocated sequentially.
+       In case that reg has "regnum" attribute, register number
+       should be set by that explicitly.  */
+
+    if (reg->target_regnum < m_next_regnum)
+      {
+	/* The integrity check, it can catch some errors on register
+	   number collision, like this,
+
+	  <reg name="x0" bitsize="32"/>
+	  <reg name="x1" bitsize="32"/>
+	  <reg name="x2" bitsize="32"/>
+	  <reg name="x3" bitsize="32"/>
+	  <reg name="ps" bitsize="32" regnum="3"/>
+
+	  but it also has false negatives.  The target description
+	  below is correct,
+
+	  <reg name="x1" bitsize="32" regnum="1"/>
+	  <reg name="x3" bitsize="32" regnum="3"/>
+	  <reg name="x2" bitsize="32" regnum="2"/>
+	  <reg name="x4" bitsize="32" regnum="4"/>
+
+	  but it is not a good practice, so still error on this,
+	  and also print the message so that it can be saved in the
+	  generated c file.  */
+
+	printf_unfiltered ("ERROR: \"regnum\" attribute %ld ",
+			   reg->target_regnum);
+	printf_unfiltered ("is not the largest number (%d).\n",
+			   m_next_regnum);
+	error (_("\"regnum\" attribute %ld is not the largest number (%d)."),
+	       reg->target_regnum, m_next_regnum);
+      }
+
+    if (reg->target_regnum > m_next_regnum)
+      {
+	printf_unfiltered ("  regnum = %ld;\n", reg->target_regnum);
+	m_next_regnum = reg->target_regnum;
+      }
+
     printf_unfiltered ("  tdesc_create_reg (feature, \"%s\", regnum++, %d, ",
 		       reg->name, reg->save_restore);
     if (reg->group)
@@ -2108,8 +2150,13 @@ public:
     else
       printf_unfiltered ("NULL, ");
     printf_unfiltered ("%d, \"%s\");\n", reg->bitsize, reg->type);
+
+    m_next_regnum++;
   }
 
+private:
+  /* The register number to use for the next register we see.  */
+  int m_next_regnum = 0;
 };
 
 static void
-- 
1.9.1

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

* [PATCH 13/26] GDBserver self test
  2017-07-10 13:56 [PATCH 00/26 v3] Make GDB builtin target descriptions more flexible Yao Qi
                   ` (18 preceding siblings ...)
  2017-07-10 13:56 ` [PATCH 25/26] [GDBserver] shorten srv_amd64_linux_xmlfiles Yao Qi
@ 2017-07-10 13:56 ` Yao Qi
  2017-07-10 13:56 ` [PATCH 22/26] Lazily and dynamically create amd64-linux target descriptions Yao Qi
                   ` (6 subsequent siblings)
  26 siblings, 0 replies; 30+ messages in thread
From: Yao Qi @ 2017-07-10 13:56 UTC (permalink / raw)
  To: gdb-patches

This patch uses GDB self test in GDBserver.  The self tests are run if
GDBserver is started with option --selftest.

We decide to still reuse GDB's selftest in GDBserver, so this patch moves
selftest.{c,h} to common/, and use some #ifdef as few as I can.

gdb:

2017-07-07  Yao Qi  <yao.qi@linaro.org>

	* NEWS: Mention GDBserver's new option "--selftest".
	* Makefile.in (SFILES): Remove selftest.c, add common/selftest.c.
	* selftest.c: Move it common/selftest.c.
	* selftest.h: Move it common/selftest.h.

gdb/gdbserver:

2017-07-07  Yao Qi  <yao.qi@linaro.org>

	* Makefile.in (OBS): Add selftest.o.
	* configure.ac: AC_DEFINE GDB_SELF_TEST if $development.
	* configure, config.in: Re-generated.
	* server.c: Include common/sefltest.h.
	(captured_main): Handle option --selftest.
	(gdbserver_usage): Print usage for "--selftest".

gdb/testsuite:

2017-05-26  Yao Qi  <yao.qi@linaro.org>

	* gdb.server/unittest.exp: New.

gdb/doc:

2017-07-07  Yao Qi  <yao.qi@linaro.org>

	* gdb.texinfo (Server): Document "--selftest".
---
 gdb/Makefile.in                       |  2 +-
 gdb/NEWS                              | 21 +++++++++++-------
 gdb/{ => common}/selftest.c           | 17 ++++++++++++---
 gdb/{ => common}/selftest.h           |  0
 gdb/doc/gdb.texinfo                   |  9 ++++++++
 gdb/gdbserver/Makefile.in             |  1 +
 gdb/gdbserver/config.in               |  3 +++
 gdb/gdbserver/configure               |  6 +++++
 gdb/gdbserver/configure.ac            |  5 +++++
 gdb/gdbserver/server.c                | 18 +++++++++++++--
 gdb/testsuite/gdb.server/unittest.exp | 41 +++++++++++++++++++++++++++++++++++
 11 files changed, 109 insertions(+), 14 deletions(-)
 rename gdb/{ => common}/selftest.c (82%)
 rename gdb/{ => common}/selftest.h (100%)
 create mode 100644 gdb/testsuite/gdb.server/unittest.exp

diff --git a/gdb/Makefile.in b/gdb/Makefile.in
index b27f698..ece7de9 100644
--- a/gdb/Makefile.in
+++ b/gdb/Makefile.in
@@ -1178,7 +1178,6 @@ SFILES = \
 	reverse.c \
 	rust-exp.y \
 	rust-lang.c \
-	selftest.c \
 	selftest-arch.c \
 	sentinel-frame.c \
 	ser-base.c \
@@ -1244,6 +1243,7 @@ SFILES = \
 	common/ptid.c \
 	common/rsp-low.c \
 	common/run-time-clock.c \
+	common/selftest.c \
 	common/signals.c \
 	common/signals-state-save-restore.c \
 	common/vec.c \
diff --git a/gdb/NEWS b/gdb/NEWS
index 9cd1df1..8fca378 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -3,14 +3,19 @@
 
 *** Changes since GDB 8.0
 
-* On Unix systems, GDBserver now does globbing expansion and variable
-  substitution in inferior command line arguments.
-
-  This is done by starting inferiors using a shell, like GDB does.
-  See "set startup-with-shell" in the user manual for how to disable
-  this from GDB when using "target extended-remote".  When using
-  "target remote", you can disable the startup with shell by using the
-  new "--no-startup-with-shell" GDBserver command line option.
+* New features in the GDB remote stub, GDBserver
+
+  ** New "--selftest" command line option runs some GDBserver self
+     tests.  These self tests are disabled in release.
+
+  ** On Unix systems, GDBserver now does globbing expansion and variable
+     substitution in inferior command line arguments.
+
+     This is done by starting inferiors using a shell, like GDB does.
+     See "set startup-with-shell" in the user manual for how to disable
+     this from GDB when using "target extended-remote".  When using
+     "target remote", you can disable the startup with shell by using the
+     new "--no-startup-with-shell" GDBserver command line option.
 
 * New remote packets
 
diff --git a/gdb/selftest.c b/gdb/common/selftest.c
similarity index 82%
rename from gdb/selftest.c
rename to gdb/common/selftest.c
index 14b76f6..d9c7ab0 100644
--- a/gdb/selftest.c
+++ b/gdb/common/selftest.c
@@ -16,7 +16,14 @@
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
-#include "defs.h"
+#include "common-defs.h"
+#ifdef GDBSERVER
+#define QUIT do {} while (0)
+#else
+#include "defs.h" /* for QUIT */
+#endif
+#include "common-exceptions.h"
+#include "common-debug.h"
 #include "selftest.h"
 #include <vector>
 
@@ -50,15 +57,19 @@ run_self_tests (void)
       CATCH (ex, RETURN_MASK_ERROR)
 	{
 	  ++failed;
+#ifndef GDBSERVER
 	  exception_fprintf (gdb_stderr, ex, _("Self test failed: "));
+#endif
 	}
       END_CATCH
 
+#ifndef GDBSERVER
       /* Clear GDB internal state.  */
       registers_changed ();
       reinit_frame_cache ();
+#endif
     }
 
-  printf_filtered (_("Ran %lu unit tests, %d failed\n"),
-		   (long) tests.size (), failed);
+  debug_printf ("Ran %lu unit tests, %d failed\n",
+		(long) tests.size (), failed);
 }
diff --git a/gdb/selftest.h b/gdb/common/selftest.h
similarity index 100%
rename from gdb/selftest.h
rename to gdb/common/selftest.h
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index 17b4c69..e26287d 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -20253,6 +20253,15 @@ environment:
 $ gdbserver --wrapper env LD_PRELOAD=libtest.so -- :2222 ./testprog
 @end smallexample
 
+@cindex @option{--selftest}
+The @option{--wrapper} option runs the self tests in @code{gdbserver}:
+
+@smallexample
+$ gdbserver --selftest
+Ran 2 unit tests, 0 failed
+@end smallexample
+
+These tests are disabled in release.
 @subsection Connecting to @code{gdbserver}
 
 The basic procedure for connecting to the remote target is:
diff --git a/gdb/gdbserver/Makefile.in b/gdb/gdbserver/Makefile.in
index 89f91aa..9b5982b 100644
--- a/gdb/gdbserver/Makefile.in
+++ b/gdb/gdbserver/Makefile.in
@@ -258,6 +258,7 @@ OBS = \
 	regcache.o \
 	remote-utils.o \
 	rsp-low.o \
+	selftest.o \
 	server.o \
 	signals.o \
 	signals-state-save-restore.o \
diff --git a/gdb/gdbserver/config.in b/gdb/gdbserver/config.in
index 34a7443..5dacbac 100644
--- a/gdb/gdbserver/config.in
+++ b/gdb/gdbserver/config.in
@@ -8,6 +8,9 @@
 /* Define to 1 if using `alloca.c'. */
 #undef C_ALLOCA
 
+/* Define if self-testing features should be enabled */
+#undef GDB_SELF_TEST
+
 /* Define to 1 if you have `alloca', as a function or macro. */
 #undef HAVE_ALLOCA
 
diff --git a/gdb/gdbserver/configure b/gdb/gdbserver/configure
index 35aeabc..30aa95b 100755
--- a/gdb/gdbserver/configure
+++ b/gdb/gdbserver/configure
@@ -5813,6 +5813,12 @@ fi
   fi
 
 
+if $development; then
+
+$as_echo "#define GDB_SELF_TEST 1" >>confdefs.h
+
+fi
+
  case ${build_alias} in
   "") build_noncanonical=${build} ;;
   *) build_noncanonical=${build_alias} ;;
diff --git a/gdb/gdbserver/configure.ac b/gdb/gdbserver/configure.ac
index 4ea7913..36e21c5 100644
--- a/gdb/gdbserver/configure.ac
+++ b/gdb/gdbserver/configure.ac
@@ -56,6 +56,11 @@ else
 fi
 GDB_AC_LIBMCHECK(${libmcheck_default})
 
+if $development; then
+  AC_DEFINE(GDB_SELF_TEST, 1,
+            [Define if self-testing features should be enabled])
+fi
+
 ACX_NONCANONICAL_TARGET
 ACX_NONCANONICAL_HOST
 
diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c
index 3838351..4ca09dd 100644
--- a/gdb/gdbserver/server.c
+++ b/gdb/gdbserver/server.c
@@ -40,6 +40,8 @@
 #include "job-control.h"
 #include "environ.h"
 
+#include "common/selftest.h"
+
 /* The environment to pass to the inferior when creating it.  */
 
 static gdb_environ our_environ;
@@ -3357,6 +3359,7 @@ gdbserver_usage (FILE *stream)
 	   "                          Options:\n"
 	   "                            vCont, Tthread, qC, qfThreadInfo and \n"
 	   "                            threads (disable all threading packets).\n"
+	   "  --selftest            Run self tests.\n"
 	   "\n"
 	   "For more information, consult the GDB manual (available as on-line \n"
 	   "info or a printed manual).\n");
@@ -3521,6 +3524,7 @@ captured_main (int argc, char *argv[])
   volatile int multi_mode = 0;
   volatile int attach = 0;
   int was_running;
+  bool selftest = false;
 
   while (*next_arg != NULL && **next_arg == '-')
     {
@@ -3639,6 +3643,8 @@ captured_main (int argc, char *argv[])
 	startup_with_shell = false;
       else if (strcmp (*next_arg, "--once") == 0)
 	run_once = 1;
+      else if (strcmp (*next_arg, "--selftest") == 0)
+	selftest = true;
       else
 	{
 	  fprintf (stderr, "Unknown argument: %s\n", *next_arg);
@@ -3654,7 +3660,8 @@ captured_main (int argc, char *argv[])
       port = *next_arg;
       next_arg++;
     }
-  if (port == NULL || (!attach && !multi_mode && *next_arg == NULL))
+  if ((port == NULL || (!attach && !multi_mode && *next_arg == NULL))
+       && !selftest)
     {
       gdbserver_usage (stderr);
       exit (1);
@@ -3670,7 +3677,8 @@ captured_main (int argc, char *argv[])
      starting the inferior.  Inferiors created in this scenario have
      stdin,stdout redirected.  So do this here before we call
      start_inferior.  */
-  remote_prepare (port);
+  if (port != NULL)
+    remote_prepare (port);
 
   bad_attach = 0;
   pid = 0;
@@ -3711,6 +3719,12 @@ captured_main (int argc, char *argv[])
   own_buf = (char *) xmalloc (PBUFSIZ + 1);
   mem_buf = (unsigned char *) xmalloc (PBUFSIZ);
 
+  if (selftest)
+    {
+      run_self_tests ();
+      throw_quit ("Quit");
+    }
+
   if (pid == 0 && *next_arg != NULL)
     {
       int i, n;
diff --git a/gdb/testsuite/gdb.server/unittest.exp b/gdb/testsuite/gdb.server/unittest.exp
new file mode 100644
index 0000000..584a23d
--- /dev/null
+++ b/gdb/testsuite/gdb.server/unittest.exp
@@ -0,0 +1,41 @@
+# This testcase is part of GDB, the GNU debugger.
+
+# Copyright 2017 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+load_lib gdbserver-support.exp
+
+standard_testfile
+
+if { [skip_gdbserver_tests] } {
+    return 0
+}
+
+global server_spawn_id
+
+set gdbserver [find_gdbserver]
+set gdbserver_command "$gdbserver --selftest"
+
+set server_spawn_id [remote_spawn target $gdbserver_command]
+
+gdb_expect {
+    -i $server_spawn_id
+    -re "Ran $decimal unit tests, 0 failed" {
+	pass "unit tests"
+    }
+    default {
+	fail "unit tests"
+    }
+}
-- 
1.9.1

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

* [PATCH 21/26] Centralize amd64-linux target descriptions
  2017-07-10 13:56 [PATCH 00/26 v3] Make GDB builtin target descriptions more flexible Yao Qi
                   ` (21 preceding siblings ...)
  2017-07-10 13:56 ` [PATCH 07/26] Lazily and dynamically create i386-linux " Yao Qi
@ 2017-07-10 13:56 ` Yao Qi
  2017-07-10 13:56 ` [PATCH 19/26] [GDBserver] Shorten srv_i386_linux_xmlfiles Yao Qi
                   ` (3 subsequent siblings)
  26 siblings, 0 replies; 30+ messages in thread
From: Yao Qi @ 2017-07-10 13:56 UTC (permalink / raw)
  To: gdb-patches

This patch adds a new function amd64_linux_read_description, which
creates amd64-linux target descriptions according to its two
arguments, xcr0 and is_x32.

gdb:

2017-06-07  Yao Qi  <yao.qi@linaro.org>

	* amd64-linux-tdep.c (amd64_linux_read_description): New
	function.
	(amd64_linux_core_read_description): Call
	amd64_linux_read_description.
	(amd64_linux_init_abi): Likewise.
	(amd64_x32_linux_init_abi): Likewise.
	* amd64-linux-tdep.h (amd64_linux_read_description): Declare.
	* x86-linux-nat.c (x86_linux_read_description): Call
	amd64_linux_read_description.
---
 gdb/amd64-linux-tdep.c | 43 +++++++++++++++++++++++++------------------
 gdb/amd64-linux-tdep.h |  6 ++++++
 gdb/x86-linux-nat.c    | 35 +----------------------------------
 3 files changed, 32 insertions(+), 52 deletions(-)

diff --git a/gdb/amd64-linux-tdep.c b/gdb/amd64-linux-tdep.c
index 56298f6..aa0d9dd 100644
--- a/gdb/amd64-linux-tdep.c
+++ b/gdb/amd64-linux-tdep.c
@@ -1575,54 +1575,61 @@ amd64_linux_record_signal (struct gdbarch *gdbarch,
   return 0;
 }
 
-/* Get Linux/x86 target description from core dump.  */
-
-static const struct target_desc *
-amd64_linux_core_read_description (struct gdbarch *gdbarch,
-				  struct target_ops *target,
-				  bfd *abfd)
+const target_desc *
+amd64_linux_read_description (uint64_t xcr0_features_bit, bool is_x32)
 {
-  /* Linux/x86-64.  */
-  uint64_t xcr0 = i386_linux_core_read_xcr0 (abfd);
-
-  switch (xcr0 & X86_XSTATE_ALL_MASK)
+  switch (xcr0_features_bit)
     {
     case X86_XSTATE_AVX_MPX_AVX512_PKU_MASK:
-      if (gdbarch_ptr_bit (gdbarch) == 32)
+      if (is_x32)
 	/* No MPX, PKU on x32, fallback to AVX-AVX512.  */
 	return tdesc_x32_avx_avx512_linux;
       else
 	return tdesc_amd64_avx_mpx_avx512_pku_linux;
     case X86_XSTATE_AVX_AVX512_MASK:
-      if (gdbarch_ptr_bit (gdbarch) == 32)
+      if (is_x32)
 	return tdesc_x32_avx_avx512_linux;
       else
 	return tdesc_amd64_avx_avx512_linux;
     case X86_XSTATE_MPX_MASK:
-      if (gdbarch_ptr_bit (gdbarch) == 32)
+      if (is_x32)
 	/* No MPX on x32, fallback to AVX.  */
 	return tdesc_x32_avx_linux;
       else
 	return tdesc_amd64_mpx_linux;
     case X86_XSTATE_AVX_MPX_MASK:
-      if (gdbarch_ptr_bit (gdbarch) == 32)
+      if (is_x32)
 	/* No MPX on x32, fallback to AVX.  */
 	return tdesc_x32_avx_linux;
       else
 	return tdesc_amd64_avx_mpx_linux;
     case X86_XSTATE_AVX_MASK:
-      if (gdbarch_ptr_bit (gdbarch) == 32)
+      if (is_x32)
 	return tdesc_x32_avx_linux;
       else
 	return tdesc_amd64_avx_linux;
     default:
-      if (gdbarch_ptr_bit (gdbarch) == 32)
+      if (is_x32)
 	return tdesc_x32_linux;
       else
 	return tdesc_amd64_linux;
     }
 }
 
+/* Get Linux/x86 target description from core dump.  */
+
+static const struct target_desc *
+amd64_linux_core_read_description (struct gdbarch *gdbarch,
+				  struct target_ops *target,
+				  bfd *abfd)
+{
+  /* Linux/x86-64.  */
+  uint64_t xcr0 = i386_linux_core_read_xcr0 (abfd);
+
+  return amd64_linux_read_description (xcr0 & X86_XSTATE_ALL_MASK,
+				       gdbarch_ptr_bit (gdbarch) == 32);
+}
+
 /* Similar to amd64_supply_fpregset, but use XSAVE extended state.  */
 
 static void
@@ -1881,7 +1888,7 @@ amd64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
   set_gdbarch_num_regs (gdbarch, AMD64_LINUX_NUM_REGS);
 
   if (! tdesc_has_registers (tdesc))
-    tdesc = tdesc_amd64_linux;
+    tdesc = amd64_linux_read_description (X86_XSTATE_SSE_MASK, false);
   tdep->tdesc = tdesc;
 
   feature = tdesc_find_feature (tdesc, "org.gnu.gdb.i386.linux");
@@ -2098,7 +2105,7 @@ amd64_x32_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
   set_gdbarch_num_regs (gdbarch, AMD64_LINUX_NUM_REGS);
 
   if (! tdesc_has_registers (tdesc))
-    tdesc = tdesc_x32_linux;
+    tdesc = amd64_linux_read_description (X86_XSTATE_SSE_MASK, true);
   tdep->tdesc = tdesc;
 
   feature = tdesc_find_feature (tdesc, "org.gnu.gdb.i386.linux");
diff --git a/gdb/amd64-linux-tdep.h b/gdb/amd64-linux-tdep.h
index 7453408..ab134a4 100644
--- a/gdb/amd64-linux-tdep.h
+++ b/gdb/amd64-linux-tdep.h
@@ -43,6 +43,12 @@ extern struct target_desc *tdesc_x32_linux;
 extern struct target_desc *tdesc_x32_avx_linux;
 extern struct target_desc *tdesc_x32_avx_avx512_linux;
 
+/* Return the right amd64-linux target descriptions according to
+   XCR0_FEATURES_BIT and IS_X32.  */
+
+const target_desc *amd64_linux_read_description (uint64_t xcr0_features_bit,
+						 bool is_x32);
+
 /* Enum that defines the syscall identifiers for amd64 linux.
    Used for process record/replay, these will be translated into
    a gdb-canonical set of syscall ids in linux-record.c.  */
diff --git a/gdb/x86-linux-nat.c b/gdb/x86-linux-nat.c
index 2c4afb1..4611527 100644
--- a/gdb/x86-linux-nat.c
+++ b/gdb/x86-linux-nat.c
@@ -192,40 +192,7 @@ x86_linux_read_description (struct target_ops *ops)
   if (is_64bit)
     {
 #ifdef __x86_64__
-      switch (xcr0_features_bits)
-	{
-	case X86_XSTATE_AVX_MPX_AVX512_PKU_MASK:
-	  if (is_x32)
-	    /* No MPX, PKU on x32, fall back to AVX-AVX512.  */
-	    return tdesc_x32_avx_avx512_linux;
-	  else
-	    return tdesc_amd64_avx_mpx_avx512_pku_linux;
-	case X86_XSTATE_AVX_AVX512_MASK:
-	  if (is_x32)
-	    return tdesc_x32_avx_avx512_linux;
-	  else
-	    return tdesc_amd64_avx_avx512_linux;
-	case X86_XSTATE_MPX_MASK:
-	  if (is_x32)
-	    return tdesc_x32_avx_linux; /* No MPX on x32 using AVX.  */
-	  else
-	    return tdesc_amd64_mpx_linux;
-	case X86_XSTATE_AVX_MPX_MASK:
-	  if (is_x32)
-	    return tdesc_x32_avx_linux; /* No MPX on x32 using AVX.  */
-	  else
-	    return tdesc_amd64_avx_mpx_linux;
-	case X86_XSTATE_AVX_MASK:
-	  if (is_x32)
-	    return tdesc_x32_avx_linux;
-	  else
-	    return tdesc_amd64_avx_linux;
-	default:
-	  if (is_x32)
-	    return tdesc_x32_linux;
-	  else
-	    return tdesc_amd64_linux;
-	}
+      return amd64_linux_read_description (xcr0_features_bits, is_x32);
 #endif
     }
   else
-- 
1.9.1

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

* [PATCH 25/26] [GDBserver] shorten srv_amd64_linux_xmlfiles
  2017-07-10 13:56 [PATCH 00/26 v3] Make GDB builtin target descriptions more flexible Yao Qi
                   ` (17 preceding siblings ...)
  2017-07-10 13:56 ` [PATCH 06/26] Generate c for feature instead of tdesc Yao Qi
@ 2017-07-10 13:56 ` Yao Qi
  2017-07-10 13:56 ` [PATCH 13/26] GDBserver self test Yao Qi
                   ` (7 subsequent siblings)
  26 siblings, 0 replies; 30+ messages in thread
From: Yao Qi @ 2017-07-10 13:56 UTC (permalink / raw)
  To: gdb-patches

GDBserver now is able to generate target descriptions from features, so
don't need to remember these target description files.

gdb/gdbserver:

2017-07-10  Yao Qi  <yao.qi@linaro.org>

	* configure.srv (srv_amd64_linux_xmlfiles): Remove
	i386/amd64-XXX-linux from it.
---
 gdb/gdbserver/configure.srv | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/gdb/gdbserver/configure.srv b/gdb/gdbserver/configure.srv
index 605649e..14ed01d 100644
--- a/gdb/gdbserver/configure.srv
+++ b/gdb/gdbserver/configure.srv
@@ -43,7 +43,7 @@ srv_i386_64bit_xmlfiles="i386/64bit-core.xml i386/64bit-segments.xml i386/64bit-
 srv_i386_xmlfiles="i386/i386.xml i386/i386-avx.xml i386/i386-avx-avx512.xml i386/i386-avx-mpx-avx512-pku.xml i386/i386-mpx.xml i386/i386-avx-mpx.xml i386/i386-mmx.xml $srv_i386_32bit_xmlfiles"
 srv_amd64_xmlfiles="i386/amd64.xml i386/amd64-avx.xml i386/amd64-avx-avx512.xml i386/amd64-avx-mpx-avx512-pku.xml i386/x32.xml i386/x32-avx.xml i386/x32-avx-avx512.xml i386/amd64-mpx.xml i386/amd64-avx-mpx.xml  $srv_i386_64bit_xmlfiles"
 srv_i386_linux_xmlfiles="i386/32bit-linux.xml $srv_i386_32bit_xmlfiles"
-srv_amd64_linux_xmlfiles="i386/amd64-linux.xml i386/amd64-avx-linux.xml i386/amd64-avx-avx512.xml i386/amd64-avx-mpx-avx512-pku-linux.xml i386/64bit-linux.xml i386/amd64-mpx-linux.xml i386/amd64-avx-mpx-linux.xml i386/x32-linux.xml i386/x32-avx-linux.xml i386/x32-avx-avx512-linux.xml $srv_i386_64bit_xmlfiles"
+srv_amd64_linux_xmlfiles="i386/64bit-linux.xml $srv_i386_64bit_xmlfiles"
 
 
 # Linux object files.  This is so we don't have to repeat
-- 
1.9.1

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

* [PATCH 20/26] Update comments in amd64_linux_core_read_description
  2017-07-10 13:56 [PATCH 00/26 v3] Make GDB builtin target descriptions more flexible Yao Qi
                   ` (4 preceding siblings ...)
  2017-07-10 13:56 ` [PATCH 09/26] Adjust code generated by regformats/regdat.sh Yao Qi
@ 2017-07-10 13:56 ` Yao Qi
  2017-07-10 13:56 ` [PATCH 11/26] Return X86_TDESC_MMX in x86_get_ipa_tdesc_idx Yao Qi
                   ` (20 subsequent siblings)
  26 siblings, 0 replies; 30+ messages in thread
From: Yao Qi @ 2017-07-10 13:56 UTC (permalink / raw)
  To: gdb-patches

gdb:

2017-07-06  Yao Qi  <yao.qi@linaro.org>

	* amd64-linux-tdep.c (amd64_linux_core_read_description): Update
	comments.
---
 gdb/amd64-linux-tdep.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/gdb/amd64-linux-tdep.c b/gdb/amd64-linux-tdep.c
index 4ef0f78..56298f6 100644
--- a/gdb/amd64-linux-tdep.c
+++ b/gdb/amd64-linux-tdep.c
@@ -1589,7 +1589,7 @@ amd64_linux_core_read_description (struct gdbarch *gdbarch,
     {
     case X86_XSTATE_AVX_MPX_AVX512_PKU_MASK:
       if (gdbarch_ptr_bit (gdbarch) == 32)
-	  /* No MPX on x32, fallback to AVX-AVX512.  */
+	/* No MPX, PKU on x32, fallback to AVX-AVX512.  */
 	return tdesc_x32_avx_avx512_linux;
       else
 	return tdesc_amd64_avx_mpx_avx512_pku_linux;
@@ -1600,13 +1600,13 @@ amd64_linux_core_read_description (struct gdbarch *gdbarch,
 	return tdesc_amd64_avx_avx512_linux;
     case X86_XSTATE_MPX_MASK:
       if (gdbarch_ptr_bit (gdbarch) == 32)
-	  /* No MPX on x32, fallback to AVX-AVX512.  */
+	/* No MPX on x32, fallback to AVX.  */
 	return tdesc_x32_avx_linux;
       else
 	return tdesc_amd64_mpx_linux;
     case X86_XSTATE_AVX_MPX_MASK:
       if (gdbarch_ptr_bit (gdbarch) == 32)
-	  /* No MPX on x32, fallback to AVX-AVX512.  */
+	/* No MPX on x32, fallback to AVX.  */
 	return tdesc_x32_avx_linux;
       else
 	return tdesc_amd64_avx_mpx_linux;
-- 
1.9.1

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

* [PATCH 09/26] Adjust code generated by regformats/regdat.sh
  2017-07-10 13:56 [PATCH 00/26 v3] Make GDB builtin target descriptions more flexible Yao Qi
                   ` (3 preceding siblings ...)
  2017-07-10 13:56 ` [PATCH 12/26] [GDBserver] Centralize tdesc for i386-linux Yao Qi
@ 2017-07-10 13:56 ` Yao Qi
  2017-07-10 13:56 ` [PATCH 20/26] Update comments in amd64_linux_core_read_description Yao Qi
                   ` (21 subsequent siblings)
  26 siblings, 0 replies; 30+ messages in thread
From: Yao Qi @ 2017-07-10 13:56 UTC (permalink / raw)
  To: gdb-patches

regformats/regdat.sh generate some *-generated.c files when GDBserver
is built.  Each .c file has some static variables, which are only used
within function init_registers_XXX, like this,

static struct reg regs_i386_linux[] = {
  { "eax", 0, 32 },
  { "ecx", 32, 32 },
  ...
};

static const char *expedite_regs_i386_linux[] = { "ebp", "esp", "eip", 0 };
static const char *xmltarget_i386_linux = "i386-linux.xml";

void
init_registers_i386_linux (void)
{
  ...
}

This patch moves these static variables' definitions to function
init_registers_XXX, so the generated files look like this,

void
init_registers_i386_linux (void)
{
  static struct target_desc tdesc_i386_linux_s;
  struct target_desc *result = &tdesc_i386_linux_s;
static struct reg regs_i386_linux[] = {
  ...
};

static const char *expedite_regs_i386_linux[] = { "ebp", "esp", "eip", 0 };
static const char *xmltarget_i386_linux = "i386-linux.xml";

  ...
}

We want GDBserver create target descriptions dynamically in each
init_registers_XXXX functions, so this patch moves all the related code
into function init_registers_XXXX, so that the following patch can easily
change function init_registers_XXXX to create target description
dynamically, rather than using current pre-generated array.

gdb:

2017-06-06  Yao Qi  <yao.qi@linaro.org>

	* regformats/regdat.sh: Adjust code order.
---
 gdb/regformats/regdat.sh | 17 +++++++++--------
 1 file changed, 9 insertions(+), 8 deletions(-)

diff --git a/gdb/regformats/regdat.sh b/gdb/regformats/regdat.sh
index 651f703..2c764cd 100755
--- a/gdb/regformats/regdat.sh
+++ b/gdb/regformats/regdat.sh
@@ -123,6 +123,15 @@ while do_read
 do
   if test "${type}" = "name"; then
     name="${entry}"
+
+    echo "const struct target_desc *tdesc_${name};"
+    echo ""
+    echo "void"
+    echo "init_registers_${name} (void)"
+    echo "{"
+    echo "  static struct target_desc tdesc_${name}_s;"
+    echo "  struct target_desc *result = &tdesc_${name}_s;"
+
     echo "static struct reg regs_${name}[] = {"
     continue
   elif test "${type}" = "xmltarget"; then
@@ -169,14 +178,6 @@ fi
 echo
 
 cat <<EOF
-const struct target_desc *tdesc_${name};
-
-void
-init_registers_${name} (void)
-{
-  static struct target_desc tdesc_${name}_s;
-  struct target_desc *result = &tdesc_${name}_s;
-
   result->reg_defs = regs_${name};
   result->num_registers = sizeof (regs_${name}) / sizeof (regs_${name}[0]);
 
-- 
1.9.1

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

* [PATCH 00/26 v3] Make GDB builtin target descriptions more flexible
@ 2017-07-10 13:56 Yao Qi
  2017-07-10 13:55 ` [PATCH 01/26] Improve doc about "maint print c-tdesc" Yao Qi
                   ` (26 more replies)
  0 siblings, 27 replies; 30+ messages in thread
From: Yao Qi @ 2017-07-10 13:56 UTC (permalink / raw)
  To: gdb-patches

This patch series is to change GDB and GDBserver builtin target
descriptions more flexible, by removing pre-generated ones.  Nowadays,
GDB builtin target descriptions are created from initialize_tdesc_*
functions in features/*.c files, while GDBserver builtin target
descriptions are generated from regformats/*.dat files.  Instead,
with these patches applied, these builtin target descriptions can be
got lazily and dynamically.

This patch series changes both GDB and GDBserver to create target
description dynamically from features, instead of using pre-generated
target descriptions.  This patch series only convert x86-linux
(including i386-linux, amd64-linux and x32-linux) target description
to demonstrate the usefulness of the change.

Once one target architecture switches to the new flexible target
description,

 - We only need xml feature files under gdb/features directory.  All
 existing target description xml files can be kept for tests.  Add
 new xml feature file if we want to support the new feature, but
 don't need to add new target description xml files.

 - All existing gdb/regformats/*.dat are not used, but kept for
 the tests.

This is the v3, v2 can be found here
https://sourceware.org/ml/gdb-patches/2017-06/msg00293.html
The v3 address the comments to v2 (I hope), and share the target
description creation code between GDB and GDBserver.  Regression
tested on x86_64-linux (-m64 and -m32), both native and gdbserver.

I pushed my branch to users/qiyao/target-desc-3.

The size of both GDB and GDBserver is reduced, "dev" means
development=true, while "rel" means it is false.

$ size ./gdb-dev-before ./gdb-dev-after 
   text	   data	    bss	    dec	    hex	filename
7766157	 143712	 181344	8091213	 7b764d	./gdb-dev-before
7727869	 143712	 182016	8053597	 7ae35d	./gdb-dev-after

$ size ./gdbserver-dev-before ./gdbserver-dev-after 
   text	   data	    bss	    dec	    hex	filename
1164512	  47744	  40560	1252816	 131dd0	./gdbserver-dev-before
1223188	  27856	  41360	1292404	 13b874	./gdbserver-dev-after
$ ls -l ./gdbserver-dev-before ./gdbserver-dev-after 
-rwxr-xr-x 1 yao.qi primary 4310160 Jul 10 11:49 ./gdbserver-dev-after
-rwxr-xr-x 1 yao.qi primary 3966968 Jul 10 11:31 ./gdbserver-dev-before

$ size ./gdbserver-rel-before ./gdbserver-rel-after 
   text	   data	    bss	    dec	    hex	filename
1164336	  47736	  40560	1252632	 131d18	./gdbserver-rel-before
1171548	  27336	  39824	1238708	 12e6b4	./gdbserver-rel-after
$ ls -l ./gdbserver-rel-before ./gdbserver-rel-after
-rwxr-xr-x 1 yao.qi primary 3923776 Jul 10 11:43 ./gdbserver-rel-after
-rwxr-xr-x 1 yao.qi primary 3966744 Jul 10 11:37 ./gdbserver-rel-before

*** BLURB HERE ***

Yao Qi (26):
  Improve doc about "maint print c-tdesc"
  Class-fy target_desc
  Add optional argument to command "maint prints c-tdesc"
  Centralize i386 linux target descriptions
  Use visitor pattern for "maint print c-tdesc"
  Generate c for feature instead of tdesc
  Lazily and dynamically create i386-linux target descriptions
  Add "maint check xml-descriptions" to test builtin xml target
    descriptions
  Adjust code generated by regformats/regdat.sh
  Use VEC for target_desc.reg_defs
  Return X86_TDESC_MMX in x86_get_ipa_tdesc_idx
  [GDBserver] Centralize tdesc for i386-linux
  GDBserver self test
  [GDBserver] unit test to i386_tdesc
  Dynamically composite xml in reply to GDB
  Share i386-linux target description between GDB and GDBserver
  Remove features/i386/i386-*linux.c
  [GDBserver] Use pre-generated tdesc as test
  [GDBserver] Shorten srv_i386_linux_xmlfiles
  Update comments in amd64_linux_core_read_description
  Centralize amd64-linux target descriptions
  Lazily and dynamically create amd64-linux target descriptions
  Convert amd64-linux target descriptions
  [GDBserver] Use pre-generated amd64-linux tdesc as test
  [GDBserver] shorten srv_amd64_linux_xmlfiles
  Remove features/i386/amd64-*linux.c and features/i386/x32-*linux.c

 gdb/Makefile.in                                    |    6 +-
 gdb/NEWS                                           |   22 +-
 gdb/amd64-linux-tdep.c                             |  121 +--
 gdb/amd64-linux-tdep.h                             |    6 +
 gdb/arch/amd64.c                                   |   71 ++
 gdb/arch/amd64.h                                   |   21 +
 gdb/arch/i386.c                                    |   66 ++
 gdb/arch/i386.h                                    |   21 +
 gdb/arch/tdesc.h                                   |   92 ++
 gdb/cli/cli-cmds.c                                 |    4 +
 gdb/{ => common}/selftest.c                        |   17 +-
 gdb/{ => common}/selftest.h                        |    0
 gdb/configure.tgt                                  |    7 +-
 gdb/doc/gdb.texinfo                                |   27 +-
 gdb/features/Makefile                              |   63 +-
 gdb/features/aarch64.c                             |    8 +-
 gdb/features/arc-arcompact.c                       |    8 +-
 gdb/features/arc-v2.c                              |    8 +-
 gdb/features/arm/arm-with-iwmmxt.c                 |    8 +-
 gdb/features/arm/arm-with-m-fpa-layout.c           |    4 +-
 gdb/features/arm/arm-with-m-vfp-d16.c              |    4 +-
 gdb/features/arm/arm-with-m.c                      |    4 +-
 gdb/features/arm/arm-with-neon.c                   |    4 +-
 gdb/features/arm/arm-with-vfpv2.c                  |    4 +-
 gdb/features/arm/arm-with-vfpv3.c                  |    4 +-
 gdb/features/i386/32bit-avx.c                      |   21 +
 gdb/features/i386/32bit-avx512.c                   |   33 +
 gdb/features/i386/32bit-core.c                     |   66 ++
 gdb/features/i386/32bit-linux.c                    |   15 +
 gdb/features/i386/32bit-mpx.c                      |   51 +
 gdb/features/i386/32bit-pkeys.c                    |   14 +
 gdb/features/i386/32bit-sse.c                      |   75 ++
 gdb/features/i386/64bit-avx.c                      |   29 +
 gdb/features/i386/64bit-avx512.c                   |  124 +++
 gdb/features/i386/64bit-core.c                     |   74 ++
 gdb/features/i386/64bit-linux.c                    |   15 +
 gdb/features/i386/64bit-mpx.c                      |   51 +
 gdb/features/i386/64bit-pkeys.c                    |   14 +
 gdb/features/i386/64bit-segments.c                 |   15 +
 gdb/features/i386/64bit-sse.c                      |   83 ++
 gdb/features/i386/amd64-avx-avx512-linux.c         |  288 ------
 gdb/features/i386/amd64-avx-avx512.c               |    8 +-
 gdb/features/i386/amd64-avx-linux.c                |  177 ----
 gdb/features/i386/amd64-avx-mpx-avx512-pku-linux.c |  329 -------
 gdb/features/i386/amd64-avx-mpx-avx512-pku.c       |    8 +-
 gdb/features/i386/amd64-avx-mpx-linux.c            |  215 -----
 gdb/features/i386/amd64-avx-mpx.c                  |    8 +-
 gdb/features/i386/amd64-avx.c                      |    8 +-
 gdb/features/i386/amd64-linux.c                    |  159 ---
 gdb/features/i386/amd64-mpx-linux.c                |  197 ----
 gdb/features/i386/amd64-mpx.c                      |    8 +-
 gdb/features/i386/amd64.c                          |    8 +-
 gdb/features/i386/i386-avx-avx512-linux.c          |  170 ----
 gdb/features/i386/i386-avx-avx512.c                |    8 +-
 gdb/features/i386/i386-avx-linux.c                 |  149 ---
 gdb/features/i386/i386-avx-mpx-avx512-pku-linux.c  |  211 ----
 gdb/features/i386/i386-avx-mpx-avx512-pku.c        |    8 +-
 gdb/features/i386/i386-avx-mpx-linux.c             |  187 ----
 gdb/features/i386/i386-avx-mpx.c                   |    8 +-
 gdb/features/i386/i386-avx.c                       |    8 +-
 gdb/features/i386/i386-linux.c                     |  139 ---
 gdb/features/i386/i386-mmx-linux.c                 |   78 --
 gdb/features/i386/i386-mmx.c                       |    8 +-
 gdb/features/i386/i386-mpx-linux.c                 |  177 ----
 gdb/features/i386/i386-mpx.c                       |    8 +-
 gdb/features/i386/i386.c                           |    8 +-
 gdb/features/i386/x32-avx-avx512-linux.c           |  288 ------
 gdb/features/i386/x32-avx-avx512.c                 |    8 +-
 gdb/features/i386/x32-avx-linux.c                  |  177 ----
 gdb/features/i386/x32-avx.c                        |    8 +-
 gdb/features/i386/x32-core.c                       |   74 ++
 gdb/features/i386/x32-linux.c                      |  159 ---
 gdb/features/i386/x32.c                            |    8 +-
 gdb/features/mips-dsp-linux.c                      |    4 +-
 gdb/features/mips-linux.c                          |    4 +-
 gdb/features/mips64-dsp-linux.c                    |    4 +-
 gdb/features/mips64-linux.c                        |    4 +-
 gdb/features/nds32.c                               |    4 +-
 gdb/features/nios2-linux.c                         |    4 +-
 gdb/features/nios2.c                               |    4 +-
 gdb/features/rs6000/powerpc-32.c                   |    4 +-
 gdb/features/rs6000/powerpc-32l.c                  |    4 +-
 gdb/features/rs6000/powerpc-64.c                   |    4 +-
 gdb/features/rs6000/powerpc-64l.c                  |    4 +-
 gdb/features/rs6000/powerpc-7400.c                 |    4 +-
 gdb/features/rs6000/powerpc-altivec32.c            |    8 +-
 gdb/features/rs6000/powerpc-altivec32l.c           |    8 +-
 gdb/features/rs6000/powerpc-altivec64.c            |    8 +-
 gdb/features/rs6000/powerpc-altivec64l.c           |    8 +-
 gdb/features/rs6000/powerpc-cell32l.c              |    8 +-
 gdb/features/rs6000/powerpc-cell64l.c              |    8 +-
 gdb/features/rs6000/powerpc-e500.c                 |    4 +-
 gdb/features/rs6000/powerpc-e500l.c                |    4 +-
 gdb/features/rs6000/powerpc-isa205-32l.c           |    4 +-
 gdb/features/rs6000/powerpc-isa205-64l.c           |    4 +-
 gdb/features/rs6000/powerpc-isa205-altivec32l.c    |    8 +-
 gdb/features/rs6000/powerpc-isa205-altivec64l.c    |    8 +-
 gdb/features/rs6000/powerpc-isa205-vsx32l.c        |    8 +-
 gdb/features/rs6000/powerpc-isa205-vsx64l.c        |    8 +-
 gdb/features/rs6000/powerpc-vsx32.c                |    8 +-
 gdb/features/rs6000/powerpc-vsx32l.c               |    8 +-
 gdb/features/rs6000/powerpc-vsx64.c                |    8 +-
 gdb/features/rs6000/powerpc-vsx64l.c               |    8 +-
 gdb/features/rs6000/rs6000.c                       |    4 +-
 gdb/features/s390-linux32.c                        |    4 +-
 gdb/features/s390-linux32v1.c                      |    4 +-
 gdb/features/s390-linux32v2.c                      |    4 +-
 gdb/features/s390-linux64.c                        |    4 +-
 gdb/features/s390-linux64v1.c                      |    4 +-
 gdb/features/s390-linux64v2.c                      |    4 +-
 gdb/features/s390-te-linux64.c                     |    4 +-
 gdb/features/s390-tevx-linux64.c                   |    8 +-
 gdb/features/s390-vx-linux64.c                     |    8 +-
 gdb/features/s390x-linux64.c                       |    4 +-
 gdb/features/s390x-linux64v1.c                     |    4 +-
 gdb/features/s390x-linux64v2.c                     |    4 +-
 gdb/features/s390x-te-linux64.c                    |    4 +-
 gdb/features/s390x-tevx-linux64.c                  |    8 +-
 gdb/features/s390x-vx-linux64.c                    |    8 +-
 gdb/features/tic6x-c62x-linux.c                    |    4 +-
 gdb/features/tic6x-c62x.c                          |    4 +-
 gdb/features/tic6x-c64x-linux.c                    |    4 +-
 gdb/features/tic6x-c64x.c                          |    4 +-
 gdb/features/tic6x-c64xp-linux.c                   |    4 +-
 gdb/features/tic6x-c64xp.c                         |    4 +-
 gdb/gdbcmd.h                                       |    4 +
 gdb/gdbserver/Makefile.in                          |   14 +
 gdb/gdbserver/config.in                            |    3 +
 gdb/gdbserver/configure                            |    6 +
 gdb/gdbserver/configure.ac                         |    5 +
 gdb/gdbserver/configure.srv                        |   32 +-
 gdb/gdbserver/linux-amd64-ipa.c                    |   55 +-
 gdb/gdbserver/linux-i386-ipa.c                     |   39 +-
 gdb/gdbserver/linux-x86-low.c                      |  146 +--
 gdb/gdbserver/linux-x86-tdesc-selftest.c           |  183 ++++
 gdb/gdbserver/linux-x86-tdesc.c                    |  173 ++++
 gdb/gdbserver/linux-x86-tdesc.h                    |   78 +-
 gdb/gdbserver/regcache.c                           |   34 +-
 gdb/gdbserver/server.c                             |   28 +-
 gdb/gdbserver/tdesc.c                              |  186 +++-
 gdb/gdbserver/tdesc.h                              |  106 +-
 gdb/i386-linux-tdep.c                              |   94 +-
 gdb/i386-linux-tdep.h                              |   10 +-
 gdb/maint.c                                        |   18 +
 gdb/regformats/regdat.sh                           |   26 +-
 gdb/regformats/regdef.h                            |   12 +
 gdb/target-descriptions.c                          | 1013 ++++++++++++++------
 gdb/target-descriptions.h                          |   49 +-
 gdb/testsuite/gdb.gdb/unittest.exp                 |    5 +
 gdb/testsuite/gdb.server/unittest.exp              |   41 +
 gdb/x86-linux-nat.c                                |   59 +-
 151 files changed, 3114 insertions(+), 4167 deletions(-)
 create mode 100644 gdb/arch/amd64.c
 create mode 100644 gdb/arch/amd64.h
 create mode 100644 gdb/arch/i386.c
 create mode 100644 gdb/arch/i386.h
 create mode 100644 gdb/arch/tdesc.h
 rename gdb/{ => common}/selftest.c (82%)
 rename gdb/{ => common}/selftest.h (100%)
 create mode 100644 gdb/features/i386/32bit-avx.c
 create mode 100644 gdb/features/i386/32bit-avx512.c
 create mode 100644 gdb/features/i386/32bit-core.c
 create mode 100644 gdb/features/i386/32bit-linux.c
 create mode 100644 gdb/features/i386/32bit-mpx.c
 create mode 100644 gdb/features/i386/32bit-pkeys.c
 create mode 100644 gdb/features/i386/32bit-sse.c
 create mode 100644 gdb/features/i386/64bit-avx.c
 create mode 100644 gdb/features/i386/64bit-avx512.c
 create mode 100644 gdb/features/i386/64bit-core.c
 create mode 100644 gdb/features/i386/64bit-linux.c
 create mode 100644 gdb/features/i386/64bit-mpx.c
 create mode 100644 gdb/features/i386/64bit-pkeys.c
 create mode 100644 gdb/features/i386/64bit-segments.c
 create mode 100644 gdb/features/i386/64bit-sse.c
 delete mode 100644 gdb/features/i386/amd64-avx-avx512-linux.c
 delete mode 100644 gdb/features/i386/amd64-avx-linux.c
 delete mode 100644 gdb/features/i386/amd64-avx-mpx-avx512-pku-linux.c
 delete mode 100644 gdb/features/i386/amd64-avx-mpx-linux.c
 delete mode 100644 gdb/features/i386/amd64-linux.c
 delete mode 100644 gdb/features/i386/amd64-mpx-linux.c
 delete mode 100644 gdb/features/i386/i386-avx-avx512-linux.c
 delete mode 100644 gdb/features/i386/i386-avx-linux.c
 delete mode 100644 gdb/features/i386/i386-avx-mpx-avx512-pku-linux.c
 delete mode 100644 gdb/features/i386/i386-avx-mpx-linux.c
 delete mode 100644 gdb/features/i386/i386-linux.c
 delete mode 100644 gdb/features/i386/i386-mmx-linux.c
 delete mode 100644 gdb/features/i386/i386-mpx-linux.c
 delete mode 100644 gdb/features/i386/x32-avx-avx512-linux.c
 delete mode 100644 gdb/features/i386/x32-avx-linux.c
 create mode 100644 gdb/features/i386/x32-core.c
 delete mode 100644 gdb/features/i386/x32-linux.c
 create mode 100644 gdb/gdbserver/linux-x86-tdesc-selftest.c
 create mode 100644 gdb/gdbserver/linux-x86-tdesc.c
 create mode 100644 gdb/testsuite/gdb.server/unittest.exp

-- 
1.9.1

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

* [PATCH 16/26] Share i386-linux target description between GDB and GDBserver
  2017-07-10 13:56 [PATCH 00/26 v3] Make GDB builtin target descriptions more flexible Yao Qi
                   ` (10 preceding siblings ...)
  2017-07-10 13:56 ` [PATCH 17/26] Remove features/i386/i386-*linux.c Yao Qi
@ 2017-07-10 13:56 ` Yao Qi
  2017-07-10 13:56 ` [PATCH 14/26] [GDBserver] unit test to i386_tdesc Yao Qi
                   ` (14 subsequent siblings)
  26 siblings, 0 replies; 30+ messages in thread
From: Yao Qi @ 2017-07-10 13:56 UTC (permalink / raw)
  To: gdb-patches

The code on creating i386-linux target descriptions are quite similar
between GDB and GDBserver, so this patch moves them into a shared file
arch/i386.c.  I didn't name it as i386-linux.c, because I want to reuse it
to create other i386 non-linux target descriptions later.

gdb:

2017-07-05  Yao Qi  <yao.qi@linaro.org>

	* Makefile.in (ALL_TARGET_OBS): Add i386.o.
	(SFILES): Add arch/i386.c.
	(HFILES_NO_SRCDIR): Add arch/i386.h.
	* arch/i386.c: New file.
	* arch/i386.h: New file.
	* arch/tdesc.h (allocate_target_description): Declare.
	(set_tdesc_architecture): Declare.
	(set_tdesc_osabi): Declare.
	* configure.tgt (i[34567]86-*-linux*): Add i386.o.
	* i386-linux-tdep.c: Don't include ../features/i386/32bit-XXX.c.
	include arch/i386.h.
	(i386_linux_read_description): Remove code and call
	i386_create_target_description.
	(set_tdesc_architecture): New function.
	(set_tdesc_osabi): New function.
	* target-descriptions.h (allocate_target_description): Remove.

gdb/gdbserver:

2017-07-05  Yao Qi  <yao.qi@linaro.org>

	* Makefile.in (arch-i386.o): New rule.
	* configure.srv (i[34567]86-*-linux*): Add arch-i386.o.
	(x86_64-*-linux*): Likewise.
	* linux-x86-tdesc.c: Don't include ../features/i386/32bit-XXX.c,
	include arch/i386.h.
	(i386_linux_read_description): Remove code and call
	i386_create_target_description.
	* tdesc.c (allocate_target_description): New function.
	* tdesc.h (set_tdesc_architecture): Remove declaration.
	(set_tdesc_osabi): Likewise.
---
 gdb/Makefile.in                 |  3 ++
 gdb/arch/i386.c                 | 66 +++++++++++++++++++++++++++++++++++++++++
 gdb/arch/i386.h                 | 21 +++++++++++++
 gdb/arch/tdesc.h                | 10 +++++++
 gdb/configure.tgt               |  5 ++--
 gdb/gdbserver/Makefile.in       |  8 +++++
 gdb/gdbserver/configure.srv     |  3 ++
 gdb/gdbserver/linux-x86-tdesc.c | 39 ++----------------------
 gdb/gdbserver/tdesc.c           | 10 +++++++
 gdb/gdbserver/tdesc.h           |  4 ---
 gdb/i386-linux-tdep.c           | 36 ++--------------------
 gdb/target-descriptions.c       | 17 +++++++++++
 gdb/target-descriptions.h       |  1 -
 13 files changed, 146 insertions(+), 77 deletions(-)
 create mode 100644 gdb/arch/i386.c
 create mode 100644 gdb/arch/i386.h

diff --git a/gdb/Makefile.in b/gdb/Makefile.in
index ece7de9..c9af3f6 100644
--- a/gdb/Makefile.in
+++ b/gdb/Makefile.in
@@ -812,6 +812,7 @@ ALL_TARGET_OBS = \
 	hppa-nbsd-tdep.o \
 	hppa-obsd-tdep.o \
 	hppa-tdep.o \
+	i386.o \
 	i386-bsd-tdep.o \
 	i386-cygwin-tdep.o \
 	i386-darwin-tdep.o \
@@ -1030,6 +1031,7 @@ SFILES = \
 	agent.c \
 	annotate.c \
 	arch-utils.c \
+	arch/i386.c \
 	auto-load.c \
 	auxv.c \
 	ax-gdb.c \
@@ -1500,6 +1502,7 @@ HFILES_NO_SRCDIR = \
 	xtensa-tdep.h \
 	arch/aarch64-insn.h \
 	arch/arm.h \
+	arch/i386.h \
 	cli/cli-cmds.h \
 	cli/cli-decode.h \
 	cli/cli-script.h \
diff --git a/gdb/arch/i386.c b/gdb/arch/i386.c
new file mode 100644
index 0000000..3099a7b
--- /dev/null
+++ b/gdb/arch/i386.c
@@ -0,0 +1,66 @@
+/* Copyright (C) 2017 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "i386.h"
+#include "tdesc.h"
+#include "x86-xstate.h"
+#include <stdlib.h>
+
+#include "../features/i386/32bit-core.c"
+#include "../features/i386/32bit-linux.c"
+#include "../features/i386/32bit-sse.c"
+#include "../features/i386/32bit-avx.c"
+#include "../features/i386/32bit-avx512.c"
+#include "../features/i386/32bit-mpx.c"
+#include "../features/i386/32bit-pkeys.c"
+
+/* Create i386 target descriptions according to XCR0.  */
+
+target_desc *
+i386_create_target_description (uint64_t xcr0)
+{
+  target_desc *tdesc = allocate_target_description ();
+
+#ifndef IN_PROCESS_AGENT
+      set_tdesc_architecture (tdesc, "i386");
+      set_tdesc_osabi (tdesc, "GNU/Linux");
+#endif
+
+  long regnum = 0;
+
+  if (xcr0 & X86_XSTATE_X87)
+    regnum = create_feature_i386_32bit_core (tdesc, regnum);
+
+  if (xcr0 & X86_XSTATE_SSE)
+    regnum = create_feature_i386_32bit_sse (tdesc, regnum);
+
+  regnum = create_feature_i386_32bit_linux (tdesc, regnum);
+
+  if (xcr0 & X86_XSTATE_AVX)
+    regnum = create_feature_i386_32bit_avx (tdesc, regnum);
+
+  if (xcr0 & X86_XSTATE_MPX)
+    regnum = create_feature_i386_32bit_mpx (tdesc, regnum);
+
+  if (xcr0 & X86_XSTATE_AVX512)
+    regnum = create_feature_i386_32bit_avx512 (tdesc, regnum);
+
+  if (xcr0 & X86_XSTATE_PKRU)
+    regnum = create_feature_i386_32bit_pkeys (tdesc, regnum);
+
+  return tdesc;
+}
diff --git a/gdb/arch/i386.h b/gdb/arch/i386.h
new file mode 100644
index 0000000..0163372
--- /dev/null
+++ b/gdb/arch/i386.h
@@ -0,0 +1,21 @@
+/* Copyright (C) 2017 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "tdesc.h"
+#include <stdint.h>
+
+target_desc *i386_create_target_description (uint64_t xcr0);
diff --git a/gdb/arch/tdesc.h b/gdb/arch/tdesc.h
index bf50e24..78bb0fb 100644
--- a/gdb/arch/tdesc.h
+++ b/gdb/arch/tdesc.h
@@ -23,6 +23,16 @@ struct tdesc_type;
 struct tdesc_reg;
 struct target_desc;
 
+/* Allocate a new target_desc.  */
+target_desc *allocate_target_description (void);
+
+/* Set TARGET_DESC's architecture by NAME.  */
+void set_tdesc_architecture (target_desc *target_desc,
+			     const char *name);
+
+/* Set TARGET_DESC's osabi by NAME.  */
+void set_tdesc_osabi (target_desc *target_desc, const char *name);
+
 /* Return the type associated with ID in the context of FEATURE, or
    NULL if none.  */
 struct tdesc_type *tdesc_named_type (const struct tdesc_feature *feature,
diff --git a/gdb/configure.tgt b/gdb/configure.tgt
index fdcb7b1..1f263515 100644
--- a/gdb/configure.tgt
+++ b/gdb/configure.tgt
@@ -228,7 +228,8 @@ i[34567]86-*-solaris*)
 	;;
 i[34567]86-*-linux*)
 	# Target: Intel 386 running GNU/Linux
-	gdb_target_obs="i386-tdep.o i386-linux-tdep.o glibc-tdep.o i387-tdep.o \
+	gdb_target_obs="i386-tdep.o i386.o i386-linux-tdep.o \
+			glibc-tdep.o i387-tdep.o \
 			solib-svr4.o symfile-mem.o \
 			linux-tdep.o linux-record.o"
 	if test "x$enable_64_bit_bfd" = "xyes"; then
@@ -678,7 +679,7 @@ x86_64-*-elf*)
 x86_64-*-linux*)
 	# Target: GNU/Linux x86-64
 	gdb_target_obs="amd64-tdep.o amd64-linux-tdep.o i386-tdep.o \
-			i387-tdep.o i386-linux-tdep.o glibc-tdep.o \
+			i387-tdep.o i386.o i386-linux-tdep.o glibc-tdep.o \
 			solib-svr4.o symfile-mem.o linux-tdep.o linux-record.o"
 	build_gdbserver=yes
 	;;
diff --git a/gdb/gdbserver/Makefile.in b/gdb/gdbserver/Makefile.in
index 9b5982b..5f9b2fe 100644
--- a/gdb/gdbserver/Makefile.in
+++ b/gdb/gdbserver/Makefile.in
@@ -528,6 +528,10 @@ ax.o: ax.c
 	$(COMPILE) $(WARN_CFLAGS_NO_FORMAT) $<
 	$(POSTCOMPILE)
 
+arch-i386.o: ../arch/i386.c
+	$(COMPILE) $<
+	$(POSTCOMPILE)
+
 # Rules for objects that go in the in-process agent.
 
 %-ipa.o: %-generated.c
@@ -553,6 +557,10 @@ ax.o: ax.c
 	$(IPAGENT_COMPILE) $<
 	$(POSTCOMPILE)
 
+%-ipa.o: ../arch/%.c
+	$(IPAGENT_COMPILE) $<
+	$(POSTCOMPILE)
+
 # Rules for objects that go in the gdbserver binary.
 
 %.o: %-generated.c
diff --git a/gdb/gdbserver/configure.srv b/gdb/gdbserver/configure.srv
index 1a5801a..c724fec 100644
--- a/gdb/gdbserver/configure.srv
+++ b/gdb/gdbserver/configure.srv
@@ -121,6 +121,7 @@ case "${target}" in
 			    srv_xmlfiles="${srv_xmlfiles} $srv_amd64_linux_xmlfiles"
 			    srv_tgtobj="amd64-linux-siginfo.o"
 			fi
+			srv_tgtobj="${srv_tgtobj} arch-i386.o"
 			srv_tgtobj="${srv_tgtobj} $srv_linux_obj linux-x86-low.o x86-low.o x86-dregs.o i387-fp.o"
 			srv_tgtobj="${srv_tgtobj} linux-x86-tdesc.o"
 			srv_tgtobj="${srv_tgtobj} linux-btrace.o x86-linux.o"
@@ -130,6 +131,7 @@ case "${target}" in
 			srv_linux_thread_db=yes
 			srv_linux_btrace=yes
 			ipa_obj="${ipa_i386_linux_regobj} linux-i386-ipa.o linux-x86-tdesc-ipa.o"
+			ipa_obj="${ipa_obj} i386-ipa.o"
 			;;
   i[34567]86-*-lynxos*)	srv_regobj="i386.o"
 			srv_tgtobj="lynx-low.o lynx-i386-low.o fork-child.o fork-inferior.o"
@@ -357,6 +359,7 @@ case "${target}" in
 			;;
   x86_64-*-linux*)	srv_regobj="$srv_amd64_linux_regobj $srv_i386_linux_regobj"
 			srv_tgtobj="$srv_linux_obj linux-x86-low.o x86-low.o x86-dregs.o i387-fp.o"
+			srv_tgtobj="${srv_tgtobj} arch-i386.o"
 			srv_tgtobj="${srv_tgtobj} linux-x86-tdesc.o"
 			srv_tgtobj="${srv_tgtobj} linux-btrace.o x86-linux.o"
 			srv_tgtobj="${srv_tgtobj} x86-linux-dregs.o"
diff --git a/gdb/gdbserver/linux-x86-tdesc.c b/gdb/gdbserver/linux-x86-tdesc.c
index f17e303..fb75ad3 100644
--- a/gdb/gdbserver/linux-x86-tdesc.c
+++ b/gdb/gdbserver/linux-x86-tdesc.c
@@ -20,16 +20,10 @@
 #include "server.h"
 #include "tdesc.h"
 #include "linux-x86-tdesc.h"
-#include "x86-xstate.h"
+#include "arch/i386.h"
+#include "common/x86-xstate.h"
 
 #if defined __i386__ || !defined IN_PROCESS_AGENT
-#include "../features/i386/32bit-core.c"
-#include "../features/i386/32bit-linux.c"
-#include "../features/i386/32bit-sse.c"
-#include "../features/i386/32bit-avx.c"
-#include "../features/i386/32bit-avx512.c"
-#include "../features/i386/32bit-mpx.c"
-#include "../features/i386/32bit-pkeys.c"
 
 /* Defined in auto-generated file i386-linux.c.  */
 void init_registers_i386_linux (void);
@@ -142,34 +136,7 @@ i386_linux_read_description (uint64_t xcr0)
 
   if (*tdesc == NULL)
     {
-      *tdesc = new target_desc ();
-
-#ifndef IN_PROCESS_AGENT
-      set_tdesc_architecture (*tdesc, "i386");
-      set_tdesc_osabi (*tdesc, "GNU/Linux");
-#endif
-
-      long regnum = 0;
-
-      if (xcr0 & X86_XSTATE_X87)
-	regnum = create_feature_i386_32bit_core (*tdesc, regnum);
-
-      if (xcr0 & X86_XSTATE_SSE)
-	regnum = create_feature_i386_32bit_sse (*tdesc, regnum);
-
-      regnum = create_feature_i386_32bit_linux (*tdesc, regnum);
-
-      if (xcr0 & X86_XSTATE_AVX)
-	regnum = create_feature_i386_32bit_avx (*tdesc, regnum);
-
-      if (xcr0 & X86_XSTATE_MPX)
-	regnum = create_feature_i386_32bit_mpx (*tdesc, regnum);
-
-      if (xcr0 & X86_XSTATE_AVX512)
-	regnum = create_feature_i386_32bit_avx512 (*tdesc, regnum);
-
-      if (xcr0 & X86_XSTATE_PKRU)
-	regnum = create_feature_i386_32bit_pkeys (*tdesc, regnum);
+      *tdesc = i386_create_target_description (xcr0);
 
       init_target_desc (*tdesc);
 
diff --git a/gdb/gdbserver/tdesc.c b/gdb/gdbserver/tdesc.c
index 0b5096b..53f36d5 100644
--- a/gdb/gdbserver/tdesc.c
+++ b/gdb/gdbserver/tdesc.c
@@ -39,6 +39,12 @@ init_target_desc (struct target_desc *tdesc)
   gdb_assert (2 * tdesc->registers_size + 32 <= PBUFSIZ);
 }
 
+struct target_desc *
+allocate_target_description (void)
+{
+  return new target_desc ();
+}
+
 #ifndef IN_PROCESS_AGENT
 
 static const struct target_desc default_description {};
@@ -62,6 +68,8 @@ current_target_desc (void)
   return current_process ()->tdesc;
 }
 
+/* See arch/tdesc.h.  */
+
 void
 set_tdesc_architecture (struct target_desc *target_desc,
 			const char *name)
@@ -69,6 +77,8 @@ set_tdesc_architecture (struct target_desc *target_desc,
   target_desc->arch = xstrdup (name);
 }
 
+/* See arch/tdesc.h.  */
+
 void
 set_tdesc_osabi (struct target_desc *target_desc, const char *name)
 {
diff --git a/gdb/gdbserver/tdesc.h b/gdb/gdbserver/tdesc.h
index fe3c78f..71249e4 100644
--- a/gdb/gdbserver/tdesc.h
+++ b/gdb/gdbserver/tdesc.h
@@ -142,10 +142,6 @@ void init_target_desc (struct target_desc *tdesc);
 const struct target_desc *current_target_desc (void);
 
 #ifndef IN_PROCESS_AGENT
-void set_tdesc_architecture (struct target_desc *target_desc,
-			     const char *name);
-void set_tdesc_osabi (struct target_desc *target_desc, const char *name);
-
 const char *tdesc_get_features_xml (struct target_desc *tdesc);
 #endif
 
diff --git a/gdb/i386-linux-tdep.c b/gdb/i386-linux-tdep.c
index 9059d24..b15ba8f 100644
--- a/gdb/i386-linux-tdep.c
+++ b/gdb/i386-linux-tdep.c
@@ -46,13 +46,7 @@
 #include "record-full.h"
 #include "linux-record.h"
 
-#include "features/i386/32bit-core.c"
-#include "features/i386/32bit-sse.c"
-#include "features/i386/32bit-linux.c"
-#include "features/i386/32bit-avx.c"
-#include "features/i386/32bit-mpx.c"
-#include "features/i386/32bit-avx512.c"
-#include "features/i386/32bit-pkeys.c"
+#include "arch/i386.h"
 #include "target-descriptions.h"
 
 /* Return non-zero, when the register is in the corresponding register
@@ -700,33 +694,7 @@ i386_linux_read_description (uint64_t xcr0)
     [(xcr0 & X86_XSTATE_PKRU) ? 1 : 0];
 
   if (*tdesc == NULL)
-    {
-      *tdesc = allocate_target_description ();
-      set_tdesc_architecture (*tdesc, bfd_scan_arch ("i386"));
-      set_tdesc_osabi (*tdesc, osabi_from_tdesc_string ("GNU/Linux"));
-
-      long regnum = 0;
-
-      if (xcr0 & X86_XSTATE_X87)
-	regnum = create_feature_i386_32bit_core (*tdesc, regnum);
-
-      if (xcr0 & X86_XSTATE_SSE)
-	regnum = create_feature_i386_32bit_sse (*tdesc, regnum);
-
-      regnum = create_feature_i386_32bit_linux (*tdesc, regnum);
-
-      if (xcr0 & X86_XSTATE_AVX)
-	regnum = create_feature_i386_32bit_avx (*tdesc, regnum);
-
-      if (xcr0 & X86_XSTATE_MPX)
-	regnum = create_feature_i386_32bit_mpx (*tdesc, regnum);
-
-      if (xcr0 & X86_XSTATE_AVX512)
-	regnum = create_feature_i386_32bit_avx512 (*tdesc, regnum);
-
-      if (xcr0 & X86_XSTATE_PKRU)
-	regnum = create_feature_i386_32bit_pkeys (*tdesc, regnum);
-    }
+    *tdesc = i386_create_target_description (xcr0);
 
   return *tdesc;
 }
diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c
index 3aeeeaf..996c91c 100644
--- a/gdb/target-descriptions.c
+++ b/gdb/target-descriptions.c
@@ -1820,6 +1820,15 @@ set_tdesc_property (struct target_desc *target_desc,
   VEC_safe_push (property_s, target_desc->properties, &new_prop);
 }
 
+/* See arch/tdesc.h.  */
+
+void
+set_tdesc_architecture (struct target_desc *target_desc,
+			const char *name)
+{
+  set_tdesc_architecture (target_desc, bfd_scan_arch (name));
+}
+
 void
 set_tdesc_architecture (struct target_desc *target_desc,
 			const struct bfd_arch_info *arch)
@@ -1827,6 +1836,14 @@ set_tdesc_architecture (struct target_desc *target_desc,
   target_desc->arch = arch;
 }
 
+/* See arch/tdesc.h.  */
+
+void
+set_tdesc_osabi (struct target_desc *target_desc, const char *name)
+{
+  set_tdesc_osabi (target_desc, osabi_from_tdesc_string (name));
+}
+
 void
 set_tdesc_osabi (struct target_desc *target_desc, enum gdb_osabi osabi)
 {
diff --git a/gdb/target-descriptions.h b/gdb/target-descriptions.h
index c4f9b92..e97a373 100644
--- a/gdb/target-descriptions.h
+++ b/gdb/target-descriptions.h
@@ -201,7 +201,6 @@ int tdesc_register_in_reggroup_p (struct gdbarch *gdbarch, int regno,
 
 /* Methods for constructing a target description.  */
 
-struct target_desc *allocate_target_description (void);
 struct cleanup *make_cleanup_free_target_description (struct target_desc *);
 void set_tdesc_architecture (struct target_desc *,
 			     const struct bfd_arch_info *);
-- 
1.9.1

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

* [PATCH 26/26] Remove features/i386/amd64-*linux.c and features/i386/x32-*linux.c
  2017-07-10 13:56 [PATCH 00/26 v3] Make GDB builtin target descriptions more flexible Yao Qi
                   ` (24 preceding siblings ...)
  2017-07-10 13:56 ` [PATCH 02/26] Class-fy target_desc Yao Qi
@ 2017-07-10 13:57 ` Yao Qi
  2017-07-26 13:59 ` [PATCH 00/26 v3] Make GDB builtin target descriptions more flexible Yao Qi
  26 siblings, 0 replies; 30+ messages in thread
From: Yao Qi @ 2017-07-10 13:57 UTC (permalink / raw)
  To: gdb-patches

gdb:

2017-06-09  Yao Qi  <yao.qi@linaro.org>

	* features/Makefile (XMLTOC): Remove i386/amd64XXX-linux.xml.
	* features/i386/amd64-avx-avx512-linux.c: Removed.
	* features/i386/amd64-avx-linux.c: Removed.
	* features/i386/amd64-avx-mpx-avx512-pku-linux.c: Removed.
	* features/i386/amd64-avx-mpx-linux.c: Removed.
	* features/i386/amd64-linux.c: Removed.
	* features/i386/amd64-mpx-linux.c: Removed.
	* features/i386/x32-avx-avx512-linux.c: Removed.
	* features/i386/x32-avx-linux.c: Removed.
	* features/i386/x32-linux.c: Removed.
---
 gdb/features/Makefile                              |   9 -
 gdb/features/i386/amd64-avx-avx512-linux.c         | 288 ------------------
 gdb/features/i386/amd64-avx-linux.c                | 177 -----------
 gdb/features/i386/amd64-avx-mpx-avx512-pku-linux.c | 329 ---------------------
 gdb/features/i386/amd64-avx-mpx-linux.c            | 215 --------------
 gdb/features/i386/amd64-linux.c                    | 159 ----------
 gdb/features/i386/amd64-mpx-linux.c                | 197 ------------
 gdb/features/i386/x32-avx-avx512-linux.c           | 288 ------------------
 gdb/features/i386/x32-avx-linux.c                  | 177 -----------
 gdb/features/i386/x32-linux.c                      | 159 ----------
 10 files changed, 1998 deletions(-)
 delete mode 100644 gdb/features/i386/amd64-avx-avx512-linux.c
 delete mode 100644 gdb/features/i386/amd64-avx-linux.c
 delete mode 100644 gdb/features/i386/amd64-avx-mpx-avx512-pku-linux.c
 delete mode 100644 gdb/features/i386/amd64-avx-mpx-linux.c
 delete mode 100644 gdb/features/i386/amd64-linux.c
 delete mode 100644 gdb/features/i386/amd64-mpx-linux.c
 delete mode 100644 gdb/features/i386/x32-avx-avx512-linux.c
 delete mode 100644 gdb/features/i386/x32-avx-linux.c
 delete mode 100644 gdb/features/i386/x32-linux.c

diff --git a/gdb/features/Makefile b/gdb/features/Makefile
index d8567d2..da6d9b1 100644
--- a/gdb/features/Makefile
+++ b/gdb/features/Makefile
@@ -138,16 +138,10 @@ XMLTOC = \
 	arm/arm-with-neon.xml \
 	arm/arm-with-vfpv2.xml \
 	arm/arm-with-vfpv3.xml \
-	i386/amd64-avx-linux.xml \
 	i386/amd64-avx.xml \
-	i386/amd64-avx-avx512-linux.xml \
 	i386/amd64-avx-avx512.xml \
-	i386/amd64-avx-mpx-avx512-pku-linux.xml \
 	i386/amd64-avx-mpx-avx512-pku.xml \
-	i386/amd64-linux.xml \
-	i386/amd64-mpx-linux.xml \
 	i386/amd64-mpx.xml \
-	i386/amd64-avx-mpx-linux.xml \
 	i386/amd64-avx-mpx.xml \
 	i386/amd64.xml \
 	i386/i386-avx.xml \
@@ -157,11 +151,8 @@ XMLTOC = \
 	i386/i386-mpx.xml \
 	i386/i386-avx-mpx.xml \
 	i386/i386.xml \
-	i386/x32-avx-linux.xml \
 	i386/x32-avx.xml \
-	i386/x32-avx-avx512-linux.xml \
 	i386/x32-avx-avx512.xml \
-	i386/x32-linux.xml \
 	i386/x32.xml \
 	microblaze-with-stack-protect.xml \
 	microblaze.xml \
diff --git a/gdb/features/i386/amd64-avx-avx512-linux.c b/gdb/features/i386/amd64-avx-avx512-linux.c
deleted file mode 100644
index de58f06..0000000
--- a/gdb/features/i386/amd64-avx-avx512-linux.c
+++ /dev/null
@@ -1,288 +0,0 @@
-/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
-  Original: amd64-avx-avx512-linux.xml */
-
-#include "defs.h"
-#include "osabi.h"
-#include "target-descriptions.h"
-
-struct target_desc *tdesc_amd64_avx_avx512_linux;
-static void
-initialize_tdesc_amd64_avx_avx512_linux (void)
-{
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("i386:x86-64"));
-
-  set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
-
-  struct tdesc_feature *feature;
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-  type = tdesc_create_flags (feature, "i386_eflags", 4);
-  tdesc_add_flag (type, 0, "CF");
-  tdesc_add_flag (type, 1, "");
-  tdesc_add_flag (type, 2, "PF");
-  tdesc_add_flag (type, 4, "AF");
-  tdesc_add_flag (type, 6, "ZF");
-  tdesc_add_flag (type, 7, "SF");
-  tdesc_add_flag (type, 8, "TF");
-  tdesc_add_flag (type, 9, "IF");
-  tdesc_add_flag (type, 10, "DF");
-  tdesc_add_flag (type, 11, "OF");
-  tdesc_add_flag (type, 14, "NT");
-  tdesc_add_flag (type, 16, "RF");
-  tdesc_add_flag (type, 17, "VM");
-  tdesc_add_flag (type, 18, "AC");
-  tdesc_add_flag (type, 19, "VIF");
-  tdesc_add_flag (type, 20, "VIP");
-  tdesc_add_flag (type, 21, "ID");
-
-  tdesc_create_reg (feature, "rax", 0, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rbx", 1, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rcx", 2, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rdx", 3, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rsi", 4, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rdi", 5, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rbp", 6, 1, NULL, 64, "data_ptr");
-  tdesc_create_reg (feature, "rsp", 7, 1, NULL, 64, "data_ptr");
-  tdesc_create_reg (feature, "r8", 8, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r9", 9, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r10", 10, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r11", 11, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r12", 12, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r13", 13, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r14", 14, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r15", 15, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rip", 16, 1, NULL, 64, "code_ptr");
-  tdesc_create_reg (feature, "eflags", 17, 1, NULL, 32, "i386_eflags");
-  tdesc_create_reg (feature, "cs", 18, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ss", 19, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ds", 20, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "es", 21, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "fs", 22, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "gs", 23, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "st0", 24, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st1", 25, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st2", 26, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st3", 27, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st4", 28, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st5", 29, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st6", 30, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st7", 31, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "fctrl", 32, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fstat", 33, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "ftag", 34, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fiseg", 35, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fioff", 36, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "foseg", 37, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fooff", 38, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fop", 39, 1, "float", 32, "int");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.sse");
-  field_type = tdesc_named_type (feature, "ieee_single");
-  tdesc_create_vector (feature, "v4f", field_type, 4);
-
-  field_type = tdesc_named_type (feature, "ieee_double");
-  tdesc_create_vector (feature, "v2d", field_type, 2);
-
-  field_type = tdesc_named_type (feature, "int8");
-  tdesc_create_vector (feature, "v16i8", field_type, 16);
-
-  field_type = tdesc_named_type (feature, "int16");
-  tdesc_create_vector (feature, "v8i16", field_type, 8);
-
-  field_type = tdesc_named_type (feature, "int32");
-  tdesc_create_vector (feature, "v4i32", field_type, 4);
-
-  field_type = tdesc_named_type (feature, "int64");
-  tdesc_create_vector (feature, "v2i64", field_type, 2);
-
-  type = tdesc_create_union (feature, "vec128");
-  field_type = tdesc_named_type (feature, "v4f");
-  tdesc_add_field (type, "v4_float", field_type);
-  field_type = tdesc_named_type (feature, "v2d");
-  tdesc_add_field (type, "v2_double", field_type);
-  field_type = tdesc_named_type (feature, "v16i8");
-  tdesc_add_field (type, "v16_int8", field_type);
-  field_type = tdesc_named_type (feature, "v8i16");
-  tdesc_add_field (type, "v8_int16", field_type);
-  field_type = tdesc_named_type (feature, "v4i32");
-  tdesc_add_field (type, "v4_int32", field_type);
-  field_type = tdesc_named_type (feature, "v2i64");
-  tdesc_add_field (type, "v2_int64", field_type);
-  field_type = tdesc_named_type (feature, "uint128");
-  tdesc_add_field (type, "uint128", field_type);
-
-  type = tdesc_create_flags (feature, "i386_mxcsr", 4);
-  tdesc_add_flag (type, 0, "IE");
-  tdesc_add_flag (type, 1, "DE");
-  tdesc_add_flag (type, 2, "ZE");
-  tdesc_add_flag (type, 3, "OE");
-  tdesc_add_flag (type, 4, "UE");
-  tdesc_add_flag (type, 5, "PE");
-  tdesc_add_flag (type, 6, "DAZ");
-  tdesc_add_flag (type, 7, "IM");
-  tdesc_add_flag (type, 8, "DM");
-  tdesc_add_flag (type, 9, "ZM");
-  tdesc_add_flag (type, 10, "OM");
-  tdesc_add_flag (type, 11, "UM");
-  tdesc_add_flag (type, 12, "PM");
-  tdesc_add_flag (type, 15, "FZ");
-
-  tdesc_create_reg (feature, "xmm0", 40, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm1", 41, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm2", 42, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm3", 43, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm4", 44, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm5", 45, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm6", 46, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm7", 47, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm8", 48, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm9", 49, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm10", 50, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm11", 51, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm12", 52, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm13", 53, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm14", 54, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm15", 55, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "mxcsr", 56, 1, "vector", 32, "i386_mxcsr");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.linux");
-  tdesc_create_reg (feature, "orig_rax", 57, 1, NULL, 64, "int");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.segments");
-  tdesc_create_reg (feature, "fs_base", 58, 1, NULL, 64, "int");
-  tdesc_create_reg (feature, "gs_base", 59, 1, NULL, 64, "int");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx");
-  tdesc_create_reg (feature, "ymm0h", 60, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm1h", 61, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm2h", 62, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm3h", 63, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm4h", 64, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm5h", 65, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm6h", 66, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm7h", 67, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm8h", 68, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm9h", 69, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm10h", 70, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm11h", 71, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm12h", 72, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm13h", 73, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm14h", 74, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm15h", 75, 1, NULL, 128, "uint128");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx512");
-  field_type = tdesc_named_type (feature, "ieee_single");
-  tdesc_create_vector (feature, "v4f", field_type, 4);
-
-  field_type = tdesc_named_type (feature, "ieee_double");
-  tdesc_create_vector (feature, "v2d", field_type, 2);
-
-  field_type = tdesc_named_type (feature, "int8");
-  tdesc_create_vector (feature, "v16i8", field_type, 16);
-
-  field_type = tdesc_named_type (feature, "int16");
-  tdesc_create_vector (feature, "v8i16", field_type, 8);
-
-  field_type = tdesc_named_type (feature, "int32");
-  tdesc_create_vector (feature, "v4i32", field_type, 4);
-
-  field_type = tdesc_named_type (feature, "int64");
-  tdesc_create_vector (feature, "v2i64", field_type, 2);
-
-  type = tdesc_create_union (feature, "vec128");
-  field_type = tdesc_named_type (feature, "v4f");
-  tdesc_add_field (type, "v4_float", field_type);
-  field_type = tdesc_named_type (feature, "v2d");
-  tdesc_add_field (type, "v2_double", field_type);
-  field_type = tdesc_named_type (feature, "v16i8");
-  tdesc_add_field (type, "v16_int8", field_type);
-  field_type = tdesc_named_type (feature, "v8i16");
-  tdesc_add_field (type, "v8_int16", field_type);
-  field_type = tdesc_named_type (feature, "v4i32");
-  tdesc_add_field (type, "v4_int32", field_type);
-  field_type = tdesc_named_type (feature, "v2i64");
-  tdesc_add_field (type, "v2_int64", field_type);
-  field_type = tdesc_named_type (feature, "uint128");
-  tdesc_add_field (type, "uint128", field_type);
-
-  field_type = tdesc_named_type (feature, "uint128");
-  tdesc_create_vector (feature, "v2ui128", field_type, 2);
-
-  tdesc_create_reg (feature, "xmm16", 76, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm17", 77, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm18", 78, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm19", 79, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm20", 80, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm21", 81, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm22", 82, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm23", 83, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm24", 84, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm25", 85, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm26", 86, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm27", 87, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm28", 88, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm29", 89, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm30", 90, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm31", 91, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "ymm16h", 92, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm17h", 93, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm18h", 94, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm19h", 95, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm20h", 96, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm21h", 97, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm22h", 98, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm23h", 99, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm24h", 100, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm25h", 101, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm26h", 102, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm27h", 103, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm28h", 104, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm29h", 105, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm30h", 106, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm31h", 107, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "k0", 108, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k1", 109, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k2", 110, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k3", 111, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k4", 112, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k5", 113, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k6", 114, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k7", 115, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "zmm0h", 116, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm1h", 117, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm2h", 118, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm3h", 119, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm4h", 120, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm5h", 121, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm6h", 122, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm7h", 123, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm8h", 124, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm9h", 125, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm10h", 126, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm11h", 127, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm12h", 128, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm13h", 129, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm14h", 130, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm15h", 131, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm16h", 132, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm17h", 133, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm18h", 134, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm19h", 135, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm20h", 136, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm21h", 137, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm22h", 138, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm23h", 139, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm24h", 140, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm25h", 141, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm26h", 142, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm27h", 143, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm28h", 144, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm29h", 145, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm30h", 146, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm31h", 147, 1, NULL, 256, "v2ui128");
-
-  tdesc_amd64_avx_avx512_linux = result;
-}
diff --git a/gdb/features/i386/amd64-avx-linux.c b/gdb/features/i386/amd64-avx-linux.c
deleted file mode 100644
index 00dfd3c..0000000
--- a/gdb/features/i386/amd64-avx-linux.c
+++ /dev/null
@@ -1,177 +0,0 @@
-/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
-  Original: amd64-avx-linux.xml */
-
-#include "defs.h"
-#include "osabi.h"
-#include "target-descriptions.h"
-
-struct target_desc *tdesc_amd64_avx_linux;
-static void
-initialize_tdesc_amd64_avx_linux (void)
-{
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("i386:x86-64"));
-
-  set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
-
-  struct tdesc_feature *feature;
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-  type = tdesc_create_flags (feature, "i386_eflags", 4);
-  tdesc_add_flag (type, 0, "CF");
-  tdesc_add_flag (type, 1, "");
-  tdesc_add_flag (type, 2, "PF");
-  tdesc_add_flag (type, 4, "AF");
-  tdesc_add_flag (type, 6, "ZF");
-  tdesc_add_flag (type, 7, "SF");
-  tdesc_add_flag (type, 8, "TF");
-  tdesc_add_flag (type, 9, "IF");
-  tdesc_add_flag (type, 10, "DF");
-  tdesc_add_flag (type, 11, "OF");
-  tdesc_add_flag (type, 14, "NT");
-  tdesc_add_flag (type, 16, "RF");
-  tdesc_add_flag (type, 17, "VM");
-  tdesc_add_flag (type, 18, "AC");
-  tdesc_add_flag (type, 19, "VIF");
-  tdesc_add_flag (type, 20, "VIP");
-  tdesc_add_flag (type, 21, "ID");
-
-  tdesc_create_reg (feature, "rax", 0, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rbx", 1, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rcx", 2, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rdx", 3, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rsi", 4, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rdi", 5, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rbp", 6, 1, NULL, 64, "data_ptr");
-  tdesc_create_reg (feature, "rsp", 7, 1, NULL, 64, "data_ptr");
-  tdesc_create_reg (feature, "r8", 8, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r9", 9, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r10", 10, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r11", 11, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r12", 12, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r13", 13, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r14", 14, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r15", 15, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rip", 16, 1, NULL, 64, "code_ptr");
-  tdesc_create_reg (feature, "eflags", 17, 1, NULL, 32, "i386_eflags");
-  tdesc_create_reg (feature, "cs", 18, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ss", 19, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ds", 20, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "es", 21, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "fs", 22, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "gs", 23, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "st0", 24, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st1", 25, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st2", 26, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st3", 27, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st4", 28, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st5", 29, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st6", 30, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st7", 31, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "fctrl", 32, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fstat", 33, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "ftag", 34, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fiseg", 35, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fioff", 36, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "foseg", 37, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fooff", 38, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fop", 39, 1, "float", 32, "int");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.sse");
-  field_type = tdesc_named_type (feature, "ieee_single");
-  tdesc_create_vector (feature, "v4f", field_type, 4);
-
-  field_type = tdesc_named_type (feature, "ieee_double");
-  tdesc_create_vector (feature, "v2d", field_type, 2);
-
-  field_type = tdesc_named_type (feature, "int8");
-  tdesc_create_vector (feature, "v16i8", field_type, 16);
-
-  field_type = tdesc_named_type (feature, "int16");
-  tdesc_create_vector (feature, "v8i16", field_type, 8);
-
-  field_type = tdesc_named_type (feature, "int32");
-  tdesc_create_vector (feature, "v4i32", field_type, 4);
-
-  field_type = tdesc_named_type (feature, "int64");
-  tdesc_create_vector (feature, "v2i64", field_type, 2);
-
-  type = tdesc_create_union (feature, "vec128");
-  field_type = tdesc_named_type (feature, "v4f");
-  tdesc_add_field (type, "v4_float", field_type);
-  field_type = tdesc_named_type (feature, "v2d");
-  tdesc_add_field (type, "v2_double", field_type);
-  field_type = tdesc_named_type (feature, "v16i8");
-  tdesc_add_field (type, "v16_int8", field_type);
-  field_type = tdesc_named_type (feature, "v8i16");
-  tdesc_add_field (type, "v8_int16", field_type);
-  field_type = tdesc_named_type (feature, "v4i32");
-  tdesc_add_field (type, "v4_int32", field_type);
-  field_type = tdesc_named_type (feature, "v2i64");
-  tdesc_add_field (type, "v2_int64", field_type);
-  field_type = tdesc_named_type (feature, "uint128");
-  tdesc_add_field (type, "uint128", field_type);
-
-  type = tdesc_create_flags (feature, "i386_mxcsr", 4);
-  tdesc_add_flag (type, 0, "IE");
-  tdesc_add_flag (type, 1, "DE");
-  tdesc_add_flag (type, 2, "ZE");
-  tdesc_add_flag (type, 3, "OE");
-  tdesc_add_flag (type, 4, "UE");
-  tdesc_add_flag (type, 5, "PE");
-  tdesc_add_flag (type, 6, "DAZ");
-  tdesc_add_flag (type, 7, "IM");
-  tdesc_add_flag (type, 8, "DM");
-  tdesc_add_flag (type, 9, "ZM");
-  tdesc_add_flag (type, 10, "OM");
-  tdesc_add_flag (type, 11, "UM");
-  tdesc_add_flag (type, 12, "PM");
-  tdesc_add_flag (type, 15, "FZ");
-
-  tdesc_create_reg (feature, "xmm0", 40, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm1", 41, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm2", 42, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm3", 43, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm4", 44, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm5", 45, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm6", 46, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm7", 47, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm8", 48, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm9", 49, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm10", 50, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm11", 51, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm12", 52, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm13", 53, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm14", 54, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm15", 55, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "mxcsr", 56, 1, "vector", 32, "i386_mxcsr");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.linux");
-  tdesc_create_reg (feature, "orig_rax", 57, 1, NULL, 64, "int");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.segments");
-  tdesc_create_reg (feature, "fs_base", 58, 1, NULL, 64, "int");
-  tdesc_create_reg (feature, "gs_base", 59, 1, NULL, 64, "int");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx");
-  tdesc_create_reg (feature, "ymm0h", 60, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm1h", 61, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm2h", 62, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm3h", 63, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm4h", 64, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm5h", 65, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm6h", 66, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm7h", 67, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm8h", 68, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm9h", 69, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm10h", 70, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm11h", 71, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm12h", 72, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm13h", 73, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm14h", 74, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm15h", 75, 1, NULL, 128, "uint128");
-
-  tdesc_amd64_avx_linux = result;
-}
diff --git a/gdb/features/i386/amd64-avx-mpx-avx512-pku-linux.c b/gdb/features/i386/amd64-avx-mpx-avx512-pku-linux.c
deleted file mode 100644
index 7fd016f..0000000
--- a/gdb/features/i386/amd64-avx-mpx-avx512-pku-linux.c
+++ /dev/null
@@ -1,329 +0,0 @@
-/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
-  Original: amd64-avx-mpx-avx512-pku-linux.xml */
-
-#include "defs.h"
-#include "osabi.h"
-#include "target-descriptions.h"
-
-struct target_desc *tdesc_amd64_avx_mpx_avx512_pku_linux;
-static void
-initialize_tdesc_amd64_avx_mpx_avx512_pku_linux (void)
-{
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("i386:x86-64"));
-
-  set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
-
-  struct tdesc_feature *feature;
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-  type = tdesc_create_flags (feature, "i386_eflags", 4);
-  tdesc_add_flag (type, 0, "CF");
-  tdesc_add_flag (type, 1, "");
-  tdesc_add_flag (type, 2, "PF");
-  tdesc_add_flag (type, 4, "AF");
-  tdesc_add_flag (type, 6, "ZF");
-  tdesc_add_flag (type, 7, "SF");
-  tdesc_add_flag (type, 8, "TF");
-  tdesc_add_flag (type, 9, "IF");
-  tdesc_add_flag (type, 10, "DF");
-  tdesc_add_flag (type, 11, "OF");
-  tdesc_add_flag (type, 14, "NT");
-  tdesc_add_flag (type, 16, "RF");
-  tdesc_add_flag (type, 17, "VM");
-  tdesc_add_flag (type, 18, "AC");
-  tdesc_add_flag (type, 19, "VIF");
-  tdesc_add_flag (type, 20, "VIP");
-  tdesc_add_flag (type, 21, "ID");
-
-  tdesc_create_reg (feature, "rax", 0, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rbx", 1, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rcx", 2, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rdx", 3, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rsi", 4, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rdi", 5, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rbp", 6, 1, NULL, 64, "data_ptr");
-  tdesc_create_reg (feature, "rsp", 7, 1, NULL, 64, "data_ptr");
-  tdesc_create_reg (feature, "r8", 8, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r9", 9, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r10", 10, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r11", 11, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r12", 12, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r13", 13, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r14", 14, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r15", 15, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rip", 16, 1, NULL, 64, "code_ptr");
-  tdesc_create_reg (feature, "eflags", 17, 1, NULL, 32, "i386_eflags");
-  tdesc_create_reg (feature, "cs", 18, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ss", 19, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ds", 20, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "es", 21, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "fs", 22, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "gs", 23, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "st0", 24, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st1", 25, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st2", 26, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st3", 27, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st4", 28, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st5", 29, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st6", 30, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st7", 31, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "fctrl", 32, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fstat", 33, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "ftag", 34, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fiseg", 35, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fioff", 36, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "foseg", 37, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fooff", 38, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fop", 39, 1, "float", 32, "int");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.sse");
-  field_type = tdesc_named_type (feature, "ieee_single");
-  tdesc_create_vector (feature, "v4f", field_type, 4);
-
-  field_type = tdesc_named_type (feature, "ieee_double");
-  tdesc_create_vector (feature, "v2d", field_type, 2);
-
-  field_type = tdesc_named_type (feature, "int8");
-  tdesc_create_vector (feature, "v16i8", field_type, 16);
-
-  field_type = tdesc_named_type (feature, "int16");
-  tdesc_create_vector (feature, "v8i16", field_type, 8);
-
-  field_type = tdesc_named_type (feature, "int32");
-  tdesc_create_vector (feature, "v4i32", field_type, 4);
-
-  field_type = tdesc_named_type (feature, "int64");
-  tdesc_create_vector (feature, "v2i64", field_type, 2);
-
-  type = tdesc_create_union (feature, "vec128");
-  field_type = tdesc_named_type (feature, "v4f");
-  tdesc_add_field (type, "v4_float", field_type);
-  field_type = tdesc_named_type (feature, "v2d");
-  tdesc_add_field (type, "v2_double", field_type);
-  field_type = tdesc_named_type (feature, "v16i8");
-  tdesc_add_field (type, "v16_int8", field_type);
-  field_type = tdesc_named_type (feature, "v8i16");
-  tdesc_add_field (type, "v8_int16", field_type);
-  field_type = tdesc_named_type (feature, "v4i32");
-  tdesc_add_field (type, "v4_int32", field_type);
-  field_type = tdesc_named_type (feature, "v2i64");
-  tdesc_add_field (type, "v2_int64", field_type);
-  field_type = tdesc_named_type (feature, "uint128");
-  tdesc_add_field (type, "uint128", field_type);
-
-  type = tdesc_create_flags (feature, "i386_mxcsr", 4);
-  tdesc_add_flag (type, 0, "IE");
-  tdesc_add_flag (type, 1, "DE");
-  tdesc_add_flag (type, 2, "ZE");
-  tdesc_add_flag (type, 3, "OE");
-  tdesc_add_flag (type, 4, "UE");
-  tdesc_add_flag (type, 5, "PE");
-  tdesc_add_flag (type, 6, "DAZ");
-  tdesc_add_flag (type, 7, "IM");
-  tdesc_add_flag (type, 8, "DM");
-  tdesc_add_flag (type, 9, "ZM");
-  tdesc_add_flag (type, 10, "OM");
-  tdesc_add_flag (type, 11, "UM");
-  tdesc_add_flag (type, 12, "PM");
-  tdesc_add_flag (type, 15, "FZ");
-
-  tdesc_create_reg (feature, "xmm0", 40, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm1", 41, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm2", 42, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm3", 43, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm4", 44, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm5", 45, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm6", 46, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm7", 47, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm8", 48, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm9", 49, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm10", 50, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm11", 51, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm12", 52, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm13", 53, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm14", 54, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm15", 55, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "mxcsr", 56, 1, "vector", 32, "i386_mxcsr");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.linux");
-  tdesc_create_reg (feature, "orig_rax", 57, 1, NULL, 64, "int");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.segments");
-  tdesc_create_reg (feature, "fs_base", 58, 1, NULL, 64, "int");
-  tdesc_create_reg (feature, "gs_base", 59, 1, NULL, 64, "int");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx");
-  tdesc_create_reg (feature, "ymm0h", 60, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm1h", 61, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm2h", 62, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm3h", 63, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm4h", 64, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm5h", 65, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm6h", 66, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm7h", 67, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm8h", 68, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm9h", 69, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm10h", 70, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm11h", 71, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm12h", 72, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm13h", 73, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm14h", 74, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm15h", 75, 1, NULL, 128, "uint128");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.mpx");
-  type = tdesc_create_struct (feature, "br128");
-  field_type = tdesc_named_type (feature, "uint64");
-  tdesc_add_field (type, "lbound", field_type);
-  field_type = tdesc_named_type (feature, "uint64");
-  tdesc_add_field (type, "ubound_raw", field_type);
-
-  type = tdesc_create_struct (feature, "_bndstatus");
-  tdesc_set_struct_size (type, 8);
-  tdesc_add_bitfield (type, "bde", 2, 63);
-  tdesc_add_bitfield (type, "error", 0, 1);
-
-  type = tdesc_create_union (feature, "status");
-  field_type = tdesc_named_type (feature, "data_ptr");
-  tdesc_add_field (type, "raw", field_type);
-  field_type = tdesc_named_type (feature, "_bndstatus");
-  tdesc_add_field (type, "status", field_type);
-
-  type = tdesc_create_struct (feature, "_bndcfgu");
-  tdesc_set_struct_size (type, 8);
-  tdesc_add_bitfield (type, "base", 12, 63);
-  tdesc_add_bitfield (type, "reserved", 2, 11);
-  tdesc_add_bitfield (type, "preserved", 1, 1);
-  tdesc_add_bitfield (type, "enabled", 0, 0);
-
-  type = tdesc_create_union (feature, "cfgu");
-  field_type = tdesc_named_type (feature, "data_ptr");
-  tdesc_add_field (type, "raw", field_type);
-  field_type = tdesc_named_type (feature, "_bndcfgu");
-  tdesc_add_field (type, "config", field_type);
-
-  tdesc_create_reg (feature, "bnd0raw", 76, 1, NULL, 128, "br128");
-  tdesc_create_reg (feature, "bnd1raw", 77, 1, NULL, 128, "br128");
-  tdesc_create_reg (feature, "bnd2raw", 78, 1, NULL, 128, "br128");
-  tdesc_create_reg (feature, "bnd3raw", 79, 1, NULL, 128, "br128");
-  tdesc_create_reg (feature, "bndcfgu", 80, 1, NULL, 64, "cfgu");
-  tdesc_create_reg (feature, "bndstatus", 81, 1, NULL, 64, "status");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx512");
-  field_type = tdesc_named_type (feature, "ieee_single");
-  tdesc_create_vector (feature, "v4f", field_type, 4);
-
-  field_type = tdesc_named_type (feature, "ieee_double");
-  tdesc_create_vector (feature, "v2d", field_type, 2);
-
-  field_type = tdesc_named_type (feature, "int8");
-  tdesc_create_vector (feature, "v16i8", field_type, 16);
-
-  field_type = tdesc_named_type (feature, "int16");
-  tdesc_create_vector (feature, "v8i16", field_type, 8);
-
-  field_type = tdesc_named_type (feature, "int32");
-  tdesc_create_vector (feature, "v4i32", field_type, 4);
-
-  field_type = tdesc_named_type (feature, "int64");
-  tdesc_create_vector (feature, "v2i64", field_type, 2);
-
-  type = tdesc_create_union (feature, "vec128");
-  field_type = tdesc_named_type (feature, "v4f");
-  tdesc_add_field (type, "v4_float", field_type);
-  field_type = tdesc_named_type (feature, "v2d");
-  tdesc_add_field (type, "v2_double", field_type);
-  field_type = tdesc_named_type (feature, "v16i8");
-  tdesc_add_field (type, "v16_int8", field_type);
-  field_type = tdesc_named_type (feature, "v8i16");
-  tdesc_add_field (type, "v8_int16", field_type);
-  field_type = tdesc_named_type (feature, "v4i32");
-  tdesc_add_field (type, "v4_int32", field_type);
-  field_type = tdesc_named_type (feature, "v2i64");
-  tdesc_add_field (type, "v2_int64", field_type);
-  field_type = tdesc_named_type (feature, "uint128");
-  tdesc_add_field (type, "uint128", field_type);
-
-  field_type = tdesc_named_type (feature, "uint128");
-  tdesc_create_vector (feature, "v2ui128", field_type, 2);
-
-  tdesc_create_reg (feature, "xmm16", 82, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm17", 83, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm18", 84, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm19", 85, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm20", 86, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm21", 87, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm22", 88, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm23", 89, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm24", 90, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm25", 91, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm26", 92, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm27", 93, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm28", 94, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm29", 95, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm30", 96, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm31", 97, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "ymm16h", 98, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm17h", 99, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm18h", 100, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm19h", 101, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm20h", 102, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm21h", 103, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm22h", 104, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm23h", 105, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm24h", 106, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm25h", 107, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm26h", 108, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm27h", 109, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm28h", 110, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm29h", 111, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm30h", 112, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm31h", 113, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "k0", 114, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k1", 115, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k2", 116, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k3", 117, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k4", 118, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k5", 119, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k6", 120, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k7", 121, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "zmm0h", 122, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm1h", 123, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm2h", 124, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm3h", 125, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm4h", 126, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm5h", 127, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm6h", 128, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm7h", 129, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm8h", 130, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm9h", 131, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm10h", 132, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm11h", 133, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm12h", 134, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm13h", 135, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm14h", 136, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm15h", 137, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm16h", 138, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm17h", 139, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm18h", 140, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm19h", 141, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm20h", 142, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm21h", 143, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm22h", 144, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm23h", 145, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm24h", 146, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm25h", 147, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm26h", 148, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm27h", 149, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm28h", 150, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm29h", 151, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm30h", 152, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm31h", 153, 1, NULL, 256, "v2ui128");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.pkeys");
-  tdesc_create_reg (feature, "pkru", 154, 1, NULL, 32, "uint32");
-
-  tdesc_amd64_avx_mpx_avx512_pku_linux = result;
-}
diff --git a/gdb/features/i386/amd64-avx-mpx-linux.c b/gdb/features/i386/amd64-avx-mpx-linux.c
deleted file mode 100644
index 5fe1127..0000000
--- a/gdb/features/i386/amd64-avx-mpx-linux.c
+++ /dev/null
@@ -1,215 +0,0 @@
-/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
-  Original: amd64-avx-mpx-linux.xml */
-
-#include "defs.h"
-#include "osabi.h"
-#include "target-descriptions.h"
-
-struct target_desc *tdesc_amd64_avx_mpx_linux;
-static void
-initialize_tdesc_amd64_avx_mpx_linux (void)
-{
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("i386:x86-64"));
-
-  set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
-
-  struct tdesc_feature *feature;
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-  type = tdesc_create_flags (feature, "i386_eflags", 4);
-  tdesc_add_flag (type, 0, "CF");
-  tdesc_add_flag (type, 1, "");
-  tdesc_add_flag (type, 2, "PF");
-  tdesc_add_flag (type, 4, "AF");
-  tdesc_add_flag (type, 6, "ZF");
-  tdesc_add_flag (type, 7, "SF");
-  tdesc_add_flag (type, 8, "TF");
-  tdesc_add_flag (type, 9, "IF");
-  tdesc_add_flag (type, 10, "DF");
-  tdesc_add_flag (type, 11, "OF");
-  tdesc_add_flag (type, 14, "NT");
-  tdesc_add_flag (type, 16, "RF");
-  tdesc_add_flag (type, 17, "VM");
-  tdesc_add_flag (type, 18, "AC");
-  tdesc_add_flag (type, 19, "VIF");
-  tdesc_add_flag (type, 20, "VIP");
-  tdesc_add_flag (type, 21, "ID");
-
-  tdesc_create_reg (feature, "rax", 0, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rbx", 1, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rcx", 2, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rdx", 3, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rsi", 4, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rdi", 5, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rbp", 6, 1, NULL, 64, "data_ptr");
-  tdesc_create_reg (feature, "rsp", 7, 1, NULL, 64, "data_ptr");
-  tdesc_create_reg (feature, "r8", 8, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r9", 9, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r10", 10, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r11", 11, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r12", 12, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r13", 13, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r14", 14, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r15", 15, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rip", 16, 1, NULL, 64, "code_ptr");
-  tdesc_create_reg (feature, "eflags", 17, 1, NULL, 32, "i386_eflags");
-  tdesc_create_reg (feature, "cs", 18, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ss", 19, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ds", 20, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "es", 21, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "fs", 22, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "gs", 23, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "st0", 24, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st1", 25, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st2", 26, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st3", 27, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st4", 28, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st5", 29, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st6", 30, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st7", 31, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "fctrl", 32, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fstat", 33, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "ftag", 34, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fiseg", 35, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fioff", 36, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "foseg", 37, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fooff", 38, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fop", 39, 1, "float", 32, "int");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.sse");
-  field_type = tdesc_named_type (feature, "ieee_single");
-  tdesc_create_vector (feature, "v4f", field_type, 4);
-
-  field_type = tdesc_named_type (feature, "ieee_double");
-  tdesc_create_vector (feature, "v2d", field_type, 2);
-
-  field_type = tdesc_named_type (feature, "int8");
-  tdesc_create_vector (feature, "v16i8", field_type, 16);
-
-  field_type = tdesc_named_type (feature, "int16");
-  tdesc_create_vector (feature, "v8i16", field_type, 8);
-
-  field_type = tdesc_named_type (feature, "int32");
-  tdesc_create_vector (feature, "v4i32", field_type, 4);
-
-  field_type = tdesc_named_type (feature, "int64");
-  tdesc_create_vector (feature, "v2i64", field_type, 2);
-
-  type = tdesc_create_union (feature, "vec128");
-  field_type = tdesc_named_type (feature, "v4f");
-  tdesc_add_field (type, "v4_float", field_type);
-  field_type = tdesc_named_type (feature, "v2d");
-  tdesc_add_field (type, "v2_double", field_type);
-  field_type = tdesc_named_type (feature, "v16i8");
-  tdesc_add_field (type, "v16_int8", field_type);
-  field_type = tdesc_named_type (feature, "v8i16");
-  tdesc_add_field (type, "v8_int16", field_type);
-  field_type = tdesc_named_type (feature, "v4i32");
-  tdesc_add_field (type, "v4_int32", field_type);
-  field_type = tdesc_named_type (feature, "v2i64");
-  tdesc_add_field (type, "v2_int64", field_type);
-  field_type = tdesc_named_type (feature, "uint128");
-  tdesc_add_field (type, "uint128", field_type);
-
-  type = tdesc_create_flags (feature, "i386_mxcsr", 4);
-  tdesc_add_flag (type, 0, "IE");
-  tdesc_add_flag (type, 1, "DE");
-  tdesc_add_flag (type, 2, "ZE");
-  tdesc_add_flag (type, 3, "OE");
-  tdesc_add_flag (type, 4, "UE");
-  tdesc_add_flag (type, 5, "PE");
-  tdesc_add_flag (type, 6, "DAZ");
-  tdesc_add_flag (type, 7, "IM");
-  tdesc_add_flag (type, 8, "DM");
-  tdesc_add_flag (type, 9, "ZM");
-  tdesc_add_flag (type, 10, "OM");
-  tdesc_add_flag (type, 11, "UM");
-  tdesc_add_flag (type, 12, "PM");
-  tdesc_add_flag (type, 15, "FZ");
-
-  tdesc_create_reg (feature, "xmm0", 40, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm1", 41, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm2", 42, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm3", 43, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm4", 44, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm5", 45, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm6", 46, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm7", 47, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm8", 48, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm9", 49, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm10", 50, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm11", 51, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm12", 52, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm13", 53, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm14", 54, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm15", 55, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "mxcsr", 56, 1, "vector", 32, "i386_mxcsr");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.linux");
-  tdesc_create_reg (feature, "orig_rax", 57, 1, NULL, 64, "int");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.segments");
-  tdesc_create_reg (feature, "fs_base", 58, 1, NULL, 64, "int");
-  tdesc_create_reg (feature, "gs_base", 59, 1, NULL, 64, "int");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx");
-  tdesc_create_reg (feature, "ymm0h", 60, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm1h", 61, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm2h", 62, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm3h", 63, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm4h", 64, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm5h", 65, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm6h", 66, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm7h", 67, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm8h", 68, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm9h", 69, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm10h", 70, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm11h", 71, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm12h", 72, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm13h", 73, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm14h", 74, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm15h", 75, 1, NULL, 128, "uint128");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.mpx");
-  type = tdesc_create_struct (feature, "br128");
-  field_type = tdesc_named_type (feature, "uint64");
-  tdesc_add_field (type, "lbound", field_type);
-  field_type = tdesc_named_type (feature, "uint64");
-  tdesc_add_field (type, "ubound_raw", field_type);
-
-  type = tdesc_create_struct (feature, "_bndstatus");
-  tdesc_set_struct_size (type, 8);
-  tdesc_add_bitfield (type, "bde", 2, 63);
-  tdesc_add_bitfield (type, "error", 0, 1);
-
-  type = tdesc_create_union (feature, "status");
-  field_type = tdesc_named_type (feature, "data_ptr");
-  tdesc_add_field (type, "raw", field_type);
-  field_type = tdesc_named_type (feature, "_bndstatus");
-  tdesc_add_field (type, "status", field_type);
-
-  type = tdesc_create_struct (feature, "_bndcfgu");
-  tdesc_set_struct_size (type, 8);
-  tdesc_add_bitfield (type, "base", 12, 63);
-  tdesc_add_bitfield (type, "reserved", 2, 11);
-  tdesc_add_bitfield (type, "preserved", 1, 1);
-  tdesc_add_bitfield (type, "enabled", 0, 0);
-
-  type = tdesc_create_union (feature, "cfgu");
-  field_type = tdesc_named_type (feature, "data_ptr");
-  tdesc_add_field (type, "raw", field_type);
-  field_type = tdesc_named_type (feature, "_bndcfgu");
-  tdesc_add_field (type, "config", field_type);
-
-  tdesc_create_reg (feature, "bnd0raw", 76, 1, NULL, 128, "br128");
-  tdesc_create_reg (feature, "bnd1raw", 77, 1, NULL, 128, "br128");
-  tdesc_create_reg (feature, "bnd2raw", 78, 1, NULL, 128, "br128");
-  tdesc_create_reg (feature, "bnd3raw", 79, 1, NULL, 128, "br128");
-  tdesc_create_reg (feature, "bndcfgu", 80, 1, NULL, 64, "cfgu");
-  tdesc_create_reg (feature, "bndstatus", 81, 1, NULL, 64, "status");
-
-  tdesc_amd64_avx_mpx_linux = result;
-}
diff --git a/gdb/features/i386/amd64-linux.c b/gdb/features/i386/amd64-linux.c
deleted file mode 100644
index 58c4405..0000000
--- a/gdb/features/i386/amd64-linux.c
+++ /dev/null
@@ -1,159 +0,0 @@
-/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
-  Original: amd64-linux.xml */
-
-#include "defs.h"
-#include "osabi.h"
-#include "target-descriptions.h"
-
-struct target_desc *tdesc_amd64_linux;
-static void
-initialize_tdesc_amd64_linux (void)
-{
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("i386:x86-64"));
-
-  set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
-
-  struct tdesc_feature *feature;
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-  type = tdesc_create_flags (feature, "i386_eflags", 4);
-  tdesc_add_flag (type, 0, "CF");
-  tdesc_add_flag (type, 1, "");
-  tdesc_add_flag (type, 2, "PF");
-  tdesc_add_flag (type, 4, "AF");
-  tdesc_add_flag (type, 6, "ZF");
-  tdesc_add_flag (type, 7, "SF");
-  tdesc_add_flag (type, 8, "TF");
-  tdesc_add_flag (type, 9, "IF");
-  tdesc_add_flag (type, 10, "DF");
-  tdesc_add_flag (type, 11, "OF");
-  tdesc_add_flag (type, 14, "NT");
-  tdesc_add_flag (type, 16, "RF");
-  tdesc_add_flag (type, 17, "VM");
-  tdesc_add_flag (type, 18, "AC");
-  tdesc_add_flag (type, 19, "VIF");
-  tdesc_add_flag (type, 20, "VIP");
-  tdesc_add_flag (type, 21, "ID");
-
-  tdesc_create_reg (feature, "rax", 0, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rbx", 1, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rcx", 2, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rdx", 3, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rsi", 4, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rdi", 5, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rbp", 6, 1, NULL, 64, "data_ptr");
-  tdesc_create_reg (feature, "rsp", 7, 1, NULL, 64, "data_ptr");
-  tdesc_create_reg (feature, "r8", 8, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r9", 9, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r10", 10, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r11", 11, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r12", 12, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r13", 13, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r14", 14, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r15", 15, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rip", 16, 1, NULL, 64, "code_ptr");
-  tdesc_create_reg (feature, "eflags", 17, 1, NULL, 32, "i386_eflags");
-  tdesc_create_reg (feature, "cs", 18, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ss", 19, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ds", 20, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "es", 21, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "fs", 22, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "gs", 23, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "st0", 24, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st1", 25, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st2", 26, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st3", 27, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st4", 28, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st5", 29, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st6", 30, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st7", 31, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "fctrl", 32, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fstat", 33, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "ftag", 34, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fiseg", 35, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fioff", 36, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "foseg", 37, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fooff", 38, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fop", 39, 1, "float", 32, "int");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.sse");
-  field_type = tdesc_named_type (feature, "ieee_single");
-  tdesc_create_vector (feature, "v4f", field_type, 4);
-
-  field_type = tdesc_named_type (feature, "ieee_double");
-  tdesc_create_vector (feature, "v2d", field_type, 2);
-
-  field_type = tdesc_named_type (feature, "int8");
-  tdesc_create_vector (feature, "v16i8", field_type, 16);
-
-  field_type = tdesc_named_type (feature, "int16");
-  tdesc_create_vector (feature, "v8i16", field_type, 8);
-
-  field_type = tdesc_named_type (feature, "int32");
-  tdesc_create_vector (feature, "v4i32", field_type, 4);
-
-  field_type = tdesc_named_type (feature, "int64");
-  tdesc_create_vector (feature, "v2i64", field_type, 2);
-
-  type = tdesc_create_union (feature, "vec128");
-  field_type = tdesc_named_type (feature, "v4f");
-  tdesc_add_field (type, "v4_float", field_type);
-  field_type = tdesc_named_type (feature, "v2d");
-  tdesc_add_field (type, "v2_double", field_type);
-  field_type = tdesc_named_type (feature, "v16i8");
-  tdesc_add_field (type, "v16_int8", field_type);
-  field_type = tdesc_named_type (feature, "v8i16");
-  tdesc_add_field (type, "v8_int16", field_type);
-  field_type = tdesc_named_type (feature, "v4i32");
-  tdesc_add_field (type, "v4_int32", field_type);
-  field_type = tdesc_named_type (feature, "v2i64");
-  tdesc_add_field (type, "v2_int64", field_type);
-  field_type = tdesc_named_type (feature, "uint128");
-  tdesc_add_field (type, "uint128", field_type);
-
-  type = tdesc_create_flags (feature, "i386_mxcsr", 4);
-  tdesc_add_flag (type, 0, "IE");
-  tdesc_add_flag (type, 1, "DE");
-  tdesc_add_flag (type, 2, "ZE");
-  tdesc_add_flag (type, 3, "OE");
-  tdesc_add_flag (type, 4, "UE");
-  tdesc_add_flag (type, 5, "PE");
-  tdesc_add_flag (type, 6, "DAZ");
-  tdesc_add_flag (type, 7, "IM");
-  tdesc_add_flag (type, 8, "DM");
-  tdesc_add_flag (type, 9, "ZM");
-  tdesc_add_flag (type, 10, "OM");
-  tdesc_add_flag (type, 11, "UM");
-  tdesc_add_flag (type, 12, "PM");
-  tdesc_add_flag (type, 15, "FZ");
-
-  tdesc_create_reg (feature, "xmm0", 40, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm1", 41, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm2", 42, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm3", 43, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm4", 44, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm5", 45, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm6", 46, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm7", 47, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm8", 48, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm9", 49, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm10", 50, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm11", 51, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm12", 52, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm13", 53, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm14", 54, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm15", 55, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "mxcsr", 56, 1, "vector", 32, "i386_mxcsr");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.linux");
-  tdesc_create_reg (feature, "orig_rax", 57, 1, NULL, 64, "int");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.segments");
-  tdesc_create_reg (feature, "fs_base", 58, 1, NULL, 64, "int");
-  tdesc_create_reg (feature, "gs_base", 59, 1, NULL, 64, "int");
-
-  tdesc_amd64_linux = result;
-}
diff --git a/gdb/features/i386/amd64-mpx-linux.c b/gdb/features/i386/amd64-mpx-linux.c
deleted file mode 100644
index dcf92f9..0000000
--- a/gdb/features/i386/amd64-mpx-linux.c
+++ /dev/null
@@ -1,197 +0,0 @@
-/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
-  Original: amd64-mpx-linux.xml */
-
-#include "defs.h"
-#include "osabi.h"
-#include "target-descriptions.h"
-
-struct target_desc *tdesc_amd64_mpx_linux;
-static void
-initialize_tdesc_amd64_mpx_linux (void)
-{
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("i386:x86-64"));
-
-  set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
-
-  struct tdesc_feature *feature;
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-  type = tdesc_create_flags (feature, "i386_eflags", 4);
-  tdesc_add_flag (type, 0, "CF");
-  tdesc_add_flag (type, 1, "");
-  tdesc_add_flag (type, 2, "PF");
-  tdesc_add_flag (type, 4, "AF");
-  tdesc_add_flag (type, 6, "ZF");
-  tdesc_add_flag (type, 7, "SF");
-  tdesc_add_flag (type, 8, "TF");
-  tdesc_add_flag (type, 9, "IF");
-  tdesc_add_flag (type, 10, "DF");
-  tdesc_add_flag (type, 11, "OF");
-  tdesc_add_flag (type, 14, "NT");
-  tdesc_add_flag (type, 16, "RF");
-  tdesc_add_flag (type, 17, "VM");
-  tdesc_add_flag (type, 18, "AC");
-  tdesc_add_flag (type, 19, "VIF");
-  tdesc_add_flag (type, 20, "VIP");
-  tdesc_add_flag (type, 21, "ID");
-
-  tdesc_create_reg (feature, "rax", 0, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rbx", 1, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rcx", 2, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rdx", 3, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rsi", 4, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rdi", 5, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rbp", 6, 1, NULL, 64, "data_ptr");
-  tdesc_create_reg (feature, "rsp", 7, 1, NULL, 64, "data_ptr");
-  tdesc_create_reg (feature, "r8", 8, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r9", 9, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r10", 10, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r11", 11, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r12", 12, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r13", 13, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r14", 14, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r15", 15, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rip", 16, 1, NULL, 64, "code_ptr");
-  tdesc_create_reg (feature, "eflags", 17, 1, NULL, 32, "i386_eflags");
-  tdesc_create_reg (feature, "cs", 18, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ss", 19, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ds", 20, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "es", 21, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "fs", 22, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "gs", 23, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "st0", 24, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st1", 25, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st2", 26, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st3", 27, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st4", 28, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st5", 29, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st6", 30, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st7", 31, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "fctrl", 32, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fstat", 33, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "ftag", 34, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fiseg", 35, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fioff", 36, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "foseg", 37, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fooff", 38, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fop", 39, 1, "float", 32, "int");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.sse");
-  field_type = tdesc_named_type (feature, "ieee_single");
-  tdesc_create_vector (feature, "v4f", field_type, 4);
-
-  field_type = tdesc_named_type (feature, "ieee_double");
-  tdesc_create_vector (feature, "v2d", field_type, 2);
-
-  field_type = tdesc_named_type (feature, "int8");
-  tdesc_create_vector (feature, "v16i8", field_type, 16);
-
-  field_type = tdesc_named_type (feature, "int16");
-  tdesc_create_vector (feature, "v8i16", field_type, 8);
-
-  field_type = tdesc_named_type (feature, "int32");
-  tdesc_create_vector (feature, "v4i32", field_type, 4);
-
-  field_type = tdesc_named_type (feature, "int64");
-  tdesc_create_vector (feature, "v2i64", field_type, 2);
-
-  type = tdesc_create_union (feature, "vec128");
-  field_type = tdesc_named_type (feature, "v4f");
-  tdesc_add_field (type, "v4_float", field_type);
-  field_type = tdesc_named_type (feature, "v2d");
-  tdesc_add_field (type, "v2_double", field_type);
-  field_type = tdesc_named_type (feature, "v16i8");
-  tdesc_add_field (type, "v16_int8", field_type);
-  field_type = tdesc_named_type (feature, "v8i16");
-  tdesc_add_field (type, "v8_int16", field_type);
-  field_type = tdesc_named_type (feature, "v4i32");
-  tdesc_add_field (type, "v4_int32", field_type);
-  field_type = tdesc_named_type (feature, "v2i64");
-  tdesc_add_field (type, "v2_int64", field_type);
-  field_type = tdesc_named_type (feature, "uint128");
-  tdesc_add_field (type, "uint128", field_type);
-
-  type = tdesc_create_flags (feature, "i386_mxcsr", 4);
-  tdesc_add_flag (type, 0, "IE");
-  tdesc_add_flag (type, 1, "DE");
-  tdesc_add_flag (type, 2, "ZE");
-  tdesc_add_flag (type, 3, "OE");
-  tdesc_add_flag (type, 4, "UE");
-  tdesc_add_flag (type, 5, "PE");
-  tdesc_add_flag (type, 6, "DAZ");
-  tdesc_add_flag (type, 7, "IM");
-  tdesc_add_flag (type, 8, "DM");
-  tdesc_add_flag (type, 9, "ZM");
-  tdesc_add_flag (type, 10, "OM");
-  tdesc_add_flag (type, 11, "UM");
-  tdesc_add_flag (type, 12, "PM");
-  tdesc_add_flag (type, 15, "FZ");
-
-  tdesc_create_reg (feature, "xmm0", 40, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm1", 41, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm2", 42, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm3", 43, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm4", 44, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm5", 45, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm6", 46, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm7", 47, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm8", 48, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm9", 49, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm10", 50, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm11", 51, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm12", 52, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm13", 53, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm14", 54, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm15", 55, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "mxcsr", 56, 1, "vector", 32, "i386_mxcsr");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.linux");
-  tdesc_create_reg (feature, "orig_rax", 57, 1, NULL, 64, "int");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.segments");
-  tdesc_create_reg (feature, "fs_base", 58, 1, NULL, 64, "int");
-  tdesc_create_reg (feature, "gs_base", 59, 1, NULL, 64, "int");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.mpx");
-  type = tdesc_create_struct (feature, "br128");
-  field_type = tdesc_named_type (feature, "uint64");
-  tdesc_add_field (type, "lbound", field_type);
-  field_type = tdesc_named_type (feature, "uint64");
-  tdesc_add_field (type, "ubound_raw", field_type);
-
-  type = tdesc_create_struct (feature, "_bndstatus");
-  tdesc_set_struct_size (type, 8);
-  tdesc_add_bitfield (type, "bde", 2, 63);
-  tdesc_add_bitfield (type, "error", 0, 1);
-
-  type = tdesc_create_union (feature, "status");
-  field_type = tdesc_named_type (feature, "data_ptr");
-  tdesc_add_field (type, "raw", field_type);
-  field_type = tdesc_named_type (feature, "_bndstatus");
-  tdesc_add_field (type, "status", field_type);
-
-  type = tdesc_create_struct (feature, "_bndcfgu");
-  tdesc_set_struct_size (type, 8);
-  tdesc_add_bitfield (type, "base", 12, 63);
-  tdesc_add_bitfield (type, "reserved", 2, 11);
-  tdesc_add_bitfield (type, "preserved", 1, 1);
-  tdesc_add_bitfield (type, "enabled", 0, 0);
-
-  type = tdesc_create_union (feature, "cfgu");
-  field_type = tdesc_named_type (feature, "data_ptr");
-  tdesc_add_field (type, "raw", field_type);
-  field_type = tdesc_named_type (feature, "_bndcfgu");
-  tdesc_add_field (type, "config", field_type);
-
-  tdesc_create_reg (feature, "bnd0raw", 60, 1, NULL, 128, "br128");
-  tdesc_create_reg (feature, "bnd1raw", 61, 1, NULL, 128, "br128");
-  tdesc_create_reg (feature, "bnd2raw", 62, 1, NULL, 128, "br128");
-  tdesc_create_reg (feature, "bnd3raw", 63, 1, NULL, 128, "br128");
-  tdesc_create_reg (feature, "bndcfgu", 64, 1, NULL, 64, "cfgu");
-  tdesc_create_reg (feature, "bndstatus", 65, 1, NULL, 64, "status");
-
-  tdesc_amd64_mpx_linux = result;
-}
diff --git a/gdb/features/i386/x32-avx-avx512-linux.c b/gdb/features/i386/x32-avx-avx512-linux.c
deleted file mode 100644
index c023a10..0000000
--- a/gdb/features/i386/x32-avx-avx512-linux.c
+++ /dev/null
@@ -1,288 +0,0 @@
-/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
-  Original: x32-avx-avx512-linux.xml */
-
-#include "defs.h"
-#include "osabi.h"
-#include "target-descriptions.h"
-
-struct target_desc *tdesc_x32_avx_avx512_linux;
-static void
-initialize_tdesc_x32_avx_avx512_linux (void)
-{
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("i386:x64-32"));
-
-  set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
-
-  struct tdesc_feature *feature;
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-  type = tdesc_create_flags (feature, "i386_eflags", 4);
-  tdesc_add_flag (type, 0, "CF");
-  tdesc_add_flag (type, 1, "");
-  tdesc_add_flag (type, 2, "PF");
-  tdesc_add_flag (type, 4, "AF");
-  tdesc_add_flag (type, 6, "ZF");
-  tdesc_add_flag (type, 7, "SF");
-  tdesc_add_flag (type, 8, "TF");
-  tdesc_add_flag (type, 9, "IF");
-  tdesc_add_flag (type, 10, "DF");
-  tdesc_add_flag (type, 11, "OF");
-  tdesc_add_flag (type, 14, "NT");
-  tdesc_add_flag (type, 16, "RF");
-  tdesc_add_flag (type, 17, "VM");
-  tdesc_add_flag (type, 18, "AC");
-  tdesc_add_flag (type, 19, "VIF");
-  tdesc_add_flag (type, 20, "VIP");
-  tdesc_add_flag (type, 21, "ID");
-
-  tdesc_create_reg (feature, "rax", 0, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rbx", 1, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rcx", 2, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rdx", 3, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rsi", 4, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rdi", 5, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rbp", 6, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rsp", 7, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r8", 8, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r9", 9, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r10", 10, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r11", 11, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r12", 12, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r13", 13, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r14", 14, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r15", 15, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rip", 16, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "eflags", 17, 1, NULL, 32, "i386_eflags");
-  tdesc_create_reg (feature, "cs", 18, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ss", 19, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ds", 20, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "es", 21, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "fs", 22, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "gs", 23, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "st0", 24, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st1", 25, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st2", 26, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st3", 27, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st4", 28, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st5", 29, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st6", 30, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st7", 31, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "fctrl", 32, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fstat", 33, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "ftag", 34, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fiseg", 35, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fioff", 36, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "foseg", 37, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fooff", 38, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fop", 39, 1, "float", 32, "int");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.sse");
-  field_type = tdesc_named_type (feature, "ieee_single");
-  tdesc_create_vector (feature, "v4f", field_type, 4);
-
-  field_type = tdesc_named_type (feature, "ieee_double");
-  tdesc_create_vector (feature, "v2d", field_type, 2);
-
-  field_type = tdesc_named_type (feature, "int8");
-  tdesc_create_vector (feature, "v16i8", field_type, 16);
-
-  field_type = tdesc_named_type (feature, "int16");
-  tdesc_create_vector (feature, "v8i16", field_type, 8);
-
-  field_type = tdesc_named_type (feature, "int32");
-  tdesc_create_vector (feature, "v4i32", field_type, 4);
-
-  field_type = tdesc_named_type (feature, "int64");
-  tdesc_create_vector (feature, "v2i64", field_type, 2);
-
-  type = tdesc_create_union (feature, "vec128");
-  field_type = tdesc_named_type (feature, "v4f");
-  tdesc_add_field (type, "v4_float", field_type);
-  field_type = tdesc_named_type (feature, "v2d");
-  tdesc_add_field (type, "v2_double", field_type);
-  field_type = tdesc_named_type (feature, "v16i8");
-  tdesc_add_field (type, "v16_int8", field_type);
-  field_type = tdesc_named_type (feature, "v8i16");
-  tdesc_add_field (type, "v8_int16", field_type);
-  field_type = tdesc_named_type (feature, "v4i32");
-  tdesc_add_field (type, "v4_int32", field_type);
-  field_type = tdesc_named_type (feature, "v2i64");
-  tdesc_add_field (type, "v2_int64", field_type);
-  field_type = tdesc_named_type (feature, "uint128");
-  tdesc_add_field (type, "uint128", field_type);
-
-  type = tdesc_create_flags (feature, "i386_mxcsr", 4);
-  tdesc_add_flag (type, 0, "IE");
-  tdesc_add_flag (type, 1, "DE");
-  tdesc_add_flag (type, 2, "ZE");
-  tdesc_add_flag (type, 3, "OE");
-  tdesc_add_flag (type, 4, "UE");
-  tdesc_add_flag (type, 5, "PE");
-  tdesc_add_flag (type, 6, "DAZ");
-  tdesc_add_flag (type, 7, "IM");
-  tdesc_add_flag (type, 8, "DM");
-  tdesc_add_flag (type, 9, "ZM");
-  tdesc_add_flag (type, 10, "OM");
-  tdesc_add_flag (type, 11, "UM");
-  tdesc_add_flag (type, 12, "PM");
-  tdesc_add_flag (type, 15, "FZ");
-
-  tdesc_create_reg (feature, "xmm0", 40, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm1", 41, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm2", 42, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm3", 43, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm4", 44, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm5", 45, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm6", 46, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm7", 47, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm8", 48, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm9", 49, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm10", 50, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm11", 51, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm12", 52, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm13", 53, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm14", 54, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm15", 55, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "mxcsr", 56, 1, "vector", 32, "i386_mxcsr");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.linux");
-  tdesc_create_reg (feature, "orig_rax", 57, 1, NULL, 64, "int");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.segments");
-  tdesc_create_reg (feature, "fs_base", 58, 1, NULL, 64, "int");
-  tdesc_create_reg (feature, "gs_base", 59, 1, NULL, 64, "int");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx");
-  tdesc_create_reg (feature, "ymm0h", 60, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm1h", 61, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm2h", 62, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm3h", 63, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm4h", 64, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm5h", 65, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm6h", 66, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm7h", 67, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm8h", 68, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm9h", 69, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm10h", 70, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm11h", 71, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm12h", 72, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm13h", 73, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm14h", 74, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm15h", 75, 1, NULL, 128, "uint128");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx512");
-  field_type = tdesc_named_type (feature, "ieee_single");
-  tdesc_create_vector (feature, "v4f", field_type, 4);
-
-  field_type = tdesc_named_type (feature, "ieee_double");
-  tdesc_create_vector (feature, "v2d", field_type, 2);
-
-  field_type = tdesc_named_type (feature, "int8");
-  tdesc_create_vector (feature, "v16i8", field_type, 16);
-
-  field_type = tdesc_named_type (feature, "int16");
-  tdesc_create_vector (feature, "v8i16", field_type, 8);
-
-  field_type = tdesc_named_type (feature, "int32");
-  tdesc_create_vector (feature, "v4i32", field_type, 4);
-
-  field_type = tdesc_named_type (feature, "int64");
-  tdesc_create_vector (feature, "v2i64", field_type, 2);
-
-  type = tdesc_create_union (feature, "vec128");
-  field_type = tdesc_named_type (feature, "v4f");
-  tdesc_add_field (type, "v4_float", field_type);
-  field_type = tdesc_named_type (feature, "v2d");
-  tdesc_add_field (type, "v2_double", field_type);
-  field_type = tdesc_named_type (feature, "v16i8");
-  tdesc_add_field (type, "v16_int8", field_type);
-  field_type = tdesc_named_type (feature, "v8i16");
-  tdesc_add_field (type, "v8_int16", field_type);
-  field_type = tdesc_named_type (feature, "v4i32");
-  tdesc_add_field (type, "v4_int32", field_type);
-  field_type = tdesc_named_type (feature, "v2i64");
-  tdesc_add_field (type, "v2_int64", field_type);
-  field_type = tdesc_named_type (feature, "uint128");
-  tdesc_add_field (type, "uint128", field_type);
-
-  field_type = tdesc_named_type (feature, "uint128");
-  tdesc_create_vector (feature, "v2ui128", field_type, 2);
-
-  tdesc_create_reg (feature, "xmm16", 76, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm17", 77, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm18", 78, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm19", 79, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm20", 80, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm21", 81, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm22", 82, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm23", 83, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm24", 84, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm25", 85, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm26", 86, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm27", 87, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm28", 88, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm29", 89, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm30", 90, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm31", 91, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "ymm16h", 92, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm17h", 93, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm18h", 94, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm19h", 95, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm20h", 96, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm21h", 97, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm22h", 98, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm23h", 99, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm24h", 100, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm25h", 101, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm26h", 102, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm27h", 103, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm28h", 104, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm29h", 105, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm30h", 106, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm31h", 107, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "k0", 108, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k1", 109, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k2", 110, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k3", 111, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k4", 112, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k5", 113, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k6", 114, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k7", 115, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "zmm0h", 116, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm1h", 117, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm2h", 118, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm3h", 119, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm4h", 120, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm5h", 121, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm6h", 122, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm7h", 123, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm8h", 124, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm9h", 125, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm10h", 126, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm11h", 127, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm12h", 128, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm13h", 129, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm14h", 130, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm15h", 131, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm16h", 132, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm17h", 133, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm18h", 134, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm19h", 135, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm20h", 136, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm21h", 137, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm22h", 138, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm23h", 139, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm24h", 140, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm25h", 141, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm26h", 142, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm27h", 143, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm28h", 144, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm29h", 145, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm30h", 146, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm31h", 147, 1, NULL, 256, "v2ui128");
-
-  tdesc_x32_avx_avx512_linux = result;
-}
diff --git a/gdb/features/i386/x32-avx-linux.c b/gdb/features/i386/x32-avx-linux.c
deleted file mode 100644
index 211d138..0000000
--- a/gdb/features/i386/x32-avx-linux.c
+++ /dev/null
@@ -1,177 +0,0 @@
-/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
-  Original: x32-avx-linux.xml */
-
-#include "defs.h"
-#include "osabi.h"
-#include "target-descriptions.h"
-
-struct target_desc *tdesc_x32_avx_linux;
-static void
-initialize_tdesc_x32_avx_linux (void)
-{
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("i386:x64-32"));
-
-  set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
-
-  struct tdesc_feature *feature;
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-  type = tdesc_create_flags (feature, "i386_eflags", 4);
-  tdesc_add_flag (type, 0, "CF");
-  tdesc_add_flag (type, 1, "");
-  tdesc_add_flag (type, 2, "PF");
-  tdesc_add_flag (type, 4, "AF");
-  tdesc_add_flag (type, 6, "ZF");
-  tdesc_add_flag (type, 7, "SF");
-  tdesc_add_flag (type, 8, "TF");
-  tdesc_add_flag (type, 9, "IF");
-  tdesc_add_flag (type, 10, "DF");
-  tdesc_add_flag (type, 11, "OF");
-  tdesc_add_flag (type, 14, "NT");
-  tdesc_add_flag (type, 16, "RF");
-  tdesc_add_flag (type, 17, "VM");
-  tdesc_add_flag (type, 18, "AC");
-  tdesc_add_flag (type, 19, "VIF");
-  tdesc_add_flag (type, 20, "VIP");
-  tdesc_add_flag (type, 21, "ID");
-
-  tdesc_create_reg (feature, "rax", 0, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rbx", 1, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rcx", 2, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rdx", 3, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rsi", 4, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rdi", 5, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rbp", 6, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rsp", 7, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r8", 8, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r9", 9, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r10", 10, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r11", 11, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r12", 12, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r13", 13, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r14", 14, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r15", 15, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rip", 16, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "eflags", 17, 1, NULL, 32, "i386_eflags");
-  tdesc_create_reg (feature, "cs", 18, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ss", 19, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ds", 20, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "es", 21, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "fs", 22, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "gs", 23, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "st0", 24, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st1", 25, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st2", 26, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st3", 27, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st4", 28, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st5", 29, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st6", 30, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st7", 31, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "fctrl", 32, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fstat", 33, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "ftag", 34, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fiseg", 35, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fioff", 36, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "foseg", 37, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fooff", 38, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fop", 39, 1, "float", 32, "int");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.sse");
-  field_type = tdesc_named_type (feature, "ieee_single");
-  tdesc_create_vector (feature, "v4f", field_type, 4);
-
-  field_type = tdesc_named_type (feature, "ieee_double");
-  tdesc_create_vector (feature, "v2d", field_type, 2);
-
-  field_type = tdesc_named_type (feature, "int8");
-  tdesc_create_vector (feature, "v16i8", field_type, 16);
-
-  field_type = tdesc_named_type (feature, "int16");
-  tdesc_create_vector (feature, "v8i16", field_type, 8);
-
-  field_type = tdesc_named_type (feature, "int32");
-  tdesc_create_vector (feature, "v4i32", field_type, 4);
-
-  field_type = tdesc_named_type (feature, "int64");
-  tdesc_create_vector (feature, "v2i64", field_type, 2);
-
-  type = tdesc_create_union (feature, "vec128");
-  field_type = tdesc_named_type (feature, "v4f");
-  tdesc_add_field (type, "v4_float", field_type);
-  field_type = tdesc_named_type (feature, "v2d");
-  tdesc_add_field (type, "v2_double", field_type);
-  field_type = tdesc_named_type (feature, "v16i8");
-  tdesc_add_field (type, "v16_int8", field_type);
-  field_type = tdesc_named_type (feature, "v8i16");
-  tdesc_add_field (type, "v8_int16", field_type);
-  field_type = tdesc_named_type (feature, "v4i32");
-  tdesc_add_field (type, "v4_int32", field_type);
-  field_type = tdesc_named_type (feature, "v2i64");
-  tdesc_add_field (type, "v2_int64", field_type);
-  field_type = tdesc_named_type (feature, "uint128");
-  tdesc_add_field (type, "uint128", field_type);
-
-  type = tdesc_create_flags (feature, "i386_mxcsr", 4);
-  tdesc_add_flag (type, 0, "IE");
-  tdesc_add_flag (type, 1, "DE");
-  tdesc_add_flag (type, 2, "ZE");
-  tdesc_add_flag (type, 3, "OE");
-  tdesc_add_flag (type, 4, "UE");
-  tdesc_add_flag (type, 5, "PE");
-  tdesc_add_flag (type, 6, "DAZ");
-  tdesc_add_flag (type, 7, "IM");
-  tdesc_add_flag (type, 8, "DM");
-  tdesc_add_flag (type, 9, "ZM");
-  tdesc_add_flag (type, 10, "OM");
-  tdesc_add_flag (type, 11, "UM");
-  tdesc_add_flag (type, 12, "PM");
-  tdesc_add_flag (type, 15, "FZ");
-
-  tdesc_create_reg (feature, "xmm0", 40, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm1", 41, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm2", 42, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm3", 43, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm4", 44, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm5", 45, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm6", 46, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm7", 47, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm8", 48, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm9", 49, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm10", 50, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm11", 51, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm12", 52, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm13", 53, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm14", 54, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm15", 55, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "mxcsr", 56, 1, "vector", 32, "i386_mxcsr");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.linux");
-  tdesc_create_reg (feature, "orig_rax", 57, 1, NULL, 64, "int");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.segments");
-  tdesc_create_reg (feature, "fs_base", 58, 1, NULL, 64, "int");
-  tdesc_create_reg (feature, "gs_base", 59, 1, NULL, 64, "int");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx");
-  tdesc_create_reg (feature, "ymm0h", 60, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm1h", 61, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm2h", 62, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm3h", 63, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm4h", 64, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm5h", 65, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm6h", 66, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm7h", 67, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm8h", 68, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm9h", 69, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm10h", 70, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm11h", 71, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm12h", 72, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm13h", 73, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm14h", 74, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm15h", 75, 1, NULL, 128, "uint128");
-
-  tdesc_x32_avx_linux = result;
-}
diff --git a/gdb/features/i386/x32-linux.c b/gdb/features/i386/x32-linux.c
deleted file mode 100644
index 05d502b..0000000
--- a/gdb/features/i386/x32-linux.c
+++ /dev/null
@@ -1,159 +0,0 @@
-/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
-  Original: x32-linux.xml */
-
-#include "defs.h"
-#include "osabi.h"
-#include "target-descriptions.h"
-
-struct target_desc *tdesc_x32_linux;
-static void
-initialize_tdesc_x32_linux (void)
-{
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("i386:x64-32"));
-
-  set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
-
-  struct tdesc_feature *feature;
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
-  struct tdesc_type *field_type;
-  struct tdesc_type *type;
-  type = tdesc_create_flags (feature, "i386_eflags", 4);
-  tdesc_add_flag (type, 0, "CF");
-  tdesc_add_flag (type, 1, "");
-  tdesc_add_flag (type, 2, "PF");
-  tdesc_add_flag (type, 4, "AF");
-  tdesc_add_flag (type, 6, "ZF");
-  tdesc_add_flag (type, 7, "SF");
-  tdesc_add_flag (type, 8, "TF");
-  tdesc_add_flag (type, 9, "IF");
-  tdesc_add_flag (type, 10, "DF");
-  tdesc_add_flag (type, 11, "OF");
-  tdesc_add_flag (type, 14, "NT");
-  tdesc_add_flag (type, 16, "RF");
-  tdesc_add_flag (type, 17, "VM");
-  tdesc_add_flag (type, 18, "AC");
-  tdesc_add_flag (type, 19, "VIF");
-  tdesc_add_flag (type, 20, "VIP");
-  tdesc_add_flag (type, 21, "ID");
-
-  tdesc_create_reg (feature, "rax", 0, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rbx", 1, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rcx", 2, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rdx", 3, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rsi", 4, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rdi", 5, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rbp", 6, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rsp", 7, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r8", 8, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r9", 9, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r10", 10, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r11", 11, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r12", 12, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r13", 13, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r14", 14, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "r15", 15, 1, NULL, 64, "int64");
-  tdesc_create_reg (feature, "rip", 16, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "eflags", 17, 1, NULL, 32, "i386_eflags");
-  tdesc_create_reg (feature, "cs", 18, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ss", 19, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "ds", 20, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "es", 21, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "fs", 22, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "gs", 23, 1, NULL, 32, "int32");
-  tdesc_create_reg (feature, "st0", 24, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st1", 25, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st2", 26, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st3", 27, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st4", 28, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st5", 29, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st6", 30, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "st7", 31, 1, NULL, 80, "i387_ext");
-  tdesc_create_reg (feature, "fctrl", 32, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fstat", 33, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "ftag", 34, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fiseg", 35, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fioff", 36, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "foseg", 37, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fooff", 38, 1, "float", 32, "int");
-  tdesc_create_reg (feature, "fop", 39, 1, "float", 32, "int");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.sse");
-  field_type = tdesc_named_type (feature, "ieee_single");
-  tdesc_create_vector (feature, "v4f", field_type, 4);
-
-  field_type = tdesc_named_type (feature, "ieee_double");
-  tdesc_create_vector (feature, "v2d", field_type, 2);
-
-  field_type = tdesc_named_type (feature, "int8");
-  tdesc_create_vector (feature, "v16i8", field_type, 16);
-
-  field_type = tdesc_named_type (feature, "int16");
-  tdesc_create_vector (feature, "v8i16", field_type, 8);
-
-  field_type = tdesc_named_type (feature, "int32");
-  tdesc_create_vector (feature, "v4i32", field_type, 4);
-
-  field_type = tdesc_named_type (feature, "int64");
-  tdesc_create_vector (feature, "v2i64", field_type, 2);
-
-  type = tdesc_create_union (feature, "vec128");
-  field_type = tdesc_named_type (feature, "v4f");
-  tdesc_add_field (type, "v4_float", field_type);
-  field_type = tdesc_named_type (feature, "v2d");
-  tdesc_add_field (type, "v2_double", field_type);
-  field_type = tdesc_named_type (feature, "v16i8");
-  tdesc_add_field (type, "v16_int8", field_type);
-  field_type = tdesc_named_type (feature, "v8i16");
-  tdesc_add_field (type, "v8_int16", field_type);
-  field_type = tdesc_named_type (feature, "v4i32");
-  tdesc_add_field (type, "v4_int32", field_type);
-  field_type = tdesc_named_type (feature, "v2i64");
-  tdesc_add_field (type, "v2_int64", field_type);
-  field_type = tdesc_named_type (feature, "uint128");
-  tdesc_add_field (type, "uint128", field_type);
-
-  type = tdesc_create_flags (feature, "i386_mxcsr", 4);
-  tdesc_add_flag (type, 0, "IE");
-  tdesc_add_flag (type, 1, "DE");
-  tdesc_add_flag (type, 2, "ZE");
-  tdesc_add_flag (type, 3, "OE");
-  tdesc_add_flag (type, 4, "UE");
-  tdesc_add_flag (type, 5, "PE");
-  tdesc_add_flag (type, 6, "DAZ");
-  tdesc_add_flag (type, 7, "IM");
-  tdesc_add_flag (type, 8, "DM");
-  tdesc_add_flag (type, 9, "ZM");
-  tdesc_add_flag (type, 10, "OM");
-  tdesc_add_flag (type, 11, "UM");
-  tdesc_add_flag (type, 12, "PM");
-  tdesc_add_flag (type, 15, "FZ");
-
-  tdesc_create_reg (feature, "xmm0", 40, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm1", 41, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm2", 42, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm3", 43, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm4", 44, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm5", 45, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm6", 46, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm7", 47, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm8", 48, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm9", 49, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm10", 50, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm11", 51, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm12", 52, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm13", 53, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm14", 54, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm15", 55, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "mxcsr", 56, 1, "vector", 32, "i386_mxcsr");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.linux");
-  tdesc_create_reg (feature, "orig_rax", 57, 1, NULL, 64, "int");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.segments");
-  tdesc_create_reg (feature, "fs_base", 58, 1, NULL, 64, "int");
-  tdesc_create_reg (feature, "gs_base", 59, 1, NULL, 64, "int");
-
-  tdesc_x32_linux = result;
-}
-- 
1.9.1

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

* Re: [PATCH 03/26] Add optional argument to command "maint prints c-tdesc"
  2017-07-10 13:55 ` [PATCH 03/26] Add optional argument to command "maint prints c-tdesc" Yao Qi
@ 2017-07-10 17:21   ` Eli Zaretskii
  0 siblings, 0 replies; 30+ messages in thread
From: Eli Zaretskii @ 2017-07-10 17:21 UTC (permalink / raw)
  To: Yao Qi; +Cc: gdb-patches

> From: Yao Qi <qiyaoltc@gmail.com>
> Date: Mon, 10 Jul 2017 14:55:17 +0100
> 
> Nowadays, we need two steps to print c files for xml target description,
> that is, 1) read xml target description in, update the current tdesc,
> 2) visit the current tdesc, print the c file.  It is unnecessary to
> involve in current tdesc, and some validations in each gdbarch are
> performed unnecessarily, which will reject some target descriptions if
> they are missing some mandatory feature.
> 
> This patch adds an optional argument to "maint print c-tdesc", which
> is an XML file target description, so that we can combine the two
> steps above into one step, and don't have to involve in global current
> tdesc.
> 
> gdb:
> 
> 2017-06-30  Yao Qi  <yao.qi@linaro.org>
> 
> 	* NEWS: Mention it.
> 	* features/Makefile (%.c: %.xml): Pass the xml file name to
> 	command "maint print c-tdesc".
> 	* target-descriptions.c (maint_print_c_tdesc_cmd): Get file
> 	name from 'arg'.
> 
> gdb/doc:
> 
> 2017-06-30  Yao Qi  <yao.qi@linaro.org>
> 
> 	* gdb.texinfo (Maintenance Commands): Document optional
> 	argument of "maint print c-tdesc".

OK for the documentation parts.

Thanks.

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

* Re: [PATCH 01/26] Improve doc about "maint print c-tdesc"
  2017-07-10 13:55 ` [PATCH 01/26] Improve doc about "maint print c-tdesc" Yao Qi
@ 2017-07-18 11:40   ` Yao Qi
  0 siblings, 0 replies; 30+ messages in thread
From: Yao Qi @ 2017-07-18 11:40 UTC (permalink / raw)
  To: gdb-patches

Yao Qi <qiyaoltc@gmail.com> writes:

> In my patch extending command "maint print c-tdesc"
> (https://sourceware.org/ml/gdb-patches/2017-06/msg00286.html), Eli
> raised some questions on the existing doc to this command.  It is not
> very clear, so this patch improves it.  Eli approved it.
>
> gdb/doc:
>
> 2017-06-30  Yao Qi  <yao.qi@linaro.org>
>
> 	* gdb.texinfo (Maintenance Commands): Improve the doc to
> 	command "maint print c-tdesc".

I pushed it in.

-- 
Yao (齐尧)

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

* Re: [PATCH 00/26 v3] Make GDB builtin target descriptions more flexible
  2017-07-10 13:56 [PATCH 00/26 v3] Make GDB builtin target descriptions more flexible Yao Qi
                   ` (25 preceding siblings ...)
  2017-07-10 13:57 ` [PATCH 26/26] Remove features/i386/amd64-*linux.c and features/i386/x32-*linux.c Yao Qi
@ 2017-07-26 13:59 ` Yao Qi
  26 siblings, 0 replies; 30+ messages in thread
From: Yao Qi @ 2017-07-26 13:59 UTC (permalink / raw)
  To: gdb-patches

Yao Qi <qiyaoltc@gmail.com> writes:

> This patch series is to change GDB and GDBserver builtin target
> descriptions more flexible, by removing pre-generated ones.  Nowadays,
> GDB builtin target descriptions are created from initialize_tdesc_*
> functions in features/*.c files, while GDBserver builtin target
> descriptions are generated from regformats/*.dat files.  Instead,
> with these patches applied, these builtin target descriptions can be
> got lazily and dynamically.

FYI, I pushed patches 1 ~ 8.  They are about GDB changes.  I'll see how
much I can improve the GDBserver side changes.

-- 
Yao (齐尧)

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

end of thread, other threads:[~2017-07-26 13:59 UTC | newest]

Thread overview: 30+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-07-10 13:56 [PATCH 00/26 v3] Make GDB builtin target descriptions more flexible Yao Qi
2017-07-10 13:55 ` [PATCH 01/26] Improve doc about "maint print c-tdesc" Yao Qi
2017-07-18 11:40   ` Yao Qi
2017-07-10 13:55 ` [PATCH 04/26] Centralize i386 linux target descriptions Yao Qi
2017-07-10 13:55 ` [PATCH 03/26] Add optional argument to command "maint prints c-tdesc" Yao Qi
2017-07-10 17:21   ` Eli Zaretskii
2017-07-10 13:56 ` [PATCH 12/26] [GDBserver] Centralize tdesc for i386-linux Yao Qi
2017-07-10 13:56 ` [PATCH 09/26] Adjust code generated by regformats/regdat.sh Yao Qi
2017-07-10 13:56 ` [PATCH 20/26] Update comments in amd64_linux_core_read_description Yao Qi
2017-07-10 13:56 ` [PATCH 11/26] Return X86_TDESC_MMX in x86_get_ipa_tdesc_idx Yao Qi
2017-07-10 13:56 ` [PATCH 23/26] Convert amd64-linux target descriptions Yao Qi
2017-07-10 13:56 ` [PATCH 24/26] [GDBserver] Use pre-generated amd64-linux tdesc as test Yao Qi
2017-07-10 13:56 ` [PATCH 10/26] Use VEC for target_desc.reg_defs Yao Qi
2017-07-10 13:56 ` [PATCH 17/26] Remove features/i386/i386-*linux.c Yao Qi
2017-07-10 13:56 ` [PATCH 16/26] Share i386-linux target description between GDB and GDBserver Yao Qi
2017-07-10 13:56 ` [PATCH 14/26] [GDBserver] unit test to i386_tdesc Yao Qi
2017-07-10 13:56 ` [PATCH 05/26] Use visitor pattern for "maint print c-tdesc" Yao Qi
2017-07-10 13:56 ` [PATCH 18/26] [GDBserver] Use pre-generated tdesc as test Yao Qi
2017-07-10 13:56 ` [PATCH 15/26] Dynamically composite xml in reply to GDB Yao Qi
2017-07-10 13:56 ` [PATCH 08/26] Add "maint check xml-descriptions" to test builtin xml target descriptions Yao Qi
2017-07-10 13:56 ` [PATCH 06/26] Generate c for feature instead of tdesc Yao Qi
2017-07-10 13:56 ` [PATCH 25/26] [GDBserver] shorten srv_amd64_linux_xmlfiles Yao Qi
2017-07-10 13:56 ` [PATCH 13/26] GDBserver self test Yao Qi
2017-07-10 13:56 ` [PATCH 22/26] Lazily and dynamically create amd64-linux target descriptions Yao Qi
2017-07-10 13:56 ` [PATCH 07/26] Lazily and dynamically create i386-linux " Yao Qi
2017-07-10 13:56 ` [PATCH 21/26] Centralize amd64-linux " Yao Qi
2017-07-10 13:56 ` [PATCH 19/26] [GDBserver] Shorten srv_i386_linux_xmlfiles Yao Qi
2017-07-10 13:56 ` [PATCH 02/26] Class-fy target_desc Yao Qi
2017-07-10 13:57 ` [PATCH 26/26] Remove features/i386/amd64-*linux.c and features/i386/x32-*linux.c Yao Qi
2017-07-26 13:59 ` [PATCH 00/26 v3] Make GDB builtin target descriptions more flexible Yao Qi

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