gdb: move remote arg splitting and joining into gdbsupport/

This is a refactoring commit.  When passing inferior arguments to
gdbserver we have two actions that need to be performed, splitting and
joining.

On the GDB side, we take the inferior arguments, a single string, and
split the string into a list of individual arguments.  These are then
sent to gdbserver over the remote protocol.

On the gdbserver side we receive the list of individual arguments and
join these back together into a single inferior argument string.

In the next commit I plan to add some unit testing for this remote
argument passing process.  Ideally, for unit testing, we need the code
being tested to be located in some easily callable function, rather
than being inline at the site of use.

So in this commit I propose to move the splitting and joining logic
out into a separate file, we can then use this within GDB and
gdbserver when passing arguments between GDB and gdbserver, but we can
also call the same functions for some unit testing.

In this commit I'm not adding the unit tests, they will be added next,
so for now there should be no user visible changes after this commit.

Tested-By: Guinevere Larsen <guinevere@redhat.com>
This commit is contained in:
Andrew Burgess
2023-11-09 14:47:34 +00:00
parent 3602da6fa2
commit bd036f034b
6 changed files with 115 additions and 13 deletions

View File

@@ -80,6 +80,7 @@ libgdbsupport_a_SOURCES = \
pathstuff.cc \
print-utils.cc \
ptid.cc \
remote-args.cc \
rsp-low.cc \
run-time-clock.cc \
safe-strerror.cc \

View File

@@ -163,12 +163,12 @@ am_libgdbsupport_a_OBJECTS = agent.$(OBJEXT) btrace-common.$(OBJEXT) \
gdb_tilde_expand.$(OBJEXT) gdb_wait.$(OBJEXT) \
gdb_vecs.$(OBJEXT) job-control.$(OBJEXT) netstuff.$(OBJEXT) \
new-op.$(OBJEXT) osabi.$(OBJEXT) pathstuff.$(OBJEXT) \
print-utils.$(OBJEXT) ptid.$(OBJEXT) rsp-low.$(OBJEXT) \
run-time-clock.$(OBJEXT) safe-strerror.$(OBJEXT) \
scoped_mmap.$(OBJEXT) search.$(OBJEXT) signals.$(OBJEXT) \
signals-state-save-restore.$(OBJEXT) task-group.$(OBJEXT) \
tdesc.$(OBJEXT) thread-pool.$(OBJEXT) xml-utils.$(OBJEXT) \
$(am__objects_1) $(am__objects_2)
print-utils.$(OBJEXT) ptid.$(OBJEXT) remote-args.$(OBJEXT) \
rsp-low.$(OBJEXT) run-time-clock.$(OBJEXT) \
safe-strerror.$(OBJEXT) scoped_mmap.$(OBJEXT) search.$(OBJEXT) \
signals.$(OBJEXT) signals-state-save-restore.$(OBJEXT) \
task-group.$(OBJEXT) tdesc.$(OBJEXT) thread-pool.$(OBJEXT) \
xml-utils.$(OBJEXT) $(am__objects_1) $(am__objects_2)
libgdbsupport_a_OBJECTS = $(am_libgdbsupport_a_OBJECTS)
AM_V_P = $(am__v_P_@AM_V@)
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
@@ -438,6 +438,7 @@ libgdbsupport_a_SOURCES = \
pathstuff.cc \
print-utils.cc \
ptid.cc \
remote-args.cc \
rsp-low.cc \
run-time-clock.cc \
safe-strerror.cc \
@@ -548,6 +549,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pathstuff.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print-utils.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ptid.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/remote-args.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rsp-low.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run-time-clock.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/safe-strerror.Po@am__quote@

43
gdbsupport/remote-args.cc Normal file
View File

@@ -0,0 +1,43 @@
/* Copyright (C) 2023-2025 Free Software Foundation, Inc.
This file is part of GDB.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include "gdbsupport/common-defs.h"
#include "gdbsupport/remote-args.h"
#include "gdbsupport/common-inferior.h"
#include "gdbsupport/buildargv.h"
/* See remote-args.h. */
std::vector<std::string>
gdb::remote_args::split (const std::string &args)
{
std::vector<std::string> results;
gdb_argv argv (args.c_str ());
for (int i = 0; argv[i] != nullptr; i++)
results.emplace_back (argv[i]);
return results;
}
/* See remote-args.h. */
std::string
gdb::remote_args::join (const std::vector<char *> &args)
{
return construct_inferior_arguments (args, true);
}

55
gdbsupport/remote-args.h Normal file
View File

@@ -0,0 +1,55 @@
/* Functions to help when passing arguments between GDB and gdbserver.
Copyright (C) 2023-2025 Free Software Foundation, Inc.
This file is part of GDB.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
/* The functions declared here are used when passing inferior arguments
from GDB to gdbserver.
The remote protocol requires that arguments are passed as a vector of
separate argument while GDB stores the arguments as a single string, and
gdbserver also requires the arguments be a single string.
These functions then provide a mechanism to split up an argument string
and recombine it within gdbserver while preserving escaping of special
characters within the argument string. */
namespace gdb
{
namespace remote_args
{
/* ARGS is an inferior argument string. This function splits ARGS into
individual arguments and returns a vector containing each argument. */
extern std::vector<std::string> split (const std::string &args);
/* Join together the separate arguments in ARGS and build a single
inferior argument string. The string returned by this function will be
equivalent, but not necessarily identical to the string passed to
::split, for example passing the string '"a b"' (without the single
quotes, but including the double quotes) to ::split, will return an
argument of 'a b' (without the single quotes). When this argument is
passed through ::join we will get back the string 'a\ b' (without the
single quotes), that is, we choose to escape the white space, rather
than wrap the argument in quotes. */
extern std::string join (const std::vector<char *> &args);
} /* namespace remote_args */
} /* namespac gdb */