[RFC 2/7] Add unit test to builtin tdesc generated by xml

Yao Qi qiyaoltc@gmail.com
Thu May 11 15:55:00 GMT 2017


I need to modify how GDB generate C files under features/ directory
from xml files.  I realize that we don't have a test to verify that
target description got from xml files equals to the target description
created by C files generated from the same xml files.

GDB have two "groups" of target descriptions, one is builtin target
descriptions, and the other is got by parsing xml files (xml files
can be got from remote target or via "set tdesc filename XXX").  The
builtin target descriptions are created from feature/*.c files, which
are generated from xml files as well,

  GDB <---------------- XML files
   ^                       |
   |                       |
   `-----   C files <------,

the reason that we transform xml files to c files is that GDB is still
able to have some target description without xml parsing support.

What this test does is to compare two target descriptions, one is from
xml files, and the other is from c files (which is generated from the
same xml files).  They are must be identical, otherwise, there is
something wrong in c files generation from xml files.

gdb:

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

	* target-descriptions.c (tdesc_reg_equals): New function.
	(tdesc_type_equals): New function.
	(tdesc_feature_equals): New function.
	(tdesc_equals): New function.
	(maint_print_c_tdesc_cmd): Print C code for unit test.
	[GDB_SELF_TEST] (lists): New variable.
	[GDB_SELF_TEST] (selftests::record_xml_tdesc): New function.
	[GDB_SELF_TEST] (xml_builtin_tdesc_test): New function.
	(_initialize_target_descriptions) [GDB_SELF_TEST]: Call
	register_self_test.
	* target-descriptions.h (tdesc_equals): Declare.
	(selftests::record_xml_tdesc): Declare.

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

diff --git a/gdb/features/aarch64.c b/gdb/features/aarch64.c
index e9eaed8..0aa0c54 100644
--- a/gdb/features/aarch64.c
+++ b/gdb/features/aarch64.c
@@ -188,4 +188,7 @@ initialize_tdesc_aarch64 (void)
   tdesc_create_reg (feature, "fpcr", 67, 1, NULL, 32, "int");
 
   tdesc_aarch64 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("aarch64.xml", tdesc_aarch64);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/arc-arcompact.c b/gdb/features/arc-arcompact.c
index a527cc2..2624007 100644
--- a/gdb/features/arc-arcompact.c
+++ b/gdb/features/arc-arcompact.c
@@ -72,4 +72,7 @@ initialize_tdesc_arc_arcompact (void)
   tdesc_create_reg (feature, "status32", 35, 1, NULL, 32, "status32_type");
 
   tdesc_arc_arcompact = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("arc-arcompact.xml", tdesc_arc_arcompact);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/arc-v2.c b/gdb/features/arc-v2.c
index b2bdfb5..7533c1b 100644
--- a/gdb/features/arc-v2.c
+++ b/gdb/features/arc-v2.c
@@ -76,4 +76,7 @@ initialize_tdesc_arc_v2 (void)
   tdesc_create_reg (feature, "status32", 35, 1, NULL, 32, "status32_type");
 
   tdesc_arc_v2 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("arc-v2.xml", tdesc_arc_v2);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/arm/arm-with-iwmmxt.c b/gdb/features/arm/arm-with-iwmmxt.c
index 1770e03..70e0dbb 100644
--- a/gdb/features/arm/arm-with-iwmmxt.c
+++ b/gdb/features/arm/arm-with-iwmmxt.c
@@ -79,4 +79,7 @@ initialize_tdesc_arm_with_iwmmxt (void)
   tdesc_create_reg (feature, "wCGR3", 47, 1, "vector", 32, "int");
 
   tdesc_arm_with_iwmmxt = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("arm/arm-with-iwmmxt.xml", tdesc_arm_with_iwmmxt);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/arm/arm-with-m-fpa-layout.c b/gdb/features/arm/arm-with-m-fpa-layout.c
index f720614..0a74ae9 100644
--- a/gdb/features/arm/arm-with-m-fpa-layout.c
+++ b/gdb/features/arm/arm-with-m-fpa-layout.c
@@ -43,4 +43,7 @@ initialize_tdesc_arm_with_m_fpa_layout (void)
   tdesc_create_reg (feature, "xpsr", 25, 1, NULL, 32, "int");
 
   tdesc_arm_with_m_fpa_layout = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("arm/arm-with-m-fpa-layout.xml", tdesc_arm_with_m_fpa_layout);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/arm/arm-with-m-vfp-d16.c b/gdb/features/arm/arm-with-m-vfp-d16.c
index 069baac..2586fab 100644
--- a/gdb/features/arm/arm-with-m-vfp-d16.c
+++ b/gdb/features/arm/arm-with-m-vfp-d16.c
@@ -53,4 +53,7 @@ initialize_tdesc_arm_with_m_vfp_d16 (void)
   tdesc_create_reg (feature, "fpscr", 42, 1, "float", 32, "int");
 
   tdesc_arm_with_m_vfp_d16 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("arm/arm-with-m-vfp-d16.xml", tdesc_arm_with_m_vfp_d16);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/arm/arm-with-m.c b/gdb/features/arm/arm-with-m.c
index 64d31bb..92c47c5 100644
--- a/gdb/features/arm/arm-with-m.c
+++ b/gdb/features/arm/arm-with-m.c
@@ -34,4 +34,7 @@ initialize_tdesc_arm_with_m (void)
   tdesc_create_reg (feature, "xpsr", 25, 1, NULL, 32, "int");
 
   tdesc_arm_with_m = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("arm/arm-with-m.xml", tdesc_arm_with_m);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/arm/arm-with-neon.c b/gdb/features/arm/arm-with-neon.c
index d365c0f..b236458 100644
--- a/gdb/features/arm/arm-with-neon.c
+++ b/gdb/features/arm/arm-with-neon.c
@@ -71,4 +71,7 @@ initialize_tdesc_arm_with_neon (void)
   feature = tdesc_create_feature (result, "org.gnu.gdb.arm.neon");
 
   tdesc_arm_with_neon = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("arm/arm-with-neon.xml", tdesc_arm_with_neon);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/arm/arm-with-vfpv2.c b/gdb/features/arm/arm-with-vfpv2.c
index 0ebbfef..e045b01 100644
--- a/gdb/features/arm/arm-with-vfpv2.c
+++ b/gdb/features/arm/arm-with-vfpv2.c
@@ -53,4 +53,7 @@ initialize_tdesc_arm_with_vfpv2 (void)
   tdesc_create_reg (feature, "fpscr", 42, 1, "float", 32, "int");
 
   tdesc_arm_with_vfpv2 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("arm/arm-with-vfpv2.xml", tdesc_arm_with_vfpv2);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/arm/arm-with-vfpv3.c b/gdb/features/arm/arm-with-vfpv3.c
index e235dfa..e8bfea6 100644
--- a/gdb/features/arm/arm-with-vfpv3.c
+++ b/gdb/features/arm/arm-with-vfpv3.c
@@ -69,4 +69,7 @@ initialize_tdesc_arm_with_vfpv3 (void)
   tdesc_create_reg (feature, "fpscr", 58, 1, "float", 32, "int");
 
   tdesc_arm_with_vfpv3 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("arm/arm-with-vfpv3.xml", tdesc_arm_with_vfpv3);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/i386/amd64-avx-avx512-linux.c b/gdb/features/i386/amd64-avx-avx512-linux.c
index 6129ab1..78f3277 100644
--- a/gdb/features/i386/amd64-avx-avx512-linux.c
+++ b/gdb/features/i386/amd64-avx-avx512-linux.c
@@ -282,7 +282,10 @@ initialize_tdesc_amd64_avx_avx512_linux (void)
   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", 146, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm31h", 147, 1, NULL, 256, "v2ui128");
 
   tdesc_amd64_avx_avx512_linux = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("i386/amd64-avx-avx512-linux.xml", tdesc_amd64_avx_avx512_linux);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/i386/amd64-avx-avx512.c b/gdb/features/i386/amd64-avx-avx512.c
index 8a185c1..b0d8f53 100644
--- a/gdb/features/i386/amd64-avx-avx512.c
+++ b/gdb/features/i386/amd64-avx-avx512.c
@@ -276,4 +276,7 @@ initialize_tdesc_amd64_avx_avx512 (void)
   tdesc_create_reg (feature, "zmm31h", 144, 1, NULL, 256, "v2ui128");
 
   tdesc_amd64_avx_avx512 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("i386/amd64-avx-avx512.xml", tdesc_amd64_avx_avx512);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/i386/amd64-avx-linux.c b/gdb/features/i386/amd64-avx-linux.c
index 1d56dbf..3da5273 100644
--- a/gdb/features/i386/amd64-avx-linux.c
+++ b/gdb/features/i386/amd64-avx-linux.c
@@ -174,4 +174,7 @@ initialize_tdesc_amd64_avx_linux (void)
   tdesc_create_reg (feature, "ymm15h", 75, 1, NULL, 128, "uint128");
 
   tdesc_amd64_avx_linux = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("i386/amd64-avx-linux.xml", tdesc_amd64_avx_linux);
+#endif /* GDB_SELF_TEST */
 }
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 248eff7..3d63c21 100644
--- a/gdb/features/i386/amd64-avx-mpx-avx512-pku-linux.c
+++ b/gdb/features/i386/amd64-avx-mpx-avx512-pku-linux.c
@@ -323,7 +323,10 @@ initialize_tdesc_amd64_avx_mpx_avx512_pku_linux (void)
   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", 152, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "pkru", 154, 1, NULL, 32, "uint32");
 
   tdesc_amd64_avx_mpx_avx512_pku_linux = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("i386/amd64-avx-mpx-avx512-pku-linux.xml", tdesc_amd64_avx_mpx_avx512_pku_linux);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/i386/amd64-avx-mpx-avx512-pku.c b/gdb/features/i386/amd64-avx-mpx-avx512-pku.c
index dfe7d77..8c7d40d 100644
--- a/gdb/features/i386/amd64-avx-mpx-avx512-pku.c
+++ b/gdb/features/i386/amd64-avx-mpx-avx512-pku.c
@@ -317,4 +317,7 @@ initialize_tdesc_amd64_avx_mpx_avx512_pku (void)
   tdesc_create_reg (feature, "pkru", 151, 1, NULL, 32, "uint32");
 
   tdesc_amd64_avx_mpx_avx512_pku = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("i386/amd64-avx-mpx-avx512-pku.xml", tdesc_amd64_avx_mpx_avx512_pku);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/i386/amd64-avx-mpx-linux.c b/gdb/features/i386/amd64-avx-mpx-linux.c
index 26c1339..59d6f98 100644
--- a/gdb/features/i386/amd64-avx-mpx-linux.c
+++ b/gdb/features/i386/amd64-avx-mpx-linux.c
@@ -212,4 +212,7 @@ initialize_tdesc_amd64_avx_mpx_linux (void)
   tdesc_create_reg (feature, "bndstatus", 81, 1, NULL, 64, "status");
 
   tdesc_amd64_avx_mpx_linux = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("i386/amd64-avx-mpx-linux.xml", tdesc_amd64_avx_mpx_linux);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/i386/amd64-avx-mpx.c b/gdb/features/i386/amd64-avx-mpx.c
index ab56f42..f744408 100644
--- a/gdb/features/i386/amd64-avx-mpx.c
+++ b/gdb/features/i386/amd64-avx-mpx.c
@@ -203,4 +203,7 @@ initialize_tdesc_amd64_avx_mpx (void)
   tdesc_create_reg (feature, "bndstatus", 78, 1, NULL, 64, "status");
 
   tdesc_amd64_avx_mpx = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("i386/amd64-avx-mpx.xml", tdesc_amd64_avx_mpx);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/i386/amd64-avx.c b/gdb/features/i386/amd64-avx.c
index 42bd69a..403b802 100644
--- a/gdb/features/i386/amd64-avx.c
+++ b/gdb/features/i386/amd64-avx.c
@@ -165,4 +165,7 @@ initialize_tdesc_amd64_avx (void)
   tdesc_create_reg (feature, "ymm15h", 72, 1, NULL, 128, "uint128");
 
   tdesc_amd64_avx = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("i386/amd64-avx.xml", tdesc_amd64_avx);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/i386/amd64-linux.c b/gdb/features/i386/amd64-linux.c
index 0e921ba9..8585838 100644
--- a/gdb/features/i386/amd64-linux.c
+++ b/gdb/features/i386/amd64-linux.c
@@ -156,4 +156,7 @@ initialize_tdesc_amd64_linux (void)
   tdesc_create_reg (feature, "gs_base", 59, 1, NULL, 64, "int");
 
   tdesc_amd64_linux = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("i386/amd64-linux.xml", tdesc_amd64_linux);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/i386/amd64-mpx-linux.c b/gdb/features/i386/amd64-mpx-linux.c
index e26a74a..8fb5150 100644
--- a/gdb/features/i386/amd64-mpx-linux.c
+++ b/gdb/features/i386/amd64-mpx-linux.c
@@ -194,4 +194,7 @@ initialize_tdesc_amd64_mpx_linux (void)
   tdesc_create_reg (feature, "bndstatus", 65, 1, NULL, 64, "status");
 
   tdesc_amd64_mpx_linux = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("i386/amd64-mpx-linux.xml", tdesc_amd64_mpx_linux);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/i386/amd64-mpx.c b/gdb/features/i386/amd64-mpx.c
index 41f0e78..ddce80e 100644
--- a/gdb/features/i386/amd64-mpx.c
+++ b/gdb/features/i386/amd64-mpx.c
@@ -185,4 +185,7 @@ initialize_tdesc_amd64_mpx (void)
   tdesc_create_reg (feature, "bndstatus", 62, 1, NULL, 64, "status");
 
   tdesc_amd64_mpx = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("i386/amd64-mpx.xml", tdesc_amd64_mpx);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/i386/amd64.c b/gdb/features/i386/amd64.c
index b875a9b..6def0df 100644
--- a/gdb/features/i386/amd64.c
+++ b/gdb/features/i386/amd64.c
@@ -147,4 +147,7 @@ initialize_tdesc_amd64 (void)
   tdesc_create_reg (feature, "mxcsr", 56, 1, "vector", 32, "i386_mxcsr");
 
   tdesc_amd64 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("i386/amd64.xml", tdesc_amd64);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/i386/i386-avx-avx512-linux.c b/gdb/features/i386/i386-avx-avx512-linux.c
index 81149d5..3ebe591 100644
--- a/gdb/features/i386/i386-avx-avx512-linux.c
+++ b/gdb/features/i386/i386-avx-avx512-linux.c
@@ -167,4 +167,7 @@ initialize_tdesc_i386_avx_avx512_linux (void)
   tdesc_create_reg (feature, "zmm7h", 65, 1, NULL, 256, "v2ui128");
 
   tdesc_i386_avx_avx512_linux = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("i386/i386-avx-avx512-linux.xml", tdesc_i386_avx_avx512_linux);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/i386/i386-avx-avx512.c b/gdb/features/i386/i386-avx-avx512.c
index 1075ca0..0932772 100644
--- a/gdb/features/i386/i386-avx-avx512.c
+++ b/gdb/features/i386/i386-avx-avx512.c
@@ -162,4 +162,7 @@ initialize_tdesc_i386_avx_avx512 (void)
   tdesc_create_reg (feature, "zmm7h", 64, 1, NULL, 256, "v2ui128");
 
   tdesc_i386_avx_avx512 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("i386/i386-avx-avx512.xml", tdesc_i386_avx_avx512);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/i386/i386-avx-linux.c b/gdb/features/i386/i386-avx-linux.c
index 4a8c6b5..4bcd36b 100644
--- a/gdb/features/i386/i386-avx-linux.c
+++ b/gdb/features/i386/i386-avx-linux.c
@@ -146,4 +146,7 @@ initialize_tdesc_i386_avx_linux (void)
   tdesc_create_reg (feature, "ymm7h", 49, 1, NULL, 128, "uint128");
 
   tdesc_i386_avx_linux = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("i386/i386-avx-linux.xml", tdesc_i386_avx_linux);
+#endif /* GDB_SELF_TEST */
 }
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..b083c2b 100644
--- a/gdb/features/i386/i386-avx-mpx-avx512-pku-linux.c
+++ b/gdb/features/i386/i386-avx-mpx-avx512-pku-linux.c
@@ -208,4 +208,7 @@ initialize_tdesc_i386_avx_mpx_avx512_pku_linux (void)
   tdesc_create_reg (feature, "pkru", 72, 1, NULL, 32, "uint32");
 
   tdesc_i386_avx_mpx_avx512_pku_linux = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("i386/i386-avx-mpx-avx512-pku-linux.xml", tdesc_i386_avx_mpx_avx512_pku_linux);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/i386/i386-avx-mpx-avx512-pku.c b/gdb/features/i386/i386-avx-mpx-avx512-pku.c
index 08d9b4b..790dd6d 100644
--- a/gdb/features/i386/i386-avx-mpx-avx512-pku.c
+++ b/gdb/features/i386/i386-avx-mpx-avx512-pku.c
@@ -203,4 +203,7 @@ initialize_tdesc_i386_avx_mpx_avx512_pku (void)
   tdesc_create_reg (feature, "pkru", 71, 1, NULL, 32, "uint32");
 
   tdesc_i386_avx_mpx_avx512_pku = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("i386/i386-avx-mpx-avx512-pku.xml", tdesc_i386_avx_mpx_avx512_pku);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/i386/i386-avx-mpx-linux.c b/gdb/features/i386/i386-avx-mpx-linux.c
index 4b27bfc..997e200 100644
--- a/gdb/features/i386/i386-avx-mpx-linux.c
+++ b/gdb/features/i386/i386-avx-mpx-linux.c
@@ -184,4 +184,7 @@ initialize_tdesc_i386_avx_mpx_linux (void)
   tdesc_create_reg (feature, "bndstatus", 55, 1, NULL, 64, "status");
 
   tdesc_i386_avx_mpx_linux = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("i386/i386-avx-mpx-linux.xml", tdesc_i386_avx_mpx_linux);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/i386/i386-avx-mpx.c b/gdb/features/i386/i386-avx-mpx.c
index b27b40a..86e7697 100644
--- a/gdb/features/i386/i386-avx-mpx.c
+++ b/gdb/features/i386/i386-avx-mpx.c
@@ -179,4 +179,7 @@ initialize_tdesc_i386_avx_mpx (void)
   tdesc_create_reg (feature, "bndstatus", 54, 1, NULL, 64, "status");
 
   tdesc_i386_avx_mpx = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("i386/i386-avx-mpx.xml", tdesc_i386_avx_mpx);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/i386/i386-avx.c b/gdb/features/i386/i386-avx.c
index 1cb0f9e..4dc74cf 100644
--- a/gdb/features/i386/i386-avx.c
+++ b/gdb/features/i386/i386-avx.c
@@ -141,4 +141,7 @@ initialize_tdesc_i386_avx (void)
   tdesc_create_reg (feature, "ymm7h", 48, 1, NULL, 128, "uint128");
 
   tdesc_i386_avx = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("i386/i386-avx.xml", tdesc_i386_avx);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/i386/i386-linux.c b/gdb/features/i386/i386-linux.c
index 42c406b..39328af 100644
--- a/gdb/features/i386/i386-linux.c
+++ b/gdb/features/i386/i386-linux.c
@@ -136,4 +136,7 @@ initialize_tdesc_i386_linux (void)
   tdesc_create_reg (feature, "mxcsr", 40, 1, "vector", 32, "i386_mxcsr");
 
   tdesc_i386_linux = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("i386/i386-linux.xml", tdesc_i386_linux);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/i386/i386-mmx-linux.c b/gdb/features/i386/i386-mmx-linux.c
index e53b55f..415e7cc 100644
--- a/gdb/features/i386/i386-mmx-linux.c
+++ b/gdb/features/i386/i386-mmx-linux.c
@@ -75,4 +75,7 @@ initialize_tdesc_i386_mmx_linux (void)
   tdesc_create_reg (feature, "orig_eax", 41, 1, NULL, 32, "int");
 
   tdesc_i386_mmx_linux = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("i386/i386-mmx-linux.xml", tdesc_i386_mmx_linux);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/i386/i386-mmx.c b/gdb/features/i386/i386-mmx.c
index 74f67ed..604e114 100644
--- a/gdb/features/i386/i386-mmx.c
+++ b/gdb/features/i386/i386-mmx.c
@@ -70,4 +70,7 @@ initialize_tdesc_i386_mmx (void)
   tdesc_create_reg (feature, "fop", 31, 1, "float", 32, "int");
 
   tdesc_i386_mmx = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("i386/i386-mmx.xml", tdesc_i386_mmx);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/i386/i386-mpx-linux.c b/gdb/features/i386/i386-mpx-linux.c
index 43ea192..778568e 100644
--- a/gdb/features/i386/i386-mpx-linux.c
+++ b/gdb/features/i386/i386-mpx-linux.c
@@ -174,4 +174,7 @@ initialize_tdesc_i386_mpx_linux (void)
   tdesc_create_reg (feature, "bndstatus", 47, 1, NULL, 64, "status");
 
   tdesc_i386_mpx_linux = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("i386/i386-mpx-linux.xml", tdesc_i386_mpx_linux);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/i386/i386-mpx.c b/gdb/features/i386/i386-mpx.c
index e832d2e..969422e 100644
--- a/gdb/features/i386/i386-mpx.c
+++ b/gdb/features/i386/i386-mpx.c
@@ -169,4 +169,7 @@ initialize_tdesc_i386_mpx (void)
   tdesc_create_reg (feature, "bndstatus", 46, 1, NULL, 64, "status");
 
   tdesc_i386_mpx = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("i386/i386-mpx.xml", tdesc_i386_mpx);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/i386/i386.c b/gdb/features/i386/i386.c
index ede73fc..31fc3b6 100644
--- a/gdb/features/i386/i386.c
+++ b/gdb/features/i386/i386.c
@@ -131,4 +131,7 @@ initialize_tdesc_i386 (void)
   tdesc_create_reg (feature, "mxcsr", 40, 1, "vector", 32, "i386_mxcsr");
 
   tdesc_i386 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("i386/i386.xml", tdesc_i386);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/i386/x32-avx-avx512-linux.c b/gdb/features/i386/x32-avx-avx512-linux.c
index 0467d87..579566f 100644
--- a/gdb/features/i386/x32-avx-avx512-linux.c
+++ b/gdb/features/i386/x32-avx-avx512-linux.c
@@ -285,4 +285,7 @@ initialize_tdesc_x32_avx_avx512_linux (void)
   tdesc_create_reg (feature, "zmm31h", 147, 1, NULL, 256, "v2ui128");
 
   tdesc_x32_avx_avx512_linux = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("i386/x32-avx-avx512-linux.xml", tdesc_x32_avx_avx512_linux);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/i386/x32-avx-avx512.c b/gdb/features/i386/x32-avx-avx512.c
index a7a2d52..18ede9b 100644
--- a/gdb/features/i386/x32-avx-avx512.c
+++ b/gdb/features/i386/x32-avx-avx512.c
@@ -276,4 +276,7 @@ initialize_tdesc_x32_avx_avx512 (void)
   tdesc_create_reg (feature, "zmm31h", 144, 1, NULL, 256, "v2ui128");
 
   tdesc_x32_avx_avx512 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("i386/x32-avx-avx512.xml", tdesc_x32_avx_avx512);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/i386/x32-avx-linux.c b/gdb/features/i386/x32-avx-linux.c
index 8406815..d5ca2f1 100644
--- a/gdb/features/i386/x32-avx-linux.c
+++ b/gdb/features/i386/x32-avx-linux.c
@@ -174,4 +174,7 @@ initialize_tdesc_x32_avx_linux (void)
   tdesc_create_reg (feature, "ymm15h", 75, 1, NULL, 128, "uint128");
 
   tdesc_x32_avx_linux = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("i386/x32-avx-linux.xml", tdesc_x32_avx_linux);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/i386/x32-avx.c b/gdb/features/i386/x32-avx.c
index 7f62e8f..5800f11 100644
--- a/gdb/features/i386/x32-avx.c
+++ b/gdb/features/i386/x32-avx.c
@@ -165,4 +165,7 @@ initialize_tdesc_x32_avx (void)
   tdesc_create_reg (feature, "ymm15h", 72, 1, NULL, 128, "uint128");
 
   tdesc_x32_avx = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("i386/x32-avx.xml", tdesc_x32_avx);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/i386/x32-linux.c b/gdb/features/i386/x32-linux.c
index ae49549..6485e0c 100644
--- a/gdb/features/i386/x32-linux.c
+++ b/gdb/features/i386/x32-linux.c
@@ -156,4 +156,7 @@ initialize_tdesc_x32_linux (void)
   tdesc_create_reg (feature, "gs_base", 59, 1, NULL, 64, "int");
 
   tdesc_x32_linux = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("i386/x32-linux.xml", tdesc_x32_linux);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/i386/x32.c b/gdb/features/i386/x32.c
index 6005d99..18d4a1f 100644
--- a/gdb/features/i386/x32.c
+++ b/gdb/features/i386/x32.c
@@ -147,4 +147,7 @@ initialize_tdesc_x32 (void)
   tdesc_create_reg (feature, "mxcsr", 56, 1, "vector", 32, "i386_mxcsr");
 
   tdesc_x32 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("i386/x32.xml", tdesc_x32);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/microblaze-with-stack-protect.c b/gdb/features/microblaze-with-stack-protect.c
index b39aa19..67588f5 100644
--- a/gdb/features/microblaze-with-stack-protect.c
+++ b/gdb/features/microblaze-with-stack-protect.c
@@ -76,4 +76,7 @@ initialize_tdesc_microblaze_with_stack_protect (void)
   tdesc_create_reg (feature, "rshr", 58, 1, NULL, 32, "int");
 
   tdesc_microblaze_with_stack_protect = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("microblaze-with-stack-protect.xml", tdesc_microblaze_with_stack_protect);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/microblaze.c b/gdb/features/microblaze.c
index 6c86fc0..53a1e14 100644
--- a/gdb/features/microblaze.c
+++ b/gdb/features/microblaze.c
@@ -72,4 +72,7 @@ initialize_tdesc_microblaze (void)
   tdesc_create_reg (feature, "rtlbhi", 56, 1, NULL, 32, "int");
 
   tdesc_microblaze = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("microblaze.xml", tdesc_microblaze);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/mips-dsp-linux.c b/gdb/features/mips-dsp-linux.c
index 80ceb22..6d6ab7b 100644
--- a/gdb/features/mips-dsp-linux.c
+++ b/gdb/features/mips-dsp-linux.c
@@ -107,4 +107,7 @@ initialize_tdesc_mips_dsp_linux (void)
   tdesc_create_reg (feature, "restart", 79, 1, "system", 32, "int");
 
   tdesc_mips_dsp_linux = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("mips-dsp-linux.xml", tdesc_mips_dsp_linux);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/mips-linux.c b/gdb/features/mips-linux.c
index c990119..31e63ec 100644
--- a/gdb/features/mips-linux.c
+++ b/gdb/features/mips-linux.c
@@ -98,4 +98,7 @@ initialize_tdesc_mips_linux (void)
   tdesc_create_reg (feature, "restart", 72, 1, "system", 32, "int");
 
   tdesc_mips_linux = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("mips-linux.xml", tdesc_mips_linux);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/mips64-dsp-linux.c b/gdb/features/mips64-dsp-linux.c
index bc09078..1c3310d 100644
--- a/gdb/features/mips64-dsp-linux.c
+++ b/gdb/features/mips64-dsp-linux.c
@@ -105,4 +105,7 @@ initialize_tdesc_mips64_dsp_linux (void)
   tdesc_create_reg (feature, "restart", 79, 1, "system", 64, "int");
 
   tdesc_mips64_dsp_linux = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("mips64-dsp-linux.xml", tdesc_mips64_dsp_linux);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/mips64-linux.c b/gdb/features/mips64-linux.c
index 2ecda9b..bd897ee 100644
--- a/gdb/features/mips64-linux.c
+++ b/gdb/features/mips64-linux.c
@@ -96,4 +96,7 @@ initialize_tdesc_mips64_linux (void)
   tdesc_create_reg (feature, "restart", 72, 1, "system", 64, "int");
 
   tdesc_mips64_linux = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("mips64-linux.xml", tdesc_mips64_linux);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/nds32.c b/gdb/features/nds32.c
index 21f63f5..9fecfc7 100644
--- a/gdb/features/nds32.c
+++ b/gdb/features/nds32.c
@@ -89,4 +89,7 @@ initialize_tdesc_nds32 (void)
   tdesc_create_reg (feature, "ifc_lp", 67, 1, NULL, 32, "int");
 
   tdesc_nds32 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("nds32.xml", tdesc_nds32);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/nios2-linux.c b/gdb/features/nios2-linux.c
index 3288f79..b585b4e 100644
--- a/gdb/features/nios2-linux.c
+++ b/gdb/features/nios2-linux.c
@@ -68,4 +68,7 @@ initialize_tdesc_nios2_linux (void)
   tdesc_create_reg (feature, "mpuacc", 48, 1, NULL, 32, "uint32");
 
   tdesc_nios2_linux = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("nios2-linux.xml", tdesc_nios2_linux);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/nios2.c b/gdb/features/nios2.c
index 0cedc12..9536850 100644
--- a/gdb/features/nios2.c
+++ b/gdb/features/nios2.c
@@ -66,4 +66,7 @@ initialize_tdesc_nios2 (void)
   tdesc_create_reg (feature, "mpuacc", 48, 1, NULL, 32, "uint32");
 
   tdesc_nios2 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("nios2.xml", tdesc_nios2);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/rs6000/powerpc-32.c b/gdb/features/rs6000/powerpc-32.c
index 5ee5d9c..ae6e946 100644
--- a/gdb/features/rs6000/powerpc-32.c
+++ b/gdb/features/rs6000/powerpc-32.c
@@ -90,4 +90,7 @@ initialize_tdesc_powerpc_32 (void)
   tdesc_create_reg (feature, "fpscr", 70, 1, "float", 32, "int");
 
   tdesc_powerpc_32 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("rs6000/powerpc-32.xml", tdesc_powerpc_32);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/rs6000/powerpc-32l.c b/gdb/features/rs6000/powerpc-32l.c
index 971fd4b..f7478a4 100644
--- a/gdb/features/rs6000/powerpc-32l.c
+++ b/gdb/features/rs6000/powerpc-32l.c
@@ -94,4 +94,7 @@ initialize_tdesc_powerpc_32l (void)
   tdesc_create_reg (feature, "trap", 72, 1, NULL, 32, "int");
 
   tdesc_powerpc_32l = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("rs6000/powerpc-32l.xml", tdesc_powerpc_32l);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/rs6000/powerpc-403.c b/gdb/features/rs6000/powerpc-403.c
index a9106f5..50df451 100644
--- a/gdb/features/rs6000/powerpc-403.c
+++ b/gdb/features/rs6000/powerpc-403.c
@@ -164,4 +164,7 @@ initialize_tdesc_powerpc_403 (void)
   tdesc_create_reg (feature, "pbu2", 142, 1, NULL, 32, "int");
 
   tdesc_powerpc_403 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("rs6000/powerpc-403.xml", tdesc_powerpc_403);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/rs6000/powerpc-403gc.c b/gdb/features/rs6000/powerpc-403gc.c
index 402b747..b63da57 100644
--- a/gdb/features/rs6000/powerpc-403gc.c
+++ b/gdb/features/rs6000/powerpc-403gc.c
@@ -170,4 +170,7 @@ initialize_tdesc_powerpc_403gc (void)
   tdesc_create_reg (feature, "tblu", 148, 1, NULL, 32, "int");
 
   tdesc_powerpc_403gc = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("rs6000/powerpc-403gc.xml", tdesc_powerpc_403gc);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/rs6000/powerpc-405.c b/gdb/features/rs6000/powerpc-405.c
index bcfa144..d647b3a 100644
--- a/gdb/features/rs6000/powerpc-405.c
+++ b/gdb/features/rs6000/powerpc-405.c
@@ -133,4 +133,7 @@ initialize_tdesc_powerpc_405 (void)
   tdesc_create_reg (feature, "usprg0", 161, 1, NULL, 32, "int");
 
   tdesc_powerpc_405 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("rs6000/powerpc-405.xml", tdesc_powerpc_405);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/rs6000/powerpc-505.c b/gdb/features/rs6000/powerpc-505.c
index 09b0c7a..c85bca2 100644
--- a/gdb/features/rs6000/powerpc-505.c
+++ b/gdb/features/rs6000/powerpc-505.c
@@ -143,4 +143,7 @@ initialize_tdesc_powerpc_505 (void)
   tdesc_create_reg (feature, "nri", 121, 1, NULL, 32, "int");
 
   tdesc_powerpc_505 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("rs6000/powerpc-505.xml", tdesc_powerpc_505);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/rs6000/powerpc-601.c b/gdb/features/rs6000/powerpc-601.c
index f30f5e6..77a294b 100644
--- a/gdb/features/rs6000/powerpc-601.c
+++ b/gdb/features/rs6000/powerpc-601.c
@@ -147,4 +147,7 @@ initialize_tdesc_powerpc_601 (void)
   tdesc_create_reg (feature, "rtcl", 126, 1, NULL, 32, "int");
 
   tdesc_powerpc_601 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("rs6000/powerpc-601.xml", tdesc_powerpc_601);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/rs6000/powerpc-602.c b/gdb/features/rs6000/powerpc-602.c
index 7696717..73c3529 100644
--- a/gdb/features/rs6000/powerpc-602.c
+++ b/gdb/features/rs6000/powerpc-602.c
@@ -150,4 +150,7 @@ initialize_tdesc_powerpc_602 (void)
   tdesc_create_reg (feature, "lt", 130, 1, NULL, 32, "int");
 
   tdesc_powerpc_602 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("rs6000/powerpc-602.xml", tdesc_powerpc_602);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/rs6000/powerpc-603.c b/gdb/features/rs6000/powerpc-603.c
index d5dae39..ce28f9e 100644
--- a/gdb/features/rs6000/powerpc-603.c
+++ b/gdb/features/rs6000/powerpc-603.c
@@ -150,4 +150,7 @@ initialize_tdesc_powerpc_603 (void)
   tdesc_create_reg (feature, "rpa", 130, 1, NULL, 32, "int");
 
   tdesc_powerpc_603 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("rs6000/powerpc-603.xml", tdesc_powerpc_603);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/rs6000/powerpc-604.c b/gdb/features/rs6000/powerpc-604.c
index 44dc8ca..36a77bc 100644
--- a/gdb/features/rs6000/powerpc-604.c
+++ b/gdb/features/rs6000/powerpc-604.c
@@ -150,4 +150,7 @@ initialize_tdesc_powerpc_604 (void)
   tdesc_create_reg (feature, "sda", 128, 1, NULL, 32, "int");
 
   tdesc_powerpc_604 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("rs6000/powerpc-604.xml", tdesc_powerpc_604);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/rs6000/powerpc-64.c b/gdb/features/rs6000/powerpc-64.c
index 160d122..68016c7 100644
--- a/gdb/features/rs6000/powerpc-64.c
+++ b/gdb/features/rs6000/powerpc-64.c
@@ -90,4 +90,7 @@ initialize_tdesc_powerpc_64 (void)
   tdesc_create_reg (feature, "fpscr", 70, 1, "float", 32, "int");
 
   tdesc_powerpc_64 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("rs6000/powerpc-64.xml", tdesc_powerpc_64);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/rs6000/powerpc-64l.c b/gdb/features/rs6000/powerpc-64l.c
index 16a766e..8f911af 100644
--- a/gdb/features/rs6000/powerpc-64l.c
+++ b/gdb/features/rs6000/powerpc-64l.c
@@ -94,4 +94,7 @@ initialize_tdesc_powerpc_64l (void)
   tdesc_create_reg (feature, "trap", 72, 1, NULL, 64, "int");
 
   tdesc_powerpc_64l = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("rs6000/powerpc-64l.xml", tdesc_powerpc_64l);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/rs6000/powerpc-7400.c b/gdb/features/rs6000/powerpc-7400.c
index 69d20c4..17a670a 100644
--- a/gdb/features/rs6000/powerpc-7400.c
+++ b/gdb/features/rs6000/powerpc-7400.c
@@ -200,4 +200,7 @@ initialize_tdesc_powerpc_7400 (void)
   tdesc_create_reg (feature, "vrsave", 152, 1, "vector", 32, "int");
 
   tdesc_powerpc_7400 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("rs6000/powerpc-7400.xml", tdesc_powerpc_7400);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/rs6000/powerpc-750.c b/gdb/features/rs6000/powerpc-750.c
index 099a478..7c04e14 100644
--- a/gdb/features/rs6000/powerpc-750.c
+++ b/gdb/features/rs6000/powerpc-750.c
@@ -163,4 +163,7 @@ initialize_tdesc_powerpc_750 (void)
   tdesc_create_reg (feature, "thrm3", 142, 1, NULL, 32, "int");
 
   tdesc_powerpc_750 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("rs6000/powerpc-750.xml", tdesc_powerpc_750);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/rs6000/powerpc-860.c b/gdb/features/rs6000/powerpc-860.c
index 0692feb..68b72d4 100644
--- a/gdb/features/rs6000/powerpc-860.c
+++ b/gdb/features/rs6000/powerpc-860.c
@@ -187,4 +187,7 @@ initialize_tdesc_powerpc_860 (void)
   tdesc_create_reg (feature, "md_dbram1", 165, 1, NULL, 32, "int");
 
   tdesc_powerpc_860 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("rs6000/powerpc-860.xml", tdesc_powerpc_860);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/rs6000/powerpc-altivec32.c b/gdb/features/rs6000/powerpc-altivec32.c
index 285e87d..aa302ea 100644
--- a/gdb/features/rs6000/powerpc-altivec32.c
+++ b/gdb/features/rs6000/powerpc-altivec32.c
@@ -152,4 +152,7 @@ initialize_tdesc_powerpc_altivec32 (void)
   tdesc_create_reg (feature, "vrsave", 104, 1, "vector", 32, "int");
 
   tdesc_powerpc_altivec32 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("rs6000/powerpc-altivec32.xml", tdesc_powerpc_altivec32);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/rs6000/powerpc-altivec32l.c b/gdb/features/rs6000/powerpc-altivec32l.c
index 447ed47..1e7ed1b 100644
--- a/gdb/features/rs6000/powerpc-altivec32l.c
+++ b/gdb/features/rs6000/powerpc-altivec32l.c
@@ -156,4 +156,7 @@ initialize_tdesc_powerpc_altivec32l (void)
   tdesc_create_reg (feature, "vrsave", 106, 1, "vector", 32, "int");
 
   tdesc_powerpc_altivec32l = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("rs6000/powerpc-altivec32l.xml", tdesc_powerpc_altivec32l);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/rs6000/powerpc-altivec64.c b/gdb/features/rs6000/powerpc-altivec64.c
index 1e9a61d..2e61480 100644
--- a/gdb/features/rs6000/powerpc-altivec64.c
+++ b/gdb/features/rs6000/powerpc-altivec64.c
@@ -152,4 +152,7 @@ initialize_tdesc_powerpc_altivec64 (void)
   tdesc_create_reg (feature, "vrsave", 104, 1, "vector", 32, "int");
 
   tdesc_powerpc_altivec64 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("rs6000/powerpc-altivec64.xml", tdesc_powerpc_altivec64);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/rs6000/powerpc-altivec64l.c b/gdb/features/rs6000/powerpc-altivec64l.c
index 10ecd8a..bfd9b57 100644
--- a/gdb/features/rs6000/powerpc-altivec64l.c
+++ b/gdb/features/rs6000/powerpc-altivec64l.c
@@ -156,4 +156,7 @@ initialize_tdesc_powerpc_altivec64l (void)
   tdesc_create_reg (feature, "vrsave", 106, 1, "vector", 32, "int");
 
   tdesc_powerpc_altivec64l = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("rs6000/powerpc-altivec64l.xml", tdesc_powerpc_altivec64l);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/rs6000/powerpc-cell32l.c b/gdb/features/rs6000/powerpc-cell32l.c
index 7d33dc2..dd483b0 100644
--- a/gdb/features/rs6000/powerpc-cell32l.c
+++ b/gdb/features/rs6000/powerpc-cell32l.c
@@ -158,4 +158,7 @@ initialize_tdesc_powerpc_cell32l (void)
   tdesc_create_reg (feature, "vrsave", 106, 1, "vector", 32, "int");
 
   tdesc_powerpc_cell32l = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("rs6000/powerpc-cell32l.xml", tdesc_powerpc_cell32l);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/rs6000/powerpc-cell64l.c b/gdb/features/rs6000/powerpc-cell64l.c
index 6054c26..6e763f2 100644
--- a/gdb/features/rs6000/powerpc-cell64l.c
+++ b/gdb/features/rs6000/powerpc-cell64l.c
@@ -158,4 +158,7 @@ initialize_tdesc_powerpc_cell64l (void)
   tdesc_create_reg (feature, "vrsave", 106, 1, "vector", 32, "int");
 
   tdesc_powerpc_cell64l = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("rs6000/powerpc-cell64l.xml", tdesc_powerpc_cell64l);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/rs6000/powerpc-e500.c b/gdb/features/rs6000/powerpc-e500.c
index aaca3a7..27570bb 100644
--- a/gdb/features/rs6000/powerpc-e500.c
+++ b/gdb/features/rs6000/powerpc-e500.c
@@ -91,4 +91,7 @@ initialize_tdesc_powerpc_e500 (void)
   tdesc_create_reg (feature, "spefscr", 74, 1, NULL, 32, "int");
 
   tdesc_powerpc_e500 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("rs6000/powerpc-e500.xml", tdesc_powerpc_e500);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/rs6000/powerpc-e500l.c b/gdb/features/rs6000/powerpc-e500l.c
index de03862..3f753c8 100644
--- a/gdb/features/rs6000/powerpc-e500l.c
+++ b/gdb/features/rs6000/powerpc-e500l.c
@@ -95,4 +95,7 @@ initialize_tdesc_powerpc_e500l (void)
   tdesc_create_reg (feature, "trap", 72, 1, NULL, 32, "int");
 
   tdesc_powerpc_e500l = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("rs6000/powerpc-e500l.xml", tdesc_powerpc_e500l);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/rs6000/powerpc-isa205-32l.c b/gdb/features/rs6000/powerpc-isa205-32l.c
index 1b5bd6d..37e1179 100644
--- a/gdb/features/rs6000/powerpc-isa205-32l.c
+++ b/gdb/features/rs6000/powerpc-isa205-32l.c
@@ -94,4 +94,7 @@ initialize_tdesc_powerpc_isa205_32l (void)
   tdesc_create_reg (feature, "trap", 72, 1, NULL, 32, "int");
 
   tdesc_powerpc_isa205_32l = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("rs6000/powerpc-isa205-32l.xml", tdesc_powerpc_isa205_32l);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/rs6000/powerpc-isa205-64l.c b/gdb/features/rs6000/powerpc-isa205-64l.c
index 31bfc87..b0bbd3d 100644
--- a/gdb/features/rs6000/powerpc-isa205-64l.c
+++ b/gdb/features/rs6000/powerpc-isa205-64l.c
@@ -94,4 +94,7 @@ initialize_tdesc_powerpc_isa205_64l (void)
   tdesc_create_reg (feature, "trap", 72, 1, NULL, 64, "int");
 
   tdesc_powerpc_isa205_64l = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("rs6000/powerpc-isa205-64l.xml", tdesc_powerpc_isa205_64l);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/rs6000/powerpc-isa205-altivec32l.c b/gdb/features/rs6000/powerpc-isa205-altivec32l.c
index 6c216ce..e162982 100644
--- a/gdb/features/rs6000/powerpc-isa205-altivec32l.c
+++ b/gdb/features/rs6000/powerpc-isa205-altivec32l.c
@@ -156,4 +156,7 @@ initialize_tdesc_powerpc_isa205_altivec32l (void)
   tdesc_create_reg (feature, "vrsave", 106, 1, "vector", 32, "int");
 
   tdesc_powerpc_isa205_altivec32l = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("rs6000/powerpc-isa205-altivec32l.xml", tdesc_powerpc_isa205_altivec32l);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/rs6000/powerpc-isa205-altivec64l.c b/gdb/features/rs6000/powerpc-isa205-altivec64l.c
index 2c206aa..93850fb 100644
--- a/gdb/features/rs6000/powerpc-isa205-altivec64l.c
+++ b/gdb/features/rs6000/powerpc-isa205-altivec64l.c
@@ -156,4 +156,7 @@ initialize_tdesc_powerpc_isa205_altivec64l (void)
   tdesc_create_reg (feature, "vrsave", 106, 1, "vector", 32, "int");
 
   tdesc_powerpc_isa205_altivec64l = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("rs6000/powerpc-isa205-altivec64l.xml", tdesc_powerpc_isa205_altivec64l);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/rs6000/powerpc-isa205-vsx32l.c b/gdb/features/rs6000/powerpc-isa205-vsx32l.c
index 4659ce1..05ef8c2 100644
--- a/gdb/features/rs6000/powerpc-isa205-vsx32l.c
+++ b/gdb/features/rs6000/powerpc-isa205-vsx32l.c
@@ -190,4 +190,7 @@ initialize_tdesc_powerpc_isa205_vsx32l (void)
   tdesc_create_reg (feature, "vs31h", 138, 1, NULL, 64, "uint64");
 
   tdesc_powerpc_isa205_vsx32l = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("rs6000/powerpc-isa205-vsx32l.xml", tdesc_powerpc_isa205_vsx32l);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/rs6000/powerpc-isa205-vsx64l.c b/gdb/features/rs6000/powerpc-isa205-vsx64l.c
index 64b12b9..f6a94c4 100644
--- a/gdb/features/rs6000/powerpc-isa205-vsx64l.c
+++ b/gdb/features/rs6000/powerpc-isa205-vsx64l.c
@@ -190,4 +190,7 @@ initialize_tdesc_powerpc_isa205_vsx64l (void)
   tdesc_create_reg (feature, "vs31h", 138, 1, NULL, 64, "uint64");
 
   tdesc_powerpc_isa205_vsx64l = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("rs6000/powerpc-isa205-vsx64l.xml", tdesc_powerpc_isa205_vsx64l);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/rs6000/powerpc-vsx32.c b/gdb/features/rs6000/powerpc-vsx32.c
index ba1fcb6..1a17e04 100644
--- a/gdb/features/rs6000/powerpc-vsx32.c
+++ b/gdb/features/rs6000/powerpc-vsx32.c
@@ -186,4 +186,7 @@ initialize_tdesc_powerpc_vsx32 (void)
   tdesc_create_reg (feature, "vs31h", 136, 1, NULL, 64, "uint64");
 
   tdesc_powerpc_vsx32 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("rs6000/powerpc-vsx32.xml", tdesc_powerpc_vsx32);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/rs6000/powerpc-vsx32l.c b/gdb/features/rs6000/powerpc-vsx32l.c
index 013e392..27b47ad 100644
--- a/gdb/features/rs6000/powerpc-vsx32l.c
+++ b/gdb/features/rs6000/powerpc-vsx32l.c
@@ -190,4 +190,7 @@ initialize_tdesc_powerpc_vsx32l (void)
   tdesc_create_reg (feature, "vs31h", 138, 1, NULL, 64, "uint64");
 
   tdesc_powerpc_vsx32l = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("rs6000/powerpc-vsx32l.xml", tdesc_powerpc_vsx32l);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/rs6000/powerpc-vsx64.c b/gdb/features/rs6000/powerpc-vsx64.c
index ca02323..9bbe42e 100644
--- a/gdb/features/rs6000/powerpc-vsx64.c
+++ b/gdb/features/rs6000/powerpc-vsx64.c
@@ -186,4 +186,7 @@ initialize_tdesc_powerpc_vsx64 (void)
   tdesc_create_reg (feature, "vs31h", 136, 1, NULL, 64, "uint64");
 
   tdesc_powerpc_vsx64 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("rs6000/powerpc-vsx64.xml", tdesc_powerpc_vsx64);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/rs6000/powerpc-vsx64l.c b/gdb/features/rs6000/powerpc-vsx64l.c
index 31bb224..9df1bdb 100644
--- a/gdb/features/rs6000/powerpc-vsx64l.c
+++ b/gdb/features/rs6000/powerpc-vsx64l.c
@@ -190,4 +190,7 @@ initialize_tdesc_powerpc_vsx64l (void)
   tdesc_create_reg (feature, "vs31h", 138, 1, NULL, 64, "uint64");
 
   tdesc_powerpc_vsx64l = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("rs6000/powerpc-vsx64l.xml", tdesc_powerpc_vsx64l);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/rs6000/rs6000.c b/gdb/features/rs6000/rs6000.c
index d4e93a5..0bde256 100644
--- a/gdb/features/rs6000/rs6000.c
+++ b/gdb/features/rs6000/rs6000.c
@@ -91,4 +91,7 @@ initialize_tdesc_rs6000 (void)
   tdesc_create_reg (feature, "fpscr", 71, 1, "float", 32, "int");
 
   tdesc_rs6000 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("rs6000/rs6000.xml", tdesc_rs6000);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/s390-linux32.c b/gdb/features/s390-linux32.c
index 6d13094..c7be0ce 100644
--- a/gdb/features/s390-linux32.c
+++ b/gdb/features/s390-linux32.c
@@ -75,4 +75,7 @@ initialize_tdesc_s390_linux32 (void)
   tdesc_create_reg (feature, "orig_r2", 51, 1, "system", 32, "uint32");
 
   tdesc_s390_linux32 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("s390-linux32.xml", tdesc_s390_linux32);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/s390-linux32v1.c b/gdb/features/s390-linux32v1.c
index f773fc1..f9bc149 100644
--- a/gdb/features/s390-linux32v1.c
+++ b/gdb/features/s390-linux32v1.c
@@ -76,4 +76,7 @@ initialize_tdesc_s390_linux32v1 (void)
   tdesc_create_reg (feature, "last_break", 52, 0, "system", 32, "code_ptr");
 
   tdesc_s390_linux32v1 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("s390-linux32v1.xml", tdesc_s390_linux32v1);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/s390-linux32v2.c b/gdb/features/s390-linux32v2.c
index 2317752..cf5a94a 100644
--- a/gdb/features/s390-linux32v2.c
+++ b/gdb/features/s390-linux32v2.c
@@ -77,4 +77,7 @@ initialize_tdesc_s390_linux32v2 (void)
   tdesc_create_reg (feature, "system_call", 53, 1, "system", 32, "uint32");
 
   tdesc_s390_linux32v2 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("s390-linux32v2.xml", tdesc_s390_linux32v2);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/s390-linux64.c b/gdb/features/s390-linux64.c
index 3c7145b..663e6db 100644
--- a/gdb/features/s390-linux64.c
+++ b/gdb/features/s390-linux64.c
@@ -91,4 +91,7 @@ initialize_tdesc_s390_linux64 (void)
   tdesc_create_reg (feature, "orig_r2", 67, 1, "system", 32, "uint32");
 
   tdesc_s390_linux64 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("s390-linux64.xml", tdesc_s390_linux64);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/s390-linux64v1.c b/gdb/features/s390-linux64v1.c
index 72bd894..26bac20 100644
--- a/gdb/features/s390-linux64v1.c
+++ b/gdb/features/s390-linux64v1.c
@@ -92,4 +92,7 @@ initialize_tdesc_s390_linux64v1 (void)
   tdesc_create_reg (feature, "last_break", 68, 0, "system", 32, "code_ptr");
 
   tdesc_s390_linux64v1 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("s390-linux64v1.xml", tdesc_s390_linux64v1);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/s390-linux64v2.c b/gdb/features/s390-linux64v2.c
index a1757da..c375644 100644
--- a/gdb/features/s390-linux64v2.c
+++ b/gdb/features/s390-linux64v2.c
@@ -93,4 +93,7 @@ initialize_tdesc_s390_linux64v2 (void)
   tdesc_create_reg (feature, "system_call", 69, 1, "system", 32, "uint32");
 
   tdesc_s390_linux64v2 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("s390-linux64v2.xml", tdesc_s390_linux64v2);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/s390-te-linux64.c b/gdb/features/s390-te-linux64.c
index 0a3aedf..c5e6e53 100644
--- a/gdb/features/s390-te-linux64.c
+++ b/gdb/features/s390-te-linux64.c
@@ -115,4 +115,7 @@ initialize_tdesc_s390_te_linux64 (void)
   tdesc_create_reg (feature, "tr15", 89, 1, "tdb", 64, "uint64");
 
   tdesc_s390_te_linux64 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("s390-te-linux64.xml", tdesc_s390_te_linux64);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/s390-tevx-linux64.c b/gdb/features/s390-tevx-linux64.c
index 5bc3eec..7d8fc5f 100644
--- a/gdb/features/s390-tevx-linux64.c
+++ b/gdb/features/s390-tevx-linux64.c
@@ -185,4 +185,7 @@ initialize_tdesc_s390_tevx_linux64 (void)
   tdesc_create_reg (feature, "v31", 121, 1, NULL, 128, "vec128");
 
   tdesc_s390_tevx_linux64 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("s390-tevx-linux64.xml", tdesc_s390_tevx_linux64);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/s390-vx-linux64.c b/gdb/features/s390-vx-linux64.c
index c3ffa16..c1d64aa 100644
--- a/gdb/features/s390-vx-linux64.c
+++ b/gdb/features/s390-vx-linux64.c
@@ -163,4 +163,7 @@ initialize_tdesc_s390_vx_linux64 (void)
   tdesc_create_reg (feature, "v31", 101, 1, NULL, 128, "vec128");
 
   tdesc_s390_vx_linux64 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("s390-vx-linux64.xml", tdesc_s390_vx_linux64);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/s390x-linux64.c b/gdb/features/s390x-linux64.c
index 04502c6..4bede5e 100644
--- a/gdb/features/s390x-linux64.c
+++ b/gdb/features/s390x-linux64.c
@@ -75,4 +75,7 @@ initialize_tdesc_s390x_linux64 (void)
   tdesc_create_reg (feature, "orig_r2", 51, 1, "system", 64, "uint64");
 
   tdesc_s390x_linux64 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("s390x-linux64.xml", tdesc_s390x_linux64);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/s390x-linux64v1.c b/gdb/features/s390x-linux64v1.c
index 05bfd53..353655f 100644
--- a/gdb/features/s390x-linux64v1.c
+++ b/gdb/features/s390x-linux64v1.c
@@ -76,4 +76,7 @@ initialize_tdesc_s390x_linux64v1 (void)
   tdesc_create_reg (feature, "last_break", 52, 0, "system", 64, "code_ptr");
 
   tdesc_s390x_linux64v1 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("s390x-linux64v1.xml", tdesc_s390x_linux64v1);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/s390x-linux64v2.c b/gdb/features/s390x-linux64v2.c
index 4108cc0..e1edb51 100644
--- a/gdb/features/s390x-linux64v2.c
+++ b/gdb/features/s390x-linux64v2.c
@@ -77,4 +77,7 @@ initialize_tdesc_s390x_linux64v2 (void)
   tdesc_create_reg (feature, "system_call", 53, 1, "system", 32, "uint32");
 
   tdesc_s390x_linux64v2 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("s390x-linux64v2.xml", tdesc_s390x_linux64v2);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/s390x-te-linux64.c b/gdb/features/s390x-te-linux64.c
index f75d900..3dee7c2 100644
--- a/gdb/features/s390x-te-linux64.c
+++ b/gdb/features/s390x-te-linux64.c
@@ -99,4 +99,7 @@ initialize_tdesc_s390x_te_linux64 (void)
   tdesc_create_reg (feature, "tr15", 73, 1, "tdb", 64, "uint64");
 
   tdesc_s390x_te_linux64 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("s390x-te-linux64.xml", tdesc_s390x_te_linux64);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/s390x-tevx-linux64.c b/gdb/features/s390x-tevx-linux64.c
index 327cd23..d841528 100644
--- a/gdb/features/s390x-tevx-linux64.c
+++ b/gdb/features/s390x-tevx-linux64.c
@@ -169,4 +169,7 @@ initialize_tdesc_s390x_tevx_linux64 (void)
   tdesc_create_reg (feature, "v31", 105, 1, NULL, 128, "vec128");
 
   tdesc_s390x_tevx_linux64 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("s390x-tevx-linux64.xml", tdesc_s390x_tevx_linux64);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/s390x-vx-linux64.c b/gdb/features/s390x-vx-linux64.c
index e66da70..9bac54b 100644
--- a/gdb/features/s390x-vx-linux64.c
+++ b/gdb/features/s390x-vx-linux64.c
@@ -147,4 +147,7 @@ initialize_tdesc_s390x_vx_linux64 (void)
   tdesc_create_reg (feature, "v31", 85, 1, NULL, 128, "vec128");
 
   tdesc_s390x_vx_linux64 = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("s390x-vx-linux64.xml", tdesc_s390x_vx_linux64);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/tic6x-c62x-linux.c b/gdb/features/tic6x-c62x-linux.c
index 8dd426d..46cbce6 100644
--- a/gdb/features/tic6x-c62x-linux.c
+++ b/gdb/features/tic6x-c62x-linux.c
@@ -53,4 +53,7 @@ initialize_tdesc_tic6x_c62x_linux (void)
   tdesc_create_reg (feature, "PC", 33, 1, NULL, 32, "code_ptr");
 
   tdesc_tic6x_c62x_linux = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("tic6x-c62x-linux.xml", tdesc_tic6x_c62x_linux);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/tic6x-c62x.c b/gdb/features/tic6x-c62x.c
index 2089aaf..5c7c898 100644
--- a/gdb/features/tic6x-c62x.c
+++ b/gdb/features/tic6x-c62x.c
@@ -51,4 +51,7 @@ initialize_tdesc_tic6x_c62x (void)
   tdesc_create_reg (feature, "PC", 33, 1, NULL, 32, "code_ptr");
 
   tdesc_tic6x_c62x = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("tic6x-c62x.xml", tdesc_tic6x_c62x);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/tic6x-c64x-linux.c b/gdb/features/tic6x-c64x-linux.c
index 2752358..310fe5a 100644
--- a/gdb/features/tic6x-c64x-linux.c
+++ b/gdb/features/tic6x-c64x-linux.c
@@ -87,4 +87,7 @@ initialize_tdesc_tic6x_c64x_linux (void)
   tdesc_create_reg (feature, "B31", 65, 1, NULL, 32, "uint32");
 
   tdesc_tic6x_c64x_linux = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("tic6x-c64x-linux.xml", tdesc_tic6x_c64x_linux);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/tic6x-c64x.c b/gdb/features/tic6x-c64x.c
index 0feda24..c4bbb3a 100644
--- a/gdb/features/tic6x-c64x.c
+++ b/gdb/features/tic6x-c64x.c
@@ -85,4 +85,7 @@ initialize_tdesc_tic6x_c64x (void)
   tdesc_create_reg (feature, "B31", 65, 1, NULL, 32, "uint32");
 
   tdesc_tic6x_c64x = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("tic6x-c64x.xml", tdesc_tic6x_c64x);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/tic6x-c64xp-linux.c b/gdb/features/tic6x-c64xp-linux.c
index c1bee4c..df89570 100644
--- a/gdb/features/tic6x-c64xp-linux.c
+++ b/gdb/features/tic6x-c64xp-linux.c
@@ -92,4 +92,7 @@ initialize_tdesc_tic6x_c64xp_linux (void)
   tdesc_create_reg (feature, "RILC", 68, 1, NULL, 32, "uint32");
 
   tdesc_tic6x_c64xp_linux = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("tic6x-c64xp-linux.xml", tdesc_tic6x_c64xp_linux);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/features/tic6x-c64xp.c b/gdb/features/tic6x-c64xp.c
index 160b854..6cc6430 100644
--- a/gdb/features/tic6x-c64xp.c
+++ b/gdb/features/tic6x-c64xp.c
@@ -90,4 +90,7 @@ initialize_tdesc_tic6x_c64xp (void)
   tdesc_create_reg (feature, "RILC", 68, 1, NULL, 32, "uint32");
 
   tdesc_tic6x_c64xp = result;
+#if GDB_SELF_TEST
+  selftests::record_xml_tdesc ("tic6x-c64xp.xml", tdesc_tic6x_c64xp);
+#endif /* GDB_SELF_TEST */
 }
diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c
index 9a7e2dd..754f15b 100644
--- a/gdb/target-descriptions.c
+++ b/gdb/target-descriptions.c
@@ -468,6 +468,101 @@ tdesc_osabi (const struct target_desc *target_desc)
   return target_desc->osabi;
 }
 
+/* Return true if REG1 and REG2 are identical.  */
+
+static bool
+tdesc_reg_equals (const struct tdesc_reg *reg1,
+		  const struct tdesc_reg *reg2)
+{
+  return (strcmp (reg1->name, reg2->name) == 0
+	  && reg1->target_regnum == reg2->target_regnum
+	  && reg1->save_restore == reg2->save_restore
+	  && reg1->bitsize == reg2->bitsize
+	  && (reg1->group == reg2->group
+	      || strcmp (reg1->group, reg2->group) == 0)
+	  && strcmp (reg1->type, reg2->type) == 0);
+}
+
+/* Return true if TYPE1 and TYPE2 are identical.  */
+
+static bool
+tdesc_type_equals (const struct tdesc_type *type1,
+		   const struct tdesc_type *type2)
+{
+  return (strcmp (type1->name, type2->name) == 0
+	  && type1->kind == type2->kind);
+}
+
+/* Return true if FEATURE1 and FEATURE2 are identical.  */
+
+static bool
+tdesc_feature_equals (const struct tdesc_feature *feature1,
+		      const struct tdesc_feature *feature2)
+{
+  if (feature1 == feature2)
+    return true;
+
+  if (strcmp (feature1->name, feature2->name) != 0)
+    return false;
+
+  struct tdesc_reg *reg;
+
+  for (int ix = 0;
+       VEC_iterate (tdesc_reg_p, feature1->registers, ix, reg);
+       ix++)
+    {
+      struct tdesc_reg *reg2
+	= VEC_index (tdesc_reg_p, feature2->registers, ix);
+
+      if (!tdesc_reg_equals (reg, reg2))
+	return false;
+    }
+
+  struct tdesc_type *type;
+
+  for (int ix = 0;
+       VEC_iterate (tdesc_type_p, feature1->types, ix, type);
+       ix++)
+    {
+      struct tdesc_type *type2
+	= VEC_index (tdesc_type_p, feature2->types, ix);
+
+      if (!tdesc_type_equals (type, type2))
+	return false;
+    }
+
+  return true;
+}
+
+bool
+tdesc_equals (const struct target_desc *tdesc1,
+	      const struct target_desc *tdesc2)
+{
+  if (tdesc1->arch != tdesc2->arch)
+    return false;
+
+  if (tdesc1->osabi != tdesc2->osabi)
+    return false;
+
+  if (VEC_length (tdesc_feature_p, tdesc1->features)
+      != VEC_length (tdesc_feature_p, tdesc2->features))
+      return false;
+
+  struct tdesc_feature *feature;
+
+  for (int ix = 0;
+       VEC_iterate (tdesc_feature_p, tdesc1->features, ix, feature);
+       ix++)
+    {
+      struct tdesc_feature *feature2
+	= VEC_index (tdesc_feature_p, tdesc2->features, ix);
+
+      if (!tdesc_feature_equals (feature, feature2))
+	return false;
+    }
+  return true;
+}
+
 
 
 /* Return 1 if this target description includes any registers.  */
@@ -1734,6 +1829,12 @@ maint_print_c_tdesc_cmd (char *args, int from_tty)
     error (_("The current target description did not come from an XML file."));
 
   filename = lbasename (target_description_filename);
+  std::string filename_after_features (target_description_filename);
+  auto loc = filename_after_features.rfind ("/features/");
+
+  if (loc != std::string::npos)
+    filename_after_features = filename_after_features.substr (loc + 10);
+
   function = (char *) alloca (strlen (filename) + 1);
   for (inp = filename, outp = function; *inp != '\0'; inp++)
     if (*inp == '.')
@@ -1979,9 +2080,64 @@ feature = tdesc_create_feature (result, \"%s\");\n",
     }
 
   printf_unfiltered ("  tdesc_%s = result;\n", function);
+
+  printf_unfiltered ("#if GDB_SELF_TEST\n");
+  printf_unfiltered ("  selftests::record_xml_tdesc (\"%s\", tdesc_%s);\n",
+		     filename_after_features.data (), function);
+  printf_unfiltered ("#endif /* GDB_SELF_TEST */\n");
   printf_unfiltered ("}\n");
 }
 
+#if GDB_SELF_TEST
+#include "selftest.h"
+
+namespace selftests {
+
+static std::vector<std::pair<std::string, const struct target_desc *>> lists;
+
+void
+record_xml_tdesc (std::string xml_file, const struct target_desc *tdesc)
+{
+  lists.emplace_back (xml_file, tdesc);
+}
+
+/* Test these GDB builtin target descriptions are identical to these which
+   are generated by the corresponding xml files.  */
+
+static void
+xml_builtin_tdesc_test (void)
+{
+  std::string feature_dir (ldirname (__FILE__));
+  struct stat st;
+
+  /* Look for the features directory.  If the directory of __FILE__ can't
+     be found, __FILE__ is a file name with relative path.  Guess that
+     GDB is executed in testsuite directory like ../gdb, because I don't
+     expect that GDB is invoked somewhere else and run self tests.  */
+  if (stat (feature_dir.data (), &st) < 0)
+    {
+      feature_dir.insert (0, SLASH_STRING);
+      feature_dir.insert (0, "..");
+
+      /* If still can't find the path, something is wrong.  */
+      SELF_CHECK (stat (feature_dir.data (), &st) == 0);
+    }
+
+  feature_dir = feature_dir + SLASH_STRING + "features";
+
+  for (auto const &e : lists)
+    {
+      std::string tdesc_xml = (feature_dir + SLASH_STRING + e.first);
+      const struct target_desc *tdesc
+	= file_read_description_xml (tdesc_xml.data ());
+
+      SELF_CHECK (tdesc != NULL);
+      SELF_CHECK (tdesc_equals (tdesc, e.second));
+    }
+}
+}
+#endif /* GDB_SELF_TEST */
+
 /* Provide a prototype to silence -Wmissing-prototypes.  */
 extern initialize_file_ftype _initialize_target_descriptions;
 
@@ -2022,4 +2178,8 @@ 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);
+
+#if GDB_SELF_TEST
+  register_self_test (selftests::xml_builtin_tdesc_test);
+#endif
 }
diff --git a/gdb/target-descriptions.h b/gdb/target-descriptions.h
index 361ac97..78416ae 100644
--- a/gdb/target-descriptions.h
+++ b/gdb/target-descriptions.h
@@ -162,6 +162,12 @@ enum gdb_osabi tdesc_osabi (const struct target_desc *);
 int tdesc_compatible_p (const struct target_desc *,
 			const struct bfd_arch_info *);
 
+/* Compare target descriptions TDESC1 and TDESC2, return true if they
+   are identical.  */
+
+bool tdesc_equals (const struct target_desc *tdesc1,
+		   const struct target_desc *tdesc2);
+
 /* Return the string value of a property named KEY, or NULL if the
    property was not specified.  */
 
@@ -253,4 +259,14 @@ 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 the target description TDESC generated by XML_FILE.  */
+
+void record_xml_tdesc (std::string xml_file,
+		       const struct target_desc *tdesc);
+}
+#endif
+
 #endif /* TARGET_DESCRIPTIONS_H */
-- 
1.9.1



More information about the Gdb-patches mailing list