diff options
author | Tankut Baris Aktemur <tankut.baris.aktemur@intel.com> | 2025-01-29 10:50:31 +0100 |
---|---|---|
committer | Tankut Baris Aktemur <tankut.baris.aktemur@intel.com> | 2025-01-29 11:17:34 +0100 |
commit | fe1b4d6dd9e68c80e04776d78b54d3316fdf8883 (patch) | |
tree | 94aa8759b93c7b797400664d1cef1cd6039fc1ed | |
parent | b5a42cbfd9643c3c418efc553dd84a9293e0336e (diff) | |
download | binutils-fe1b4d6dd9e68c80e04776d78b54d3316fdf8883.zip binutils-fe1b4d6dd9e68c80e04776d78b54d3316fdf8883.tar.gz binutils-fe1b4d6dd9e68c80e04776d78b54d3316fdf8883.tar.bz2 |
gdbserver: define and use regcache::reset
Define a `reset` method for a regcache and use it for code
simplification. This patch allows further simplification in the next
patch.
The reset method fills the register data with zeroes. For the use in
get_thread_regcache, this is added behavior, making the patch not a
pure refactoring, and may look like extra overhead. However, it is
better to avoid having arbitrary values left in the data buffer.
Hence, it is considered a behavioral improvement.
Approved-By: Simon Marchi <simon.marchi@efficios.com>
-rw-r--r-- | gdbserver/regcache.cc | 31 | ||||
-rw-r--r-- | gdbserver/regcache.h | 4 |
2 files changed, 21 insertions, 14 deletions
diff --git a/gdbserver/regcache.cc b/gdbserver/regcache.cc index 8cdca50..bd053c0 100644 --- a/gdbserver/regcache.cc +++ b/gdbserver/regcache.cc @@ -52,8 +52,7 @@ get_thread_regcache (thread_info *thread, bool fetch) switch_to_thread (thread); /* Invalidate all registers, to prevent stale left-overs. */ - memset (regcache->register_status, REG_UNKNOWN, - regcache->tdesc->reg_defs.size ()); + regcache->reset (REG_UNKNOWN); fetch_inferior_registers (regcache, -1); regcache->registers_fetched = true; } @@ -130,11 +129,10 @@ regcache::regcache (const target_desc *tdesc) fetches. This way they'll read as zero instead of garbage. */ this->registers - = (unsigned char *) xcalloc (1, tdesc->registers_size); + = (unsigned char *) xmalloc (tdesc->registers_size); this->register_status = (unsigned char *) xmalloc (tdesc->reg_defs.size ()); - memset ((void *) this->register_status, REG_UNKNOWN, - tdesc->reg_defs.size ()); + reset (REG_UNKNOWN); } regcache::~regcache () @@ -147,6 +145,19 @@ regcache::~regcache () #endif void +regcache::reset (enum register_status status) +{ + /* Zero-initialize the register cache, in case there are registers + the target never fetches. This way they'll read as zero instead + of garbage. */ + memset (this->registers, 0, this->tdesc->registers_size); +#ifndef IN_PROCESS_AGENT + if (this->register_status != nullptr) + memset (this->register_status, status, this->tdesc->reg_defs.size ()); +#endif +} + +void regcache::copy_from (regcache *src) { gdb_assert (src != nullptr); @@ -360,15 +371,7 @@ supply_regblock (struct regcache *regcache, const void *buf) #endif } else - { - const struct target_desc *tdesc = regcache->tdesc; - - memset (regcache->registers, 0, tdesc->registers_size); -#ifndef IN_PROCESS_AGENT - for (int i = 0; i < tdesc->reg_defs.size (); i++) - regcache->set_register_status (i, REG_UNAVAILABLE); -#endif - } + regcache->reset (REG_UNAVAILABLE); } #ifndef IN_PROCESS_AGENT diff --git a/gdbserver/regcache.h b/gdbserver/regcache.h index 287dc54..f5db119 100644 --- a/gdbserver/regcache.h +++ b/gdbserver/regcache.h @@ -63,6 +63,10 @@ struct regcache : public reg_buffer_common DISABLE_COPY_AND_ASSIGN (regcache); + /* Clear the register values to all zeros and set the register + statuses to STATUS. */ + void reset (enum register_status status); + /* See gdbsupport/common-regcache.h. */ enum register_status get_register_status (int regnum) const override; |