]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
2008-10-18 Pedro Alves <pedro@codesourcery.com>
authorMichael Snyder <msnyder@vmware.com>
Thu, 23 Oct 2008 23:24:45 +0000 (23:24 +0000)
committerMichael Snyder <msnyder@vmware.com>
Thu, 23 Oct 2008 23:24:45 +0000 (23:24 +0000)
* infrun.c (adjust_pc_after_break): Do nothing if executing in
reverse.

gdb/ChangeLog
gdb/infrun.c

index 0bc33667fff219de1eb631a8dd28cd6192e54797..12c46d0ef128311a15ae7a12b203f58b95b33a77 100644 (file)
@@ -8,6 +8,11 @@
        * infrun.c (handle_inferior_event): Set "stop_pc" when
        TARGET_WAITKIND_NO_HISTORY.
 
+2008-10-18  Pedro Alves  <pedro@codesourcery.com>
+
+       * infrun.c (adjust_pc_after_break): Do nothing if executing in
+       reverse.
+
 2008-10-18  Hui Zhu  <teawater@gmail.com>
 
        Remove "to_support_record_wait".
index fc388a7ab5ad33aea2b69a04fa75a07f865ecfac..78fc8710b1697fe29e607846ec6068cddda58470 100644 (file)
@@ -1787,6 +1787,35 @@ adjust_pc_after_break (struct execution_control_state *ecs)
   if (ecs->ws.value.sig != TARGET_SIGNAL_TRAP)
     return;
 
+  /* In reverse execution, when a breakpoint is hit, the instruction
+     under it has already been de-executed.  The reported PC always
+     points at the breakpoint address, so adjusting it further would
+     be wrong.  E.g., consider this case on a decr_pc_after_break == 1
+     architecture:
+
+       B1         0x08000000 :   INSN1
+       B2         0x08000001 :   INSN2
+                 0x08000002 :   INSN3
+           PC -> 0x08000003 :   INSN4
+
+     Say you're stopped at 0x08000003 as above.  Reverse continuing
+     from that point should hit B2 as below.  Reading the PC when the
+     SIGTRAP is reported should read 0x08000001 and INSN2 should have
+     been de-executed already.
+
+       B1         0x08000000 :   INSN1
+       B2   PC -> 0x08000001 :   INSN2
+                 0x08000002 :   INSN3
+                 0x08000003 :   INSN4
+
+     We can't apply the same logic as for forward execution, because
+     we would wrongly adjust the PC to 0x08000000, since there's a
+     breakpoint at PC - 1.  We'd then report a hit on B1, although
+     INSN1 hadn't been de-executed yet.  Doing nothing is the correct
+     behaviour.  */
+  if (execution_direction == EXEC_REVERSE)
+    return;
+
   /* If this target does not decrement the PC after breakpoints, then
      we have nothing to do.  */
   regcache = get_thread_regcache (ecs->ptid);