Introduce gdbarch_num_cooked_regs
[deliverable/binutils-gdb.git] / gdb / mi / mi-main.c
index 1716a7fe443fa414fc803c8ba18d4427eb80a5c7..5562935102e154d8754d277b8c7802e1422f85e9 100644 (file)
@@ -52,7 +52,7 @@
 #include "linespec.h"
 #include "extension.h"
 #include "gdbcmd.h"
-#include "observer.h"
+#include "observable.h"
 #include "common/gdb_optional.h"
 #include "common/byte-vector.h"
 
@@ -243,13 +243,13 @@ mi_cmd_exec_jump (const char *args, char **argv, int argc)
 static void
 proceed_thread (struct thread_info *thread, int pid)
 {
-  if (!is_stopped (thread->ptid))
+  if (thread->state != THREAD_STOPPED)
     return;
 
-  if (pid != 0 && ptid_get_pid (thread->ptid) != pid)
+  if (pid != 0 && thread->ptid.pid () != pid)
     return;
 
-  switch_to_thread (thread->ptid);
+  switch_to_thread (thread);
   clear_proceed_status (0);
   proceed ((CORE_ADDR) -1, GDB_SIGNAL_DEFAULT);
 }
@@ -266,7 +266,7 @@ proceed_thread_callback (struct thread_info *thread, void *arg)
 static void
 exec_continue (char **argv, int argc)
 {
-  prepare_execution_command (&current_target, mi_async_p ());
+  prepare_execution_command (current_top_target (), mi_async_p ());
 
   if (non_stop)
     {
@@ -345,10 +345,10 @@ interrupt_thread_callback (struct thread_info *thread, void *arg)
 {
   int pid = *(int *)arg;
 
-  if (!is_running (thread->ptid))
+  if (thread->state != THREAD_RUNNING)
     return 0;
 
-  if (ptid_get_pid (thread->ptid) != pid)
+  if (thread->ptid.pid () != pid)
     return 0;
 
   target_stop (thread->ptid);
@@ -405,25 +405,20 @@ run_one_inferior (struct inferior *inf, void *arg)
   int start_p = *(int *) arg;
   const char *run_cmd = start_p ? "start" : "run";
   struct target_ops *run_target = find_run_target ();
-  int async_p = mi_async && run_target->to_can_async_p (run_target);
+  int async_p = mi_async && run_target->can_async_p ();
 
   if (inf->pid != 0)
     {
-      if (inf->pid != ptid_get_pid (inferior_ptid))
-       {
-         struct thread_info *tp;
-
-         tp = any_thread_of_process (inf->pid);
-         if (!tp)
-           error (_("Inferior has no threads."));
+      thread_info *tp = any_thread_of_inferior (inf);
+      if (tp == NULL)
+       error (_("Inferior has no threads."));
 
-         switch_to_thread (tp->ptid);
-       }
+      switch_to_thread (tp);
     }
   else
     {
       set_current_inferior (inf);
-      switch_to_thread (null_ptid);
+      switch_to_no_thread ();
       set_current_program_space (inf->pspace);
     }
   mi_execute_cli_command (run_cmd, async_p,
@@ -479,7 +474,7 @@ mi_cmd_exec_run (const char *command, char **argv, int argc)
     {
       const char *run_cmd = start_p ? "start" : "run";
       struct target_ops *run_target = find_run_target ();
-      int async_p = mi_async && run_target->to_can_async_p (run_target);
+      int async_p = mi_async && run_target->can_async_p ();
 
       mi_execute_cli_command (run_cmd, async_p,
                              async_p ? "&" : NULL);
@@ -492,7 +487,7 @@ find_thread_of_process (struct thread_info *ti, void *p)
 {
   int pid = *(int *)p;
 
-  if (ptid_get_pid (ti->ptid) == pid && !is_exited (ti->ptid))
+  if (ti->ptid.pid () == pid && ti->state != THREAD_EXITED)
     return 1;
 
   return 0;
@@ -540,7 +535,7 @@ mi_cmd_target_detach (const char *command, char **argv, int argc)
       if (!tp)
        error (_("Thread group is empty"));
 
-      switch_to_thread (tp->ptid);
+      switch_to_thread (tp);
     }
 
   detach_command (NULL, 0);
@@ -571,10 +566,10 @@ mi_cmd_thread_select (const char *command, char **argv, int argc)
                               USER_SELECTED_THREAD | USER_SELECTED_FRAME);
 
   /* Notify if the thread has effectively changed.  */
-  if (!ptid_equal (inferior_ptid, previous_ptid))
+  if (inferior_ptid != previous_ptid)
     {
-      observer_notify_user_selected_context_changed (USER_SELECTED_THREAD
-                                                    | USER_SELECTED_FRAME);
+      gdb::observers::user_selected_context_changed.notify
+       (USER_SELECTED_THREAD | USER_SELECTED_FRAME);
     }
 }
 
@@ -628,7 +623,7 @@ collect_cores (struct thread_info *ti, void *xdata)
 {
   struct collect_cores_data *data = (struct collect_cores_data *) xdata;
 
-  if (ptid_get_pid (ti->ptid) == data->pid)
+  if (ti->ptid.pid () == data->pid)
     {
       int core = target_core_of_thread (ti->ptid);
 
@@ -773,7 +768,7 @@ list_available_thread_groups (const std::set<int> &ids, int recurse)
 
              for (const osdata_item &child : children)
                {
-                 ui_out_emit_tuple tuple_emitter (uiout, NULL);
+                 ui_out_emit_tuple inner_tuple_emitter (uiout, NULL);
                  const std::string *tid = get_osdata_column (child, "tid");
                  const std::string *tcore = get_osdata_column (child, "core");
 
@@ -895,7 +890,7 @@ mi_cmd_data_list_register_names (const char *command, char **argv, int argc)
      debugged.  */
 
   gdbarch = get_current_arch ();
-  numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
+  numregs = gdbarch_num_cooked_regs (gdbarch);
 
   ui_out_emit_list list_emitter (uiout, "register-names");
 
@@ -954,7 +949,7 @@ mi_cmd_data_list_changed_registers (const char *command, char **argv, int argc)
      debugged.  */
 
   gdbarch = this_regs->arch ();
-  numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
+  numregs = gdbarch_num_cooked_regs (gdbarch);
 
   ui_out_emit_list list_emitter (uiout, "changed-registers");
 
@@ -1017,8 +1012,6 @@ register_changed_p (int regnum, readonly_detached_regcache *prev_regs,
 
   release_value (prev_value);
   release_value (this_value);
-  value_free (prev_value);
-  value_free (this_value);
   return ret;
 }
 
@@ -1083,7 +1076,7 @@ mi_cmd_data_list_register_values (const char *command, char **argv, int argc)
 
   frame = get_selected_frame (NULL);
   gdbarch = get_frame_arch (frame);
-  numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
+  numregs = gdbarch_num_cooked_regs (gdbarch);
 
   ui_out_emit_list list_emitter (uiout, "register-values");
 
@@ -1171,7 +1164,7 @@ mi_cmd_data_write_register_values (const char *command, char **argv, int argc)
 
   regcache = get_current_regcache ();
   gdbarch = regcache->arch ();
-  numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
+  numregs = gdbarch_num_cooked_regs (gdbarch);
 
   if (argc == 0)
     error (_("-data-write-register-values: Usage: -data-write-register-"
@@ -1355,11 +1348,8 @@ mi_cmd_data_read_memory (const char *command, char **argv, int argc)
 
   gdb::byte_vector mbuf (total_bytes);
 
-  /* Dispatch memory reads to the topmost target, not the flattened
-     current_target.  */
-  nr_bytes = target_read (current_target.beneath,
-                         TARGET_OBJECT_MEMORY, NULL, mbuf.data (),
-                         addr, total_bytes);
+  nr_bytes = target_read (current_top_target (), TARGET_OBJECT_MEMORY, NULL,
+                         mbuf.data (), addr, total_bytes);
   if (nr_bytes <= 0)
     error (_("Unable to read memory."));
 
@@ -1386,7 +1376,7 @@ mi_cmd_data_read_memory (const char *command, char **argv, int argc)
       {
        int col;
        int col_byte;
-       struct value_print_options opts;
+       struct value_print_options print_opts;
 
        ui_out_emit_tuple tuple_emitter (uiout, NULL);
        uiout->field_core_addr ("addr", gdbarch, addr + row_byte);
@@ -1394,7 +1384,7 @@ mi_cmd_data_read_memory (const char *command, char **argv, int argc)
           row_byte); */
        {
          ui_out_emit_list list_data_emitter (uiout, "data");
-         get_formatted_print_options (&opts, word_format);
+         get_formatted_print_options (&print_opts, word_format);
          for (col = 0, col_byte = row_byte;
               col < nr_cols;
               col++, col_byte += word_size)
@@ -1406,8 +1396,8 @@ mi_cmd_data_read_memory (const char *command, char **argv, int argc)
              else
                {
                  stream.clear ();
-                 print_scalar_formatted (&mbuf[col_byte], word_type, &opts,
-                                         word_asize, &stream);
+                 print_scalar_formatted (&mbuf[col_byte], word_type,
+                                         &print_opts, word_asize, &stream);
                  uiout->field_stream (NULL, stream);
                }
            }
@@ -1478,7 +1468,7 @@ mi_cmd_data_read_memory_bytes (const char *command, char **argv, int argc)
   length = atol (argv[1]);
 
   std::vector<memory_read_result> result
-    = read_memory_robust (current_target.beneath, addr, length);
+    = read_memory_robust (current_top_target (), addr, length);
 
   if (result.size () == 0)
     error (_("Unable to read memory."));
@@ -1693,6 +1683,7 @@ mi_cmd_list_features (const char *command, char **argv, int argc)
       uiout->field_string (NULL, "info-gdb-mi-command");
       uiout->field_string (NULL, "undefined-command-error-code");
       uiout->field_string (NULL, "exec-run-start-option");
+      uiout->field_string (NULL, "data-disassemble-a-option");
 
       if (ext_lang_initialized_p (get_ext_lang_defn (EXT_LANG_PYTHON)))
        uiout->field_string (NULL, "python");
@@ -1776,8 +1767,11 @@ mi_cmd_remove_inferior (const char *command, char **argv, int argc)
 
       set_current_inferior (new_inferior);
       if (new_inferior->pid != 0)
-       tp = any_thread_of_process (new_inferior->pid);
-      switch_to_thread (tp ? tp->ptid : null_ptid);
+       tp = any_thread_of_inferior (new_inferior);
+      if (tp != NULL)
+       switch_to_thread (tp);
+      else
+       switch_to_no_thread ();
       set_current_program_space (new_inferior->pspace);
     }
 
@@ -1998,7 +1992,7 @@ mi_execute_command (const char *cmd, int from_tty)
 
       if (/* The notifications are only output when the top-level
             interpreter (specified on the command line) is MI.  */
-         interp_ui_out (top_level_interpreter ())->is_mi_like_p ()
+         top_level_interpreter ()->interp_ui_out ()->is_mi_like_p ()
          /* Don't try report anything if there are no threads --
             the program is dead.  */
          && thread_count () != 0
@@ -2006,16 +2000,15 @@ mi_execute_command (const char *cmd, int from_tty)
             again.  */
          && !command_notifies_uscc_observer (command.get ()))
        {
-         struct mi_interp *mi = (struct mi_interp *) top_level_interpreter ();
          int report_change = 0;
 
          if (command->thread == -1)
            {
-             report_change = (!ptid_equal (previous_ptid, null_ptid)
-                              && !ptid_equal (inferior_ptid, previous_ptid)
-                              && !ptid_equal (inferior_ptid, null_ptid));
+             report_change = (previous_ptid != null_ptid
+                              && inferior_ptid != previous_ptid
+                              && inferior_ptid != null_ptid);
            }
-         else if (!ptid_equal (inferior_ptid, null_ptid))
+         else if (inferior_ptid != null_ptid)
            {
              struct thread_info *ti = inferior_thread ();
 
@@ -2024,8 +2017,8 @@ mi_execute_command (const char *cmd, int from_tty)
 
          if (report_change)
            {
-               observer_notify_user_selected_context_changed
-                 (USER_SELECTED_THREAD | USER_SELECTED_FRAME);
+             gdb::observers::user_selected_context_changed.notify
+               (USER_SELECTED_THREAD | USER_SELECTED_FRAME);
            }
        }
     }
@@ -2063,22 +2056,25 @@ mi_cmd_execute (struct mi_parse *parse)
         provide --thread if it wishes to operate on a specific
         thread.  */
       if (inf->pid != 0)
-       tp = any_live_thread_of_process (inf->pid);
-      switch_to_thread (tp ? tp->ptid : null_ptid);
+       tp = any_live_thread_of_inferior (inf);
+      if (tp != NULL)
+       switch_to_thread (tp);
+      else
+       switch_to_no_thread ();
       set_current_program_space (inf->pspace);
     }
 
   if (parse->thread != -1)
     {
-      struct thread_info *tp = find_thread_global_id (parse->thread);
+      thread_info *tp = find_thread_global_id (parse->thread);
 
-      if (!tp)
+      if (tp == NULL)
        error (_("Invalid thread id: %d"), parse->thread);
 
-      if (is_exited (tp->ptid))
+      if (tp->state == THREAD_EXITED)
        error (_("Thread id: %d has terminated"), parse->thread);
 
-      switch_to_thread (tp->ptid);
+      switch_to_thread (tp);
     }
 
   if (parse->frame != -1)
@@ -2573,6 +2569,7 @@ mi_cmd_trace_frame_collected (const char *command, char **argv, int argc)
          break;
        case REGISTERS_FORMAT:
          registers_format = oarg[0];
+         break;
        case MEMORY_CONTENTS:
          memory_contents = 1;
          break;
@@ -2641,7 +2638,7 @@ mi_cmd_trace_frame_collected (const char *command, char **argv, int argc)
 
     frame = get_selected_frame (NULL);
     gdbarch = get_frame_arch (frame);
-    numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
+    numregs = gdbarch_num_cooked_regs (gdbarch);
 
     for (regnum = 0; regnum < numregs; regnum++)
       {
@@ -2667,7 +2664,7 @@ mi_cmd_trace_frame_collected (const char *command, char **argv, int argc)
 
        if (tsv != NULL)
          {
-           uiout->field_fmt ("name", "$%s", tsv->name);
+           uiout->field_fmt ("name", "$%s", tsv->name.c_str ());
 
            tsv->value_known = target_get_trace_state_variable_value (tsv->number,
                                                                      &tsv->value);
This page took 0.037543 seconds and 4 git commands to generate.