Move gdb_argv to gdbsupport
authorTom Tromey <tom@tromey.com>
Wed, 26 Feb 2020 01:14:19 +0000 (18:14 -0700)
committerTom Tromey <tom@tromey.com>
Tue, 18 Jan 2022 17:14:42 +0000 (10:14 -0700)
This moves the gdb_argv class to a new header in gdbsupport.

18 files changed:
gdb/cli/cli-decode.h
gdb/compile/compile.c
gdb/exec.c
gdb/guile/scm-string.c
gdb/inferior.c
gdb/infrun.c
gdb/interps.c
gdb/psymtab.c
gdb/skip.c
gdb/source.c
gdb/stack.c
gdb/symfile.c
gdb/symmisc.c
gdb/tracefile.c
gdb/tracepoint.c
gdb/utils.c
gdb/utils.h
gdbsupport/buildargv.h [new file with mode: 0644]

index 8f367bf46343e1ba278210742a9625a96a12de6a..ed75d3dfc1568769eef0dabaad37de9d11f07a6c 100644 (file)
@@ -27,6 +27,7 @@
 #include "cli-script.h"
 #include "completer.h"
 #include "gdbsupport/intrusive_list.h"
+#include "gdbsupport/buildargv.h"
 
 /* Not a set/show command.  Note that some commands which begin with
    "set" or "show" might be in this category, if their syntax does
index 3b76e102257e250e68b1875364b26f8173f70afb..6794c93d60e7bdd1bc3c4452122867638ad7f9ec 100644 (file)
@@ -44,6 +44,7 @@
 #include "gdbsupport/gdb_unlinker.h"
 #include "gdbsupport/pathstuff.h"
 #include "gdbsupport/scoped_ignore_signal.h"
+#include "gdbsupport/buildargv.h"
 
 \f
 
index f42862b2159c3ed734d06e56ac6df1337cf74057..d9854d50f7869efcc201253b5eb6d1f68d04dcfa 100644 (file)
@@ -49,6 +49,7 @@
 #include <algorithm>
 #include "gdbsupport/pathstuff.h"
 #include "cli/cli-style.h"
+#include "gdbsupport/buildargv.h"
 
 void (*deprecated_file_changed_hook) (const char *);
 
index 184eaaded078bb39759e60e9e6eb39c286de4c8a..bf558922db66455f8e2b411c2fa2e5658fd69d35 100644 (file)
@@ -23,6 +23,7 @@
 #include "defs.h"
 #include "charset.h"
 #include "guile-internal.h"
+#include "gdbsupport/buildargv.h"
 
 /* Convert STRING to an int.
    STRING must be a valid integer.  */
index c7a6ae87cf55c7bd51399cf5071a9db7a3e4051c..bebddb44173cb4280a774d18250f591b19e2bf4d 100644 (file)
@@ -35,6 +35,7 @@
 #include "target-descriptions.h"
 #include "readline/tilde.h"
 #include "progspace-and-thread.h"
+#include "gdbsupport/buildargv.h"
 
 /* Keep a registry of per-inferior data-pointers required by other GDB
    modules.  */
index 2335fc74dc0295301b72268aa17463eacd0c4958..2e7ed15723fded78fb96da567f62ad3620e5db97 100644 (file)
@@ -72,6 +72,7 @@
 #include "scoped-mock-context.h"
 #include "test-target.h"
 #include "gdbsupport/common-debug.h"
+#include "gdbsupport/buildargv.h"
 
 /* Prototypes for local functions */
 
index d65698f0cb4fd1daf48ca8ce1969acabcc12c3f1..a475d8790c9a3731febf0704039ef6b53fc689b0 100644 (file)
@@ -38,6 +38,7 @@
 #include "completer.h"
 #include "top.h"               /* For command_loop.  */
 #include "main.h"
+#include "gdbsupport/buildargv.h"
 
 /* Each UI has its own independent set of interpreters.  */
 
index 7e2da485ba55a35abcc994d689522c9a8d555272..9db8a7aeba2210048b2b4423e919d0e4758b088d 100644 (file)
@@ -36,6 +36,7 @@
 #include "gdbcmd.h"
 #include <algorithm>
 #include <set>
+#include "gdbsupport/buildargv.h"
 
 static struct partial_symbol *lookup_partial_symbol (struct objfile *,
                                                     struct partial_symtab *,
index 2525b8b60db661fd01b2562e9110d5887710b2ae..3308252cb47825906ff9818d66340aa39d579a1a 100644 (file)
@@ -37,6 +37,7 @@
 #include "gdbsupport/gdb_optional.h"
 #include <list>
 #include "cli/cli-style.h"
+#include "gdbsupport/buildargv.h"
 
 /* True if we want to print debug printouts related to file/function
    skipping. */
index 6bf4a4e881e669ebe9eaa8c64dfe7d40b0b79747..ab5cfc5a9d97eabf3790861438b06fc31bf15036 100644 (file)
@@ -50,6 +50,7 @@
 #include "observable.h"
 #include "build-id.h"
 #include "debuginfod-support.h"
+#include "gdbsupport/buildargv.h"
 
 #define OPEN_MODE (O_RDONLY | O_BINARY)
 #define FDOPEN_MODE FOPEN_RB
index 8239c76de20af11311ae9942e16f6d85e92253f5..b81be2962d44ff947be6f6f41271b19ec5a6cfd1 100644 (file)
@@ -55,6 +55,7 @@
 #include "gdbsupport/def-vector.h"
 #include "cli/cli-option.h"
 #include "cli/cli-style.h"
+#include "gdbsupport/buildargv.h"
 
 /* The possible choices of "set print frame-arguments", and the value
    of this setting.  */
index 0449b919974624242b96eebec267f3b0d54e46fa..37ce01bb0e6da332068bbdab10ccf994bae69fb4 100644 (file)
@@ -61,6 +61,7 @@
 #include "gdbsupport/selftest.h"
 #include "cli/cli-style.h"
 #include "gdbsupport/forward-scope-exit.h"
+#include "gdbsupport/buildargv.h"
 
 #include <sys/types.h>
 #include <fcntl.h>
index ca803fc53426f12e1465db72e0e7253b7c8e9040..4cbe338cb842a58bbcde802c0a59af5127ba2ace 100644 (file)
@@ -38,6 +38,7 @@
 #include "source.h"
 #include "readline/tilde.h"
 #include <cli/cli-style.h>
+#include "gdbsupport/buildargv.h"
 
 /* Prototypes for local functions */
 
index 50510af9805c651f0f51cae34e4b75d53e47dab5..f7d9331e5b7f60d710bb64f9493481084fc6c587 100644 (file)
@@ -24,6 +24,7 @@
 #include "regcache.h"
 #include "gdbsupport/byte-vector.h"
 #include "gdbarch.h"
+#include "gdbsupport/buildargv.h"
 
 /* Helper macros.  */
 
index dc5e7f141cf73178ad46900bfdf71916ba0dc0a6..33f5c7f59fe15d9c1baaf9223f3a14ac02b8b58f 100644 (file)
@@ -58,6 +58,7 @@
 #include <algorithm>
 #include "cli/cli-style.h"
 #include "expop.h"
+#include "gdbsupport/buildargv.h"
 
 #include <unistd.h>
 
index 3ee2b5444df45b82601a929892bc48fa614f6840..da60c1e4144493aa51996f34479594a15bc11b8c 100644 (file)
@@ -76,6 +76,7 @@
 #include "cli-out.h"
 #include "gdbsupport/gdb-safe-ctype.h"
 #include "bt-utils.h"
+#include "gdbsupport/buildargv.h"
 
 void (*deprecated_error_begin_hook) (void);
 
@@ -2890,17 +2891,6 @@ ldirname (const char *filename)
   return dirname;
 }
 
-/* See utils.h.  */
-
-void
-gdb_argv::reset (const char *s)
-{
-  char **argv = buildargv (s);
-
-  freeargv (m_argv);
-  m_argv = argv;
-}
-
 /* Return ARGS parsed as a valid pid, or throw an error.  */
 
 int
index ac30fd5f1145b3aa4471677b5af1b4483ab45819..5ac34eb41a922ecdbe9e38a804b7c0011b97cb1b 100644 (file)
@@ -120,180 +120,6 @@ extern int parse_pid_to_attach (const char *args);
 
 extern int parse_escape (struct gdbarch *, const char **);
 
-/* A wrapper for an array of char* that was allocated in the way that
-   'buildargv' does, and should be freed with 'freeargv'.  */
-
-class gdb_argv
-{
-public:
-
-  /* A constructor that initializes to NULL.  */
-
-  gdb_argv ()
-    : m_argv (NULL)
-  {
-  }
-
-  /* A constructor that calls buildargv on STR.  STR may be NULL, in
-     which case this object is initialized with a NULL array.  */
-
-  explicit gdb_argv (const char *str)
-    : m_argv (NULL)
-  {
-    reset (str);
-  }
-
-  /* A constructor that takes ownership of an existing array.  */
-
-  explicit gdb_argv (char **array)
-    : m_argv (array)
-  {
-  }
-
-  gdb_argv (const gdb_argv &) = delete;
-  gdb_argv &operator= (const gdb_argv &) = delete;
-
-  gdb_argv &operator= (gdb_argv &&other)
-  {
-    freeargv (m_argv);
-    m_argv = other.m_argv;
-    other.m_argv = nullptr;
-    return *this;
-  }
-
-  gdb_argv (gdb_argv &&other)
-  {
-    m_argv = other.m_argv;
-    other.m_argv = nullptr;
-  }
-
-  ~gdb_argv ()
-  {
-    freeargv (m_argv);
-  }
-
-  /* Call buildargv on STR, storing the result in this object.  Any
-     previous state is freed.  STR may be NULL, in which case this
-     object is reset with a NULL array.  If buildargv fails due to
-     out-of-memory, call malloc_failure.  Therefore, the value is
-     guaranteed to be non-NULL, unless the parameter itself is
-     NULL.  */
-
-  void reset (const char *str);
-
-  /* Return the underlying array.  */
-
-  char **get ()
-  {
-    return m_argv;
-  }
-
-  const char * const * get () const
-  {
-    return m_argv;
-  }
-
-  /* Return the underlying array, transferring ownership to the
-     caller.  */
-
-  ATTRIBUTE_UNUSED_RESULT char **release ()
-  {
-    char **result = m_argv;
-    m_argv = NULL;
-    return result;
-  }
-
-  /* Return the number of items in the array.  */
-
-  int count () const
-  {
-    return countargv (m_argv);
-  }
-
-  /* Index into the array.  */
-
-  char *operator[] (int arg)
-  {
-    gdb_assert (m_argv != NULL);
-    return m_argv[arg];
-  }
-
-  /* Return the arguments array as an array view.  */
-
-  gdb::array_view<char *> as_array_view ()
-  {
-    return gdb::array_view<char *> (this->get (), this->count ());
-  }
-
-  gdb::array_view<const char * const> as_array_view () const
-  {
-    return gdb::array_view<const char * const> (this->get (), this->count ());
-  }
-
-  /* Append arguments to this array.  */
-  void append (gdb_argv &&other)
-  {
-    int size = count ();
-    int argc = other.count ();
-    m_argv = XRESIZEVEC (char *, m_argv, (size + argc + 1));
-
-    for (int argi = 0; argi < argc; argi++)
-      {
-       /* Transfer ownership of the string.  */
-       m_argv[size++] = other.m_argv[argi];
-       /* Ensure that destruction of OTHER works correctly.  */
-       other.m_argv[argi] = nullptr;
-      }
-    m_argv[size] = nullptr;
-  }
-
-  /* Append arguments to this array.  */
-  void append (const gdb_argv &other)
-  {
-    int size = count ();
-    int argc = other.count ();
-    m_argv = XRESIZEVEC (char *, m_argv, (size + argc + 1));
-
-    for (int argi = 0; argi < argc; argi++)
-      m_argv[size++] = xstrdup (other.m_argv[argi]);
-    m_argv[size] = nullptr;
-  }
-
-  /* The iterator type.  */
-
-  typedef char **iterator;
-
-  /* Return an iterator pointing to the start of the array.  */
-
-  iterator begin ()
-  {
-    return m_argv;
-  }
-
-  /* Return an iterator pointing to the end of the array.  */
-
-  iterator end ()
-  {
-    return m_argv + count ();
-  }
-
-  bool operator!= (std::nullptr_t)
-  {
-    return m_argv != NULL;
-  }
-
-  bool operator== (std::nullptr_t)
-  {
-    return m_argv == NULL;
-  }
-
-private:
-
-  /* The wrapped array.  */
-
-  char **m_argv;
-};
-
 \f
 /* Cleanup utilities.  */
 
diff --git a/gdbsupport/buildargv.h b/gdbsupport/buildargv.h
new file mode 100644 (file)
index 0000000..7a34d9b
--- /dev/null
@@ -0,0 +1,204 @@
+/* RAII wrapper for buildargv
+
+   Copyright (C) 2021 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/>.  */
+
+#ifndef GDBSUPPORT_BUILDARGV_H
+#define GDBSUPPORT_BUILDARGV_H
+
+#include "libiberty.h"
+
+/* A wrapper for an array of char* that was allocated in the way that
+   'buildargv' does, and should be freed with 'freeargv'.  */
+
+class gdb_argv
+{
+public:
+
+  /* A constructor that initializes to NULL.  */
+
+  gdb_argv ()
+    : m_argv (NULL)
+  {
+  }
+
+  /* A constructor that calls buildargv on STR.  STR may be NULL, in
+     which case this object is initialized with a NULL array.  */
+
+  explicit gdb_argv (const char *str)
+    : m_argv (NULL)
+  {
+    reset (str);
+  }
+
+  /* A constructor that takes ownership of an existing array.  */
+
+  explicit gdb_argv (char **array)
+    : m_argv (array)
+  {
+  }
+
+  gdb_argv (const gdb_argv &) = delete;
+  gdb_argv &operator= (const gdb_argv &) = delete;
+
+  gdb_argv &operator= (gdb_argv &&other)
+  {
+    freeargv (m_argv);
+    m_argv = other.m_argv;
+    other.m_argv = nullptr;
+    return *this;
+  }
+
+  gdb_argv (gdb_argv &&other)
+  {
+    m_argv = other.m_argv;
+    other.m_argv = nullptr;
+  }
+
+  ~gdb_argv ()
+  {
+    freeargv (m_argv);
+  }
+
+  /* Call buildargv on STR, storing the result in this object.  Any
+     previous state is freed.  STR may be NULL, in which case this
+     object is reset with a NULL array.  If buildargv fails due to
+     out-of-memory, call malloc_failure.  Therefore, the value is
+     guaranteed to be non-NULL, unless the parameter itself is
+     NULL.  */
+
+  void reset (const char *str)
+  {
+    char **argv = buildargv (str);
+    freeargv (m_argv);
+    m_argv = argv;
+  }
+
+  /* Return the underlying array.  */
+
+  char **get ()
+  {
+    return m_argv;
+  }
+
+  const char * const * get () const
+  {
+    return m_argv;
+  }
+
+  /* Return the underlying array, transferring ownership to the
+     caller.  */
+
+  ATTRIBUTE_UNUSED_RESULT char **release ()
+  {
+    char **result = m_argv;
+    m_argv = NULL;
+    return result;
+  }
+
+  /* Return the number of items in the array.  */
+
+  int count () const
+  {
+    return countargv (m_argv);
+  }
+
+  /* Index into the array.  */
+
+  char *operator[] (int arg)
+  {
+    gdb_assert (m_argv != NULL);
+    return m_argv[arg];
+  }
+
+  /* Return the arguments array as an array view.  */
+
+  gdb::array_view<char *> as_array_view ()
+  {
+    return gdb::array_view<char *> (this->get (), this->count ());
+  }
+
+  gdb::array_view<const char * const> as_array_view () const
+  {
+    return gdb::array_view<const char * const> (this->get (), this->count ());
+  }
+
+  /* Append arguments to this array.  */
+  void append (gdb_argv &&other)
+  {
+    int size = count ();
+    int argc = other.count ();
+    m_argv = XRESIZEVEC (char *, m_argv, (size + argc + 1));
+
+    for (int argi = 0; argi < argc; argi++)
+      {
+       /* Transfer ownership of the string.  */
+       m_argv[size++] = other.m_argv[argi];
+       /* Ensure that destruction of OTHER works correctly.  */
+       other.m_argv[argi] = nullptr;
+      }
+    m_argv[size] = nullptr;
+  }
+
+  /* Append arguments to this array.  */
+  void append (const gdb_argv &other)
+  {
+    int size = count ();
+    int argc = other.count ();
+    m_argv = XRESIZEVEC (char *, m_argv, (size + argc + 1));
+
+    for (int argi = 0; argi < argc; argi++)
+      m_argv[size++] = xstrdup (other.m_argv[argi]);
+    m_argv[size] = nullptr;
+  }
+
+  /* The iterator type.  */
+
+  typedef char **iterator;
+
+  /* Return an iterator pointing to the start of the array.  */
+
+  iterator begin ()
+  {
+    return m_argv;
+  }
+
+  /* Return an iterator pointing to the end of the array.  */
+
+  iterator end ()
+  {
+    return m_argv + count ();
+  }
+
+  bool operator!= (std::nullptr_t)
+  {
+    return m_argv != NULL;
+  }
+
+  bool operator== (std::nullptr_t)
+  {
+    return m_argv == NULL;
+  }
+
+private:
+
+  /* The wrapped array.  */
+
+  char **m_argv;
+};
+
+#endif /* GDBSUPPORT_BUILDARGV_H */