/* Process record and replay target for GDB, the GNU debugger.
- Copyright (C) 2008-2014 Free Software Foundation, Inc.
+ Copyright (C) 2008-2017 Free Software Foundation, Inc.
This file is part of GDB.
/* See record.h. */
+void
+record_start (const char *method, const char *format, int from_tty)
+{
+ if (method == NULL)
+ {
+ if (format == NULL)
+ execute_command_to_string ((char *) "record", from_tty);
+ else
+ error (_("Invalid format."));
+ }
+ else if (strcmp (method, "full") == 0)
+ {
+ if (format == NULL)
+ execute_command_to_string ((char *) "record full", from_tty);
+ else
+ error (_("Invalid format."));
+ }
+ else if (strcmp (method, "btrace") == 0)
+ {
+ if (format == NULL)
+ execute_command_to_string ((char *) "record btrace", from_tty);
+ else if (strcmp (format, "bts") == 0)
+ execute_command_to_string ((char *) "record btrace bts", from_tty);
+ else if (strcmp (format, "pt") == 0)
+ execute_command_to_string ((char *) "record btrace pt", from_tty);
+ else
+ error (_("Invalid format."));
+ }
+ else
+ error (_("Invalid method."));
+}
+
+/* See record.h. */
+
+void
+record_stop (int from_tty)
+{
+ execute_command_to_string ((char *) "record stop", from_tty);
+}
+
+/* See record.h. */
+
int
record_read_memory (struct gdbarch *gdbarch,
CORE_ADDR memaddr, gdb_byte *myaddr,
{
DEBUG ("stop %s", t->to_shortname);
- if (t->to_stop_recording != NULL)
- t->to_stop_recording ();
+ t->to_stop_recording (t);
}
/* Unpush the record target. */
/* See record.h. */
void
-record_disconnect (struct target_ops *t, char *args, int from_tty)
+record_disconnect (struct target_ops *t, const char *args, int from_tty)
{
gdb_assert (t->to_stratum == record_stratum);
threads are discarded. */
record_unpush (t);
- target_mourn_inferior ();
+ target_mourn_inferior (inferior_ptid);
}
/* See record.h. */
target_kill ();
}
+/* See record.h. */
+
+int
+record_check_stopped_by_breakpoint (struct address_space *aspace, CORE_ADDR pc,
+ enum target_stop_reason *reason)
+{
+ if (breakpoint_inserted_here_p (aspace, pc))
+ {
+ if (hardware_breakpoint_inserted_here_p (aspace, pc))
+ *reason = TARGET_STOPPED_BY_HW_BREAKPOINT;
+ else
+ *reason = TARGET_STOPPED_BY_SW_BREAKPOINT;
+ return 1;
+ }
+
+ *reason = TARGET_STOPPED_BY_NO_REASON;
+ return 0;
+}
+
/* Implement "show record debug" command. */
static void
static void
cmd_record_start (char *args, int from_tty)
{
- execute_command ("target record-full", from_tty);
+ execute_command ((char *) "target record-full", from_tty);
}
/* Truncate the record log from the present point
{
require_record_target ();
- if (!target_record_is_replaying ())
+ if (!target_record_is_replaying (inferior_ptid))
{
printf_unfiltered (_("Already at end of record list.\n"));
return;
printf_unfiltered (_("Process record is stopped and all execution "
"logs are deleted.\n"));
- observer_notify_record_changed (current_inferior (), 0);
+ observer_notify_record_changed (current_inferior (), 0, NULL, NULL);
}
/* The "set record" command. */
}
printf_filtered (_("Active record target: %s\n"), t->to_shortname);
- if (t->to_info_record != NULL)
- t->to_info_record ();
+ t->to_info_record (t);
}
/* The "record save" command. */
target_save_record (recfilename);
}
-/* "record goto" command. Argument is an instruction number,
- as given by "info record".
-
- Rewinds the recording (forward or backward) to the given instruction. */
+/* See record.h. */
void
-cmd_record_goto (char *arg, int from_tty)
+record_goto (const char *arg)
{
ULONGEST insn;
target_goto_record (insn);
}
+/* "record goto" command. Argument is an instruction number,
+ as given by "info record".
+
+ Rewinds the recording (forward or backward) to the given instruction. */
+
+static void
+cmd_record_goto (char *arg, int from_tty)
+{
+ record_goto (arg);
+}
+
/* The "record goto begin" command. */
static void
switch (*args)
{
case 'm':
+ case 's':
modifiers |= DISASSEMBLY_SOURCE;
modifiers |= DISASSEMBLY_FILENAME;
break;
add_cmd ("instruction-history", class_obscure, cmd_record_insn_history, _("\
Print disassembled instructions stored in the execution log.\n\
-With a /m modifier, source lines are included (if available).\n\
+With a /m or /s modifier, source lines are included (if available).\n\
With a /r modifier, raw instructions in hex are included.\n\
With a /f modifier, function names are omitted.\n\
With a /p modifier, current position markers are omitted.\n\