2011-02-16 Yao Qi <yao@qiyaows>
authorYao Qi <yao@codesourcery.com>
Wed, 16 Feb 2011 14:54:42 +0000 (14:54 +0000)
committerYao Qi <yao@codesourcery.com>
Wed, 16 Feb 2011 14:54:42 +0000 (14:54 +0000)
* 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.

gdb/ChangeLog
gdb/arm-tdep.c
gdb/inferior.h
gdb/infrun.c

index 6b92f5d6cf96e0338fa2d4a8aa0f6fd7a00d6c0a..b81c0ba4e734d6ea3987129a08a77232447164cf 100644 (file)
@@ -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>
 
index 6a279d19e1abcae6cbd7d7daf117ab0086a46934..96061e37d9fe4637addd6ec1041f205ea2ec3354 100644 (file)
@@ -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))
index 7cebcbf6bfa10337a47d7b4a06a6b53094914cf7..381fd8274db62a603566e1a4b64555153e1a6e6e 100644 (file)
@@ -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);
 \f
 /* Possible values for gdbarch_call_dummy_location.  */
 #define ON_STACK 1
index dd26af3194903fba68d04c39f9d2388e5580fd5e..274082dc3b697262cc0b17ec4eb504c5fa632448 100644 (file)
@@ -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