aboutsummaryrefslogtreecommitdiff
path: root/gdb/regcache.c
diff options
context:
space:
mode:
authorJohn Baldwin <jhb@FreeBSD.org>2021-07-13 08:16:12 -0700
committerJohn Baldwin <jhb@FreeBSD.org>2021-07-13 08:16:12 -0700
commit30a696c543419bb9cadb844f9d2e2d6ecc66d3b5 (patch)
treeb5cf1f5c88247850a01aca413ccefc7bb03fcbc0 /gdb/regcache.c
parent3a76f8f489428bada97c9dea2145448a3e0f7135 (diff)
downloadfsf-binutils-gdb-30a696c543419bb9cadb844f9d2e2d6ecc66d3b5.zip
fsf-binutils-gdb-30a696c543419bb9cadb844f9d2e2d6ecc66d3b5.tar.gz
fsf-binutils-gdb-30a696c543419bb9cadb844f9d2e2d6ecc66d3b5.tar.bz2
Add regcache_map_supplies helper routine.
This helper can be used in the fetch_registers and store_registers target methods to determine if a register set includes a specific register.
Diffstat (limited to 'gdb/regcache.c')
-rw-r--r--gdb/regcache.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/gdb/regcache.c b/gdb/regcache.c
index ac44d71..672da05 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