summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Snyder <msnyder@vmware.com>2008-10-23 23:24:45 +0000
committerMichael Snyder <msnyder@vmware.com>2008-10-23 23:24:45 +0000
commit9e35d7264198bd63ab9151540d65273366543e96 (patch)
treeb8e8e7ad375250b4ce57f4b9f42f093f6821aaf1
parentb0e6b885a8aa6bd592c86d03fbc8a7a2ecc56f3b (diff)
downloadbinutils-gdb-9e35d7264198bd63ab9151540d65273366543e96.tar.gz
2008-10-18 Pedro Alves <pedro@codesourcery.com>
* infrun.c (adjust_pc_after_break): Do nothing if executing in reverse.
-rw-r--r--gdb/ChangeLog5
-rw-r--r--gdb/infrun.c29
2 files changed, 34 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 0bc33667fff..12c46d0ef12 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -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".
diff --git a/gdb/infrun.c b/gdb/infrun.c
index fc388a7ab5a..78fc8710b16 100644
--- a/gdb/infrun.c
+++ b/gdb/infrun.c
@@ -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);