diff options
author | John Baldwin <jhb@FreeBSD.org> | 2021-07-13 08:16:12 -0700 |
---|---|---|
committer | John Baldwin <jhb@FreeBSD.org> | 2021-07-13 08:16:12 -0700 |
commit | 30a696c543419bb9cadb844f9d2e2d6ecc66d3b5 (patch) | |
tree | b5cf1f5c88247850a01aca413ccefc7bb03fcbc0 | |
parent | 3a76f8f489428bada97c9dea2145448a3e0f7135 (diff) | |
download | gdb-30a696c543419bb9cadb844f9d2e2d6ecc66d3b5.zip gdb-30a696c543419bb9cadb844f9d2e2d6ecc66d3b5.tar.gz 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.
-rw-r--r-- | gdb/regcache.c | 27 | ||||
-rw-r--r-- | gdb/regcache.h | 9 |
2 files changed, 36 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 diff --git a/gdb/regcache.h b/gdb/regcache.h index ee254f3..cd2e441 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. */ |