Add regcache_map_supplies helper routine.
authorJohn Baldwin <jhb@FreeBSD.org>
Tue, 13 Jul 2021 15:16:12 +0000 (08:16 -0700)
committerJohn Baldwin <jhb@FreeBSD.org>
Tue, 13 Jul 2021 15:16:12 +0000 (08:16 -0700)
This helper can be used in the fetch_registers and store_registers
target methods to determine if a register set includes a specific
register.

gdb/regcache.c
gdb/regcache.h

index ac44d714ddc163fc9b02832ec8aed2a7c79569af..672da0556fcc2196f0632ddddcf345df076f35e8 100644 (file)
@@ -1264,6 +1264,33 @@ regcache::collect_regset (const struct regset *regset,
   transfer_regset (regset, nullptr, regnum, nullptr, (gdb_byte *) buf, size);
 }
 
+/* See regcache.h  */
+
+bool
+regcache_map_supplies (const struct regcache_map_entry *map, int regnum,
+                      struct gdbarch *gdbarch, size_t size)
+{
+  int offs = 0, count;
+
+  for (; (count = map->count) != 0; map++)
+    {
+      int regno = map->regno;
+      int slot_size = map->size;
+
+      if (slot_size == 0 && regno != REGCACHE_MAP_SKIP)
+       slot_size = register_size (gdbarch, regno);
+
+      if (regno != REGCACHE_MAP_SKIP && regnum >= regno
+         && regnum < regno + count)
+       return offs + (regnum - regno + 1) * slot_size <= size;
+
+      offs += count * slot_size;
+      if (offs >= size)
+       return false;
+    }
+  return false;
+}
+
 /* See gdbsupport/common-regcache.h.  */
 
 bool
index ee254f381f4caaf0268cbb52ae69fc8fcf5bd414..cd2e441fed42eb463db4e3842604af629386e66a 100644 (file)
@@ -150,6 +150,15 @@ extern void regcache_collect_regset (const struct regset *regset,
                                     int regnum, void *buf, size_t size);
 
 
+/* Return true if a set of registers contains the value of the
+   register numbered REGNUM.  The size of the set of registers is
+   given in SIZE, and the layout of the set of registers is described
+   by MAP.  */
+
+extern bool regcache_map_supplies (const struct regcache_map_entry *map,
+                                  int regnum, struct gdbarch *gdbarch,
+                                  size_t size);
+
 /* The type of a register.  This function is slightly more efficient
    then its gdbarch vector counterpart since it returns a precomputed
    value stored in a table.  */