From 30a696c543419bb9cadb844f9d2e2d6ecc66d3b5 Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Tue, 13 Jul 2021 08:16:12 -0700 Subject: 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. --- gdb/regcache.c | 27 +++++++++++++++++++++++++++ gdb/regcache.h | 9 +++++++++ 2 files changed, 36 insertions(+) diff --git a/gdb/regcache.c b/gdb/regcache.c index ac44d714ddc..672da0556fc 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 ee254f381f4..cd2e441fed4 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. */ -- cgit v1.2.1