+2016-06-06  Simon Marchi  <simon.marchi@ericsson.com>
+
+       * NEWS: Mention the new fields in =record-started.
+       * common/btrace-common.h (btrace_format_short_string): New function
+       declaration.
+       * common/btrace-common.c (btrace_format_short_string): New
+       function.
+       * mi/mi-interp.c (mi_record_changed): Output method and format
+       fields in the =record-started record.
+       * record-btrace.c (record_btrace_open): Adapt record_changed
+       notification.
+       * record-full.c (record_full_open): Likewise.
+       * record.c (cmd_record_stop): Likewise.
+
 2016-06-02  Jon Turney  <jon.turney@dronecode.org.uk>
 
        * windows-nat.c (handle_output_debug_string): Return type of
 
   including JIT compiling fast tracepoint's conditional expression
   bytecode into native code.
 
+* MI async record =record-started now includes the method and format used for
+  recording.  For example:
+
+    =record-started,thread-group="i1",method="btrace",format="bts"
+
 *** Changes in GDB 7.11
 
 * GDB now supports debugging kernel-based threads on FreeBSD.
 
 
 /* See btrace-common.h.  */
 
+const char *
+btrace_format_short_string (enum btrace_format format)
+{
+  switch (format)
+    {
+    case BTRACE_FORMAT_NONE:
+      return "unknown";
+
+    case BTRACE_FORMAT_BTS:
+      return "bts";
+
+    case BTRACE_FORMAT_PT:
+      return "pt";
+    }
+
+  internal_error (__FILE__, __LINE__, _("Unknown branch trace format"));
+}
+
+/* See btrace-common.h.  */
+
 void
 btrace_data_init (struct btrace_data *data)
 {
 
 /* Return a string representation of FORMAT.  */
 extern const char *btrace_format_string (enum btrace_format format);
 
+/* Return an abbreviation string representation of FORMAT.  */
+extern const char *btrace_format_short_string (enum btrace_format format);
+
 /* Initialize DATA.  */
 extern void btrace_data_init (struct btrace_data *data);
 
 
+2016-06-06  Simon Marchi  <simon.marchi@ericsson.com>
+
+       * gdb.texinfo (GDB/MI Async Records): Document method and
+       format fields in =record-started.
+       * observer.texi (record_changed): Add method and format
+       parameters.
+
 2016-05-27  Eli Zaretskii  <eliz@gnu.org>
 
        * gdb.texinfo (General Query Packets): Move the description of the
 
 Note that if a breakpoint is emitted in the result record of a
 command, then it will not also be emitted in an async record.
 
-@item =record-started,thread-group="@var{id}"
+@item =record-started,thread-group="@var{id}",method="@var{method}"[,format="@var{format}"]
 @itemx =record-stopped,thread-group="@var{id}"
 Execution log recording was either started or stopped on an
 inferior.  The @var{id} is the @value{GDBN} identifier of the thread
 group corresponding to the affected inferior.
 
+The @var{method} field indicates the method used to record execution.  If the
+method in use supports multiple recording formats, @var{format} will be present
+and contain the currently used format.  @xref{Process Record and Replay}
+for existing method and format values.
+
 @item =cmd-param-changed,param=@var{param},value=@var{value}
 Reports that a parameter of the command @code{set @var{param}} is
 changed to @var{value}.  In the multi-word @code{set} command,
 
 inferior, and before any information on the inferior has been printed.
 @end deftypefun
 
-@deftypefun void record_changed (struct inferior *@var{inferior}, int @var{started})
+@deftypefun void record_changed (struct inferior *@var{inferior}, int @var{started}, const char *@var{method}, const char *@var{format})
 The status of process record for inferior @var{inferior} in
 @value{GDBN} has changed.  The process record is started if
 @var{started} is true, and the process record is stopped if
 @var{started} is false.
+
+When @var{started} is true, @var{method} indicates the short name of the method
+used for recording.  If the method supports multiple formats, @var{format}
+indicates which one is being used, otherwise it is NULL.  When @var{started} is
+false, they are both NULL.
 @end deftypefun
 
 @deftypefun void solib_loaded (struct so_list *@var{solib})
 
 
 static void mi_new_thread (struct thread_info *t);
 static void mi_thread_exit (struct thread_info *t, int silent);
-static void mi_record_changed (struct inferior*, int);
+static void mi_record_changed (struct inferior*, int, const char *,
+                              const char *);
 static void mi_inferior_added (struct inferior *inf);
 static void mi_inferior_appeared (struct inferior *inf);
 static void mi_inferior_exit (struct inferior *inf);
 /* Emit notification on changing the state of record.  */
 
 static void
-mi_record_changed (struct inferior *inferior, int started)
+mi_record_changed (struct inferior *inferior, int started, const char *method,
+                  const char *format)
 {
   struct mi_interp *mi = (struct mi_interp *) top_level_interpreter_data ();
   struct cleanup *old_chain;
   old_chain = make_cleanup_restore_target_terminal ();
   target_terminal_ours_for_output ();
 
-  fprintf_unfiltered (mi->event_channel,  "record-%s,thread-group=\"i%d\"",
-                     started ? "started" : "stopped", inferior->num);
+  if (started)
+    {
+      if (format != NULL)
+       fprintf_unfiltered (
+         mi->event_channel,
+         "record-started,thread-group=\"i%d\",method=\"%s\",format=\"%s\"",
+         inferior->num, method, format);
+      else
+       fprintf_unfiltered (
+         mi->event_channel,
+         "record-started,thread-group=\"i%d\",method=\"%s\"",
+         inferior->num, method);
+    }
+  else
+    fprintf_unfiltered (mi->event_channel,
+                       "record-stopped,thread-group=\"i%d\"", inferior->num);
+
 
   gdb_flush (mi->event_channel);
 
 
 {
   struct cleanup *disable_chain;
   struct thread_info *tp;
+  const char *format;
 
   DEBUG ("open");
 
                                  NULL);
   record_btrace_generating_corefile = 0;
 
-  observer_notify_record_changed (current_inferior (),  1);
+  format = btrace_format_short_string (record_btrace_conf.format);
+  observer_notify_record_changed (current_inferior (), 1, "btrace", format);
 
   discard_cleanups (disable_chain);
 }
 
 
   record_full_init_record_breakpoints ();
 
-  observer_notify_record_changed (current_inferior (),  1);
+  observer_notify_record_changed (current_inferior (),  1, "full", NULL);
 }
 
 /* "to_close" target method.  Close the process record target.  */
 
   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.  */
 
+2016-06-06  Simon Marchi  <simon.marchi@ericsson.com>
+
+       * gdb.mi/mi-record-changed.exp: Adjust =record-started output
+       matching.
+
 2016-06-02  Tom Tromey  <tom@tromey.com>
 
        PR python/18984:
 
 }
 mi_run_to_main
 
-mi_gdb_test "record" ".*=record-started,thread-group=\"i${decimal}\".*\\^done" \
+mi_gdb_test "record" ".*=record-started,thread-group=\"i${decimal}\",method=\"full\".*\\^done" \
     "record"
 mi_gdb_test "record stop" \
     ".*=record-stopped,thread-group=\"i${decimal}\".*\\^done" \
     "record end"
 
 mi_gdb_test "target record" \
-    ".*=record-started,thread-group=\"i${decimal}\".*\\^done" \
+    ".*=record-started,thread-group=\"i${decimal}\",method=\"full\".*\\^done" \
     "target record"
 
 return 0