Replace some $ARCH_{get,set}_pc with linux_{get,set}_pc_64bit
Commit Message
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-13 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.
---
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 ++-------------------
4 files changed, 32 insertions(+), 32 deletions(-)
@@ -7137,6 +7137,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,
@@ -382,6 +382,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 *);
@@ -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 */
@@ -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,