This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH 3/4] Use flexible target descriptors for aarch64


This patch adds flexible target description code autogenerated from the
aarch64 feature files (fpu and core). It then moves both gdb and gdbserver
across to use it.


Tested on a --enable-targets=all build and aarch64 build with board
files unix, native-gdbserver and unittest.exp.

Alan.

2017-10-25  Alan Hayward  <alan.hayward@arm.com>

gdb/
	* aarch64-tdep.c (_initialize_aarch64_tdep): Remove init.
	* arch/aarch64.c (aarch64_create_target_description): Create
	new target description.
	* features/Makefile: Add new files.
	* features/aarch64-core.c: New autogenerated file.
	* features/aarch64-fpu.c: New autogenerated file.
	* target-descriptions.c (maint_print_c_tdesc_cmd): Check for aarch64.

gdbserver/
	* linux-aarch64-ipa.c (initialize_low_tracepoint): Remove init.
	* linux-aarch64-low.c (initialize_low_arch): Remove init.
	* linux-aarch64-tdesc.c (aarch64_linux_read_description): Add init.


diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c
index 96d1391a193a43100e0fd4a262210ac7e90242dc..5d6f455319f3003240239f7977da9f994765f4d3 100644
--- a/gdb/aarch64-tdep.c
+++ b/gdb/aarch64-tdep.c
@@ -54,9 +54,6 @@

 #include "record.h"
 #include "record-full.h"
-
-#include "features/aarch64.c"
-
 #include "arch/aarch64-insn.h"

 #include "opcode/aarch64.h"
@@ -3059,8 +3056,6 @@ _initialize_aarch64_tdep (void)
   gdbarch_register (bfd_arch_aarch64, aarch64_gdbarch_init,
 		    aarch64_dump_tdep);

-  initialize_tdesc_aarch64 ();
-
   /* Debug this file's internals.  */
   add_setshow_boolean_cmd ("aarch64", class_maintenance, &aarch64_debug, _("\
 Set AArch64 debugging."), _("\
diff --git a/gdb/arch/aarch64.c b/gdb/arch/aarch64.c
index 95d9906f10e660fda99d73a0d2a9d184fd3a7b52..85a44da93c71158de5d8a735b6a448b09c9dac1a 100644
--- a/gdb/arch/aarch64.c
+++ b/gdb/arch/aarch64.c
@@ -15,16 +15,39 @@
    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 <stdlib.h>
+#include <string.h>
 #include "aarch64.h"

-extern struct target_desc *tdesc_aarch64;
+#ifdef GDBSERVER
+#include "common/common-defs.h"
+#include "common/gdb_vecs.h"
+#include "common/vec.h"
+#include "tdesc.h"
+#else
+#include "defs.h"
+#include "osabi.h"
+#include "target-descriptions.h"
+#endif
+
+#include "../features/aarch64-core.c"
+#include "../features/aarch64-fpu.c"

 /* Create the aarch64 target description.  */

 target_desc *
 aarch64_create_target_description ()
 {
-  return tdesc_aarch64;
-}
+  target_desc *tdesc = allocate_target_description ();
+
+#ifndef IN_PROCESS_AGENT
+  set_tdesc_architecture (tdesc, "aarch64");
+#endif

+  long regnum = 0;
+
+  regnum = create_feature_aarch64_core (tdesc, regnum);
+  regnum = create_feature_aarch64_fpu (tdesc, regnum);
+
+  return tdesc;
+}
diff --git a/gdb/features/Makefile b/gdb/features/Makefile
index 2d8e3fea3687de1ba5b9a9cffc42728c9e6808e5..268e1b6f4ab09f23409dac64a44c61f19bf0f1f3 100644
--- a/gdb/features/Makefile
+++ b/gdb/features/Makefile
@@ -207,7 +207,9 @@ $(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

-FEATURE_XMLFILES = i386/32bit-core.xml \
+FEATURE_XMLFILES = aarch64-core.xml \
+	aarch64-fpu.xml \
+	i386/32bit-core.xml \
 	i386/32bit-sse.xml \
 	i386/32bit-linux.xml \
 	i386/32bit-avx.xml \
diff --git a/gdb/features/aarch64-core.c b/gdb/features/aarch64-core.c
new file mode 100644
index 0000000000000000000000000000000000000000..a735515ae67211d29634e7c39b375a36edef2bb1
--- /dev/null
+++ b/gdb/features/aarch64-core.c
@@ -0,0 +1,72 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: aarch64-core.xml.tmp */
+
+#ifdef GDBSERVER
+#include "tdesc.h"
+#else
+#include "defs.h"
+#include "osabi.h"
+#include "target-descriptions.h"
+#endif
+
+static int
+create_feature_aarch64_core (struct target_desc *result, long regnum)
+{
+  struct tdesc_feature *feature;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.aarch64.core", "aarch64-core.xml");
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
+  type = tdesc_create_flags (feature, "cpsr_flags", 4);
+  tdesc_add_flag (type, 0, "SP");
+  tdesc_add_flag (type, 1, "");
+  tdesc_add_bitfield (type, "EL", 2, 3);
+  tdesc_add_flag (type, 4, "nRW");
+  tdesc_add_flag (type, 5, "");
+  tdesc_add_flag (type, 6, "F");
+  tdesc_add_flag (type, 7, "I");
+  tdesc_add_flag (type, 8, "A");
+  tdesc_add_flag (type, 9, "D");
+  tdesc_add_flag (type, 20, "IL");
+  tdesc_add_flag (type, 21, "SS");
+  tdesc_add_flag (type, 28, "V");
+  tdesc_add_flag (type, 29, "C");
+  tdesc_add_flag (type, 30, "Z");
+  tdesc_add_flag (type, 31, "N");
+
+  tdesc_create_reg (feature, "x0", regnum++, 1, NULL, 64, "int");
+  tdesc_create_reg (feature, "x1", regnum++, 1, NULL, 64, "int");
+  tdesc_create_reg (feature, "x2", regnum++, 1, NULL, 64, "int");
+  tdesc_create_reg (feature, "x3", regnum++, 1, NULL, 64, "int");
+  tdesc_create_reg (feature, "x4", regnum++, 1, NULL, 64, "int");
+  tdesc_create_reg (feature, "x5", regnum++, 1, NULL, 64, "int");
+  tdesc_create_reg (feature, "x6", regnum++, 1, NULL, 64, "int");
+  tdesc_create_reg (feature, "x7", regnum++, 1, NULL, 64, "int");
+  tdesc_create_reg (feature, "x8", regnum++, 1, NULL, 64, "int");
+  tdesc_create_reg (feature, "x9", regnum++, 1, NULL, 64, "int");
+  tdesc_create_reg (feature, "x10", regnum++, 1, NULL, 64, "int");
+  tdesc_create_reg (feature, "x11", regnum++, 1, NULL, 64, "int");
+  tdesc_create_reg (feature, "x12", regnum++, 1, NULL, 64, "int");
+  tdesc_create_reg (feature, "x13", regnum++, 1, NULL, 64, "int");
+  tdesc_create_reg (feature, "x14", regnum++, 1, NULL, 64, "int");
+  tdesc_create_reg (feature, "x15", regnum++, 1, NULL, 64, "int");
+  tdesc_create_reg (feature, "x16", regnum++, 1, NULL, 64, "int");
+  tdesc_create_reg (feature, "x17", regnum++, 1, NULL, 64, "int");
+  tdesc_create_reg (feature, "x18", regnum++, 1, NULL, 64, "int");
+  tdesc_create_reg (feature, "x19", regnum++, 1, NULL, 64, "int");
+  tdesc_create_reg (feature, "x20", regnum++, 1, NULL, 64, "int");
+  tdesc_create_reg (feature, "x21", regnum++, 1, NULL, 64, "int");
+  tdesc_create_reg (feature, "x22", regnum++, 1, NULL, 64, "int");
+  tdesc_create_reg (feature, "x23", regnum++, 1, NULL, 64, "int");
+  tdesc_create_reg (feature, "x24", regnum++, 1, NULL, 64, "int");
+  tdesc_create_reg (feature, "x25", regnum++, 1, NULL, 64, "int");
+  tdesc_create_reg (feature, "x26", regnum++, 1, NULL, 64, "int");
+  tdesc_create_reg (feature, "x27", regnum++, 1, NULL, 64, "int");
+  tdesc_create_reg (feature, "x28", regnum++, 1, NULL, 64, "int");
+  tdesc_create_reg (feature, "x29", regnum++, 1, NULL, 64, "int");
+  tdesc_create_reg (feature, "x30", regnum++, 1, NULL, 64, "int");
+  tdesc_create_reg (feature, "sp", regnum++, 1, NULL, 64, "data_ptr");
+  tdesc_create_reg (feature, "pc", regnum++, 1, NULL, 64, "code_ptr");
+  tdesc_create_reg (feature, "cpsr", regnum++, 1, NULL, 32, "cpsr_flags");
+  return regnum;
+}
diff --git a/gdb/features/aarch64-fpu.c b/gdb/features/aarch64-fpu.c
new file mode 100644
index 0000000000000000000000000000000000000000..db3dfe771531f7a4c6aa09ee51053fa0266e8c2a
--- /dev/null
+++ b/gdb/features/aarch64-fpu.c
@@ -0,0 +1,138 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: aarch64-fpu.xml.tmp */
+
+#ifdef GDBSERVER
+#include "tdesc.h"
+#else
+#include "defs.h"
+#include "osabi.h"
+#include "target-descriptions.h"
+#endif
+
+static int
+create_feature_aarch64_fpu (struct target_desc *result, long regnum)
+{
+  struct tdesc_feature *feature;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.aarch64.fpu", "aarch64-fpu.xml");
+  struct tdesc_type *field_type;
+  field_type = tdesc_named_type (feature, "ieee_double");
+  tdesc_create_vector (feature, "v2d", field_type, 2);
+
+  field_type = tdesc_named_type (feature, "uint64");
+  tdesc_create_vector (feature, "v2u", field_type, 2);
+
+  field_type = tdesc_named_type (feature, "int64");
+  tdesc_create_vector (feature, "v2i", field_type, 2);
+
+  field_type = tdesc_named_type (feature, "ieee_single");
+  tdesc_create_vector (feature, "v4f", field_type, 4);
+
+  field_type = tdesc_named_type (feature, "uint32");
+  tdesc_create_vector (feature, "v4u", field_type, 4);
+
+  field_type = tdesc_named_type (feature, "int32");
+  tdesc_create_vector (feature, "v4i", field_type, 4);
+
+  field_type = tdesc_named_type (feature, "uint16");
+  tdesc_create_vector (feature, "v8u", field_type, 8);
+
+  field_type = tdesc_named_type (feature, "int16");
+  tdesc_create_vector (feature, "v8i", field_type, 8);
+
+  field_type = tdesc_named_type (feature, "uint8");
+  tdesc_create_vector (feature, "v16u", field_type, 16);
+
+  field_type = tdesc_named_type (feature, "int8");
+  tdesc_create_vector (feature, "v16i", field_type, 16);
+
+  field_type = tdesc_named_type (feature, "uint128");
+  tdesc_create_vector (feature, "v1u", field_type, 1);
+
+  field_type = tdesc_named_type (feature, "int128");
+  tdesc_create_vector (feature, "v1i", field_type, 1);
+
+  struct tdesc_type *type;
+  type = tdesc_create_union (feature, "vnd");
+  field_type = tdesc_named_type (feature, "v2d");
+  tdesc_add_field (type, "f", field_type);
+  field_type = tdesc_named_type (feature, "v2u");
+  tdesc_add_field (type, "u", field_type);
+  field_type = tdesc_named_type (feature, "v2i");
+  tdesc_add_field (type, "s", field_type);
+
+  type = tdesc_create_union (feature, "vns");
+  field_type = tdesc_named_type (feature, "v4f");
+  tdesc_add_field (type, "f", field_type);
+  field_type = tdesc_named_type (feature, "v4u");
+  tdesc_add_field (type, "u", field_type);
+  field_type = tdesc_named_type (feature, "v4i");
+  tdesc_add_field (type, "s", field_type);
+
+  type = tdesc_create_union (feature, "vnh");
+  field_type = tdesc_named_type (feature, "v8u");
+  tdesc_add_field (type, "u", field_type);
+  field_type = tdesc_named_type (feature, "v8i");
+  tdesc_add_field (type, "s", field_type);
+
+  type = tdesc_create_union (feature, "vnb");
+  field_type = tdesc_named_type (feature, "v16u");
+  tdesc_add_field (type, "u", field_type);
+  field_type = tdesc_named_type (feature, "v16i");
+  tdesc_add_field (type, "s", field_type);
+
+  type = tdesc_create_union (feature, "vnq");
+  field_type = tdesc_named_type (feature, "v1u");
+  tdesc_add_field (type, "u", field_type);
+  field_type = tdesc_named_type (feature, "v1i");
+  tdesc_add_field (type, "s", field_type);
+
+  type = tdesc_create_union (feature, "aarch64v");
+  field_type = tdesc_named_type (feature, "vnd");
+  tdesc_add_field (type, "d", field_type);
+  field_type = tdesc_named_type (feature, "vns");
+  tdesc_add_field (type, "s", field_type);
+  field_type = tdesc_named_type (feature, "vnh");
+  tdesc_add_field (type, "h", field_type);
+  field_type = tdesc_named_type (feature, "vnb");
+  tdesc_add_field (type, "b", field_type);
+  field_type = tdesc_named_type (feature, "vnq");
+  tdesc_add_field (type, "q", field_type);
+
+  regnum = 34;
+  tdesc_create_reg (feature, "v0", regnum++, 1, NULL, 128, "aarch64v");
+  tdesc_create_reg (feature, "v1", regnum++, 1, NULL, 128, "aarch64v");
+  tdesc_create_reg (feature, "v2", regnum++, 1, NULL, 128, "aarch64v");
+  tdesc_create_reg (feature, "v3", regnum++, 1, NULL, 128, "aarch64v");
+  tdesc_create_reg (feature, "v4", regnum++, 1, NULL, 128, "aarch64v");
+  tdesc_create_reg (feature, "v5", regnum++, 1, NULL, 128, "aarch64v");
+  tdesc_create_reg (feature, "v6", regnum++, 1, NULL, 128, "aarch64v");
+  tdesc_create_reg (feature, "v7", regnum++, 1, NULL, 128, "aarch64v");
+  tdesc_create_reg (feature, "v8", regnum++, 1, NULL, 128, "aarch64v");
+  tdesc_create_reg (feature, "v9", regnum++, 1, NULL, 128, "aarch64v");
+  tdesc_create_reg (feature, "v10", regnum++, 1, NULL, 128, "aarch64v");
+  tdesc_create_reg (feature, "v11", regnum++, 1, NULL, 128, "aarch64v");
+  tdesc_create_reg (feature, "v12", regnum++, 1, NULL, 128, "aarch64v");
+  tdesc_create_reg (feature, "v13", regnum++, 1, NULL, 128, "aarch64v");
+  tdesc_create_reg (feature, "v14", regnum++, 1, NULL, 128, "aarch64v");
+  tdesc_create_reg (feature, "v15", regnum++, 1, NULL, 128, "aarch64v");
+  tdesc_create_reg (feature, "v16", regnum++, 1, NULL, 128, "aarch64v");
+  tdesc_create_reg (feature, "v17", regnum++, 1, NULL, 128, "aarch64v");
+  tdesc_create_reg (feature, "v18", regnum++, 1, NULL, 128, "aarch64v");
+  tdesc_create_reg (feature, "v19", regnum++, 1, NULL, 128, "aarch64v");
+  tdesc_create_reg (feature, "v20", regnum++, 1, NULL, 128, "aarch64v");
+  tdesc_create_reg (feature, "v21", regnum++, 1, NULL, 128, "aarch64v");
+  tdesc_create_reg (feature, "v22", regnum++, 1, NULL, 128, "aarch64v");
+  tdesc_create_reg (feature, "v23", regnum++, 1, NULL, 128, "aarch64v");
+  tdesc_create_reg (feature, "v24", regnum++, 1, NULL, 128, "aarch64v");
+  tdesc_create_reg (feature, "v25", regnum++, 1, NULL, 128, "aarch64v");
+  tdesc_create_reg (feature, "v26", regnum++, 1, NULL, 128, "aarch64v");
+  tdesc_create_reg (feature, "v27", regnum++, 1, NULL, 128, "aarch64v");
+  tdesc_create_reg (feature, "v28", regnum++, 1, NULL, 128, "aarch64v");
+  tdesc_create_reg (feature, "v29", regnum++, 1, NULL, 128, "aarch64v");
+  tdesc_create_reg (feature, "v30", regnum++, 1, NULL, 128, "aarch64v");
+  tdesc_create_reg (feature, "v31", regnum++, 1, NULL, 128, "aarch64v");
+  tdesc_create_reg (feature, "fpsr", regnum++, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "fpcr", regnum++, 1, NULL, 32, "int");
+  return regnum;
+}
diff --git a/gdb/gdbserver/linux-aarch64-ipa.c b/gdb/gdbserver/linux-aarch64-ipa.c
index 28dc9776a1c8d273e8bc749296a57bc62b8619d5..b240100a13eccdfa696937158dbb365dcff12730 100644
--- a/gdb/gdbserver/linux-aarch64-ipa.c
+++ b/gdb/gdbserver/linux-aarch64-ipa.c
@@ -27,9 +27,6 @@
 #endif
 #include "linux-aarch64-tdesc.h"

-/* Defined in auto-generated file aarch64.c.  */
-void init_registers_aarch64 (void);
-
 /* Each register saved by the jump pad is in a 16 byte cell.  */
 #define FT_CR_SIZE 16

@@ -207,5 +204,4 @@ alloc_jump_pad_buffer (size_t size)
 void
 initialize_low_tracepoint (void)
 {
-  init_registers_aarch64 ();
 }
diff --git a/gdb/gdbserver/linux-aarch64-low.c b/gdb/gdbserver/linux-aarch64-low.c
index dcce287974cb6afd2f530ce1257dbbf25ed25ddc..9682537728847850d824c7eac949c68ab09226ac 100644
--- a/gdb/gdbserver/linux-aarch64-low.c
+++ b/gdb/gdbserver/linux-aarch64-low.c
@@ -41,9 +41,6 @@
 #include "arch/aarch64.h"
 #include "linux-aarch64-tdesc.h"

-/* Defined in auto-generated files.  */
-void init_registers_aarch64 (void);
-
 #ifdef HAVE_SYS_REG_H
 #include <sys/reg.h>
 #endif
@@ -2998,8 +2995,6 @@ struct linux_target_ops the_low_target =
 void
 initialize_low_arch (void)
 {
-  init_registers_aarch64 ();
-
   initialize_low_arch_aarch32 ();

   initialize_regsets_info (&aarch64_regsets_info);
diff --git a/gdb/gdbserver/linux-aarch64-tdesc.c b/gdb/gdbserver/linux-aarch64-tdesc.c
index 4148ed70c4ca973652e860492cd7cc1a249991d8..4a984caa8c0493cb65480c9988b3997dec95730b 100644
--- a/gdb/gdbserver/linux-aarch64-tdesc.c
+++ b/gdb/gdbserver/linux-aarch64-tdesc.c
@@ -35,6 +35,13 @@ aarch64_linux_read_description ()
   if (*tdesc == NULL)
     {
       *tdesc = aarch64_create_target_description ();
+
+      init_target_desc (*tdesc);
+
+#ifndef IN_PROCESS_AGENT
+      static const char *expedite_regs_aarch64[] = { "x29", "sp", "pc", NULL };
+      (*tdesc)->expedite_regs = expedite_regs_aarch64;
+#endif
     }

   return *tdesc;
diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c
index 4f5e9d60a6d98b5855d6ee4ffeaa9fd7149d6395..cb6e4e7c9055795eef9777c7226bd53975610340 100644
--- a/gdb/target-descriptions.c
+++ b/gdb/target-descriptions.c
@@ -2327,7 +2327,8 @@ maint_print_c_tdesc_cmd (const char *args, int from_tty)
      counterparts.  */
   if (startswith (filename_after_features.c_str (), "i386/32bit-")
       || startswith (filename_after_features.c_str (), "i386/64bit-")
-      || startswith (filename_after_features.c_str (), "i386/x32-core.xml"))
+      || startswith (filename_after_features.c_str (), "i386/x32-core.xml")
+      || startswith (filename_after_features.c_str (), "aarch64"))
     {
       print_c_feature v (filename_after_features);



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]