public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [PATCH 4/7] Arm: Use feature target descriptions
  2019-07-05  9:46 [PATCH 0/7] Arm: Use feature target descriptions Alan Hayward
  2019-07-05  9:45 ` [PATCH 3/7] Arm: Add read_description read funcs and use in GDB Alan Hayward
@ 2019-07-05  9:45 ` Alan Hayward
  2019-07-05  9:46 ` [PATCH 1/7] Arm: Minor style cleanups Alan Hayward
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 18+ messages in thread
From: Alan Hayward @ 2019-07-05  9:45 UTC (permalink / raw)
  To: gdb-patches; +Cc: nd, Alan Hayward

In arm arm_create_target_description and
aarch32_create_target_description create feature based target descriptions
instead of returning the old style descriptions.

Ensure the descriptions are created in exactly the same way as the old xml
files.

Remove the old initialize calls.

Note this fixes the gdbserver build for AArch64.

gdb/ChangeLog:

2019-07-05  Alan Hayward  <alan.hayward@arm.com>

	* arch/aarch32.c (aarch32_create_target_description): Create
	target descriptions using features.
	* arch/arm.c (arm_create_target_description)
	(arm_create_mprofile_target_description): Likewise.
	* arm-tdep.c (_initialize_arm_tdep): Remove tdesc init calls.
---
 gdb/arch/aarch32.c | 18 +++++++++++--
 gdb/arch/arm.c     | 63 +++++++++++++++++++++++++++++++++-------------
 gdb/arm-tdep.c     | 17 -------------
 3 files changed, 62 insertions(+), 36 deletions(-)

diff --git a/gdb/arch/aarch32.c b/gdb/arch/aarch32.c
index f3cb8c7855..f15096e592 100644
--- a/gdb/arch/aarch32.c
+++ b/gdb/arch/aarch32.c
@@ -18,12 +18,26 @@
 #include "common/common-defs.h"
 #include "aarch32.h"
 
-extern struct target_desc *tdesc_arm_with_neon;
+#include "../features/arm/arm-core.c"
+#include "../features/arm/arm-vfpv3.c"
 
 /* See aarch32.h.  */
 
 target_desc *
 aarch32_create_target_description ()
 {
-  return tdesc_arm_with_neon;
+  target_desc *tdesc = allocate_target_description ();
+
+#ifndef IN_PROCESS_AGENT
+  set_tdesc_architecture (tdesc, "arm");
+#endif
+
+  long regnum = 0;
+
+  regnum = create_feature_arm_arm_core (tdesc, regnum);
+  /* Create a vfpv3 feature, then a blank NEON feature.  */
+  regnum = create_feature_arm_arm_vfpv3 (tdesc, regnum);
+  tdesc_create_feature (tdesc, "org.gnu.gdb.arm.neon");
+
+  return tdesc;
 }
diff --git a/gdb/arch/arm.c b/gdb/arch/arm.c
index 37806753cb..e563457942 100644
--- a/gdb/arch/arm.c
+++ b/gdb/arch/arm.c
@@ -21,14 +21,12 @@
 #include "common/common-regcache.h"
 #include "arm.h"
 
-extern struct target_desc *tdesc_arm_with_vfpv2;
-extern struct target_desc *tdesc_arm_with_vfpv3;
-extern struct target_desc *tdesc_arm_with_iwmmxt;
-#ifndef GDBSERVER
-extern struct target_desc *tdesc_arm_with_m;
-extern struct target_desc *tdesc_arm_with_m_vfp_d16;
-extern struct target_desc *tdesc_arm_with_m_fpa_layout;
-#endif
+#include "../features/arm/arm-core.c"
+#include "../features/arm/arm-vfpv2.c"
+#include "../features/arm/arm-vfpv3.c"
+#include "../features/arm/xscale-iwmmxt.c"
+#include "../features/arm/arm-m-profile.c"
+#include "../features/arm/arm-m-profile-with-fpa.c"
 
 /* See arm.h.  */
 
@@ -387,23 +385,41 @@ shifted_reg_val (struct regcache *regcache, unsigned long inst,
 target_desc *
 arm_create_target_description (arm_fp_type fp_type)
 {
+  target_desc *tdesc = allocate_target_description ();
+
+#ifndef IN_PROCESS_AGENT
+  if (fp_type == ARM_FP_TYPE_IWMMXT)
+    set_tdesc_architecture (tdesc, "iwmmxt");
+  else
+    set_tdesc_architecture (tdesc, "arm");
+#endif
+
+  long regnum = 0;
+
+  regnum = create_feature_arm_arm_core (tdesc, regnum);
+
   switch (fp_type)
     {
     case ARM_FP_TYPE_NONE:
-      return nullptr;
+      break;
 
     case ARM_FP_TYPE_VFPV2:
-      return tdesc_arm_with_vfpv2;
+      regnum = create_feature_arm_arm_vfpv2 (tdesc, regnum);
+      break;
 
     case ARM_FP_TYPE_VFPV3:
-      return tdesc_arm_with_vfpv3;
+      regnum = create_feature_arm_arm_vfpv3 (tdesc, regnum);
+      break;
 
     case ARM_FP_TYPE_IWMMXT:
-      return tdesc_arm_with_iwmmxt;
+      regnum = create_feature_arm_xscale_iwmmxt (tdesc, regnum);
+      break;
 
     default:
       error (_("Invalid Arm FP type: %d"), fp_type);
     }
+
+  return tdesc;
 }
 
 /* See arch/arm.h.  */
@@ -411,19 +427,32 @@ arm_create_target_description (arm_fp_type fp_type)
 target_desc *
 arm_create_mprofile_target_description (arm_m_profile_type m_type)
 {
+  target_desc *tdesc = allocate_target_description ();
+
+#ifndef IN_PROCESS_AGENT
+  set_tdesc_architecture (tdesc, "arm");
+#endif
+
+  long regnum = 0;
+
   switch (m_type)
     {
-#ifndef GDBSERVER
     case ARM_M_TYPE_M_PROFILE:
-      return tdesc_arm_with_m;
+      regnum = create_feature_arm_arm_m_profile (tdesc, regnum);
+      break;
 
     case ARM_M_TYPE_VFP_D16:
-      return tdesc_arm_with_m_fpa_layout;
+      regnum = create_feature_arm_arm_m_profile (tdesc, regnum);
+      regnum = create_feature_arm_arm_vfpv2 (tdesc, regnum);
+      break;
 
     case ARM_M_TYPE_WITH_FPA:
-      return tdesc_arm_with_m_vfp_d16;
-#endif
+      regnum = create_feature_arm_arm_m_profile_with_fpa (tdesc, regnum);
+      break;
+
     default:
       error (_("Invalid Arm M type: %d"), m_type);
     }
+
+  return tdesc;
 }
diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c
index f3f6458a27..91a4a785ea 100644
--- a/gdb/arm-tdep.c
+++ b/gdb/arm-tdep.c
@@ -61,14 +61,6 @@
 #include "record-full.h"
 #include <algorithm>
 
-#include "features/arm/arm-with-m.c"
-#include "features/arm/arm-with-m-fpa-layout.c"
-#include "features/arm/arm-with-m-vfp-d16.c"
-#include "features/arm/arm-with-iwmmxt.c"
-#include "features/arm/arm-with-vfpv2.c"
-#include "features/arm/arm-with-vfpv3.c"
-#include "features/arm/arm-with-neon.c"
-
 #if GDB_SELF_TEST
 #include "common/selftest.h"
 #endif
@@ -9479,15 +9471,6 @@ _initialize_arm_tdep (void)
 				  bfd_target_elf_flavour,
 				  arm_elf_osabi_sniffer);
 
-  /* Initialize the standard target descriptions.  */
-  initialize_tdesc_arm_with_m ();
-  initialize_tdesc_arm_with_m_fpa_layout ();
-  initialize_tdesc_arm_with_m_vfp_d16 ();
-  initialize_tdesc_arm_with_iwmmxt ();
-  initialize_tdesc_arm_with_vfpv2 ();
-  initialize_tdesc_arm_with_vfpv3 ();
-  initialize_tdesc_arm_with_neon ();
-
   /* Add root prefix command for all "set arm"/"show arm" commands.  */
   add_prefix_cmd ("arm", no_class, set_arm_command,
 		  _("Various ARM-specific commands."),
-- 
2.20.1 (Apple Git-117)

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

* [PATCH 3/7] Arm: Add read_description read funcs and use in GDB
  2019-07-05  9:46 [PATCH 0/7] Arm: Use feature target descriptions Alan Hayward
@ 2019-07-05  9:45 ` Alan Hayward
  2019-07-10  3:45   ` Simon Marchi
  2019-07-05  9:45 ` [PATCH 4/7] Arm: Use feature target descriptions Alan Hayward
                   ` (5 subsequent siblings)
  6 siblings, 1 reply; 18+ messages in thread
From: Alan Hayward @ 2019-07-05  9:45 UTC (permalink / raw)
  To: gdb-patches; +Cc: nd, Alan Hayward

Switch the Arm target to get target descriptions via arm_read_description
and aarch32_read_description, in the same style as other feature targets.
Add an enum to specify the different types - this will also be of use to
gdbserver in a later patch.

Call arm_create_mprofile_target_description directly as these will only be
called the once, therefore they do not need caching.

Under the hood return the same existing pre-feature target descriptions.

Note: This commit will break the AArch64 gdbserver build.

2019-07-05  Alan Hayward  <alan.hayward@arm.com>

	* Makefile.in: Add new files.
	* aarch32-tdep.c: New file.
	* aarch32-tdep.h: New file.
	* aarch64-linux-nat.c (aarch64_linux_nat_target::read_description):
	Call aarch32_read_description.
	* arch/aarch32.c: New file.
	* arch/aarch32.h: New file.
	* arch/arm.c (arm_create_target_description)
	(arm_create_mprofile_target_description): New function.
	* arch/arm.h (arm_fp_type, arm_m_profile_type): New enum.
	(arm_create_target_description)
	(arm_create_mprofile_target_description): New declaration.
	* arm-fbsd-tdep.c (arm_fbsd_read_description_auxv): Call
	read_description functions.
	* arm-linux-nat.c (arm_linux_nat_target::read_description):
	Likewise.
	* arm-linux-tdep.c (arm_linux_core_read_description): Likewise.
	* arm-tdep.c (tdesc_arm_list): New variable.
	(arm_register_g_packet_guesses): Call create description functions.
	(arm_read_description): New function.
	* arm-tdep.h (arm_read_description): Add declaration.
	* configure.tgt: Add new files.
---
 gdb/Makefile.in         |  5 ++++
 gdb/aarch32-tdep.c      | 33 +++++++++++++++++++++++++
 gdb/aarch32-tdep.h      | 25 +++++++++++++++++++
 gdb/aarch64-linux-nat.c |  6 ++---
 gdb/arch/aarch32.c      | 29 ++++++++++++++++++++++
 gdb/arch/aarch32.h      | 27 ++++++++++++++++++++
 gdb/arch/arm.c          | 55 +++++++++++++++++++++++++++++++++++++++++
 gdb/arch/arm.h          | 27 ++++++++++++++++++++
 gdb/arm-fbsd-tdep.c     | 11 +++++----
 gdb/arm-linux-nat.c     | 11 +++++----
 gdb/arm-linux-tdep.c    | 11 +++++----
 gdb/arm-tdep.c          | 34 ++++++++++++++++++++++---
 gdb/arm-tdep.h          |  8 ++----
 gdb/configure.tgt       |  8 +++---
 14 files changed, 259 insertions(+), 31 deletions(-)
 create mode 100644 gdb/aarch32-tdep.c
 create mode 100644 gdb/aarch32-tdep.h
 create mode 100644 gdb/arch/aarch32.c
 create mode 100644 gdb/arch/aarch32.h

diff --git a/gdb/Makefile.in b/gdb/Makefile.in
index 7308ea5767..9352dd92ff 100644
--- a/gdb/Makefile.in
+++ b/gdb/Makefile.in
@@ -665,7 +665,9 @@ ALL_64_TARGET_OBS = \
 
 # All other target-dependent objects files (used with --enable-targets=all).
 ALL_TARGET_OBS = \
+	aarch32-tdep.o \
 	arc-tdep.o \
+	arch/aarch32.o \
 	arch/arm.o \
 	arch/arm-get-next-pcs.o \
 	arch/arm-linux.o \
@@ -1184,6 +1186,7 @@ SFILES = \
 # right, it is probably easiest just to list .h files here directly.
 
 HFILES_NO_SRCDIR = \
+	aarch32-tdep.h \
 	aarch64-ravenscar-thread.h \
 	aarch64-tdep.h \
 	ada-lang.h \
@@ -1431,6 +1434,7 @@ HFILES_NO_SRCDIR = \
 	xtensa-tdep.h \
 	arch/aarch64.h \
 	arch/aarch64-insn.h \
+	arch/aarch32.h \
 	arch/arm.h \
 	arch/i386.h \
 	arch/ppc-linux-common.h \
@@ -2133,6 +2137,7 @@ force_update:
 MAKEOVERRIDES =
 
 ALLDEPFILES = \
+	aarch32-tdep.c \
 	aarch64-fbsd-nat.c \
 	aarch64-fbsd-tdep.c \
 	aarch64-linux-nat.c \
diff --git a/gdb/aarch32-tdep.c b/gdb/aarch32-tdep.c
new file mode 100644
index 0000000000..d9355d0665
--- /dev/null
+++ b/gdb/aarch32-tdep.c
@@ -0,0 +1,33 @@
+/* Copyright (C) 2019 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 "common/common-defs.h"
+#include "common/common-regcache.h"
+#include "arch/aarch32.h"
+
+struct target_desc *tdesc_aarch32;
+
+/* See linux-aarch32-tdep.h.  */
+
+const target_desc *
+aarch32_read_description ()
+{
+  if (tdesc_aarch32 == nullptr)
+    tdesc_aarch32 = aarch32_create_target_description ();
+
+  return tdesc_aarch32;
+}
diff --git a/gdb/aarch32-tdep.h b/gdb/aarch32-tdep.h
new file mode 100644
index 0000000000..7fcea0adb9
--- /dev/null
+++ b/gdb/aarch32-tdep.h
@@ -0,0 +1,25 @@
+/* Copyright (C) 2019 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 AARCH32_TDEP_H
+#define AARCH32_TDEP_H
+
+/* Get the AArch32 target description.  */
+
+const target_desc *aarch32_read_description ();
+
+#endif /* aarch32-tdep.h.  */
diff --git a/gdb/aarch64-linux-nat.c b/gdb/aarch64-linux-nat.c
index 7b60a9a0c3..4db0288e68 100644
--- a/gdb/aarch64-linux-nat.c
+++ b/gdb/aarch64-linux-nat.c
@@ -27,9 +27,11 @@
 #include "target-descriptions.h"
 #include "auxv.h"
 #include "gdbcmd.h"
+#include "arch/arm.h"
 #include "aarch64-tdep.h"
 #include "aarch64-linux-tdep.h"
 #include "aarch32-linux-nat.h"
+#include "aarch32-tdep.h"
 #include "arch/arm.h"
 #include "nat/aarch64-linux.h"
 #include "nat/aarch64-linux-hw-point.h"
@@ -631,8 +633,6 @@ aarch64_linux_nat_target::post_attach (int pid)
   linux_nat_target::post_attach (pid);
 }
 
-extern struct target_desc *tdesc_arm_with_neon;
-
 /* Implement the "read_description" target_ops method.  */
 
 const struct target_desc *
@@ -649,7 +649,7 @@ aarch64_linux_nat_target::read_description ()
 
   ret = ptrace (PTRACE_GETREGSET, tid, NT_ARM_VFP, &iovec);
   if (ret == 0)
-    return tdesc_arm_with_neon;
+    return aarch32_read_description ();
 
   CORE_ADDR hwcap = linux_get_hwcap (this);
 
diff --git a/gdb/arch/aarch32.c b/gdb/arch/aarch32.c
new file mode 100644
index 0000000000..f3cb8c7855
--- /dev/null
+++ b/gdb/arch/aarch32.c
@@ -0,0 +1,29 @@
+/* Copyright (C) 2019 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 "common/common-defs.h"
+#include "aarch32.h"
+
+extern struct target_desc *tdesc_arm_with_neon;
+
+/* See aarch32.h.  */
+
+target_desc *
+aarch32_create_target_description ()
+{
+  return tdesc_arm_with_neon;
+}
diff --git a/gdb/arch/aarch32.h b/gdb/arch/aarch32.h
new file mode 100644
index 0000000000..87b28c0040
--- /dev/null
+++ b/gdb/arch/aarch32.h
@@ -0,0 +1,27 @@
+/* Copyright (C) 2019 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_AARCH32_H
+#define ARCH_AARCH32_H
+
+#include "common/tdesc.h"
+
+/* Create the AArch32 target description.  */
+
+target_desc *aarch32_create_target_description ();
+
+#endif /* aarch32.h.  */
diff --git a/gdb/arch/arm.c b/gdb/arch/arm.c
index 93738f0a0f..37806753cb 100644
--- a/gdb/arch/arm.c
+++ b/gdb/arch/arm.c
@@ -21,6 +21,15 @@
 #include "common/common-regcache.h"
 #include "arm.h"
 
+extern struct target_desc *tdesc_arm_with_vfpv2;
+extern struct target_desc *tdesc_arm_with_vfpv3;
+extern struct target_desc *tdesc_arm_with_iwmmxt;
+#ifndef GDBSERVER
+extern struct target_desc *tdesc_arm_with_m;
+extern struct target_desc *tdesc_arm_with_m_vfp_d16;
+extern struct target_desc *tdesc_arm_with_m_fpa_layout;
+#endif
+
 /* See arm.h.  */
 
 int
@@ -372,3 +381,49 @@ shifted_reg_val (struct regcache *regcache, unsigned long inst,
 
   return res & 0xffffffff;
 }
+
+/* See arch/arm.h.  */
+
+target_desc *
+arm_create_target_description (arm_fp_type fp_type)
+{
+  switch (fp_type)
+    {
+    case ARM_FP_TYPE_NONE:
+      return nullptr;
+
+    case ARM_FP_TYPE_VFPV2:
+      return tdesc_arm_with_vfpv2;
+
+    case ARM_FP_TYPE_VFPV3:
+      return tdesc_arm_with_vfpv3;
+
+    case ARM_FP_TYPE_IWMMXT:
+      return tdesc_arm_with_iwmmxt;
+
+    default:
+      error (_("Invalid Arm FP type: %d"), fp_type);
+    }
+}
+
+/* See arch/arm.h.  */
+
+target_desc *
+arm_create_mprofile_target_description (arm_m_profile_type m_type)
+{
+  switch (m_type)
+    {
+#ifndef GDBSERVER
+    case ARM_M_TYPE_M_PROFILE:
+      return tdesc_arm_with_m;
+
+    case ARM_M_TYPE_VFP_D16:
+      return tdesc_arm_with_m_fpa_layout;
+
+    case ARM_M_TYPE_WITH_FPA:
+      return tdesc_arm_with_m_vfp_d16;
+#endif
+    default:
+      error (_("Invalid Arm M type: %d"), m_type);
+    }
+}
diff --git a/gdb/arch/arm.h b/gdb/arch/arm.h
index dfbbd56d28..f4cac9c15b 100644
--- a/gdb/arch/arm.h
+++ b/gdb/arch/arm.h
@@ -19,6 +19,8 @@
 #ifndef ARCH_ARM_H
 #define ARCH_ARM_H
 
+#include "common/tdesc.h"
+
 /* Register numbers of various important registers.  */
 
 enum gdb_regnum {
@@ -66,6 +68,23 @@ enum arm_breakpoint_kinds
    ARM_BP_KIND_ARM = 4,
 };
 
+/* Supported Arm FP hardware types.  */
+enum arm_fp_type {
+   ARM_FP_TYPE_NONE = 0,
+   ARM_FP_TYPE_VFPV2,
+   ARM_FP_TYPE_VFPV3,
+   ARM_FP_TYPE_IWMMXT,
+   ARM_FP_TYPE_INVALID
+};
+
+/* Supported M-profile Arm types.  */
+enum arm_m_profile_type {
+   ARM_M_TYPE_M_PROFILE,
+   ARM_M_TYPE_VFP_D16,
+   ARM_M_TYPE_WITH_FPA,
+   ARM_M_TYPE_INVALID
+};
+
 /* Instruction condition field values.  */
 #define INST_EQ		0x0
 #define INST_NE		0x1
@@ -165,4 +184,12 @@ unsigned long shifted_reg_val (struct regcache *regcache,
 			       unsigned long pc_val,
 			       unsigned long status_reg);
 
+/* Create an Arm target description with the given FP hardware type.  */
+
+target_desc *arm_create_target_description (arm_fp_type fp_type);
+
+/* Create an Arm M-profile target description with the given hardware type.  */
+
+target_desc *arm_create_mprofile_target_description (arm_m_profile_type m_type);
+
 #endif /* ARCH_ARM_H */
diff --git a/gdb/arm-fbsd-tdep.c b/gdb/arm-fbsd-tdep.c
index dea3abbdd3..398c95ce0e 100644
--- a/gdb/arm-fbsd-tdep.c
+++ b/gdb/arm-fbsd-tdep.c
@@ -20,6 +20,7 @@
 #include "defs.h"
 
 #include "elf/common.h"
+#include "aarch32-tdep.h"
 #include "arm-tdep.h"
 #include "arm-fbsd-tdep.h"
 #include "auxv.h"
@@ -178,20 +179,20 @@ arm_fbsd_read_description_auxv (struct target_ops *target)
   CORE_ADDR arm_hwcap = 0;
 
   if (target_auxv_search (target, AT_FREEBSD_HWCAP, &arm_hwcap) != 1)
-    return NULL;
+    return nullptr;
 
   if (arm_hwcap & HWCAP_VFP)
     {
       if (arm_hwcap & HWCAP_NEON)
-	return tdesc_arm_with_neon;
+	return aarch32_read_description ();
       else if ((arm_hwcap & (HWCAP_VFPv3 | HWCAP_VFPD32))
 	  == (HWCAP_VFPv3 | HWCAP_VFPD32))
-	return tdesc_arm_with_vfpv3;
+	return arm_read_description (ARM_FP_TYPE_VFPV3);
       else
-	return tdesc_arm_with_vfpv2;
+      return arm_read_description (ARM_FP_TYPE_VFPV2);
     }
 
-  return NULL;
+  return nullptr;
 }
 
 /* Implement the "core_read_description" gdbarch method.  */
diff --git a/gdb/arm-linux-nat.c b/gdb/arm-linux-nat.c
index fe8a113a27..6a374bbc74 100644
--- a/gdb/arm-linux-nat.c
+++ b/gdb/arm-linux-nat.c
@@ -27,6 +27,7 @@
 #include "observable.h"
 #include "gdbthread.h"
 
+#include "aarch32-tdep.h"
 #include "arm-tdep.h"
 #include "arm-linux-tdep.h"
 #include "aarch32-linux-nat.h"
@@ -551,7 +552,7 @@ arm_linux_nat_target::read_description ()
     }
 
   if (arm_hwcap & HWCAP_IWMMXT)
-    return tdesc_arm_with_iwmmxt;
+    return arm_read_description (ARM_FP_TYPE_IWMMXT);
 
   if (arm_hwcap & HWCAP_VFP)
     {
@@ -566,11 +567,11 @@ arm_linux_nat_target::read_description ()
       /* NEON implies VFPv3-D32 or no-VFP unit.  Say that we only support
 	 Neon with VFPv3-D32.  */
       if (arm_hwcap & HWCAP_NEON)
-	return tdesc_arm_with_neon;
+	return aarch32_read_description ();
       else if ((arm_hwcap & (HWCAP_VFPv3 | HWCAP_VFPv3D16)) == HWCAP_VFPv3)
-	return tdesc_arm_with_vfpv3;
-      else
-	return tdesc_arm_with_vfpv2;
+	return arm_read_description (ARM_FP_TYPE_VFPV3);
+
+      return arm_read_description (ARM_FP_TYPE_VFPV2);
     }
 
   return this->beneath ()->read_description ();
diff --git a/gdb/arm-linux-tdep.c b/gdb/arm-linux-tdep.c
index d846749e0b..aec20877d9 100644
--- a/gdb/arm-linux-tdep.c
+++ b/gdb/arm-linux-tdep.c
@@ -33,6 +33,7 @@
 #include "auxv.h"
 #include "xml-syscall.h"
 
+#include "aarch32-tdep.h"
 #include "arch/arm.h"
 #include "arch/arm-get-next-pcs.h"
 #include "arch/arm-linux.h"
@@ -738,14 +739,14 @@ arm_linux_core_read_description (struct gdbarch *gdbarch,
       /* NEON implies VFPv3-D32 or no-VFP unit.  Say that we only support
          Neon with VFPv3-D32.  */
       if (arm_hwcap & HWCAP_NEON)
-	return tdesc_arm_with_neon;
+	return aarch32_read_description ();
       else if ((arm_hwcap & (HWCAP_VFPv3 | HWCAP_VFPv3D16)) == HWCAP_VFPv3)
-	return tdesc_arm_with_vfpv3;
-      else
-	return tdesc_arm_with_vfpv2;
+	return arm_read_description (ARM_FP_TYPE_VFPV3);
+
+      return arm_read_description (ARM_FP_TYPE_VFPV2);
     }
 
-  return NULL;
+  return nullptr;
 }
 
 
diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c
index 8e3607cdea..f3f6458a27 100644
--- a/gdb/arm-tdep.c
+++ b/gdb/arm-tdep.c
@@ -240,6 +240,9 @@ static const char **valid_disassembly_styles;
 /* Disassembly style to use. Default to "std" register names.  */
 static const char *disassembly_style;
 
+/* All possible arm target descriptors.  */
+struct target_desc *tdesc_arm_list[ARM_FP_TYPE_INVALID];
+
 /* This is used to keep the bfd arch_info in sync with the disassembly
    style.  */
 static void set_disassembly_style_sfunc (const char *, int,
@@ -8763,7 +8766,6 @@ arm_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
     return default_register_reggroup_p (gdbarch, regnum, group);
 }
 
-\f
 /* For backward-compatibility we allow two 'g' packet lengths with
    the remote protocol depending on whether FPA registers are
    supplied.  M-profile targets do not have FPA registers, but some
@@ -8777,21 +8779,29 @@ arm_register_g_packet_guesses (struct gdbarch *gdbarch)
 {
   if (gdbarch_tdep (gdbarch)->is_m)
     {
+      const target_desc *tdesc;
+
+      /* This function is only called the once, therefore it's safe to call the
+	 tdesc creation function directly.  */
+
       /* If we know from the executable this is an M-profile target,
 	 cater for remote targets whose register set layout is the
 	 same as the FPA layout.  */
+      tdesc = arm_create_mprofile_target_description (ARM_M_TYPE_WITH_FPA);
       register_remote_g_packet_guess (gdbarch,
 				      ARM_CORE_REGS_SIZE + ARM_FP_REGS_SIZE,
-				      tdesc_arm_with_m_fpa_layout);
+				      tdesc);
 
       /* The regular M-profile layout.  */
+      tdesc = arm_create_mprofile_target_description (ARM_M_TYPE_M_PROFILE);
       register_remote_g_packet_guess (gdbarch, ARM_CORE_REGS_SIZE,
-				      tdesc_arm_with_m);
+				      tdesc);
 
       /* M-profile plus M4F VFP.  */
+      tdesc = arm_create_mprofile_target_description (ARM_M_TYPE_VFP_D16);
       register_remote_g_packet_guess (gdbarch,
 				      ARM_CORE_REGS_SIZE + ARM_VFP2_REGS_SIZE,
-				      tdesc_arm_with_m_vfp_d16);
+				      tdesc);
     }
 
   /* Otherwise we don't have a useful guess.  */
@@ -13336,3 +13346,19 @@ arm_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
 
   return ret;
 }
+
+/* See arm-tdep.h.  */
+
+const target_desc *
+arm_read_description (arm_fp_type fp_type)
+{
+  struct target_desc *tdesc = tdesc_arm_list[fp_type];
+
+  if (tdesc == nullptr)
+    {
+      tdesc = arm_create_target_description (fp_type);
+      tdesc_arm_list[fp_type] = tdesc;
+    }
+
+  return tdesc;
+}
diff --git a/gdb/arm-tdep.h b/gdb/arm-tdep.h
index 807849a5ff..0107936894 100644
--- a/gdb/arm-tdep.h
+++ b/gdb/arm-tdep.h
@@ -281,11 +281,7 @@ extern void
 				       void *cb_data,
 				       const struct regcache *regcache);
 
-/* Target descriptions.  */
-extern struct target_desc *tdesc_arm_with_m;
-extern struct target_desc *tdesc_arm_with_iwmmxt;
-extern struct target_desc *tdesc_arm_with_vfpv2;
-extern struct target_desc *tdesc_arm_with_vfpv3;
-extern struct target_desc *tdesc_arm_with_neon;
+/* Get the correct target description with given FP hardware type.  */
+const target_desc *arm_read_description (arm_fp_type fp_type);
 
 #endif /* arm-tdep.h */
diff --git a/gdb/configure.tgt b/gdb/configure.tgt
index 27f122ad04..7c0215e89a 100644
--- a/gdb/configure.tgt
+++ b/gdb/configure.tgt
@@ -48,8 +48,9 @@ amd64_tobjs="amd64-tdep.o arch/amd64.o ${x86_tobjs}"
 
 case "${targ}" in
 aarch64*-*-*)
-	cpu_obs="aarch64-tdep.o arch/aarch64-insn.o arch/aarch64.o \
-		 ravenscar-thread.o aarch64-ravenscar-thread.o";;
+	cpu_obs="aarch32-tdep.o aarch64-tdep.o arch/aarch32.o \
+		 arch/aarch64-insn.o arch/aarch64.o  ravenscar-thread.o \
+		 aarch64-ravenscar-thread.o";;
 
 alpha*-*-*)
 	# Target: Alpha
@@ -62,7 +63,8 @@ arc*-*-*)
 	;;
 
 arm*-*-*)
-	cpu_obs="arch/arm.o arch/arm-get-next-pcs.o arm-tdep.o";;
+	cpu_obs="aarch32-tdep.o arch/aarch32.o arch/arm.o \
+		 arch/arm-get-next-pcs.o arm-tdep.o";;
 
 hppa*-*-*)
 	# Target: HP PA-RISC
-- 
2.20.1 (Apple Git-117)

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

* [PATCH 6/7] Arm: Use read_description funcs in gdbserver
  2019-07-05  9:46 [PATCH 0/7] Arm: Use feature target descriptions Alan Hayward
                   ` (4 preceding siblings ...)
  2019-07-05  9:46 ` [PATCH 7/7] Arm: Remove unused feature files and tests Alan Hayward
@ 2019-07-05  9:46 ` Alan Hayward
  2019-07-10  4:04   ` Simon Marchi
  2019-07-05  9:46 ` [PATCH 5/7] Arm: Add xml unit tests Alan Hayward
  6 siblings, 1 reply; 18+ messages in thread
From: Alan Hayward @ 2019-07-05  9:46 UTC (permalink / raw)
  To: gdb-patches; +Cc: nd, Alan Hayward

Switch gdbserver over to using feature target descriptions.

Add a function for determining the type of a given target description,
and use where required.

2019-07-05  Alan Hayward  <alan.hayward@arm.com>

	* configure.srv: Add new files. Remove xml generated files.
	* linux-aarch32-low.c (initialize_low_arch_aarch32): Don't init
	registers.
	* linux-aarch32-low.h (tdesc_arm_with_neon): Remove.
	* linux-aarch32-tdesc.c: New file.
	* linux-aarch32-tdesc.h: New file.
	* linux-aarch64-low.c (aarch64_arch_setup): Call aarch32_linux_read_description.
	* linux-arm-low.c (init_registers_arm, tdesc_arm)
	(init_registers_arm_with_iwmmxt, tdesc_arm_with_iwmmxt)
	(init_registers_arm_with_vfpv2, tdesc_arm_with_vfpv2)
	(init_registers_arm_with_vfpv3, tdesc_arm_with_vfpv3): Remove.
	(arm_fill_wmmxregset, arm_store_wmmxregset, arm_fill_vfpregset)
	(arm_store_vfpregset): Call arm_linux_get_tdesc_fp_type.
	(arm_read_description): Call arm_linux_read_description.
	(initialize_low_arch): Don't init registers.
	* linux-arm-tdesc.c: New file.
	* linux-arm-tdesc.h: New file.
---
 gdb/gdbserver/configure.srv         | 14 +++---
 gdb/gdbserver/linux-aarch32-low.c   |  2 -
 gdb/gdbserver/linux-aarch32-low.h   |  2 -
 gdb/gdbserver/linux-aarch32-tdesc.c | 46 +++++++++++++++++
 gdb/gdbserver/linux-aarch32-tdesc.h | 29 +++++++++++
 gdb/gdbserver/linux-aarch64-low.c   |  3 +-
 gdb/gdbserver/linux-arm-low.c       | 77 ++++++++++++++---------------
 gdb/gdbserver/linux-arm-tdesc.c     | 62 +++++++++++++++++++++++
 gdb/gdbserver/linux-arm-tdesc.h     | 29 +++++++++++
 9 files changed, 211 insertions(+), 53 deletions(-)
 create mode 100644 gdb/gdbserver/linux-aarch32-tdesc.c
 create mode 100644 gdb/gdbserver/linux-aarch32-tdesc.h
 create mode 100644 gdb/gdbserver/linux-arm-tdesc.c
 create mode 100644 gdb/gdbserver/linux-arm-tdesc.h

diff --git a/gdb/gdbserver/configure.srv b/gdb/gdbserver/configure.srv
index c20177ef18..097dc4e9db 100644
--- a/gdb/gdbserver/configure.srv
+++ b/gdb/gdbserver/configure.srv
@@ -33,9 +33,10 @@ srv_linux_obj="linux-low.o linux-osdata.o linux-procfs.o linux-ptrace.o linux-wa
 # Input is taken from the "${target}" variable.
 
 case "${target}" in
-  aarch64*-*-linux*)	srv_regobj="arm-with-neon.o"
-			srv_tgtobj="linux-aarch64-low.o aarch64-linux-hw-point.o"
+  aarch64*-*-linux*)	srv_tgtobj="linux-aarch64-low.o aarch64-linux-hw-point.o"
 			srv_tgtobj="$srv_tgtobj linux-aarch32-low.o"
+			srv_tgtobj="$srv_tgtobj linux-aarch32-tdesc.o"
+			srv_tgtobj="${srv_tgtobj} arch/aarch32.o"
 			srv_tgtobj="${srv_tgtobj} arch/arm.o"
 			srv_tgtobj="$srv_tgtobj aarch64-linux.o"
 			srv_tgtobj="$srv_tgtobj arch/aarch64-insn.o"
@@ -49,12 +50,11 @@ case "${target}" in
 			ipa_obj="${ipa_obj} linux-aarch64-tdesc-ipa.o"
 			ipa_obj="${ipa_obj} arch/aarch64-ipa.o"
 			;;
-  arm*-*-linux*)	srv_regobj="reg-arm.o arm-with-iwmmxt.o"
-			srv_regobj="${srv_regobj} arm-with-vfpv2.o"
-			srv_regobj="${srv_regobj} arm-with-vfpv3.o"
-			srv_regobj="${srv_regobj} arm-with-neon.o"
-			srv_tgtobj="$srv_linux_obj linux-arm-low.o"
+  arm*-*-linux*)	srv_tgtobj="$srv_linux_obj linux-arm-low.o"
+			srv_tgtobj="$srv_tgtobj linux-arm-tdesc.o"
 			srv_tgtobj="$srv_tgtobj linux-aarch32-low.o"
+			srv_tgtobj="$srv_tgtobj linux-aarch32-tdesc.o"
+			srv_tgtobj="${srv_tgtobj} arch/aarch32.o"
 			srv_tgtobj="${srv_tgtobj} arch/arm.o"
 			srv_tgtobj="${srv_tgtobj} arch/arm-linux.o"
 			srv_tgtobj="${srv_tgtobj} arch/arm-get-next-pcs.o"
diff --git a/gdb/gdbserver/linux-aarch32-low.c b/gdb/gdbserver/linux-aarch32-low.c
index a932373518..f1f2ae02a4 100644
--- a/gdb/gdbserver/linux-aarch32-low.c
+++ b/gdb/gdbserver/linux-aarch32-low.c
@@ -299,7 +299,5 @@ arm_breakpoint_kind_from_current_state (CORE_ADDR *pcptr)
 void
 initialize_low_arch_aarch32 (void)
 {
-  init_registers_arm_with_neon ();
-
   initialize_regsets_info (&aarch32_regsets_info);
 }
diff --git a/gdb/gdbserver/linux-aarch32-low.h b/gdb/gdbserver/linux-aarch32-low.h
index 44e626c719..3078fca35e 100644
--- a/gdb/gdbserver/linux-aarch32-low.h
+++ b/gdb/gdbserver/linux-aarch32-low.h
@@ -36,6 +36,4 @@ void initialize_low_arch_aarch32 (void);
 void init_registers_arm_with_neon (void);
 int arm_is_thumb_mode (void);
 
-extern const struct target_desc *tdesc_arm_with_neon;
-
 #endif /* GDBSERVER_LINUX_AARCH32_LOW_H */
diff --git a/gdb/gdbserver/linux-aarch32-tdesc.c b/gdb/gdbserver/linux-aarch32-tdesc.c
new file mode 100644
index 0000000000..6f0e8c9aa9
--- /dev/null
+++ b/gdb/gdbserver/linux-aarch32-tdesc.c
@@ -0,0 +1,46 @@
+/* Copyright (C) 2019 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 "arch/aarch32.h"
+#include <inttypes.h>
+
+struct target_desc *tdesc_aarch32;
+
+/* See linux-aarch32-tdesc.h.  */
+
+const target_desc *
+aarch32_linux_read_description ()
+{
+  if (tdesc_aarch32 == nullptr)
+    {
+      tdesc_aarch32 = aarch32_create_target_description ();
+
+      static const char *expedite_regs[] = { "r11", "sp", "pc", 0 };
+      init_target_desc (tdesc_aarch32, expedite_regs);
+    }
+  return tdesc_aarch32;
+}
+
+/* See linux-aarch32-tdesc.h.  */
+
+bool
+is_aarch32_linux_description (const target_desc *tdesc)
+{
+  return tdesc != nullptr && tdesc == tdesc_aarch32;
+}
diff --git a/gdb/gdbserver/linux-aarch32-tdesc.h b/gdb/gdbserver/linux-aarch32-tdesc.h
new file mode 100644
index 0000000000..8887cbfdf4
--- /dev/null
+++ b/gdb/gdbserver/linux-aarch32-tdesc.h
@@ -0,0 +1,29 @@
+/* Copyright (C) 2019 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 GDBSERVER_LINUX_AARCH32_TDESC_H
+#define GDBSERVER_LINUX_AARCH32_TDESC_H
+
+/* Return the AArch32 target description.  */
+
+const target_desc * aarch32_linux_read_description ();
+
+/* Return true if TDESC is the AArch32 target description.  */
+
+bool is_aarch32_linux_description (const target_desc *tdesc);
+
+#endif /* linux-aarch32-tdesc.h.  */
diff --git a/gdb/gdbserver/linux-aarch64-low.c b/gdb/gdbserver/linux-aarch64-low.c
index 5aea5de372..ab2f40ea98 100644
--- a/gdb/gdbserver/linux-aarch64-low.c
+++ b/gdb/gdbserver/linux-aarch64-low.c
@@ -39,6 +39,7 @@
 
 #include "gdb_proc_service.h"
 #include "arch/aarch64.h"
+#include "linux-aarch32-tdesc.h"
 #include "linux-aarch64-tdesc.h"
 #include "nat/aarch64-sve-linux-ptrace.h"
 #include "tdesc.h"
@@ -527,7 +528,7 @@ aarch64_arch_setup (void)
       current_process ()->tdesc = aarch64_linux_read_description (vq, pauth_p);
     }
   else
-    current_process ()->tdesc = tdesc_arm_with_neon;
+    current_process ()->tdesc = aarch32_linux_read_description ();
 
   aarch64_linux_get_debug_reg_capacity (lwpid_of (current_thread));
 }
diff --git a/gdb/gdbserver/linux-arm-low.c b/gdb/gdbserver/linux-arm-low.c
index 7d6c9d9dd9..0e30af3562 100644
--- a/gdb/gdbserver/linux-arm-low.c
+++ b/gdb/gdbserver/linux-arm-low.c
@@ -22,6 +22,8 @@
 #include "arch/arm-linux.h"
 #include "arch/arm-get-next-pcs.h"
 #include "linux-aarch32-low.h"
+#include "linux-aarch32-tdesc.h"
+#include "linux-arm-tdesc.h"
 
 #include <sys/uio.h>
 /* Don't include elf.h if linux/elf.h got included by gdb_proc_service.h.
@@ -33,19 +35,6 @@
 #include <signal.h>
 #include <sys/syscall.h>
 
-/* Defined in auto-generated files.  */
-void init_registers_arm (void);
-extern const struct target_desc *tdesc_arm;
-
-void init_registers_arm_with_iwmmxt (void);
-extern const struct target_desc *tdesc_arm_with_iwmmxt;
-
-void init_registers_arm_with_vfpv2 (void);
-extern const struct target_desc *tdesc_arm_with_vfpv2;
-
-void init_registers_arm_with_vfpv3 (void);
-extern const struct target_desc *tdesc_arm_with_vfpv3;
-
 #ifndef PTRACE_GET_THREAD_AREA
 #define PTRACE_GET_THREAD_AREA 22
 #endif
@@ -175,7 +164,7 @@ arm_cannot_fetch_register (int regno)
 static void
 arm_fill_wmmxregset (struct regcache *regcache, void *buf)
 {
-  if (regcache->tdesc != tdesc_arm_with_iwmmxt)
+  if (arm_linux_get_tdesc_fp_type (regcache->tdesc) != ARM_FP_TYPE_IWMMXT)
     return;
 
   for (int i = 0; i < 16; i++)
@@ -190,7 +179,7 @@ arm_fill_wmmxregset (struct regcache *regcache, void *buf)
 static void
 arm_store_wmmxregset (struct regcache *regcache, const void *buf)
 {
-  if (regcache->tdesc != tdesc_arm_with_iwmmxt)
+  if (arm_linux_get_tdesc_fp_type (regcache->tdesc) != ARM_FP_TYPE_IWMMXT)
     return;
 
   for (int i = 0; i < 16; i++)
@@ -207,13 +196,19 @@ arm_fill_vfpregset (struct regcache *regcache, void *buf)
 {
   int num;
 
-  if (regcache->tdesc == tdesc_arm_with_neon
-      || regcache->tdesc == tdesc_arm_with_vfpv3)
+  if (is_aarch32_linux_description (regcache->tdesc))
     num = 32;
-  else if (regcache->tdesc == tdesc_arm_with_vfpv2)
-    num = 16;
   else
-    return;
+    {
+      arm_fp_type fp_type = arm_linux_get_tdesc_fp_type (regcache->tdesc);
+
+      if (fp_type == ARM_FP_TYPE_VFPV3)
+	num = 32;
+      else if (fp_type == ARM_FP_TYPE_VFPV2)
+	num = 16;
+      else
+	return;
+    }
 
   arm_fill_vfpregset_num (regcache, buf, num);
 }
@@ -230,13 +225,19 @@ arm_store_vfpregset (struct regcache *regcache, const void *buf)
 {
   int num;
 
-  if (regcache->tdesc == tdesc_arm_with_neon
-      || regcache->tdesc == tdesc_arm_with_vfpv3)
+  if (is_aarch32_linux_description (regcache->tdesc))
     num = 32;
-  else if (regcache->tdesc == tdesc_arm_with_vfpv2)
-    num = 16;
   else
-    return;
+    {
+      arm_fp_type fp_type = arm_linux_get_tdesc_fp_type (regcache->tdesc);
+
+      if (fp_type == ARM_FP_TYPE_VFPV3)
+	num = 32;
+      else if (fp_type == ARM_FP_TYPE_VFPV2)
+	num = 16;
+      else
+	return;
+    }
 
   arm_store_vfpregset_num (regcache, buf, num);
 }
@@ -849,7 +850,7 @@ arm_read_description (void)
   unsigned long arm_hwcap = linux_get_hwcap (4);
 
   if (arm_hwcap & HWCAP_IWMMXT)
-    return tdesc_arm_with_iwmmxt;
+    return arm_linux_read_description (ARM_FP_TYPE_IWMMXT);
 
   if (arm_hwcap & HWCAP_VFP)
     {
@@ -859,21 +860,21 @@ arm_read_description (void)
       errno = 0;
       char *buf = (char *) alloca (ARM_VFP3_REGS_SIZE);
       if (ptrace (PTRACE_GETVFPREGS, pid, 0, buf) < 0 && errno == EIO)
-	return tdesc_arm;
+	return arm_linux_read_description (ARM_FP_TYPE_NONE);
 
       /* NEON implies either no VFP, or VFPv3-D32.  We only support
 	 it with VFP.  */
       if (arm_hwcap & HWCAP_NEON)
-	return tdesc_arm_with_neon;
+	return aarch32_linux_read_description ();
       else if ((arm_hwcap & (HWCAP_VFPv3 | HWCAP_VFPv3D16)) == HWCAP_VFPv3)
-	return tdesc_arm_with_vfpv3;
+	return arm_linux_read_description (ARM_FP_TYPE_VFPV3);
       else
-	return tdesc_arm_with_vfpv2;
+	return arm_linux_read_description (ARM_FP_TYPE_VFPV2);
     }
 
   /* The default configuration uses legacy FPA registers, probably
      simulated.  */
-  return tdesc_arm;
+  return arm_linux_read_description (ARM_FP_TYPE_NONE);
 }
 
 static void
@@ -997,10 +998,11 @@ arm_regs_info (void)
   const struct target_desc *tdesc = current_process ()->tdesc;
 
   if (have_ptrace_getregset == 1
-      && (tdesc == tdesc_arm_with_neon || tdesc == tdesc_arm_with_vfpv3))
+      && (is_aarch32_linux_description (tdesc)
+	  || arm_linux_get_tdesc_fp_type (tdesc) == ARM_FP_TYPE_VFPV3))
     return &regs_info_aarch32;
-  else
-    return &regs_info_arm;
+
+  return &regs_info_arm;
 }
 
 struct linux_target_ops the_low_target = {
@@ -1045,13 +1047,6 @@ struct linux_target_ops the_low_target = {
 void
 initialize_low_arch (void)
 {
-  /* Initialize the Linux target descriptions.  */
-  init_registers_arm ();
-  init_registers_arm_with_iwmmxt ();
-  init_registers_arm_with_vfpv2 ();
-  init_registers_arm_with_vfpv3 ();
-
   initialize_low_arch_aarch32 ();
-
   initialize_regsets_info (&arm_regsets_info);
 }
diff --git a/gdb/gdbserver/linux-arm-tdesc.c b/gdb/gdbserver/linux-arm-tdesc.c
new file mode 100644
index 0000000000..fa54e48592
--- /dev/null
+++ b/gdb/gdbserver/linux-arm-tdesc.c
@@ -0,0 +1,62 @@
+/* Copyright (C) 2019 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 "arch/arm.h"
+#include <inttypes.h>
+
+/* All possible Arm target descriptors.  */
+struct target_desc *tdesc_arm_list[ARM_FP_TYPE_INVALID];
+
+/* See linux-arm-tdesc.h.  */
+
+const target_desc *
+arm_linux_read_description (arm_fp_type fp_type)
+{
+  struct target_desc *tdesc = tdesc_arm_list[fp_type];
+
+  if (tdesc == nullptr)
+    {
+      tdesc = arm_create_target_description (fp_type);
+
+      static const char *expedite_regs[] = { "r11", "sp", "pc", 0 };
+      init_target_desc (tdesc, expedite_regs);
+
+      tdesc_arm_list[fp_type] = tdesc;
+    }
+
+  return tdesc;
+}
+
+/* See linux-arm-tdesc.h.  */
+
+arm_fp_type arm_linux_get_tdesc_fp_type (const target_desc *tdesc)
+{
+  if (tdesc == nullptr)
+    return ARM_FP_TYPE_INVALID;
+
+  /* Many of the tdesc_arm_list entries may not have been initialised yet.  This
+     is ok, because tdesc must be one of the initialised ones.  */
+  for (int i = ARM_FP_TYPE_VFPV2; i < ARM_FP_TYPE_INVALID; i++)
+    {
+      if (tdesc == tdesc_arm_list[i])
+	return (arm_fp_type) i;
+    }
+
+  return ARM_FP_TYPE_INVALID;
+}
diff --git a/gdb/gdbserver/linux-arm-tdesc.h b/gdb/gdbserver/linux-arm-tdesc.h
new file mode 100644
index 0000000000..51efb9fb48
--- /dev/null
+++ b/gdb/gdbserver/linux-arm-tdesc.h
@@ -0,0 +1,29 @@
+/* Copyright (C) 2019 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 GDBSERVER_LINUX_ARM_TDESC_H
+#define GDBSERVER_LINUX_ARM_TDESC_H
+
+/* Return the Arm target description with fp registers FP_TYPE.  */
+
+const target_desc * arm_linux_read_description (arm_fp_type fp_type);
+
+/* For a target description TDESC, return its fp type.  */
+
+arm_fp_type arm_linux_get_tdesc_fp_type (const target_desc *tdesc);
+
+#endif /* linux-arm-tdesc.h.  */
-- 
2.20.1 (Apple Git-117)

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

* [PATCH 5/7] Arm: Add xml unit tests
  2019-07-05  9:46 [PATCH 0/7] Arm: Use feature target descriptions Alan Hayward
                   ` (5 preceding siblings ...)
  2019-07-05  9:46 ` [PATCH 6/7] Arm: Use read_description funcs in gdbserver Alan Hayward
@ 2019-07-05  9:46 ` Alan Hayward
  6 siblings, 0 replies; 18+ messages in thread
From: Alan Hayward @ 2019-07-05  9:46 UTC (permalink / raw)
  To: gdb-patches; +Cc: nd, Alan Hayward

Use the record_xml_tdesc tests to prove the new target descriptions
are identical to the previous xml file ones.

This is tested as part of gdb.gdb/unittest.exp.

gdb/ChangeLog:

2019-07-05  Alan Hayward  <alan.hayward@arm.com>

	* arm-tdep.c (_initialize_arm_tdep): Add xml regression tests.
---
 gdb/arm-tdep.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c
index 91a4a785ea..ea8b22d652 100644
--- a/gdb/arm-tdep.c
+++ b/gdb/arm-tdep.c
@@ -63,6 +63,7 @@
 
 #if GDB_SELF_TEST
 #include "common/selftest.h"
+#include "aarch32-tdep.h"
 #endif
 
 static int arm_debug;
@@ -9575,6 +9576,23 @@ vfp - VFP co-processor."),
 
 #if GDB_SELF_TEST
   selftests::register_test ("arm-record", selftests::arm_record_test);
+
+  const target_desc *tdesc;
+
+  tdesc = arm_read_description (ARM_FP_TYPE_VFPV2);
+  selftests::record_xml_tdesc ("arm/arm-with-vfpv2.xml", tdesc);
+  tdesc = arm_read_description (ARM_FP_TYPE_VFPV3);
+  selftests::record_xml_tdesc ("arm/arm-with-vfpv3.xml",tdesc);
+  tdesc = arm_read_description (ARM_FP_TYPE_IWMMXT);
+  selftests::record_xml_tdesc ("arm/arm-with-iwmmxt.xml", tdesc);
+  tdesc = arm_create_mprofile_target_description (ARM_M_TYPE_M_PROFILE);
+  selftests::record_xml_tdesc ("arm/arm-with-m.xml", tdesc);
+  tdesc = arm_create_mprofile_target_description (ARM_M_TYPE_VFP_D16);
+  selftests::record_xml_tdesc ("arm/arm-with-m-vfp-d16.xml", tdesc);
+  tdesc = arm_create_mprofile_target_description (ARM_M_TYPE_WITH_FPA);
+  selftests::record_xml_tdesc ("arm/arm-with-m-fpa-layout.xml", tdesc);
+  tdesc = aarch32_read_description ();
+  selftests::record_xml_tdesc ("arm/arm-with-neon.xml", tdesc);
 #endif
 
 }
-- 
2.20.1 (Apple Git-117)

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

* [PATCH 1/7] Arm: Minor style cleanups
  2019-07-05  9:46 [PATCH 0/7] Arm: Use feature target descriptions Alan Hayward
  2019-07-05  9:45 ` [PATCH 3/7] Arm: Add read_description read funcs and use in GDB Alan Hayward
  2019-07-05  9:45 ` [PATCH 4/7] Arm: Use feature target descriptions Alan Hayward
@ 2019-07-05  9:46 ` Alan Hayward
  2019-07-05  9:46 ` [PATCH 2/7] Arm: Create feature files for Arm target descriptions Alan Hayward
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 18+ messages in thread
From: Alan Hayward @ 2019-07-05  9:46 UTC (permalink / raw)
  To: gdb-patches; +Cc: nd, Alan Hayward

*When reading a target description, do the ptrace check before picking the
 target description.

*In wmmxregset functions, declare the counter inside the for.

*Call arm_linux_init_hwbp_cap from in arm_arch_setup - it doesn't belong in
 arm_read_description.

gdb/ChangeLog:

2019-07-05  Alan Hayward  <alan.hayward@arm.com>

	* arm-linux-nat.c (arm_linux_nat_target::read_description): Check
	ptrace earlier,

gdb/gdbserver/ChangeLog:

2019-07-05  Alan Hayward  <alan.hayward@arm.com>

	* linux-arm-low.c (arm_fill_wmmxregset, arm_store_wmmxregset):
	Move counter inside for.
	(arm_read_description): Check ptrace earlier.
	(arm_arch_setup): Call arm_linux_init_hwbp_cap here.
---
 gdb/arm-linux-nat.c           | 27 ++++++++------------
 gdb/gdbserver/linux-arm-low.c | 46 +++++++++++++----------------------
 2 files changed, 27 insertions(+), 46 deletions(-)

diff --git a/gdb/arm-linux-nat.c b/gdb/arm-linux-nat.c
index a1ad6fe01e..fe8a113a27 100644
--- a/gdb/arm-linux-nat.c
+++ b/gdb/arm-linux-nat.c
@@ -555,29 +555,22 @@ arm_linux_nat_target::read_description ()
 
   if (arm_hwcap & HWCAP_VFP)
     {
-      int pid;
-      char *buf;
-      const struct target_desc * result = NULL;
+      /* Make sure that the kernel supports reading VFP registers.  Support was
+	 added in 2.6.30.  */
+      int pid = inferior_ptid.lwp ();
+      errno = 0;
+      char *buf = (char *) alloca (ARM_VFP3_REGS_SIZE);
+      if (ptrace (PTRACE_GETVFPREGS, pid, 0, buf) < 0 && errno == EIO)
+	return nullptr;
 
       /* NEON implies VFPv3-D32 or no-VFP unit.  Say that we only support
 	 Neon with VFPv3-D32.  */
       if (arm_hwcap & HWCAP_NEON)
-	result = tdesc_arm_with_neon;
+	return tdesc_arm_with_neon;
       else if ((arm_hwcap & (HWCAP_VFPv3 | HWCAP_VFPv3D16)) == HWCAP_VFPv3)
-	result = tdesc_arm_with_vfpv3;
+	return tdesc_arm_with_vfpv3;
       else
-	result = tdesc_arm_with_vfpv2;
-
-      /* Now make sure that the kernel supports reading these
-	 registers.  Support was added in 2.6.30.  */
-      pid = inferior_ptid.lwp ();
-      errno = 0;
-      buf = (char *) alloca (ARM_VFP3_REGS_SIZE);
-      if (ptrace (PTRACE_GETVFPREGS, pid, 0, buf) < 0
-	  && errno == EIO)
-	result = NULL;
-
-      return result;
+	return tdesc_arm_with_vfpv2;
     }
 
   return this->beneath ()->read_description ();
diff --git a/gdb/gdbserver/linux-arm-low.c b/gdb/gdbserver/linux-arm-low.c
index b323b19078..7d6c9d9dd9 100644
--- a/gdb/gdbserver/linux-arm-low.c
+++ b/gdb/gdbserver/linux-arm-low.c
@@ -175,16 +175,14 @@ arm_cannot_fetch_register (int regno)
 static void
 arm_fill_wmmxregset (struct regcache *regcache, void *buf)
 {
-  int i;
-
   if (regcache->tdesc != tdesc_arm_with_iwmmxt)
     return;
 
-  for (i = 0; i < 16; i++)
+  for (int i = 0; i < 16; i++)
     collect_register (regcache, arm_num_regs + i, (char *) buf + i * 8);
 
   /* We only have access to wcssf, wcasf, and wcgr0-wcgr3.  */
-  for (i = 0; i < 6; i++)
+  for (int i = 0; i < 6; i++)
     collect_register (regcache, arm_num_regs + i + 16,
 		      (char *) buf + 16 * 8 + i * 4);
 }
@@ -192,16 +190,14 @@ arm_fill_wmmxregset (struct regcache *regcache, void *buf)
 static void
 arm_store_wmmxregset (struct regcache *regcache, const void *buf)
 {
-  int i;
-
   if (regcache->tdesc != tdesc_arm_with_iwmmxt)
     return;
 
-  for (i = 0; i < 16; i++)
+  for (int i = 0; i < 16; i++)
     supply_register (regcache, arm_num_regs + i, (char *) buf + i * 8);
 
   /* We only have access to wcssf, wcasf, and wcgr0-wcgr3.  */
-  for (i = 0; i < 6; i++)
+  for (int i = 0; i < 6; i++)
     supply_register (regcache, arm_num_regs + i + 16,
 		     (char *) buf + 16 * 8 + i * 4);
 }
@@ -850,40 +846,29 @@ get_next_pcs_syscall_next_pc (struct arm_get_next_pcs *self)
 static const struct target_desc *
 arm_read_description (void)
 {
-  int pid = lwpid_of (current_thread);
   unsigned long arm_hwcap = linux_get_hwcap (4);
 
-  /* Query hardware watchpoint/breakpoint capabilities.  */
-  arm_linux_init_hwbp_cap (pid);
-
   if (arm_hwcap & HWCAP_IWMMXT)
     return tdesc_arm_with_iwmmxt;
 
   if (arm_hwcap & HWCAP_VFP)
     {
-      const struct target_desc *result;
-      char *buf;
+      /* Make sure that the kernel supports reading VFP registers.  Support was
+	 added in 2.6.30.  */
+      int pid = lwpid_of (current_thread);
+      errno = 0;
+      char *buf = (char *) alloca (ARM_VFP3_REGS_SIZE);
+      if (ptrace (PTRACE_GETVFPREGS, pid, 0, buf) < 0 && errno == EIO)
+	return tdesc_arm;
 
       /* NEON implies either no VFP, or VFPv3-D32.  We only support
 	 it with VFP.  */
       if (arm_hwcap & HWCAP_NEON)
-	result = tdesc_arm_with_neon;
+	return tdesc_arm_with_neon;
       else if ((arm_hwcap & (HWCAP_VFPv3 | HWCAP_VFPv3D16)) == HWCAP_VFPv3)
-	result = tdesc_arm_with_vfpv3;
+	return tdesc_arm_with_vfpv3;
       else
-	result = tdesc_arm_with_vfpv2;
-
-      /* Now make sure that the kernel supports reading these
-	 registers.  Support was added in 2.6.30.  */
-      errno = 0;
-      buf = (char *) xmalloc (ARM_VFP3_REGS_SIZE);
-      if (ptrace (PTRACE_GETVFPREGS, pid, 0, buf) < 0
-	  && errno == EIO)
-	result = tdesc_arm;
-
-      free (buf);
-
-      return result;
+	return tdesc_arm_with_vfpv2;
     }
 
   /* The default configuration uses legacy FPA registers, probably
@@ -898,6 +883,9 @@ arm_arch_setup (void)
   int gpregs[18];
   struct iovec iov;
 
+  /* Query hardware watchpoint/breakpoint capabilities.  */
+  arm_linux_init_hwbp_cap (tid);
+
   current_process ()->tdesc = arm_read_description ();
 
   iov.iov_base = gpregs;
-- 
2.20.1 (Apple Git-117)

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

* [PATCH 7/7] Arm: Remove unused feature files and tests
  2019-07-05  9:46 [PATCH 0/7] Arm: Use feature target descriptions Alan Hayward
                   ` (3 preceding siblings ...)
  2019-07-05  9:46 ` [PATCH 2/7] Arm: Create feature files for Arm target descriptions Alan Hayward
@ 2019-07-05  9:46 ` Alan Hayward
  2019-07-05  9:46 ` [PATCH 6/7] Arm: Use read_description funcs in gdbserver Alan Hayward
  2019-07-05  9:46 ` [PATCH 5/7] Arm: Add xml unit tests Alan Hayward
  6 siblings, 0 replies; 18+ messages in thread
From: Alan Hayward @ 2019-07-05  9:46 UTC (permalink / raw)
  To: gdb-patches; +Cc: nd, Alan Hayward

Remove the xml tests. Now that it has been proven the new descriptions
are identical, there is no need to keep testing that.  Also, it would
prevent the old xml files from being removed.

Remove the old xml files from gdbserver and delete them.

gdb/ChangeLog:

2019-07-05  Alan Hayward  <alan.hayward@arm.com>

	* arm-tdep.c (_initialize_arm_tdep): Remove xml tests.
	* features/arm/arm-with-iwmmxt.c: Remove.
	* features/arm/arm-with-iwmmxt.xml: Remove.
	* features/arm/arm-with-m-fpa-layout.c: Remove.
	* features/arm/arm-with-m-fpa-layout.xml: Remove.
	* features/arm/arm-with-m-vfp-d16.c: Remove.
	* features/arm/arm-with-m-vfp-d16.xml: Remove.
	* features/arm/arm-with-m.c: Remove.
	* features/arm/arm-with-m.xml: Remove.
	* features/arm/arm-with-neon.c: Remove.
	* features/arm/arm-with-neon.xml: Remove.
	* features/arm/arm-with-vfpv2.c: Remove.
	* features/arm/arm-with-vfpv2.xml: Remove.
	* features/arm/arm-with-vfpv3.c: Remove.
	* features/arm/arm-with-vfpv3.xml: Remove.

gdb/gdbserver/ChangeLog:

2019-07-05  Alan Hayward  <alan.hayward@arm.com>

	* configure.srv: Remove Arm xml files.
---
 gdb/arm-tdep.c                             | 18 -----
 gdb/features/arm/arm-with-iwmmxt.c         | 83 ----------------------
 gdb/features/arm/arm-with-iwmmxt.xml       | 13 ----
 gdb/features/arm/arm-with-m-fpa-layout.c   | 46 ------------
 gdb/features/arm/arm-with-m-fpa-layout.xml | 46 ------------
 gdb/features/arm/arm-with-m-vfp-d16.c      | 56 ---------------
 gdb/features/arm/arm-with-m-vfp-d16.xml    | 14 ----
 gdb/features/arm/arm-with-m.c              | 37 ----------
 gdb/features/arm/arm-with-m.xml            | 12 ----
 gdb/features/arm/arm-with-neon.c           | 74 -------------------
 gdb/features/arm/arm-with-neon.xml         | 14 ----
 gdb/features/arm/arm-with-vfpv2.c          | 56 ---------------
 gdb/features/arm/arm-with-vfpv2.xml        | 13 ----
 gdb/features/arm/arm-with-vfpv3.c          | 72 -------------------
 gdb/features/arm/arm-with-vfpv3.xml        | 13 ----
 gdb/gdbserver/configure.srv                |  8 ---
 16 files changed, 575 deletions(-)
 delete mode 100644 gdb/features/arm/arm-with-iwmmxt.c
 delete mode 100644 gdb/features/arm/arm-with-iwmmxt.xml
 delete mode 100644 gdb/features/arm/arm-with-m-fpa-layout.c
 delete mode 100644 gdb/features/arm/arm-with-m-fpa-layout.xml
 delete mode 100644 gdb/features/arm/arm-with-m-vfp-d16.c
 delete mode 100644 gdb/features/arm/arm-with-m-vfp-d16.xml
 delete mode 100644 gdb/features/arm/arm-with-m.c
 delete mode 100644 gdb/features/arm/arm-with-m.xml
 delete mode 100644 gdb/features/arm/arm-with-neon.c
 delete mode 100644 gdb/features/arm/arm-with-neon.xml
 delete mode 100644 gdb/features/arm/arm-with-vfpv2.c
 delete mode 100644 gdb/features/arm/arm-with-vfpv2.xml
 delete mode 100644 gdb/features/arm/arm-with-vfpv3.c
 delete mode 100644 gdb/features/arm/arm-with-vfpv3.xml

diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c
index ea8b22d652..91a4a785ea 100644
--- a/gdb/arm-tdep.c
+++ b/gdb/arm-tdep.c
@@ -63,7 +63,6 @@
 
 #if GDB_SELF_TEST
 #include "common/selftest.h"
-#include "aarch32-tdep.h"
 #endif
 
 static int arm_debug;
@@ -9576,23 +9575,6 @@ vfp - VFP co-processor."),
 
 #if GDB_SELF_TEST
   selftests::register_test ("arm-record", selftests::arm_record_test);
-
-  const target_desc *tdesc;
-
-  tdesc = arm_read_description (ARM_FP_TYPE_VFPV2);
-  selftests::record_xml_tdesc ("arm/arm-with-vfpv2.xml", tdesc);
-  tdesc = arm_read_description (ARM_FP_TYPE_VFPV3);
-  selftests::record_xml_tdesc ("arm/arm-with-vfpv3.xml",tdesc);
-  tdesc = arm_read_description (ARM_FP_TYPE_IWMMXT);
-  selftests::record_xml_tdesc ("arm/arm-with-iwmmxt.xml", tdesc);
-  tdesc = arm_create_mprofile_target_description (ARM_M_TYPE_M_PROFILE);
-  selftests::record_xml_tdesc ("arm/arm-with-m.xml", tdesc);
-  tdesc = arm_create_mprofile_target_description (ARM_M_TYPE_VFP_D16);
-  selftests::record_xml_tdesc ("arm/arm-with-m-vfp-d16.xml", tdesc);
-  tdesc = arm_create_mprofile_target_description (ARM_M_TYPE_WITH_FPA);
-  selftests::record_xml_tdesc ("arm/arm-with-m-fpa-layout.xml", tdesc);
-  tdesc = aarch32_read_description ();
-  selftests::record_xml_tdesc ("arm/arm-with-neon.xml", tdesc);
 #endif
 
 }
diff --git a/gdb/features/arm/arm-with-iwmmxt.c b/gdb/features/arm/arm-with-iwmmxt.c
deleted file mode 100644
index 8729285a0e..0000000000
--- a/gdb/features/arm/arm-with-iwmmxt.c
+++ /dev/null
@@ -1,83 +0,0 @@
-/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
-  Original: arm-with-iwmmxt.xml */
-
-#include "defs.h"
-#include "osabi.h"
-#include "target-descriptions.h"
-
-struct target_desc *tdesc_arm_with_iwmmxt;
-static void
-initialize_tdesc_arm_with_iwmmxt (void)
-{
-  struct target_desc *result = allocate_target_description ();
-  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");
-  tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "r3", 3, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "r4", 4, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "r5", 5, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "r6", 6, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "r7", 7, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "r8", 8, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "r9", 9, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "r10", 10, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "r11", 11, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "r12", 12, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "sp", 13, 1, NULL, 32, "data_ptr");
-  tdesc_create_reg (feature, "lr", 14, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "pc", 15, 1, NULL, 32, "code_ptr");
-  tdesc_create_reg (feature, "cpsr", 25, 1, NULL, 32, "int");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.xscale.iwmmxt");
-  tdesc_type *element_type;
-  element_type = tdesc_named_type (feature, "uint8");
-  tdesc_create_vector (feature, "iwmmxt_v8u8", element_type, 8);
-
-  element_type = tdesc_named_type (feature, "uint16");
-  tdesc_create_vector (feature, "iwmmxt_v4u16", element_type, 4);
-
-  element_type = tdesc_named_type (feature, "uint32");
-  tdesc_create_vector (feature, "iwmmxt_v2u32", element_type, 2);
-
-  tdesc_type_with_fields *type_with_fields;
-  type_with_fields = tdesc_create_union (feature, "iwmmxt_vec64i");
-  tdesc_type *field_type;
-  field_type = tdesc_named_type (feature, "iwmmxt_v8u8");
-  tdesc_add_field (type_with_fields, "u8", field_type);
-  field_type = tdesc_named_type (feature, "iwmmxt_v4u16");
-  tdesc_add_field (type_with_fields, "u16", field_type);
-  field_type = tdesc_named_type (feature, "iwmmxt_v2u32");
-  tdesc_add_field (type_with_fields, "u32", field_type);
-  field_type = tdesc_named_type (feature, "uint64");
-  tdesc_add_field (type_with_fields, "u64", field_type);
-
-  tdesc_create_reg (feature, "wR0", 26, 1, NULL, 64, "iwmmxt_vec64i");
-  tdesc_create_reg (feature, "wR1", 27, 1, NULL, 64, "iwmmxt_vec64i");
-  tdesc_create_reg (feature, "wR2", 28, 1, NULL, 64, "iwmmxt_vec64i");
-  tdesc_create_reg (feature, "wR3", 29, 1, NULL, 64, "iwmmxt_vec64i");
-  tdesc_create_reg (feature, "wR4", 30, 1, NULL, 64, "iwmmxt_vec64i");
-  tdesc_create_reg (feature, "wR5", 31, 1, NULL, 64, "iwmmxt_vec64i");
-  tdesc_create_reg (feature, "wR6", 32, 1, NULL, 64, "iwmmxt_vec64i");
-  tdesc_create_reg (feature, "wR7", 33, 1, NULL, 64, "iwmmxt_vec64i");
-  tdesc_create_reg (feature, "wR8", 34, 1, NULL, 64, "iwmmxt_vec64i");
-  tdesc_create_reg (feature, "wR9", 35, 1, NULL, 64, "iwmmxt_vec64i");
-  tdesc_create_reg (feature, "wR10", 36, 1, NULL, 64, "iwmmxt_vec64i");
-  tdesc_create_reg (feature, "wR11", 37, 1, NULL, 64, "iwmmxt_vec64i");
-  tdesc_create_reg (feature, "wR12", 38, 1, NULL, 64, "iwmmxt_vec64i");
-  tdesc_create_reg (feature, "wR13", 39, 1, NULL, 64, "iwmmxt_vec64i");
-  tdesc_create_reg (feature, "wR14", 40, 1, NULL, 64, "iwmmxt_vec64i");
-  tdesc_create_reg (feature, "wR15", 41, 1, NULL, 64, "iwmmxt_vec64i");
-  tdesc_create_reg (feature, "wCSSF", 42, 1, "vector", 32, "int");
-  tdesc_create_reg (feature, "wCASF", 43, 1, "vector", 32, "int");
-  tdesc_create_reg (feature, "wCGR0", 44, 1, "vector", 32, "int");
-  tdesc_create_reg (feature, "wCGR1", 45, 1, "vector", 32, "int");
-  tdesc_create_reg (feature, "wCGR2", 46, 1, "vector", 32, "int");
-  tdesc_create_reg (feature, "wCGR3", 47, 1, "vector", 32, "int");
-
-  tdesc_arm_with_iwmmxt = result;
-}
diff --git a/gdb/features/arm/arm-with-iwmmxt.xml b/gdb/features/arm/arm-with-iwmmxt.xml
deleted file mode 100644
index 9455cb5f93..0000000000
--- a/gdb/features/arm/arm-with-iwmmxt.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0"?>
-<!-- Copyright (C) 2007-2019 Free Software Foundation, Inc.
-
-     Copying and distribution of this file, with or without modification,
-     are permitted in any medium without royalty provided the copyright
-     notice and this notice are preserved.  -->
-
-<!DOCTYPE target SYSTEM "gdb-target.dtd">
-<target>
-  <architecture>iwmmxt</architecture>
-  <xi:include href="arm-core.xml"/>
-  <xi:include href="xscale-iwmmxt.xml"/>
-</target>
diff --git a/gdb/features/arm/arm-with-m-fpa-layout.c b/gdb/features/arm/arm-with-m-fpa-layout.c
deleted file mode 100644
index 99bebc311c..0000000000
--- a/gdb/features/arm/arm-with-m-fpa-layout.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
-  Original: arm-with-m-fpa-layout.xml */
-
-#include "defs.h"
-#include "osabi.h"
-#include "target-descriptions.h"
-
-struct target_desc *tdesc_arm_with_m_fpa_layout;
-static void
-initialize_tdesc_arm_with_m_fpa_layout (void)
-{
-  struct target_desc *result = allocate_target_description ();
-  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");
-  tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r3", 3, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r4", 4, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r5", 5, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r6", 6, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r7", 7, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r8", 8, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r9", 9, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r10", 10, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r11", 11, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r12", 12, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "sp", 13, 1, NULL, 32, "data_ptr");
-  tdesc_create_reg (feature, "lr", 14, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "pc", 15, 1, NULL, 32, "code_ptr");
-  tdesc_create_reg (feature, "", 16, 1, NULL, 96, "arm_fpa_ext");
-  tdesc_create_reg (feature, "", 17, 1, NULL, 96, "arm_fpa_ext");
-  tdesc_create_reg (feature, "", 18, 1, NULL, 96, "arm_fpa_ext");
-  tdesc_create_reg (feature, "", 19, 1, NULL, 96, "arm_fpa_ext");
-  tdesc_create_reg (feature, "", 20, 1, NULL, 96, "arm_fpa_ext");
-  tdesc_create_reg (feature, "", 21, 1, NULL, 96, "arm_fpa_ext");
-  tdesc_create_reg (feature, "", 22, 1, NULL, 96, "arm_fpa_ext");
-  tdesc_create_reg (feature, "", 23, 1, NULL, 96, "arm_fpa_ext");
-  tdesc_create_reg (feature, "", 24, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "xpsr", 25, 1, NULL, 32, "int");
-
-  tdesc_arm_with_m_fpa_layout = result;
-}
diff --git a/gdb/features/arm/arm-with-m-fpa-layout.xml b/gdb/features/arm/arm-with-m-fpa-layout.xml
deleted file mode 100644
index 445fbb11ed..0000000000
--- a/gdb/features/arm/arm-with-m-fpa-layout.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0"?>
-<!-- Copyright (C) 2007-2019 Free Software Foundation, Inc.
-
-     Copying and distribution of this file, with or without modification,
-     are permitted in any medium without royalty provided the copyright
-     notice and this notice are preserved.  -->
-
-<!-- A target description for an M-profile device, for stubs that
-     transfer registers using the historical fpa layout.  -->
-
-<!DOCTYPE target SYSTEM "gdb-target.dtd">
-<target>
-<architecture>arm</architecture>
-<feature name="org.gnu.gdb.arm.m-profile">
-  <reg name="r0" bitsize="32"/>
-  <reg name="r1" bitsize="32"/>
-  <reg name="r2" bitsize="32"/>
-  <reg name="r3" bitsize="32"/>
-  <reg name="r4" bitsize="32"/>
-  <reg name="r5" bitsize="32"/>
-  <reg name="r6" bitsize="32"/>
-  <reg name="r7" bitsize="32"/>
-  <reg name="r8" bitsize="32"/>
-  <reg name="r9" bitsize="32"/>
-  <reg name="r10" bitsize="32"/>
-  <reg name="r11" bitsize="32"/>
-  <reg name="r12" bitsize="32"/>
-  <reg name="sp" bitsize="32" type="data_ptr"/>
-  <reg name="lr" bitsize="32"/>
-  <reg name="pc" bitsize="32" type="code_ptr"/>
-
-  <!-- Slack for unused FPA registers (f0-f7 + fps).
-       See arm-fpa.xml.  -->
-  <reg name="" bitsize="96" type="arm_fpa_ext" regnum="16"/>
-  <reg name="" bitsize="96" type="arm_fpa_ext"/>
-  <reg name="" bitsize="96" type="arm_fpa_ext"/>
-  <reg name="" bitsize="96" type="arm_fpa_ext"/>
-  <reg name="" bitsize="96" type="arm_fpa_ext"/>
-  <reg name="" bitsize="96" type="arm_fpa_ext"/>
-  <reg name="" bitsize="96" type="arm_fpa_ext"/>
-  <reg name="" bitsize="96" type="arm_fpa_ext"/>
-  <reg name="" bitsize="32"/>
-
-  <reg name="xpsr" bitsize="32" regnum="25"/>
-</feature>
-</target>
diff --git a/gdb/features/arm/arm-with-m-vfp-d16.c b/gdb/features/arm/arm-with-m-vfp-d16.c
deleted file mode 100644
index ab9167316a..0000000000
--- a/gdb/features/arm/arm-with-m-vfp-d16.c
+++ /dev/null
@@ -1,56 +0,0 @@
-/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
-  Original: arm-with-m-vfp-d16.xml */
-
-#include "defs.h"
-#include "osabi.h"
-#include "target-descriptions.h"
-
-struct target_desc *tdesc_arm_with_m_vfp_d16;
-static void
-initialize_tdesc_arm_with_m_vfp_d16 (void)
-{
-  struct target_desc *result = allocate_target_description ();
-  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");
-  tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r3", 3, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r4", 4, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r5", 5, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r6", 6, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r7", 7, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r8", 8, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r9", 9, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r10", 10, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r11", 11, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r12", 12, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "sp", 13, 1, NULL, 32, "data_ptr");
-  tdesc_create_reg (feature, "lr", 14, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "pc", 15, 1, NULL, 32, "code_ptr");
-  tdesc_create_reg (feature, "xpsr", 25, 1, NULL, 32, "int");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.arm.vfp");
-  tdesc_create_reg (feature, "d0", 26, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d1", 27, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d2", 28, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d3", 29, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d4", 30, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d5", 31, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d6", 32, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d7", 33, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d8", 34, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d9", 35, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d10", 36, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d11", 37, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d12", 38, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d13", 39, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d14", 40, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d15", 41, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "fpscr", 42, 1, "float", 32, "int");
-
-  tdesc_arm_with_m_vfp_d16 = result;
-}
diff --git a/gdb/features/arm/arm-with-m-vfp-d16.xml b/gdb/features/arm/arm-with-m-vfp-d16.xml
deleted file mode 100644
index b9933a8e65..0000000000
--- a/gdb/features/arm/arm-with-m-vfp-d16.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0"?>
-<!-- Copyright (C) 2010-2019 Free Software Foundation, Inc.
-
-     Copying and distribution of this file, with or without modification,
-     are permitted in any medium without royalty provided the copyright
-     notice and this notice are preserved.  -->
-
-<!DOCTYPE target SYSTEM "gdb-target.dtd">
-<target>
-  <architecture>arm</architecture>
-  <xi:include href="arm-m-profile.xml"/>
-  <!-- Layout of vfpv4-sp-d16 is identical to vfpv2 -->
-  <xi:include href="arm-vfpv2.xml"/>
-</target>
diff --git a/gdb/features/arm/arm-with-m.c b/gdb/features/arm/arm-with-m.c
deleted file mode 100644
index 619fd72430..0000000000
--- a/gdb/features/arm/arm-with-m.c
+++ /dev/null
@@ -1,37 +0,0 @@
-/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
-  Original: arm-with-m.xml */
-
-#include "defs.h"
-#include "osabi.h"
-#include "target-descriptions.h"
-
-struct target_desc *tdesc_arm_with_m;
-static void
-initialize_tdesc_arm_with_m (void)
-{
-  struct target_desc *result = allocate_target_description ();
-  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");
-  tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r3", 3, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r4", 4, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r5", 5, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r6", 6, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r7", 7, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r8", 8, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r9", 9, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r10", 10, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r11", 11, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r12", 12, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "sp", 13, 1, NULL, 32, "data_ptr");
-  tdesc_create_reg (feature, "lr", 14, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "pc", 15, 1, NULL, 32, "code_ptr");
-  tdesc_create_reg (feature, "xpsr", 25, 1, NULL, 32, "int");
-
-  tdesc_arm_with_m = result;
-}
diff --git a/gdb/features/arm/arm-with-m.xml b/gdb/features/arm/arm-with-m.xml
deleted file mode 100644
index 7ed68fa0d1..0000000000
--- a/gdb/features/arm/arm-with-m.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0"?>
-<!-- Copyright (C) 2010-2019 Free Software Foundation, Inc.
-
-     Copying and distribution of this file, with or without modification,
-     are permitted in any medium without royalty provided the copyright
-     notice and this notice are preserved.  -->
-
-<!DOCTYPE target SYSTEM "gdb-target.dtd">
-<target>
-  <architecture>arm</architecture>
-  <xi:include href="arm-m-profile.xml"/>
-</target>
diff --git a/gdb/features/arm/arm-with-neon.c b/gdb/features/arm/arm-with-neon.c
deleted file mode 100644
index 682ad758c0..0000000000
--- a/gdb/features/arm/arm-with-neon.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
-  Original: arm-with-neon.xml */
-
-#include "defs.h"
-#include "osabi.h"
-#include "target-descriptions.h"
-
-struct target_desc *tdesc_arm_with_neon;
-static void
-initialize_tdesc_arm_with_neon (void)
-{
-  struct target_desc *result = allocate_target_description ();
-  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");
-  tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "r3", 3, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "r4", 4, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "r5", 5, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "r6", 6, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "r7", 7, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "r8", 8, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "r9", 9, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "r10", 10, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "r11", 11, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "r12", 12, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "sp", 13, 1, NULL, 32, "data_ptr");
-  tdesc_create_reg (feature, "lr", 14, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "pc", 15, 1, NULL, 32, "code_ptr");
-  tdesc_create_reg (feature, "cpsr", 25, 1, NULL, 32, "int");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.arm.vfp");
-  tdesc_create_reg (feature, "d0", 26, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d1", 27, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d2", 28, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d3", 29, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d4", 30, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d5", 31, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d6", 32, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d7", 33, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d8", 34, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d9", 35, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d10", 36, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d11", 37, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d12", 38, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d13", 39, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d14", 40, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d15", 41, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d16", 42, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d17", 43, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d18", 44, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d19", 45, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d20", 46, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d21", 47, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d22", 48, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d23", 49, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d24", 50, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d25", 51, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d26", 52, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d27", 53, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d28", 54, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d29", 55, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d30", 56, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d31", 57, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "fpscr", 58, 1, "float", 32, "int");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.arm.neon");
-
-  tdesc_arm_with_neon = result;
-}
diff --git a/gdb/features/arm/arm-with-neon.xml b/gdb/features/arm/arm-with-neon.xml
deleted file mode 100644
index 8a9ade101a..0000000000
--- a/gdb/features/arm/arm-with-neon.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0"?>
-<!-- Copyright (C) 2009-2019 Free Software Foundation, Inc.
-
-     Copying and distribution of this file, with or without modification,
-     are permitted in any medium without royalty provided the copyright
-     notice and this notice are preserved.  -->
-
-<!DOCTYPE target SYSTEM "gdb-target.dtd">
-<target>
-  <architecture>arm</architecture>
-  <xi:include href="arm-core.xml"/>
-  <xi:include href="arm-vfpv3.xml"/>
-  <feature name="org.gnu.gdb.arm.neon"/>
-</target>
diff --git a/gdb/features/arm/arm-with-vfpv2.c b/gdb/features/arm/arm-with-vfpv2.c
deleted file mode 100644
index 368256ccef..0000000000
--- a/gdb/features/arm/arm-with-vfpv2.c
+++ /dev/null
@@ -1,56 +0,0 @@
-/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
-  Original: arm-with-vfpv2.xml */
-
-#include "defs.h"
-#include "osabi.h"
-#include "target-descriptions.h"
-
-struct target_desc *tdesc_arm_with_vfpv2;
-static void
-initialize_tdesc_arm_with_vfpv2 (void)
-{
-  struct target_desc *result = allocate_target_description ();
-  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");
-  tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "r3", 3, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "r4", 4, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "r5", 5, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "r6", 6, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "r7", 7, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "r8", 8, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "r9", 9, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "r10", 10, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "r11", 11, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "r12", 12, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "sp", 13, 1, NULL, 32, "data_ptr");
-  tdesc_create_reg (feature, "lr", 14, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "pc", 15, 1, NULL, 32, "code_ptr");
-  tdesc_create_reg (feature, "cpsr", 25, 1, NULL, 32, "int");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.arm.vfp");
-  tdesc_create_reg (feature, "d0", 26, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d1", 27, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d2", 28, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d3", 29, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d4", 30, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d5", 31, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d6", 32, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d7", 33, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d8", 34, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d9", 35, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d10", 36, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d11", 37, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d12", 38, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d13", 39, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d14", 40, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d15", 41, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "fpscr", 42, 1, "float", 32, "int");
-
-  tdesc_arm_with_vfpv2 = result;
-}
diff --git a/gdb/features/arm/arm-with-vfpv2.xml b/gdb/features/arm/arm-with-vfpv2.xml
deleted file mode 100644
index 881ac6385b..0000000000
--- a/gdb/features/arm/arm-with-vfpv2.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0"?>
-<!-- Copyright (C) 2009-2019 Free Software Foundation, Inc.
-
-     Copying and distribution of this file, with or without modification,
-     are permitted in any medium without royalty provided the copyright
-     notice and this notice are preserved.  -->
-
-<!DOCTYPE target SYSTEM "gdb-target.dtd">
-<target>
-  <architecture>arm</architecture>
-  <xi:include href="arm-core.xml"/>
-  <xi:include href="arm-vfpv2.xml"/>
-</target>
diff --git a/gdb/features/arm/arm-with-vfpv3.c b/gdb/features/arm/arm-with-vfpv3.c
deleted file mode 100644
index ade7c95f46..0000000000
--- a/gdb/features/arm/arm-with-vfpv3.c
+++ /dev/null
@@ -1,72 +0,0 @@
-/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
-  Original: arm-with-vfpv3.xml */
-
-#include "defs.h"
-#include "osabi.h"
-#include "target-descriptions.h"
-
-struct target_desc *tdesc_arm_with_vfpv3;
-static void
-initialize_tdesc_arm_with_vfpv3 (void)
-{
-  struct target_desc *result = allocate_target_description ();
-  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");
-  tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "r3", 3, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "r4", 4, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "r5", 5, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "r6", 6, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "r7", 7, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "r8", 8, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "r9", 9, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "r10", 10, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "r11", 11, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "r12", 12, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "sp", 13, 1, NULL, 32, "data_ptr");
-  tdesc_create_reg (feature, "lr", 14, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "pc", 15, 1, NULL, 32, "code_ptr");
-  tdesc_create_reg (feature, "cpsr", 25, 1, NULL, 32, "int");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.arm.vfp");
-  tdesc_create_reg (feature, "d0", 26, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d1", 27, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d2", 28, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d3", 29, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d4", 30, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d5", 31, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d6", 32, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d7", 33, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d8", 34, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d9", 35, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d10", 36, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d11", 37, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d12", 38, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d13", 39, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d14", 40, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d15", 41, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d16", 42, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d17", 43, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d18", 44, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d19", 45, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d20", 46, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d21", 47, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d22", 48, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d23", 49, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d24", 50, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d25", 51, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d26", 52, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d27", 53, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d28", 54, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d29", 55, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d30", 56, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "d31", 57, 1, NULL, 64, "ieee_double");
-  tdesc_create_reg (feature, "fpscr", 58, 1, "float", 32, "int");
-
-  tdesc_arm_with_vfpv3 = result;
-}
diff --git a/gdb/features/arm/arm-with-vfpv3.xml b/gdb/features/arm/arm-with-vfpv3.xml
deleted file mode 100644
index 45b9cda688..0000000000
--- a/gdb/features/arm/arm-with-vfpv3.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0"?>
-<!-- Copyright (C) 2009-2019 Free Software Foundation, Inc.
-
-     Copying and distribution of this file, with or without modification,
-     are permitted in any medium without royalty provided the copyright
-     notice and this notice are preserved.  -->
-
-<!DOCTYPE target SYSTEM "gdb-target.dtd">
-<target>
-  <architecture>arm</architecture>
-  <xi:include href="arm-core.xml"/>
-  <xi:include href="arm-vfpv3.xml"/>
-</target>
diff --git a/gdb/gdbserver/configure.srv b/gdb/gdbserver/configure.srv
index 097dc4e9db..66d3d426ac 100644
--- a/gdb/gdbserver/configure.srv
+++ b/gdb/gdbserver/configure.srv
@@ -58,14 +58,6 @@ case "${target}" in
 			srv_tgtobj="${srv_tgtobj} arch/arm.o"
 			srv_tgtobj="${srv_tgtobj} arch/arm-linux.o"
 			srv_tgtobj="${srv_tgtobj} arch/arm-get-next-pcs.o"
-			srv_xmlfiles="arm/arm-with-iwmmxt.xml"
-			srv_xmlfiles="${srv_xmlfiles} arm/arm-with-vfpv2.xml"
-			srv_xmlfiles="${srv_xmlfiles} arm/arm-with-vfpv3.xml"
-			srv_xmlfiles="${srv_xmlfiles} arm/arm-with-neon.xml"
-			srv_xmlfiles="${srv_xmlfiles} arm/arm-core.xml"
-			srv_xmlfiles="${srv_xmlfiles} arm/xscale-iwmmxt.xml"
-			srv_xmlfiles="${srv_xmlfiles} arm/arm-vfpv2.xml"
-			srv_xmlfiles="${srv_xmlfiles} arm/arm-vfpv3.xml"
 			srv_linux_usrregs=yes
 			srv_linux_regsets=yes
 			srv_linux_thread_db=yes
-- 
2.20.1 (Apple Git-117)

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

* [PATCH 0/7] Arm: Use feature target descriptions
@ 2019-07-05  9:46 Alan Hayward
  2019-07-05  9:45 ` [PATCH 3/7] Arm: Add read_description read funcs and use in GDB Alan Hayward
                   ` (6 more replies)
  0 siblings, 7 replies; 18+ messages in thread
From: Alan Hayward @ 2019-07-05  9:46 UTC (permalink / raw)
  To: gdb-patches; +Cc: nd, Alan Hayward

This set of patches is a result of me trying to figure out exactly what
is supported for Arm. It moves Arm over to using feature target descriptions,
simplifying the confusion of xml files in the features/arm/ directory.
In addition it helps to further separate out AArch32.

There are zero functional changes made by this series. The intention is
that all Arm target descriptions are identical before and after the series.
All quirks that might seem odd (for example, the Arm with NEON creates a
vfp3 feature and then a blank neon feature) have been preserved. One of the
patches adds tests to prove the new target descriptions are identical. The
final patch then removes these tests (as they block the removal of the xml
files).

One of the patches breaks the AArch64 gdbserver build, but it is fixed in
the following patch.  Preventing this would have meant including additional
unused functionality, and then removing again.

Code has been tested with AArch32, Armv7, and X86 target-all builds. I don't
have every Arm target to test this on, but the xml tests should alleviate any 
issue.


Alan Hayward (7):
  Arm: Minor style cleanups
  Arm: Create feature files for Arm target descriptions
  Arm: Add read_description read funcs and use in GDB
  Arm: Use feature target descriptions
  Arm: Add xml unit tests
  Arm: Use read_description funcs in gdbserver
  Arm: Remove unused feature files and tests

 gdb/Makefile.in                               |   5 +
 gdb/aarch32-tdep.c                            |  33 +++++
 gdb/aarch32-tdep.h                            |  25 ++++
 gdb/aarch64-linux-nat.c                       |   6 +-
 gdb/arch/aarch32.c                            |  43 +++++++
 gdb/arch/aarch32.h                            |  27 ++++
 gdb/arch/arm.c                                |  84 +++++++++++++
 gdb/arch/arm.h                                |  27 ++++
 gdb/arm-fbsd-tdep.c                           |  11 +-
 gdb/arm-linux-nat.c                           |  30 ++---
 gdb/arm-linux-tdep.c                          |  11 +-
 gdb/arm-tdep.c                                |  51 ++++----
 gdb/arm-tdep.h                                |   8 +-
 gdb/configure.tgt                             |   8 +-
 gdb/features/Makefile                         |  30 ++---
 gdb/features/arm/arm-core.c                   |  31 +++++
 gdb/features/arm/arm-fpa.c                    |  23 ++++
 gdb/features/arm/arm-m-profile-with-fpa.c     |  39 ++++++
 ...-layout.xml => arm-m-profile-with-fpa.xml} |  13 +-
 gdb/features/arm/arm-m-profile.c              |  31 +++++
 gdb/features/arm/arm-vfpv2.c                  |  30 +++++
 gdb/features/arm/arm-vfpv3.c                  |  46 +++++++
 gdb/features/arm/arm-with-iwmmxt.c            |  83 -------------
 gdb/features/arm/arm-with-iwmmxt.xml          |  13 --
 gdb/features/arm/arm-with-m-fpa-layout.c      |  46 -------
 gdb/features/arm/arm-with-m-vfp-d16.c         |  56 ---------
 gdb/features/arm/arm-with-m-vfp-d16.xml       |  14 ---
 gdb/features/arm/arm-with-m.c                 |  37 ------
 gdb/features/arm/arm-with-m.xml               |  12 --
 gdb/features/arm/arm-with-neon.c              |  74 -----------
 gdb/features/arm/arm-with-neon.xml            |  14 ---
 gdb/features/arm/arm-with-vfpv2.c             |  56 ---------
 gdb/features/arm/arm-with-vfpv2.xml           |  13 --
 gdb/features/arm/arm-with-vfpv3.c             |  72 -----------
 gdb/features/arm/arm-with-vfpv3.xml           |  13 --
 gdb/features/arm/xscale-iwmmxt.c              |  57 +++++++++
 gdb/gdbserver/configure.srv                   |  22 ++--
 gdb/gdbserver/linux-aarch32-low.c             |   2 -
 gdb/gdbserver/linux-aarch32-low.h             |   2 -
 gdb/gdbserver/linux-aarch32-tdesc.c           |  46 +++++++
 gdb/gdbserver/linux-aarch32-tdesc.h           |  29 +++++
 gdb/gdbserver/linux-aarch64-low.c             |   3 +-
 gdb/gdbserver/linux-arm-low.c                 | 115 ++++++++----------
 gdb/gdbserver/linux-arm-tdesc.c               |  62 ++++++++++
 gdb/gdbserver/linux-arm-tdesc.h               |  29 +++++
 gdb/target-descriptions.c                     |   3 +-
 46 files changed, 810 insertions(+), 675 deletions(-)
 create mode 100644 gdb/aarch32-tdep.c
 create mode 100644 gdb/aarch32-tdep.h
 create mode 100644 gdb/arch/aarch32.c
 create mode 100644 gdb/arch/aarch32.h
 create mode 100644 gdb/features/arm/arm-core.c
 create mode 100644 gdb/features/arm/arm-fpa.c
 create mode 100644 gdb/features/arm/arm-m-profile-with-fpa.c
 rename gdb/features/arm/{arm-with-m-fpa-layout.xml => arm-m-profile-with-fpa.xml} (78%)
 create mode 100644 gdb/features/arm/arm-m-profile.c
 create mode 100644 gdb/features/arm/arm-vfpv2.c
 create mode 100644 gdb/features/arm/arm-vfpv3.c
 delete mode 100644 gdb/features/arm/arm-with-iwmmxt.c
 delete mode 100644 gdb/features/arm/arm-with-iwmmxt.xml
 delete mode 100644 gdb/features/arm/arm-with-m-fpa-layout.c
 delete mode 100644 gdb/features/arm/arm-with-m-vfp-d16.c
 delete mode 100644 gdb/features/arm/arm-with-m-vfp-d16.xml
 delete mode 100644 gdb/features/arm/arm-with-m.c
 delete mode 100644 gdb/features/arm/arm-with-m.xml
 delete mode 100644 gdb/features/arm/arm-with-neon.c
 delete mode 100644 gdb/features/arm/arm-with-neon.xml
 delete mode 100644 gdb/features/arm/arm-with-vfpv2.c
 delete mode 100644 gdb/features/arm/arm-with-vfpv2.xml
 delete mode 100644 gdb/features/arm/arm-with-vfpv3.c
 delete mode 100644 gdb/features/arm/arm-with-vfpv3.xml
 create mode 100644 gdb/features/arm/xscale-iwmmxt.c
 create mode 100644 gdb/gdbserver/linux-aarch32-tdesc.c
 create mode 100644 gdb/gdbserver/linux-aarch32-tdesc.h
 create mode 100644 gdb/gdbserver/linux-arm-tdesc.c
 create mode 100644 gdb/gdbserver/linux-arm-tdesc.h

-- 
2.20.1 (Apple Git-117)

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

* [PATCH 2/7] Arm: Create feature files for Arm target descriptions
  2019-07-05  9:46 [PATCH 0/7] Arm: Use feature target descriptions Alan Hayward
                   ` (2 preceding siblings ...)
  2019-07-05  9:46 ` [PATCH 1/7] Arm: Minor style cleanups Alan Hayward
@ 2019-07-05  9:46 ` Alan Hayward
  2019-07-10  2:56   ` Simon Marchi
  2019-07-05  9:46 ` [PATCH 7/7] Arm: Remove unused feature files and tests Alan Hayward
                   ` (2 subsequent siblings)
  6 siblings, 1 reply; 18+ messages in thread
From: Alan Hayward @ 2019-07-05  9:46 UTC (permalink / raw)
  To: gdb-patches; +Cc: nd, Alan Hayward

Add Arm to the list of feature target description targets and generate the
relevant C files.

Add arm-m-profile-with-fpa.xml as the feature version of the exisiting
arm-with-m-fpa-layout.xml.

Add extra comments to the Makefile for readability.

New files are not yet used.

gdb/ChangeLog:

2019-07-05  Alan Hayward  <alan.hayward@arm.com>

	* features/Makefile: Use feature target descriptions for Arm.
	* features/arm/arm-core.c: Generate new file.
	* features/arm/arm-fpa.c: Likewise.
	* features/arm/arm-m-profile-with-fpa.xml: Likewise.
	* features/arm/arm-m-profile.c: Likewise.
	* features/arm/arm-vfpv2.c: Likewise.
	* features/arm/arm-vfpv3.c: Likewise.
	* features/arm/xscale-iwmmxt.c: Likewise.
	* target-descriptions.c (maint_print_c_tdesc_cmd): Add Arm.
---
 gdb/features/Makefile                       | 30 ++++++-----
 gdb/features/arm/arm-core.c                 | 31 +++++++++++
 gdb/features/arm/arm-fpa.c                  | 23 +++++++++
 gdb/features/arm/arm-m-profile-with-fpa.c   | 39 ++++++++++++++
 gdb/features/arm/arm-m-profile-with-fpa.xml | 39 ++++++++++++++
 gdb/features/arm/arm-m-profile.c            | 31 +++++++++++
 gdb/features/arm/arm-vfpv2.c                | 30 +++++++++++
 gdb/features/arm/arm-vfpv3.c                | 46 +++++++++++++++++
 gdb/features/arm/xscale-iwmmxt.c            | 57 +++++++++++++++++++++
 gdb/target-descriptions.c                   |  3 +-
 10 files changed, 314 insertions(+), 15 deletions(-)
 create mode 100644 gdb/features/arm/arm-core.c
 create mode 100644 gdb/features/arm/arm-fpa.c
 create mode 100644 gdb/features/arm/arm-m-profile-with-fpa.c
 create mode 100644 gdb/features/arm/arm-m-profile-with-fpa.xml
 create mode 100644 gdb/features/arm/arm-m-profile.c
 create mode 100644 gdb/features/arm/arm-vfpv2.c
 create mode 100644 gdb/features/arm/arm-vfpv3.c
 create mode 100644 gdb/features/arm/xscale-iwmmxt.c

diff --git a/gdb/features/Makefile b/gdb/features/Makefile
index 3b57124b04..0c84faf405 100644
--- a/gdb/features/Makefile
+++ b/gdb/features/Makefile
@@ -38,11 +38,12 @@
 #
 #   make GDB=/path/to/gdb clean-cfiles cfiles
 #
-# To generate specific C files, you can override the XMLTOC make
-# variable:
+# To generate specific C files, you can override the XMLTOC and
+# FEATURE_XMLFILES make variables:
 #
-#   make GDB=/path/to/gdb XMLTOC="xml files" cfiles
+#   make GDB=/path/to/gdb XMLTOC="xml files" FEATURE_XMLFILES="xml files" cfiles
 
+# List of .dat files to create in ../regformats/
 WHICH = arm/arm-with-iwmmxt arm/arm-with-vfpv2 arm/arm-with-vfpv3 \
 	arm/arm-with-neon \
 	mips-linux mips-dsp-linux \
@@ -103,20 +104,14 @@ XSLTPROC = xsltproc
 outdir = ../regformats
 OUTPUTS = $(patsubst %,$(outdir)/%.dat,$(WHICH))
 
-# The set of xml files we'll generate .c files for GDB from.  By
+# For targets without feature based target descriptions,
+# the set of xml files we'll generate .c files for GDB from.  By
 # default we'll build all .c files, which requires an
 # --enable-targets=all GDB.  You can override this by passing XMLTOC
 # to make on the command line.
 XMLTOC = \
 	arc-v2.xml \
 	arc-arcompact.xml \
-	arm/arm-with-iwmmxt.xml \
-	arm/arm-with-m-fpa-layout.xml \
-	arm/arm-with-m-vfp-d16.xml \
-	arm/arm-with-m.xml \
-	arm/arm-with-neon.xml \
-	arm/arm-with-vfpv2.xml \
-	arm/arm-with-vfpv3.xml \
 	microblaze-with-stack-protect.xml \
 	microblaze.xml \
 	mips-dsp-linux.xml \
@@ -189,6 +184,7 @@ GDB = false
 
 #Targets which use feature based target descriptions.
 aarch64-feature = 1
+arm-feature = 1
 i386-feature = 1
 riscv-feature = 1
 tic6x-feature = 1
@@ -208,9 +204,18 @@ $(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
 
+# For targets with feature based target descriptions,
+# the set of xml files we'll generate .c files for GDB from.
 FEATURE_XMLFILES = aarch64-core.xml \
 	aarch64-fpu.xml \
 	aarch64-pauth.xml \
+	arm/arm-core.xml \
+	arm/arm-fpa.xml \
+	arm/arm-m-profile.xml \
+	arm/arm-m-profile-with-fpa.xml \
+	arm/arm-vfpv2.xml \
+	arm/arm-vfpv3.xml \
+	arm/xscale-iwmmxt.xml \
 	i386/32bit-core.xml \
 	i386/32bit-sse.xml \
 	i386/32bit-linux.xml \
@@ -263,9 +268,6 @@ $(FEATURE_CFILES): %.c: %.xml.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
-
 # Regenerate RISC-V CSR feature lists.
 riscv/32bit-csr.xml riscv/64bit-csr.xml: ../../include/opcode/riscv-opc.h
 	./riscv/rebuild-csr-xml.sh ../../include/opcode/riscv-opc.h ./riscv
diff --git a/gdb/features/arm/arm-core.c b/gdb/features/arm/arm-core.c
new file mode 100644
index 0000000000..d2f26d6f80
--- /dev/null
+++ b/gdb/features/arm/arm-core.c
@@ -0,0 +1,31 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: arm-core.xml */
+
+#include "common/tdesc.h"
+
+static int
+create_feature_arm_arm_core (struct target_desc *result, long regnum)
+{
+  struct tdesc_feature *feature;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.arm.core");
+  tdesc_create_reg (feature, "r0", regnum++, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r1", regnum++, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r2", regnum++, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r3", regnum++, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r4", regnum++, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r5", regnum++, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r6", regnum++, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r7", regnum++, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r8", regnum++, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r9", regnum++, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r10", regnum++, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r11", regnum++, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r12", regnum++, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "sp", regnum++, 1, NULL, 32, "data_ptr");
+  tdesc_create_reg (feature, "lr", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "pc", regnum++, 1, NULL, 32, "code_ptr");
+  regnum = 25;
+  tdesc_create_reg (feature, "cpsr", regnum++, 1, NULL, 32, "int");
+  return regnum;
+}
diff --git a/gdb/features/arm/arm-fpa.c b/gdb/features/arm/arm-fpa.c
new file mode 100644
index 0000000000..1988c376a4
--- /dev/null
+++ b/gdb/features/arm/arm-fpa.c
@@ -0,0 +1,23 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: arm-fpa.xml */
+
+#include "common/tdesc.h"
+
+static int
+create_feature_arm_arm_fpa (struct target_desc *result, long regnum)
+{
+  struct tdesc_feature *feature;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.arm.fpa");
+  regnum = 16;
+  tdesc_create_reg (feature, "f0", regnum++, 1, NULL, 96, "arm_fpa_ext");
+  tdesc_create_reg (feature, "f1", regnum++, 1, NULL, 96, "arm_fpa_ext");
+  tdesc_create_reg (feature, "f2", regnum++, 1, NULL, 96, "arm_fpa_ext");
+  tdesc_create_reg (feature, "f3", regnum++, 1, NULL, 96, "arm_fpa_ext");
+  tdesc_create_reg (feature, "f4", regnum++, 1, NULL, 96, "arm_fpa_ext");
+  tdesc_create_reg (feature, "f5", regnum++, 1, NULL, 96, "arm_fpa_ext");
+  tdesc_create_reg (feature, "f6", regnum++, 1, NULL, 96, "arm_fpa_ext");
+  tdesc_create_reg (feature, "f7", regnum++, 1, NULL, 96, "arm_fpa_ext");
+  tdesc_create_reg (feature, "fps", regnum++, 1, NULL, 32, "int");
+  return regnum;
+}
diff --git a/gdb/features/arm/arm-m-profile-with-fpa.c b/gdb/features/arm/arm-m-profile-with-fpa.c
new file mode 100644
index 0000000000..ea6b098935
--- /dev/null
+++ b/gdb/features/arm/arm-m-profile-with-fpa.c
@@ -0,0 +1,39 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: arm-m-profile-with-fpa.xml */
+
+#include "common/tdesc.h"
+
+static int
+create_feature_arm_arm_m_profile_with_fpa (struct target_desc *result, long regnum)
+{
+  struct tdesc_feature *feature;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.arm.m-profile");
+  tdesc_create_reg (feature, "r0", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r1", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r2", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r3", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r4", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r5", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r6", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r7", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r8", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r9", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r10", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r11", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r12", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "sp", regnum++, 1, NULL, 32, "data_ptr");
+  tdesc_create_reg (feature, "lr", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "pc", regnum++, 1, NULL, 32, "code_ptr");
+  tdesc_create_reg (feature, "", regnum++, 1, NULL, 96, "arm_fpa_ext");
+  tdesc_create_reg (feature, "", regnum++, 1, NULL, 96, "arm_fpa_ext");
+  tdesc_create_reg (feature, "", regnum++, 1, NULL, 96, "arm_fpa_ext");
+  tdesc_create_reg (feature, "", regnum++, 1, NULL, 96, "arm_fpa_ext");
+  tdesc_create_reg (feature, "", regnum++, 1, NULL, 96, "arm_fpa_ext");
+  tdesc_create_reg (feature, "", regnum++, 1, NULL, 96, "arm_fpa_ext");
+  tdesc_create_reg (feature, "", regnum++, 1, NULL, 96, "arm_fpa_ext");
+  tdesc_create_reg (feature, "", regnum++, 1, NULL, 96, "arm_fpa_ext");
+  tdesc_create_reg (feature, "", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "xpsr", regnum++, 1, NULL, 32, "int");
+  return regnum;
+}
diff --git a/gdb/features/arm/arm-m-profile-with-fpa.xml b/gdb/features/arm/arm-m-profile-with-fpa.xml
new file mode 100644
index 0000000000..91e183c2dc
--- /dev/null
+++ b/gdb/features/arm/arm-m-profile-with-fpa.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2019 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.arm.m-profile">
+  <reg name="r0" bitsize="32"/>
+  <reg name="r1" bitsize="32"/>
+  <reg name="r2" bitsize="32"/>
+  <reg name="r3" bitsize="32"/>
+  <reg name="r4" bitsize="32"/>
+  <reg name="r5" bitsize="32"/>
+  <reg name="r6" bitsize="32"/>
+  <reg name="r7" bitsize="32"/>
+  <reg name="r8" bitsize="32"/>
+  <reg name="r9" bitsize="32"/>
+  <reg name="r10" bitsize="32"/>
+  <reg name="r11" bitsize="32"/>
+  <reg name="r12" bitsize="32"/>
+  <reg name="sp" bitsize="32" type="data_ptr"/>
+  <reg name="lr" bitsize="32"/>
+  <reg name="pc" bitsize="32" type="code_ptr"/>
+
+  <!-- Slack for unused FPA registers (f0-f7 + fps).  -->
+  <reg name="" bitsize="96" type="arm_fpa_ext" regnum="16"/>
+  <reg name="" bitsize="96" type="arm_fpa_ext"/>
+  <reg name="" bitsize="96" type="arm_fpa_ext"/>
+  <reg name="" bitsize="96" type="arm_fpa_ext"/>
+  <reg name="" bitsize="96" type="arm_fpa_ext"/>
+  <reg name="" bitsize="96" type="arm_fpa_ext"/>
+  <reg name="" bitsize="96" type="arm_fpa_ext"/>
+  <reg name="" bitsize="96" type="arm_fpa_ext"/>
+  <reg name="" bitsize="32"/>
+
+  <reg name="xpsr" bitsize="32" regnum="25"/>
+</feature>
diff --git a/gdb/features/arm/arm-m-profile.c b/gdb/features/arm/arm-m-profile.c
new file mode 100644
index 0000000000..ea14528fc7
--- /dev/null
+++ b/gdb/features/arm/arm-m-profile.c
@@ -0,0 +1,31 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: arm-m-profile.xml */
+
+#include "common/tdesc.h"
+
+static int
+create_feature_arm_arm_m_profile (struct target_desc *result, long regnum)
+{
+  struct tdesc_feature *feature;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.arm.m-profile");
+  tdesc_create_reg (feature, "r0", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r1", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r2", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r3", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r4", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r5", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r6", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r7", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r8", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r9", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r10", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r11", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r12", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "sp", regnum++, 1, NULL, 32, "data_ptr");
+  tdesc_create_reg (feature, "lr", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "pc", regnum++, 1, NULL, 32, "code_ptr");
+  regnum = 25;
+  tdesc_create_reg (feature, "xpsr", regnum++, 1, NULL, 32, "int");
+  return regnum;
+}
diff --git a/gdb/features/arm/arm-vfpv2.c b/gdb/features/arm/arm-vfpv2.c
new file mode 100644
index 0000000000..db5c16bb1d
--- /dev/null
+++ b/gdb/features/arm/arm-vfpv2.c
@@ -0,0 +1,30 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: arm-vfpv2.xml */
+
+#include "common/tdesc.h"
+
+static int
+create_feature_arm_arm_vfpv2 (struct target_desc *result, long regnum)
+{
+  struct tdesc_feature *feature;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.arm.vfp");
+  tdesc_create_reg (feature, "d0", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d1", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d2", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d3", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d4", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d5", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d6", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d7", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d8", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d9", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d10", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d11", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d12", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d13", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d14", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d15", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "fpscr", regnum++, 1, "float", 32, "int");
+  return regnum;
+}
diff --git a/gdb/features/arm/arm-vfpv3.c b/gdb/features/arm/arm-vfpv3.c
new file mode 100644
index 0000000000..93e5f3cc36
--- /dev/null
+++ b/gdb/features/arm/arm-vfpv3.c
@@ -0,0 +1,46 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: arm-vfpv3.xml */
+
+#include "common/tdesc.h"
+
+static int
+create_feature_arm_arm_vfpv3 (struct target_desc *result, long regnum)
+{
+  struct tdesc_feature *feature;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.arm.vfp");
+  tdesc_create_reg (feature, "d0", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d1", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d2", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d3", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d4", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d5", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d6", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d7", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d8", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d9", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d10", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d11", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d12", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d13", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d14", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d15", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d16", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d17", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d18", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d19", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d20", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d21", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d22", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d23", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d24", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d25", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d26", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d27", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d28", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d29", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d30", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d31", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "fpscr", regnum++, 1, "float", 32, "int");
+  return regnum;
+}
diff --git a/gdb/features/arm/xscale-iwmmxt.c b/gdb/features/arm/xscale-iwmmxt.c
new file mode 100644
index 0000000000..60dae40606
--- /dev/null
+++ b/gdb/features/arm/xscale-iwmmxt.c
@@ -0,0 +1,57 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: xscale-iwmmxt.xml */
+
+#include "common/tdesc.h"
+
+static int
+create_feature_arm_xscale_iwmmxt (struct target_desc *result, long regnum)
+{
+  struct tdesc_feature *feature;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.xscale.iwmmxt");
+  tdesc_type *element_type;
+  element_type = tdesc_named_type (feature, "uint8");
+  tdesc_create_vector (feature, "iwmmxt_v8u8", element_type, 8);
+
+  element_type = tdesc_named_type (feature, "uint16");
+  tdesc_create_vector (feature, "iwmmxt_v4u16", element_type, 4);
+
+  element_type = tdesc_named_type (feature, "uint32");
+  tdesc_create_vector (feature, "iwmmxt_v2u32", element_type, 2);
+
+  tdesc_type_with_fields *type_with_fields;
+  type_with_fields = tdesc_create_union (feature, "iwmmxt_vec64i");
+  tdesc_type *field_type;
+  field_type = tdesc_named_type (feature, "iwmmxt_v8u8");
+  tdesc_add_field (type_with_fields, "u8", field_type);
+  field_type = tdesc_named_type (feature, "iwmmxt_v4u16");
+  tdesc_add_field (type_with_fields, "u16", field_type);
+  field_type = tdesc_named_type (feature, "iwmmxt_v2u32");
+  tdesc_add_field (type_with_fields, "u32", field_type);
+  field_type = tdesc_named_type (feature, "uint64");
+  tdesc_add_field (type_with_fields, "u64", field_type);
+
+  tdesc_create_reg (feature, "wR0", regnum++, 1, NULL, 64, "iwmmxt_vec64i");
+  tdesc_create_reg (feature, "wR1", regnum++, 1, NULL, 64, "iwmmxt_vec64i");
+  tdesc_create_reg (feature, "wR2", regnum++, 1, NULL, 64, "iwmmxt_vec64i");
+  tdesc_create_reg (feature, "wR3", regnum++, 1, NULL, 64, "iwmmxt_vec64i");
+  tdesc_create_reg (feature, "wR4", regnum++, 1, NULL, 64, "iwmmxt_vec64i");
+  tdesc_create_reg (feature, "wR5", regnum++, 1, NULL, 64, "iwmmxt_vec64i");
+  tdesc_create_reg (feature, "wR6", regnum++, 1, NULL, 64, "iwmmxt_vec64i");
+  tdesc_create_reg (feature, "wR7", regnum++, 1, NULL, 64, "iwmmxt_vec64i");
+  tdesc_create_reg (feature, "wR8", regnum++, 1, NULL, 64, "iwmmxt_vec64i");
+  tdesc_create_reg (feature, "wR9", regnum++, 1, NULL, 64, "iwmmxt_vec64i");
+  tdesc_create_reg (feature, "wR10", regnum++, 1, NULL, 64, "iwmmxt_vec64i");
+  tdesc_create_reg (feature, "wR11", regnum++, 1, NULL, 64, "iwmmxt_vec64i");
+  tdesc_create_reg (feature, "wR12", regnum++, 1, NULL, 64, "iwmmxt_vec64i");
+  tdesc_create_reg (feature, "wR13", regnum++, 1, NULL, 64, "iwmmxt_vec64i");
+  tdesc_create_reg (feature, "wR14", regnum++, 1, NULL, 64, "iwmmxt_vec64i");
+  tdesc_create_reg (feature, "wR15", regnum++, 1, NULL, 64, "iwmmxt_vec64i");
+  tdesc_create_reg (feature, "wCSSF", regnum++, 1, "vector", 32, "int");
+  tdesc_create_reg (feature, "wCASF", regnum++, 1, "vector", 32, "int");
+  tdesc_create_reg (feature, "wCGR0", regnum++, 1, "vector", 32, "int");
+  tdesc_create_reg (feature, "wCGR1", regnum++, 1, "vector", 32, "int");
+  tdesc_create_reg (feature, "wCGR2", regnum++, 1, "vector", 32, "int");
+  tdesc_create_reg (feature, "wCGR3", regnum++, 1, "vector", 32, "int");
+  return regnum;
+}
diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c
index bd33091ba9..1c9d537745 100644
--- a/gdb/target-descriptions.c
+++ b/gdb/target-descriptions.c
@@ -1715,7 +1715,8 @@ maint_print_c_tdesc_cmd (const char *args, int from_tty)
       || startswith (filename_after_features.c_str (), "i386/x32-core.xml")
       || startswith (filename_after_features.c_str (), "riscv/")
       || startswith (filename_after_features.c_str (), "tic6x-")
-      || startswith (filename_after_features.c_str (), "aarch64"))
+      || startswith (filename_after_features.c_str (), "aarch64")
+      || startswith (filename_after_features.c_str (), "arm/"))
     {
       print_c_feature v (filename_after_features);
 
-- 
2.20.1 (Apple Git-117)

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

* Re: [PATCH 2/7] Arm: Create feature files for Arm target descriptions
  2019-07-05  9:46 ` [PATCH 2/7] Arm: Create feature files for Arm target descriptions Alan Hayward
@ 2019-07-10  2:56   ` Simon Marchi
  2019-07-10 13:22     ` Alan Hayward
  0 siblings, 1 reply; 18+ messages in thread
From: Simon Marchi @ 2019-07-10  2:56 UTC (permalink / raw)
  To: Alan Hayward, gdb-patches; +Cc: nd

On 2019-07-05 5:45 a.m., Alan Hayward wrote:
> Add Arm to the list of feature target description targets and generate the
> relevant C files.
> 
> Add arm-m-profile-with-fpa.xml as the feature version of the exisiting
> arm-with-m-fpa-layout.xml.
> 
> Add extra comments to the Makefile for readability.
> 
> New files are not yet used.

Hi Alan,

Note that you'll need to re-generate these files following the renaming
of common to gdbsupport.  It should not be a big deal though.

However, when I try to re-generate the C files, I get this spurious diff:

diff --git a/gdb/features/aarch64-pauth.c b/gdb/features/aarch64-pauth.c
index 931e6cb28410..7bd73a6b21d9 100644
--- a/gdb/features/aarch64-pauth.c
+++ b/gdb/features/aarch64-pauth.c
@@ -11,6 +11,5 @@ create_feature_aarch64_pauth (struct target_desc *result, long regnum)
   feature = tdesc_create_feature (result, "org.gnu.gdb.aarch64.pauth");
   tdesc_create_reg (feature, "pauth_dmask", regnum++, 1, NULL, 64, "int");
   tdesc_create_reg (feature, "pauth_cmask", regnum++, 1, NULL, 64, "int");
-
   return regnum;
 }

Do you see it too?  If so, would you mind just pushing an obvious patch to
fix it?

This patch LGTM, at least the features/Makefile and target-descriptions.c parts
(the arm parts look good too but I don't really know the specifics of the
architecture).

Thanks!

Simon

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

* Re: [PATCH 3/7] Arm: Add read_description read funcs and use in GDB
  2019-07-05  9:45 ` [PATCH 3/7] Arm: Add read_description read funcs and use in GDB Alan Hayward
@ 2019-07-10  3:45   ` Simon Marchi
  2019-07-10 13:52     ` Alan Hayward
  0 siblings, 1 reply; 18+ messages in thread
From: Simon Marchi @ 2019-07-10  3:45 UTC (permalink / raw)
  To: Alan Hayward, gdb-patches; +Cc: nd

On 2019-07-05 5:45 a.m., Alan Hayward wrote:
> Switch the Arm target to get target descriptions via arm_read_description
> and aarch32_read_description, in the same style as other feature targets.
> Add an enum to specify the different types - this will also be of use to
> gdbserver in a later patch.
> 
> Call arm_create_mprofile_target_description directly as these will only be
> called the once, therefore they do not need caching.

I was going to point out "called the once", because it sounds strange to me,
but there is another instance of it in function arm_register_g_packet_guesses,
so maybe it's ok?

> diff --git a/gdb/Makefile.in b/gdb/Makefile.in
> index 7308ea5767..9352dd92ff 100644
> --- a/gdb/Makefile.in
> +++ b/gdb/Makefile.in
> @@ -665,7 +665,9 @@ ALL_64_TARGET_OBS = \
>  
>  # All other target-dependent objects files (used with --enable-targets=all).
>  ALL_TARGET_OBS = \
> +	aarch32-tdep.o \
>  	arc-tdep.o \
> +	arch/aarch32.o \
>  	arch/arm.o \
>  	arch/arm-get-next-pcs.o \
>  	arch/arm-linux.o \
> @@ -1184,6 +1186,7 @@ SFILES = \
>  # right, it is probably easiest just to list .h files here directly.
>  
>  HFILES_NO_SRCDIR = \
> +	aarch32-tdep.h \
>  	aarch64-ravenscar-thread.h \
>  	aarch64-tdep.h \
>  	ada-lang.h \
> @@ -1431,6 +1434,7 @@ HFILES_NO_SRCDIR = \
>  	xtensa-tdep.h \
>  	arch/aarch64.h \
>  	arch/aarch64-insn.h \
> +	arch/aarch32.h \

This line should go above the aarch64 ones.

> diff --git a/gdb/aarch32-tdep.c b/gdb/aarch32-tdep.c
> new file mode 100644
> index 0000000000..d9355d0665
> --- /dev/null
> +++ b/gdb/aarch32-tdep.c
> @@ -0,0 +1,33 @@
> +/* Copyright (C) 2019 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 "common/common-defs.h"
> +#include "common/common-regcache.h"
> +#include "arch/aarch32.h"
> +
> +struct target_desc *tdesc_aarch32;

static

> +
> +/* See linux-aarch32-tdep.h.  */

/* See aarch32-tdep.h.  */

> diff --git a/gdb/arch/aarch32.c b/gdb/arch/aarch32.c
> new file mode 100644
> index 0000000000..f3cb8c7855
> --- /dev/null
> +++ b/gdb/arch/aarch32.c
> @@ -0,0 +1,29 @@
> +/* Copyright (C) 2019 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 "common/common-defs.h"
> +#include "aarch32.h"
> +
> +extern struct target_desc *tdesc_arm_with_neon;
> +
> +/* See aarch32.h.  */
> +
> +target_desc *
> +aarch32_create_target_description ()
> +{
> +  return tdesc_arm_with_neon;
> +}

Can you briefly explain the difference (from the point of view of GDB) between the
ARM and AArch32 architecture?  My current understanding is that AArch32 is Arm(v7?)
emulation on AArch64, so they are very close.  But there might be some subtle
differences, requiring GDB to consider them as different architectures.

Edit: I now went through the patch and saw the configure.in change.  My guess would
now be that it allows to include in an AArch64 build just what's actually supported
by the AArch32 mode, which is arm-with-neon, without having to pull the entire Arm
support.  Does that sound right?

> diff --git a/gdb/arch/arm.c b/gdb/arch/arm.c
> index 93738f0a0f..37806753cb 100644
> --- a/gdb/arch/arm.c
> +++ b/gdb/arch/arm.c
> @@ -21,6 +21,15 @@
>  #include "common/common-regcache.h"
>  #include "arm.h"
>  
> +extern struct target_desc *tdesc_arm_with_vfpv2;
> +extern struct target_desc *tdesc_arm_with_vfpv3;
> +extern struct target_desc *tdesc_arm_with_iwmmxt;
> +#ifndef GDBSERVER
> +extern struct target_desc *tdesc_arm_with_m;
> +extern struct target_desc *tdesc_arm_with_m_vfp_d16;
> +extern struct target_desc *tdesc_arm_with_m_fpa_layout;
> +#endif
> +
>  /* See arm.h.  */
>  
>  int
> @@ -372,3 +381,49 @@ shifted_reg_val (struct regcache *regcache, unsigned long inst,
>  
>    return res & 0xffffffff;
>  }
> +
> +/* See arch/arm.h.  */
> +
> +target_desc *
> +arm_create_target_description (arm_fp_type fp_type)
> +{
> +  switch (fp_type)
> +    {
> +    case ARM_FP_TYPE_NONE:
> +      return nullptr;
> +
> +    case ARM_FP_TYPE_VFPV2:
> +      return tdesc_arm_with_vfpv2;
> +
> +    case ARM_FP_TYPE_VFPV3:
> +      return tdesc_arm_with_vfpv3;
> +
> +    case ARM_FP_TYPE_IWMMXT:
> +      return tdesc_arm_with_iwmmxt;
> +
> +    default:
> +      error (_("Invalid Arm FP type: %d"), fp_type);
> +    }
> +}
> +
> +/* See arch/arm.h.  */
> +
> +target_desc *
> +arm_create_mprofile_target_description (arm_m_profile_type m_type)
> +{
> +  switch (m_type)
> +    {
> +#ifndef GDBSERVER
> +    case ARM_M_TYPE_M_PROFILE:
> +      return tdesc_arm_with_m;
> +
> +    case ARM_M_TYPE_VFP_D16:
> +      return tdesc_arm_with_m_fpa_layout;
> +
> +    case ARM_M_TYPE_WITH_FPA:
> +      return tdesc_arm_with_m_vfp_d16;
> +#endif
> +    default:
> +      error (_("Invalid Arm M type: %d"), m_type);
> +    }
> +}

If it doesn't make sense to have this function shared with GDBserver (given
that GDBserver doesn't run on Cortex-Ms), it should probably go in gdb/arm-tdep.c.

> diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c
> index 8e3607cdea..f3f6458a27 100644
> --- a/gdb/arm-tdep.c
> +++ b/gdb/arm-tdep.c
> @@ -240,6 +240,9 @@ static const char **valid_disassembly_styles;
>  /* Disassembly style to use. Default to "std" register names.  */
>  static const char *disassembly_style;
>  
> +/* All possible arm target descriptors.  */
> +struct target_desc *tdesc_arm_list[ARM_FP_TYPE_INVALID];

static

> +
>  /* This is used to keep the bfd arch_info in sync with the disassembly
>     style.  */
>  static void set_disassembly_style_sfunc (const char *, int,
> @@ -8763,7 +8766,6 @@ arm_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
>      return default_register_reggroup_p (gdbarch, regnum, group);
>  }
>  
> -\f
>  /* For backward-compatibility we allow two 'g' packet lengths with
>     the remote protocol depending on whether FPA registers are
>     supplied.  M-profile targets do not have FPA registers, but some
> @@ -8777,21 +8779,29 @@ arm_register_g_packet_guesses (struct gdbarch *gdbarch)
>  {
>    if (gdbarch_tdep (gdbarch)->is_m)
>      {
> +      const target_desc *tdesc;
> +
> +      /* This function is only called the once, therefore it's safe to call the
> +	 tdesc creation function directly.  */

The other instance of "called the once".

Would it be "unsafe" to call tdesc creation functions multiple times in general?  I
thought it was just a question of efficiency/caching.  If so, I'd say "therefore
it's not worth caching the descriptions".

It might be true that they are called only once today (I guess because the only way to
debug them in practice is through some server that only support debugging one at the
time), but it could change eventually.  For example, with multi-target, you could
connect to two of them.  Since it's not really difficult, I'd use the same caching pattern
as for the other ones.

Thanks,

Simon

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

* Re: [PATCH 6/7] Arm: Use read_description funcs in gdbserver
  2019-07-05  9:46 ` [PATCH 6/7] Arm: Use read_description funcs in gdbserver Alan Hayward
@ 2019-07-10  4:04   ` Simon Marchi
  2019-07-10 15:44     ` Alan Hayward
  0 siblings, 1 reply; 18+ messages in thread
From: Simon Marchi @ 2019-07-10  4:04 UTC (permalink / raw)
  To: Alan Hayward, gdb-patches; +Cc: nd

> diff --git a/gdb/gdbserver/linux-aarch32-tdesc.c b/gdb/gdbserver/linux-aarch32-tdesc.c
> new file mode 100644
> index 0000000000..6f0e8c9aa9
> --- /dev/null
> +++ b/gdb/gdbserver/linux-aarch32-tdesc.c
> @@ -0,0 +1,46 @@
> +/* Copyright (C) 2019 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 "arch/aarch32.h"
> +#include <inttypes.h>
> +
> +struct target_desc *tdesc_aarch32;

static

> diff --git a/gdb/gdbserver/linux-arm-tdesc.c b/gdb/gdbserver/linux-arm-tdesc.c
> new file mode 100644
> index 0000000000..fa54e48592
> --- /dev/null
> +++ b/gdb/gdbserver/linux-arm-tdesc.c
> @@ -0,0 +1,62 @@
> +/* Copyright (C) 2019 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 "arch/arm.h"
> +#include <inttypes.h>
> +
> +/* All possible Arm target descriptors.  */
> +struct target_desc *tdesc_arm_list[ARM_FP_TYPE_INVALID];

static

> +
> +/* See linux-arm-tdesc.h.  */
> +
> +const target_desc *
> +arm_linux_read_description (arm_fp_type fp_type)
> +{
> +  struct target_desc *tdesc = tdesc_arm_list[fp_type];
> +
> +  if (tdesc == nullptr)
> +    {
> +      tdesc = arm_create_target_description (fp_type);
> +
> +      static const char *expedite_regs[] = { "r11", "sp", "pc", 0 };
> +      init_target_desc (tdesc, expedite_regs);
> +
> +      tdesc_arm_list[fp_type] = tdesc;
> +    }
> +
> +  return tdesc;
> +}
> +
> +/* See linux-arm-tdesc.h.  */
> +
> +arm_fp_type arm_linux_get_tdesc_fp_type (const target_desc *tdesc)

Return type on its own line.

> +{
> +  if (tdesc == nullptr)
> +    return ARM_FP_TYPE_INVALID;

Can this (tdesc == nullptr) actually happen?  If you expect it's not possible,
don't hesitate to use a gdb_assert instead.  It helps catch bugs and acts as
some kind of self-documentation of the allowed values.

> +
> +  /* Many of the tdesc_arm_list entries may not have been initialised yet.  This
> +     is ok, because tdesc must be one of the initialised ones.  */
> +  for (int i = ARM_FP_TYPE_VFPV2; i < ARM_FP_TYPE_INVALID; i++)

Is it intended here that you skip ARM_FP_TYPE_NONE?  Why?

Simon

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

* Re: [PATCH 2/7] Arm: Create feature files for Arm target descriptions
  2019-07-10  2:56   ` Simon Marchi
@ 2019-07-10 13:22     ` Alan Hayward
  0 siblings, 0 replies; 18+ messages in thread
From: Alan Hayward @ 2019-07-10 13:22 UTC (permalink / raw)
  To: Simon Marchi; +Cc: gdb-patches, nd


> On 10 Jul 2019, at 03:56, Simon Marchi <simark@simark.ca> wrote:
> 
> On 2019-07-05 5:45 a.m., Alan Hayward wrote:
>> Add Arm to the list of feature target description targets and generate the
>> relevant C files.
>> 
>> Add arm-m-profile-with-fpa.xml as the feature version of the exisiting
>> arm-with-m-fpa-layout.xml.
>> 
>> Add extra comments to the Makefile for readability.
>> 
>> New files are not yet used.
> 
> Hi Alan,
> 
> Note that you'll need to re-generate these files following the renaming
> of common to gdbsupport.  It should not be a big deal though.
> 
> However, when I try to re-generate the C files, I get this spurious diff:
> 
> diff --git a/gdb/features/aarch64-pauth.c b/gdb/features/aarch64-pauth.c
> index 931e6cb28410..7bd73a6b21d9 100644
> --- a/gdb/features/aarch64-pauth.c
> +++ b/gdb/features/aarch64-pauth.c
> @@ -11,6 +11,5 @@ create_feature_aarch64_pauth (struct target_desc *result, long regnum)
>   feature = tdesc_create_feature (result, "org.gnu.gdb.aarch64.pauth");
>   tdesc_create_reg (feature, "pauth_dmask", regnum++, 1, NULL, 64, "int");
>   tdesc_create_reg (feature, "pauth_cmask", regnum++, 1, NULL, 64, "int");
> -
>   return regnum;
> }
> 
> Do you see it too?  If so, would you mind just pushing an obvious patch to
> fix it?
> 

Not quite sure how that happened. But fixed up now.


> This patch LGTM, at least the features/Makefile and target-descriptions.c parts
> (the arm parts look good too but I don't really know the specifics of the
> architecture).
> 
> 

Thanks.
I pushed 1/7 because the changes were obvious.

I regenerated this patch and pushed. Pasted below for reference.

Alan.



diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 6686a14c4b..0c2dca7c5d 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,15 @@
+2019-07-10  Alan Hayward  <alan.hayward@arm.com>
+
+       * features/Makefile: Use feature target descriptions for Arm.
+       * features/arm/arm-core.c: Generate new file.
+       * features/arm/arm-fpa.c: Likewise.
+       * features/arm/arm-m-profile-with-fpa.xml: Likewise.
+       * features/arm/arm-m-profile.c: Likewise.
+       * features/arm/arm-vfpv2.c: Likewise.
+       * features/arm/arm-vfpv3.c: Likewise.
+       * features/arm/xscale-iwmmxt.c: Likewise.
+       * target-descriptions.c (maint_print_c_tdesc_cmd): Add Arm.
+
 2019-07-10  Alan Hayward  <alan.hayward@arm.com>

        * arm-linux-nat.c (arm_linux_nat_target::read_description): Check
diff --git a/gdb/features/Makefile b/gdb/features/Makefile
index 3b57124b04..0c84faf405 100644
--- a/gdb/features/Makefile
+++ b/gdb/features/Makefile
@@ -38,11 +38,12 @@
 #
 #   make GDB=/path/to/gdb clean-cfiles cfiles
 #
-# To generate specific C files, you can override the XMLTOC make
-# variable:
+# To generate specific C files, you can override the XMLTOC and
+# FEATURE_XMLFILES make variables:
 #
-#   make GDB=/path/to/gdb XMLTOC="xml files" cfiles
+#   make GDB=/path/to/gdb XMLTOC="xml files" FEATURE_XMLFILES="xml files" cfiles

+# List of .dat files to create in ../regformats/
 WHICH = arm/arm-with-iwmmxt arm/arm-with-vfpv2 arm/arm-with-vfpv3 \
        arm/arm-with-neon \
        mips-linux mips-dsp-linux \
@@ -103,20 +104,14 @@ XSLTPROC = xsltproc
 outdir = ../regformats
 OUTPUTS = $(patsubst %,$(outdir)/%.dat,$(WHICH))

-# The set of xml files we'll generate .c files for GDB from.  By
+# For targets without feature based target descriptions,
+# the set of xml files we'll generate .c files for GDB from.  By
 # default we'll build all .c files, which requires an
 # --enable-targets=all GDB.  You can override this by passing XMLTOC
 # to make on the command line.
 XMLTOC = \
        arc-v2.xml \
        arc-arcompact.xml \
-       arm/arm-with-iwmmxt.xml \
-       arm/arm-with-m-fpa-layout.xml \
-       arm/arm-with-m-vfp-d16.xml \
-       arm/arm-with-m.xml \
-       arm/arm-with-neon.xml \
-       arm/arm-with-vfpv2.xml \
-       arm/arm-with-vfpv3.xml \
        microblaze-with-stack-protect.xml \
        microblaze.xml \
        mips-dsp-linux.xml \
@@ -189,6 +184,7 @@ GDB = false

 #Targets which use feature based target descriptions.
 aarch64-feature = 1
+arm-feature = 1
 i386-feature = 1
 riscv-feature = 1
 tic6x-feature = 1
@@ -208,9 +204,18 @@ $(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

+# For targets with feature based target descriptions,
+# the set of xml files we'll generate .c files for GDB from.
 FEATURE_XMLFILES = aarch64-core.xml \
        aarch64-fpu.xml \
        aarch64-pauth.xml \
+       arm/arm-core.xml \
+       arm/arm-fpa.xml \
+       arm/arm-m-profile.xml \
+       arm/arm-m-profile-with-fpa.xml \
+       arm/arm-vfpv2.xml \
+       arm/arm-vfpv3.xml \
+       arm/xscale-iwmmxt.xml \
        i386/32bit-core.xml \
        i386/32bit-sse.xml \
        i386/32bit-linux.xml \
@@ -263,9 +268,6 @@ $(FEATURE_CFILES): %.c: %.xml.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
-
 # Regenerate RISC-V CSR feature lists.
 riscv/32bit-csr.xml riscv/64bit-csr.xml: ../../include/opcode/riscv-opc.h
        ./riscv/rebuild-csr-xml.sh ../../include/opcode/riscv-opc.h ./riscv
diff --git a/gdb/features/arm/arm-core.c b/gdb/features/arm/arm-core.c
new file mode 100644
index 0000000000..e401411fc5
--- /dev/null
+++ b/gdb/features/arm/arm-core.c
@@ -0,0 +1,31 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: arm-core.xml */
+
+#include "gdbsupport/tdesc.h"
+
+static int
+create_feature_arm_arm_core (struct target_desc *result, long regnum)
+{
+  struct tdesc_feature *feature;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.arm.core");
+  tdesc_create_reg (feature, "r0", regnum++, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r1", regnum++, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r2", regnum++, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r3", regnum++, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r4", regnum++, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r5", regnum++, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r6", regnum++, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r7", regnum++, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r8", regnum++, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r9", regnum++, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r10", regnum++, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r11", regnum++, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "r12", regnum++, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "sp", regnum++, 1, NULL, 32, "data_ptr");
+  tdesc_create_reg (feature, "lr", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "pc", regnum++, 1, NULL, 32, "code_ptr");
+  regnum = 25;
+  tdesc_create_reg (feature, "cpsr", regnum++, 1, NULL, 32, "int");
+  return regnum;
+}
diff --git a/gdb/features/arm/arm-fpa.c b/gdb/features/arm/arm-fpa.c
new file mode 100644
index 0000000000..65a49f5f3f
--- /dev/null
+++ b/gdb/features/arm/arm-fpa.c
@@ -0,0 +1,23 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: arm-fpa.xml */
+
+#include "gdbsupport/tdesc.h"
+
+static int
+create_feature_arm_arm_fpa (struct target_desc *result, long regnum)
+{
+  struct tdesc_feature *feature;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.arm.fpa");
+  regnum = 16;
+  tdesc_create_reg (feature, "f0", regnum++, 1, NULL, 96, "arm_fpa_ext");
+  tdesc_create_reg (feature, "f1", regnum++, 1, NULL, 96, "arm_fpa_ext");
+  tdesc_create_reg (feature, "f2", regnum++, 1, NULL, 96, "arm_fpa_ext");
+  tdesc_create_reg (feature, "f3", regnum++, 1, NULL, 96, "arm_fpa_ext");
+  tdesc_create_reg (feature, "f4", regnum++, 1, NULL, 96, "arm_fpa_ext");
+  tdesc_create_reg (feature, "f5", regnum++, 1, NULL, 96, "arm_fpa_ext");
+  tdesc_create_reg (feature, "f6", regnum++, 1, NULL, 96, "arm_fpa_ext");
+  tdesc_create_reg (feature, "f7", regnum++, 1, NULL, 96, "arm_fpa_ext");
+  tdesc_create_reg (feature, "fps", regnum++, 1, NULL, 32, "int");
+  return regnum;
+}
diff --git a/gdb/features/arm/arm-m-profile-with-fpa.c b/gdb/features/arm/arm-m-profile-with-fpa.c
new file mode 100644
index 0000000000..2b7c78597b
--- /dev/null
+++ b/gdb/features/arm/arm-m-profile-with-fpa.c
@@ -0,0 +1,39 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: arm-m-profile-with-fpa.xml */
+
+#include "gdbsupport/tdesc.h"
+
+static int
+create_feature_arm_arm_m_profile_with_fpa (struct target_desc *result, long regnum)
+{
+  struct tdesc_feature *feature;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.arm.m-profile");
+  tdesc_create_reg (feature, "r0", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r1", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r2", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r3", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r4", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r5", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r6", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r7", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r8", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r9", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r10", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r11", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r12", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "sp", regnum++, 1, NULL, 32, "data_ptr");
+  tdesc_create_reg (feature, "lr", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "pc", regnum++, 1, NULL, 32, "code_ptr");
+  tdesc_create_reg (feature, "", regnum++, 1, NULL, 96, "arm_fpa_ext");
+  tdesc_create_reg (feature, "", regnum++, 1, NULL, 96, "arm_fpa_ext");
+  tdesc_create_reg (feature, "", regnum++, 1, NULL, 96, "arm_fpa_ext");
+  tdesc_create_reg (feature, "", regnum++, 1, NULL, 96, "arm_fpa_ext");
+  tdesc_create_reg (feature, "", regnum++, 1, NULL, 96, "arm_fpa_ext");
+  tdesc_create_reg (feature, "", regnum++, 1, NULL, 96, "arm_fpa_ext");
+  tdesc_create_reg (feature, "", regnum++, 1, NULL, 96, "arm_fpa_ext");
+  tdesc_create_reg (feature, "", regnum++, 1, NULL, 96, "arm_fpa_ext");
+  tdesc_create_reg (feature, "", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "xpsr", regnum++, 1, NULL, 32, "int");
+  return regnum;
+}
diff --git a/gdb/features/arm/arm-m-profile-with-fpa.xml b/gdb/features/arm/arm-m-profile-with-fpa.xml
new file mode 100644
index 0000000000..91e183c2dc
--- /dev/null
+++ b/gdb/features/arm/arm-m-profile-with-fpa.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2019 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.arm.m-profile">
+  <reg name="r0" bitsize="32"/>
+  <reg name="r1" bitsize="32"/>
+  <reg name="r2" bitsize="32"/>
+  <reg name="r3" bitsize="32"/>
+  <reg name="r4" bitsize="32"/>
+  <reg name="r5" bitsize="32"/>
+  <reg name="r6" bitsize="32"/>
+  <reg name="r7" bitsize="32"/>
+  <reg name="r8" bitsize="32"/>
+  <reg name="r9" bitsize="32"/>
+  <reg name="r10" bitsize="32"/>
+  <reg name="r11" bitsize="32"/>
+  <reg name="r12" bitsize="32"/>
+  <reg name="sp" bitsize="32" type="data_ptr"/>
+  <reg name="lr" bitsize="32"/>
+  <reg name="pc" bitsize="32" type="code_ptr"/>
+
+  <!-- Slack for unused FPA registers (f0-f7 + fps).  -->
+  <reg name="" bitsize="96" type="arm_fpa_ext" regnum="16"/>
+  <reg name="" bitsize="96" type="arm_fpa_ext"/>
+  <reg name="" bitsize="96" type="arm_fpa_ext"/>
+  <reg name="" bitsize="96" type="arm_fpa_ext"/>
+  <reg name="" bitsize="96" type="arm_fpa_ext"/>
+  <reg name="" bitsize="96" type="arm_fpa_ext"/>
+  <reg name="" bitsize="96" type="arm_fpa_ext"/>
+  <reg name="" bitsize="96" type="arm_fpa_ext"/>
+  <reg name="" bitsize="32"/>
+
+  <reg name="xpsr" bitsize="32" regnum="25"/>
+</feature>
diff --git a/gdb/features/arm/arm-m-profile.c b/gdb/features/arm/arm-m-profile.c
new file mode 100644
index 0000000000..027f3c15c5
--- /dev/null
+++ b/gdb/features/arm/arm-m-profile.c
@@ -0,0 +1,31 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: arm-m-profile.xml */
+
+#include "gdbsupport/tdesc.h"
+
+static int
+create_feature_arm_arm_m_profile (struct target_desc *result, long regnum)
+{
+  struct tdesc_feature *feature;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.arm.m-profile");
+  tdesc_create_reg (feature, "r0", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r1", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r2", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r3", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r4", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r5", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r6", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r7", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r8", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r9", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r10", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r11", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r12", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "sp", regnum++, 1, NULL, 32, "data_ptr");
+  tdesc_create_reg (feature, "lr", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "pc", regnum++, 1, NULL, 32, "code_ptr");
+  regnum = 25;
+  tdesc_create_reg (feature, "xpsr", regnum++, 1, NULL, 32, "int");
+  return regnum;
+}
diff --git a/gdb/features/arm/arm-vfpv2.c b/gdb/features/arm/arm-vfpv2.c
new file mode 100644
index 0000000000..d6f8e79212
--- /dev/null
+++ b/gdb/features/arm/arm-vfpv2.c
@@ -0,0 +1,30 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: arm-vfpv2.xml */
+
+#include "gdbsupport/tdesc.h"
+
+static int
+create_feature_arm_arm_vfpv2 (struct target_desc *result, long regnum)
+{
+  struct tdesc_feature *feature;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.arm.vfp");
+  tdesc_create_reg (feature, "d0", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d1", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d2", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d3", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d4", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d5", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d6", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d7", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d8", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d9", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d10", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d11", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d12", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d13", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d14", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d15", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "fpscr", regnum++, 1, "float", 32, "int");
+  return regnum;
+}
diff --git a/gdb/features/arm/arm-vfpv3.c b/gdb/features/arm/arm-vfpv3.c
new file mode 100644
index 0000000000..b5ef4bae14
--- /dev/null
+++ b/gdb/features/arm/arm-vfpv3.c
@@ -0,0 +1,46 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: arm-vfpv3.xml */
+
+#include "gdbsupport/tdesc.h"
+
+static int
+create_feature_arm_arm_vfpv3 (struct target_desc *result, long regnum)
+{
+  struct tdesc_feature *feature;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.arm.vfp");
+  tdesc_create_reg (feature, "d0", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d1", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d2", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d3", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d4", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d5", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d6", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d7", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d8", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d9", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d10", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d11", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d12", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d13", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d14", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d15", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d16", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d17", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d18", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d19", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d20", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d21", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d22", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d23", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d24", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d25", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d26", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d27", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d28", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d29", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d30", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "d31", regnum++, 1, NULL, 64, "ieee_double");
+  tdesc_create_reg (feature, "fpscr", regnum++, 1, "float", 32, "int");
+  return regnum;
+}
diff --git a/gdb/features/arm/xscale-iwmmxt.c b/gdb/features/arm/xscale-iwmmxt.c
new file mode 100644
index 0000000000..797fb9190a
--- /dev/null
+++ b/gdb/features/arm/xscale-iwmmxt.c
@@ -0,0 +1,57 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: xscale-iwmmxt.xml */
+
+#include "gdbsupport/tdesc.h"
+
+static int
+create_feature_arm_xscale_iwmmxt (struct target_desc *result, long regnum)
+{
+  struct tdesc_feature *feature;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.xscale.iwmmxt");
+  tdesc_type *element_type;
+  element_type = tdesc_named_type (feature, "uint8");
+  tdesc_create_vector (feature, "iwmmxt_v8u8", element_type, 8);
+
+  element_type = tdesc_named_type (feature, "uint16");
+  tdesc_create_vector (feature, "iwmmxt_v4u16", element_type, 4);
+
+  element_type = tdesc_named_type (feature, "uint32");
+  tdesc_create_vector (feature, "iwmmxt_v2u32", element_type, 2);
+
+  tdesc_type_with_fields *type_with_fields;
+  type_with_fields = tdesc_create_union (feature, "iwmmxt_vec64i");
+  tdesc_type *field_type;
+  field_type = tdesc_named_type (feature, "iwmmxt_v8u8");
+  tdesc_add_field (type_with_fields, "u8", field_type);
+  field_type = tdesc_named_type (feature, "iwmmxt_v4u16");
+  tdesc_add_field (type_with_fields, "u16", field_type);
+  field_type = tdesc_named_type (feature, "iwmmxt_v2u32");
+  tdesc_add_field (type_with_fields, "u32", field_type);
+  field_type = tdesc_named_type (feature, "uint64");
+  tdesc_add_field (type_with_fields, "u64", field_type);
+
+  tdesc_create_reg (feature, "wR0", regnum++, 1, NULL, 64, "iwmmxt_vec64i");
+  tdesc_create_reg (feature, "wR1", regnum++, 1, NULL, 64, "iwmmxt_vec64i");
+  tdesc_create_reg (feature, "wR2", regnum++, 1, NULL, 64, "iwmmxt_vec64i");
+  tdesc_create_reg (feature, "wR3", regnum++, 1, NULL, 64, "iwmmxt_vec64i");
+  tdesc_create_reg (feature, "wR4", regnum++, 1, NULL, 64, "iwmmxt_vec64i");
+  tdesc_create_reg (feature, "wR5", regnum++, 1, NULL, 64, "iwmmxt_vec64i");
+  tdesc_create_reg (feature, "wR6", regnum++, 1, NULL, 64, "iwmmxt_vec64i");
+  tdesc_create_reg (feature, "wR7", regnum++, 1, NULL, 64, "iwmmxt_vec64i");
+  tdesc_create_reg (feature, "wR8", regnum++, 1, NULL, 64, "iwmmxt_vec64i");
+  tdesc_create_reg (feature, "wR9", regnum++, 1, NULL, 64, "iwmmxt_vec64i");
+  tdesc_create_reg (feature, "wR10", regnum++, 1, NULL, 64, "iwmmxt_vec64i");
+  tdesc_create_reg (feature, "wR11", regnum++, 1, NULL, 64, "iwmmxt_vec64i");
+  tdesc_create_reg (feature, "wR12", regnum++, 1, NULL, 64, "iwmmxt_vec64i");
+  tdesc_create_reg (feature, "wR13", regnum++, 1, NULL, 64, "iwmmxt_vec64i");
+  tdesc_create_reg (feature, "wR14", regnum++, 1, NULL, 64, "iwmmxt_vec64i");
+  tdesc_create_reg (feature, "wR15", regnum++, 1, NULL, 64, "iwmmxt_vec64i");
+  tdesc_create_reg (feature, "wCSSF", regnum++, 1, "vector", 32, "int");
+  tdesc_create_reg (feature, "wCASF", regnum++, 1, "vector", 32, "int");
+  tdesc_create_reg (feature, "wCGR0", regnum++, 1, "vector", 32, "int");
+  tdesc_create_reg (feature, "wCGR1", regnum++, 1, "vector", 32, "int");
+  tdesc_create_reg (feature, "wCGR2", regnum++, 1, "vector", 32, "int");
+  tdesc_create_reg (feature, "wCGR3", regnum++, 1, "vector", 32, "int");
+  return regnum;
+}
diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c
index f422f2c14c..322ed509b1 100644
--- a/gdb/target-descriptions.c
+++ b/gdb/target-descriptions.c
@@ -1715,7 +1715,8 @@ maint_print_c_tdesc_cmd (const char *args, int from_tty)
       || startswith (filename_after_features.c_str (), "i386/x32-core.xml")
       || startswith (filename_after_features.c_str (), "riscv/")
       || startswith (filename_after_features.c_str (), "tic6x-")
-      || startswith (filename_after_features.c_str (), "aarch64"))
+      || startswith (filename_after_features.c_str (), "aarch64")
+      || startswith (filename_after_features.c_str (), "arm/"))
     {
       print_c_feature v (filename_after_features);




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

* Re: [PATCH 3/7] Arm: Add read_description read funcs and use in GDB
  2019-07-10  3:45   ` Simon Marchi
@ 2019-07-10 13:52     ` Alan Hayward
  2019-07-10 14:26       ` Alan Hayward
  2019-07-10 16:07       ` Simon Marchi
  0 siblings, 2 replies; 18+ messages in thread
From: Alan Hayward @ 2019-07-10 13:52 UTC (permalink / raw)
  To: Simon Marchi; +Cc: gdb-patches, nd



> On 10 Jul 2019, at 04:45, Simon Marchi <simark@simark.ca> wrote:
> 
> On 2019-07-05 5:45 a.m., Alan Hayward wrote:
>> Switch the Arm target to get target descriptions via arm_read_description
>> and aarch32_read_description, in the same style as other feature targets.
>> Add an enum to specify the different types - this will also be of use to
>> gdbserver in a later patch.
>> 
>> Call arm_create_mprofile_target_description directly as these will only be
>> called the once, therefore they do not need caching.
> 
> I was going to point out "called the once", because it sounds strange to me,
> but there is another instance of it in function arm_register_g_packet_guesses,
> so maybe it's ok?

Should probably read “called the once for each target description type”. But,
removed due to comments below.

> 
>> diff --git a/gdb/Makefile.in b/gdb/Makefile.in
>> index 7308ea5767..9352dd92ff 100644
>> --- a/gdb/Makefile.in
>> +++ b/gdb/Makefile.in
>> @@ -665,7 +665,9 @@ ALL_64_TARGET_OBS = \
>> 
>> # All other target-dependent objects files (used with --enable-targets=all).
>> ALL_TARGET_OBS = \
>> +	aarch32-tdep.o \
>> 	arc-tdep.o \
>> +	arch/aarch32.o \
>> 	arch/arm.o \
>> 	arch/arm-get-next-pcs.o \
>> 	arch/arm-linux.o \
>> @@ -1184,6 +1186,7 @@ SFILES = \
>> # right, it is probably easiest just to list .h files here directly.
>> 
>> HFILES_NO_SRCDIR = \
>> +	aarch32-tdep.h \
>> 	aarch64-ravenscar-thread.h \
>> 	aarch64-tdep.h \
>> 	ada-lang.h \
>> @@ -1431,6 +1434,7 @@ HFILES_NO_SRCDIR = \
>> 	xtensa-tdep.h \
>> 	arch/aarch64.h \
>> 	arch/aarch64-insn.h \
>> +	arch/aarch32.h \
> 
> This line should go above the aarch64 ones.

Done.

> 
>> diff --git a/gdb/aarch32-tdep.c b/gdb/aarch32-tdep.c
>> new file mode 100644
>> index 0000000000..d9355d0665
>> --- /dev/null
>> +++ b/gdb/aarch32-tdep.c
>> @@ -0,0 +1,33 @@
>> +/* Copyright (C) 2019 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 "common/common-defs.h"
>> +#include "common/common-regcache.h"
>> +#include "arch/aarch32.h"
>> +
>> +struct target_desc *tdesc_aarch32;
> 
> static

Done.

> 
>> +
>> +/* See linux-aarch32-tdep.h.  */
> 
> /* See aarch32-tdep.h.  */

Gah! Done.

> 
>> diff --git a/gdb/arch/aarch32.c b/gdb/arch/aarch32.c
>> new file mode 100644
>> index 0000000000..f3cb8c7855
>> --- /dev/null
>> +++ b/gdb/arch/aarch32.c
>> @@ -0,0 +1,29 @@
>> +/* Copyright (C) 2019 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 "common/common-defs.h"
>> +#include "aarch32.h"
>> +
>> +extern struct target_desc *tdesc_arm_with_neon;
>> +
>> +/* See aarch32.h.  */
>> +
>> +target_desc *
>> +aarch32_create_target_description ()
>> +{
>> +  return tdesc_arm_with_neon;
>> +}
> 
> Can you briefly explain the difference (from the point of view of GDB) between the
> ARM and AArch32 architecture?  My current understanding is that AArch32 is Arm(v7?)
> emulation on AArch64, so they are very close.  But there might be some subtle
> differences, requiring GDB to consider them as different architectures.
> 

AArch32 is the 32bit mode in Arm v8. Compatible with Arm v7, but new features continue
to go into it via v8-M and v8-R.  Emulation is probably not quite the correct word, as
it’s all down in hardware.


> Edit: I now went through the patch and saw the configure.in change.  My guess would
> now be that it allows to include in an AArch64 build just what's actually supported
> by the AArch32 mode, which is arm-with-neon, without having to pull the entire Arm
> support.  Does that sound right?

Yes. Yao split the AArch32 parts out from Arm in order to support multi-arch debugging
on AArch64. I’m not sure exactly what works on it.

> 
>> diff --git a/gdb/arch/arm.c b/gdb/arch/arm.c
>> index 93738f0a0f..37806753cb 100644
>> --- a/gdb/arch/arm.c
>> +++ b/gdb/arch/arm.c
>> @@ -21,6 +21,15 @@
>> #include "common/common-regcache.h"
>> #include "arm.h"
>> 
>> +extern struct target_desc *tdesc_arm_with_vfpv2;
>> +extern struct target_desc *tdesc_arm_with_vfpv3;
>> +extern struct target_desc *tdesc_arm_with_iwmmxt;
>> +#ifndef GDBSERVER
>> +extern struct target_desc *tdesc_arm_with_m;
>> +extern struct target_desc *tdesc_arm_with_m_vfp_d16;
>> +extern struct target_desc *tdesc_arm_with_m_fpa_layout;
>> +#endif
>> +
>> /* See arm.h.  */
>> 
>> int
>> @@ -372,3 +381,49 @@ shifted_reg_val (struct regcache *regcache, unsigned long inst,
>> 
>>   return res & 0xffffffff;
>> }
>> +
>> +/* See arch/arm.h.  */
>> +
>> +target_desc *
>> +arm_create_target_description (arm_fp_type fp_type)
>> +{
>> +  switch (fp_type)
>> +    {
>> +    case ARM_FP_TYPE_NONE:
>> +      return nullptr;
>> +
>> +    case ARM_FP_TYPE_VFPV2:
>> +      return tdesc_arm_with_vfpv2;
>> +
>> +    case ARM_FP_TYPE_VFPV3:
>> +      return tdesc_arm_with_vfpv3;
>> +
>> +    case ARM_FP_TYPE_IWMMXT:
>> +      return tdesc_arm_with_iwmmxt;
>> +
>> +    default:
>> +      error (_("Invalid Arm FP type: %d"), fp_type);
>> +    }
>> +}
>> +
>> +/* See arch/arm.h.  */
>> +
>> +target_desc *
>> +arm_create_mprofile_target_description (arm_m_profile_type m_type)
>> +{
>> +  switch (m_type)
>> +    {
>> +#ifndef GDBSERVER
>> +    case ARM_M_TYPE_M_PROFILE:
>> +      return tdesc_arm_with_m;
>> +
>> +    case ARM_M_TYPE_VFP_D16:
>> +      return tdesc_arm_with_m_fpa_layout;
>> +
>> +    case ARM_M_TYPE_WITH_FPA:
>> +      return tdesc_arm_with_m_vfp_d16;
>> +#endif
>> +    default:
>> +      error (_("Invalid Arm M type: %d"), m_type);
>> +    }
>> +}
> 
> If it doesn't make sense to have this function shared with GDBserver (given
> that GDBserver doesn't run on Cortex-Ms), it should probably go in gdb/arm-tdep.c.

Right. I wasn’t thinking of arch as “architecture code shared with gdbserver”,
but it makes sense.

The GDBSERVER defines do vanish later in the series.

I think I preferred having the two functions together in arch, but I’ve moved it.


> 
>> diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c
>> index 8e3607cdea..f3f6458a27 100644
>> --- a/gdb/arm-tdep.c
>> +++ b/gdb/arm-tdep.c
>> @@ -240,6 +240,9 @@ static const char **valid_disassembly_styles;
>> /* Disassembly style to use. Default to "std" register names.  */
>> static const char *disassembly_style;
>> 
>> +/* All possible arm target descriptors.  */
>> +struct target_desc *tdesc_arm_list[ARM_FP_TYPE_INVALID];
> 
> static

Done.

> 
>> +
>> /* This is used to keep the bfd arch_info in sync with the disassembly
>>    style.  */
>> static void set_disassembly_style_sfunc (const char *, int,
>> @@ -8763,7 +8766,6 @@ arm_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
>>     return default_register_reggroup_p (gdbarch, regnum, group);
>> }
>> 
>> -\f
>> /* For backward-compatibility we allow two 'g' packet lengths with
>>    the remote protocol depending on whether FPA registers are
>>    supplied.  M-profile targets do not have FPA registers, but some
>> @@ -8777,21 +8779,29 @@ arm_register_g_packet_guesses (struct gdbarch *gdbarch)
>> {
>>   if (gdbarch_tdep (gdbarch)->is_m)
>>     {
>> +      const target_desc *tdesc;
>> +
>> +      /* This function is only called the once, therefore it's safe to call the
>> +	 tdesc creation function directly.  */
> 
> The other instance of "called the once".
> 
> Would it be "unsafe" to call tdesc creation functions multiple times in general?  I
> thought it was just a question of efficiency/caching.  If so, I'd say "therefore
> it's not worth caching the descriptions”.

Yes, it’s just efficiency/caching.

> 
> It might be true that they are called only once today (I guess because the only way to
> debug them in practice is through some server that only support debugging one at the
> time), but it could change eventually.  For example, with multi-target, you could
> connect to two of them.  Since it's not really difficult, I'd use the same caching pattern
> as for the other ones.
> 

Agreed and done.

The above changes are going to require rebasing the other patches too. I’ll repost the
set as a V2.


Alan.


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

* Re: [PATCH 3/7] Arm: Add read_description read funcs and use in GDB
  2019-07-10 13:52     ` Alan Hayward
@ 2019-07-10 14:26       ` Alan Hayward
  2019-07-10 16:05         ` Simon Marchi
  2019-07-10 16:07       ` Simon Marchi
  1 sibling, 1 reply; 18+ messages in thread
From: Alan Hayward @ 2019-07-10 14:26 UTC (permalink / raw)
  To: Simon Marchi; +Cc: gdb-patches, nd



> On 10 Jul 2019, at 14:52, Alan Hayward <Alan.Hayward@arm.com> wrote:
> 
> 
> 
>> On 10 Jul 2019, at 04:45, Simon Marchi <simark@simark.ca> wrote:
>> 
>> On 2019-07-05 5:45 a.m., Alan Hayward wrote:
>>> 


>>> +
>>> +/* See arch/arm.h.  */
>>> +
>>> +target_desc *
>>> +arm_create_target_description (arm_fp_type fp_type)
>>> +{
>>> +  switch (fp_type)
>>> +    {
>>> +    case ARM_FP_TYPE_NONE:
>>> +      return nullptr;
>>> +
>>> +    case ARM_FP_TYPE_VFPV2:
>>> +      return tdesc_arm_with_vfpv2;
>>> +
>>> +    case ARM_FP_TYPE_VFPV3:
>>> +      return tdesc_arm_with_vfpv3;
>>> +
>>> +    case ARM_FP_TYPE_IWMMXT:
>>> +      return tdesc_arm_with_iwmmxt;
>>> +
>>> +    default:
>>> +      error (_("Invalid Arm FP type: %d"), fp_type);
>>> +    }
>>> +}
>>> +
>>> +/* See arch/arm.h.  */
>>> +
>>> +target_desc *
>>> +arm_create_mprofile_target_description (arm_m_profile_type m_type)
>>> +{
>>> +  switch (m_type)
>>> +    {
>>> +#ifndef GDBSERVER
>>> +    case ARM_M_TYPE_M_PROFILE:
>>> +      return tdesc_arm_with_m;
>>> +
>>> +    case ARM_M_TYPE_VFP_D16:
>>> +      return tdesc_arm_with_m_fpa_layout;
>>> +
>>> +    case ARM_M_TYPE_WITH_FPA:
>>> +      return tdesc_arm_with_m_vfp_d16;
>>> +#endif
>>> +    default:
>>> +      error (_("Invalid Arm M type: %d"), m_type);
>>> +    }
>>> +}
>> 
>> If it doesn't make sense to have this function shared with GDBserver (given
>> that GDBserver doesn't run on Cortex-Ms), it should probably go in gdb/arm-tdep.c.
> 
> Right. I wasn’t thinking of arch as “architecture code shared with gdbserver”,
> but it makes sense.
> 
> The GDBSERVER defines do vanish later in the series.
> 
> I think I preferred having the two functions together in arch, but I’ve moved it.
> 

To this, I’ll add that moving the mprofile function into arm-tdep.c means that
in a later patch, both arm-tdep.c and arch/arm.c have to 
#include "features/arm/arm-vfpv2.c”

This is because ARM_M_TYPE_VFP_D16 uses the vfpv2 functions.

It works, but means that the same static function is being included twice.


Alan.



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

* Re: [PATCH 6/7] Arm: Use read_description funcs in gdbserver
  2019-07-10  4:04   ` Simon Marchi
@ 2019-07-10 15:44     ` Alan Hayward
  0 siblings, 0 replies; 18+ messages in thread
From: Alan Hayward @ 2019-07-10 15:44 UTC (permalink / raw)
  To: Simon Marchi; +Cc: gdb-patches, nd



> On 10 Jul 2019, at 05:04, Simon Marchi <simark@simark.ca> wrote:
> 
>> diff --git a/gdb/gdbserver/linux-aarch32-tdesc.c b/gdb/gdbserver/linux-aarch32-tdesc.c
>> new file mode 100644
>> index 0000000000..6f0e8c9aa9
>> --- /dev/null
>> +++ b/gdb/gdbserver/linux-aarch32-tdesc.c
>> @@ -0,0 +1,46 @@
>> +/* Copyright (C) 2019 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 "arch/aarch32.h"
>> +#include <inttypes.h>
>> +
>> +struct target_desc *tdesc_aarch32;
> 
> static

Done.

> 
>> diff --git a/gdb/gdbserver/linux-arm-tdesc.c b/gdb/gdbserver/linux-arm-tdesc.c
>> new file mode 100644
>> index 0000000000..fa54e48592
>> --- /dev/null
>> +++ b/gdb/gdbserver/linux-arm-tdesc.c
>> @@ -0,0 +1,62 @@
>> +/* Copyright (C) 2019 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 "arch/arm.h"
>> +#include <inttypes.h>
>> +
>> +/* All possible Arm target descriptors.  */
>> +struct target_desc *tdesc_arm_list[ARM_FP_TYPE_INVALID];
> 
> static

Done.

> 
>> +
>> +/* See linux-arm-tdesc.h.  */
>> +
>> +const target_desc *
>> +arm_linux_read_description (arm_fp_type fp_type)
>> +{
>> +  struct target_desc *tdesc = tdesc_arm_list[fp_type];
>> +
>> +  if (tdesc == nullptr)
>> +    {
>> +      tdesc = arm_create_target_description (fp_type);
>> +
>> +      static const char *expedite_regs[] = { "r11", "sp", "pc", 0 };
>> +      init_target_desc (tdesc, expedite_regs);
>> +
>> +      tdesc_arm_list[fp_type] = tdesc;
>> +    }
>> +
>> +  return tdesc;
>> +}
>> +
>> +/* See linux-arm-tdesc.h.  */
>> +
>> +arm_fp_type arm_linux_get_tdesc_fp_type (const target_desc *tdesc)
> 
> Return type on its own line.

Done.

> 
>> +{
>> +  if (tdesc == nullptr)
>> +    return ARM_FP_TYPE_INVALID;
> 
> Can this (tdesc == nullptr) actually happen?  If you expect it's not possible,
> don't hesitate to use a gdb_assert instead.  It helps catch bugs and acts as
> some kind of self-documentation of the allowed values.

It would mean that regcache->tdesc was null, which as far as I can tell is not
possible. There are no fails when testing either.
I’ll switch to gdb_assert.

> 
>> +
>> +  /* Many of the tdesc_arm_list entries may not have been initialised yet.  This
>> +     is ok, because tdesc must be one of the initialised ones.  */
>> +  for (int i = ARM_FP_TYPE_VFPV2; i < ARM_FP_TYPE_INVALID; i++)
> 
> Is it intended here that you skip ARM_FP_TYPE_NONE?  Why?

My mistake. An earlier version didn’t have ARM_FP_TYPE_NONE, and I missed this.
Fixed to start with ARM_FP_TYPE_NONE.


> 
> Simon
> 


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

* Re: [PATCH 3/7] Arm: Add read_description read funcs and use in GDB
  2019-07-10 14:26       ` Alan Hayward
@ 2019-07-10 16:05         ` Simon Marchi
  0 siblings, 0 replies; 18+ messages in thread
From: Simon Marchi @ 2019-07-10 16:05 UTC (permalink / raw)
  To: Alan Hayward; +Cc: gdb-patches, nd

On 2019-07-10 10:26 a.m., Alan Hayward wrote:
>>> If it doesn't make sense to have this function shared with GDBserver (given
>>> that GDBserver doesn't run on Cortex-Ms), it should probably go in gdb/arm-tdep.c.
>>
>> Right. I wasn’t thinking of arch as “architecture code shared with gdbserver”,
>> but it makes sense.
>>
>> The GDBSERVER defines do vanish later in the series.
>>
>> I think I preferred having the two functions together in arch, but I’ve moved it.
>>
> 
> To this, I’ll add that moving the mprofile function into arm-tdep.c means that
> in a later patch, both arm-tdep.c and arch/arm.c have to 
> #include "features/arm/arm-vfpv2.c”
> 
> This is because ARM_M_TYPE_VFP_D16 uses the vfpv2 functions.
> 
> It works, but means that the same static function is being included twice.
> 
> 
> Alan.

Ok, well I agree that the end result looks ok, it's not a big deal if there is a function in
arch/arm.h that only gdb uses.  It's true that it also makes sense to keep these functions
together.  I was just a bit put off by the "#ifndef GDBSERVER" initially.

Simon

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

* Re: [PATCH 3/7] Arm: Add read_description read funcs and use in GDB
  2019-07-10 13:52     ` Alan Hayward
  2019-07-10 14:26       ` Alan Hayward
@ 2019-07-10 16:07       ` Simon Marchi
  2019-07-10 16:15         ` Alan Hayward
  1 sibling, 1 reply; 18+ messages in thread
From: Simon Marchi @ 2019-07-10 16:07 UTC (permalink / raw)
  To: Alan Hayward; +Cc: gdb-patches, nd

On 2019-07-10 9:52 a.m., Alan Hayward wrote:
> Should probably read “called the once for each target description type”. But,
> removed due to comments below.

But shouldn't it be "called once" instead of "called the once", or it's really a valid
locution?  I have never heard that, and Googling "called the once" finds nothing of
interest.

Simon

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

* Re: [PATCH 3/7] Arm: Add read_description read funcs and use in GDB
  2019-07-10 16:07       ` Simon Marchi
@ 2019-07-10 16:15         ` Alan Hayward
  0 siblings, 0 replies; 18+ messages in thread
From: Alan Hayward @ 2019-07-10 16:15 UTC (permalink / raw)
  To: Simon Marchi; +Cc: gdb-patches, nd



> On 10 Jul 2019, at 17:07, Simon Marchi <simark@simark.ca> wrote:
> 
> On 2019-07-10 9:52 a.m., Alan Hayward wrote:
>> Should probably read “called the once for each target description type”. But,
>> removed due to comments below.
> 
> But shouldn't it be "called once" instead of "called the once", or it's really a valid
> locution?  I have never heard that, and Googling "called the once" finds nothing of
> interest.
> 
> Simon

Yes, you’re correct. I didn’t spot what you meant the first time.


Alan.

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

end of thread, other threads:[~2019-07-10 16:15 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-07-05  9:46 [PATCH 0/7] Arm: Use feature target descriptions Alan Hayward
2019-07-05  9:45 ` [PATCH 3/7] Arm: Add read_description read funcs and use in GDB Alan Hayward
2019-07-10  3:45   ` Simon Marchi
2019-07-10 13:52     ` Alan Hayward
2019-07-10 14:26       ` Alan Hayward
2019-07-10 16:05         ` Simon Marchi
2019-07-10 16:07       ` Simon Marchi
2019-07-10 16:15         ` Alan Hayward
2019-07-05  9:45 ` [PATCH 4/7] Arm: Use feature target descriptions Alan Hayward
2019-07-05  9:46 ` [PATCH 1/7] Arm: Minor style cleanups Alan Hayward
2019-07-05  9:46 ` [PATCH 2/7] Arm: Create feature files for Arm target descriptions Alan Hayward
2019-07-10  2:56   ` Simon Marchi
2019-07-10 13:22     ` Alan Hayward
2019-07-05  9:46 ` [PATCH 7/7] Arm: Remove unused feature files and tests Alan Hayward
2019-07-05  9:46 ` [PATCH 6/7] Arm: Use read_description funcs in gdbserver Alan Hayward
2019-07-10  4:04   ` Simon Marchi
2019-07-10 15:44     ` Alan Hayward
2019-07-05  9:46 ` [PATCH 5/7] Arm: Add xml unit tests Alan Hayward

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