From 3f5a868b2277a3678f7eeb8fdf88935913b5918b Mon Sep 17 00:00:00 2001 From: Yao Qi Date: Mon, 22 Jan 2018 11:02:48 +0000 Subject: [PATCH] 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 * jit.c (jit_frame_prev_register): Call regcache::cooked_read instead of gdbarch_pseudo_register_read_value. --- gdb/ChangeLog | 5 +++++ gdb/jit.c | 16 +++++----------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 6a5572faef8..61c65997bf1 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2018-01-22 Yao Qi + + * jit.c (jit_frame_prev_register): Call regcache::cooked_read + instead of gdbarch_pseudo_register_read_value. + 2018-01-22 Joel Brobecker * dwarf2read.c (need_gnat_info): Return nonzero if the cu's diff --git a/gdb/jit.c b/gdb/jit.c index a972ed61d5a..01ead4577f4 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 -- 2.30.2