This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[RFA] Resubmit reverse debug [2/5]
- From: Michael Snyder <msnyder at vmware dot com>
- To: "gdb-patches at sourceware dot org" <gdb-patches at sourceware dot org>
- Date: Tue, 07 Oct 2008 19:17:30 -0700
- Subject: [RFA] Resubmit reverse debug [2/5]
The remote target_ops, revised:
Note, this patch will no longer build by itself, due to
dependency on infrun.c/execution_direction.
2008-10-07 Michael Snyder <msnyder@vmware.com>
Remote interface for reverse debugging.
* remote.c (remote_can_execute_reverse): New target method.
(remote_resume): Check for reverse exec direction, and send
appropriate command to target.
(remote_wait): Check target response for NO_HISTORY status.
Also check for empty reply (target doesn't understand "bs" or "bc).
(remote_vcont_resume): Jump out if attempting reverse execution.
* inferior.h (enum exec_direction_kind): New enum.
(execution_direction): Export new execution state variable.
Index: remote.c
===================================================================
RCS file: /cvs/src/src/gdb/remote.c,v
retrieving revision 1.311
diff -u -p -r1.311 remote.c
--- remote.c 3 Oct 2008 16:36:10 -0000 1.311
+++ remote.c 8 Oct 2008 00:59:19 -0000
@@ -3385,7 +3385,15 @@ remote_resume (ptid_t ptid, int step, en
set_continue_thread (ptid);
buf = rs->buf;
- if (siggnal != TARGET_SIGNAL_0)
+ if (execution_direction == EXEC_REVERSE)
+ {
+ /* We don't pass signals to the target in reverse exec mode. */
+ if (info_verbose && siggnal != TARGET_SIGNAL_0)
+ warning (" - Can't pass signal %d to target in reverse: ignored.\n",
+ siggnal);
+ strcpy (buf, step ? "bs" : "bc");
+ }
+ else if (siggnal != TARGET_SIGNAL_0)
{
buf[0] = step ? 'S' : 'C';
buf[1] = tohex (((int) siggnal >> 4) & 0xf);
@@ -3651,8 +3659,15 @@ remote_wait (ptid_t ptid, struct target_
/* We're out of sync with the target now. Did it continue or not?
Not is more likely, so report a stop. */
warning (_("Remote failure reply: %s"), buf);
- status->kind = TARGET_WAITKIND_STOPPED;
- status->value.sig = TARGET_SIGNAL_0;
+ if (buf[1] == '0' && buf[2] == '6')
+ {
+ status->kind = TARGET_WAITKIND_NO_HISTORY;
+ }
+ else
+ {
+ status->kind = TARGET_WAITKIND_STOPPED;
+ status->value.sig = TARGET_SIGNAL_0;
+ }
goto got_status;
case 'F': /* File-I/O request. */
remote_fileio_request (buf);
@@ -7549,6 +7564,14 @@ remote_command (char *args, int from_tty
help_list (remote_cmdlist, "remote ", -1, gdb_stdout);
}
+static int remote_target_can_reverse = 1;
+
+static int
+remote_can_execute_reverse (void)
+{
+ return remote_target_can_reverse;
+}
+
static void
init_remote_ops (void)
{
@@ -7597,6 +7620,7 @@ Specify the serial device it is connecte
remote_ops.to_has_registers = 1;
remote_ops.to_has_execution = 1;
remote_ops.to_has_thread_control = tc_schedlock; /* can lock scheduler */
+ remote_ops.to_can_execute_reverse = remote_can_execute_reverse;
remote_ops.to_magic = OPS_MAGIC;
remote_ops.to_memory_map = remote_memory_map;
remote_ops.to_flash_erase = remote_flash_erase;
Index: inferior.h
===================================================================
RCS file: /cvs/src/src/gdb/inferior.h,v
retrieving revision 1.108
diff -u -p -r1.108 inferior.h
--- inferior.h 22 Sep 2008 15:21:30 -0000 1.108
+++ inferior.h 8 Oct 2008 00:59:19 -0000
@@ -339,6 +339,16 @@ enum stop_kind
STOP_QUIETLY_NO_SIGSTOP
};
+/* Reverse execution. */
+enum exec_direction_kind
+ {
+ EXEC_FORWARD,
+ EXEC_REVERSE,
+ EXEC_ERROR
+ };
+
+extern enum exec_direction_kind execution_direction;
+
/* Nonzero if proceed is being used for a "finish" command or a similar
situation when stop_registers should be saved. */