]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
gdbserver: use REG_UNKNOWN for a regcache's register statuses
authorTankut Baris Aktemur <tankut.baris.aktemur@intel.com>
Wed, 29 Jan 2025 09:50:31 +0000 (10:50 +0100)
committerTankut Baris Aktemur <tankut.baris.aktemur@intel.com>
Wed, 29 Jan 2025 10:17:34 +0000 (11:17 +0100)
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>
gdbserver/regcache.cc
gdbserver/regcache.h

index 99291e40e09a3198269b50b6190eba79bd365d33..8cdca5083bc3b1131f31878c528a46d7e03bd160 100644 (file)
@@ -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 ());
 }
 
index 1a252d40255017100dd86c532f4a22f937e7f7d9..287dc549d888358a35cee6fc6c6d5b2dc1f0deb1 100644 (file)
@@ -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.