aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog8
-rw-r--r--gdb/arm-tdep.c14
-rw-r--r--gdb/inferior.h2
-rw-r--r--gdb/infrun.c18
4 files changed, 42 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 6b92f5d..b81c0ba 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,11 @@
+2011-02-16 Yao Qi <yao@qiyaows>
+
+ * infrun.c (get_displaced_step_closure_by_addr): New.
+ * inferior.h: Declare it.
+ * arm-tdep.c: (arm_pc_is_thumb): Call
+ get_displaced_step_closure_by_addr. Adjust MEMADDR if it
+ returns non-NULL.
+
2011-02-16 Pedro Alves <pedro@codesourcery.com>
Jan Kratochvil <jan.kratochvil@redhat.com>
diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c
index 6a279d1..96061e3 100644
--- a/gdb/arm-tdep.c
+++ b/gdb/arm-tdep.c
@@ -369,6 +369,20 @@ arm_pc_is_thumb (struct gdbarch *gdbarch, CORE_ADDR memaddr)
struct obj_section *sec;
struct minimal_symbol *sym;
char type;
+ struct displaced_step_closure* dsc
+ = get_displaced_step_closure_by_addr(memaddr);
+
+ /* If checking the mode of displaced instruction in copy area, the mode
+ should be determined by instruction on the original address. */
+ if (dsc)
+ {
+ if (debug_displaced)
+ fprintf_unfiltered (gdb_stdlog,
+ "displaced: check mode of %.8lx instead of %.8lx\n",
+ (unsigned long) dsc->insn_addr,
+ (unsigned long) memaddr);
+ memaddr = dsc->insn_addr;
+ }
/* If bit 0 of the address is set, assume this is a Thumb address. */
if (IS_THUMB_ADDR (memaddr))
diff --git a/gdb/inferior.h b/gdb/inferior.h
index 7cebcbf..381fd82 100644
--- a/gdb/inferior.h
+++ b/gdb/inferior.h
@@ -366,6 +366,8 @@ extern int debug_displaced;
void displaced_step_dump_bytes (struct ui_file *file,
const gdb_byte *buf, size_t len);
+struct displaced_step_closure*
+get_displaced_step_closure_by_addr (CORE_ADDR addr);
/* Possible values for gdbarch_call_dummy_location. */
#define ON_STACK 1
diff --git a/gdb/infrun.c b/gdb/infrun.c
index dd26af3..274082d 100644
--- a/gdb/infrun.c
+++ b/gdb/infrun.c
@@ -1078,6 +1078,24 @@ add_displaced_stepping_state (int pid)
return state;
}
+/* If inferior is in displaced stepping, and ADDR equals to starting address
+ of copy area, return corresponding displaced_step_closure. Otherwise,
+ return NULL. */
+
+struct displaced_step_closure*
+get_displaced_step_closure_by_addr (CORE_ADDR addr)
+{
+ struct displaced_step_inferior_state *displaced
+ = get_displaced_stepping_state (ptid_get_pid (inferior_ptid));
+
+ /* If checking the mode of displaced instruction in copy area. */
+ if (displaced && !ptid_equal (displaced->step_ptid, null_ptid)
+ && (displaced->step_copy == addr))
+ return displaced->step_closure;
+
+ return NULL;
+}
+
/* Remove the displaced stepping state of process PID. */
static void