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] Replace some $ARCH_{get, set}_pc with linux_{get, set}_pc_64bit


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=6f69e520676f5f434cf43c250865036b3d516429

commit 6f69e520676f5f434cf43c250865036b3d516429
Author: Yao Qi <yao.qi@linaro.org>
Date:   Mon Jan 18 15:03:18 2016 +0000

    Replace some $ARCH_{get,set}_pc with linux_{get,set}_pc_64bit
    
    This patch is the follow-up of
    https://sourceware.org/ml/gdb-patches/2016-01/msg00164.html to provide
    linux_{get,set}_pc_64bit functions.
    
    Rebuild GDBserver with tilegx-linux-gcc.  Not tested.
    
    I think about pc in Tile-GX a little bit.  Looks current Tile-GX
    supports debugging 32-bit program (multi-arch), but PC is always
    64-bit.  See this thread
    https://sourceware.org/ml/gdb-patches/2013-02/msg00113.html
    and GDBserver reads PC as 64-bit through ptrace.  However, if
    the inferior is 32-bit, the PC in the target description and
    regcache is 32-bit, so only 32-bit contents are sent back GDB.
    Anyway, Tile-GX GDBserver may have some problems here, but this
    patch doesn't change anything.
    
    gdb/gdbserver:
    
    2016-01-18  Yao Qi  <yao.qi@linaro.org>
    
    	* linux-low.c (linux_set_pc_64bit): New function.
    	(linux_get_pc_64bit): New function.
    	* linux-low.h (linux_set_pc_64bit, linux_get_pc_64bit):
    	Declare.
    	* linux-sparc-low.c (debug_threads): Remove declaration.
    	(sparc_get_pc): Remove.
    	(the_low_target): Use linux_get_pc_64bit instead of
    	sparc_get_pc.
    	* linux-tile-low.c (tile_get_pc, tile_set_pc): Remove.
    	(the_low_target): Use linux_get_pc_64bit and
    	linux_set_pc_64bit.

Diff:
---
 gdb/gdbserver/ChangeLog         | 14 ++++++++++++++
 gdb/gdbserver/linux-low.c       | 26 ++++++++++++++++++++++++++
 gdb/gdbserver/linux-low.h       |  3 +++
 gdb/gdbserver/linux-sparc-low.c | 14 +-------------
 gdb/gdbserver/linux-tile-low.c  | 21 ++-------------------
 5 files changed, 46 insertions(+), 32 deletions(-)

diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog
index 9dc7c2f..4eb92db 100644
--- a/gdb/gdbserver/ChangeLog
+++ b/gdb/gdbserver/ChangeLog
@@ -1,5 +1,19 @@
 2016-01-18  Yao Qi  <yao.qi@linaro.org>
 
+	* linux-low.c (linux_set_pc_64bit): New function.
+	(linux_get_pc_64bit): New function.
+	* linux-low.h (linux_set_pc_64bit, linux_get_pc_64bit):
+	Declare.
+	* linux-sparc-low.c (debug_threads): Remove declaration.
+	(sparc_get_pc): Remove.
+	(the_low_target): Use linux_get_pc_64bit instead of
+	sparc_get_pc.
+	* linux-tile-low.c (tile_get_pc, tile_set_pc): Remove.
+	(the_low_target): Use linux_get_pc_64bit and
+	linux_set_pc_64bit.
+
+2016-01-18  Yao Qi  <yao.qi@linaro.org>
+
 	* linux-arm-low.c (debug_threads): Remove declaration.
 	(arm_get_pc, arm_set_pc): Remove.
 	(the_low_target): Use linux_get_pc_32bit and
diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c
index 8f5ab0b..1f3fc08 100644
--- a/gdb/gdbserver/linux-low.c
+++ b/gdb/gdbserver/linux-low.c
@@ -7283,6 +7283,32 @@ linux_get_pc_32bit (struct regcache *regcache)
   return pc;
 }
 
+/* Default implementation of linux_target_ops method "set_pc" for
+   64-bit pc register which is literally named "pc".  */
+
+void
+linux_set_pc_64bit (struct regcache *regcache, CORE_ADDR pc)
+{
+  uint64_t newpc = pc;
+
+  supply_register_by_name (regcache, "pc", &newpc);
+}
+
+/* Default implementation of linux_target_ops method "get_pc" for
+   64-bit pc register which is literally named "pc".  */
+
+CORE_ADDR
+linux_get_pc_64bit (struct regcache *regcache)
+{
+  uint64_t pc;
+
+  collect_register_by_name (regcache, "pc", &pc);
+  if (debug_threads)
+    debug_printf ("stop pc is 0x%" PRIx64 "\n", pc);
+  return pc;
+}
+
+
 static struct target_ops linux_target_ops = {
   linux_create_inferior,
   linux_post_create_inferior,
diff --git a/gdb/gdbserver/linux-low.h b/gdb/gdbserver/linux-low.h
index 98a331d..4845862 100644
--- a/gdb/gdbserver/linux-low.h
+++ b/gdb/gdbserver/linux-low.h
@@ -395,6 +395,9 @@ void initialize_low_arch (void);
 void linux_set_pc_32bit (struct regcache *regcache, CORE_ADDR pc);
 CORE_ADDR linux_get_pc_32bit (struct regcache *regcache);
 
+void linux_set_pc_64bit (struct regcache *regcache, CORE_ADDR pc);
+CORE_ADDR linux_get_pc_64bit (struct regcache *regcache);
+
 /* From thread-db.c  */
 int thread_db_init (void);
 void thread_db_detach (struct process_info *);
diff --git a/gdb/gdbserver/linux-sparc-low.c b/gdb/gdbserver/linux-sparc-low.c
index 1e82ec5..70c5c93 100644
--- a/gdb/gdbserver/linux-sparc-low.c
+++ b/gdb/gdbserver/linux-sparc-low.c
@@ -223,18 +223,6 @@ sparc_store_fpregset (struct regcache *regcache, const void *buf)
       supply_register (regcache, i, ((char *) buf) + sparc_regmap[i]);
 }
 
-extern int debug_threads;
-
-static CORE_ADDR
-sparc_get_pc (struct regcache *regcache)
-{
-  unsigned long pc;
-  collect_register_by_name (regcache, "pc", &pc);
-  if (debug_threads)
-    debug_printf ("stop pc is %08lx\n", pc);
-  return pc;
-}
-
 static const gdb_byte sparc_breakpoint[INSN_SIZE] = {
   0x91, 0xd0, 0x20, 0x01
 };
@@ -315,7 +303,7 @@ struct linux_target_ops the_low_target = {
   sparc_cannot_fetch_register,
   sparc_cannot_store_register,
   NULL, /* fetch_register */
-  sparc_get_pc,
+  linux_get_pc_64bit,
   /* No sparc_set_pc is needed.  */
   NULL,
   NULL, /* breakpoint_kind_from_pc */
diff --git a/gdb/gdbserver/linux-tile-low.c b/gdb/gdbserver/linux-tile-low.c
index aaaa5c7..45d63d6 100644
--- a/gdb/gdbserver/linux-tile-low.c
+++ b/gdb/gdbserver/linux-tile-low.c
@@ -68,23 +68,6 @@ tile_cannot_store_register (int regno)
     return 1;
 }
 
-static CORE_ADDR
-tile_get_pc (struct regcache *regcache)
-{
-  unsigned long pc;
-
-  collect_register_by_name (regcache, "pc", &pc);
-  return pc;
-}
-
-static void
-tile_set_pc (struct regcache *regcache, CORE_ADDR pc)
-{
-  unsigned long newpc = pc;
-
-  supply_register_by_name (regcache, "pc", &newpc);
-}
-
 static uint64_t tile_breakpoint = 0x400b3cae70166000ULL;
 #define tile_breakpoint_len 8
 
@@ -197,8 +180,8 @@ struct linux_target_ops the_low_target =
   tile_cannot_fetch_register,
   tile_cannot_store_register,
   NULL,
-  tile_get_pc,
-  tile_set_pc,
+  linux_get_pc_64bit,
+  linux_set_pc_64bit,
   NULL, /* breakpoint_kind_from_pc */
   tile_sw_breakpoint_from_kind,
   NULL,


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