diff options
author | Michael Snyder <msnyder@vmware.com> | 2008-10-17 19:43:47 +0000 |
---|---|---|
committer | Michael Snyder <msnyder@vmware.com> | 2008-10-17 19:43:47 +0000 |
commit | b2175913c5f01e75fdb9b19699049737abb2f37c (patch) | |
tree | 7e157c65ec30335451ef139353a79a5565eeb56e /gdb/remote.c | |
parent | 153ccabd86d78a26fb9021051fc39b63b649105b (diff) | |
download | gdb-b2175913c5f01e75fdb9b19699049737abb2f37c.zip gdb-b2175913c5f01e75fdb9b19699049737abb2f37c.tar.gz gdb-b2175913c5f01e75fdb9b19699049737abb2f37c.tar.bz2 |
2008-10-17 Michael Snyder <msnyder@vmware.com>
Target interface for reverse debugging.
* target.h (enum target_waitkind):
Add new wait event, TARGET_WAITKIND_NO_HISTORY.
(struct target_ops): New method to_can_execute_reverse.
(target_can_execute_reverse): New macro.
* target.c (update_current_target): Inherit to_can_execute_reverse.
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_as): 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.
Event handling interface for reverse debugging.
* infrun.c (execution_direction): New state variable.
(enum inferior_stop_reason): Add NO_HISTORY reason.
(handle_inferior_event): Handle TARGET_WAITKIND_NO_HISTORY.
Handle stepping over a function call in reverse.
Handle stepping thru a line range in reverse.
Handle setting a step-resume breakpoint in reverse.
Handle stepping into a function in reverse.
Handle stepping between line ranges in reverse.
(print_stop_reason): Print reason for NO_HISTORY.
(step_into_function): Rename to handle_step_into_function.
(handle_step_into_function_backward): New function.
(set_exec_direction_func, show_exec_direction_func): New funcs.
(proceed): No need to singlestep over a breakpoint
when resuming in reverse.
* inferior.h (enum exec_direction_kind): New enum.
(execution_direction): Export new execution state variable.
* breakpoint.c (make_breakpoint_silent): New function.
* breakpoint.h (make_breakpoint_silent): Export.
* infcmd.c (finish_command): Check for reverse exec direction.
(finish_backward): New function, handle finish cmd in reverse.
User interface for reverse execution.
* Makefile.in (reverse.c): New file.
* reverse.c: New file. User interface for reverse execution.
Diffstat (limited to 'gdb/remote.c')
-rw-r--r-- | gdb/remote.c | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/gdb/remote.c b/gdb/remote.c index 727d084..f334c0b 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -3443,7 +3443,15 @@ remote_resume (ptid_t ptid, int step, enum target_signal siggnal) 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); @@ -3671,6 +3679,7 @@ remote_wait_as (ptid_t ptid, struct target_waitstatus *status) ptid_t event_ptid = null_ptid; ULONGEST addr; int solibs_changed = 0; + int replay_event = 0; char *buf, *p; status->kind = TARGET_WAITKIND_IGNORE; @@ -3786,6 +3795,16 @@ Packet: '%s'\n"), solibs_changed = 1; p = p_temp; } + else if (strncmp (p, "replaylog", p1 - p) == 0) + { + /* NO_HISTORY event. + p1 will indicate "begin" or "end", but + it makes no difference for now, so ignore it. */ + replay_event = 1; + p_temp = strchr (p1 + 1, ';'); + if (p_temp) + p = p_temp; + } else { /* Silently skip unknown optional info. */ @@ -3831,6 +3850,8 @@ Packet: '%s'\n"), case 'S': /* Old style status, just signal only. */ if (solibs_changed) status->kind = TARGET_WAITKIND_LOADED; + else if (replay_event) + status->kind = TARGET_WAITKIND_NO_HISTORY; else { status->kind = TARGET_WAITKIND_STOPPED; @@ -7628,6 +7649,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) { @@ -7676,6 +7705,7 @@ Specify the serial device it is connected to\n\ 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; |