From 788c8b10e36cc1f18faae28c743d7c3d029608c2 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Thu, 24 Mar 2011 11:22:03 +0000 Subject: [PATCH] * regcache.c (regcache_raw_read): If the target didn't supply a given raw register, mark it as unavailable. --- gdb/ChangeLog | 5 +++++ gdb/regcache.c | 29 ++++++++++++----------------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 8f259c1aa38..e5600dcedeb 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2011-03-23 Pedro Alves + + * regcache.c (regcache_raw_read): If the target didn't supply a + given raw register, mark it as unavailable. + 2011-03-23 Kai Tietz * breakpoint.c (clear_command): Use filename_cmp diff --git a/gdb/regcache.c b/gdb/regcache.c index b984bc1400b..fbdecccbb16 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) -- 2.30.2