[v2,1/5] Add regcache_map_supplies helper routine.

Message ID 20210712155353.75907-2-jhb@FreeBSD.org
State New
Headers show
Series
  • Add helper functions for FreeBSD native targets
Related show

Commit Message

John Baldwin July 12, 2021, 3:53 p.m.
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 | 27 +++++++++++++++++++++++++++
 gdb/regcache.h |  9 +++++++++
 2 files changed, 36 insertions(+)

-- 
2.31.1

Patch

diff --git a/gdb/regcache.c b/gdb/regcache.c
index fde0c61297..fe61512e50 100644
--- a/gdb/regcache.c
+++ b/gdb/regcache.c
@@ -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
diff --git a/gdb/regcache.h b/gdb/regcache.h
index ee254f381f..cd2e441fed 100644
--- a/gdb/regcache.h
+++ b/gdb/regcache.h
@@ -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.  */