From 20a08d98518c0587810eb9e24aa22e7c6d56fd17 Mon Sep 17 00:00:00 2001 From: Andrew Burgess Date: Sat, 11 Oct 2025 14:03:39 +0100 Subject: [PATCH] gdb/remote: replace use of std::pair with an actual struct 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 --- gdb/remote.c | 107 +++++++++++++++++++++++++++++---------------------- 1 file changed, 61 insertions(+), 46 deletions(-) diff --git a/gdb/remote.c b/gdb/remote.c index 2e706e2d45b..858076bfa42 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -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; +/* 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::key +static const registry::key 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); -- 2.47.3