]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - gdb/mi/mi-interp.c
gdb: rename struct shobj -> struct solib
[thirdparty/binutils-gdb.git] / gdb / mi / mi-interp.c
index dd17fd5c42dc4ce9d7881338349843166ca28623..38ae227690151ca9f4b30e15243e682356810422 100644 (file)
@@ -1,6 +1,6 @@
 /* MI Interpreter Definitions and Commands for GDB, the GNU debugger.
 
-   Copyright (C) 2002-2023 Free Software Foundation, Inc.
+   Copyright (C) 2002-2024 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -60,17 +60,6 @@ static int mi_interp_query_hook (const char *ctlstr, va_list ap)
 static void mi_insert_notify_hooks (void);
 static void mi_remove_notify_hooks (void);
 
-static void mi_traceframe_changed (int tfnum, int tpnum);
-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);
-static void mi_command_param_changed (const char *param, const char *value);
-static void mi_memory_changed (struct inferior *inf, CORE_ADDR memaddr,
-                              ssize_t len, const bfd_byte *myaddr);
-
 /* Display the MI prompt.  */
 
 static void
@@ -83,15 +72,6 @@ display_mi_prompt (struct mi_interp *mi)
   ui->prompt_state = PROMPTED;
 }
 
-/* Returns the INTERP's data cast as mi_interp if INTERP is an MI, and
-   returns NULL otherwise.  */
-
-static struct mi_interp *
-as_mi_interp (struct interp *interp)
-{
-  return dynamic_cast<mi_interp *> (interp);
-}
-
 void
 mi_interp::on_command_error ()
 {
@@ -115,7 +95,7 @@ mi_interp::init (bool top_level)
   mi->log = mi->err;
   mi->targ = new mi_console_file (mi->raw_stdout, "@", '"');
   mi->event_channel = new mi_console_file (mi->raw_stdout, "=", 0);
-  mi->mi_uiout = mi_out_new (name ());
+  mi->mi_uiout = mi_out_new (name ()).release ();
   gdb_assert (mi->mi_uiout != nullptr);
   mi->cli_uiout = new cli_ui_out (mi->out);
 
@@ -297,7 +277,9 @@ mi_interp::on_new_thread (thread_info *t)
 }
 
 void
-mi_interp::on_thread_exited (thread_info *t, int silent)
+mi_interp::on_thread_exited (thread_info *t,
+                            std::optional<ULONGEST> /* exit_code */,
+                            int /* silent */)
 {
   target_terminal::scoped_restore_terminal_state term_state;
   target_terminal::ours_for_output ();
@@ -495,114 +477,73 @@ struct mi_suppress_notification mi_suppress_notification =
     0,
   };
 
-/* Emit notification on changing a traceframe.  */
-
-static void
-mi_traceframe_changed (int tfnum, int tpnum)
+void
+mi_interp::on_traceframe_changed (int tfnum, int tpnum)
 {
   if (mi_suppress_notification.traceframe)
     return;
 
-  SWITCH_THRU_ALL_UIS ()
-    {
-      struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
-
-      if (mi == NULL)
-       continue;
-
-      target_terminal::scoped_restore_terminal_state term_state;
-      target_terminal::ours_for_output ();
+  target_terminal::scoped_restore_terminal_state term_state;
+  target_terminal::ours_for_output ();
 
-      if (tfnum >= 0)
-       gdb_printf (mi->event_channel, "traceframe-changed,"
-                   "num=\"%d\",tracepoint=\"%d\"",
-                   tfnum, tpnum);
-      else
-       gdb_printf (mi->event_channel, "traceframe-changed,end");
+  if (tfnum >= 0)
+    gdb_printf (this->event_channel, "traceframe-changed,"
+               "num=\"%d\",tracepoint=\"%d\"",
+               tfnum, tpnum);
+  else
+    gdb_printf (this->event_channel, "traceframe-changed,end");
 
-      gdb_flush (mi->event_channel);
-    }
+  gdb_flush (this->event_channel);
 }
 
-/* Emit notification on creating a trace state variable.  */
-
-static void
-mi_tsv_created (const struct trace_state_variable *tsv)
+void
+mi_interp::on_tsv_created (const trace_state_variable *tsv)
 {
-  SWITCH_THRU_ALL_UIS ()
-    {
-      struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
-
-      if (mi == NULL)
-       continue;
-
-      target_terminal::scoped_restore_terminal_state term_state;
-      target_terminal::ours_for_output ();
+  target_terminal::scoped_restore_terminal_state term_state;
+  target_terminal::ours_for_output ();
 
-      gdb_printf (mi->event_channel, "tsv-created,"
-                 "name=\"%s\",initial=\"%s\"",
-                 tsv->name.c_str (), plongest (tsv->initial_value));
+  gdb_printf (this->event_channel, "tsv-created,"
+             "name=\"%s\",initial=\"%s\"",
+             tsv->name.c_str (), plongest (tsv->initial_value));
 
-      gdb_flush (mi->event_channel);
-    }
+  gdb_flush (this->event_channel);
 }
 
-/* Emit notification on deleting a trace state variable.  */
-
-static void
-mi_tsv_deleted (const struct trace_state_variable *tsv)
+void
+mi_interp::on_tsv_deleted (const trace_state_variable *tsv)
 {
-  SWITCH_THRU_ALL_UIS ()
-    {
-      struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
-
-      if (mi == NULL)
-       continue;
-
-      target_terminal::scoped_restore_terminal_state term_state;
-      target_terminal::ours_for_output ();
+  target_terminal::scoped_restore_terminal_state term_state;
+  target_terminal::ours_for_output ();
 
-      if (tsv != NULL)
-       gdb_printf (mi->event_channel, "tsv-deleted,"
-                   "name=\"%s\"", tsv->name.c_str ());
-      else
-       gdb_printf (mi->event_channel, "tsv-deleted");
+  if (tsv != nullptr)
+    gdb_printf (this->event_channel, "tsv-deleted,name=\"%s\"",
+               tsv->name.c_str ());
+  else
+    gdb_printf (this->event_channel, "tsv-deleted");
 
-      gdb_flush (mi->event_channel);
-    }
+  gdb_flush (this->event_channel);
 }
 
-/* Emit notification on modifying a trace state variable.  */
-
-static void
-mi_tsv_modified (const struct trace_state_variable *tsv)
+void
+mi_interp::on_tsv_modified (const trace_state_variable *tsv)
 {
-  SWITCH_THRU_ALL_UIS ()
-    {
-      struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
-      struct ui_out *mi_uiout;
-
-      if (mi == NULL)
-       continue;
-
-      mi_uiout = top_level_interpreter ()->interp_ui_out ();
+  ui_out *mi_uiout = this->interp_ui_out ();
 
-      target_terminal::scoped_restore_terminal_state term_state;
-      target_terminal::ours_for_output ();
+  target_terminal::scoped_restore_terminal_state term_state;
+  target_terminal::ours_for_output ();
 
-      gdb_printf (mi->event_channel,
-                 "tsv-modified");
+  gdb_printf (this->event_channel,
+             "tsv-modified");
 
-      ui_out_redirect_pop redir (mi_uiout, mi->event_channel);
+  ui_out_redirect_pop redir (mi_uiout, this->event_channel);
 
-      mi_uiout->field_string ("name", tsv->name);
-      mi_uiout->field_string ("initial",
-                             plongest (tsv->initial_value));
-      if (tsv->value_known)
-       mi_uiout->field_string ("current", plongest (tsv->value));
+  mi_uiout->field_string ("name", tsv->name);
+  mi_uiout->field_string ("initial",
+                         plongest (tsv->initial_value));
+  if (tsv->value_known)
+    mi_uiout->field_string ("current", plongest (tsv->value));
 
-      gdb_flush (mi->event_channel);
-    }
+  gdb_flush (this->event_channel);
 }
 
 /* Print breakpoint BP on MI's event channel.  */
@@ -634,10 +575,8 @@ mi_print_breakpoint_for_event (struct mi_interp *mi, breakpoint *bp)
     }
 }
 
-/* Emit notification about a created breakpoint.  */
-
-static void
-mi_breakpoint_created (struct breakpoint *b)
+void
+mi_interp::on_breakpoint_created (breakpoint *b)
 {
   if (mi_suppress_notification.breakpoint)
     return;
@@ -645,28 +584,17 @@ mi_breakpoint_created (struct breakpoint *b)
   if (b->number <= 0)
     return;
 
-  SWITCH_THRU_ALL_UIS ()
-    {
-      struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
-
-      if (mi == NULL)
-       continue;
-
-      target_terminal::scoped_restore_terminal_state term_state;
-      target_terminal::ours_for_output ();
+  target_terminal::scoped_restore_terminal_state term_state;
+  target_terminal::ours_for_output ();
 
-      gdb_printf (mi->event_channel,
-                 "breakpoint-created");
-      mi_print_breakpoint_for_event (mi, b);
+  gdb_printf (this->event_channel, "breakpoint-created");
+  mi_print_breakpoint_for_event (this, b);
 
-      gdb_flush (mi->event_channel);
-    }
+  gdb_flush (this->event_channel);
 }
 
-/* Emit notification about deleted breakpoint.  */
-
-static void
-mi_breakpoint_deleted (struct breakpoint *b)
+void
+mi_interp::on_breakpoint_deleted (breakpoint *b)
 {
   if (mi_suppress_notification.breakpoint)
     return;
@@ -674,27 +602,15 @@ mi_breakpoint_deleted (struct breakpoint *b)
   if (b->number <= 0)
     return;
 
-  SWITCH_THRU_ALL_UIS ()
-    {
-      struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
-
-      if (mi == NULL)
-       continue;
-
-      target_terminal::scoped_restore_terminal_state term_state;
-      target_terminal::ours_for_output ();
-
-      gdb_printf (mi->event_channel, "breakpoint-deleted,id=\"%d\"",
-                 b->number);
+  target_terminal::scoped_restore_terminal_state term_state;
+  target_terminal::ours_for_output ();
 
-      gdb_flush (mi->event_channel);
-    }
+  gdb_printf (this->event_channel, "breakpoint-deleted,id=\"%d\"", b->number);
+  gdb_flush (this->event_channel);
 }
 
-/* Emit notification about modified breakpoint.  */
-
-static void
-mi_breakpoint_modified (struct breakpoint *b)
+void
+mi_interp::on_breakpoint_modified (breakpoint *b)
 {
   if (mi_suppress_notification.breakpoint)
     return;
@@ -702,21 +618,12 @@ mi_breakpoint_modified (struct breakpoint *b)
   if (b->number <= 0)
     return;
 
-  SWITCH_THRU_ALL_UIS ()
-    {
-      struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
-
-      if (mi == NULL)
-       continue;
-
-      target_terminal::scoped_restore_terminal_state term_state;
-      target_terminal::ours_for_output ();
-      gdb_printf (mi->event_channel,
-                 "breakpoint-modified");
-      mi_print_breakpoint_for_event (mi, b);
+  target_terminal::scoped_restore_terminal_state term_state;
+  target_terminal::ours_for_output ();
+  gdb_printf (this->event_channel, "breakpoint-modified");
+  mi_print_breakpoint_for_event (this, b);
 
-      gdb_flush (mi->event_channel);
-    }
+  gdb_flush (this->event_channel);
 }
 
 static void
@@ -768,7 +675,7 @@ mi_on_resume_1 (struct mi_interp *mi,
   if (!mi->running_result_record_printed && mi->mi_proceeded)
     {
       gdb_printf (mi->raw_stdout, "%s^running\n",
-                 current_token ? current_token : "");
+                 mi->current_token ? mi->current_token : "");
     }
 
   /* Backwards compatibility.  If doing a wildcard resume and there's
@@ -817,28 +724,28 @@ mi_interp::on_target_resumed (ptid_t ptid)
 /* See mi-interp.h.  */
 
 void
-mi_output_solib_attribs (ui_out *uiout, struct so_list *solib)
+mi_output_solib_attribs (ui_out *uiout, const solib &solib)
 {
-  struct gdbarch *gdbarch = target_gdbarch ();
+  gdbarch *gdbarch = current_inferior ()->arch ();
 
-  uiout->field_string ("id", solib->so_original_name);
-  uiout->field_string ("target-name", solib->so_original_name);
-  uiout->field_string ("host-name", solib->so_name);
-  uiout->field_signed ("symbols-loaded", solib->symbols_loaded);
-  if (!gdbarch_has_global_solist (target_gdbarch ()))
+  uiout->field_string ("id", solib.so_original_name);
+  uiout->field_string ("target-name", solib.so_original_name);
+  uiout->field_string ("host-name", solib.so_name);
+  uiout->field_signed ("symbols-loaded", solib.symbols_loaded);
+  if (!gdbarch_has_global_solist (current_inferior ()->arch ()))
       uiout->field_fmt ("thread-group", "i%d", current_inferior ()->num);
 
   ui_out_emit_list list_emitter (uiout, "ranges");
   ui_out_emit_tuple tuple_emitter (uiout, NULL);
-  if (solib->addr_high != 0)
+  if (solib.addr_high != 0)
     {
-      uiout->field_core_addr ("from", gdbarch, solib->addr_low);
-      uiout->field_core_addr ("to", gdbarch, solib->addr_high);
+      uiout->field_core_addr ("from", gdbarch, solib.addr_low);
+      uiout->field_core_addr ("to", gdbarch, solib.addr_high);
     }
 }
 
 void
-mi_interp::on_solib_loaded (so_list *solib)
+mi_interp::on_solib_loaded (const solib &solib)
 {
   ui_out *uiout = this->interp_ui_out ();
 
@@ -855,7 +762,7 @@ mi_interp::on_solib_loaded (so_list *solib)
 }
 
 void
-mi_interp::on_solib_unloaded (so_list *solib)
+mi_interp::on_solib_unloaded (const solib &solib)
 {
   ui_out *uiout = this->interp_ui_out ();
 
@@ -866,91 +773,69 @@ mi_interp::on_solib_unloaded (so_list *solib)
 
   ui_out_redirect_pop redir (uiout, this->event_channel);
 
-  uiout->field_string ("id", solib->so_original_name);
-  uiout->field_string ("target-name", solib->so_original_name);
-  uiout->field_string ("host-name", solib->so_name);
-  if (!gdbarch_has_global_solist (target_gdbarch ()))
+  uiout->field_string ("id", solib.so_original_name);
+  uiout->field_string ("target-name", solib.so_original_name);
+  uiout->field_string ("host-name", solib.so_name);
+  if (!gdbarch_has_global_solist (current_inferior ()->arch ()))
     uiout->field_fmt ("thread-group", "i%d", current_inferior ()->num);
 
   gdb_flush (this->event_channel);
 }
 
-/* Emit notification about the command parameter change.  */
-
-static void
-mi_command_param_changed (const char *param, const char *value)
+void
+mi_interp::on_param_changed (const char *param, const char *value)
 {
   if (mi_suppress_notification.cmd_param_changed)
     return;
 
-  SWITCH_THRU_ALL_UIS ()
-    {
-      struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
-      struct ui_out *mi_uiout;
-
-      if (mi == NULL)
-       continue;
-
-      mi_uiout = top_level_interpreter ()->interp_ui_out ();
+  ui_out *mi_uiout = this->interp_ui_out ();
 
-      target_terminal::scoped_restore_terminal_state term_state;
-      target_terminal::ours_for_output ();
+  target_terminal::scoped_restore_terminal_state term_state;
+  target_terminal::ours_for_output ();
 
-      gdb_printf (mi->event_channel, "cmd-param-changed");
+  gdb_printf (this->event_channel, "cmd-param-changed");
 
-      ui_out_redirect_pop redir (mi_uiout, mi->event_channel);
+  ui_out_redirect_pop redir (mi_uiout, this->event_channel);
 
-      mi_uiout->field_string ("param", param);
-      mi_uiout->field_string ("value", value);
+  mi_uiout->field_string ("param", param);
+  mi_uiout->field_string ("value", value);
 
-      gdb_flush (mi->event_channel);
-    }
+  gdb_flush (this->event_channel);
 }
 
-/* Emit notification about the target memory change.  */
-
-static void
-mi_memory_changed (struct inferior *inferior, CORE_ADDR memaddr,
-                  ssize_t len, const bfd_byte *myaddr)
+void
+mi_interp::on_memory_changed (inferior *inferior, CORE_ADDR memaddr,
+                             ssize_t len, const bfd_byte *myaddr)
 {
   if (mi_suppress_notification.memory)
     return;
 
-  SWITCH_THRU_ALL_UIS ()
-    {
-      struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
-      struct ui_out *mi_uiout;
-      struct obj_section *sec;
 
-      if (mi == NULL)
-       continue;
-
-      mi_uiout = top_level_interpreter ()->interp_ui_out ();
-
-      target_terminal::scoped_restore_terminal_state term_state;
-      target_terminal::ours_for_output ();
+  ui_out *mi_uiout = this->interp_ui_out ();
 
-      gdb_printf (mi->event_channel, "memory-changed");
+  target_terminal::scoped_restore_terminal_state term_state;
+  target_terminal::ours_for_output ();
 
-      ui_out_redirect_pop redir (mi_uiout, mi->event_channel);
+  gdb_printf (this->event_channel, "memory-changed");
 
-      mi_uiout->field_fmt ("thread-group", "i%d", inferior->num);
-      mi_uiout->field_core_addr ("addr", target_gdbarch (), memaddr);
-      mi_uiout->field_string ("len", hex_string (len));
+  ui_out_redirect_pop redir (mi_uiout, this->event_channel);
 
-      /* Append 'type=code' into notification if MEMADDR falls in the range of
-        sections contain code.  */
-      sec = find_pc_section (memaddr);
-      if (sec != NULL && sec->objfile != NULL)
-       {
-         flagword flags = bfd_section_flags (sec->the_bfd_section);
+  mi_uiout->field_fmt ("thread-group", "i%d", inferior->num);
+  mi_uiout->field_core_addr ("addr", current_inferior ()->arch (), memaddr);
+  mi_uiout->field_string ("len", hex_string (len));
 
-         if (flags & SEC_CODE)
-           mi_uiout->field_string ("type", "code");
-       }
+  /* Append 'type=code' into notification if MEMADDR falls in the range of
+     sections contain code.  */
+  obj_section *sec = find_pc_section (memaddr);
+  if (sec != nullptr && sec->objfile != nullptr)
+    {
+      flagword flags = bfd_section_flags (sec->the_bfd_section);
 
-      gdb_flush (mi->event_channel);
+      if (flags & SEC_CODE)
+       mi_uiout->field_string ("type", "code");
     }
+
+  gdb_flush (this->event_channel);
 }
 
 void
@@ -1054,19 +939,4 @@ _initialize_mi_interp ()
   interp_factory_register (INTERP_MI3, mi_interp_factory);
   interp_factory_register (INTERP_MI4, mi_interp_factory);
   interp_factory_register (INTERP_MI, mi_interp_factory);
-
-  gdb::observers::traceframe_changed.attach (mi_traceframe_changed,
-                                            "mi-interp");
-  gdb::observers::tsv_created.attach (mi_tsv_created, "mi-interp");
-  gdb::observers::tsv_deleted.attach (mi_tsv_deleted, "mi-interp");
-  gdb::observers::tsv_modified.attach (mi_tsv_modified, "mi-interp");
-  gdb::observers::breakpoint_created.attach (mi_breakpoint_created,
-                                            "mi-interp");
-  gdb::observers::breakpoint_deleted.attach (mi_breakpoint_deleted,
-                                            "mi-interp");
-  gdb::observers::breakpoint_modified.attach (mi_breakpoint_modified,
-                                             "mi-interp");
-  gdb::observers::command_param_changed.attach (mi_command_param_changed,
-                                               "mi-interp");
-  gdb::observers::memory_changed.attach (mi_memory_changed, "mi-interp");
 }