diff --git a/gdb/regcache.c b/gdb/regcache.c index 650e5bbe955..02d6bdc271c 100644 --- a/gdb/regcache.c +++ b/gdb/regcache.c @@ -1185,7 +1185,7 @@ regcache::transfer_regset_register (struct regcache *out_regcache, int regnum, /* See regcache.h. */ void -regcache::transfer_regset (const struct regset *regset, +regcache::transfer_regset (const struct regset *regset, int regbase, struct regcache *out_regcache, int regnum, const gdb_byte *in_buf, gdb_byte *out_buf, size_t size) const @@ -1200,6 +1200,9 @@ regcache::transfer_regset (const struct regset *regset, int regno = map->regno; int slot_size = map->size; + if (regno != REGCACHE_MAP_SKIP) + regno += regbase; + if (slot_size == 0 && regno != REGCACHE_MAP_SKIP) slot_size = m_descr->sizeof_register[regno]; @@ -1243,11 +1246,14 @@ regcache_supply_regset (const struct regset *regset, regcache->supply_regset (regset, regnum, (const gdb_byte *) buf, size); } +/* See regcache.h. */ + void -regcache::supply_regset (const struct regset *regset, +regcache::supply_regset (const struct regset *regset, int regbase, int regnum, const void *buf, size_t size) { - transfer_regset (regset, this, regnum, (const gdb_byte *) buf, nullptr, size); + transfer_regset (regset, regbase, this, regnum, (const gdb_byte *) buf, + nullptr, size); } /* Collect register REGNUM from REGCACHE to BUF, using the register @@ -1262,15 +1268,16 @@ regcache_collect_regset (const struct regset *regset, regcache->collect_regset (regset, regnum, (gdb_byte *) buf, size); } +/* See regcache.h */ + void -regcache::collect_regset (const struct regset *regset, +regcache::collect_regset (const struct regset *regset, int regbase, int regnum, void *buf, size_t size) const { - transfer_regset (regset, nullptr, regnum, nullptr, (gdb_byte *) buf, size); + transfer_regset (regset, regbase, 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) diff --git a/gdb/regcache.h b/gdb/regcache.h index 1dbba5ce9af..2b2717fa2d4 100644 --- a/gdb/regcache.h +++ b/gdb/regcache.h @@ -375,12 +375,32 @@ public: void cooked_write_part (int regnum, int offset, int len, const gdb_byte *buf); - void supply_regset (const struct regset *regset, + /* Transfer a set of registers (as described by REGSET) between + REGCACHE and BUF. If REGNUM == -1, transfer all registers + belonging to the regset, otherwise just the register numbered + REGNUM. The REGSET's 'regmap' field must point to an array of + 'struct regcache_map_entry'. The valid register numbers in each + entry in 'struct regcache_map_entry' are offset by REGBASE. */ + + void supply_regset (const struct regset *regset, int regbase, int regnum, const void *buf, size_t size); + void collect_regset (const struct regset *regset, int regbase, int regnum, + void *buf, size_t size) const; + + /* Same as the above, but with REGBASE == 0. */ + + void supply_regset (const struct regset *regset, + int regnum, const void *buf, size_t size) + { + supply_regset (regset, 0, regnum, buf, size); + } void collect_regset (const struct regset *regset, int regnum, - void *buf, size_t size) const; + void *buf, size_t size) const + { + collect_regset (regset, 0, regnum, buf, size); + } /* Return REGCACHE's ptid. */ @@ -419,7 +439,7 @@ private: /* Transfer a single or all registers belonging to a certain register set to or from a buffer. This is the main worker function for regcache_supply_regset and regcache_collect_regset. */ - void transfer_regset (const struct regset *regset, + void transfer_regset (const struct regset *regset, int regbase, struct regcache *out_regcache, int regnum, const gdb_byte *in_buf, gdb_byte *out_buf, size_t size) const;