This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]