* infrun.c (adjust_pc_after_break): Do nothing if executing in
authorPedro Alves <palves@redhat.com>
Sat, 18 Oct 2008 03:24:34 +0000 (03:24 +0000)
committerPedro Alves <palves@redhat.com>
Sat, 18 Oct 2008 03:24:34 +0000 (03:24 +0000)
reverse.

gdb/ChangeLog
gdb/infrun.c

index 92dab5115fe205ef40eb6bdac9869689a3c98327..7490ff3390e4db530f4d4fc14874bc5db00d4017 100644 (file)
@@ -1,3 +1,8 @@
+2008-10-18  Pedro Alves  <pedro@codesourcery.com>
+
+       * infrun.c (adjust_pc_after_break): Do nothing if executing in
+       reverse.
+
 2008-10-17  Pedro Alves  <pedro@codesourcery.com>
 
        * infcmd.c (GO_USAGE): Delete.
index 511450115d97fb2306723af45d370c3122201b0b..0aab669879390af40f9c1d82f60635c1ffd5d736 100644 (file)
@@ -1826,6 +1826,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);