]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Add target_description_changed_p and target_get_tdep_info methods
authorAlan Hayward <alan.hayward@arm.com>
Wed, 7 Nov 2018 15:15:05 +0000 (15:15 +0000)
committerAlan Hayward <alan.hayward@arm.com>
Wed, 7 Nov 2018 15:16:29 +0000 (15:16 +0000)
target_description_changed_p () is added as a new gdbarch function.
Given a list of register values received from the inferior, it will check if
the current target descriptor is no longer valid for the inferior. This is
required because on SVE the register sizes can change whilst the inferior is
running.

target_get_tdep_info () is added as a new gdbarch function.
Given a list of registers, it will return a tdep info which then can be used
when creating/finding a valid target descriptor for that inferior.

Include stubbed aarch64 versions.

2018-11-07  Alan Hayward  <alan.hayward@arm.com>

gdb/
* aarch64-tdep.c (aarch64_target_description_changed_p): New function.
(aarch64_target_get_tdep_info): New function.
(aarch64_gdbarch_init): Add in the new functions
* arch-utils.c (default_target_description_changed_p): New function.
(default_target_get_tdep_info): New function.
* arch-utils.h: (default_target_description_changed_p): New
declaration.
(default_target_get_tdep_info): New declaration.
* gdbarch.c: Regenerate.
* gdbarch.h: Regenerate.
* gdbarch.sh: (target_description_changed_p): New function.
(target_get_tdep_info): New function.

gdb/aarch64-tdep.c
gdb/arch-utils.c
gdb/arch-utils.h
gdb/gdbarch.c
gdb/gdbarch.h
gdb/gdbarch.sh
gdb/regcache.h
gdb/remote.c

index 7f33c48c05b84098b504fc1dbf4e3ec356afeb6e..6a5e712afbea6cbedbea22589a4e11bea905ba59 100644 (file)
@@ -2963,6 +2963,24 @@ aarch64_get_tdesc_vq (const struct target_desc *tdesc)
 }
 
 
+/* Implement the "target_description_changed_p" gdbarch method.  */
+
+static bool
+aarch64_target_description_changed_p (struct gdbarch *gdbarch,
+                                     ptid_t ptid,
+                                     VEC (cached_reg_t) *registers)
+{
+  return false;
+}
+
+/* Implement the "target_get_tdep_info" gdbarch method.  */
+
+static union gdbarch_target_info
+aarch64_target_get_tdep_info (VEC (cached_reg_t) *registers)
+{
+  return {0};
+}
+
 /* 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.
@@ -3128,6 +3146,9 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   set_tdesc_pseudo_register_type (gdbarch, aarch64_pseudo_register_type);
   set_tdesc_pseudo_register_reggroup_p (gdbarch,
                                        aarch64_pseudo_register_reggroup_p);
+  set_gdbarch_target_description_changed_p
+    (gdbarch, aarch64_target_description_changed_p);
+  set_gdbarch_target_get_tdep_info (gdbarch, aarch64_target_get_tdep_info);
 
   /* ABI */
   set_gdbarch_short_bit (gdbarch, 16);
index 6b40cb91607f0a15a8183722a008f9dfc5c8deeb..baedeb4c73be0968bd2de437b51c6688c7d28de8 100644 (file)
@@ -996,6 +996,24 @@ default_type_align (struct gdbarch *gdbarch, struct type *type)
   return type_length_units (check_typedef (type));
 }
 
+/* See arch-utils.h.  */
+
+bool
+default_target_description_changed_p (struct gdbarch *gdbarch,
+                                     ptid_t ptid,
+                                     VEC (cached_reg_t) *registers)
+{
+  return false;
+}
+
+/* See arch-utils.h.  */
+
+union gdbarch_target_info
+default_target_get_tdep_info (VEC (cached_reg_t) *registers)
+{
+  return {0};
+}
+
 void
 _initialize_gdbarch_utils (void)
 {
index 77ee9af2bfc9ad2e376071161bdf0b2d6f9279b5..508adf5a5467101bb5f67184686d21fd4d4b8c3f 100644 (file)
@@ -271,4 +271,13 @@ extern bool default_in_indirect_branch_thunk (gdbarch *gdbarch,
 extern ULONGEST default_type_align (struct gdbarch *gdbarch,
                                    struct type *type);
 
+/* Default implementation of target_description_changed_p.  Returns False.  */
+extern bool default_target_description_changed_p
+  (struct gdbarch *gdbarch, ptid_t ptid, VEC (cached_reg_t) *registers);
+
+/* Default implementation of default_target_get_tdep_info.  Returns null
+   info.  */
+extern union gdbarch_target_info default_target_get_tdep_info
+  (VEC (cached_reg_t) *registers);
+
 #endif
index 19dacea34fe881df11e5c05a372e1ec787c7c30b..9d4745b08f12d7c3aa364281db6cfa1c4d282139 100644 (file)
@@ -354,6 +354,8 @@ struct gdbarch
   char ** disassembler_options;
   const disasm_options_and_args_t * valid_disassembler_options;
   gdbarch_type_align_ftype *type_align;
+  gdbarch_target_description_changed_p_ftype *target_description_changed_p;
+  gdbarch_target_get_tdep_info_ftype *target_get_tdep_info;
 };
 
 /* Create a new ``struct gdbarch'' based on information provided by
@@ -466,6 +468,8 @@ gdbarch_alloc (const struct gdbarch_info *info,
   gdbarch->gnu_triplet_regexp = default_gnu_triplet_regexp;
   gdbarch->addressable_memory_unit_size = default_addressable_memory_unit_size;
   gdbarch->type_align = default_type_align;
+  gdbarch->target_description_changed_p = default_target_description_changed_p;
+  gdbarch->target_get_tdep_info = default_target_get_tdep_info;
   /* gdbarch_alloc() */
 
   return gdbarch;
@@ -712,6 +716,8 @@ verify_gdbarch (struct gdbarch *gdbarch)
   /* Skip verify of disassembler_options, invalid_p == 0 */
   /* Skip verify of valid_disassembler_options, invalid_p == 0 */
   /* Skip verify of type_align, invalid_p == 0 */
+  /* Skip verify of target_description_changed_p, invalid_p == 0 */
+  /* Skip verify of target_get_tdep_info, invalid_p == 0 */
   if (!log.empty ())
     internal_error (__FILE__, __LINE__,
                     _("verify_gdbarch: the following are invalid ...%s"),
@@ -1437,6 +1443,12 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file)
   fprintf_unfiltered (file,
                       "gdbarch_dump: target_desc = %s\n",
                       host_address_to_string (gdbarch->target_desc));
+  fprintf_unfiltered (file,
+                      "gdbarch_dump: target_description_changed_p = <%s>\n",
+                      host_address_to_string (gdbarch->target_description_changed_p));
+  fprintf_unfiltered (file,
+                      "gdbarch_dump: target_get_tdep_info = <%s>\n",
+                      host_address_to_string (gdbarch->target_get_tdep_info));
   fprintf_unfiltered (file,
                       "gdbarch_dump: type_align = <%s>\n",
                       host_address_to_string (gdbarch->type_align));
@@ -5117,6 +5129,40 @@ set_gdbarch_type_align (struct gdbarch *gdbarch,
   gdbarch->type_align = type_align;
 }
 
+bool
+gdbarch_target_description_changed_p (struct gdbarch *gdbarch, ptid_t ptid, VEC (cached_reg_t) *registers)
+{
+  gdb_assert (gdbarch != NULL);
+  gdb_assert (gdbarch->target_description_changed_p != NULL);
+  if (gdbarch_debug >= 2)
+    fprintf_unfiltered (gdb_stdlog, "gdbarch_target_description_changed_p called\n");
+  return gdbarch->target_description_changed_p (gdbarch, ptid, registers);
+}
+
+void
+set_gdbarch_target_description_changed_p (struct gdbarch *gdbarch,
+                                          gdbarch_target_description_changed_p_ftype target_description_changed_p)
+{
+  gdbarch->target_description_changed_p = target_description_changed_p;
+}
+
+union gdbarch_target_info
+gdbarch_target_get_tdep_info (struct gdbarch *gdbarch, VEC (cached_reg_t) *registers)
+{
+  gdb_assert (gdbarch != NULL);
+  gdb_assert (gdbarch->target_get_tdep_info != NULL);
+  if (gdbarch_debug >= 2)
+    fprintf_unfiltered (gdb_stdlog, "gdbarch_target_get_tdep_info called\n");
+  return gdbarch->target_get_tdep_info (registers);
+}
+
+void
+set_gdbarch_target_get_tdep_info (struct gdbarch *gdbarch,
+                                  gdbarch_target_get_tdep_info_ftype target_get_tdep_info)
+{
+  gdbarch->target_get_tdep_info = target_get_tdep_info;
+}
+
 
 /* Keep a registry of per-architecture data-pointers required by GDB
    modules.  */
index dcbf9d158ac9b52418dd67e4080d0e46ceec587c..2abf66c1cdf20d8480e0ffc2f0a794f718bb6ff3 100644 (file)
@@ -1587,6 +1587,23 @@ typedef ULONGEST (gdbarch_type_align_ftype) (struct gdbarch *gdbarch, struct typ
 extern ULONGEST gdbarch_type_align (struct gdbarch *gdbarch, struct type *type);
 extern void set_gdbarch_type_align (struct gdbarch *gdbarch, gdbarch_type_align_ftype *type_align);
 
+/* Given a list of register values (in a VEC of reg_info_t structures) received
+   from the inferior, check if the current target descriptor is no longer valid
+   for the inferior (for example, register sizes have changed), and if so return
+   true.  The default implementation will always return false. */
+
+typedef bool (gdbarch_target_description_changed_p_ftype) (struct gdbarch *gdbarch, ptid_t ptid, VEC (cached_reg_t) *registers);
+extern bool gdbarch_target_description_changed_p (struct gdbarch *gdbarch, ptid_t ptid, VEC (cached_reg_t) *registers);
+extern void set_gdbarch_target_description_changed_p (struct gdbarch *gdbarch, gdbarch_target_description_changed_p_ftype *target_description_changed_p);
+
+/* Given a list of registers, return a tdep info which then can be used when
+   creating/finding a valid target descriptor for that inferior. The default
+   implementation will always return null. */
+
+typedef union gdbarch_target_info (gdbarch_target_get_tdep_info_ftype) (VEC (cached_reg_t) *registers);
+extern union gdbarch_target_info gdbarch_target_get_tdep_info (struct gdbarch *gdbarch, VEC (cached_reg_t) *registers);
+extern void set_gdbarch_target_get_tdep_info (struct gdbarch *gdbarch, gdbarch_target_get_tdep_info_ftype *target_get_tdep_info);
+
 /* Definition for an unknown syscall, used basically in error-cases.  */
 #define UNKNOWN_SYSCALL (-1)
 
index 577bdd67f5e497fe2d88e240607d09be21379afc..ac2aa59c64921c2a851f8aa3afde86ee32fd3e08 100755 (executable)
@@ -1166,6 +1166,17 @@ v;const disasm_options_and_args_t *;valid_disassembler_options;;;0;0;;0;host_add
 # Type alignment.
 m;ULONGEST;type_align;struct type *type;type;;default_type_align;;0
 
+# Given a list of register values (in a VEC of reg_info_t structures) received
+# from the inferior, check if the current target descriptor is no longer valid
+# for the inferior (for example, register sizes have changed), and if so return
+# true.  The default implementation will always return false.
+m;bool;target_description_changed_p;ptid_t ptid, VEC (cached_reg_t) *registers;ptid, registers;;default_target_description_changed_p;;0
+
+# Given a list of registers, return a tdep info which then can be used when
+# creating/finding a valid target descriptor for that inferior. The default
+# implementation will always return null.
+f;union gdbarch_target_info;target_get_tdep_info;VEC (cached_reg_t) *registers;registers;;default_target_get_tdep_info;;0
+
 EOF
 }
 
index 374826cdb822efd7f8fbede38f9c3032f6d7db63..bbc49f386d0fdc418f464d9d48e4418d9365dfa0 100644 (file)
@@ -169,6 +169,8 @@ typedef struct cached_reg
   gdb_byte *data;
 } cached_reg_t;
 
+DEF_VEC_O(cached_reg_t);
+
 /* Buffer of registers.  */
 
 class reg_buffer : public reg_buffer_common
index c53553af5bda82ec142b67fb1cdda15802d11b0a..c1e95bb2fceed91dc8d99ca51f36aa4e71a3e544 100644 (file)
@@ -6841,8 +6841,6 @@ remote_console_output (char *msg)
   gdb_flush (gdb_stdtarg);
 }
 
-DEF_VEC_O(cached_reg_t);
-
 typedef struct stop_reply
 {
   struct notif_event base;