aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTankut Baris Aktemur <tankut.baris.aktemur@intel.com>2025-01-29 10:50:31 +0100
committerTankut Baris Aktemur <tankut.baris.aktemur@intel.com>2025-01-29 11:17:34 +0100
commitb5a42cbfd9643c3c418efc553dd84a9293e0336e (patch)
tree97750d4a02aac4a15102a1c8444bd1813f887e79
parent41ef481066787b9c72eda27810959f18ddd84f93 (diff)
downloadbinutils-b5a42cbfd9643c3c418efc553dd84a9293e0336e.zip
binutils-b5a42cbfd9643c3c418efc553dd84a9293e0336e.tar.gz
binutils-b5a42cbfd9643c3c418efc553dd84a9293e0336e.tar.bz2
gdbserver: use REG_UNKNOWN for a regcache's register statuses
When a regcache is initialized, the values of registers are not fetched yet. Thus, initialize the register statuses to REG_UNKNOWN instead of REG_UNAVAILABLE, because the latter rather means "we attempted to fetch but could not obtain the value". The definitions of the reg status enums (from gdbsupport/common-regcache.h) as a reminder: /* The register value is not in the cache, and we don't know yet whether it's available in the target (or traceframe). */ REG_UNKNOWN = 0, /* The register value is valid and cached. */ REG_VALID = 1, /* The register value is unavailable. E.g., we're inspecting a traceframe, and this register wasn't collected. Note that this "unavailable" is different from saying the register does not exist in the target's architecture --- in that case, the target should have given us a target description that does not include the register in the first place. */ REG_UNAVAILABLE = -1 Similarly, when the regcache is invalidated, change all the statuses back to REG_UNKNOWN. Approved-By: Simon Marchi <simon.marchi@efficios.com>
-rw-r--r--gdbserver/regcache.cc4
-rw-r--r--gdbserver/regcache.h2
2 files changed, 3 insertions, 3 deletions
diff --git a/gdbserver/regcache.cc b/gdbserver/regcache.cc
index 99291e4..8cdca50 100644
--- a/gdbserver/regcache.cc
+++ b/gdbserver/regcache.cc
@@ -52,7 +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_UNAVAILABLE,
+ memset (regcache->register_status, REG_UNKNOWN,
regcache->tdesc->reg_defs.size ());
fetch_inferior_registers (regcache, -1);
regcache->registers_fetched = true;
@@ -133,7 +133,7 @@ regcache::regcache (const target_desc *tdesc)
= (unsigned char *) xcalloc (1, tdesc->registers_size);
this->register_status
= (unsigned char *) xmalloc (tdesc->reg_defs.size ());
- memset ((void *) this->register_status, REG_UNAVAILABLE,
+ memset ((void *) this->register_status, REG_UNKNOWN,
tdesc->reg_defs.size ());
}
diff --git a/gdbserver/regcache.h b/gdbserver/regcache.h
index 1a252d4..287dc54 100644
--- a/gdbserver/regcache.h
+++ b/gdbserver/regcache.h
@@ -43,7 +43,7 @@ struct regcache : public reg_buffer_common
bool registers_owned = false;
unsigned char *registers = nullptr;
#ifndef IN_PROCESS_AGENT
- /* One of REG_UNAVAILABLE or REG_VALID. */
+ /* See gdbsupport/common-regcache.h. */
unsigned char *register_status = nullptr;
/* Construct a regcache using the register layout described by TDESC.