This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [commit] Allow cached cooked reads


On Jun 16, 9:22am, Andrew Cagney wrote:


Just stumbled across this. When trying to save cooked registers the regcache was triggering an assertion failure instead of ignoring a bogus request.

2003-06-16 Andrew Cagney <cagney@redhat.com>

* regcache.c (do_cooked_read): Do not use register_valid_p.

Index: regcache.c
===================================================================
RCS file: /cvs/src/src/gdb/regcache.c,v
retrieving revision 1.87
diff -u -r1.87 regcache.c
--- regcache.c	9 Jun 2003 01:02:06 -0000	1.87
+++ regcache.c	16 Jun 2003 13:18:46 -0000
@@ -423,8 +423,7 @@
 do_cooked_read (void *src, int regnum, void *buf)
 {
   struct regcache *regcache = src;
-  if (!regcache_valid_p (regcache, regnum)
-      && regcache->readonly_p)
+  if (!regcache->register_valid_p[regnum] && regcache->readonly_p)
     /* Don't even think about fetching a register from a read-only
        cache when the register isn't yet valid.  There isn't a target
        from which the register value can be fetched.  */


Which assertion was failing?  The check for regcache != NULL or the
bounds check?

The bounds check. If regcache were NULL, GDB would be sunk.


I'm wondering if the new code above should include some bounds checks. Alternately, go back to using regcache_valid_p() and weaken the
assertions in regcache_valid_p() somewhat. E.g, perhaps rewrite
regcache_valid_p() from:



int
regcache_valid_p (struct regcache *regcache, int regnum)
{
  gdb_assert (regcache != NULL);
  gdb_assert (regnum >= 0 && regnum < regcache->descr->nr_raw_registers);
  return regcache->register_valid_p[regnum];
}

to:

int
regcache_valid_p (struct regcache *regcache, int regnum)
{
  gdb_assert (regcache != NULL);
  gdb_assert (regnum >= 0);
  return regnum < regcache->descr->nr_raw_registers)
         && regcache->register_valid_p[regnum];
}

The intent of the external function is to indicate to external code if a raw register is valid (as in fetched). So external code trying to call this with regnum >= NUM_REGS is broken.


Andrew



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]