This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: GDB MI Reverse Commands added [1 of 3]
- From: Michael Snyder <msnyder at vmware dot com>
- To: Michael Snyder <msnyder at vmware dot com>
- Cc: Jakob Engblom <jakob at virtutech dot com>, 'Vladimir Prus' <vladimir at codesourcery dot com>, "gdb-patches at sourceware dot org" <gdb-patches at sourceware dot org>, 'Hui Zhu' <teawater at gmail dot com>
- Date: Fri, 12 Feb 2010 13:33:44 -0800
- Subject: Re: GDB MI Reverse Commands added [1 of 3]
- References: <00ce01ca265a$ccb66ca0$662345e0$@com> <200912161056.58856.vladimir@codesourcery.com> <008f01ca7f26$d9e97140$8dbc53c0$@com> <200912211305.55412.vladimir@codesourcery.com> <00af01ca82fa$a8b74b60$fa25e220$@com> <4B310DBD.5000700@vmware.com>
per private email from Volodya, checked in as follows:
2010-02-12 Tomas Holmberg <th@virtutech.com>
* mi/mi-main.c: Added the --reverse flag to the following MI
commands: exec-continue, exec-finish, exec-next, exec-step,
exec-next-instruction, exec-step-instruction. This is to
support reverse execution over the MI interface to gdb.
Index: mi/mi-main.c
===================================================================
RCS file: /cvs/src/src/gdb/mi/mi-main.c,v
retrieving revision 1.164
retrieving revision 1.165
diff -u -p -r1.164 -r1.165
--- mi/mi-main.c 4 Feb 2010 07:37:36 -0000 1.164
+++ mi/mi-main.c 12 Feb 2010 21:28:25 -0000 1.165
@@ -121,35 +121,50 @@ void
mi_cmd_exec_next (char *command, char **argv, int argc)
{
/* FIXME: Should call a libgdb function, not a cli wrapper. */
- mi_execute_async_cli_command ("next", argv, argc);
+ if (argc > 0 && strcmp(argv[0], "--reverse") == 0)
+ mi_execute_async_cli_command ("reverse-next", argv + 1, argc - 1);
+ else
+ mi_execute_async_cli_command ("next", argv, argc);
}
void
mi_cmd_exec_next_instruction (char *command, char **argv, int argc)
{
/* FIXME: Should call a libgdb function, not a cli wrapper. */
- mi_execute_async_cli_command ("nexti", argv, argc);
+ if (argc > 0 && strcmp(argv[0], "--reverse") == 0)
+ mi_execute_async_cli_command ("reverse-nexti", argv + 1, argc - 1);
+ else
+ mi_execute_async_cli_command ("nexti", argv, argc);
}
void
mi_cmd_exec_step (char *command, char **argv, int argc)
{
/* FIXME: Should call a libgdb function, not a cli wrapper. */
- mi_execute_async_cli_command ("step", argv, argc);
+ if (argc > 0 && strcmp(argv[0], "--reverse") == 0)
+ mi_execute_async_cli_command ("reverse-step", argv + 1, argc - 1);
+ else
+ mi_execute_async_cli_command ("step", argv, argc);
}
void
mi_cmd_exec_step_instruction (char *command, char **argv, int argc)
{
/* FIXME: Should call a libgdb function, not a cli wrapper. */
- mi_execute_async_cli_command ("stepi", argv, argc);
+ if (argc > 0 && strcmp(argv[0], "--reverse") == 0)
+ mi_execute_async_cli_command ("reverse-stepi", argv + 1, argc - 1);
+ else
+ mi_execute_async_cli_command ("stepi", argv, argc);
}
void
mi_cmd_exec_finish (char *command, char **argv, int argc)
{
/* FIXME: Should call a libgdb function, not a cli wrapper. */
- mi_execute_async_cli_command ("finish", argv, argc);
+ if (argc > 0 && strcmp(argv[0], "--reverse") == 0)
+ mi_execute_async_cli_command ("reverse-finish", argv + 1, argc - 1);
+ else
+ mi_execute_async_cli_command ("finish", argv, argc);
}
void
@@ -195,8 +210,8 @@ proceed_thread_callback (struct thread_i
return 0;
}
-void
-mi_cmd_exec_continue (char *command, char **argv, int argc)
+static void
+exec_continue (char **argv, int argc)
{
if (argc == 0)
continue_1 (0);
@@ -217,7 +232,47 @@ mi_cmd_exec_continue (char *command, cha
do_cleanups (old_chain);
}
else
- error ("Usage: -exec-continue [--all|--thread-group id]");
+ error ("Usage: -exec-continue [--reverse] [--all|--thread-group id]");
+}
+
+/* continue in reverse direction:
+ XXX: code duplicated from reverse.c */
+
+static void
+exec_direction_default (void *notused)
+{
+ /* Return execution direction to default state. */
+ execution_direction = EXEC_FORWARD;
+}
+
+static void
+exec_reverse_continue (char **argv, int argc)
+{
+ enum exec_direction_kind dir = execution_direction;
+ struct cleanup *old_chain;
+
+ if (dir == EXEC_ERROR)
+ error (_("Target %s does not support this command."), target_shortname);
+
+ if (dir == EXEC_REVERSE)
+ error (_("Already in reverse mode."));
+
+ if (!target_can_execute_reverse)
+ error (_("Target %s does not support this command."), target_shortname);
+
+ old_chain = make_cleanup (exec_direction_default, NULL);
+ execution_direction = EXEC_REVERSE;
+ exec_continue (argv, argc);
+ do_cleanups (old_chain);
+}
+
+void
+mi_cmd_exec_continue (char *command, char **argv, int argc)
+{
+ if (argc > 0 && strcmp(argv[0], "--reverse") == 0)
+ exec_reverse_continue (argv + 1, argc - 1);
+ else
+ exec_continue (argv, argc);
}
static int