[1/4] Add aarch64_create_target_description

Message ID 04DE907F-329F-4AB5-9EB1-4F83E05C992E@arm.com
State New, archived
Headers

Commit Message

Alan Hayward Oct. 25, 2017, 8:28 a.m. UTC
  The first of a set of patches moving aarch64 over to use flexible
target descriptors.

For this patch, instead of accessing tdesc_aarch64 directly, obtain
it from the function aarch64_read_description.

For now, aarch64_create_target_description simply returns tdesc_aarch64.
This will be changes in the final patch.

This patch introduces no functionality changes.

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>

	* Makefile.in: Add new files.
	* aarch64-linux-nat.c (aarch64_linux_read_description): Call
	aarch64_read_description.
	* aarch64-linux-tdep.c (aarch64_linux_core_read_description):
	Call aarch64_read_description.
	* aarch64-tdep.c (aarch64_read_description): New function.
	(aarch64_gdbarch_init): Call aarch64_read_description.
	* aarch64-tdep.h (aarch64_read_description): New function.
	* arch/aarch64.c: New file.
	* configure.tgt: Add new files.
  

Comments

Yao Qi Oct. 30, 2017, noon UTC | #1
Alan Hayward <Alan.Hayward@arm.com> writes:

> +/* The Aarch64 target descriptor.  */

s/descriptor/description/

> +static const struct target_desc *aarch64_tdesc = NULL;
> +

Remove "struct".

Can you move aarch64_tdesc to aarch64_read_description?  I think it
only needs to be visible inside that function.

>  /* The standard register names, and all the valid aliases for them.  */
>  static const struct
>  {
> @@ -2827,6 +2830,19 @@ aarch64_displaced_step_hw_singlestep (struct gdbarch *gdbarch,
>    return 1;
>  }
>
> +/* Get the correct target description.  */
> +
> +const target_desc *
> +aarch64_read_description ()

Otherwise, the patch is good to me.
  

Patch

diff --git a/gdb/Makefile.in b/gdb/Makefile.in
index e21ea55197fb2735762d540fba54de8c8b71bdf0..029e554306704c5a543b5c24b72908a95f4f85d3 100644
--- a/gdb/Makefile.in
+++ b/gdb/Makefile.in
@@ -779,6 +779,7 @@  ALL_64_TARGET_OBS = \
 	amd64-sol2-tdep.o \
 	amd64-tdep.o \
 	amd64-windows-tdep.o \
+	arch/aarch64.o \
 	arch/aarch64-insn.o \
 	arch/amd64.o \
 	ia64-linux-tdep.o \
@@ -1514,6 +1515,7 @@  HFILES_NO_SRCDIR = \
 	xml-syscall.h \
 	xml-tdesc.h \
 	xtensa-tdep.h \
+	arch/aarch64.h \
 	arch/aarch64-insn.h \
 	arch/arm.h \
 	arch/i386.h \
diff --git a/gdb/aarch64-linux-nat.c b/gdb/aarch64-linux-nat.c
index 4feaec39d910485d66cdb87a3615eee8a0c112e4..e571d926b462b7988f06bb65036a53b3ac68dd4f 100644
--- a/gdb/aarch64-linux-nat.c
+++ b/gdb/aarch64-linux-nat.c
@@ -501,7 +501,7 @@  aarch64_linux_read_description (struct target_ops *ops)
   if (ret == 0)
     return tdesc_arm_with_neon;
   else
-    return tdesc_aarch64;
+    return aarch64_read_description ();
 }

 /* Convert a native/host siginfo object, into/from the siginfo in the
diff --git a/gdb/aarch64-linux-tdep.c b/gdb/aarch64-linux-tdep.c
index b6052bafd6d47e594b1452b565371f9bc1d84200..c2c2c309338a2ec814b615ac6c728bab7d5a4736 100644
--- a/gdb/aarch64-linux-tdep.c
+++ b/gdb/aarch64-linux-tdep.c
@@ -244,7 +244,7 @@  aarch64_linux_core_read_description (struct gdbarch *gdbarch,
   if (target_auxv_search (target, AT_HWCAP, &aarch64_hwcap) != 1)
     return NULL;

-  return tdesc_aarch64;
+  return aarch64_read_description ();
 }

 /* Implementation of `gdbarch_stap_is_single_operand', as defined in
diff --git a/gdb/aarch64-tdep.h b/gdb/aarch64-tdep.h
index 2597443560f9caf9f7ce0d95cf3325a423b91e02..d9cbd353f3feaea12fb4a07cf4944f305326fc8f 100644
--- a/gdb/aarch64-tdep.h
+++ b/gdb/aarch64-tdep.h
@@ -75,7 +75,7 @@  struct gdbarch_tdep
   int (*aarch64_syscall_record) (struct regcache *regcache, unsigned long svc_number);
 };

-extern struct target_desc *tdesc_aarch64;
+const target_desc *aarch64_read_description ();

 extern int aarch64_process_record (struct gdbarch *gdbarch,
                                struct regcache *regcache, CORE_ADDR addr);
diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c
index a40dc69b92dbacc06907c6a56f715d47632201a2..96d1391a193a43100e0fd4a262210ac7e90242dc 100644
--- a/gdb/aarch64-tdep.c
+++ b/gdb/aarch64-tdep.c
@@ -73,6 +73,9 @@ 
 #define AARCH64_H0_REGNUM (AARCH64_S0_REGNUM + 32)
 #define AARCH64_B0_REGNUM (AARCH64_H0_REGNUM + 32)

+/* The Aarch64 target descriptor.  */
+static const struct target_desc *aarch64_tdesc = NULL;
+
 /* The standard register names, and all the valid aliases for them.  */
 static const struct
 {
@@ -2827,6 +2830,19 @@  aarch64_displaced_step_hw_singlestep (struct gdbarch *gdbarch,
   return 1;
 }

+/* Get the correct target description.  */
+
+const target_desc *
+aarch64_read_description ()
+{
+  struct target_desc **tdesc = (struct target_desc **) &aarch64_tdesc;
+
+  if (*tdesc == NULL)
+    *tdesc = aarch64_create_target_description ();
+
+  return *tdesc;
+}
+
 /* Initialize the current architecture based on INFO.  If possible,
    re-use an architecture from ARCHES, which is a list of
    architectures already created during this debugging session.
@@ -2850,7 +2866,7 @@  aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)

   /* Ensure we always have a target descriptor.  */
   if (!tdesc_has_registers (tdesc))
-    tdesc = tdesc_aarch64;
+    tdesc = aarch64_read_description ();

   gdb_assert (tdesc);

diff --git a/gdb/arch/aarch64.h b/gdb/arch/aarch64.h
index b52740529b182bd63744022e552c3cdb3bc16759..ebb78c4fa80b4b659f85797dc0a0d84e83de4bba 100644
--- a/gdb/arch/aarch64.h
+++ b/gdb/arch/aarch64.h
@@ -20,6 +20,10 @@ 
 #ifndef ARCH_AARCH64_H
 #define ARCH_AARCH64_H

+#include "tdesc.h"
+
+target_desc *aarch64_create_target_description ();
+
 /* Register numbers of various important registers.  */
 enum aarch64_regnum
 {
diff --git a/gdb/arch/aarch64.c b/gdb/arch/aarch64.c
new file mode 100644
index 0000000000000000000000000000000000000000..95d9906f10e660fda99d73a0d2a9d184fd3a7b52
--- /dev/null
+++ b/gdb/arch/aarch64.c
@@ -0,0 +1,30 @@ 
+/* Copyright (C) 2017 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+
+#include "aarch64.h"
+
+extern struct target_desc *tdesc_aarch64;
+
+/* Create the aarch64 target description.  */
+
+target_desc *
+aarch64_create_target_description ()
+{
+  return tdesc_aarch64;
+}
+
diff --git a/gdb/configure.tgt b/gdb/configure.tgt
index 1fce0798e24e162d7c456d7b881b298334ff0fbc..daec0a7bcd31944679b87fb4c3775dedc15dfd21 100644
--- a/gdb/configure.tgt
+++ b/gdb/configure.tgt
@@ -114,7 +114,7 @@  aarch64*-*-freebsd*)

 aarch64*-*-linux*)
 	# Target: AArch64 linux
-	gdb_target_obs="aarch64-linux-tdep.o \
+	gdb_target_obs="aarch64-linux-tdep.o arch/aarch64.o\
 			arch/arm.o arch/arm-linux.o arch/arm-get-next-pcs.o \
 			arm-tdep.o arm-linux-tdep.o \
 			glibc-tdep.o linux-tdep.o solib-svr4.o \