record-btrace: add to_wait and to_resume target methods.
authorMarkus Metzger <markus.t.metzger@intel.com>
Mon, 25 Mar 2013 14:44:43 +0000 (15:44 +0100)
committerMarkus Metzger <markus.t.metzger@intel.com>
Thu, 16 Jan 2014 12:06:14 +0000 (13:06 +0100)
Add simple to_wait and to_resume target methods that prevent stepping when the
current replay position is not at the end of the execution log.

2014-01-16  Markus Metzger  <markus.t.metzger@intel.com>

* record-btrace.c (record_btrace_resume): New.
(record_btrace_wait): New.
(init_record_btrace_ops): Initialize to_wait and to_resume.

gdb/ChangeLog
gdb/record-btrace.c

index 29f00d8..7ca7fb3 100644 (file)
@@ -1,5 +1,11 @@
 2014-01-16  Markus Metzger  <markus.t.metzger@intel.com>
 
+       * record-btrace.c (record_btrace_resume): New.
+       (record_btrace_wait): New.
+       (init_record_btrace_ops): Initialize to_wait and to_resume.
+
+2014-01-16  Markus Metzger  <markus.t.metzger@intel.com>
+
        * record-btrace.c (record_btrace_xfer_partial)
        (record_btrace_insert_breakpoint, record_btrace_remove_breakpoint)
        (record_btrace_allow_memory_access): New.
index a12dba1..1951dce 100644 (file)
@@ -1011,6 +1011,45 @@ static const struct frame_unwind record_btrace_frame_unwind =
   NULL,
   record_btrace_frame_sniffer
 };
+
+/* The to_resume method of target record-btrace.  */
+
+static void
+record_btrace_resume (struct target_ops *ops, ptid_t ptid, int step,
+                     enum gdb_signal signal)
+{
+  /* As long as we're not replaying, just forward the request.  */
+  if (!record_btrace_is_replaying ())
+    {
+      for (ops = ops->beneath; ops != NULL; ops = ops->beneath)
+       if (ops->to_resume != NULL)
+         return ops->to_resume (ops, ptid, step, signal);
+
+      error (_("Cannot find target for stepping."));
+    }
+
+  error (_("You can't do this from here.  Do 'record goto end', first."));
+}
+
+/* The to_wait method of target record-btrace.  */
+
+static ptid_t
+record_btrace_wait (struct target_ops *ops, ptid_t ptid,
+                   struct target_waitstatus *status, int options)
+{
+  /* As long as we're not replaying, just forward the request.  */
+  if (!record_btrace_is_replaying ())
+    {
+      for (ops = ops->beneath; ops != NULL; ops = ops->beneath)
+       if (ops->to_wait != NULL)
+         return ops->to_wait (ops, ptid, status, options);
+
+      error (_("Cannot find target for waiting."));
+    }
+
+  error (_("You can't do this from here.  Do 'record goto end', first."));
+}
+
 /* Initialize the record-btrace target ops.  */
 
 static void
@@ -1045,6 +1084,8 @@ init_record_btrace_ops (void)
   ops->to_store_registers = record_btrace_store_registers;
   ops->to_prepare_to_store = record_btrace_prepare_to_store;
   ops->to_get_unwinder = &record_btrace_frame_unwind;
+  ops->to_resume = record_btrace_resume;
+  ops->to_wait = record_btrace_wait;
   ops->to_stratum = record_stratum;
   ops->to_magic = OPS_MAGIC;
 }