]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
gdb/remote: replace use of std::pair with an actual struct
authorAndrew Burgess <aburgess@redhat.com>
Sat, 11 Oct 2025 13:03:39 +0000 (14:03 +0100)
committerAndrew Burgess <aburgess@redhat.com>
Sun, 12 Oct 2025 12:46:12 +0000 (13:46 +0100)
Commit:

  commit 5edcbe2277db05b77ebf53f9c30b6c889a8729bc
  Date:   Mon Jul 24 17:35:54 2023 +0100

      gdb: detect when gdbserver has no default executable set

Introduced a use of std::pair as a data structure to hold some per
program space information within the program space registry.

It was pointed out during review of a later patch[1][2] that the code
would be easier to understand if the std::pair was replaced with a
struct with named fields.

That is what this commit does.  Replace the std::pair with a struct,
and update all accesses to use the named fields.

There should be no user visible changes after this commit.

[1] https://inbox.sourceware.org/gdb-patches/69681489-d556-4496-9e3b-8273cab3d8f5@simark.ca
[2] https://inbox.sourceware.org/gdb-patches/469655a7-2bcc-4f27-b2d7-3fa8808ca5b5@simark.ca

Approved-By: Simon Marchi <simon.marchi@efficios.com>
gdb/remote.c

index 2e706e2d45b5403dac882238cfd48f93bcd4d13d..858076bfa426fcb915244bba1a0e4e92f7f656e1 100644 (file)
@@ -1640,30 +1640,44 @@ enum class remote_exec_source
   UNSET_VALUE,
 };
 
-/* Data held per program-space to represent the remote exec-file path.  The
-   first item in the pair is the exec-file path, this is set either by the
-   user with 'set remote exec-file', or automatically by GDB when
-   connecting to a remote target.
-
-   The second item in the pair is an enum flag that indicates where the
-   path value came from, or, when the path is the empty string, what this
-   actually means.  See show_remote_exec_file for details.  */
-using remote_exec_file_info = std::pair<std::string, remote_exec_source>;
+/* Data held per program space for each remote target.  */
+
+struct remote_per_progspace
+{
+  /* The following represents the remote exec-file filename.  This value
+     can be set directly by the user with 'set remote exec-file', but can
+     also be set automatically when connecting to a remote target.  We
+     track both the filename value, and also the source of this value, as
+     where the value came from determines when the filename value can be
+     auto-generated from other sources, or when a remote target can
+     override the current value.  See show_remote_exec_file for details.  */
+  struct exec_info
+  {
+    /* The 'remote exec-file' filename value.  This will start empty.  This
+       is set either with the 'set remote exec-file' command, or
+       automatically by GDB when connecting to a remote target.  */
+    std::string filename;
+
+    /* An enum that indicates where FILENAME came from, or what an empty
+       VALUE means.  */
+    remote_exec_source source = remote_exec_source::DEFAULT_VALUE;
+  } exec_info;
+};
 
 /* Per-program-space data key.  */
-static const registry<program_space>::key<remote_exec_file_info>
+static const registry<program_space>::key<remote_per_progspace>
   remote_pspace_data;
 
-/* Retrieve the remote_exec_file_info object for PSPACE.  If no such object
-   yet exists then create a new one using the default constructor.  */
+/* Retrieve the remote_per_progspace object for PSPACE.  If no such object
+   yet exists then create a new one using the default constructor and
+   return that.  */
 
-static remote_exec_file_info &
-get_remote_exec_file_info (program_space *pspace)
+static remote_per_progspace &
+get_remote_progspace_info (program_space *pspace)
 {
-  remote_exec_file_info *info = remote_pspace_data.get (pspace);
+  remote_per_progspace *info = remote_pspace_data.get (pspace);
   if (info == nullptr)
-    info = remote_pspace_data.emplace (pspace, "",
-                                      remote_exec_source::DEFAULT_VALUE);
+    info = remote_pspace_data.emplace (pspace);
   gdb_assert (info != nullptr);
   return *info;
 }
@@ -1999,21 +2013,22 @@ remote_target::get_remote_state ()
 static const std::string &
 get_remote_exec_file ()
 {
-  const remote_exec_file_info &info
-    = get_remote_exec_file_info (current_program_space);
-  return info.first;
+  const remote_per_progspace &info
+    = get_remote_progspace_info (current_program_space);
+  return info.exec_info.filename;
 }
 
-/* Set the remote exec file for PSPACE.  */
+/* Set the remote exec file for PSPACE.  FILENAME is the new exec file
+   value, and SOURCE describes where FILENAME came from.  */
 
 static void
 set_pspace_remote_exec_file (struct program_space *pspace,
                             const std::string &filename,
                             remote_exec_source source)
 {
-  remote_exec_file_info &info = get_remote_exec_file_info (pspace);
-  info.first = filename;
-  info.second = source;
+  remote_per_progspace &info = get_remote_progspace_info (pspace);
+  info.exec_info.filename = filename;
+  info.exec_info.source = source;
 }
 
 /* The "set remote exec-file" callback.  */
@@ -2031,19 +2046,19 @@ static void
 show_remote_exec_file (struct ui_file *file, int from_tty,
                       struct cmd_list_element *cmd, const char *value)
 {
-  const remote_exec_file_info &info
-    = get_remote_exec_file_info (current_program_space);
+  const struct remote_per_progspace::exec_info &info
+    = get_remote_progspace_info (current_program_space).exec_info;
 
-  if (info.second == remote_exec_source::DEFAULT_VALUE)
+  if (info.source == remote_exec_source::DEFAULT_VALUE)
     gdb_printf (file, _("The remote exec-file is unset, the default "
                        "remote executable will be used.\n"));
-  else if (info.second == remote_exec_source::UNSET_VALUE)
+  else if (info.source == remote_exec_source::UNSET_VALUE)
     gdb_printf (file, _("The remote exec-file is unset, the remote has "
                        "no default executable set.\n"));
   else
     gdb_printf (file, _("The remote exec-file is \"%ps\".\n"),
                styled_string (file_name_style.style (),
-                              info.first.c_str ()));
+                              info.filename.c_str ()));
 }
 
 static int
@@ -5481,27 +5496,27 @@ remote_target::start_remote_1 (int from_tty, int extended_p)
       current_inferior ()->set_args (exec_and_args.args ());
       if (!exec_and_args.exec ().empty ())
        {
-         remote_exec_file_info &info
-           = get_remote_exec_file_info (current_program_space);
-         if (info.second == remote_exec_source::VALUE_FROM_GDB
-             && info.first != exec_and_args.exec ())
+         struct remote_per_progspace::exec_info &info
+           = get_remote_progspace_info (current_program_space).exec_info;
+         if (info.source == remote_exec_source::VALUE_FROM_GDB
+             && info.filename != exec_and_args.exec ())
            warning (_("updating 'remote exec-file' to '%ps' to match "
                       "remote target"),
                     styled_string (file_name_style.style (),
                                    exec_and_args.exec ().c_str ()));
-         info.first = exec_and_args.exec ();
-         info.second = remote_exec_source::VALUE_FROM_REMOTE;
+         info.filename = exec_and_args.exec ();
+         info.source = remote_exec_source::VALUE_FROM_REMOTE;
        }
     }
   else if (exec_and_args.is_unset ())
     {
-      remote_exec_file_info &info
-       = get_remote_exec_file_info (current_program_space);
-      if (info.second == remote_exec_source::DEFAULT_VALUE
-         || info.second == remote_exec_source::VALUE_FROM_REMOTE)
+      struct remote_per_progspace::exec_info &info
+       = get_remote_progspace_info (current_program_space).exec_info;
+      if (info.source == remote_exec_source::DEFAULT_VALUE
+         || info.source == remote_exec_source::VALUE_FROM_REMOTE)
        {
-         info.first.clear ();
-         info.second = remote_exec_source::UNSET_VALUE;
+         info.filename.clear ();
+         info.source = remote_exec_source::UNSET_VALUE;
        }
     }
 
@@ -6490,12 +6505,12 @@ remote_unpush_target (remote_target *target)
         assumption is that the user is, or will, be debugging the same
         executable again in the future, so clearing an existing value
         would be unhelpful.  */
-      remote_exec_file_info &exec_info
-       = get_remote_exec_file_info (inf->pspace);
-      if (exec_info.second == remote_exec_source::UNSET_VALUE)
+      struct remote_per_progspace::exec_info &exec_info
+       = get_remote_progspace_info (inf->pspace).exec_info;
+      if (exec_info.source == remote_exec_source::UNSET_VALUE)
        {
-         gdb_assert (exec_info.first.empty ());
-         exec_info.second = remote_exec_source::DEFAULT_VALUE;
+         gdb_assert (exec_info.filename.empty ());
+         exec_info.source = remote_exec_source::DEFAULT_VALUE;
        }
 
       inf->pop_all_targets_at_and_above (process_stratum);