diff options
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/regcache.c | 29 |
2 files changed, 17 insertions, 17 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 8f259c1..e5600dc 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2011-03-23 Pedro Alves <pedro@codesourcery.com> + + * regcache.c (regcache_raw_read): If the target didn't supply a + given raw register, mark it as unavailable. + 2011-03-23 Kai Tietz <ktietz@redhat.com> * breakpoint.c (clear_command): Use filename_cmp diff --git a/gdb/regcache.c b/gdb/regcache.c index b984bc1..fbdeccc 100644 --- a/gdb/regcache.c +++ b/gdb/regcache.c @@ -586,25 +586,20 @@ regcache_raw_read (struct regcache *regcache, int regnum, gdb_byte *buf) to the current thread. This switching shouldn't be necessary only there is still only one target side register cache. Sigh! On the bright side, at least there is a regcache object. */ - if (!regcache->readonly_p) + if (!regcache->readonly_p + && regcache_register_status (regcache, regnum) == REG_UNKNOWN) { - if (regcache_register_status (regcache, regnum) == REG_UNKNOWN) - { - struct cleanup *old_chain = save_inferior_ptid (); + struct cleanup *old_chain = save_inferior_ptid (); - inferior_ptid = regcache->ptid; - target_fetch_registers (regcache, regnum); - do_cleanups (old_chain); - } -#if 0 - /* FIXME: cagney/2004-08-07: At present a number of targets - forget (or didn't know that they needed) to set this leading to - panics. Also is the problem that targets need to indicate - that a register is in one of the possible states: valid, - undefined, unknown. The last of which isn't yet - possible. */ - gdb_assert (regcache_register_status (regcache, regnum) == REG_VALID); -#endif + inferior_ptid = regcache->ptid; + target_fetch_registers (regcache, regnum); + do_cleanups (old_chain); + + /* A number of targets can't access the whole set of raw + registers (because the debug API provides no means to get at + them). */ + if (regcache->register_status[regnum] == REG_UNKNOWN) + regcache->register_status[regnum] = REG_UNAVAILABLE; } if (regcache->register_status[regnum] != REG_VALID) |