PR gdb/7912:
[deliverable/binutils-gdb.git] / gdb / mi / mi-interp.c
index 66176471a0d217f34ec74f167d21dac535e45cc1..2702f4f0932aad6987a60162bd6840fa1003f838 100644 (file)
 #include "solist.h"
 #include "gdb.h"
 #include "objfiles.h"
+#include "tracepoint.h"
 
 /* These are the interpreter setup, etc. functions for the MI
    interpreter.  */
 
-static void mi_execute_command_wrapper (char *cmd);
+static void mi_execute_command_wrapper (const char *cmd);
 static void mi_execute_command_input_handler (char *cmd);
 static void mi_command_loop (int mi_version);
 
@@ -71,8 +72,9 @@ static void mi_solib_loaded (struct so_list *solib);
 static void mi_solib_unloaded (struct so_list *solib);
 static void mi_about_to_proceed (void);
 static void mi_traceframe_changed (int tfnum, int tpnum);
-static void mi_tsv_created (const char *name, LONGEST value);
-static void mi_tsv_deleted (const char *name);
+static void mi_tsv_created (const struct trace_state_variable *tsv);
+static void mi_tsv_deleted (const struct trace_state_variable *tsv);
+static void mi_tsv_modified (const struct trace_state_variable *tsv);
 static void mi_breakpoint_created (struct breakpoint *b);
 static void mi_breakpoint_deleted (struct breakpoint *b);
 static void mi_breakpoint_modified (struct breakpoint *b);
@@ -137,6 +139,7 @@ mi_interpreter_init (struct interp *interp, int top_level)
       observer_attach_traceframe_changed (mi_traceframe_changed);
       observer_attach_tsv_created (mi_tsv_created);
       observer_attach_tsv_deleted (mi_tsv_deleted);
+      observer_attach_tsv_modified (mi_tsv_modified);
       observer_attach_breakpoint_created (mi_breakpoint_created);
       observer_attach_breakpoint_deleted (mi_breakpoint_deleted);
       observer_attach_breakpoint_modified (mi_breakpoint_modified);
@@ -214,10 +217,7 @@ mi_interpreter_suspend (void *data)
 static struct gdb_exception
 mi_interpreter_exec (void *data, const char *command)
 {
-  char *tmp = alloca (strlen (command) + 1);
-
-  strcpy (tmp, command);
-  mi_execute_command_wrapper (tmp);
+  mi_execute_command_wrapper (command);
   return exception_none;
 }
 
@@ -306,7 +306,7 @@ mi_interp_query_hook (const char *ctlstr, va_list ap)
 }
 
 static void
-mi_execute_command_wrapper (char *cmd)
+mi_execute_command_wrapper (const char *cmd)
 {
   mi_execute_command (cmd, stdin == instream);
 }
@@ -563,15 +563,15 @@ mi_traceframe_changed (int tfnum, int tpnum)
 /* Emit notification on creating a trace state variable.  */
 
 static void
-mi_tsv_created (const char *name, LONGEST value)
+mi_tsv_created (const struct trace_state_variable *tsv)
 {
   struct mi_interp *mi = top_level_interpreter_data ();
 
   target_terminal_ours ();
 
   fprintf_unfiltered (mi->event_channel, "tsv-created,"
-                     "name=\"%s\",value=\"%s\"\n",
-                     name, plongest (value));
+                     "name=\"%s\",initial=\"%s\"\n",
+                     tsv->name, plongest (tsv->initial_value));
 
   gdb_flush (mi->event_channel);
 }
@@ -579,21 +579,47 @@ mi_tsv_created (const char *name, LONGEST value)
 /* Emit notification on deleting a trace state variable.  */
 
 static void
-mi_tsv_deleted (const char *name)
+mi_tsv_deleted (const struct trace_state_variable *tsv)
 {
   struct mi_interp *mi = top_level_interpreter_data ();
 
   target_terminal_ours ();
 
-  if (name != NULL)
+  if (tsv != NULL)
     fprintf_unfiltered (mi->event_channel, "tsv-deleted,"
-                       "name=\"%s\"\n", name);
+                       "name=\"%s\"\n", tsv->name);
   else
     fprintf_unfiltered (mi->event_channel, "tsv-deleted\n");
 
   gdb_flush (mi->event_channel);
 }
 
+/* Emit notification on modifying a trace state variable.  */
+
+static void
+mi_tsv_modified (const struct trace_state_variable *tsv)
+{
+  struct mi_interp *mi = top_level_interpreter_data ();
+  struct ui_out *mi_uiout = interp_ui_out (top_level_interpreter ());
+
+  target_terminal_ours ();
+
+  fprintf_unfiltered (mi->event_channel,
+                     "tsv-modified");
+
+  ui_out_redirect (mi_uiout, mi->event_channel);
+
+  ui_out_field_string (mi_uiout, "name", tsv->name);
+  ui_out_field_string (mi_uiout, "initial",
+                      plongest (tsv->initial_value));
+  if (tsv->value_known)
+    ui_out_field_string (mi_uiout, "current", plongest (tsv->value));
+
+  ui_out_redirect (mi_uiout, NULL);
+
+  gdb_flush (mi->event_channel);
+}
+
 /* Emit notification about a created breakpoint.  */
 
 static void
This page took 0.025562 seconds and 4 git commands to generate.