diff options
author | Yao Qi <yao@codesourcery.com> | 2011-02-18 05:01:54 +0000 |
---|---|---|
committer | Yao Qi <yao@codesourcery.com> | 2011-02-18 05:01:54 +0000 |
commit | b434a28f71a481451dbd0719c6ca3fdf072d9407 (patch) | |
tree | 277a9f3183c6146713b1d9074f981af26bd0c13c /gdb | |
parent | 0bbd5bccf3e652fe5649c7cdb4548f5656e59dac (diff) | |
download | gdb-b434a28f71a481451dbd0719c6ca3fdf072d9407.zip gdb-b434a28f71a481451dbd0719c6ca3fdf072d9407.tar.gz gdb-b434a28f71a481451dbd0719c6ca3fdf072d9407.tar.bz2 |
2011-02-18 Yao Qi <yao@codesourcery.com>
* gdb/arm-tdep.c (arm_displaced_step_copy_insn): Move code to ...
(arm_process_displaced_insn): .. here. Remove parameter INSN.
(thumb_process_displaced_insn): New.
* gdb/arm-linux-tdep.c (arm_linux_displaced_step_copy_insn): Update
call to arm_process_displaced_insn.
* gdb/arm-tdep.h : Update declaration of arm_process_displaced_insn.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 9 | ||||
-rw-r--r-- | gdb/arm-linux-tdep.c | 10 | ||||
-rw-r--r-- | gdb/arm-tdep.c | 37 | ||||
-rw-r--r-- | gdb/arm-tdep.h | 5 |
4 files changed, 34 insertions, 27 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 42f77a8..c349212 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2011-02-18 Yao Qi <yao@codesourcery.com> + + * gdb/arm-tdep.c (arm_displaced_step_copy_insn): Move code to ... + (arm_process_displaced_insn): .. here. Remove parameter INSN. + (thumb_process_displaced_insn): New. + * gdb/arm-linux-tdep.c (arm_linux_displaced_step_copy_insn): Update + call to arm_process_displaced_insn. + * gdb/arm-tdep.h : Update declaration of arm_process_displaced_insn. + 2011-02-17 Tom Tromey <tromey@redhat.com> * dwarf2loc.h (dwarf2_compile_expr_to_ax): Declare. diff --git a/gdb/arm-linux-tdep.c b/gdb/arm-linux-tdep.c index 75b1a8d..ff649d6 100644 --- a/gdb/arm-linux-tdep.c +++ b/gdb/arm-linux-tdep.c @@ -913,18 +913,10 @@ arm_linux_displaced_step_copy_insn (struct gdbarch *gdbarch, } else { - enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); - uint32_t insn = read_memory_unsigned_integer (from, 4, byte_order); - - if (debug_displaced) - fprintf_unfiltered (gdb_stdlog, "displaced: stepping insn %.8lx " - "at %.8lx\n", (unsigned long) insn, - (unsigned long) from); - /* Override the default handling of SVC instructions. */ dsc->u.svc.copy_svc_os = arm_linux_copy_svc; - arm_process_displaced_insn (gdbarch, insn, from, to, regs, dsc); + arm_process_displaced_insn (gdbarch, from, to, regs, dsc); } arm_displaced_init_closure (gdbarch, from, to, dsc); diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c index 96061e3..16334bf 100644 --- a/gdb/arm-tdep.c +++ b/gdb/arm-tdep.c @@ -6833,16 +6833,22 @@ decode_svc_copro (struct gdbarch *gdbarch, uint32_t insn, CORE_ADDR to, return copy_undef (gdbarch, insn, dsc); /* Possibly unreachable. */ } +static void +thumb_process_displaced_insn (struct gdbarch *gdbarch, CORE_ADDR from, + CORE_ADDR to, struct regcache *regs, + struct displaced_step_closure *dsc) +{ + error (_("Displaced stepping is only supported in ARM mode")); +} + void -arm_process_displaced_insn (struct gdbarch *gdbarch, uint32_t insn, - CORE_ADDR from, CORE_ADDR to, - struct regcache *regs, +arm_process_displaced_insn (struct gdbarch *gdbarch, CORE_ADDR from, + CORE_ADDR to, struct regcache *regs, struct displaced_step_closure *dsc) { int err = 0; - - if (!displaced_in_arm_mode (regs)) - error (_("Displaced stepping is only supported in ARM mode")); + enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch); + uint32_t insn; /* Most displaced instructions use a 1-instruction scratch space, so set this here and override below if/when necessary. */ @@ -6852,6 +6858,15 @@ arm_process_displaced_insn (struct gdbarch *gdbarch, uint32_t insn, dsc->cleanup = NULL; dsc->wrote_to_pc = 0; + if (!displaced_in_arm_mode (regs)) + return thumb_process_displaced_insn (gdbarch, from, to, regs, dsc); + + insn = read_memory_unsigned_integer (from, 4, byte_order_for_code); + if (debug_displaced) + fprintf_unfiltered (gdb_stdlog, "displaced: stepping insn %.8lx " + "at %.8lx\n", (unsigned long) insn, + (unsigned long) from); + if ((insn & 0xf0000000) == 0xf0000000) err = decode_unconditional (gdbarch, insn, regs, dsc); else switch (((insn & 0x10) >> 4) | ((insn & 0xe000000) >> 24)) @@ -6922,15 +6937,7 @@ arm_displaced_step_copy_insn (struct gdbarch *gdbarch, { struct displaced_step_closure *dsc = xmalloc (sizeof (struct displaced_step_closure)); - enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch); - uint32_t insn = read_memory_unsigned_integer (from, 4, byte_order_for_code); - - if (debug_displaced) - fprintf_unfiltered (gdb_stdlog, "displaced: stepping insn %.8lx " - "at %.8lx\n", (unsigned long) insn, - (unsigned long) from); - - arm_process_displaced_insn (gdbarch, insn, from, to, regs, dsc); + arm_process_displaced_insn (gdbarch, from, to, regs, dsc); arm_displaced_init_closure (gdbarch, from, to, dsc); return dsc; diff --git a/gdb/arm-tdep.h b/gdb/arm-tdep.h index 7abfcd7..6e7eab9 100644 --- a/gdb/arm-tdep.h +++ b/gdb/arm-tdep.h @@ -284,9 +284,8 @@ enum pc_write_style }; extern void - arm_process_displaced_insn (struct gdbarch *gdbarch, uint32_t insn, - CORE_ADDR from, CORE_ADDR to, - struct regcache *regs, + arm_process_displaced_insn (struct gdbarch *gdbarch, CORE_ADDR from, + CORE_ADDR to, struct regcache *regs, struct displaced_step_closure *dsc); extern void arm_displaced_init_closure (struct gdbarch *gdbarch, CORE_ADDR from, |