This is the mail archive of the
gdb-cvs@sourceware.org
mailing list for the GDB project.
[binutils-gdb] Don't call gdbarch_pseudo_register_read_value in jit.c
- From: Yao Qi <qiyao at sourceware dot org>
- To: gdb-cvs at sourceware dot org
- Date: 22 Jan 2018 11:07:59 -0000
- Subject: [binutils-gdb] Don't call gdbarch_pseudo_register_read_value in jit.c
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=3f5a868b2277a3678f7eeb8fdf88935913b5918b
commit 3f5a868b2277a3678f7eeb8fdf88935913b5918b
Author: Yao Qi <yao.qi@linaro.org>
Date: Mon Jan 22 11:02:48 2018 +0000
Don't call gdbarch_pseudo_register_read_value in jit.c
gdbarch_pseudo_register_read_value is not implemented in every gdbarch, so
the predicate gdbarch_pseudo_register_read_value_p is needed before
calling it. However, there is no such guard in jit_frame_prev_register, I
am wondering how does jit work on the arch without having gdbarch method
pseudo_register_read_value.
The proper way to get register value is to call cooked_read, and then
create the value object from the buffer.
gdb:
2018-01-22 Yao Qi <yao.qi@linaro.org>
* jit.c (jit_frame_prev_register): Call regcache::cooked_read
instead of gdbarch_pseudo_register_read_value.
Diff:
---
gdb/ChangeLog | 5 +++++
gdb/jit.c | 16 +++++-----------
2 files changed, 10 insertions(+), 11 deletions(-)
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 6a5572f..61c6599 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,8 @@
+2018-01-22 Yao Qi <yao.qi@linaro.org>
+
+ * jit.c (jit_frame_prev_register): Call regcache::cooked_read
+ instead of gdbarch_pseudo_register_read_value.
+
2018-01-22 Joel Brobecker <brobecker@adacore.com>
* dwarf2read.c (need_gnat_info): Return nonzero if the cu's
diff --git a/gdb/jit.c b/gdb/jit.c
index a972ed6..01ead45 100644
--- a/gdb/jit.c
+++ b/gdb/jit.c
@@ -1271,19 +1271,13 @@ jit_frame_prev_register (struct frame_info *this_frame, void **cache, int reg)
return frame_unwind_got_optimized (this_frame, reg);
gdbarch = priv->regcache->arch ();
- if (reg < gdbarch_num_regs (gdbarch))
- {
- gdb_byte *buf = (gdb_byte *) alloca (register_size (gdbarch, reg));
- enum register_status status;
+ gdb_byte *buf = (gdb_byte *) alloca (register_size (gdbarch, reg));
+ enum register_status status = priv->regcache->cooked_read (reg, buf);
- status = regcache_raw_read (priv->regcache, reg, buf);
- if (status == REG_VALID)
- return frame_unwind_got_bytes (this_frame, reg, buf);
- else
- return frame_unwind_got_optimized (this_frame, reg);
- }
+ if (status == REG_VALID)
+ return frame_unwind_got_bytes (this_frame, reg, buf);
else
- return gdbarch_pseudo_register_read_value (gdbarch, priv->regcache, reg);
+ return frame_unwind_got_optimized (this_frame, reg);
}
/* Relay everything back to the unwinder registered by the JIT debug