aboutsummaryrefslogtreecommitdiff
path: root/gdb/ia64-linux-nat.c
diff options
context:
space:
mode:
authorJoel Brobecker <brobecker@gnat.com>2012-03-28 17:08:48 +0000
committerJoel Brobecker <brobecker@gnat.com>2012-03-28 17:08:48 +0000
commit5a75128f9392f216b3d07753d6a90bca365a29be (patch)
tree5199d24814e94c1df861aac48acef753b97afb12 /gdb/ia64-linux-nat.c
parent306f8a02218cf37b9723abc82e165adcfd45d9cd (diff)
downloadfsf-binutils-gdb-5a75128f9392f216b3d07753d6a90bca365a29be.zip
fsf-binutils-gdb-5a75128f9392f216b3d07753d6a90bca365a29be.tar.gz
fsf-binutils-gdb-5a75128f9392f216b3d07753d6a90bca365a29be.tar.bz2
[ia64-linux] Allow libunwind to fetch register 0
On ia64-linux, GDB sometimes prints the following error when trying to switch to a different task: (gdb) task 3 Register 0 is not available This is a random failure that sometimes happens, sometimes does not. The error comes from the fact that the libunwind library is requesting the value of register 0 (zero): This eventually leads us to ia64-linux-nat.c:ia64_linux_fetch_register. This function relies on ia64_cannot_fetch_register to determine whether or not we have access to the register's value. The ptrace interface does not provide the r0 value, and so we end up telling the regcache that this register's value is not available. And yet, for r0, we do not need to ask ptrace for its value, since it is always zero. So, the fix was to add a special rule for supplying a nul value when regnum == IA64_GR0_REGNUM. gdb/ChangeLog: * ia64-linux-nat.c (ia64_linux_fetch_register): Add special handling for r0.
Diffstat (limited to 'gdb/ia64-linux-nat.c')
-rw-r--r--gdb/ia64-linux-nat.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/gdb/ia64-linux-nat.c b/gdb/ia64-linux-nat.c
index 19b827f..60b873b 100644
--- a/gdb/ia64-linux-nat.c
+++ b/gdb/ia64-linux-nat.c
@@ -680,6 +680,16 @@ ia64_linux_fetch_register (struct regcache *regcache, int regnum)
PTRACE_TYPE_RET *buf;
int pid, i;
+ /* r0 cannot be fetched but is always zero. */
+ if (regnum == IA64_GR0_REGNUM)
+ {
+ const gdb_byte zero[8] = { 0 };
+
+ gdb_assert (sizeof (zero) == register_size (gdbarch, regnum));
+ regcache_raw_supply (regcache, regnum, zero);
+ return;
+ }
+
if (ia64_cannot_fetch_register (gdbarch, regnum))
{
regcache_raw_supply (regcache, regnum, NULL);