diff options
Diffstat (limited to 'gdb/ia64-tdep.c')
-rw-r--r-- | gdb/ia64-tdep.c | 51 |
1 files changed, 39 insertions, 12 deletions
diff --git a/gdb/ia64-tdep.c b/gdb/ia64-tdep.c index ea6918c..cbd8514 100644 --- a/gdb/ia64-tdep.c +++ b/gdb/ia64-tdep.c @@ -933,11 +933,12 @@ rse_address_add(CORE_ADDR addr, int nslots) return new_addr; } -static void +static enum register_status ia64_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache, int regnum, gdb_byte *buf) { enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); + enum register_status status; if (regnum >= V32_REGNUM && regnum <= V127_REGNUM) { @@ -952,12 +953,21 @@ ia64_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache, found sequentially in memory starting at $bof. This isn't always true, but without libunwind, this is the best we can do. */ + enum register_status status; ULONGEST cfm; ULONGEST bsp; CORE_ADDR reg; - regcache_cooked_read_unsigned (regcache, IA64_BSP_REGNUM, &bsp); - regcache_cooked_read_unsigned (regcache, IA64_CFM_REGNUM, &cfm); - + + status = regcache_cooked_read_unsigned (regcache, + IA64_BSP_REGNUM, &bsp); + if (status != REG_VALID) + return status; + + status = regcache_cooked_read_unsigned (regcache, + IA64_CFM_REGNUM, &cfm); + if (status != REG_VALID) + return status; + /* The bsp points at the end of the register frame so we subtract the size of frame from it to get start of register frame. */ @@ -979,7 +989,9 @@ ia64_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache, { ULONGEST unatN_val; ULONGEST unat; - regcache_cooked_read_unsigned (regcache, IA64_UNAT_REGNUM, &unat); + status = regcache_cooked_read_unsigned (regcache, IA64_UNAT_REGNUM, &unat); + if (status != REG_VALID) + return status; unatN_val = (unat & (1LL << (regnum - IA64_NAT0_REGNUM))) != 0; store_unsigned_integer (buf, register_size (gdbarch, regnum), byte_order, unatN_val); @@ -990,8 +1002,12 @@ ia64_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache, ULONGEST bsp; ULONGEST cfm; CORE_ADDR gr_addr = 0; - regcache_cooked_read_unsigned (regcache, IA64_BSP_REGNUM, &bsp); - regcache_cooked_read_unsigned (regcache, IA64_CFM_REGNUM, &cfm); + status = regcache_cooked_read_unsigned (regcache, IA64_BSP_REGNUM, &bsp); + if (status != REG_VALID) + return status; + status = regcache_cooked_read_unsigned (regcache, IA64_CFM_REGNUM, &cfm); + if (status != REG_VALID) + return status; /* The bsp points at the end of the register frame so we subtract the size of frame from it to get start of register frame. */ @@ -1028,8 +1044,12 @@ ia64_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache, ULONGEST bsp, vbsp; ULONGEST cfm; CORE_ADDR reg; - regcache_cooked_read_unsigned (regcache, IA64_BSP_REGNUM, &bsp); - regcache_cooked_read_unsigned (regcache, IA64_CFM_REGNUM, &cfm); + status = regcache_cooked_read_unsigned (regcache, IA64_BSP_REGNUM, &bsp); + if (status != REG_VALID) + return status; + status = regcache_cooked_read_unsigned (regcache, IA64_CFM_REGNUM, &cfm); + if (status != REG_VALID) + return status; /* The bsp points at the end of the register frame so we subtract the size of frame from it to get beginning of frame. */ @@ -1043,8 +1063,12 @@ ia64_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache, ULONGEST cfm; ULONGEST prN_val; CORE_ADDR reg; - regcache_cooked_read_unsigned (regcache, IA64_PR_REGNUM, &pr); - regcache_cooked_read_unsigned (regcache, IA64_CFM_REGNUM, &cfm); + status = regcache_cooked_read_unsigned (regcache, IA64_PR_REGNUM, &pr); + if (status != REG_VALID) + return status; + status = regcache_cooked_read_unsigned (regcache, IA64_CFM_REGNUM, &cfm); + if (status != REG_VALID) + return status; if (VP16_REGNUM <= regnum && regnum <= VP63_REGNUM) { @@ -1062,6 +1086,8 @@ ia64_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache, } else memset (buf, 0, register_size (gdbarch, regnum)); + + return REG_VALID; } static void @@ -1132,7 +1158,8 @@ ia64_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache, collection from the computed address. */ if (nat_addr >= bsp) { - regcache_cooked_read_unsigned (regcache, IA64_RNAT_REGNUM, + regcache_cooked_read_unsigned (regcache, + IA64_RNAT_REGNUM, &nat_collection); if (natN_val) nat_collection |= natN_mask; |