diff options
Diffstat (limited to 'gdb')
130 files changed, 135 insertions, 15301 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 85d7de2..16b730e 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,25 @@ 2020-01-14 Tom Tromey <tom@tromey.com> + * nat/x86-linux-dregs.c: Include configh.h. + * nat/linux-ptrace.c: Include configh.h. + * nat/linux-btrace.c: Include configh.h. + * defs.h: Include config.h, bfd.h. + * configure.ac: Don't source common.host. + (CONFIG_OBS, CONFIG_SRCS): Remove gdbsupport files. + * configure: Rebuild. + * acinclude.m4: Update path. + * Makefile.in (SUPPORT, LIBSUPPORT, INCSUPPORT): New variables. + (CONFIG_SRC_SUBDIR): Remove gdbsupport. + (INTERNAL_CFLAGS_BASE): Add INCSUPPORT. + (CLIBS): Add LIBSUPPORT. + (CDEPS): Likewise. + (COMMON_SFILES): Remove gdbsupport files. + (HFILES_NO_SRCDIR): Likewise. + (stamp-version): Update path to create-version.sh. + (ALLDEPFILES): Remove gdbsupport files. + +2020-01-14 Tom Tromey <tom@tromey.com> + * gdbsupport/common.m4 (GDB_AC_COMMON): Define WIN32APILIBS and USE_WIN32API when needed. * configure.ac (USE_WIN32API): Don't define. diff --git a/gdb/Makefile.in b/gdb/Makefile.in index 6df0f46..5f63c61 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -238,6 +238,10 @@ GNULIB_BUILDDIR = ../gnulib LIBGNU = $(GNULIB_BUILDDIR)/import/libgnu.a INCGNU = -I$(srcdir)/../gnulib/import -I$(GNULIB_BUILDDIR)/import +SUPPORT = ../gdbsupport +LIBSUPPORT = $(SUPPORT)/libgdbsupport.a +INCSUPPORT = -I$(srcdir)/.. -I.. + # # CLI sub directory definitons # @@ -547,7 +551,7 @@ CONFIG_INSTALL = @CONFIG_INSTALL@ CONFIG_UNINSTALL = @CONFIG_UNINSTALL@ HAVE_NATIVE_GCORE_TARGET = @HAVE_NATIVE_GCORE_TARGET@ -CONFIG_SRC_SUBDIR = arch cli mi gdbsupport compile tui unittests guile python \ +CONFIG_SRC_SUBDIR = arch cli mi compile tui unittests guile python \ target nat CONFIG_DEP_SUBDIR = $(addsuffix /$(DEPDIR),$(CONFIG_SRC_SUBDIR)) @@ -586,8 +590,8 @@ INTERNAL_CFLAGS_BASE = \ $(CXXFLAGS) $(GLOBAL_CFLAGS) $(PROFILE_CFLAGS) \ $(GDB_CFLAGS) $(OPCODES_CFLAGS) $(READLINE_CFLAGS) $(ZLIBINC) \ $(BFD_CFLAGS) $(INCLUDE_CFLAGS) $(LIBDECNUMBER_CFLAGS) \ - $(INTL_CFLAGS) $(INCGNU) $(ENABLE_CFLAGS) $(INTERNAL_CPPFLAGS) \ - $(SRCHIGH_CFLAGS) $(TOP_CFLAGS) $(PTHREAD_CFLAGS) + $(INTL_CFLAGS) $(INCGNU) $(INCSUPPORT) $(ENABLE_CFLAGS) \ + $(INTERNAL_CPPFLAGS) $(SRCHIGH_CFLAGS) $(TOP_CFLAGS) $(PTHREAD_CFLAGS) INTERNAL_WARN_CFLAGS = $(INTERNAL_CFLAGS_BASE) $(GDB_WARN_CFLAGS) INTERNAL_CFLAGS = $(INTERNAL_WARN_CFLAGS) $(GDB_WERROR_CFLAGS) @@ -607,14 +611,15 @@ INTERNAL_LDFLAGS = \ # XM_CLIBS, defined in *config files, have host-dependent libs. # LIBIBERTY appears twice on purpose. CLIBS = $(SIM) $(READLINE) $(OPCODES) $(BFD) $(LIBCTF) $(ZLIB) \ - $(INTL) $(LIBIBERTY) $(LIBDECNUMBER) \ + $(LIBSUPPORT) $(INTL) $(LIBIBERTY) $(LIBDECNUMBER) \ $(XM_CLIBS) $(GDBTKLIBS) \ @LIBS@ @GUILE_LIBS@ @PYTHON_LIBS@ \ $(LIBEXPAT) $(LIBLZMA) $(LIBBABELTRACE) $(LIBIPT) \ - $(LIBIBERTY) $(WIN32LIBS) $(LIBGNU) $(LIBICONV) $(LIBMPFR) \ - $(SRCHIGH_LIBS) $(LIBXXHASH) $(PTHREAD_LIBS) + $(LIBIBERTY) $(WIN32LIBS) $(LIBGNU) $(LIBICONV) \ + $(LIBMPFR) $(SRCHIGH_LIBS) $(LIBXXHASH) $(PTHREAD_LIBS) CDEPS = $(NAT_CDEPS) $(SIM) $(BFD) $(READLINE_DEPS) $(LIBCTF) \ - $(OPCODES) $(INTL_DEPS) $(LIBIBERTY) $(CONFIG_DEPS) $(LIBGNU) + $(OPCODES) $(INTL_DEPS) $(LIBIBERTY) $(CONFIG_DEPS) $(LIBGNU) \ + $(LIBSUPPORT) DIST = gdb @@ -968,39 +973,6 @@ COMMON_SFILES = \ cli-out.c \ coff-pe-read.c \ coffread.c \ - gdbsupport/agent.c \ - gdbsupport/btrace-common.c \ - gdbsupport/buffer.c \ - gdbsupport/cleanups.c \ - gdbsupport/common-debug.c \ - gdbsupport/common-exceptions.c \ - gdbsupport/common-inferior.c \ - gdbsupport/common-regcache.c \ - gdbsupport/common-utils.c \ - gdbsupport/errors.c \ - gdbsupport/environ.c \ - gdbsupport/fileio.c \ - gdbsupport/filestuff.c \ - gdbsupport/format.c \ - gdbsupport/job-control.c \ - gdbsupport/gdb-dlfcn.c \ - gdbsupport/gdb_tilde_expand.c \ - gdbsupport/gdb_vecs.c \ - gdbsupport/gdb_wait.c \ - gdbsupport/netstuff.c \ - gdbsupport/new-op.c \ - gdbsupport/pathstuff.c \ - gdbsupport/print-utils.c \ - gdbsupport/ptid.c \ - gdbsupport/rsp-low.c \ - gdbsupport/run-time-clock.c \ - gdbsupport/safe-strerror.c \ - gdbsupport/scoped_mmap.c \ - gdbsupport/signals.c \ - gdbsupport/signals-state-save-restore.c \ - gdbsupport/tdesc.c \ - gdbsupport/thread-pool.c \ - gdbsupport/xml-utils.c \ complaints.c \ completer.c \ continuations.c \ @@ -1468,49 +1440,6 @@ HFILES_NO_SRCDIR = \ cli/cli-setshow.h \ cli/cli-style.h \ cli/cli-utils.h \ - gdbsupport/buffer.h \ - gdbsupport/cleanups.h \ - gdbsupport/common-debug.h \ - gdbsupport/common-defs.h \ - gdbsupport/common-exceptions.h \ - gdbsupport/common-gdbthread.h \ - gdbsupport/common-regcache.h \ - gdbsupport/common-types.h \ - gdbsupport/common-utils.h \ - gdbsupport/job-control.h \ - gdbsupport/errors.h \ - gdbsupport/environ.h \ - gdbsupport/fileio.h \ - gdbsupport/format.h \ - gdbsupport/gdb-dlfcn.h \ - gdbsupport/gdb-sigmask.h \ - gdbsupport/gdb_assert.h \ - gdbsupport/gdb_binary_search.h \ - gdbsupport/gdb_tilde_expand.h \ - gdbsupport/gdb_locale.h \ - gdbsupport/gdb_proc_service.h \ - gdbsupport/gdb_setjmp.h \ - gdbsupport/gdb_signals.h \ - gdbsupport/gdb_sys_time.h \ - gdbsupport/gdb_vecs.h \ - gdbsupport/gdb_wait.h \ - gdbsupport/common-inferior.h \ - gdbsupport/netstuff.h \ - gdbsupport/host-defs.h \ - gdbsupport/parallel-for.h \ - gdbsupport/pathstuff.h \ - gdbsupport/print-utils.h \ - gdbsupport/ptid.h \ - gdbsupport/queue.h \ - gdbsupport/rsp-low.h \ - gdbsupport/run-time-clock.h \ - gdbsupport/signals-state-save-restore.h \ - gdbsupport/symbol.h \ - gdbsupport/tdesc.h \ - gdbsupport/thread-pool.h \ - gdbsupport/version.h \ - gdbsupport/x86-xstate.h \ - gdbsupport/xml-utils.h \ compile/compile.h \ compile/compile-c.h \ compile/compile-cplus.h \ @@ -2131,8 +2060,8 @@ $(srcdir)/copying.c: @MAINTAINER_MODE_TRUE@ $(srcdir)/../COPYING3 $(srcdir)/copy version.c: stamp-version; @true # Note that the obvious names for the temp file are taken by # create-version.sh. -stamp-version: Makefile version.in $(srcdir)/../bfd/version.h $(srcdir)/gdbsupport/create-version.sh - $(ECHO_GEN) $(SHELL) $(srcdir)/gdbsupport/create-version.sh $(srcdir) \ +stamp-version: Makefile version.in $(srcdir)/../bfd/version.h $(srcdir)/../gdbsupport/create-version.sh + $(ECHO_GEN) $(SHELL) $(srcdir)/../gdbsupport/create-version.sh $(srcdir) \ $(host_alias) $(target_alias) version-t.t @$(SHELL) $(srcdir)/../move-if-change version-t.t version.c @echo stamp > stamp-version diff --git a/gdb/acinclude.m4 b/gdb/acinclude.m4 index 11cc0bc..d60b2fe 100644 --- a/gdb/acinclude.m4 +++ b/gdb/acinclude.m4 @@ -63,7 +63,7 @@ m4_include([../config/iconv.m4]) m4_include([../config/zlib.m4]) -m4_include([gdbsupport/common.m4]) +m4_include([../gdbsupport/common.m4]) dnl For libiberty_INIT. m4_include(libiberty.m4) diff --git a/gdb/configure b/gdb/configure index fe2d887..2b613c3 100755 --- a/gdb/configure +++ b/gdb/configure @@ -18984,8 +18984,8 @@ if $enable_unittests; then $as_echo "#define GDB_SELF_TEST 1" >>confdefs.h - CONFIG_OBS="$CONFIG_OBS \$(SUBDIR_UNITTESTS_OBS) gdbsupport/selftest.o selftest-arch.o" - CONFIG_SRCS="$CONFIG_SRCS \$(SUBDIR_UNITTESTS_SRCS) gdbsupport/selftest.c selftest-arch.c" + CONFIG_OBS="$CONFIG_OBS \$(SUBDIR_UNITTESTS_OBS) selftest-arch.o" + CONFIG_SRCS="$CONFIG_SRCS \$(SUBDIR_UNITTESTS_SRCS) selftest-arch.c" fi diff --git a/gdb/configure.ac b/gdb/configure.ac index a7b744b..ddb9530 100644 --- a/gdb/configure.ac +++ b/gdb/configure.ac @@ -2215,8 +2215,8 @@ AC_DEFINE(GDB_DEFAULT_HOST_CHARSET, "UTF-8", [Define to be a string naming the default host character set.]) GDB_AC_SELFTEST([ - CONFIG_OBS="$CONFIG_OBS \$(SUBDIR_UNITTESTS_OBS) gdbsupport/selftest.o selftest-arch.o" - CONFIG_SRCS="$CONFIG_SRCS \$(SUBDIR_UNITTESTS_SRCS) gdbsupport/selftest.c selftest-arch.c" + CONFIG_OBS="$CONFIG_OBS \$(SUBDIR_UNITTESTS_OBS) selftest-arch.o" + CONFIG_SRCS="$CONFIG_SRCS \$(SUBDIR_UNITTESTS_SRCS) selftest-arch.c" ]) GDB_AC_TRANSFORM([gdb], [GDB_TRANSFORM_NAME]) @@ -27,6 +27,15 @@ #include "gdbsupport/common-defs.h" +#undef PACKAGE +#undef PACKAGE_NAME +#undef PACKAGE_VERSION +#undef PACKAGE_STRING +#undef PACKAGE_TARNAME + +#include <config.h> +#include "bfd.h" + #include <sys/types.h> #include <limits.h> diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 6d9e314..f3f2643 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,5 +1,18 @@ 2020-01-14 Tom Tromey <tom@tromey.com> + * server.h: Include config.h. + * gdbreplay.c: Include config.h. + * configure: Rebuild. + * configure.ac: Don't source common.host. + * acinclude.m4: Update path. + * Makefile.in (INCSUPPORT): New variable. + (INCLUDE_CFLAGS): Add INCSUPPORT. + (SFILES): Update paths. + (version-generated.c): Update path to create-version.sh. + (gdbsupport/%-ipa.o, gdbsupport/%.o): Update paths. + +2020-01-14 Tom Tromey <tom@tromey.com> + * configure.ac (LIBS): Use WIN32APILIBS. (USE_WIN32API): Don't define. * configure: Rebuild. diff --git a/gdb/gdbserver/Makefile.in b/gdb/gdbserver/Makefile.in index d1af55b..38f30a0 100644 --- a/gdb/gdbserver/Makefile.in +++ b/gdb/gdbserver/Makefile.in @@ -109,6 +109,8 @@ INCGNU = -I$(srcdir)/../../gnulib/import -I$(GNULIB_BUILDDIR)/import # so that they are generated before other files are compiled. GNULIB_H = $(GNULIB_BUILDDIR)/import/string.h @GNULIB_STDINT_H@ +INCSUPPORT = -I$(srcdir)/../.. -I../.. + # All the includes used for CFLAGS and for lint. # -I. for config files. # -I${srcdir} for our headers. @@ -120,7 +122,7 @@ GNULIB_H = $(GNULIB_BUILDDIR)/import/string.h @GNULIB_STDINT_H@ # INCLUDE_CFLAGS = -I. -I${srcdir} \ -I$(srcdir)/../regformats -I$(srcdir)/.. -I$(INCLUDE_DIR) \ - $(INCGNU) + $(INCGNU) $(INCSUPPORT) # M{H,T}_CFLAGS, if defined, has host- and target-dependent CFLAGS # from the config/ directory. @@ -201,32 +203,32 @@ SFILES = \ $(srcdir)/arch/arm-linux.c \ $(srcdir)/arch/ppc-linux-common.c \ $(srcdir)/../alloc.c \ - $(srcdir)/gdbsupport/btrace-common.c \ - $(srcdir)/gdbsupport/buffer.c \ - $(srcdir)/gdbsupport/cleanups.c \ - $(srcdir)/gdbsupport/common-debug.c \ - $(srcdir)/gdbsupport/common-exceptions.c \ - $(srcdir)/gdbsupport/common-inferior.c \ - $(srcdir)/gdbsupport/common-regcache.c \ - $(srcdir)/gdbsupport/common-utils.c \ - $(srcdir)/gdbsupport/errors.c \ - $(srcdir)/gdbsupport/environ.c \ - $(srcdir)/gdbsupport/fileio.c \ - $(srcdir)/gdbsupport/filestuff.c \ - $(srcdir)/gdbsupport/job-control.c \ - $(srcdir)/gdbsupport/gdb-dlfcn.c \ - $(srcdir)/gdbsupport/gdb_tilde_expand.c \ - $(srcdir)/gdbsupport/gdb_vecs.c \ - $(srcdir)/gdbsupport/gdb_wait.c \ - $(srcdir)/gdbsupport/netstuff.c \ - $(srcdir)/gdbsupport/new-op.c \ - $(srcdir)/gdbsupport/pathstuff.c \ - $(srcdir)/gdbsupport/print-utils.c \ - $(srcdir)/gdbsupport/ptid.c \ - $(srcdir)/gdbsupport/rsp-low.c \ - $(srcdir)/gdbsupport/safe-strerror.c \ - $(srcdir)/gdbsupport/tdesc.c \ - $(srcdir)/gdbsupport/xml-utils.c \ + $(srcdir)/../../gdbsupport/btrace-common.c \ + $(srcdir)/../../gdbsupport/buffer.c \ + $(srcdir)/../../gdbsupport/cleanups.c \ + $(srcdir)/../../gdbsupport/common-debug.c \ + $(srcdir)/../../gdbsupport/common-exceptions.c \ + $(srcdir)/../../gdbsupport/common-inferior.c \ + $(srcdir)/../../gdbsupport/common-regcache.c \ + $(srcdir)/../../gdbsupport/common-utils.c \ + $(srcdir)/../../gdbsupport/errors.c \ + $(srcdir)/../../gdbsupport/environ.c \ + $(srcdir)/../../gdbsupport/fileio.c \ + $(srcdir)/../../gdbsupport/filestuff.c \ + $(srcdir)/../../gdbsupport/job-control.c \ + $(srcdir)/../../gdbsupport/gdb-dlfcn.c \ + $(srcdir)/../../gdbsupport/gdb_tilde_expand.c \ + $(srcdir)/../../gdbsupport/gdb_vecs.c \ + $(srcdir)/../../gdbsupport/gdb_wait.c \ + $(srcdir)/../../gdbsupport/netstuff.c \ + $(srcdir)/../../gdbsupport/new-op.c \ + $(srcdir)/../../gdbsupport/pathstuff.c \ + $(srcdir)/../../gdbsupport/print-utils.c \ + $(srcdir)/../../gdbsupport/ptid.c \ + $(srcdir)/../../gdbsupport/rsp-low.c \ + $(srcdir)/../../gdbsupport/safe-strerror.c \ + $(srcdir)/../../gdbsupport/tdesc.c \ + $(srcdir)/../../gdbsupport/xml-utils.c \ $(srcdir)/nat/aarch64-sve-linux-ptrace.c \ $(srcdir)/nat/linux-btrace.c \ $(srcdir)/nat/linux-namespaces.c \ @@ -529,8 +531,8 @@ am--refresh: force: -version-generated.c: Makefile $(srcdir)/../version.in $(srcdir)/../../bfd/version.h $(srcdir)/../gdbsupport/create-version.sh - $(ECHO_GEN) $(SHELL) $(srcdir)/../gdbsupport/create-version.sh $(srcdir)/.. \ +version-generated.c: Makefile $(srcdir)/../version.in $(srcdir)/../../bfd/version.h $(srcdir)/../../gdbsupport/create-version.sh + $(ECHO_GEN) $(SHELL) $(srcdir)/../../gdbsupport/create-version.sh $(srcdir)/.. \ $(host_alias) $(target_alias) $@ xml-builtin-generated.c: stamp-xml; @true @@ -588,7 +590,7 @@ arch/%-ipa.o: ../arch/%.c $(IPAGENT_COMPILE) $< $(POSTCOMPILE) -gdbsupport/%-ipa.o: ../gdbsupport/%.c +gdbsupport/%-ipa.o: ../../gdbsupport/%.c $(IPAGENT_COMPILE) $< $(POSTCOMPILE) @@ -621,7 +623,7 @@ arch/%.o: ../arch/%.c $(COMPILE) $< $(POSTCOMPILE) -gdbsupport/%.o: ../gdbsupport/%.c +gdbsupport/%.o: ../../gdbsupport/%.c $(COMPILE) $< $(POSTCOMPILE) diff --git a/gdb/gdbserver/acinclude.m4 b/gdb/gdbserver/acinclude.m4 index 4c18e9b..a42f2d5 100644 --- a/gdb/gdbserver/acinclude.m4 +++ b/gdb/gdbserver/acinclude.m4 @@ -18,7 +18,7 @@ m4_include(../../config/lead-dot.m4) dnl codeset.m4 is needed for common.m4, but not for dnl anything else in gdbserver. m4_include(../../config/codeset.m4) -m4_include(../gdbsupport/common.m4) +m4_include(../../gdbsupport/common.m4) dnl For libiberty_INIT. m4_include(../libiberty.m4) diff --git a/gdb/gdbserver/gdbreplay.c b/gdb/gdbserver/gdbreplay.c index 3ed18f1..263fb0e 100644 --- a/gdb/gdbserver/gdbreplay.c +++ b/gdb/gdbserver/gdbreplay.c @@ -18,6 +18,14 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include "gdbsupport/common-defs.h" + +#undef PACKAGE +#undef PACKAGE_NAME +#undef PACKAGE_VERSION +#undef PACKAGE_STRING +#undef PACKAGE_TARNAME + +#include <config.h> #include "gdbsupport/version.h" #if HAVE_SYS_FILE_H diff --git a/gdb/gdbserver/server.h b/gdb/gdbserver/server.h index 0c74f99..3c28686 100644 --- a/gdb/gdbserver/server.h +++ b/gdb/gdbserver/server.h @@ -21,6 +21,14 @@ #include "gdbsupport/common-defs.h" +#undef PACKAGE +#undef PACKAGE_NAME +#undef PACKAGE_VERSION +#undef PACKAGE_STRING +#undef PACKAGE_TARNAME + +#include <config.h> + gdb_static_assert (sizeof (CORE_ADDR) >= sizeof (void *)); #ifdef __MINGW32CE__ diff --git a/gdb/gdbsupport/agent.c b/gdb/gdbsupport/agent.c deleted file mode 100644 index b4127ff..0000000 --- a/gdb/gdbsupport/agent.c +++ /dev/null @@ -1,280 +0,0 @@ -/* Shared utility routines for GDB to interact with agent. - - Copyright (C) 2009-2020 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 "common-defs.h" -#include "target/target.h" -#include "gdbsupport/symbol.h" -#include <unistd.h> -#include "filestuff.h" - -#define IPA_SYM_STRUCT_NAME ipa_sym_addresses_common -#include "agent.h" - -bool debug_agent = false; - -/* A stdarg wrapper for debug_vprintf. */ - -static void ATTRIBUTE_PRINTF (1, 2) -debug_agent_printf (const char *fmt, ...) -{ - va_list ap; - - if (!debug_agent) - return; - va_start (ap, fmt); - debug_vprintf (fmt, ap); - va_end (ap); -} - -#define DEBUG_AGENT debug_agent_printf - -/* Global flag to determine using agent or not. */ -bool use_agent = false; - -/* Addresses of in-process agent's symbols both GDB and GDBserver cares - about. */ - -struct ipa_sym_addresses_common -{ - CORE_ADDR addr_helper_thread_id; - CORE_ADDR addr_cmd_buf; - CORE_ADDR addr_capability; -}; - -/* Cache of the helper thread id. FIXME: this global should be made - per-process. */ -static uint32_t helper_thread_id = 0; - -static struct -{ - const char *name; - int offset; -} symbol_list[] = { - IPA_SYM(helper_thread_id), - IPA_SYM(cmd_buf), - IPA_SYM(capability), -}; - -static struct ipa_sym_addresses_common ipa_sym_addrs; - -static bool all_agent_symbols_looked_up = false; - -bool -agent_loaded_p (void) -{ - return all_agent_symbols_looked_up; -} - -/* Look up all symbols needed by agent. Return 0 if all the symbols are - found, return non-zero otherwise. */ - -int -agent_look_up_symbols (void *arg) -{ - all_agent_symbols_looked_up = false; - - for (int i = 0; i < sizeof (symbol_list) / sizeof (symbol_list[0]); i++) - { - CORE_ADDR *addrp = - (CORE_ADDR *) ((char *) &ipa_sym_addrs + symbol_list[i].offset); - struct objfile *objfile = (struct objfile *) arg; - - if (find_minimal_symbol_address (symbol_list[i].name, addrp, - objfile) != 0) - { - DEBUG_AGENT ("symbol `%s' not found\n", symbol_list[i].name); - return -1; - } - } - - all_agent_symbols_looked_up = true; - return 0; -} - -static unsigned int -agent_get_helper_thread_id (void) -{ - if (helper_thread_id == 0) - { - if (target_read_uint32 (ipa_sym_addrs.addr_helper_thread_id, - &helper_thread_id)) - warning (_("Error reading helper thread's id in lib")); - } - - return helper_thread_id; -} - -#ifdef HAVE_SYS_UN_H -#include <sys/socket.h> -#include <sys/un.h> -#define SOCK_DIR P_tmpdir - -#ifndef UNIX_PATH_MAX -#define UNIX_PATH_MAX sizeof(((struct sockaddr_un *) NULL)->sun_path) -#endif - -#endif - -/* Connects to synchronization socket. PID is the pid of inferior, which is - used to set up the connection socket. */ - -static int -gdb_connect_sync_socket (int pid) -{ -#ifdef HAVE_SYS_UN_H - struct sockaddr_un addr; - int res, fd; - char path[UNIX_PATH_MAX]; - - res = xsnprintf (path, UNIX_PATH_MAX, "%s/gdb_ust%d", P_tmpdir, pid); - if (res >= UNIX_PATH_MAX) - return -1; - - res = fd = gdb_socket_cloexec (PF_UNIX, SOCK_STREAM, 0); - if (res == -1) - { - warning (_("error opening sync socket: %s"), safe_strerror (errno)); - return -1; - } - - addr.sun_family = AF_UNIX; - - res = xsnprintf (addr.sun_path, UNIX_PATH_MAX, "%s", path); - if (res >= UNIX_PATH_MAX) - { - warning (_("string overflow allocating socket name")); - close (fd); - return -1; - } - - res = connect (fd, (struct sockaddr *) &addr, sizeof (addr)); - if (res == -1) - { - warning (_("error connecting sync socket (%s): %s. " - "Make sure the directory exists and that it is writable."), - path, safe_strerror (errno)); - close (fd); - return -1; - } - - return fd; -#else - return -1; -#endif -} - -/* Execute an agent command in the inferior. PID is the value of pid of the - inferior. CMD is the buffer for command. GDB or GDBserver will store the - command into it and fetch the return result from CMD. The interaction - between GDB/GDBserver and the agent is synchronized by a synchronization - socket. Return zero if success, otherwise return non-zero. */ - -int -agent_run_command (int pid, const char *cmd, int len) -{ - int fd; - int tid = agent_get_helper_thread_id (); - ptid_t ptid = ptid_t (pid, tid, 0); - - int ret = target_write_memory (ipa_sym_addrs.addr_cmd_buf, - (gdb_byte *) cmd, len); - - if (ret != 0) - { - warning (_("unable to write")); - return -1; - } - - DEBUG_AGENT ("agent: resumed helper thread\n"); - - /* Resume helper thread. */ - target_continue_no_signal (ptid); - - fd = gdb_connect_sync_socket (pid); - if (fd >= 0) - { - char buf[1] = ""; - - DEBUG_AGENT ("agent: signalling helper thread\n"); - - do - { - ret = write (fd, buf, 1); - } while (ret == -1 && errno == EINTR); - - DEBUG_AGENT ("agent: waiting for helper thread's response\n"); - - do - { - ret = read (fd, buf, 1); - } while (ret == -1 && errno == EINTR); - - close (fd); - - DEBUG_AGENT ("agent: helper thread's response received\n"); - } - else - return -1; - - /* Need to read response with the inferior stopped. */ - if (ptid != null_ptid) - { - /* Stop thread PTID. */ - DEBUG_AGENT ("agent: stop helper thread\n"); - target_stop_and_wait (ptid); - } - - if (fd >= 0) - { - if (target_read_memory (ipa_sym_addrs.addr_cmd_buf, (gdb_byte *) cmd, - IPA_CMD_BUF_SIZE)) - { - warning (_("Error reading command response")); - return -1; - } - } - - return 0; -} - -/* Each bit of it stands for a capability of agent. */ -static uint32_t agent_capability = 0; - -/* Return true if agent has capability AGENT_CAP, otherwise return false. */ - -bool -agent_capability_check (enum agent_capa agent_capa) -{ - if (agent_capability == 0) - { - if (target_read_uint32 (ipa_sym_addrs.addr_capability, - &agent_capability)) - warning (_("Error reading capability of agent")); - } - return (agent_capability & agent_capa) != 0; -} - -/* Invalidate the cache of agent capability, so we'll read it from inferior - again. Call it when launches a new program or reconnect to remote stub. */ - -void -agent_capability_invalidate (void) -{ - agent_capability = 0; -} diff --git a/gdb/gdbsupport/agent.h b/gdb/gdbsupport/agent.h deleted file mode 100644 index cc52fb6..0000000 --- a/gdb/gdbsupport/agent.h +++ /dev/null @@ -1,68 +0,0 @@ -/* Shared utility routines for GDB to interact with agent. - - Copyright (C) 2009-2020 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 COMMON_AGENT_H -#define COMMON_AGENT_H - -#include "gdbsupport/preprocessor.h" - -int agent_run_command (int pid, const char *cmd, int len); - -int agent_look_up_symbols (void *); - -#define IPA_SYM_EXPORTED_NAME(SYM) gdb_agent_ ## SYM - -/* Define an entry in an IPA symbol list array. If IPA_SYM is used, the macro - IPA_SYM_STRUCT_NAME must be defined to the structure name holding the IPA - symbol addresses in that particular file, before including - gdbsupport/agent.h. */ -#define IPA_SYM(SYM) \ - { \ - STRINGIFY (IPA_SYM_EXPORTED_NAME (SYM)), \ - offsetof (IPA_SYM_STRUCT_NAME, addr_ ## SYM) \ - } - -/* The size in bytes of the buffer used to talk to the IPA helper - thread. */ -#define IPA_CMD_BUF_SIZE 1024 - -bool agent_loaded_p (void); - -extern bool debug_agent; - -extern bool use_agent; - -/* Capability of agent. Different agents may have different capabilities, - such as installing fast tracepoint or evaluating breakpoint conditions. - Capabilities are represented by bit-maps, and each capability occupies one - bit. */ - -enum agent_capa -{ - /* Capability to install fast tracepoint. */ - AGENT_CAPA_FAST_TRACE = 0x1, - /* Capability to install static tracepoint. */ - AGENT_CAPA_STATIC_TRACE = (0x1 << 1), -}; - -bool agent_capability_check (enum agent_capa); - -void agent_capability_invalidate (void); - -#endif /* COMMON_AGENT_H */ diff --git a/gdb/gdbsupport/alt-stack.h b/gdb/gdbsupport/alt-stack.h deleted file mode 100644 index e7c6b2f..0000000 --- a/gdb/gdbsupport/alt-stack.h +++ /dev/null @@ -1,70 +0,0 @@ -/* Temporarily install an alternate signal stack - - Copyright (C) 2019-2020 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_ALT_STACK_H -#define GDBSUPPORT_ALT_STACK_H - -#include <signal.h> - -namespace gdb -{ - -/* Try to set up an alternate signal stack for SIGSEGV handlers. - This allows us to handle SIGSEGV signals generated when the - normal process stack is exhausted. If this stack is not set - up (sigaltstack is unavailable or fails) and a SIGSEGV is - generated when the normal stack is exhausted then the program - will behave as though no SIGSEGV handler was installed. */ -class alternate_signal_stack -{ -public: - alternate_signal_stack () - { -#ifdef HAVE_SIGALTSTACK - m_stack.reset ((char *) xmalloc (SIGSTKSZ)); - - stack_t stack; - stack.ss_sp = m_stack.get (); - stack.ss_size = SIGSTKSZ; - stack.ss_flags = 0; - - sigaltstack (&stack, &m_old_stack); -#endif - } - - ~alternate_signal_stack () - { -#ifdef HAVE_SIGALTSTACK - sigaltstack (&m_old_stack, nullptr); -#endif - } - - DISABLE_COPY_AND_ASSIGN (alternate_signal_stack); - -private: - -#ifdef HAVE_SIGALTSTACK - gdb::unique_xmalloc_ptr<char> m_stack; - stack_t m_old_stack; -#endif -}; - -} - -#endif /* GDBSUPPORT_ALT_STACK_H */ diff --git a/gdb/gdbsupport/array-view.h b/gdb/gdbsupport/array-view.h deleted file mode 100644 index ed5edc7..0000000 --- a/gdb/gdbsupport/array-view.h +++ /dev/null @@ -1,259 +0,0 @@ -/* Copyright (C) 2017-2020 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 COMMON_ARRAY_VIEW_H -#define COMMON_ARRAY_VIEW_H - -#include "traits.h" -#include <type_traits> - -/* An array_view is an abstraction that provides a non-owning view - over a sequence of contiguous objects. - - A way to put it is that array_view is to std::vector (and - std::array and built-in arrays with rank==1) like std::string_view - is to std::string. - - The main intent of array_view is to use it as function input - parameter type, making it possible to pass in any sequence of - contiguous objects, irrespective of whether the objects live on the - stack or heap and what actual container owns them. Implicit - construction from the element type is supported too, making it easy - to call functions that expect an array of elements when you only - have one element (usually on the stack). For example: - - struct A { .... }; - void function (gdb::array_view<A> as); - - std::vector<A> std_vec = ...; - std::array<A, N> std_array = ...; - A array[] = {...}; - A elem; - - function (std_vec); - function (std_array); - function (array); - function (elem); - - Views can be either mutable or const. A const view is simply - created by specifying a const T as array_view template parameter, - in which case operator[] of non-const array_view objects ends up - returning const references. Making the array_view itself const is - analogous to making a pointer itself be const. I.e., disables - re-seating the view/pointer. - - Since array_view objects are small (pointer plus size), and - designed to be trivially copyable, they should generally be passed - around by value. - - You can find unit tests covering the whole API in - unittests/array-view-selftests.c. */ - -namespace gdb { - -template <typename T> -class array_view -{ - /* True iff decayed T is the same as decayed U. E.g., we want to - say that 'T&' is the same as 'const T'. */ - template <typename U> - using IsDecayedT = typename std::is_same<typename std::decay<T>::type, - typename std::decay<U>::type>; - - /* True iff decayed T is the same as decayed U, and 'U *' is - implicitly convertible to 'T *'. This is a requirement for - several methods. */ - template <typename U> - using DecayedConvertible = gdb::And<IsDecayedT<U>, - std::is_convertible<U *, T *>>; - -public: - using value_type = T; - using reference = T &; - using const_reference = const T &; - using size_type = size_t; - - /* Default construction creates an empty view. */ - constexpr array_view () noexcept - : m_array (nullptr), m_size (0) - {} - - /* Create an array view over a single object of the type of an - array_view element. The created view as size==1. This is - templated on U to allow constructing a array_view<const T> over a - (non-const) T. The "convertible" requirement makes sure that you - can't create an array_view<T> over a const T. */ - template<typename U, - typename = Requires<DecayedConvertible<U>>> - constexpr array_view (U &elem) noexcept - : m_array (&elem), m_size (1) - {} - - /* Same as above, for rvalue references. */ - template<typename U, - typename = Requires<DecayedConvertible<U>>> - constexpr array_view (U &&elem) noexcept - : m_array (&elem), m_size (1) - {} - - /* Create an array view from a pointer to an array and an element - count. */ - template<typename U, - typename = Requires<DecayedConvertible<U>>> - constexpr array_view (U *array, size_t size) noexcept - : m_array (array), m_size (size) - {} - - /* Create an array view from a range. This is templated on both U - an V to allow passing in a mix of 'const T *' and 'T *'. */ - template<typename U, typename V, - typename = Requires<DecayedConvertible<U>>, - typename = Requires<DecayedConvertible<V>>> - constexpr array_view (U *begin, V *end) noexcept - : m_array (begin), m_size (end - begin) - {} - - /* Create an array view from an array. */ - template<typename U, size_t Size, - typename = Requires<DecayedConvertible<U>>> - constexpr array_view (U (&array)[Size]) noexcept - : m_array (array), m_size (Size) - {} - - /* Create an array view from a contiguous container. E.g., - std::vector and std::array. */ - template<typename Container, - typename = Requires<gdb::Not<IsDecayedT<Container>>>, - typename - = Requires<std::is_convertible - <decltype (std::declval<Container> ().data ()), - T *>>, - typename - = Requires<std::is_convertible - <decltype (std::declval<Container> ().size ()), - size_type>>> - constexpr array_view (Container &&c) noexcept - : m_array (c.data ()), m_size (c.size ()) - {} - - /* Observer methods. Some of these can't be constexpr until we - require C++14. */ - /*constexpr14*/ T *data () noexcept { return m_array; } - constexpr const T *data () const noexcept { return m_array; } - - /*constexpr14*/ T *begin () noexcept { return m_array; } - constexpr const T *begin () const noexcept { return m_array; } - - /*constexpr14*/ T *end () noexcept { return m_array + m_size; } - constexpr const T *end () const noexcept { return m_array + m_size; } - - /*constexpr14*/ reference operator[] (size_t index) noexcept - { return m_array[index]; } - constexpr const_reference operator[] (size_t index) const noexcept - { return m_array[index]; } - - constexpr size_type size () const noexcept { return m_size; } - constexpr bool empty () const noexcept { return m_size == 0; } - - /* Slice an array view. */ - - /* Return a new array view over SIZE elements starting at START. */ - constexpr array_view<T> slice (size_type start, size_type size) const noexcept - { return {m_array + start, size}; } - - /* Return a new array view over all the elements after START, - inclusive. */ - constexpr array_view<T> slice (size_type start) const noexcept - { return {m_array + start, size () - start}; } - -private: - T *m_array; - size_type m_size; -}; - -/* Compare LHS and RHS for (deep) equality. That is, whether LHS and - RHS have the same sizes, and whether each pair of elements of LHS - and RHS at the same position compares equal. */ - -template <typename T> -bool -operator== (const gdb::array_view<T> &lhs, const gdb::array_view<T> &rhs) -{ - if (lhs.size () != rhs.size ()) - return false; - - for (size_t i = 0; i < lhs.size (); i++) - if (!(lhs[i] == rhs[i])) - return false; - - return true; -} - -/* Compare two array_views for inequality. */ - -template <typename T> -bool -operator!= (const gdb::array_view<T> &lhs, const gdb::array_view<T> &rhs) -{ - return !(lhs == rhs); -} - -/* Create an array view from a pointer to an array and an element - count. - - This is useful as alternative to constructing an array_view using - brace initialization when the size variable you have handy is of - signed type, since otherwise without an explicit cast the code - would be ill-formed. - - For example, with: - - extern void foo (int, int, gdb::array_view<value *>); - - value *args[2]; - int nargs; - foo (1, 2, {values, nargs}); - - You'd get: - - source.c:10: error: narrowing conversion of ‘nargs’ from ‘int’ to - ‘size_t {aka long unsigned int}’ inside { } [-Werror=narrowing] - - You could fix it by writing the somewhat distracting explicit cast: - - foo (1, 2, {values, (size_t) nargs}); - - Or by instantiating an array_view explicitly: - - foo (1, 2, gdb::array_view<value *>(values, nargs)); - - Or, better, using make_array_view, which has the advantage of - inferring the arrav_view element's type: - - foo (1, 2, gdb::make_array_view (values, nargs)); -*/ - -template<typename U> -constexpr inline array_view<U> -make_array_view (U *array, size_t size) noexcept -{ - return {array, size}; -} - -} /* namespace gdb */ - -#endif diff --git a/gdb/gdbsupport/ax.def b/gdb/gdbsupport/ax.def deleted file mode 100644 index 3bb6686..0000000 --- a/gdb/gdbsupport/ax.def +++ /dev/null @@ -1,97 +0,0 @@ -/* Definition of agent opcode values. -*- c -*- - Copyright (C) 1998-2020 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 actual values of the various bytecode operations. - - Other independent implementations of the agent bytecode engine will - rely on the exact values of these enums, and may not be recompiled - when we change this table. The numeric values should remain fixed - whenever possible. Thus, we assign them values explicitly here (to - allow gaps to form safely), and the disassembly table in - agentexpr.h behaves like an opcode map. If you want to see them - grouped logically, see doc/agentexpr.texi. - - Each line is of the form: - - DEFOP (name, size, data_size, consumed, produced, opcode) - - NAME is the name of the operation. - SIZE is the number of argument bytes that the operation takes from - the bytecode stream. - DATA_SIZE is the size of data operated on, in bits, for operations - that care (ref and const). It is zero otherwise. - CONSUMED is the number of stack elements consumed. - PRODUCED is the number of stack elements produced. - OPCODE is the operation's encoding. */ - -DEFOP (float, 0, 0, 0, 0, 0x01) -DEFOP (add, 0, 0, 2, 1, 0x02) -DEFOP (sub, 0, 0, 2, 1, 0x03) -DEFOP (mul, 0, 0, 2, 1, 0x04) -DEFOP (div_signed, 0, 0, 2, 1, 0x05) -DEFOP (div_unsigned, 0, 0, 2, 1, 0x06) -DEFOP (rem_signed, 0, 0, 2, 1, 0x07) -DEFOP (rem_unsigned, 0, 0, 2, 1, 0x08) -DEFOP (lsh, 0, 0, 2, 1, 0x09) -DEFOP (rsh_signed, 0, 0, 2, 1, 0x0a) -DEFOP (rsh_unsigned, 0, 0, 2, 1, 0x0b) -DEFOP (trace, 0, 0, 2, 0, 0x0c) -DEFOP (trace_quick, 1, 0, 1, 1, 0x0d) -DEFOP (log_not, 0, 0, 1, 1, 0x0e) -DEFOP (bit_and, 0, 0, 2, 1, 0x0f) -DEFOP (bit_or, 0, 0, 2, 1, 0x10) -DEFOP (bit_xor, 0, 0, 2, 1, 0x11) -DEFOP (bit_not, 0, 0, 1, 1, 0x12) -DEFOP (equal, 0, 0, 2, 1, 0x13) -DEFOP (less_signed, 0, 0, 2, 1, 0x14) -DEFOP (less_unsigned, 0, 0, 2, 1, 0x15) -DEFOP (ext, 1, 0, 1, 1, 0x16) -DEFOP (ref8, 0, 8, 1, 1, 0x17) -DEFOP (ref16, 0, 16, 1, 1, 0x18) -DEFOP (ref32, 0, 32, 1, 1, 0x19) -DEFOP (ref64, 0, 64, 1, 1, 0x1a) -DEFOP (ref_float, 0, 0, 1, 1, 0x1b) -DEFOP (ref_double, 0, 0, 1, 1, 0x1c) -DEFOP (ref_long_double, 0, 0, 1, 1, 0x1d) -DEFOP (l_to_d, 0, 0, 1, 1, 0x1e) -DEFOP (d_to_l, 0, 0, 1, 1, 0x1f) -DEFOP (if_goto, 2, 0, 1, 0, 0x20) -DEFOP (goto, 2, 0, 0, 0, 0x21) -DEFOP (const8, 1, 8, 0, 1, 0x22) -DEFOP (const16, 2, 16, 0, 1, 0x23) -DEFOP (const32, 4, 32, 0, 1, 0x24) -DEFOP (const64, 8, 64, 0, 1, 0x25) -DEFOP (reg, 2, 0, 0, 1, 0x26) -DEFOP (end, 0, 0, 0, 0, 0x27) -DEFOP (dup, 0, 0, 1, 2, 0x28) -DEFOP (pop, 0, 0, 1, 0, 0x29) -DEFOP (zero_ext, 1, 0, 1, 1, 0x2a) -DEFOP (swap, 0, 0, 2, 2, 0x2b) -DEFOP (getv, 2, 0, 0, 1, 0x2c) -DEFOP (setv, 2, 0, 1, 1, 0x2d) -DEFOP (tracev, 2, 0, 0, 1, 0x2e) -DEFOP (tracenz, 0, 0, 2, 0, 0x2f) -DEFOP (trace16, 2, 0, 1, 1, 0x30) -/* We need something here just to make the tables come out ok. */ -DEFOP (invalid2, 0, 0, 0, 0, 0x31) -/* The "consumed" number for pick is wrong, but there's no way to - express the right thing. */ -DEFOP (pick, 1, 0, 0, 1, 0x32) -DEFOP (rot, 0, 0, 3, 3, 0x33) -/* Both the argument and consumed numbers are dynamic for this one. */ -DEFOP (printf, 0, 0, 0, 0, 0x34) diff --git a/gdb/gdbsupport/block-signals.h b/gdb/gdbsupport/block-signals.h deleted file mode 100644 index 24c971f..0000000 --- a/gdb/gdbsupport/block-signals.h +++ /dev/null @@ -1,67 +0,0 @@ -/* Block signals used by gdb - - Copyright (C) 2019-2020 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_BLOCK_SIGNALS_H -#define GDBSUPPORT_BLOCK_SIGNALS_H - -#include <signal.h> - -#include "gdbsupport/gdb-sigmask.h" - -namespace gdb -{ - -/* This is an RAII class that temporarily blocks the signals needed by - gdb. This can be used before starting a new thread to ensure that - this thread starts with the appropriate signals blocked. */ -class block_signals -{ -public: - block_signals () - { -#ifdef HAVE_SIGPROCMASK - sigset_t mask; - sigemptyset (&mask); - sigaddset (&mask, SIGINT); - sigaddset (&mask, SIGCHLD); - sigaddset (&mask, SIGALRM); - sigaddset (&mask, SIGWINCH); - gdb_sigmask (SIG_BLOCK, &mask, &m_old_mask); -#endif - } - - ~block_signals () - { -#ifdef HAVE_SIGPROCMASK - gdb_sigmask (SIG_SETMASK, &m_old_mask, nullptr); -#endif - } - - DISABLE_COPY_AND_ASSIGN (block_signals); - -private: - -#ifdef HAVE_SIGPROCMASK - sigset_t m_old_mask; -#endif -}; - -} - -#endif /* GDBSUPPORT_BLOCK_SIGNALS_H */ diff --git a/gdb/gdbsupport/break-common.h b/gdb/gdbsupport/break-common.h deleted file mode 100644 index f62383b..0000000 --- a/gdb/gdbsupport/break-common.h +++ /dev/null @@ -1,31 +0,0 @@ -/* Data structures associated with breakpoints shared in both GDB and - GDBserver. - Copyright (C) 1992-2020 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 COMMON_BREAK_COMMON_H -#define COMMON_BREAK_COMMON_H - -enum target_hw_bp_type - { - hw_write = 0, /* Common HW watchpoint */ - hw_read = 1, /* Read HW watchpoint */ - hw_access = 2, /* Access HW watchpoint */ - hw_execute = 3 /* Execute HW breakpoint */ - }; - -#endif /* COMMON_BREAK_COMMON_H */ diff --git a/gdb/gdbsupport/btrace-common.c b/gdb/gdbsupport/btrace-common.c deleted file mode 100644 index 7d4f642..0000000 --- a/gdb/gdbsupport/btrace-common.c +++ /dev/null @@ -1,190 +0,0 @@ -/* Copyright (C) 2014-2020 Free Software Foundation, Inc. - - Contributed by Intel Corp. <markus.t.metzger@intel.com> - - 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 "common-defs.h" -#include "btrace-common.h" - - -/* See btrace-common.h. */ - -const char * -btrace_format_string (enum btrace_format format) -{ - switch (format) - { - case BTRACE_FORMAT_NONE: - return _("No or unknown format"); - - case BTRACE_FORMAT_BTS: - return _("Branch Trace Store"); - - case BTRACE_FORMAT_PT: - return _("Intel Processor Trace"); - } - - internal_error (__FILE__, __LINE__, _("Unknown branch trace format")); -} - -/* See btrace-common.h. */ - -const char * -btrace_format_short_string (enum btrace_format format) -{ - switch (format) - { - case BTRACE_FORMAT_NONE: - return "unknown"; - - case BTRACE_FORMAT_BTS: - return "bts"; - - case BTRACE_FORMAT_PT: - return "pt"; - } - - internal_error (__FILE__, __LINE__, _("Unknown branch trace format")); -} - -/* See btrace-common.h. */ - -void -btrace_data::fini () -{ - switch (format) - { - case BTRACE_FORMAT_NONE: - /* Nothing to do. */ - return; - - case BTRACE_FORMAT_BTS: - delete variant.bts.blocks; - variant.bts.blocks = nullptr; - return; - - case BTRACE_FORMAT_PT: - xfree (variant.pt.data); - return; - } - - internal_error (__FILE__, __LINE__, _("Unkown branch trace format.")); -} - -/* See btrace-common.h. */ - -bool -btrace_data::empty () const -{ - switch (format) - { - case BTRACE_FORMAT_NONE: - return true; - - case BTRACE_FORMAT_BTS: - return variant.bts.blocks->empty (); - - case BTRACE_FORMAT_PT: - return (variant.pt.size == 0); - } - - internal_error (__FILE__, __LINE__, _("Unkown branch trace format.")); -} - -/* See btrace-common.h. */ - -void -btrace_data::clear () -{ - fini (); - format = BTRACE_FORMAT_NONE; -} - -/* See btrace-common.h. */ - -int -btrace_data_append (struct btrace_data *dst, - const struct btrace_data *src) -{ - switch (src->format) - { - case BTRACE_FORMAT_NONE: - return 0; - - case BTRACE_FORMAT_BTS: - switch (dst->format) - { - default: - return -1; - - case BTRACE_FORMAT_NONE: - dst->format = BTRACE_FORMAT_BTS; - dst->variant.bts.blocks = new std::vector<btrace_block>; - - /* Fall-through. */ - case BTRACE_FORMAT_BTS: - { - unsigned int blk; - - /* We copy blocks in reverse order to have the oldest block at - index zero. */ - blk = src->variant.bts.blocks->size (); - while (blk != 0) - { - const btrace_block &block - = src->variant.bts.blocks->at (--blk); - dst->variant.bts.blocks->push_back (block); - } - } - } - return 0; - - case BTRACE_FORMAT_PT: - switch (dst->format) - { - default: - return -1; - - case BTRACE_FORMAT_NONE: - dst->format = BTRACE_FORMAT_PT; - dst->variant.pt.data = NULL; - dst->variant.pt.size = 0; - - /* fall-through. */ - case BTRACE_FORMAT_PT: - { - gdb_byte *data; - size_t size; - - size = src->variant.pt.size + dst->variant.pt.size; - data = (gdb_byte *) xmalloc (size); - - memcpy (data, dst->variant.pt.data, dst->variant.pt.size); - memcpy (data + dst->variant.pt.size, src->variant.pt.data, - src->variant.pt.size); - - xfree (dst->variant.pt.data); - - dst->variant.pt.data = data; - dst->variant.pt.size = size; - } - } - return 0; - } - - internal_error (__FILE__, __LINE__, _("Unkown branch trace format.")); -} diff --git a/gdb/gdbsupport/btrace-common.h b/gdb/gdbsupport/btrace-common.h deleted file mode 100644 index c9dc683..0000000 --- a/gdb/gdbsupport/btrace-common.h +++ /dev/null @@ -1,260 +0,0 @@ -/* Branch trace support for GDB, the GNU debugger. - - Copyright (C) 2013-2020 Free Software Foundation, Inc. - - Contributed by Intel Corp. <markus.t.metzger@intel.com>. - - 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 COMMON_BTRACE_COMMON_H -#define COMMON_BTRACE_COMMON_H - -/* Branch tracing (btrace) is a per-thread control-flow execution trace of the - inferior. For presentation purposes, the branch trace is represented as a - list of sequential control-flow blocks, one such list per thread. */ - -/* A branch trace block. - - This represents a block of sequential control-flow. Adjacent blocks will be - connected via calls, returns, or jumps. The latter can be direct or - indirect, conditional or unconditional. Branches can further be - asynchronous, e.g. interrupts. */ -struct btrace_block -{ - /* The address of the first byte of the first instruction in the block. - The address may be zero if we do not know the beginning of this block, - such as for the first block in a delta trace. */ - CORE_ADDR begin; - - /* The address of the first byte of the last instruction in the block. */ - CORE_ADDR end; - - /* Simple constructor. */ - btrace_block (CORE_ADDR begin, CORE_ADDR end) - : begin (begin), - end (end) - { - /* Nothing. */ - } -}; - -/* Enumeration of btrace formats. */ - -enum btrace_format -{ - /* No branch trace format. */ - BTRACE_FORMAT_NONE, - - /* Branch trace is in Branch Trace Store (BTS) format. - Actually, the format is a sequence of blocks derived from BTS. */ - BTRACE_FORMAT_BTS, - - /* Branch trace is in Intel Processor Trace format. */ - BTRACE_FORMAT_PT -}; - -/* An enumeration of cpu vendors. */ - -enum btrace_cpu_vendor -{ - /* We do not know this vendor. */ - CV_UNKNOWN, - - /* Intel. */ - CV_INTEL -}; - -/* A cpu identifier. */ - -struct btrace_cpu -{ - /* The processor vendor. */ - enum btrace_cpu_vendor vendor; - - /* The cpu family. */ - unsigned short family; - - /* The cpu model. */ - unsigned char model; - - /* The cpu stepping. */ - unsigned char stepping; -}; - -/* A BTS configuration. */ - -struct btrace_config_bts -{ - /* The size of the branch trace buffer in bytes. - - This is unsigned int and not size_t since it is registered as - control variable for "set record btrace bts buffer-size". */ - unsigned int size; -}; - -/* An Intel Processor Trace configuration. */ - -struct btrace_config_pt -{ - /* The size of the branch trace buffer in bytes. - - This is unsigned int and not size_t since it is registered as - control variable for "set record btrace pt buffer-size". */ - unsigned int size; -}; - -/* A branch tracing configuration. - - This describes the requested configuration as well as the actually - obtained configuration. - We describe the configuration for all different formats so we can - easily switch between formats. */ - -struct btrace_config -{ - /* The branch tracing format. */ - enum btrace_format format; - - /* The BTS format configuration. */ - struct btrace_config_bts bts; - - /* The Intel Processor Trace format configuration. */ - struct btrace_config_pt pt; -}; - -/* Branch trace in BTS format. */ -struct btrace_data_bts -{ - /* Branch trace is represented as a vector of branch trace blocks starting - with the most recent block. This needs to be a pointer as we place - btrace_data_bts into a union. */ - std::vector<btrace_block> *blocks; -}; - -/* Configuration information to go with the trace data. */ -struct btrace_data_pt_config -{ - /* The processor on which the trace has been collected. */ - struct btrace_cpu cpu; -}; - -/* Branch trace in Intel Processor Trace format. */ -struct btrace_data_pt -{ - /* Some configuration information to go with the data. */ - struct btrace_data_pt_config config; - - /* The trace data. */ - gdb_byte *data; - - /* The size of DATA in bytes. */ - size_t size; -}; - -/* The branch trace data. */ -struct btrace_data -{ - btrace_data () = default; - - ~btrace_data () - { - fini (); - } - - btrace_data &operator= (btrace_data &&other) - { - if (this != &other) - { - fini (); - format = other.format; - variant = other.variant; - other.format = BTRACE_FORMAT_NONE; - } - return *this; - } - - /* Return true if this is empty; false otherwise. */ - bool empty () const; - - /* Clear this object. */ - void clear (); - - enum btrace_format format = BTRACE_FORMAT_NONE; - - union - { - /* Format == BTRACE_FORMAT_BTS. */ - struct btrace_data_bts bts; - - /* Format == BTRACE_FORMAT_PT. */ - struct btrace_data_pt pt; - } variant; - -private: - - DISABLE_COPY_AND_ASSIGN (btrace_data); - - void fini (); -}; - -/* Target specific branch trace information. */ -struct btrace_target_info; - -/* Enumeration of btrace read types. */ - -enum btrace_read_type -{ - /* Send all available trace. */ - BTRACE_READ_ALL, - - /* Send all available trace, if it changed. */ - BTRACE_READ_NEW, - - /* Send the trace since the last request. This will fail if the trace - buffer overflowed. */ - BTRACE_READ_DELTA -}; - -/* Enumeration of btrace errors. */ - -enum btrace_error -{ - /* No error. Everything is OK. */ - BTRACE_ERR_NONE, - - /* An unknown error. */ - BTRACE_ERR_UNKNOWN, - - /* Branch tracing is not supported on this system. */ - BTRACE_ERR_NOT_SUPPORTED, - - /* The branch trace buffer overflowed; no delta read possible. */ - BTRACE_ERR_OVERFLOW -}; - -/* Return a string representation of FORMAT. */ -extern const char *btrace_format_string (enum btrace_format format); - -/* Return an abbreviation string representation of FORMAT. */ -extern const char *btrace_format_short_string (enum btrace_format format); - -/* Append the branch trace data from SRC to the end of DST. - Both SRC and DST must use the same format. - Returns zero on success; a negative number otherwise. */ -extern int btrace_data_append (struct btrace_data *dst, - const struct btrace_data *src); - -#endif /* COMMON_BTRACE_COMMON_H */ diff --git a/gdb/gdbsupport/buffer.c b/gdb/gdbsupport/buffer.c deleted file mode 100644 index e3d0f1e..0000000 --- a/gdb/gdbsupport/buffer.c +++ /dev/null @@ -1,178 +0,0 @@ -/* A simple growing buffer for GDB. - - Copyright (C) 2009-2020 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 "common-defs.h" -#include "xml-utils.h" -#include "buffer.h" -#include "inttypes.h" -void -buffer_grow (struct buffer *buffer, const char *data, size_t size) -{ - char *new_buffer; - size_t new_buffer_size; - - if (size == 0) - return; - - new_buffer_size = buffer->buffer_size; - - if (new_buffer_size == 0) - new_buffer_size = 1; - - while (buffer->used_size + size > new_buffer_size) - new_buffer_size *= 2; - new_buffer = (char *) xrealloc (buffer->buffer, new_buffer_size); - memcpy (new_buffer + buffer->used_size, data, size); - buffer->buffer = new_buffer; - buffer->buffer_size = new_buffer_size; - buffer->used_size += size; -} - -void -buffer_free (struct buffer *buffer) -{ - if (!buffer) - return; - - xfree (buffer->buffer); - buffer->buffer = NULL; - buffer->buffer_size = 0; - buffer->used_size = 0; -} - -void -buffer_init (struct buffer *buffer) -{ - memset (buffer, 0, sizeof (*buffer)); -} - -char* -buffer_finish (struct buffer *buffer) -{ - char *ret = buffer->buffer; - buffer->buffer = NULL; - buffer->buffer_size = 0; - buffer->used_size = 0; - return ret; -} - -void -buffer_xml_printf (struct buffer *buffer, const char *format, ...) -{ - va_list ap; - const char *f; - const char *prev; - int percent = 0; - - va_start (ap, format); - - prev = format; - for (f = format; *f; f++) - { - if (percent) - { - char buf[32]; - char *str = buf; - const char *f_old = f; - - switch (*f) - { - case 's': - str = va_arg (ap, char *); - break; - case 'd': - sprintf (str, "%d", va_arg (ap, int)); - break; - case 'u': - sprintf (str, "%u", va_arg (ap, unsigned int)); - break; - case 'x': - sprintf (str, "%x", va_arg (ap, unsigned int)); - break; - case 'o': - sprintf (str, "%o", va_arg (ap, unsigned int)); - break; - case 'l': - f++; - switch (*f) - { - case 'd': - sprintf (str, "%ld", va_arg (ap, long)); - break; - case 'u': - sprintf (str, "%lu", va_arg (ap, unsigned long)); - break; - case 'x': - sprintf (str, "%lx", va_arg (ap, unsigned long)); - break; - case 'o': - sprintf (str, "%lo", va_arg (ap, unsigned long)); - break; - case 'l': - f++; - switch (*f) - { - case 'd': - sprintf (str, "%" PRId64, - (int64_t) va_arg (ap, long long)); - break; - case 'u': - sprintf (str, "%" PRIu64, - (uint64_t) va_arg (ap, unsigned long long)); - break; - case 'x': - sprintf (str, "%" PRIx64, - (uint64_t) va_arg (ap, unsigned long long)); - break; - case 'o': - sprintf (str, "%" PRIo64, - (uint64_t) va_arg (ap, unsigned long long)); - break; - default: - str = 0; - break; - } - break; - default: - str = 0; - break; - } - break; - default: - str = 0; - break; - } - - if (str) - { - buffer_grow (buffer, prev, f_old - prev - 1); - std::string p = xml_escape_text (str); - buffer_grow_str (buffer, p.c_str ()); - prev = f + 1; - } - percent = 0; - } - else if (*f == '%') - percent = 1; - } - - buffer_grow_str (buffer, prev); - va_end (ap); -} - diff --git a/gdb/gdbsupport/buffer.h b/gdb/gdbsupport/buffer.h deleted file mode 100644 index 6e4c167..0000000 --- a/gdb/gdbsupport/buffer.h +++ /dev/null @@ -1,68 +0,0 @@ -/* A simple growing buffer for GDB. - - Copyright (C) 2009-2020 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 COMMON_BUFFER_H -#define COMMON_BUFFER_H - -struct buffer -{ - char *buffer; - size_t buffer_size; /* allocated size */ - size_t used_size; /* actually used size */ -}; - -/* Append DATA of size SIZE to the end of BUFFER. Grows the buffer to - accommodate the new data. */ -void buffer_grow (struct buffer *buffer, const char *data, size_t size); - -/* Append C to the end of BUFFER. Grows the buffer to accommodate the - new data. */ - -static inline void -buffer_grow_char (struct buffer *buffer, char c) -{ - buffer_grow (buffer, &c, 1); -} - -/* Release any memory held by BUFFER. */ -void buffer_free (struct buffer *buffer); - -/* Initialize BUFFER. BUFFER holds no memory afterwards. */ -void buffer_init (struct buffer *buffer); - -/* Return a pointer into BUFFER data, effectively transferring - ownership of the buffer memory to the caller. Calling buffer_free - afterwards has no effect on the returned data. */ -char* buffer_finish (struct buffer *buffer); - -/* Simple printf to buffer function. Current implemented formatters: - %s - grow an xml escaped text in BUFFER. - %d - grow an signed integer in BUFFER. - %u - grow an unsigned integer in BUFFER. - %x - grow an unsigned integer formatted in hexadecimal in BUFFER. - %o - grow an unsigned integer formatted in octal in BUFFER. */ -void buffer_xml_printf (struct buffer *buffer, const char *format, ...) - ATTRIBUTE_PRINTF (2, 3); - -#define buffer_grow_str(BUFFER,STRING) \ - buffer_grow (BUFFER, STRING, strlen (STRING)) -#define buffer_grow_str0(BUFFER,STRING) \ - buffer_grow (BUFFER, STRING, strlen (STRING) + 1) - -#endif /* COMMON_BUFFER_H */ diff --git a/gdb/gdbsupport/byte-vector.h b/gdb/gdbsupport/byte-vector.h deleted file mode 100644 index f1fc0cf..0000000 --- a/gdb/gdbsupport/byte-vector.h +++ /dev/null @@ -1,63 +0,0 @@ -/* Copyright (C) 2017-2020 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 COMMON_BYTE_VECTOR_H -#define COMMON_BYTE_VECTOR_H - -#include "gdbsupport/def-vector.h" - -namespace gdb { - -/* byte_vector is a gdb_byte std::vector with a custom allocator that - unlike std::vector<gdb_byte> does not zero-initialize new elements - by default when the vector is created/resized. This is what you - usually want when working with byte buffers, since if you're - creating or growing a buffer you'll most surely want to fill it in - with data, in which case zero-initialization would be a - pessimization. For example: - - gdb::byte_vector buf (some_large_size); - fill_with_data (buf.data (), buf.size ()); - - On the odd case you do need zero initialization, then you can still - call the overloads that specify an explicit value, like: - - gdb::byte_vector buf (some_initial_size, 0); - buf.resize (a_bigger_size, 0); - - (Or use std::vector<gdb_byte> instead.) - - Note that unlike std::vector<gdb_byte>, function local - gdb::byte_vector objects constructed with an initial size like: - - gdb::byte_vector buf (some_size); - fill_with_data (buf.data (), buf.size ()); - - usually compile down to the exact same as: - - std::unique_ptr<byte[]> buf (new gdb_byte[some_size]); - fill_with_data (buf.get (), some_size); - - with the former having the advantage of being a bit more readable, - and providing the whole std::vector API, if you end up needing it. -*/ -using byte_vector = gdb::def_vector<gdb_byte>; -using char_vector = gdb::def_vector<char>; - -} /* namespace gdb */ - -#endif /* COMMON_DEF_VECTOR_H */ diff --git a/gdb/gdbsupport/cleanups.c b/gdb/gdbsupport/cleanups.c deleted file mode 100644 index 236bc17..0000000 --- a/gdb/gdbsupport/cleanups.c +++ /dev/null @@ -1,144 +0,0 @@ -/* Cleanup routines for GDB, the GNU debugger. - - Copyright (C) 1986-2020 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 "common-defs.h" -#include "cleanups.h" - -/* The cleanup list records things that have to be undone - if an error happens (descriptors to be closed, memory to be freed, etc.) - Each link in the chain records a function to call and an - argument to give it. - - Use make_cleanup to add an element to the cleanup chain. - Use do_cleanups to do all cleanup actions back to a given - point in the chain. Use discard_cleanups to remove cleanups - from the chain back to a given point, not doing them. - - If the argument is pointer to allocated memory, then you need - to additionally set the 'free_arg' member to a function that will - free that memory. This function will be called both when the cleanup - is executed and when it's discarded. */ - -struct cleanup -{ - struct cleanup *next; - void (*function) (void *); - void (*free_arg) (void *); - void *arg; -}; - -/* Used to mark the end of a cleanup chain. - The value is chosen so that it: - - is non-NULL so that make_cleanup never returns NULL, - - causes a segv if dereferenced - [though this won't catch errors that a value of, say, - ((struct cleanup *) -1) will] - - displays as something useful when printed in gdb. - This is const for a bit of extra robustness. - It is initialized to coax gcc into putting it into .rodata. - All fields are initialized to survive -Wextra. */ -static const struct cleanup sentinel_cleanup = { 0, 0, 0, 0 }; - -/* Handy macro to use when referring to sentinel_cleanup. */ -#define SENTINEL_CLEANUP ((struct cleanup *) &sentinel_cleanup) - -/* Chain of cleanup actions established with make_final_cleanup, - to be executed when gdb exits. */ -static struct cleanup *final_cleanup_chain = SENTINEL_CLEANUP; - -/* Main worker routine to create a cleanup. - PMY_CHAIN is a pointer to either cleanup_chain or final_cleanup_chain. - FUNCTION is the function to call to perform the cleanup. - ARG is passed to FUNCTION when called. - FREE_ARG, if non-NULL, is called after the cleanup is performed. - - The result is a pointer to the previous chain pointer - to be passed later to do_cleanups or discard_cleanups. */ - -static struct cleanup * -make_my_cleanup2 (struct cleanup **pmy_chain, make_cleanup_ftype *function, - void *arg, void (*free_arg) (void *)) -{ - struct cleanup *newobj = XNEW (struct cleanup); - struct cleanup *old_chain = *pmy_chain; - - newobj->next = *pmy_chain; - newobj->function = function; - newobj->free_arg = free_arg; - newobj->arg = arg; - *pmy_chain = newobj; - - gdb_assert (old_chain != NULL); - return old_chain; -} - -/* Worker routine to create a cleanup without a destructor. - PMY_CHAIN is a pointer to either cleanup_chain or final_cleanup_chain. - FUNCTION is the function to call to perform the cleanup. - ARG is passed to FUNCTION when called. - - The result is a pointer to the previous chain pointer - to be passed later to do_cleanups or discard_cleanups. */ - -static struct cleanup * -make_my_cleanup (struct cleanup **pmy_chain, make_cleanup_ftype *function, - void *arg) -{ - return make_my_cleanup2 (pmy_chain, function, arg, NULL); -} - -/* Add a new cleanup to the final cleanup_chain, - and return the previous chain pointer - to be passed later to do_cleanups or discard_cleanups. - Args are FUNCTION to clean up with, and ARG to pass to it. */ - -struct cleanup * -make_final_cleanup (make_cleanup_ftype *function, void *arg) -{ - return make_my_cleanup (&final_cleanup_chain, function, arg); -} - -/* Worker routine to perform cleanups. - PMY_CHAIN is a pointer to either cleanup_chain or final_cleanup_chain. - OLD_CHAIN is the result of a "make" cleanup routine. - Cleanups are performed until we get back to the old end of the chain. */ - -static void -do_my_cleanups (struct cleanup **pmy_chain, - struct cleanup *old_chain) -{ - struct cleanup *ptr; - - while ((ptr = *pmy_chain) != old_chain) - { - *pmy_chain = ptr->next; /* Do this first in case of recursion. */ - (*ptr->function) (ptr->arg); - if (ptr->free_arg) - (*ptr->free_arg) (ptr->arg); - xfree (ptr); - } -} - -/* Discard final cleanups and do the actions they describe. */ - -void -do_final_cleanups () -{ - do_my_cleanups (&final_cleanup_chain, SENTINEL_CLEANUP); -} diff --git a/gdb/gdbsupport/cleanups.h b/gdb/gdbsupport/cleanups.h deleted file mode 100644 index 6c4e388..0000000 --- a/gdb/gdbsupport/cleanups.h +++ /dev/null @@ -1,39 +0,0 @@ -/* Cleanups. - Copyright (C) 1986-2020 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 COMMON_CLEANUPS_H -#define COMMON_CLEANUPS_H - -/* Outside of cleanups.c, this is an opaque type. */ -struct cleanup; - -/* NOTE: cagney/2000-03-04: This typedef is strictly for the - make_cleanup function declarations below. Do not use this typedef - as a cast when passing functions into the make_cleanup() code. - Instead either use a bounce function or add a wrapper function. - Calling a f(char*) function with f(void*) is non-portable. */ -typedef void (make_cleanup_ftype) (void *); - -/* Function type for the dtor in make_cleanup_dtor. */ -typedef void (make_cleanup_dtor_ftype) (void *); - -extern struct cleanup *make_final_cleanup (make_cleanup_ftype *, void *); - -extern void do_final_cleanups (); - -#endif /* COMMON_CLEANUPS_H */ diff --git a/gdb/gdbsupport/common-debug.c b/gdb/gdbsupport/common-debug.c deleted file mode 100644 index d1131a0..0000000 --- a/gdb/gdbsupport/common-debug.c +++ /dev/null @@ -1,37 +0,0 @@ -/* Debug printing functions. - - Copyright (C) 2014-2020 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 "common-defs.h" -#include "common-debug.h" - -/* See gdbsupport/common-debug.h. */ - -bool show_debug_regs; - -/* See gdbsupport/common-debug.h. */ - -void -debug_printf (const char *fmt, ...) -{ - va_list ap; - - va_start (ap, fmt); - debug_vprintf (fmt, ap); - va_end (ap); -} diff --git a/gdb/gdbsupport/common-debug.h b/gdb/gdbsupport/common-debug.h deleted file mode 100644 index 9934ec5..0000000 --- a/gdb/gdbsupport/common-debug.h +++ /dev/null @@ -1,41 +0,0 @@ -/* Declarations for debug printing functions. - - Copyright (C) 2014-2020 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 COMMON_COMMON_DEBUG_H -#define COMMON_COMMON_DEBUG_H - -/* Set to true to enable debugging of hardware breakpoint/ - watchpoint support code. */ - -extern bool show_debug_regs; - -/* Print a formatted message to the appropriate channel for - debugging output for the client. */ - -extern void debug_printf (const char *format, ...) - ATTRIBUTE_PRINTF (1, 2); - -/* Print a formatted message to the appropriate channel for - debugging output for the client. This function must be - provided by the client. */ - -extern void debug_vprintf (const char *format, va_list ap) - ATTRIBUTE_PRINTF (1, 0); - -#endif /* COMMON_COMMON_DEBUG_H */ diff --git a/gdb/gdbsupport/common-defs.h b/gdb/gdbsupport/common-defs.h deleted file mode 100644 index 214bca1..0000000 --- a/gdb/gdbsupport/common-defs.h +++ /dev/null @@ -1,154 +0,0 @@ -/* Common definitions. - - Copyright (C) 1986-2020 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 COMMON_COMMON_DEFS_H -#define COMMON_COMMON_DEFS_H - -#include "config.h" - -#undef PACKAGE_NAME -#undef PACKAGE_VERSION -#undef PACKAGE_STRING -#undef PACKAGE_TARNAME - -#ifdef GDBSERVER -#include "build-gnulib-gdbserver/config.h" -#else -#include "../../gnulib/config.h" -#endif - -#undef PACKAGE_NAME -#undef PACKAGE_VERSION -#undef PACKAGE_STRING -#undef PACKAGE_TARNAME - -/* From: - https://www.gnu.org/software/gnulib/manual/html_node/stdint_002eh.html - - "On some hosts that predate C++11, when using C++ one must define - __STDC_CONSTANT_MACROS to make visible the definitions of constant - macros such as INTMAX_C, and one must define __STDC_LIMIT_MACROS to - make visible the definitions of limit macros such as INTMAX_MAX.". - - And: - https://www.gnu.org/software/gnulib/manual/html_node/inttypes_002eh.html - - "On some hosts that predate C++11, when using C++ one must define - __STDC_FORMAT_MACROS to make visible the declarations of format - macros such as PRIdMAX." - - Must do this before including any system header, since other system - headers may include stdint.h/inttypes.h. */ -#define __STDC_CONSTANT_MACROS 1 -#define __STDC_LIMIT_MACROS 1 -#define __STDC_FORMAT_MACROS 1 - -/* Some distros enable _FORTIFY_SOURCE by default, which on occasion - has caused build failures with -Wunused-result when a patch is - developed on a distro that does not enable _FORTIFY_SOURCE. We - enable it here in order to try to catch these problems earlier; - plus this seems like a reasonable safety measure. The check for - optimization is required because _FORTIFY_SOURCE only works when - optimization is enabled. If _FORTIFY_SOURCE is already defined, - then we don't do anything. Also, on MinGW, fortify requires - linking to -lssp, and to avoid the hassle of checking for - that and linking to it statically, we just don't define - _FORTIFY_SOURCE there. */ - -#if (!defined _FORTIFY_SOURCE && defined __OPTIMIZE__ && __OPTIMIZE__ > 0 \ - && !defined(__MINGW32__)) -#define _FORTIFY_SOURCE 2 -#endif - -/* We don't support Windows versions before XP, so we define - _WIN32_WINNT correspondingly to ensure the Windows API headers - expose the required symbols. */ -#if defined (__MINGW32__) || defined (__CYGWIN__) -# ifdef _WIN32_WINNT -# if _WIN32_WINNT < 0x0501 -# undef _WIN32_WINNT -# define _WIN32_WINNT 0x0501 -# endif -# else -# define _WIN32_WINNT 0x0501 -# endif -#endif /* __MINGW32__ || __CYGWIN__ */ - -#include <stdarg.h> -#include <stdio.h> -#include <stdlib.h> -#include <stddef.h> -#include <stdint.h> -#include <string.h> -#ifdef HAVE_STRINGS_H -#include <strings.h> /* for strcasecmp and strncasecmp */ -#endif -#include <errno.h> -#include <alloca.h> - -#include "ansidecl.h" -/* This is defined by ansidecl.h, but we prefer gnulib's version. On - MinGW, gnulib might enable __USE_MINGW_ANSI_STDIO, which may or not - require use of attribute gnu_printf instead of printf. gnulib - checks that at configure time. Since _GL_ATTRIBUTE_FORMAT_PRINTF - is compatible with ATTRIBUTE_PRINTF, simply use it. */ -#undef ATTRIBUTE_PRINTF -#define ATTRIBUTE_PRINTF _GL_ATTRIBUTE_FORMAT_PRINTF - -#if GCC_VERSION >= 3004 -#define ATTRIBUTE_UNUSED_RESULT __attribute__ ((__warn_unused_result__)) -#else -#define ATTRIBUTE_UNUSED_RESULT -#endif - -#include "libiberty.h" -#include "pathmax.h" -#include "gdb/signals.h" -#include "gdb_locale.h" -#include "ptid.h" -#include "common-types.h" -#include "common-utils.h" -#include "gdb_assert.h" -#include "errors.h" -#include "print-utils.h" -#include "common-debug.h" -#include "cleanups.h" -#include "common-exceptions.h" -#include "gdbsupport/poison.h" - -#define EXTERN_C extern "C" -#define EXTERN_C_PUSH extern "C" { -#define EXTERN_C_POP } - -/* Pull in gdb::unique_xmalloc_ptr. */ -#include "gdbsupport/gdb_unique_ptr.h" - -/* String containing the current directory (what getwd would return). */ -extern char *current_directory; - -/* sbrk on macOS is not useful for our purposes, since sbrk(0) always - returns the same value. brk/sbrk on macOS is just an emulation - that always returns a pointer to a 4MB section reserved for - that. */ - -#if defined (HAVE_SBRK) && !__APPLE__ -#define HAVE_USEFUL_SBRK 1 -#endif - -#endif /* COMMON_COMMON_DEFS_H */ diff --git a/gdb/gdbsupport/common-exceptions.c b/gdb/gdbsupport/common-exceptions.c deleted file mode 100644 index 0cc515b..0000000 --- a/gdb/gdbsupport/common-exceptions.c +++ /dev/null @@ -1,235 +0,0 @@ -/* Exception (throw catch) mechanism, for GDB, the GNU debugger. - - Copyright (C) 1986-2020 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 "common-defs.h" -#include "common-exceptions.h" -#include <forward_list> - -/* Possible catcher states. */ -enum catcher_state { - /* Initial state, a new catcher has just been created. */ - CATCHER_CREATED, - /* The catch code is running. */ - CATCHER_RUNNING, - CATCHER_RUNNING_1, - /* The catch code threw an exception. */ - CATCHER_ABORTING -}; - -/* Possible catcher actions. */ -enum catcher_action { - CATCH_ITER, - CATCH_ITER_1, - CATCH_THROWING -}; - -struct catcher -{ - enum catcher_state state = CATCHER_CREATED; - /* Jump buffer pointing back at the exception handler. */ - jmp_buf buf; - /* Status buffer belonging to the exception handler. */ - struct gdb_exception exception; -}; - -/* Where to go for throw_exception(). */ -static std::forward_list<struct catcher> catchers; - -jmp_buf * -exceptions_state_mc_init () -{ - catchers.emplace_front (); - return &catchers.front ().buf; -} - -/* Catcher state machine. Returns non-zero if the m/c should be run - again, zero if it should abort. */ - -static int -exceptions_state_mc (enum catcher_action action) -{ - switch (catchers.front ().state) - { - case CATCHER_CREATED: - switch (action) - { - case CATCH_ITER: - /* Allow the code to run the catcher. */ - catchers.front ().state = CATCHER_RUNNING; - return 1; - default: - internal_error (__FILE__, __LINE__, _("bad state")); - } - case CATCHER_RUNNING: - switch (action) - { - case CATCH_ITER: - /* No error/quit has occured. */ - return 0; - case CATCH_ITER_1: - catchers.front ().state = CATCHER_RUNNING_1; - return 1; - case CATCH_THROWING: - catchers.front ().state = CATCHER_ABORTING; - /* See also throw_exception. */ - return 1; - default: - internal_error (__FILE__, __LINE__, _("bad switch")); - } - case CATCHER_RUNNING_1: - switch (action) - { - case CATCH_ITER: - /* The did a "break" from the inner while loop. */ - return 0; - case CATCH_ITER_1: - catchers.front ().state = CATCHER_RUNNING; - return 0; - case CATCH_THROWING: - catchers.front ().state = CATCHER_ABORTING; - /* See also throw_exception. */ - return 1; - default: - internal_error (__FILE__, __LINE__, _("bad switch")); - } - case CATCHER_ABORTING: - switch (action) - { - case CATCH_ITER: - { - /* Exit normally if this catcher can handle this - exception. The caller analyses the func return - values. */ - return 0; - } - default: - internal_error (__FILE__, __LINE__, _("bad state")); - } - default: - internal_error (__FILE__, __LINE__, _("bad switch")); - } -} - -int -exceptions_state_mc_catch (struct gdb_exception *exception, - int mask) -{ - *exception = std::move (catchers.front ().exception); - catchers.pop_front (); - - if (exception->reason < 0) - { - if (mask & RETURN_MASK (exception->reason)) - { - /* Exit normally and let the caller handle the - exception. */ - return 1; - } - - /* The caller didn't request that the event be caught, relay the - event to the next exception_catch/CATCH_SJLJ. */ - throw_exception_sjlj (*exception); - } - - /* No exception was thrown. */ - return 0; -} - -int -exceptions_state_mc_action_iter (void) -{ - return exceptions_state_mc (CATCH_ITER); -} - -int -exceptions_state_mc_action_iter_1 (void) -{ - return exceptions_state_mc (CATCH_ITER_1); -} - -/* Return EXCEPTION to the nearest containing CATCH_SJLJ block. */ - -void -throw_exception_sjlj (const struct gdb_exception &exception) -{ - /* Jump to the nearest CATCH_SJLJ block, communicating REASON to - that call via setjmp's return value. Note that REASON can't be - zero, by definition in common-exceptions.h. */ - exceptions_state_mc (CATCH_THROWING); - enum return_reason reason = exception.reason; - catchers.front ().exception = exception; - longjmp (catchers.front ().buf, reason); -} - -/* Implementation of throw_exception that uses C++ try/catch. */ - -void -throw_exception (gdb_exception &&exception) -{ - if (exception.reason == RETURN_QUIT) - throw gdb_exception_quit (std::move (exception)); - else if (exception.reason == RETURN_ERROR) - throw gdb_exception_error (std::move (exception)); - else - gdb_assert_not_reached ("invalid return reason"); -} - -static void ATTRIBUTE_NORETURN ATTRIBUTE_PRINTF (3, 0) -throw_it (enum return_reason reason, enum errors error, const char *fmt, - va_list ap) -{ - if (reason == RETURN_QUIT) - throw gdb_exception_quit (fmt, ap); - else if (reason == RETURN_ERROR) - throw gdb_exception_error (error, fmt, ap); - else - gdb_assert_not_reached ("invalid return reason"); -} - -void -throw_verror (enum errors error, const char *fmt, va_list ap) -{ - throw_it (RETURN_ERROR, error, fmt, ap); -} - -void -throw_vquit (const char *fmt, va_list ap) -{ - throw_it (RETURN_QUIT, GDB_NO_ERROR, fmt, ap); -} - -void -throw_error (enum errors error, const char *fmt, ...) -{ - va_list args; - - va_start (args, fmt); - throw_verror (error, fmt, args); - va_end (args); -} - -void -throw_quit (const char *fmt, ...) -{ - va_list args; - - va_start (args, fmt); - throw_vquit (fmt, args); - va_end (args); -} diff --git a/gdb/gdbsupport/common-exceptions.h b/gdb/gdbsupport/common-exceptions.h deleted file mode 100644 index 76d916f..0000000 --- a/gdb/gdbsupport/common-exceptions.h +++ /dev/null @@ -1,304 +0,0 @@ -/* Exception (throw catch) mechanism, for GDB, the GNU debugger. - - Copyright (C) 1986-2020 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 COMMON_COMMON_EXCEPTIONS_H -#define COMMON_COMMON_EXCEPTIONS_H - -#include <setjmp.h> -#include <new> -#include <memory> -#include <string> - -/* Reasons for calling throw_exceptions(). NOTE: all reason values - must be different from zero. enum value 0 is reserved for internal - use as the return value from an initial setjmp(). */ - -enum return_reason - { - /* User interrupt. */ - RETURN_QUIT = -2, - /* Any other error. */ - RETURN_ERROR - }; - -#define RETURN_MASK(reason) (1 << (int)(-reason)) - -typedef enum -{ - RETURN_MASK_QUIT = RETURN_MASK (RETURN_QUIT), - RETURN_MASK_ERROR = RETURN_MASK (RETURN_ERROR), - RETURN_MASK_ALL = (RETURN_MASK_QUIT | RETURN_MASK_ERROR) -} return_mask; - -/* Describe all exceptions. */ - -enum errors { - GDB_NO_ERROR, - - /* Any generic error, the corresponding text is in - exception.message. */ - GENERIC_ERROR, - - /* Something requested was not found. */ - NOT_FOUND_ERROR, - - /* Thread library lacks support necessary for finding thread local - storage. */ - TLS_NO_LIBRARY_SUPPORT_ERROR, - - /* Load module not found while attempting to find thread local storage. */ - TLS_LOAD_MODULE_NOT_FOUND_ERROR, - - /* Thread local storage has not been allocated yet. */ - TLS_NOT_ALLOCATED_YET_ERROR, - - /* Something else went wrong while attempting to find thread local - storage. The ``struct gdb_exception'' message field provides - more detail. */ - TLS_GENERIC_ERROR, - - /* Problem parsing an XML document. */ - XML_PARSE_ERROR, - - /* Error accessing memory. */ - MEMORY_ERROR, - - /* Value not available. E.g., a register was not collected in a - traceframe. */ - NOT_AVAILABLE_ERROR, - - /* Value was optimized out. Note: if the value was a register, this - means the register was not saved in the frame. */ - OPTIMIZED_OUT_ERROR, - - /* DW_OP_entry_value resolving failed. */ - NO_ENTRY_VALUE_ERROR, - - /* Target throwing an error has been closed. Current command should be - aborted as the inferior state is no longer valid. */ - TARGET_CLOSE_ERROR, - - /* An undefined command was executed. */ - UNDEFINED_COMMAND_ERROR, - - /* Requested feature, method, mechanism, etc. is not supported. */ - NOT_SUPPORTED_ERROR, - - /* The number of candidates generated during line completion has - reached the user's specified limit. This isn't an error, this exception - is used to halt searching for more completions, but for consistency - "_ERROR" is appended to the name. */ - MAX_COMPLETIONS_REACHED_ERROR, - - /* Add more errors here. */ - NR_ERRORS -}; - -struct gdb_exception -{ - gdb_exception () - : reason ((enum return_reason) 0), - error (GDB_NO_ERROR) - { - } - - gdb_exception (enum return_reason r, enum errors e) - : reason (r), - error (e) - { - } - - gdb_exception (enum return_reason r, enum errors e, - const char *fmt, va_list ap) - ATTRIBUTE_PRINTF (4, 0) - : reason (r), - error (e), - message (std::make_shared<std::string> (string_vprintf (fmt, ap))) - { - } - - /* The move constructor exists so that we can mark it "noexcept", - which is a good practice for any sort of exception object. */ - explicit gdb_exception (gdb_exception &&other) noexcept = default; - - /* The copy constructor exists so that we can mark it "noexcept", - which is a good practice for any sort of exception object. */ - gdb_exception (const gdb_exception &other) noexcept - : reason (other.reason), - error (other.error), - message (other.message) - { - } - - /* The assignment operator exists so that we can mark it "noexcept", - which is a good practice for any sort of exception object. */ - gdb_exception &operator= (const gdb_exception &other) noexcept - { - reason = other.reason; - error = other.error; - message = other.message; - return *this; - } - - gdb_exception &operator= (gdb_exception &&other) noexcept = default; - - /* Return the contents of the exception message, as a C string. The - string remains owned by the exception object. */ - const char *what () const noexcept - { - return message->c_str (); - } - - enum return_reason reason; - enum errors error; - std::shared_ptr<std::string> message; -}; - -/* Functions to drive the sjlj-based exceptions state machine. Though - declared here by necessity, these functions should be considered - internal to the exceptions subsystem and not used other than via - the TRY/CATCH (or TRY_SJLJ/CATCH_SJLJ) macros defined below. */ - -extern jmp_buf *exceptions_state_mc_init (void); -extern int exceptions_state_mc_action_iter (void); -extern int exceptions_state_mc_action_iter_1 (void); -extern int exceptions_state_mc_catch (struct gdb_exception *, int); - -/* Macro to wrap up standard try/catch behavior. - - The double loop lets us correctly handle code "break"ing out of the - try catch block. (It works as the "break" only exits the inner - "while" loop, the outer for loop detects this handling it - correctly.) Of course "return" and "goto" are not so lucky. - - For instance: - - *INDENT-OFF* - - TRY_SJLJ - { - } - CATCH_SJLJ (e, RETURN_MASK_ERROR) - { - switch (e.reason) - { - case RETURN_ERROR: ... - } - } - END_CATCH_SJLJ - - The SJLJ variants are needed in some cases where gdb exceptions - need to cross third-party library code compiled without exceptions - support (e.g., readline). */ - -#define TRY_SJLJ \ - { \ - jmp_buf *buf = \ - exceptions_state_mc_init (); \ - setjmp (*buf); \ - } \ - while (exceptions_state_mc_action_iter ()) \ - while (exceptions_state_mc_action_iter_1 ()) - -#define CATCH_SJLJ(EXCEPTION, MASK) \ - { \ - struct gdb_exception EXCEPTION; \ - if (exceptions_state_mc_catch (&(EXCEPTION), MASK)) - -#define END_CATCH_SJLJ \ - } - -/* The exception types client code may catch. They're just shims - around gdb_exception that add nothing but type info. Which is used - is selected depending on the MASK argument passed to CATCH. */ - -struct gdb_exception_error : public gdb_exception -{ - gdb_exception_error (enum errors e, const char *fmt, va_list ap) - ATTRIBUTE_PRINTF (3, 0) - : gdb_exception (RETURN_ERROR, e, fmt, ap) - { - } - - explicit gdb_exception_error (gdb_exception &&ex) noexcept - : gdb_exception (std::move (ex)) - { - gdb_assert (ex.reason == RETURN_ERROR); - } -}; - -struct gdb_exception_quit : public gdb_exception -{ - gdb_exception_quit (const char *fmt, va_list ap) - ATTRIBUTE_PRINTF (2, 0) - : gdb_exception (RETURN_QUIT, GDB_NO_ERROR, fmt, ap) - { - } - - explicit gdb_exception_quit (gdb_exception &&ex) noexcept - : gdb_exception (std::move (ex)) - { - gdb_assert (ex.reason == RETURN_QUIT); - } -}; - -/* An exception type that inherits from both std::bad_alloc and a gdb - exception. This is necessary because operator new can only throw - std::bad_alloc, and OTOH, we want exceptions thrown due to memory - allocation error to be caught by all the CATCH/RETURN_MASK_ALL - spread around the codebase. */ - -struct gdb_quit_bad_alloc - : public gdb_exception_quit, - public std::bad_alloc -{ - explicit gdb_quit_bad_alloc (gdb_exception &&ex) noexcept - : gdb_exception_quit (std::move (ex)), - std::bad_alloc () - { - } -}; - -/* *INDENT-ON* */ - -/* Throw an exception (as described by "struct gdb_exception"), - landing in the inner most containing exception handler established - using TRY/CATCH. */ -extern void throw_exception (gdb_exception &&exception) - ATTRIBUTE_NORETURN; - -/* Throw an exception by executing a LONG JUMP to the inner most - containing exception handler established using TRY_SJLJ. Necessary - in some cases where we need to throw GDB exceptions across - third-party library code (e.g., readline). */ -extern void throw_exception_sjlj (const struct gdb_exception &exception) - ATTRIBUTE_NORETURN; - -/* Convenience wrappers around throw_exception that throw GDB - errors. */ -extern void throw_verror (enum errors, const char *fmt, va_list ap) - ATTRIBUTE_NORETURN ATTRIBUTE_PRINTF (2, 0); -extern void throw_vquit (const char *fmt, va_list ap) - ATTRIBUTE_NORETURN ATTRIBUTE_PRINTF (1, 0); -extern void throw_error (enum errors error, const char *fmt, ...) - ATTRIBUTE_NORETURN ATTRIBUTE_PRINTF (2, 3); -extern void throw_quit (const char *fmt, ...) - ATTRIBUTE_NORETURN ATTRIBUTE_PRINTF (1, 2); - -#endif /* COMMON_COMMON_EXCEPTIONS_H */ diff --git a/gdb/gdbsupport/common-gdbthread.h b/gdb/gdbsupport/common-gdbthread.h deleted file mode 100644 index 050ad80..0000000 --- a/gdb/gdbsupport/common-gdbthread.h +++ /dev/null @@ -1,28 +0,0 @@ -/* Common multi-process/thread control defs for GDB and gdbserver. - Copyright (C) 1987-2020 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 COMMON_COMMON_GDBTHREAD_H -#define COMMON_COMMON_GDBTHREAD_H - -struct process_stratum_target; - -/* Switch from one thread to another. */ -extern void switch_to_thread (process_stratum_target *proc_target, - ptid_t ptid); - -#endif /* COMMON_COMMON_GDBTHREAD_H */ diff --git a/gdb/gdbsupport/common-inferior.c b/gdb/gdbsupport/common-inferior.c deleted file mode 100644 index ed16e89..0000000 --- a/gdb/gdbsupport/common-inferior.c +++ /dev/null @@ -1,26 +0,0 @@ -/* Functions to deal with the inferior being executed on GDB or - GDBserver. - - Copyright (C) 2019-2020 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/common-inferior.h" - -/* See common-inferior.h. */ - -bool startup_with_shell = true; diff --git a/gdb/gdbsupport/common-inferior.h b/gdb/gdbsupport/common-inferior.h deleted file mode 100644 index 3c8e87a..0000000 --- a/gdb/gdbsupport/common-inferior.h +++ /dev/null @@ -1,61 +0,0 @@ -/* Functions to deal with the inferior being executed on GDB or - GDBserver. - - Copyright (C) 1986-2020 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 COMMON_COMMON_INFERIOR_H -#define COMMON_COMMON_INFERIOR_H - -/* Return the exec wrapper to be used when starting the inferior, or NULL - otherwise. */ -extern const char *get_exec_wrapper (); - -/* Return the name of the executable file as a string. - ERR nonzero means get error if there is none specified; - otherwise return 0 in that case. */ -extern const char *get_exec_file (int err); - -/* Return the inferior's current working directory. If nothing has - been set, then return NULL. */ -extern const char *get_inferior_cwd (); - -/* Set the inferior current working directory. If CWD is NULL, unset - the directory. */ -extern void set_inferior_cwd (const char *cwd); - -/* Whether to start up the debuggee under a shell. - - If startup-with-shell is set, GDB's "run" will attempt to start up - the debuggee under a shell. This also happens when using GDBserver - under extended remote mode. - - This is in order for argument-expansion to occur. E.g., - - (gdb) run * - - The "*" gets expanded by the shell into a list of files. - - While this is a nice feature, it may be handy to bypass the shell - in some cases. To disable this feature, do "set startup-with-shell - false". - - The catch-exec traps expected during start-up will be one more if - the target is started up with a shell. */ -extern bool startup_with_shell; - -#endif /* COMMON_COMMON_INFERIOR_H */ diff --git a/gdb/gdbsupport/common-regcache.c b/gdb/gdbsupport/common-regcache.c deleted file mode 100644 index 86b3a36..0000000 --- a/gdb/gdbsupport/common-regcache.c +++ /dev/null @@ -1,36 +0,0 @@ -/* Cache and manage the values of registers for GDB, the GNU debugger. - - Copyright (C) 2015-2020 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 "common-defs.h" -#include "common-regcache.h" - -/* Return the register's value or throw if it's not available. */ - -ULONGEST -regcache_raw_get_unsigned (struct regcache *regcache, int regnum) -{ - ULONGEST value; - enum register_status status; - - status = regcache_raw_read_unsigned (regcache, regnum, &value); - if (status == REG_UNAVAILABLE) - throw_error (NOT_AVAILABLE_ERROR, - _("Register %d is not available"), regnum); - return value; -} diff --git a/gdb/gdbsupport/common-regcache.h b/gdb/gdbsupport/common-regcache.h deleted file mode 100644 index 18446ff..0000000 --- a/gdb/gdbsupport/common-regcache.h +++ /dev/null @@ -1,85 +0,0 @@ -/* Cache and manage the values of registers - - Copyright (C) 2014-2020 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 COMMON_COMMON_REGCACHE_H -#define COMMON_COMMON_REGCACHE_H - -/* This header is a stopgap until we have an independent regcache. */ - -enum register_status : signed char - { - /* The register value is not in the cache, and we don't know yet - whether it's available in the target (or traceframe). */ - REG_UNKNOWN = 0, - - /* The register value is valid and cached. */ - REG_VALID = 1, - - /* The register value is unavailable. E.g., we're inspecting a - traceframe, and this register wasn't collected. Note that this - is different a different "unavailable" from saying the register - does not exist in the target's architecture --- in that case, - the target should have given us a target description that does - not include the register in the first place. */ - REG_UNAVAILABLE = -1 - }; - -/* Return a pointer to the register cache associated with the - thread specified by PTID. This function must be provided by - the client. */ - -extern struct regcache *get_thread_regcache_for_ptid (ptid_t ptid); - -/* Return the size of register numbered N in REGCACHE. This function - must be provided by the client. */ - -extern int regcache_register_size (const struct regcache *regcache, int n); - -/* Read the PC register. This function must be provided by the - client. */ - -extern CORE_ADDR regcache_read_pc (struct regcache *regcache); - -/* Read a raw register into a unsigned integer. */ -extern enum register_status regcache_raw_read_unsigned - (struct regcache *regcache, int regnum, ULONGEST *val); - -ULONGEST regcache_raw_get_unsigned (struct regcache *regcache, int regnum); - -struct reg_buffer_common -{ - virtual ~reg_buffer_common () = default; - - /* Get the availability status of the value of register REGNUM in this - buffer. */ - virtual register_status get_register_status (int regnum) const = 0; - - /* Supply register REGNUM, whose contents are stored in BUF, to REGCACHE. */ - virtual void raw_supply (int regnum, const void *buf) = 0; - - /* Collect register REGNUM from REGCACHE and store its contents in BUF. */ - virtual void raw_collect (int regnum, void *buf) const = 0; - - /* Compare the contents of the register stored in the regcache (ignoring the - first OFFSET bytes) to the contents of BUF (without any offset). Returns - true if the same. */ - virtual bool raw_compare (int regnum, const void *buf, int offset) const = 0; -}; - -#endif /* COMMON_COMMON_REGCACHE_H */ diff --git a/gdb/gdbsupport/common-types.h b/gdb/gdbsupport/common-types.h deleted file mode 100644 index 61099b4..0000000 --- a/gdb/gdbsupport/common-types.h +++ /dev/null @@ -1,66 +0,0 @@ -/* Declarations for common types. - - Copyright (C) 1986-2020 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 COMMON_COMMON_TYPES_H -#define COMMON_COMMON_TYPES_H - -#ifdef GDBSERVER - -/* * A byte from the program being debugged. */ -typedef unsigned char gdb_byte; - -typedef unsigned long long CORE_ADDR; - -typedef long long LONGEST; -typedef unsigned long long ULONGEST; - -#else /* GDBSERVER */ - -#include "bfd.h" - -/* * A byte from the program being debugged. */ -typedef bfd_byte gdb_byte; - -/* * An address in the program being debugged. Host byte order. */ -typedef bfd_vma CORE_ADDR; - -/* This is to make sure that LONGEST is at least as big as CORE_ADDR. */ - -#ifdef BFD64 - -typedef BFD_HOST_64_BIT LONGEST; -typedef BFD_HOST_U_64_BIT ULONGEST; - -#else /* No BFD64 */ - -typedef long long LONGEST; -typedef unsigned long long ULONGEST; - -#endif /* No BFD64 */ -#endif /* GDBSERVER */ - -/* * The largest CORE_ADDR value. */ -#define CORE_ADDR_MAX (~(CORE_ADDR) 0) - -/* * The largest ULONGEST value. */ -#define ULONGEST_MAX (~(ULONGEST) 0) - -enum tribool { TRIBOOL_UNKNOWN = -1, TRIBOOL_FALSE = 0, TRIBOOL_TRUE = 1 }; - -#endif /* COMMON_COMMON_TYPES_H */ diff --git a/gdb/gdbsupport/common-utils.c b/gdb/gdbsupport/common-utils.c deleted file mode 100644 index ed05d61..0000000 --- a/gdb/gdbsupport/common-utils.c +++ /dev/null @@ -1,417 +0,0 @@ -/* Shared general utility routines for GDB, the GNU debugger. - - Copyright (C) 1986-2020 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 "common-defs.h" -#include "common-utils.h" -#include "host-defs.h" -#include <ctype.h> - -void * -xzalloc (size_t size) -{ - return xcalloc (1, size); -} - -/* Like asprintf/vasprintf but get an internal_error if the call - fails. */ - -char * -xstrprintf (const char *format, ...) -{ - char *ret; - va_list args; - - va_start (args, format); - ret = xstrvprintf (format, args); - va_end (args); - return ret; -} - -char * -xstrvprintf (const char *format, va_list ap) -{ - char *ret = NULL; - int status = vasprintf (&ret, format, ap); - - /* NULL is returned when there was a memory allocation problem, or - any other error (for instance, a bad format string). A negative - status (the printed length) with a non-NULL buffer should never - happen, but just to be sure. */ - if (ret == NULL || status < 0) - internal_error (__FILE__, __LINE__, _("vasprintf call failed")); - return ret; -} - -int -xsnprintf (char *str, size_t size, const char *format, ...) -{ - va_list args; - int ret; - - va_start (args, format); - ret = vsnprintf (str, size, format, args); - gdb_assert (ret < size); - va_end (args); - - return ret; -} - -/* See documentation in common-utils.h. */ - -std::string -string_printf (const char* fmt, ...) -{ - va_list vp; - int size; - - va_start (vp, fmt); - size = vsnprintf (NULL, 0, fmt, vp); - va_end (vp); - - std::string str (size, '\0'); - - /* C++11 and later guarantee std::string uses contiguous memory and - always includes the terminating '\0'. */ - va_start (vp, fmt); - vsprintf (&str[0], fmt, vp); /* ARI: vsprintf */ - va_end (vp); - - return str; -} - -/* See documentation in common-utils.h. */ - -std::string -string_vprintf (const char* fmt, va_list args) -{ - va_list vp; - size_t size; - - va_copy (vp, args); - size = vsnprintf (NULL, 0, fmt, vp); - va_end (vp); - - std::string str (size, '\0'); - - /* C++11 and later guarantee std::string uses contiguous memory and - always includes the terminating '\0'. */ - vsprintf (&str[0], fmt, args); /* ARI: vsprintf */ - - return str; -} - - -/* See documentation in common-utils.h. */ - -void -string_appendf (std::string &str, const char *fmt, ...) -{ - va_list vp; - - va_start (vp, fmt); - string_vappendf (str, fmt, vp); - va_end (vp); -} - - -/* See documentation in common-utils.h. */ - -void -string_vappendf (std::string &str, const char *fmt, va_list args) -{ - va_list vp; - int grow_size; - - va_copy (vp, args); - grow_size = vsnprintf (NULL, 0, fmt, vp); - va_end (vp); - - size_t curr_size = str.size (); - str.resize (curr_size + grow_size); - - /* C++11 and later guarantee std::string uses contiguous memory and - always includes the terminating '\0'. */ - vsprintf (&str[curr_size], fmt, args); /* ARI: vsprintf */ -} - -char * -savestring (const char *ptr, size_t len) -{ - char *p = (char *) xmalloc (len + 1); - - memcpy (p, ptr, len); - p[len] = 0; - return p; -} - -/* See documentation in common-utils.h. */ - -std::string -extract_string_maybe_quoted (const char **arg) -{ - bool squote = false; - bool dquote = false; - bool bsquote = false; - std::string result; - const char *p = *arg; - - /* Find the start of the argument. */ - p = skip_spaces (p); - - /* Parse p similarly to gdb_argv buildargv function. */ - while (*p != '\0') - { - if (isspace (*p) && !squote && !dquote && !bsquote) - break; - else - { - if (bsquote) - { - bsquote = false; - result += *p; - } - else if (*p == '\\') - bsquote = true; - else if (squote) - { - if (*p == '\'') - squote = false; - else - result += *p; - } - else if (dquote) - { - if (*p == '"') - dquote = false; - else - result += *p; - } - else - { - if (*p == '\'') - squote = true; - else if (*p == '"') - dquote = true; - else - result += *p; - } - p++; - } - } - - *arg = p; - return result; -} - -/* The bit offset of the highest byte in a ULONGEST, for overflow - checking. */ - -#define HIGH_BYTE_POSN ((sizeof (ULONGEST) - 1) * HOST_CHAR_BIT) - -/* True (non-zero) iff DIGIT is a valid digit in radix BASE, - where 2 <= BASE <= 36. */ - -static int -is_digit_in_base (unsigned char digit, int base) -{ - if (!isalnum (digit)) - return 0; - if (base <= 10) - return (isdigit (digit) && digit < base + '0'); - else - return (isdigit (digit) || tolower (digit) < base - 10 + 'a'); -} - -static int -digit_to_int (unsigned char c) -{ - if (isdigit (c)) - return c - '0'; - else - return tolower (c) - 'a' + 10; -} - -/* As for strtoul, but for ULONGEST results. */ - -ULONGEST -strtoulst (const char *num, const char **trailer, int base) -{ - unsigned int high_part; - ULONGEST result; - int minus = 0; - int i = 0; - - /* Skip leading whitespace. */ - while (isspace (num[i])) - i++; - - /* Handle prefixes. */ - if (num[i] == '+') - i++; - else if (num[i] == '-') - { - minus = 1; - i++; - } - - if (base == 0 || base == 16) - { - if (num[i] == '0' && (num[i + 1] == 'x' || num[i + 1] == 'X')) - { - i += 2; - if (base == 0) - base = 16; - } - } - - if (base == 0 && num[i] == '0') - base = 8; - - if (base == 0) - base = 10; - - if (base < 2 || base > 36) - { - errno = EINVAL; - return 0; - } - - result = high_part = 0; - for (; is_digit_in_base (num[i], base); i += 1) - { - result = result * base + digit_to_int (num[i]); - high_part = high_part * base + (unsigned int) (result >> HIGH_BYTE_POSN); - result &= ((ULONGEST) 1 << HIGH_BYTE_POSN) - 1; - if (high_part > 0xff) - { - errno = ERANGE; - result = ~ (ULONGEST) 0; - high_part = 0; - minus = 0; - break; - } - } - - if (trailer != NULL) - *trailer = &num[i]; - - result = result + ((ULONGEST) high_part << HIGH_BYTE_POSN); - if (minus) - return -result; - else - return result; -} - -/* See documentation in common-utils.h. */ - -char * -skip_spaces (char *chp) -{ - if (chp == NULL) - return NULL; - while (*chp && isspace (*chp)) - chp++; - return chp; -} - -/* A const-correct version of the above. */ - -const char * -skip_spaces (const char *chp) -{ - if (chp == NULL) - return NULL; - while (*chp && isspace (*chp)) - chp++; - return chp; -} - -/* See documentation in common-utils.h. */ - -const char * -skip_to_space (const char *chp) -{ - if (chp == NULL) - return NULL; - while (*chp && !isspace (*chp)) - chp++; - return chp; -} - -/* See documentation in common-utils.h. */ - -char * -skip_to_space (char *chp) -{ - return (char *) skip_to_space ((const char *) chp); -} - -/* See gdbsupport/common-utils.h. */ - -void -free_vector_argv (std::vector<char *> &v) -{ - for (char *el : v) - xfree (el); - - v.clear (); -} - -/* See gdbsupport/common-utils.h. */ - -std::string -stringify_argv (const std::vector<char *> &args) -{ - std::string ret; - - if (!args.empty () && args[0] != NULL) - { - for (auto s : args) - if (s != NULL) - { - ret += s; - ret += ' '; - } - - /* Erase the last whitespace. */ - ret.erase (ret.end () - 1); - } - - return ret; -} - -/* See gdbsupport/common-utils.h. */ - -ULONGEST -align_up (ULONGEST v, int n) -{ - /* Check that N is really a power of two. */ - gdb_assert (n && (n & (n-1)) == 0); - return (v + n - 1) & -n; -} - -/* See gdbsupport/common-utils.h. */ - -ULONGEST -align_down (ULONGEST v, int n) -{ - /* Check that N is really a power of two. */ - gdb_assert (n && (n & (n-1)) == 0); - return (v & -n); -} diff --git a/gdb/gdbsupport/common-utils.h b/gdb/gdbsupport/common-utils.h deleted file mode 100644 index ba03427..0000000 --- a/gdb/gdbsupport/common-utils.h +++ /dev/null @@ -1,202 +0,0 @@ -/* Shared general utility routines for GDB, the GNU debugger. - - Copyright (C) 1986-2020 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 COMMON_COMMON_UTILS_H -#define COMMON_COMMON_UTILS_H - -#include <string> -#include <vector> - -#include "poison.h" - -/* If possible, define FUNCTION_NAME, a macro containing the name of - the function being defined. Since this macro may not always be - defined, all uses must be protected by appropriate macro definition - checks (Eg: "#ifdef FUNCTION_NAME"). - - Version 2.4 and later of GCC define a magical variable `__PRETTY_FUNCTION__' - which contains the name of the function currently being defined. - This is broken in G++ before version 2.6. - C9x has a similar variable called __func__, but prefer the GCC one since - it demangles C++ function names. */ -#if (GCC_VERSION >= 2004) -#define FUNCTION_NAME __PRETTY_FUNCTION__ -#else -#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L -#define FUNCTION_NAME __func__ /* ARI: func */ -#endif -#endif - -#include "gdb_string_view.h" - -/* xmalloc(), xrealloc() and xcalloc() have already been declared in - "libiberty.h". */ - -/* Like xmalloc, but zero the memory. */ -void *xzalloc (size_t); - -template <typename T> -static void -xfree (T *ptr) -{ - static_assert (IsFreeable<T>::value, "Trying to use xfree with a non-POD \ -data type. Use operator delete instead."); - - if (ptr != NULL) - free (ptr); /* ARI: free */ -} - - -/* Like asprintf and vasprintf, but return the string, throw an error - if no memory. */ -char *xstrprintf (const char *format, ...) ATTRIBUTE_PRINTF (1, 2); -char *xstrvprintf (const char *format, va_list ap) - ATTRIBUTE_PRINTF (1, 0); - -/* Like snprintf, but throw an error if the output buffer is too small. */ -int xsnprintf (char *str, size_t size, const char *format, ...) - ATTRIBUTE_PRINTF (3, 4); - -/* Returns a std::string built from a printf-style format string. */ -std::string string_printf (const char* fmt, ...) - ATTRIBUTE_PRINTF (1, 2); - -/* Like string_printf, but takes a va_list. */ -std::string string_vprintf (const char* fmt, va_list args) - ATTRIBUTE_PRINTF (1, 0); - -/* Like string_printf, but appends to DEST instead of returning a new - std::string. */ -void string_appendf (std::string &dest, const char* fmt, ...) - ATTRIBUTE_PRINTF (2, 3); - -/* Like string_appendf, but takes a va_list. */ -void string_vappendf (std::string &dest, const char* fmt, va_list args) - ATTRIBUTE_PRINTF (2, 0); - -/* Make a copy of the string at PTR with LEN characters - (and add a null character at the end in the copy). - Uses malloc to get the space. Returns the address of the copy. */ - -char *savestring (const char *ptr, size_t len); - -/* Extract the next word from ARG. The next word is defined as either, - everything up to the next space, or, if the next word starts with either - a single or double quote, then everything up to the closing quote. The - enclosing quotes are not returned in the result string. The pointer in - ARG is updated to point to the first character after the end of the - word, or, for quoted words, the first character after the closing - quote. */ - -std::string extract_string_maybe_quoted (const char **arg); - -/* The strerror() function can return NULL for errno values that are - out of range. Provide a "safe" version that always returns a - printable string. This version is also thread-safe. */ - -extern const char *safe_strerror (int); - -/* Return true if the start of STRING matches PATTERN, false otherwise. */ - -static inline bool -startswith (const char *string, const char *pattern) -{ - return strncmp (string, pattern, strlen (pattern)) == 0; -} - -/* Version of startswith that takes string_view arguments. See comment - above. */ - -static inline bool -startswith (gdb::string_view string, gdb::string_view pattern) -{ - return (string.length () >= pattern.length () - && strncmp (string.data (), pattern.data (), pattern.length ()) == 0); -} - -ULONGEST strtoulst (const char *num, const char **trailer, int base); - -/* Skip leading whitespace characters in INP, returning an updated - pointer. If INP is NULL, return NULL. */ - -extern char *skip_spaces (char *inp); - -/* A const-correct version of the above. */ - -extern const char *skip_spaces (const char *inp); - -/* Skip leading non-whitespace characters in INP, returning an updated - pointer. If INP is NULL, return NULL. */ - -extern char *skip_to_space (char *inp); - -/* A const-correct version of the above. */ - -extern const char *skip_to_space (const char *inp); - -/* Assumes that V is an argv for a program, and iterates through - freeing all the elements. */ -extern void free_vector_argv (std::vector<char *> &v); - -/* Given a vector of arguments ARGV, return a string equivalent to - joining all the arguments with a whitespace separating them. */ -extern std::string stringify_argv (const std::vector<char *> &argv); - -/* Return true if VALUE is in [LOW, HIGH]. */ - -template <typename T> -static bool -in_inclusive_range (T value, T low, T high) -{ - return value >= low && value <= high; -} - -/* Ensure that V is aligned to an N byte boundary (B's assumed to be a - power of 2). Round up/down when necessary. Examples of correct - use include: - - addr = align_up (addr, 8); -- VALUE needs 8 byte alignment - write_memory (addr, value, len); - addr += len; - - and: - - sp = align_down (sp - len, 16); -- Keep SP 16 byte aligned - write_memory (sp, value, len); - - Note that uses such as: - - write_memory (addr, value, len); - addr += align_up (len, 8); - - and: - - sp -= align_up (len, 8); - write_memory (sp, value, len); - - are typically not correct as they don't ensure that the address (SP - or ADDR) is correctly aligned (relying on previous alignment to - keep things right). This is also why the methods are called - "align_..." instead of "round_..." as the latter reads better with - this incorrect coding style. */ - -extern ULONGEST align_up (ULONGEST v, int n); -extern ULONGEST align_down (ULONGEST v, int n); - -#endif /* COMMON_COMMON_UTILS_H */ diff --git a/gdb/gdbsupport/common.m4 b/gdb/gdbsupport/common.m4 deleted file mode 100644 index 9e15940..0000000 --- a/gdb/gdbsupport/common.m4 +++ /dev/null @@ -1,93 +0,0 @@ -dnl Autoconf configure snippets for common. -dnl Copyright (C) 1995-2020 Free Software Foundation, Inc. -dnl -dnl This file is part of GDB. -dnl -dnl This program is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU General Public License as published by -dnl the Free Software Foundation; either version 3 of the License, or -dnl (at your option) any later version. -dnl -dnl This program is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -dnl GNU General Public License for more details. -dnl -dnl You should have received a copy of the GNU General Public License -dnl along with this program. If not, see <http://www.gnu.org/licenses/>. - -dnl Invoke configury needed by the files in 'common'. -AC_DEFUN([GDB_AC_COMMON], [ - AC_HEADER_STDC - AC_FUNC_ALLOCA - - WIN32APILIBS= - case ${host} in - *mingw32*) - AC_DEFINE(USE_WIN32API, 1, - [Define if we should use the Windows API, instead of the - POSIX API. On Windows, we use the Windows API when - building for MinGW, but the POSIX API when building - for Cygwin.]) - WIN32APILIBS="-lws2_32" - ;; - esac - - dnl Note that this requires codeset.m4, which is included - dnl by the users of common.m4. - AM_LANGINFO_CODESET - - AC_CHECK_HEADERS(linux/perf_event.h locale.h memory.h signal.h dnl - sys/resource.h sys/socket.h dnl - sys/un.h sys/wait.h dnl - thread_db.h wait.h dnl - termios.h dnl - dlfcn.h) - - AC_CHECK_FUNCS([fdwalk getrlimit pipe pipe2 socketpair sigaction \ - sigprocmask]) - - AC_CHECK_DECLS([strstr]) - - # Check for std::thread. This does not work on some platforms, like - # mingw and DJGPP. - AC_LANG_PUSH([C++]) - AX_PTHREAD([threads=yes], [threads=no]) - if test "$threads" = "yes"; then - save_LIBS="$LIBS" - LIBS="$PTHREAD_LIBS $LIBS" - save_CXXFLAGS="$CXXFLAGS" - CXXFLAGS="$PTHREAD_CFLAGS $save_CXXFLAGS" - AC_CACHE_CHECK([for std::thread], - gdb_cv_cxx_std_thread, - [AC_COMPILE_IFELSE([AC_LANG_PROGRAM( - [[#include <thread> - void callback() { }]], - [[std::thread t(callback);]])], - gdb_cv_cxx_std_thread=yes, - gdb_cv_cxx_std_thread=no)]) - - # This check must be here, while LIBS includes any necessary - # threading library. - AC_CHECK_FUNCS([pthread_sigmask pthread_setname_np]) - - LIBS="$save_LIBS" - CXXFLAGS="$save_CXXFLAGS" - fi - if test "$gdb_cv_cxx_std_thread" = "yes"; then - AC_DEFINE(CXX_STD_THREAD, 1, - [Define to 1 if std::thread works.]) - fi - AC_LANG_POP - - dnl Check if sigsetjmp is available. Using AC_CHECK_FUNCS won't - dnl do since sigsetjmp might only be defined as a macro. - AC_CACHE_CHECK([for sigsetjmp], gdb_cv_func_sigsetjmp, - [AC_TRY_COMPILE([ - #include <setjmp.h> - ], [sigjmp_buf env; while (! sigsetjmp (env, 1)) siglongjmp (env, 1);], - gdb_cv_func_sigsetjmp=yes, gdb_cv_func_sigsetjmp=no)]) - if test "$gdb_cv_func_sigsetjmp" = "yes"; then - AC_DEFINE(HAVE_SIGSETJMP, 1, [Define if sigsetjmp is available. ]) - fi -]) diff --git a/gdb/gdbsupport/create-version.sh b/gdb/gdbsupport/create-version.sh deleted file mode 100755 index 81d6dbf..0000000 --- a/gdb/gdbsupport/create-version.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/sh - -# Copyright (C) 1989-2020 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/>. - -# Create version.c from version.in. -# Usage: -# create-version.sh PATH-TO-GDB-SRCDIR HOST_ALIAS \ -# TARGET_ALIAS OUTPUT-FILE-NAME - -srcdir="$1" -host_alias="$2" -target_alias="$3" -output="$4" - -rm -f version.c-tmp $output version.tmp -date=`sed -n -e 's/^.* BFD_VERSION_DATE \(.*\)$/\1/p' $srcdir/../bfd/version.h` -sed -e "s/DATE/$date/" < $srcdir/version.in > version.tmp -echo '#include "gdbsupport/version.h"' >> version.c-tmp -echo 'const char version[] = "'"`sed q version.tmp`"'";' >> version.c-tmp -echo 'const char host_name[] = "'"$host_alias"'";' >> version.c-tmp -echo 'const char target_name[] = "'"$target_alias"'";' >> version.c-tmp -mv version.c-tmp $output -rm -f version.tmp diff --git a/gdb/gdbsupport/def-vector.h b/gdb/gdbsupport/def-vector.h deleted file mode 100644 index 8a4ff6b..0000000 --- a/gdb/gdbsupport/def-vector.h +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright (C) 2017-2020 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 COMMON_DEF_VECTOR_H -#define COMMON_DEF_VECTOR_H - -#include <vector> -#include "gdbsupport/default-init-alloc.h" - -namespace gdb { - -/* A vector that uses an allocator that default constructs using - default-initialization rather than value-initialization. The idea - is to use this when you don't want zero-initialization of elements - of vectors of trivial types. E.g., byte buffers. */ - -template<typename T> using def_vector - = std::vector<T, gdb::default_init_allocator<T>>; - -} /* namespace gdb */ - -#endif /* COMMON_DEF_VECTOR_H */ diff --git a/gdb/gdbsupport/default-init-alloc.h b/gdb/gdbsupport/default-init-alloc.h deleted file mode 100644 index 6299aa6..0000000 --- a/gdb/gdbsupport/default-init-alloc.h +++ /dev/null @@ -1,67 +0,0 @@ -/* Copyright (C) 2017-2020 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 COMMON_DEFAULT_INIT_ALLOC_H -#define COMMON_DEFAULT_INIT_ALLOC_H - -namespace gdb { - -/* An allocator that default constructs using default-initialization - rather than value-initialization. The idea is to use this when you - don't want to default construct elements of containers of trivial - types using zero-initialization. */ - -/* Mostly as implementation convenience, this is implemented as an - adapter that given an allocator A, overrides 'A::construct()'. 'A' - defaults to std::allocator<T>. */ - -template<typename T, typename A = std::allocator<T>> -class default_init_allocator : public A -{ -public: - /* Pull in A's ctors. */ - using A::A; - - /* Override rebind. */ - template<typename U> - struct rebind - { - /* A couple helpers just to make it a bit more readable. */ - typedef std::allocator_traits<A> traits_; - typedef typename traits_::template rebind_alloc<U> alloc_; - - /* This is what we're after. */ - typedef default_init_allocator<U, alloc_> other; - }; - - /* Make the base allocator's construct method(s) visible. */ - using A::construct; - - /* .. and provide an override/overload for the case of default - construction (i.e., no arguments). This is where we construct - with default-init. */ - template <typename U> - void construct (U *ptr) - noexcept (std::is_nothrow_default_constructible<U>::value) - { - ::new ((void *) ptr) U; /* default-init */ - } -}; - -} /* namespace gdb */ - -#endif /* COMMON_DEFAULT_INIT_ALLOC_H */ diff --git a/gdb/gdbsupport/enum-flags.h b/gdb/gdbsupport/enum-flags.h deleted file mode 100644 index 825ff4f..0000000 --- a/gdb/gdbsupport/enum-flags.h +++ /dev/null @@ -1,221 +0,0 @@ -/* Copyright (C) 2015-2020 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 COMMON_ENUM_FLAGS_H -#define COMMON_ENUM_FLAGS_H - -/* Type-safe wrapper for enum flags. enum flags are enums where the - values are bits that are meant to be ORed together. - - This allows writing code like the below, while with raw enums this - would fail to compile without casts to enum type at the assignments - to 'f': - - enum some_flag - { - flag_val1 = 1 << 1, - flag_val2 = 1 << 2, - flag_val3 = 1 << 3, - flag_val4 = 1 << 4, - }; - DEF_ENUM_FLAGS_TYPE(enum some_flag, some_flags); - - some_flags f = flag_val1 | flag_val2; - f |= flag_val3; - - It's also possible to assign literal zero to an enum flags variable - (meaning, no flags), dispensing adding an awkward explicit "no - value" value to the enumeration. For example: - - some_flags f = 0; - f |= flag_val3 | flag_val4; - - Note that literal integers other than zero fail to compile: - - some_flags f = 1; // error -*/ - -#ifdef __cplusplus - -/* Traits type used to prevent the global operator overloads from - instantiating for non-flag enums. */ -template<typename T> struct enum_flags_type {}; - -/* Use this to mark an enum as flags enum. It defines FLAGS as - enum_flags wrapper class for ENUM, and enables the global operator - overloads for ENUM. */ -#define DEF_ENUM_FLAGS_TYPE(enum_type, flags_type) \ - typedef enum_flags<enum_type> flags_type; \ - template<> \ - struct enum_flags_type<enum_type> \ - { \ - typedef enum_flags<enum_type> type; \ - } - -/* Until we can rely on std::underlying type being universally - available (C++11), roll our own for enums. */ -template<int size, bool sign> class integer_for_size { typedef void type; }; -template<> struct integer_for_size<1, 0> { typedef uint8_t type; }; -template<> struct integer_for_size<2, 0> { typedef uint16_t type; }; -template<> struct integer_for_size<4, 0> { typedef uint32_t type; }; -template<> struct integer_for_size<8, 0> { typedef uint64_t type; }; -template<> struct integer_for_size<1, 1> { typedef int8_t type; }; -template<> struct integer_for_size<2, 1> { typedef int16_t type; }; -template<> struct integer_for_size<4, 1> { typedef int32_t type; }; -template<> struct integer_for_size<8, 1> { typedef int64_t type; }; - -template<typename T> -struct enum_underlying_type -{ - typedef typename - integer_for_size<sizeof (T), static_cast<bool>(T (-1) < T (0))>::type - type; -}; - -template <typename E> -class enum_flags -{ -public: - typedef E enum_type; - typedef typename enum_underlying_type<enum_type>::type underlying_type; - -private: - /* Private type used to support initializing flag types with zero: - - foo_flags f = 0; - - but not other integers: - - foo_flags f = 1; - - The way this works is that we define an implicit constructor that - takes a pointer to this private type. Since nothing can - instantiate an object of this type, the only possible pointer to - pass to the constructor is the NULL pointer, or, zero. */ - struct zero_type; - - underlying_type - underlying_value () const - { - return m_enum_value; - } - -public: - /* Allow default construction. */ - enum_flags () - : m_enum_value ((enum_type) 0) - {} - - /* If you get an error saying these two overloads are ambiguous, - then you tried to mix values of different enum types. */ - enum_flags (enum_type e) - : m_enum_value (e) - {} - enum_flags (struct enum_flags::zero_type *zero) - : m_enum_value ((enum_type) 0) - {} - - enum_flags &operator&= (enum_type e) - { - m_enum_value = (enum_type) (underlying_value () & e); - return *this; - } - enum_flags &operator|= (enum_type e) - { - m_enum_value = (enum_type) (underlying_value () | e); - return *this; - } - enum_flags &operator^= (enum_type e) - { - m_enum_value = (enum_type) (underlying_value () ^ e); - return *this; - } - - operator enum_type () const - { - return m_enum_value; - } - - enum_flags operator& (enum_type e) const - { - return (enum_type) (underlying_value () & e); - } - enum_flags operator| (enum_type e) const - { - return (enum_type) (underlying_value () | e); - } - enum_flags operator^ (enum_type e) const - { - return (enum_type) (underlying_value () ^ e); - } - enum_flags operator~ () const - { - // We only the underlying type to be unsigned when actually using - // operator~ -- if it were not unsigned, undefined behavior could - // result. However, asserting this in the class itself would - // require too many unnecessary changes to otherwise ok enum - // types. - gdb_static_assert (std::is_unsigned<underlying_type>::value); - return (enum_type) ~underlying_value (); - } - -private: - /* Stored as enum_type because GDB knows to print the bit flags - neatly if the enum values look like bit flags. */ - enum_type m_enum_value; -}; - -/* Global operator overloads. */ - -template <typename enum_type> -typename enum_flags_type<enum_type>::type -operator& (enum_type e1, enum_type e2) -{ - return enum_flags<enum_type> (e1) & e2; -} - -template <typename enum_type> -typename enum_flags_type<enum_type>::type -operator| (enum_type e1, enum_type e2) -{ - return enum_flags<enum_type> (e1) | e2; -} - -template <typename enum_type> -typename enum_flags_type<enum_type>::type -operator^ (enum_type e1, enum_type e2) -{ - return enum_flags<enum_type> (e1) ^ e2; -} - -template <typename enum_type> -typename enum_flags_type<enum_type>::type -operator~ (enum_type e) -{ - return ~enum_flags<enum_type> (e); -} - -#else /* __cplusplus */ - -/* In C, the flags type is just a typedef for the enum type. */ - -#define DEF_ENUM_FLAGS_TYPE(enum_type, flags_type) \ - typedef enum_type flags_type - -#endif /* __cplusplus */ - -#endif /* COMMON_ENUM_FLAGS_H */ diff --git a/gdb/gdbsupport/environ.c b/gdb/gdbsupport/environ.c deleted file mode 100644 index 55d0a74..0000000 --- a/gdb/gdbsupport/environ.c +++ /dev/null @@ -1,183 +0,0 @@ -/* environ.c -- library for manipulating environments for GNU. - - Copyright (C) 1986-2020 Free Software Foundation, Inc. - - 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 "common-defs.h" -#include "environ.h" -#include <algorithm> -#include <utility> - -/* See gdbsupport/environ.h. */ - -gdb_environ & -gdb_environ::operator= (gdb_environ &&e) -{ - /* Are we self-moving? */ - if (&e == this) - return *this; - - m_environ_vector = std::move (e.m_environ_vector); - m_user_set_env = std::move (e.m_user_set_env); - m_user_unset_env = std::move (e.m_user_unset_env); - e.m_environ_vector.clear (); - e.m_environ_vector.push_back (NULL); - e.m_user_set_env.clear (); - e.m_user_unset_env.clear (); - return *this; -} - -/* See gdbsupport/environ.h. */ - -gdb_environ gdb_environ::from_host_environ () -{ - extern char **environ; - gdb_environ e; - - if (environ == NULL) - return e; - - for (int i = 0; environ[i] != NULL; ++i) - { - /* Make sure we add the element before the last (NULL). */ - e.m_environ_vector.insert (e.m_environ_vector.end () - 1, - xstrdup (environ[i])); - } - - return e; -} - -/* See gdbsupport/environ.h. */ - -void -gdb_environ::clear () -{ - for (char *v : m_environ_vector) - xfree (v); - m_environ_vector.clear (); - /* Always add the NULL element. */ - m_environ_vector.push_back (NULL); - m_user_set_env.clear (); - m_user_unset_env.clear (); -} - -/* Helper function to check if STRING contains an environment variable - assignment of VAR, i.e., if STRING starts with 'VAR='. Return true - if it contains, false otherwise. */ - -static bool -match_var_in_string (const char *string, const char *var, size_t var_len) -{ - if (strncmp (string, var, var_len) == 0 && string[var_len] == '=') - return true; - - return false; -} - -/* See gdbsupport/environ.h. */ - -const char * -gdb_environ::get (const char *var) const -{ - size_t len = strlen (var); - - for (char *el : m_environ_vector) - if (el != NULL && match_var_in_string (el, var, len)) - return &el[len + 1]; - - return NULL; -} - -/* See gdbsupport/environ.h. */ - -void -gdb_environ::set (const char *var, const char *value) -{ - char *fullvar = concat (var, "=", value, NULL); - - /* We have to unset the variable in the vector if it exists. */ - unset (var, false); - - /* Insert the element before the last one, which is always NULL. */ - m_environ_vector.insert (m_environ_vector.end () - 1, fullvar); - - /* Mark this environment variable as having been set by the user. - This will be useful when we deal with setting environment - variables on the remote target. */ - m_user_set_env.insert (std::string (fullvar)); - - /* If this environment variable is marked as unset by the user, then - remove it from the list, because now the user wants to set - it. */ - m_user_unset_env.erase (std::string (var)); -} - -/* See gdbsupport/environ.h. */ - -void -gdb_environ::unset (const char *var, bool update_unset_list) -{ - size_t len = strlen (var); - std::vector<char *>::iterator it_env; - - /* We iterate until '.end () - 1' because the last element is - always NULL. */ - for (it_env = m_environ_vector.begin (); - it_env != m_environ_vector.end () - 1; - ++it_env) - if (match_var_in_string (*it_env, var, len)) - break; - - if (it_env != m_environ_vector.end () - 1) - { - m_user_set_env.erase (std::string (*it_env)); - xfree (*it_env); - - m_environ_vector.erase (it_env); - } - - if (update_unset_list) - m_user_unset_env.insert (std::string (var)); -} - -/* See gdbsupport/environ.h. */ - -void -gdb_environ::unset (const char *var) -{ - unset (var, true); -} - -/* See gdbsupport/environ.h. */ - -char ** -gdb_environ::envp () const -{ - return const_cast<char **> (&m_environ_vector[0]); -} - -/* See gdbsupport/environ.h. */ - -const std::set<std::string> & -gdb_environ::user_set_env () const -{ - return m_user_set_env; -} - -const std::set<std::string> & -gdb_environ::user_unset_env () const -{ - return m_user_unset_env; -} diff --git a/gdb/gdbsupport/environ.h b/gdb/gdbsupport/environ.h deleted file mode 100644 index 8794a2a..0000000 --- a/gdb/gdbsupport/environ.h +++ /dev/null @@ -1,103 +0,0 @@ -/* Header for environment manipulation library. - Copyright (C) 1989-2020 Free Software Foundation, Inc. - - 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 COMMON_ENVIRON_H -#define COMMON_ENVIRON_H - -#include <vector> -#include <set> - -/* Class that represents the environment variables as seen by the - inferior. */ - -class gdb_environ -{ -public: - /* Regular constructor and destructor. */ - gdb_environ () - { - /* Make sure that the vector contains at least a NULL element. - If/when we add more variables to it, NULL will always be the - last element. */ - m_environ_vector.push_back (NULL); - } - - ~gdb_environ () - { - clear (); - } - - /* Move constructor. */ - gdb_environ (gdb_environ &&e) - : m_environ_vector (std::move (e.m_environ_vector)), - m_user_set_env (std::move (e.m_user_set_env)), - m_user_unset_env (std::move (e.m_user_unset_env)) - { - /* Make sure that the moved-from vector is left at a valid - state (only one NULL element). */ - e.m_environ_vector.clear (); - e.m_environ_vector.push_back (NULL); - e.m_user_set_env.clear (); - e.m_user_unset_env.clear (); - } - - /* Move assignment. */ - gdb_environ &operator= (gdb_environ &&e); - - /* Create a gdb_environ object using the host's environment - variables. */ - static gdb_environ from_host_environ (); - - /* Clear the environment variables stored in the object. */ - void clear (); - - /* Return the value in the environment for the variable VAR. The - returned pointer is only valid as long as the gdb_environ object - is not modified. */ - const char *get (const char *var) const; - - /* Store VAR=VALUE in the environment. */ - void set (const char *var, const char *value); - - /* Unset VAR in environment. */ - void unset (const char *var); - - /* Return the environment vector represented as a 'char **'. */ - char **envp () const; - - /* Return the user-set environment vector. */ - const std::set<std::string> &user_set_env () const; - - /* Return the user-unset environment vector. */ - const std::set<std::string> &user_unset_env () const; - -private: - /* Unset VAR in environment. If UPDATE_UNSET_LIST is true, then - also update M_USER_UNSET_ENV to reflect the unsetting of the - environment variable. */ - void unset (const char *var, bool update_unset_list); - - /* A vector containing the environment variables. */ - std::vector<char *> m_environ_vector; - - /* The environment variables explicitly set by the user. */ - std::set<std::string> m_user_set_env; - - /* The environment variables explicitly unset by the user. */ - std::set<std::string> m_user_unset_env; -}; - -#endif /* COMMON_ENVIRON_H */ diff --git a/gdb/gdbsupport/errors.c b/gdb/gdbsupport/errors.c deleted file mode 100644 index 3fcac79..0000000 --- a/gdb/gdbsupport/errors.c +++ /dev/null @@ -1,69 +0,0 @@ -/* Error reporting facilities. - - Copyright (C) 1986-2020 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 "common-defs.h" -#include "errors.h" - -/* See gdbsupport/errors.h. */ - -void -warning (const char *fmt, ...) -{ - va_list ap; - - va_start (ap, fmt); - vwarning (fmt, ap); - va_end (ap); -} - -/* See gdbsupport/errors.h. */ - -void -error (const char *fmt, ...) -{ - va_list ap; - - va_start (ap, fmt); - verror (fmt, ap); - va_end (ap); -} - -/* See gdbsupport/errors.h. */ - -void -internal_error (const char *file, int line, const char *fmt, ...) -{ - va_list ap; - - va_start (ap, fmt); - internal_verror (file, line, fmt, ap); - va_end (ap); -} - -/* See gdbsupport/errors.h. */ - -void -internal_warning (const char *file, int line, const char *fmt, ...) -{ - va_list ap; - - va_start (ap, fmt); - internal_vwarning (file, line, fmt, ap); - va_end (ap); -} diff --git a/gdb/gdbsupport/errors.h b/gdb/gdbsupport/errors.h deleted file mode 100644 index da13482..0000000 --- a/gdb/gdbsupport/errors.h +++ /dev/null @@ -1,90 +0,0 @@ -/* Declarations for error-reporting facilities. - - Copyright (C) 1986-2020 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 COMMON_ERRORS_H -#define COMMON_ERRORS_H - -/* A problem was detected, but the requested operation can still - proceed. A warning message is constructed using a printf- or - vprintf-style argument list. The function "vwarning" must be - provided by the client. */ - -extern void warning (const char *fmt, ...) - ATTRIBUTE_PRINTF (1, 2); - -extern void vwarning (const char *fmt, va_list args) - ATTRIBUTE_PRINTF (1, 0); - -/* A non-predictable, non-fatal error was detected. The requested - operation cannot proceed. An error message is constructed using - a printf- or vprintf-style argument list. These functions do not - return. The function "verror" must be provided by the client. */ - -extern void error (const char *fmt, ...) - ATTRIBUTE_NORETURN ATTRIBUTE_PRINTF (1, 2); - -extern void verror (const char *fmt, va_list args) - ATTRIBUTE_NORETURN ATTRIBUTE_PRINTF (1, 0); - -/* An internal error was detected. Internal errors indicate - programming errors such as assertion failures, as opposed to - more general errors beyond the application's control. These - functions do not return. An error message is constructed using - a printf- or vprintf-style argument list. FILE and LINE - indicate the file and line number where the programming error - was detected. The function "internal_verror" must be provided - by the client. */ - -extern void internal_error (const char *file, int line, - const char *fmt, ...) - ATTRIBUTE_NORETURN ATTRIBUTE_PRINTF (3, 4); - -extern void internal_verror (const char *file, int line, - const char *fmt, va_list args) - ATTRIBUTE_NORETURN ATTRIBUTE_PRINTF (3, 0); - -/* An internal problem was detected, but the requested operation can - still proceed. Internal warnings indicate programming errors as - opposed to more general issues beyond the application's control. - A warning message is constructed using a printf- or vprintf-style - argument list. The function "internal_vwarning" must be provided - by the client. */ - -extern void internal_warning (const char *file, int line, - const char *fmt, ...) - ATTRIBUTE_PRINTF (3, 4); - -extern void internal_vwarning (const char *file, int line, - const char *fmt, va_list args) - ATTRIBUTE_PRINTF (3, 0); - - -/* Like "error", but the error message is constructed by combining - STRING with the system error message for errno. This function does - not return. This function must be provided by the client. */ - -extern void perror_with_name (const char *string) ATTRIBUTE_NORETURN; - -/* Call this function to handle memory allocation failures. This - function does not return. This function must be provided by the - client. */ - -extern void malloc_failure (long size) ATTRIBUTE_NORETURN; - -#endif /* COMMON_ERRORS_H */ diff --git a/gdb/gdbsupport/fileio.c b/gdb/gdbsupport/fileio.c deleted file mode 100644 index 69ed426..0000000 --- a/gdb/gdbsupport/fileio.c +++ /dev/null @@ -1,255 +0,0 @@ -/* File-I/O functions for GDB, the GNU debugger. - - Copyright (C) 2003-2020 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 "common-defs.h" -#include "fileio.h" -#include <sys/stat.h> -#include <fcntl.h> - -/* See fileio.h. */ - -int -host_to_fileio_error (int error) -{ - switch (error) - { - case EPERM: - return FILEIO_EPERM; - case ENOENT: - return FILEIO_ENOENT; - case EINTR: - return FILEIO_EINTR; - case EIO: - return FILEIO_EIO; - case EBADF: - return FILEIO_EBADF; - case EACCES: - return FILEIO_EACCES; - case EFAULT: - return FILEIO_EFAULT; - case EBUSY: - return FILEIO_EBUSY; - case EEXIST: - return FILEIO_EEXIST; - case ENODEV: - return FILEIO_ENODEV; - case ENOTDIR: - return FILEIO_ENOTDIR; - case EISDIR: - return FILEIO_EISDIR; - case EINVAL: - return FILEIO_EINVAL; - case ENFILE: - return FILEIO_ENFILE; - case EMFILE: - return FILEIO_EMFILE; - case EFBIG: - return FILEIO_EFBIG; - case ENOSPC: - return FILEIO_ENOSPC; - case ESPIPE: - return FILEIO_ESPIPE; - case EROFS: - return FILEIO_EROFS; - case ENOSYS: - return FILEIO_ENOSYS; - case ENAMETOOLONG: - return FILEIO_ENAMETOOLONG; - } - return FILEIO_EUNKNOWN; -} - -/* See fileio.h. */ - -int -fileio_to_host_openflags (int fileio_open_flags, int *open_flags_p) -{ - int open_flags = 0; - - if (fileio_open_flags & ~FILEIO_O_SUPPORTED) - return -1; - - if (fileio_open_flags & FILEIO_O_CREAT) - open_flags |= O_CREAT; - if (fileio_open_flags & FILEIO_O_EXCL) - open_flags |= O_EXCL; - if (fileio_open_flags & FILEIO_O_TRUNC) - open_flags |= O_TRUNC; - if (fileio_open_flags & FILEIO_O_APPEND) - open_flags |= O_APPEND; - if (fileio_open_flags & FILEIO_O_RDONLY) - open_flags |= O_RDONLY; - if (fileio_open_flags & FILEIO_O_WRONLY) - open_flags |= O_WRONLY; - if (fileio_open_flags & FILEIO_O_RDWR) - open_flags |= O_RDWR; - /* On systems supporting binary and text mode, always open files - in binary mode. */ -#ifdef O_BINARY - open_flags |= O_BINARY; -#endif - - *open_flags_p = open_flags; - return 0; -} - -/* See fileio.h. */ - -int -fileio_to_host_mode (int fileio_mode, mode_t *mode_p) -{ - mode_t mode = 0; - - if (fileio_mode & ~FILEIO_S_SUPPORTED) - return -1; - - if (fileio_mode & FILEIO_S_IFREG) - mode |= S_IFREG; - if (fileio_mode & FILEIO_S_IFDIR) - mode |= S_IFDIR; - if (fileio_mode & FILEIO_S_IFCHR) - mode |= S_IFCHR; - if (fileio_mode & FILEIO_S_IRUSR) - mode |= S_IRUSR; - if (fileio_mode & FILEIO_S_IWUSR) - mode |= S_IWUSR; - if (fileio_mode & FILEIO_S_IXUSR) - mode |= S_IXUSR; -#ifdef S_IRGRP - if (fileio_mode & FILEIO_S_IRGRP) - mode |= S_IRGRP; -#endif -#ifdef S_IWGRP - if (fileio_mode & FILEIO_S_IWGRP) - mode |= S_IWGRP; -#endif -#ifdef S_IXGRP - if (fileio_mode & FILEIO_S_IXGRP) - mode |= S_IXGRP; -#endif - if (fileio_mode & FILEIO_S_IROTH) - mode |= S_IROTH; -#ifdef S_IWOTH - if (fileio_mode & FILEIO_S_IWOTH) - mode |= S_IWOTH; -#endif -#ifdef S_IXOTH - if (fileio_mode & FILEIO_S_IXOTH) - mode |= S_IXOTH; -#endif - - *mode_p = mode; - return 0; -} - -/* Convert a host-format mode_t into a bitmask of File-I/O flags. */ - -static LONGEST -fileio_mode_pack (mode_t mode) -{ - mode_t tmode = 0; - - if (S_ISREG (mode)) - tmode |= FILEIO_S_IFREG; - if (S_ISDIR (mode)) - tmode |= FILEIO_S_IFDIR; - if (S_ISCHR (mode)) - tmode |= FILEIO_S_IFCHR; - if (mode & S_IRUSR) - tmode |= FILEIO_S_IRUSR; - if (mode & S_IWUSR) - tmode |= FILEIO_S_IWUSR; - if (mode & S_IXUSR) - tmode |= FILEIO_S_IXUSR; -#ifdef S_IRGRP - if (mode & S_IRGRP) - tmode |= FILEIO_S_IRGRP; -#endif -#ifdef S_IWGRP - if (mode & S_IWGRP) - tmode |= FILEIO_S_IWGRP; -#endif -#ifdef S_IXGRP - if (mode & S_IXGRP) - tmode |= FILEIO_S_IXGRP; -#endif - if (mode & S_IROTH) - tmode |= FILEIO_S_IROTH; -#ifdef S_IWOTH - if (mode & S_IWOTH) - tmode |= FILEIO_S_IWOTH; -#endif -#ifdef S_IXOTH - if (mode & S_IXOTH) - tmode |= FILEIO_S_IXOTH; -#endif - return tmode; -} - -/* Pack a host-format mode_t into an fio_mode_t. */ - -static void -host_to_fileio_mode (mode_t num, fio_mode_t fnum) -{ - host_to_bigendian (fileio_mode_pack (num), (char *) fnum, 4); -} - -/* Pack a host-format integer into an fio_ulong_t. */ - -static void -host_to_fileio_ulong (LONGEST num, fio_ulong_t fnum) -{ - host_to_bigendian (num, (char *) fnum, 8); -} - -/* See fileio.h. */ - -void -host_to_fileio_stat (struct stat *st, struct fio_stat *fst) -{ - LONGEST blksize; - - host_to_fileio_uint ((long) st->st_dev, fst->fst_dev); - host_to_fileio_uint ((long) st->st_ino, fst->fst_ino); - host_to_fileio_mode (st->st_mode, fst->fst_mode); - host_to_fileio_uint ((long) st->st_nlink, fst->fst_nlink); - host_to_fileio_uint ((long) st->st_uid, fst->fst_uid); - host_to_fileio_uint ((long) st->st_gid, fst->fst_gid); - host_to_fileio_uint ((long) st->st_rdev, fst->fst_rdev); - host_to_fileio_ulong ((LONGEST) st->st_size, fst->fst_size); -#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE - blksize = st->st_blksize; -#else - blksize = 512; -#endif - host_to_fileio_ulong (blksize, fst->fst_blksize); -#if HAVE_STRUCT_STAT_ST_BLOCKS - host_to_fileio_ulong ((LONGEST) st->st_blocks, fst->fst_blocks); -#else - /* FIXME: This is correct for DJGPP, but other systems that don't - have st_blocks, if any, might prefer 512 instead of st_blksize. - (eliz, 30-12-2003) */ - host_to_fileio_ulong (((LONGEST) st->st_size + blksize - 1) - / blksize, - fst->fst_blocks); -#endif - host_to_fileio_time (st->st_atime, fst->fst_atime); - host_to_fileio_time (st->st_mtime, fst->fst_mtime); - host_to_fileio_time (st->st_ctime, fst->fst_ctime); -} diff --git a/gdb/gdbsupport/fileio.h b/gdb/gdbsupport/fileio.h deleted file mode 100644 index 9d33e46..0000000 --- a/gdb/gdbsupport/fileio.h +++ /dev/null @@ -1,73 +0,0 @@ -/* File-I/O functions for GDB, the GNU debugger. - - Copyright (C) 2003-2020 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 COMMON_FILEIO_H -#define COMMON_FILEIO_H - -#include "gdb/fileio.h" -#include <sys/stat.h> - -/* Convert a host-format errno value to a File-I/O error number. */ - -extern int host_to_fileio_error (int error); - -/* Convert File-I/O open flags FFLAGS to host format, storing - the result in *FLAGS. Return 0 on success, -1 on error. */ - -extern int fileio_to_host_openflags (int fflags, int *flags); - -/* Convert File-I/O mode FMODE to host format, storing - the result in *MODE. Return 0 on success, -1 on error. */ - -extern int fileio_to_host_mode (int fmode, mode_t *mode); - -/* Pack a host-format integer into a byte buffer in big-endian - format. BYTES specifies the size of the integer to pack in - bytes. */ - -static inline void -host_to_bigendian (LONGEST num, char *buf, int bytes) -{ - int i; - - for (i = 0; i < bytes; ++i) - buf[i] = (num >> (8 * (bytes - i - 1))) & 0xff; -} - -/* Pack a host-format integer into an fio_uint_t. */ - -static inline void -host_to_fileio_uint (long num, fio_uint_t fnum) -{ - host_to_bigendian ((LONGEST) num, (char *) fnum, 4); -} - -/* Pack a host-format time_t into an fio_time_t. */ - -static inline void -host_to_fileio_time (time_t num, fio_time_t fnum) -{ - host_to_bigendian ((LONGEST) num, (char *) fnum, 4); -} - -/* Pack a host-format struct stat into a struct fio_stat. */ - -extern void host_to_fileio_stat (struct stat *st, struct fio_stat *fst); - -#endif /* COMMON_FILEIO_H */ diff --git a/gdb/gdbsupport/filestuff.c b/gdb/gdbsupport/filestuff.c deleted file mode 100644 index 179c425..0000000 --- a/gdb/gdbsupport/filestuff.c +++ /dev/null @@ -1,503 +0,0 @@ -/* Low-level file-handling. - Copyright (C) 2012-2020 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 "common-defs.h" -#include "filestuff.h" -#include "gdb_vecs.h" -#include <fcntl.h> -#include <unistd.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <algorithm> - -#ifdef USE_WIN32API -#include <winsock2.h> -#include <windows.h> -#define HAVE_SOCKETS 1 -#elif defined HAVE_SYS_SOCKET_H -#include <sys/socket.h> -/* Define HAVE_F_GETFD if we plan to use F_GETFD. */ -#define HAVE_F_GETFD F_GETFD -#define HAVE_SOCKETS 1 -#endif - -#ifdef HAVE_KINFO_GETFILE -#include <sys/user.h> -#include <libutil.h> -#endif - -#ifdef HAVE_SYS_RESOURCE_H -#include <sys/resource.h> -#endif /* HAVE_SYS_RESOURCE_H */ - -#ifndef O_CLOEXEC -#define O_CLOEXEC 0 -#endif - -#ifndef O_NOINHERIT -#define O_NOINHERIT 0 -#endif - -#ifndef SOCK_CLOEXEC -#define SOCK_CLOEXEC 0 -#endif - - - -#ifndef HAVE_FDWALK - -#include <dirent.h> - -/* Replacement for fdwalk, if the system doesn't define it. Walks all - open file descriptors (though this implementation may walk closed - ones as well, depending on the host platform's capabilities) and - call FUNC with ARG. If FUNC returns non-zero, stops immediately - and returns the same value. Otherwise, returns zero when - finished. */ - -static int -fdwalk (int (*func) (void *, int), void *arg) -{ - /* Checking __linux__ isn't great but it isn't clear what would be - better. There doesn't seem to be a good way to check for this in - configure. */ -#ifdef __linux__ - DIR *dir; - - dir = opendir ("/proc/self/fd"); - if (dir != NULL) - { - struct dirent *entry; - int result = 0; - - for (entry = readdir (dir); entry != NULL; entry = readdir (dir)) - { - long fd; - char *tail; - - errno = 0; - fd = strtol (entry->d_name, &tail, 10); - if (*tail != '\0' || errno != 0) - continue; - if ((int) fd != fd) - { - /* What can we do here really? */ - continue; - } - - if (fd == dirfd (dir)) - continue; - - result = func (arg, fd); - if (result != 0) - break; - } - - closedir (dir); - return result; - } - /* We may fall through to the next case. */ -#endif -#ifdef HAVE_KINFO_GETFILE - int nfd; - gdb::unique_xmalloc_ptr<struct kinfo_file[]> fdtbl - (kinfo_getfile (getpid (), &nfd)); - if (fdtbl != NULL) - { - for (int i = 0; i < nfd; i++) - { - if (fdtbl[i].kf_fd >= 0) - { - int result = func (arg, fdtbl[i].kf_fd); - if (result != 0) - return result; - } - } - return 0; - } - /* We may fall through to the next case. */ -#endif - - { - int max, fd; - -#if defined(HAVE_GETRLIMIT) && defined(RLIMIT_NOFILE) - struct rlimit rlim; - - if (getrlimit (RLIMIT_NOFILE, &rlim) == 0 && rlim.rlim_max != RLIM_INFINITY) - max = rlim.rlim_max; - else -#endif - { -#ifdef _SC_OPEN_MAX - max = sysconf (_SC_OPEN_MAX); -#else - /* Whoops. */ - return 0; -#endif /* _SC_OPEN_MAX */ - } - - for (fd = 0; fd < max; ++fd) - { - struct stat sb; - int result; - - /* Only call FUNC for open fds. */ - if (fstat (fd, &sb) == -1) - continue; - - result = func (arg, fd); - if (result != 0) - return result; - } - - return 0; - } -} - -#endif /* HAVE_FDWALK */ - - - -/* A vector holding all the fds open when notice_open_fds was called. We - don't use a hashtab because we don't expect there to be many open fds. */ - -static std::vector<int> open_fds; - -/* An fdwalk callback function used by notice_open_fds. It puts the - given file descriptor into the vec. */ - -static int -do_mark_open_fd (void *ignore, int fd) -{ - open_fds.push_back (fd); - return 0; -} - -/* See filestuff.h. */ - -void -notice_open_fds (void) -{ - fdwalk (do_mark_open_fd, NULL); -} - -/* See filestuff.h. */ - -void -mark_fd_no_cloexec (int fd) -{ - do_mark_open_fd (NULL, fd); -} - -/* See filestuff.h. */ - -void -unmark_fd_no_cloexec (int fd) -{ - auto it = std::remove (open_fds.begin (), open_fds.end (), fd); - - if (it != open_fds.end ()) - open_fds.erase (it); - else - gdb_assert_not_reached (_("fd not found in open_fds")); -} - -/* Helper function for close_most_fds that closes the file descriptor - if appropriate. */ - -static int -do_close (void *ignore, int fd) -{ - for (int val : open_fds) - { - if (fd == val) - { - /* Keep this one open. */ - return 0; - } - } - - close (fd); - return 0; -} - -/* See filestuff.h. */ - -void -close_most_fds (void) -{ - fdwalk (do_close, NULL); -} - - - -/* This is a tri-state flag. When zero it means we haven't yet tried - O_CLOEXEC. When positive it means that O_CLOEXEC works on this - host. When negative, it means that O_CLOEXEC doesn't work. We - track this state because, while gdb might have been compiled - against a libc that supplies O_CLOEXEC, there is no guarantee that - the kernel supports it. */ - -static int trust_o_cloexec; - -/* Mark FD as close-on-exec, ignoring errors. Update - TRUST_O_CLOEXEC. */ - -static void -mark_cloexec (int fd) -{ -#ifdef HAVE_F_GETFD - int old = fcntl (fd, F_GETFD, 0); - - if (old != -1) - { - fcntl (fd, F_SETFD, old | FD_CLOEXEC); - - if (trust_o_cloexec == 0) - { - if ((old & FD_CLOEXEC) != 0) - trust_o_cloexec = 1; - else - trust_o_cloexec = -1; - } - } -#endif /* HAVE_F_GETFD */ -} - -/* Depending on TRUST_O_CLOEXEC, mark FD as close-on-exec. */ - -static void -maybe_mark_cloexec (int fd) -{ - if (trust_o_cloexec <= 0) - mark_cloexec (fd); -} - -#ifdef HAVE_SOCKETS - -/* Like maybe_mark_cloexec, but for callers that use SOCK_CLOEXEC. */ - -static void -socket_mark_cloexec (int fd) -{ - if (SOCK_CLOEXEC == 0 || trust_o_cloexec <= 0) - mark_cloexec (fd); -} - -#endif - - - -/* See filestuff.h. */ - -int -gdb_open_cloexec (const char *filename, int flags, unsigned long mode) -{ - int fd = open (filename, flags | O_CLOEXEC, mode); - - if (fd >= 0) - maybe_mark_cloexec (fd); - - return fd; -} - -/* See filestuff.h. */ - -gdb_file_up -gdb_fopen_cloexec (const char *filename, const char *opentype) -{ - FILE *result; - /* Probe for "e" support once. But, if we can tell the operating - system doesn't know about close on exec mode "e" without probing, - skip it. E.g., the Windows runtime issues an "Invalid parameter - passed to C runtime function" OutputDebugString warning for - unknown modes. Assume that if O_CLOEXEC is zero, then "e" isn't - supported. On MinGW, O_CLOEXEC is an alias of O_NOINHERIT, and - "e" isn't supported. */ - static int fopen_e_ever_failed_einval = - O_CLOEXEC == 0 || O_CLOEXEC == O_NOINHERIT; - - if (!fopen_e_ever_failed_einval) - { - char *copy; - - copy = (char *) alloca (strlen (opentype) + 2); - strcpy (copy, opentype); - /* This is a glibc extension but we try it unconditionally on - this path. */ - strcat (copy, "e"); - result = fopen (filename, copy); - - if (result == NULL && errno == EINVAL) - { - result = fopen (filename, opentype); - if (result != NULL) - fopen_e_ever_failed_einval = 1; - } - } - else - result = fopen (filename, opentype); - - if (result != NULL) - maybe_mark_cloexec (fileno (result)); - - return gdb_file_up (result); -} - -#ifdef HAVE_SOCKETS -/* See filestuff.h. */ - -int -gdb_socketpair_cloexec (int domain, int style, int protocol, - int filedes[2]) -{ -#ifdef HAVE_SOCKETPAIR - int result = socketpair (domain, style | SOCK_CLOEXEC, protocol, filedes); - - if (result != -1) - { - socket_mark_cloexec (filedes[0]); - socket_mark_cloexec (filedes[1]); - } - - return result; -#else - gdb_assert_not_reached (_("socketpair not available on this host")); -#endif -} - -/* See filestuff.h. */ - -int -gdb_socket_cloexec (int domain, int style, int protocol) -{ - int result = socket (domain, style | SOCK_CLOEXEC, protocol); - - if (result != -1) - socket_mark_cloexec (result); - - return result; -} -#endif - -/* See filestuff.h. */ - -int -gdb_pipe_cloexec (int filedes[2]) -{ - int result; - -#ifdef HAVE_PIPE2 - result = pipe2 (filedes, O_CLOEXEC); - if (result != -1) - { - maybe_mark_cloexec (filedes[0]); - maybe_mark_cloexec (filedes[1]); - } -#else -#ifdef HAVE_PIPE - result = pipe (filedes); - if (result != -1) - { - mark_cloexec (filedes[0]); - mark_cloexec (filedes[1]); - } -#else /* HAVE_PIPE */ - gdb_assert_not_reached (_("pipe not available on this host")); -#endif /* HAVE_PIPE */ -#endif /* HAVE_PIPE2 */ - - return result; -} - -/* See gdbsupport/filestuff.h. */ - -bool -is_regular_file (const char *name, int *errno_ptr) -{ - struct stat st; - const int status = stat (name, &st); - - /* Stat should never fail except when the file does not exist. - If stat fails, analyze the source of error and return true - unless the file does not exist, to avoid returning false results - on obscure systems where stat does not work as expected. */ - - if (status != 0) - { - if (errno != ENOENT) - return true; - *errno_ptr = ENOENT; - return false; - } - - if (S_ISREG (st.st_mode)) - return true; - - if (S_ISDIR (st.st_mode)) - *errno_ptr = EISDIR; - else - *errno_ptr = EINVAL; - return false; -} - -/* See gdbsupport/filestuff.h. */ - -bool -mkdir_recursive (const char *dir) -{ - auto holder = make_unique_xstrdup (dir); - char * const start = holder.get (); - char *component_start = start; - char *component_end = start; - - while (1) - { - /* Find the beginning of the next component. */ - while (*component_start == '/') - component_start++; - - /* Are we done? */ - if (*component_start == '\0') - return true; - - /* Find the slash or null-terminator after this component. */ - component_end = component_start; - while (*component_end != '/' && *component_end != '\0') - component_end++; - - /* Temporarily replace the slash with a null terminator, so we can create - the directory up to this component. */ - char saved_char = *component_end; - *component_end = '\0'; - - /* If we get EEXIST and the existing path is a directory, then we're - happy. If it exists, but it's a regular file and this is not the last - component, we'll fail at the next component. If this is the last - component, the caller will fail with ENOTDIR when trying to - open/create a file under that path. */ - if (mkdir (start, 0700) != 0) - if (errno != EEXIST) - return false; - - /* Restore the overwritten char. */ - *component_end = saved_char; - component_start = component_end; - } -} diff --git a/gdb/gdbsupport/filestuff.h b/gdb/gdbsupport/filestuff.h deleted file mode 100644 index e36936a..0000000 --- a/gdb/gdbsupport/filestuff.h +++ /dev/null @@ -1,142 +0,0 @@ -/* Low-level file-handling. - Copyright (C) 2012-2020 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 COMMON_FILESTUFF_H -#define COMMON_FILESTUFF_H - -#include <dirent.h> -#include <fcntl.h> - -/* Note all the file descriptors which are open when this is called. - These file descriptors will not be closed by close_most_fds. */ - -extern void notice_open_fds (void); - -/* Mark a file descriptor as inheritable across an exec. */ - -extern void mark_fd_no_cloexec (int fd); - -/* Mark a file descriptor as no longer being inheritable across an - exec. This is only meaningful when FD was previously passed to - mark_fd_no_cloexec. */ - -extern void unmark_fd_no_cloexec (int fd); - -/* Close all open file descriptors other than those marked by - 'notice_open_fds', and stdin, stdout, and stderr. Errors that - occur while closing are ignored. */ - -extern void close_most_fds (void); - -/* Like 'open', but ensures that the returned file descriptor has the - close-on-exec flag set. */ - -extern int gdb_open_cloexec (const char *filename, int flags, - /* mode_t */ unsigned long mode); - -/* Like mkstemp, but ensures that the file descriptor is - close-on-exec. */ - -static inline int -gdb_mkostemp_cloexec (char *name_template, int flags = 0) -{ - /* gnulib provides a mkostemp replacement if needed. */ - return mkostemp (name_template, flags | O_CLOEXEC); -} - -/* Convenience wrapper for the above, which takes the filename as an - std::string. */ - -static inline int -gdb_open_cloexec (const std::string &filename, int flags, - /* mode_t */ unsigned long mode) -{ - return gdb_open_cloexec (filename.c_str (), flags, mode); -} - -struct gdb_file_deleter -{ - void operator() (FILE *file) const - { - fclose (file); - } -}; - -/* A unique pointer to a FILE. */ - -typedef std::unique_ptr<FILE, gdb_file_deleter> gdb_file_up; - -/* Like 'fopen', but ensures that the returned file descriptor has the - close-on-exec flag set. */ - -extern gdb_file_up gdb_fopen_cloexec (const char *filename, - const char *opentype); - -/* Convenience wrapper for the above, which takes the filename as an - std::string. */ - -static inline gdb_file_up -gdb_fopen_cloexec (const std::string &filename, const char *opentype) -{ - return gdb_fopen_cloexec (filename.c_str (), opentype); -} - -/* Like 'socketpair', but ensures that the returned file descriptors - have the close-on-exec flag set. */ - -extern int gdb_socketpair_cloexec (int domain, int style, int protocol, - int filedes[2]); - -/* Like 'socket', but ensures that the returned file descriptor has - the close-on-exec flag set. */ - -extern int gdb_socket_cloexec (int domain, int style, int protocol); - -/* Like 'pipe', but ensures that the returned file descriptors have - the close-on-exec flag set. */ - -extern int gdb_pipe_cloexec (int filedes[2]); - -struct gdb_dir_deleter -{ - void operator() (DIR *dir) const - { - closedir (dir); - } -}; - -/* A unique pointer to a DIR. */ - -typedef std::unique_ptr<DIR, gdb_dir_deleter> gdb_dir_up; - -/* Return true if the file NAME exists and is a regular file. - If the result is false then *ERRNO_PTR is set to a useful value assuming - we're expecting a regular file. */ -extern bool is_regular_file (const char *name, int *errno_ptr); - - -/* A cheap (as in low-quality) recursive mkdir. Try to create all the - parents directories up to DIR and DIR itself. Stop if we hit an - error along the way. There is no attempt to remove created - directories in case of failure. - - Returns false on failure and sets errno. */ - -extern bool mkdir_recursive (const char *dir); - -#endif /* COMMON_FILESTUFF_H */ diff --git a/gdb/gdbsupport/filtered-iterator.h b/gdb/gdbsupport/filtered-iterator.h deleted file mode 100644 index c3aeb44..0000000 --- a/gdb/gdbsupport/filtered-iterator.h +++ /dev/null @@ -1,87 +0,0 @@ -/* A forward filtered iterator for GDB, the GNU debugger. - Copyright (C) 2018-2020 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 COMMON_FILTERED_ITERATOR_H -#define COMMON_FILTERED_ITERATOR_H - -/* A filtered iterator. This wraps BaseIterator and automatically - skips elements that FilterFunc filters out. Requires that - default-constructing a BaseIterator creates a valid one-past-end - iterator. */ - -template<typename BaseIterator, typename FilterFunc> -class filtered_iterator -{ -public: - typedef filtered_iterator self_type; - typedef typename BaseIterator::value_type value_type; - typedef typename BaseIterator::reference reference; - typedef typename BaseIterator::pointer pointer; - typedef typename BaseIterator::iterator_category iterator_category; - typedef typename BaseIterator::difference_type difference_type; - - /* Construct by forwarding all arguments to the underlying - iterator. */ - template<typename... Args> - explicit filtered_iterator (Args &&...args) - : m_it (std::forward<Args> (args)...) - { skip_filtered (); } - - /* Create a one-past-end iterator. */ - filtered_iterator () = default; - - /* Need these as the variadic constructor would be a better match - otherwise. */ - filtered_iterator (filtered_iterator &) = default; - filtered_iterator (const filtered_iterator &) = default; - filtered_iterator (filtered_iterator &&) = default; - filtered_iterator (const filtered_iterator &&other) - : filtered_iterator (static_cast<const filtered_iterator &> (other)) - {} - - value_type operator* () const { return *m_it; } - - self_type &operator++ () - { - ++m_it; - skip_filtered (); - return *this; - } - - bool operator== (const self_type &other) const - { return m_it == other.m_it; } - - bool operator!= (const self_type &other) const - { return m_it != other.m_it; } - -private: - - void skip_filtered () - { - for (; m_it != m_end; ++m_it) - if (m_filter (*m_it)) - break; - } - -private: - FilterFunc m_filter {}; - BaseIterator m_it {}; - BaseIterator m_end {}; -}; - -#endif /* COMMON_FILTERED_ITERATOR_H */ diff --git a/gdb/gdbsupport/format.c b/gdb/gdbsupport/format.c deleted file mode 100644 index b05ccf6..0000000 --- a/gdb/gdbsupport/format.c +++ /dev/null @@ -1,412 +0,0 @@ -/* Parse a printf-style format string. - - Copyright (C) 1986-2020 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 "common-defs.h" -#include "format.h" - -format_pieces::format_pieces (const char **arg, bool gdb_extensions) -{ - const char *s; - const char *string; - const char *prev_start; - const char *percent_loc; - char *sub_start, *current_substring; - enum argclass this_argclass; - - s = *arg; - - if (gdb_extensions) - { - string = *arg; - *arg += strlen (*arg); - } - else - { - /* Parse the format-control string and copy it into the string STRING, - processing some kinds of escape sequence. */ - - char *f = (char *) alloca (strlen (s) + 1); - string = f; - - while ((gdb_extensions || *s != '"') && *s != '\0') - { - int c = *s++; - switch (c) - { - case '\0': - continue; - - case '\\': - switch (c = *s++) - { - case '\\': - *f++ = '\\'; - break; - case 'a': - *f++ = '\a'; - break; - case 'b': - *f++ = '\b'; - break; - case 'e': - *f++ = '\e'; - break; - case 'f': - *f++ = '\f'; - break; - case 'n': - *f++ = '\n'; - break; - case 'r': - *f++ = '\r'; - break; - case 't': - *f++ = '\t'; - break; - case 'v': - *f++ = '\v'; - break; - case '"': - *f++ = '"'; - break; - default: - /* ??? TODO: handle other escape sequences. */ - error (_("Unrecognized escape character \\%c in format string."), - c); - } - break; - - default: - *f++ = c; - } - } - - /* Terminate our escape-processed copy. */ - *f++ = '\0'; - - /* Whether the format string ended with double-quote or zero, we're - done with it; it's up to callers to complain about syntax. */ - *arg = s; - } - - /* Need extra space for the '\0's. Doubling the size is sufficient. */ - - current_substring = (char *) xmalloc (strlen (string) * 2 + 1000); - m_storage.reset (current_substring); - - /* Now scan the string for %-specs and see what kinds of args they want. - argclass classifies the %-specs so we can give printf-type functions - something of the right size. */ - - const char *f = string; - prev_start = string; - while (*f) - if (*f++ == '%') - { - int seen_hash = 0, seen_zero = 0, lcount = 0, seen_prec = 0; - int seen_space = 0, seen_plus = 0; - int seen_big_l = 0, seen_h = 0, seen_big_h = 0; - int seen_big_d = 0, seen_double_big_d = 0; - int seen_size_t = 0; - int bad = 0; - int n_int_args = 0; - bool seen_i64 = false; - - /* Skip over "%%", it will become part of a literal piece. */ - if (*f == '%') - { - f++; - continue; - } - - sub_start = current_substring; - - strncpy (current_substring, prev_start, f - 1 - prev_start); - current_substring += f - 1 - prev_start; - *current_substring++ = '\0'; - - if (*sub_start != '\0') - m_pieces.emplace_back (sub_start, literal_piece, 0); - - percent_loc = f - 1; - - /* Check the validity of the format specifier, and work - out what argument it expects. We only accept C89 - format strings, with the exception of long long (which - we autoconf for). */ - - /* The first part of a format specifier is a set of flag - characters. */ - while (*f != '\0' && strchr ("0-+ #", *f)) - { - if (*f == '#') - seen_hash = 1; - else if (*f == '0') - seen_zero = 1; - else if (*f == ' ') - seen_space = 1; - else if (*f == '+') - seen_plus = 1; - f++; - } - - /* The next part of a format specifier is a width. */ - if (gdb_extensions && *f == '*') - { - ++f; - ++n_int_args; - } - else - { - while (*f != '\0' && strchr ("0123456789", *f)) - f++; - } - - /* The next part of a format specifier is a precision. */ - if (*f == '.') - { - seen_prec = 1; - f++; - if (gdb_extensions && *f == '*') - { - ++f; - ++n_int_args; - } - else - { - while (*f != '\0' && strchr ("0123456789", *f)) - f++; - } - } - - /* The next part of a format specifier is a length modifier. */ - switch (*f) - { - case 'h': - seen_h = 1; - f++; - break; - case 'l': - f++; - lcount++; - if (*f == 'l') - { - f++; - lcount++; - } - break; - case 'L': - seen_big_l = 1; - f++; - break; - case 'H': - /* Decimal32 modifier. */ - seen_big_h = 1; - f++; - break; - case 'D': - /* Decimal64 and Decimal128 modifiers. */ - f++; - - /* Check for a Decimal128. */ - if (*f == 'D') - { - f++; - seen_double_big_d = 1; - } - else - seen_big_d = 1; - break; - case 'z': - /* For size_t or ssize_t. */ - seen_size_t = 1; - f++; - break; - case 'I': - /* Support the Windows '%I64' extension, because an - earlier call to format_pieces might have converted %lld - to %I64d. */ - if (f[1] == '6' && f[2] == '4') - { - f += 3; - lcount = 2; - seen_i64 = true; - } - break; - } - - switch (*f) - { - case 'u': - if (seen_hash) - bad = 1; - /* FALLTHROUGH */ - - case 'o': - case 'x': - case 'X': - if (seen_space || seen_plus) - bad = 1; - /* FALLTHROUGH */ - - case 'd': - case 'i': - if (seen_size_t) - this_argclass = size_t_arg; - else if (lcount == 0) - this_argclass = int_arg; - else if (lcount == 1) - this_argclass = long_arg; - else - this_argclass = long_long_arg; - - if (seen_big_l) - bad = 1; - break; - - case 'c': - this_argclass = lcount == 0 ? int_arg : wide_char_arg; - if (lcount > 1 || seen_h || seen_big_l) - bad = 1; - if (seen_prec || seen_zero || seen_space || seen_plus) - bad = 1; - break; - - case 'p': - this_argclass = ptr_arg; - if (lcount || seen_h || seen_big_l) - bad = 1; - if (seen_prec) - bad = 1; - if (seen_hash || seen_zero || seen_space || seen_plus) - bad = 1; - - if (gdb_extensions) - { - switch (f[1]) - { - case 's': - case 'F': - case '[': - case ']': - f++; - break; - } - } - - break; - - case 's': - this_argclass = lcount == 0 ? string_arg : wide_string_arg; - if (lcount > 1 || seen_h || seen_big_l) - bad = 1; - if (seen_zero || seen_space || seen_plus) - bad = 1; - break; - - case 'e': - case 'f': - case 'g': - case 'E': - case 'G': - if (seen_double_big_d) - this_argclass = dec128float_arg; - else if (seen_big_d) - this_argclass = dec64float_arg; - else if (seen_big_h) - this_argclass = dec32float_arg; - else if (seen_big_l) - this_argclass = long_double_arg; - else - this_argclass = double_arg; - - if (lcount || seen_h) - bad = 1; - break; - - case '*': - error (_("`*' not supported for precision or width in printf")); - - case 'n': - error (_("Format specifier `n' not supported in printf")); - - case '\0': - error (_("Incomplete format specifier at end of format string")); - - default: - error (_("Unrecognized format specifier '%c' in printf"), *f); - } - - if (bad) - error (_("Inappropriate modifiers to " - "format specifier '%c' in printf"), - *f); - - f++; - - sub_start = current_substring; - - if (lcount > 1 && !seen_i64 && USE_PRINTF_I64) - { - /* Windows' printf does support long long, but not the usual way. - Convert %lld to %I64d. */ - int length_before_ll = f - percent_loc - 1 - lcount; - - strncpy (current_substring, percent_loc, length_before_ll); - strcpy (current_substring + length_before_ll, "I64"); - current_substring[length_before_ll + 3] = - percent_loc[length_before_ll + lcount]; - current_substring += length_before_ll + 4; - } - else if (this_argclass == wide_string_arg - || this_argclass == wide_char_arg) - { - /* Convert %ls or %lc to %s. */ - int length_before_ls = f - percent_loc - 2; - - strncpy (current_substring, percent_loc, length_before_ls); - strcpy (current_substring + length_before_ls, "s"); - current_substring += length_before_ls + 2; - } - else - { - strncpy (current_substring, percent_loc, f - percent_loc); - current_substring += f - percent_loc; - } - - *current_substring++ = '\0'; - - prev_start = f; - - m_pieces.emplace_back (sub_start, this_argclass, n_int_args); - } - - /* Record the remainder of the string. */ - - if (f > prev_start) - { - sub_start = current_substring; - - strncpy (current_substring, prev_start, f - prev_start); - current_substring += f - prev_start; - *current_substring++ = '\0'; - - m_pieces.emplace_back (sub_start, literal_piece, 0); - } -} diff --git a/gdb/gdbsupport/format.h b/gdb/gdbsupport/format.h deleted file mode 100644 index 80f012a..0000000 --- a/gdb/gdbsupport/format.h +++ /dev/null @@ -1,101 +0,0 @@ -/* Parse a printf-style format string. - - Copyright (C) 1986-2020 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 COMMON_FORMAT_H -#define COMMON_FORMAT_H - -#include "gdbsupport/gdb_string_view.h" - -#if defined(__MINGW32__) && !defined(PRINTF_HAS_LONG_LONG) -# define USE_PRINTF_I64 1 -# define PRINTF_HAS_LONG_LONG -#else -# define USE_PRINTF_I64 0 -#endif - -/* The argclass represents the general type of data that goes with a - format directive; int_arg for %d, long_arg for %l, and so forth. - Note that these primarily distinguish types by size and need for - special handling, so for instance %u and %x are (at present) also - classed as int_arg. */ - -enum argclass - { - literal_piece, - int_arg, long_arg, long_long_arg, size_t_arg, ptr_arg, - string_arg, wide_string_arg, wide_char_arg, - double_arg, long_double_arg, - dec32float_arg, dec64float_arg, dec128float_arg - }; - -/* A format piece is a section of the format string that may include a - single print directive somewhere in it, and the associated class - for the argument. */ - -struct format_piece -{ - format_piece (const char *str, enum argclass argc, int n) - : string (str), - argclass (argc), - n_int_args (n) - { - } - - bool operator== (const format_piece &other) const - { - return (this->argclass == other.argclass - && gdb::string_view (this->string) == other.string); - } - - const char *string; - enum argclass argclass; - /* Count the number of preceding 'int' arguments that must be passed - along. This is used for a width or precision of '*'. Note that - this feature is only available in "gdb_extensions" mode. */ - int n_int_args; -}; - -class format_pieces -{ -public: - - format_pieces (const char **arg, bool gdb_extensions = false); - ~format_pieces () = default; - - DISABLE_COPY_AND_ASSIGN (format_pieces); - - typedef std::vector<format_piece>::iterator iterator; - - iterator begin () - { - return m_pieces.begin (); - } - - iterator end () - { - return m_pieces.end (); - } - -private: - - std::vector<format_piece> m_pieces; - gdb::unique_xmalloc_ptr<char> m_storage; -}; - -#endif /* COMMON_FORMAT_H */ diff --git a/gdb/gdbsupport/forward-scope-exit.h b/gdb/gdbsupport/forward-scope-exit.h deleted file mode 100644 index 5ecea380..0000000 --- a/gdb/gdbsupport/forward-scope-exit.h +++ /dev/null @@ -1,123 +0,0 @@ -/* Copyright (C) 2019-2020 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 COMMON_FORWARD_SCOPE_EXIT_H -#define COMMON_FORWARD_SCOPE_EXIT_H - -#include "gdbsupport/scope-exit.h" -#include <functional> - -/* A forward_scope_exit is like scope_exit, but instead of giving it a - callable, you instead specialize it for a given cleanup function, - and the generated class automatically has a constructor with the - same interface as the cleanup function. forward_scope_exit - captures the arguments passed to the ctor, and in turn passes those - as arguments to the wrapped cleanup function, when it is called at - scope exit time, from within the forward_scope_exit dtor. The - forward_scope_exit class can take any number of arguments, and is - cancelable if needed. - - This allows usage like this: - - void - delete_longjmp_breakpoint (int arg) - { - // Blah, blah, blah... - } - - using longjmp_breakpoint_cleanup - = FORWARD_SCOPE_EXIT (delete_longjmp_breakpoint); - - This above created a new cleanup class `longjmp_breakpoint_cleanup` - than can then be used like this: - - longjmp_breakpoint_cleanup obj (thread); - - // Blah, blah, blah... - - obj.release (); // Optional cancel if needed. - - forward_scope_exit is also handy when you would need to wrap a - scope_exit in a gdb::optional: - - gdb::optional<longjmp_breakpoint_cleanup> cleanup; - if (some condition) - cleanup.emplace (thread); - ... - if (cleanup) - cleanup->release (); - - since with scope exit, you would have to know the scope_exit's - callable template type when you create the gdb::optional: - - gdb:optional<scope_exit<what goes here?>> - - The "forward" naming fits both purposes shown above -- the class - "forwards" ctor arguments to the wrapped cleanup function at scope - exit time, and can also be used to "forward declare" - scope_exit-like objects. */ - -namespace detail -{ - -/* Function and Signature are passed in the same type, in order to - extract Function's arguments' types in the specialization below. - Those are used to generate the constructor. */ - -template<typename Function, Function *function, typename Signature> -struct forward_scope_exit; - -template<typename Function, Function *function, - typename Res, typename... Args> -class forward_scope_exit<Function, function, Res (Args...)> - : public scope_exit_base<forward_scope_exit<Function, - function, - Res (Args...)>> -{ - /* For access to on_exit(). */ - friend scope_exit_base<forward_scope_exit<Function, - function, - Res (Args...)>>; - -public: - explicit forward_scope_exit (Args ...args) - : m_bind_function (function, args...) - { - /* Nothing. */ - } - -private: - void on_exit () - { - m_bind_function (); - } - - /* The function and the arguments passed to the ctor, all packed in - a std::bind. */ - decltype (std::bind (function, std::declval<Args> ()...)) - m_bind_function; -}; - -} /* namespace detail */ - -/* This is the "public" entry point. It's a macro to avoid having to - name FUNC more than once. */ - -#define FORWARD_SCOPE_EXIT(FUNC) \ - detail::forward_scope_exit<decltype (FUNC), FUNC, decltype (FUNC)> - -#endif /* COMMON_FORWARD_SCOPE_EXIT_H */ diff --git a/gdb/gdbsupport/function-view.h b/gdb/gdbsupport/function-view.h deleted file mode 100644 index 4e205b8..0000000 --- a/gdb/gdbsupport/function-view.h +++ /dev/null @@ -1,323 +0,0 @@ -/* Copyright (C) 2017-2020 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 COMMON_FUNCTION_VIEW_H -#define COMMON_FUNCTION_VIEW_H - -/* function_view is a polymorphic type-erasing wrapper class that - encapsulates a non-owning reference to arbitrary callable objects. - - A way to put it is that function_view is to std::function like - std::string_view is to std::string. While std::function stores a - type-erased callable object internally, function_view holds a - type-erased reference to an external callable object. - - This is meant to be used as callback type of a function that: - - #1 - Takes a callback as parameter. - - #2 - Wants to support arbitrary callable objects as callback type - (e.g., stateful function objects, lambda closures, free - functions). - - #3 - Does not store the callback anywhere; instead the function - just calls the callback directly or forwards it to some - other function that calls it. - - #4 - Can't be, or we don't want it to be, a template function - with the callable type as template parameter. For example, - when the callback is a parameter of a virtual member - function, or when putting the function template in a header - would expose too much implementation detail. - - Note that the C-style "function pointer" + "void *data" callback - parameter idiom fails requirement #2 above. Please don't add new - uses of that idiom. I.e., something like this wouldn't work; - - typedef bool (iterate_over_foos_cb) (foo *f, void *user_data), - void iterate_over_foos (iterate_over_foos_cb *callback, void *user_data); - - foo *find_foo_by_type (int type) - { - foo *found = nullptr; - - iterate_over_foos ([&] (foo *f, void *data) - { - if (foo->type == type) - { - found = foo; - return true; // stop iterating - } - return false; // continue iterating - }, NULL); - - return found; - } - - The above wouldn't compile, because lambdas with captures can't be - implicitly converted to a function pointer (because a capture means - some context data must be passed to the lambda somehow). - - C++11 gave us std::function as type-erased wrapper around arbitrary - callables, however, std::function is not an ideal fit for transient - callbacks such as the use case above. For this use case, which is - quite pervasive, a function_view is a better choice, because while - function_view is light and does not require any heap allocation, - std::function is a heavy-weight object with value semantics that - generally requires a heap allocation on construction/assignment of - the target callable. In addition, while it is possible to use - std::function in such a way that avoids most of the overhead by - making sure to only construct it with callables of types that fit - std::function's small object optimization, such as function - pointers and std::reference_wrapper callables, that is quite - inconvenient in practice, because restricting to free-function - callables would imply no state/capture/closure, which we need in - most cases, and std::reference_wrapper implies remembering to use - std::ref/std::cref where the callable is constructed, with the - added inconvenience that std::ref/std::cref have deleted rvalue-ref - overloads, meaning you can't use unnamed/temporary lambdas with - them. - - Note that because function_view is a non-owning view of a callable, - care must be taken to ensure that the callable outlives the - function_view that calls it. This is not really a problem for the - use case function_view is intended for, such as passing a temporary - function object / lambda to a function that accepts a callback, - because in those cases, the temporary is guaranteed to be live - until the called function returns. - - Calling a function_view with no associated target is undefined, - unlike with std::function, which throws std::bad_function_call. - This is by design, to avoid the otherwise necessary NULL check in - function_view::operator(). - - Since function_view objects are small (a pair of pointers), they - should generally be passed around by value. - - Usage: - - Given this function that accepts a callback: - - void - iterate_over_foos (gdb::function_view<void (foo *)> callback) - { - for (auto &foo : foos) - callback (&foo); - } - - you can call it like this, passing a lambda as callback: - - iterate_over_foos ([&] (foo *f) - { - process_one_foo (f); - }); - - or like this, passing a function object as callback: - - struct function_object - { - void operator() (foo *f) - { - if (s->check ()) - process_one_foo (f); - } - - // some state - state *s; - }; - - state mystate; - function_object matcher {&mystate}; - iterate_over_foos (matcher); - - or like this, passing a function pointer as callback: - - iterate_over_foos (process_one_foo); - - You can find unit tests covering the whole API in - unittests/function-view-selftests.c. */ - -namespace gdb { - -namespace fv_detail { -/* Bits shared by all function_view instantiations that do not depend - on the template parameters. */ - -/* Storage for the erased callable. This is a union in order to be - able to save both a function object (data) pointer or a function - pointer without triggering undefined behavior. */ -union erased_callable -{ - /* For function objects. */ - void *data; - - /* For function pointers. */ - void (*fn) (); -}; - -} /* namespace fv_detail */ - -/* Use partial specialization to get access to the callable's - signature. */ -template<class Signature> -struct function_view; - -template<typename Res, typename... Args> -class function_view<Res (Args...)> -{ - template<typename From, typename To> - using CompatibleReturnType - = Or<std::is_void<To>, - std::is_same<From, To>, - std::is_convertible<From, To>>; - - /* True if Func can be called with Args, and either the result is - Res, convertible to Res or Res is void. */ - template<typename Callable, - typename Res2 = typename std::result_of<Callable &(Args...)>::type> - struct IsCompatibleCallable : CompatibleReturnType<Res2, Res> - {}; - - /* True if Callable is a function_view. Used to avoid hijacking the - copy ctor. */ - template <typename Callable> - struct IsFunctionView - : std::is_same<function_view, typename std::decay<Callable>::type> - {}; - - public: - - /* NULL by default. */ - constexpr function_view () noexcept - : m_erased_callable {}, - m_invoker {} - {} - - /* Default copy/assignment is fine. */ - function_view (const function_view &) = default; - function_view &operator= (const function_view &) = default; - - /* This is the main entry point. Use SFINAE to avoid hijacking the - copy constructor and to ensure that the target type is - compatible. */ - template - <typename Callable, - typename = Requires<Not<IsFunctionView<Callable>>>, - typename = Requires<IsCompatibleCallable<Callable>>> - function_view (Callable &&callable) noexcept - { - bind (callable); - } - - /* Construct a NULL function_view. */ - constexpr function_view (std::nullptr_t) noexcept - : m_erased_callable {}, - m_invoker {} - {} - - /* Clear a function_view. */ - function_view &operator= (std::nullptr_t) noexcept - { - m_invoker = nullptr; - return *this; - } - - /* Return true if the wrapper has a target, false otherwise. Note - we check M_INVOKER instead of M_ERASED_CALLABLE because we don't - know which member of the union is active right now. */ - constexpr explicit operator bool () const noexcept - { return m_invoker != nullptr; } - - /* Call the callable. */ - Res operator () (Args... args) const - { return m_invoker (m_erased_callable, std::forward<Args> (args)...); } - - private: - - /* Bind this function_view to a compatible function object - reference. */ - template <typename Callable> - void bind (Callable &callable) noexcept - { - m_erased_callable.data = (void *) std::addressof (callable); - m_invoker = [] (fv_detail::erased_callable ecall, Args... args) - noexcept (noexcept (callable (std::forward<Args> (args)...))) -> Res - { - auto &restored_callable = *static_cast<Callable *> (ecall.data); - /* The explicit cast to Res avoids a compile error when Res is - void and the callable returns non-void. */ - return (Res) restored_callable (std::forward<Args> (args)...); - }; - } - - /* Bind this function_view to a compatible function pointer. - - Making this a separate function allows avoiding one indirection, - by storing the function pointer directly in the storage, instead - of a pointer to pointer. erased_callable is then a union in - order to avoid storing a function pointer as a data pointer here, - which would be undefined. */ - template<class Res2, typename... Args2> - void bind (Res2 (*fn) (Args2...)) noexcept - { - m_erased_callable.fn = reinterpret_cast<void (*) ()> (fn); - m_invoker = [] (fv_detail::erased_callable ecall, Args... args) - noexcept (noexcept (fn (std::forward<Args> (args)...))) -> Res - { - auto restored_fn = reinterpret_cast<Res2 (*) (Args2...)> (ecall.fn); - /* The explicit cast to Res avoids a compile error when Res is - void and the callable returns non-void. */ - return (Res) restored_fn (std::forward<Args> (args)...); - }; - } - - /* Storage for the erased callable. */ - fv_detail::erased_callable m_erased_callable; - - /* The invoker. This is set to a capture-less lambda by one of the - 'bind' overloads. The lambda restores the right type of the - callable (which is passed as first argument), and forwards the - args. */ - Res (*m_invoker) (fv_detail::erased_callable, Args...); -}; - -/* Allow comparison with NULL. Defer the work to the in-class - operator bool implementation. */ - -template<typename Res, typename... Args> -constexpr inline bool -operator== (const function_view<Res (Args...)> &f, std::nullptr_t) noexcept -{ return !static_cast<bool> (f); } - -template<typename Res, typename... Args> -constexpr inline bool -operator== (std::nullptr_t, const function_view<Res (Args...)> &f) noexcept -{ return !static_cast<bool> (f); } - -template<typename Res, typename... Args> -constexpr inline bool -operator!= (const function_view<Res (Args...)> &f, std::nullptr_t) noexcept -{ return static_cast<bool> (f); } - -template<typename Res, typename... Args> -constexpr inline bool -operator!= (std::nullptr_t, const function_view<Res (Args...)> &f) noexcept -{ return static_cast<bool> (f); } - -} /* namespace gdb */ - -#endif diff --git a/gdb/gdbsupport/gdb-dlfcn.c b/gdb/gdbsupport/gdb-dlfcn.c deleted file mode 100644 index 1a755bd..0000000 --- a/gdb/gdbsupport/gdb-dlfcn.c +++ /dev/null @@ -1,118 +0,0 @@ -/* Platform independent shared object routines for GDB. - - Copyright (C) 2011-2020 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 "common-defs.h" -#include "gdb-dlfcn.h" - -#ifdef HAVE_DLFCN_H -#include <dlfcn.h> -#elif __MINGW32__ -#include <windows.h> -#else -/* Unsupported configuration. */ -#define NO_SHARED_LIB -#endif - -#ifdef NO_SHARED_LIB - -gdb_dlhandle_up -gdb_dlopen (const char *filename) -{ - gdb_assert_not_reached ("gdb_dlopen should not be called on this platform."); -} - -void * -gdb_dlsym (const gdb_dlhandle_up &handle, const char *symbol) -{ - gdb_assert_not_reached ("gdb_dlsym should not be called on this platform."); -} - -void -dlclose_deleter::operator() (void *handle) const -{ - gdb_assert_not_reached ("gdb_dlclose should not be called on this platform."); -} - -int -is_dl_available (void) -{ - return 0; -} - -#else /* NO_SHARED_LIB */ - -gdb_dlhandle_up -gdb_dlopen (const char *filename) -{ - void *result; -#ifdef HAVE_DLFCN_H - result = dlopen (filename, RTLD_NOW); -#elif __MINGW32__ - result = (void *) LoadLibrary (filename); -#endif - if (result != NULL) - return gdb_dlhandle_up (result); - -#ifdef HAVE_DLFCN_H - error (_("Could not load %s: %s"), filename, dlerror()); -#else - { - LPVOID buffer; - DWORD dw; - - dw = GetLastError(); - - FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | - FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPTSTR) &buffer, - 0, NULL); - - error (_("Could not load %s: %s"), filename, (char *) buffer); - } -#endif -} - -void * -gdb_dlsym (const gdb_dlhandle_up &handle, const char *symbol) -{ -#ifdef HAVE_DLFCN_H - return dlsym (handle.get (), symbol); -#elif __MINGW32__ - return (void *) GetProcAddress ((HMODULE) handle.get (), symbol); -#endif -} - -void -dlclose_deleter::operator() (void *handle) const -{ -#ifdef HAVE_DLFCN_H - dlclose (handle); -#elif __MINGW32__ - FreeLibrary ((HMODULE) handle); -#endif -} - -int -is_dl_available (void) -{ - return 1; -} - -#endif /* NO_SHARED_LIB */ diff --git a/gdb/gdbsupport/gdb-dlfcn.h b/gdb/gdbsupport/gdb-dlfcn.h deleted file mode 100644 index 258cfeb..0000000 --- a/gdb/gdbsupport/gdb-dlfcn.h +++ /dev/null @@ -1,51 +0,0 @@ -/* Platform independent shared object routines for GDB. - - Copyright (C) 2011-2020 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 GDB_DLFCN_H -#define GDB_DLFCN_H - -/* A deleter that closes an open dynamic library. */ - -struct dlclose_deleter -{ - void operator() (void *handle) const; -}; - -/* A unique pointer that points to a dynamic library. */ - -typedef std::unique_ptr<void, dlclose_deleter> gdb_dlhandle_up; - -/* Load the dynamic library file named FILENAME, and return a handle - for that dynamic library. Return NULL if the loading fails for any - reason. */ - -gdb_dlhandle_up gdb_dlopen (const char *filename); - -/* Return the address of the symbol named SYMBOL inside the shared - library whose handle is HANDLE. Return NULL when the symbol could - not be found. */ - -void *gdb_dlsym (const gdb_dlhandle_up &handle, const char *symbol); - -/* Return non-zero if the dynamic library functions are available on - this platform. */ - -int is_dl_available(void); - -#endif /* GDB_DLFCN_H */ diff --git a/gdb/gdbsupport/gdb-sigmask.h b/gdb/gdbsupport/gdb-sigmask.h deleted file mode 100644 index cd58c54..0000000 --- a/gdb/gdbsupport/gdb-sigmask.h +++ /dev/null @@ -1,45 +0,0 @@ -/* sigprocmask wrapper for gdb - - Copyright (C) 2019-2020 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_GDB_SIGMASK_H -#define GDBSUPPORT_GDB_SIGMASK_H - -#include <signal.h> - -#ifdef HAVE_SIGPROCMASK - -#ifdef HAVE_PTHREAD_SIGMASK -#define gdb_sigmask pthread_sigmask -#else -#define gdb_sigmask sigprocmask -#endif - -#else /* HAVE_SIGPROCMASK */ - -/* Other code checks HAVE_SIGPROCMASK, but if there happened to be a - system that only had pthread_sigmask, we could still use it with - some extra changes. */ -#ifdef HAVE_PTHREAD_SIGMASK -#error pthead_sigmask available without sigprocmask - please report -#endif - -#endif /* HAVE_SIGPROCMASK */ - - -#endif /* GDBSUPPORT_GDB_SIGMASK_H */ diff --git a/gdb/gdbsupport/gdb_assert.h b/gdb/gdbsupport/gdb_assert.h deleted file mode 100644 index 3936003..0000000 --- a/gdb/gdbsupport/gdb_assert.h +++ /dev/null @@ -1,61 +0,0 @@ -/* GDB-friendly replacement for <assert.h>. - Copyright (C) 2000-2020 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 COMMON_GDB_ASSERT_H -#define COMMON_GDB_ASSERT_H - -#include "errors.h" - -/* A static assertion. This will cause a compile-time error if EXPR, - which must be a compile-time constant, is false. */ - -#define gdb_static_assert(expr) static_assert (expr, "") - -/* PRAGMATICS: "gdb_assert.h":gdb_assert() is a lower case (rather - than upper case) macro since that provides the closest fit to the - existing lower case macro <assert.h>:assert() that it is - replacing. */ - -#define gdb_assert(expr) \ - ((void) ((expr) ? 0 : \ - (gdb_assert_fail (#expr, __FILE__, __LINE__, FUNCTION_NAME), 0))) - -/* This prints an "Assertion failed" message, asking the user if they - want to continue, dump core, or just exit. */ -#if defined (FUNCTION_NAME) -#define gdb_assert_fail(assertion, file, line, function) \ - internal_error (file, line, _("%s: Assertion `%s' failed."), \ - function, assertion) -#else -#define gdb_assert_fail(assertion, file, line, function) \ - internal_error (file, line, _("Assertion `%s' failed."), \ - assertion) -#endif - -/* The canonical form of gdb_assert (0). - MESSAGE is a string to include in the error message. */ - -#if defined (FUNCTION_NAME) -#define gdb_assert_not_reached(message) \ - internal_error (__FILE__, __LINE__, "%s: %s", FUNCTION_NAME, _(message)) -#else -#define gdb_assert_not_reached(message) \ - internal_error (__FILE__, __LINE__, _(message)) -#endif - -#endif /* COMMON_GDB_ASSERT_H */ diff --git a/gdb/gdbsupport/gdb_binary_search.h b/gdb/gdbsupport/gdb_binary_search.h deleted file mode 100644 index a456015..0000000 --- a/gdb/gdbsupport/gdb_binary_search.h +++ /dev/null @@ -1,59 +0,0 @@ -/* C++ implementation of a binary search. - - Copyright (C) 2019-2020 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_GDB_BINARY_SEARCH_H -#define GDBSUPPORT_GDB_BINARY_SEARCH_H - -#include <algorithm> - -namespace gdb { - -/* Implements a binary search using C++ iterators. - This differs from std::binary_search in that it returns an interator for - the found element and in that the type of EL can be different from the - type of the elements in the countainer. - - COMP is a C-style comparison function with signature: - int comp(const value_type& a, const T& b); - It should return -1, 0 or 1 if a is less than, equal to, or greater than - b, respectively. - [first, last) must be sorted. - - The return value is an iterator pointing to the found element, or LAST if - no element was found. */ -template<typename It, typename T, typename Comp> -It binary_search (It first, It last, T el, Comp comp) -{ - auto lt = [&] (const typename std::iterator_traits<It>::value_type &a, - const T &b) - { return comp (a, b) < 0; }; - - auto lb = std::lower_bound (first, last, el, lt); - if (lb != last) - { - if (comp (*lb, el) == 0) - return lb; - } - return last; -} - -} /* namespace gdb */ - -#endif /* GDBSUPPORT_GDB_BINARY_SEARCH_H */ diff --git a/gdb/gdbsupport/gdb_locale.h b/gdb/gdbsupport/gdb_locale.h deleted file mode 100644 index a1d0b67..0000000 --- a/gdb/gdbsupport/gdb_locale.h +++ /dev/null @@ -1,43 +0,0 @@ -/* GDB-friendly replacement for <locale.h>. - Copyright (C) 2002-2020 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 COMMON_GDB_LOCALE_H -#define COMMON_GDB_LOCALE_H - -#ifdef HAVE_LOCALE_H -# include <locale.h> -#endif - -#ifdef ENABLE_NLS -# include <libintl.h> -# define _(String) gettext (String) -# ifdef gettext_noop -# define N_(String) gettext_noop (String) -# else -# define N_(String) (String) -# endif -#else -# define _(String) (String) -# define N_(String) (String) -#endif - -#ifdef HAVE_LANGINFO_CODESET -#include <langinfo.h> -#endif - -#endif /* COMMON_GDB_LOCALE_H */ diff --git a/gdb/gdbsupport/gdb_optional.h b/gdb/gdbsupport/gdb_optional.h deleted file mode 100644 index 02a87f6..0000000 --- a/gdb/gdbsupport/gdb_optional.h +++ /dev/null @@ -1,219 +0,0 @@ -/* An optional object. - - Copyright (C) 2017-2020 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 COMMON_GDB_OPTIONAL_H -#define COMMON_GDB_OPTIONAL_H - -#include "gdbsupport/traits.h" - -namespace gdb -{ - -struct in_place_t -{ - explicit in_place_t () = default; -}; - -constexpr gdb::in_place_t in_place {}; - -/* This class attempts to be a compatible subset of std::optional, - which is slated to be available in C++17. This class optionally - holds an object of some type -- by default it is constructed not - holding an object, but later the object can be "emplaced". This is - similar to using std::unique_ptr, but in-object allocation is - guaranteed. - - Unlike std::optional, we currently only support copy/move - construction/assignment of an optional<T> from either exactly - optional<T> or T. I.e., we don't support copy/move - construction/assignment from optional<U> or U, when U is a type - convertible to T. Making that work depending on the definitions of - T and U is somewhat complicated, and currently the users of this - class don't need it. */ - -template<typename T> -class optional -{ -public: - - constexpr optional () - : m_dummy () - {} - - template<typename... Args> - constexpr optional (in_place_t, Args &&... args) - : m_item (std::forward<Args> (args)...), - m_instantiated (true) - {} - - ~optional () - { this->reset (); } - - /* Copy and move constructors. */ - - optional (const optional &other) - { - if (other.m_instantiated) - this->emplace (other.get ()); - } - - optional (optional &&other) - noexcept(std::is_nothrow_move_constructible<T> ()) - { - if (other.m_instantiated) - this->emplace (std::move (other.get ())); - } - - constexpr optional (const T &other) - : m_item (other), - m_instantiated (true) - {} - - constexpr optional (T &&other) - noexcept (std::is_nothrow_move_constructible<T> ()) - : m_item (std::move (other)), - m_instantiated (true) - {} - - /* Assignment operators. */ - - optional & - operator= (const optional &other) - { - if (m_instantiated && other.m_instantiated) - this->get () = other.get (); - else - { - if (other.m_instantiated) - this->emplace (other.get ()); - else - this->reset (); - } - - return *this; - } - - optional & - operator= (optional &&other) - noexcept (And<std::is_nothrow_move_constructible<T>, - std::is_nothrow_move_assignable<T>> ()) - { - if (m_instantiated && other.m_instantiated) - this->get () = std::move (other.get ()); - else - { - if (other.m_instantiated) - this->emplace (std::move (other.get ())); - else - this->reset (); - } - return *this; - } - - optional & - operator= (const T &other) - { - if (m_instantiated) - this->get () = other; - else - this->emplace (other); - return *this; - } - - optional & - operator= (T &&other) - noexcept (And<std::is_nothrow_move_constructible<T>, - std::is_nothrow_move_assignable<T>> ()) - { - if (m_instantiated) - this->get () = std::move (other); - else - this->emplace (std::move (other)); - return *this; - } - - template<typename... Args> - T &emplace (Args &&... args) - { - this->reset (); - new (&m_item) T (std::forward<Args>(args)...); - m_instantiated = true; - return this->get (); - } - - /* Observers. */ - constexpr const T *operator-> () const - { return std::addressof (this->get ()); } - - T *operator-> () - { return std::addressof (this->get ()); } - - constexpr const T &operator* () const & - { return this->get (); } - - T &operator* () & - { return this->get (); } - - T &&operator* () && - { return std::move (this->get ()); } - - constexpr const T &&operator* () const && - { return std::move (this->get ()); } - - constexpr explicit operator bool () const noexcept - { return m_instantiated; } - - constexpr bool has_value () const noexcept - { return m_instantiated; } - - /* 'reset' is a 'safe' operation with no precondition. */ - void reset () noexcept - { - if (m_instantiated) - this->destroy (); - } - -private: - - /* Destroy the object. */ - void destroy () - { - gdb_assert (m_instantiated); - m_instantiated = false; - m_item.~T (); - } - - /* The get operations have m_instantiated as a precondition. */ - T &get () noexcept { return m_item; } - constexpr const T &get () const noexcept { return m_item; } - - /* The object. */ - union - { - struct { } m_dummy; - T m_item; - }; - - /* True if the object was ever emplaced. */ - bool m_instantiated = false; -}; - -} - -#endif /* COMMON_GDB_OPTIONAL_H */ diff --git a/gdb/gdbsupport/gdb_proc_service.h b/gdb/gdbsupport/gdb_proc_service.h deleted file mode 100644 index 3ce2ee8..0000000 --- a/gdb/gdbsupport/gdb_proc_service.h +++ /dev/null @@ -1,173 +0,0 @@ -/* <proc_service.h> replacement for systems that don't have it. - Copyright (C) 2000-2020 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 COMMON_GDB_PROC_SERVICE_H -#define COMMON_GDB_PROC_SERVICE_H - -#include <sys/types.h> - -#ifdef HAVE_PROC_SERVICE_H - -/* glibc's proc_service.h doesn't wrap itself with extern "C". Need - to do it ourselves. */ -EXTERN_C_PUSH - -#include <proc_service.h> - -EXTERN_C_POP - -#else /* HAVE_PROC_SERVICE_H */ - -/* The following fallback definitions have been imported and adjusted - from glibc's proc_service.h */ - -/* Callback interface for libthread_db, functions users must define. - Copyright (C) 1999,2002,2003 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -/* The definitions in this file must correspond to those in the debugger. */ - -#ifdef HAVE_SYS_PROCFS_H -#include <sys/procfs.h> -#endif - -/* Not all platforms bring in <linux/elf.h> via <sys/procfs.h>. If - <sys/procfs.h> wasn't enough to find elf_fpregset_t, try the kernel - headers also (but don't if we don't need to). */ -#ifndef HAVE_ELF_FPREGSET_T -# ifdef HAVE_LINUX_ELF_H -# include <linux/elf.h> -# endif -#endif - -EXTERN_C_PUSH - -/* Functions in this interface return one of these status codes. */ -typedef enum -{ - PS_OK, /* Generic "call succeeded". */ - PS_ERR, /* Generic error. */ - PS_BADPID, /* Bad process handle. */ - PS_BADLID, /* Bad LWP identifier. */ - PS_BADADDR, /* Bad address. */ - PS_NOSYM, /* Could not find given symbol. */ - PS_NOFREGS /* FPU register set not available for given LWP. */ -} ps_err_e; - -#ifndef HAVE_LWPID_T -typedef unsigned int lwpid_t; -#endif - -#ifndef HAVE_PSADDR_T -typedef void *psaddr_t; -#endif - -#ifndef HAVE_PRGREGSET_T -typedef elf_gregset_t prgregset_t; -#endif - -#ifndef HAVE_PRFPREGSET_T -typedef elf_fpregset_t prfpregset_t; -#endif - -/* This type is opaque in this interface. It's defined by the user of - libthread_db. GDB's version is defined below. */ -struct ps_prochandle; - - -/* Read or write process memory at the given address. */ -extern ps_err_e ps_pdread (struct ps_prochandle *, - psaddr_t, void *, size_t); -extern ps_err_e ps_pdwrite (struct ps_prochandle *, - psaddr_t, const void *, size_t); -extern ps_err_e ps_ptread (struct ps_prochandle *, - psaddr_t, void *, size_t); -extern ps_err_e ps_ptwrite (struct ps_prochandle *, - psaddr_t, const void *, size_t); - - -/* Get and set the given LWP's general or FPU register set. */ -extern ps_err_e ps_lgetregs (struct ps_prochandle *, - lwpid_t, prgregset_t); -extern ps_err_e ps_lsetregs (struct ps_prochandle *, - lwpid_t, const prgregset_t); -extern ps_err_e ps_lgetfpregs (struct ps_prochandle *, - lwpid_t, prfpregset_t *); -extern ps_err_e ps_lsetfpregs (struct ps_prochandle *, - lwpid_t, const prfpregset_t *); - -/* Return the PID of the process. */ -extern pid_t ps_getpid (struct ps_prochandle *); - -/* Fetch the special per-thread address associated with the given LWP. - This call is only used on a few platforms (most use a normal register). - The meaning of the `int' parameter is machine-dependent. */ -extern ps_err_e ps_get_thread_area (struct ps_prochandle *, - lwpid_t, int, psaddr_t *); - - -/* Look up the named symbol in the named DSO in the symbol tables - associated with the process being debugged, filling in *SYM_ADDR - with the corresponding run-time address. */ -extern ps_err_e ps_pglobal_lookup (struct ps_prochandle *, - const char *object_name, - const char *sym_name, - psaddr_t *sym_addr); - - -/* Stop or continue the entire process. */ -extern ps_err_e ps_pstop (struct ps_prochandle *); -extern ps_err_e ps_pcontinue (struct ps_prochandle *); - -/* Stop or continue the given LWP alone. */ -extern ps_err_e ps_lstop (struct ps_prochandle *, lwpid_t); -extern ps_err_e ps_lcontinue (struct ps_prochandle *, lwpid_t); - -/* The following are only defined in/called by Solaris. */ - -/* Get size of extra register set. */ -extern ps_err_e ps_lgetxregsize (struct ps_prochandle *ph, - lwpid_t lwpid, int *xregsize); -/* Get extra register set. */ -extern ps_err_e ps_lgetxregs (struct ps_prochandle *ph, lwpid_t lwpid, - caddr_t xregset); -extern ps_err_e ps_lsetxregs (struct ps_prochandle *ph, lwpid_t lwpid, - caddr_t xregset); - -/* Log a message (sends to gdb_stderr). */ -extern void ps_plog (const char *fmt, ...); - -EXTERN_C_POP - -#endif /* HAVE_PROC_SERVICE_H */ - -#endif /* COMMON_GDB_PROC_SERVICE_H */ diff --git a/gdb/gdbsupport/gdb_ref_ptr.h b/gdb/gdbsupport/gdb_ref_ptr.h deleted file mode 100644 index c5ef13f..0000000 --- a/gdb/gdbsupport/gdb_ref_ptr.h +++ /dev/null @@ -1,228 +0,0 @@ -/* Reference-counted smart pointer class - - Copyright (C) 2016-2020 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 COMMON_GDB_REF_PTR_H -#define COMMON_GDB_REF_PTR_H - -#include <cstddef> - -namespace gdb -{ - -/* An instance of this class either holds a reference to a - reference-counted object or is "NULL". Reference counting is - handled externally by a policy class. If the object holds a - reference, then when the object is destroyed, the reference is - decref'd. - - Normally an instance is constructed using a pointer. This sort of - initialization lets this class manage the lifetime of that - reference. - - Assignment and copy construction will make a new reference as - appropriate. Assignment from a plain pointer is disallowed to - avoid confusion about whether this acquires a new reference; - instead use the "reset" method -- which, like the pointer - constructor, transfers ownership. - - The policy class must provide two static methods: - void incref (T *); - void decref (T *); -*/ -template<typename T, typename Policy> -class ref_ptr -{ - public: - - /* Create a new NULL instance. */ - ref_ptr () - : m_obj (NULL) - { - } - - /* Create a new NULL instance. Note that this is not explicit. */ - ref_ptr (const std::nullptr_t) - : m_obj (NULL) - { - } - - /* Create a new instance. OBJ is a reference, management of which - is now transferred to this class. */ - explicit ref_ptr (T *obj) - : m_obj (obj) - { - } - - /* Copy another instance. */ - ref_ptr (const ref_ptr &other) - : m_obj (other.m_obj) - { - if (m_obj != NULL) - Policy::incref (m_obj); - } - - /* Transfer ownership from OTHER. */ - ref_ptr (ref_ptr &&other) - : m_obj (other.m_obj) - { - other.m_obj = NULL; - } - - /* Destroy this instance. */ - ~ref_ptr () - { - if (m_obj != NULL) - Policy::decref (m_obj); - } - - /* Copy another instance. */ - ref_ptr &operator= (const ref_ptr &other) - { - /* Do nothing on self-assignment. */ - if (this != &other) - { - reset (other.m_obj); - if (m_obj != NULL) - Policy::incref (m_obj); - } - return *this; - } - - /* Transfer ownership from OTHER. */ - ref_ptr &operator= (ref_ptr &&other) - { - /* Do nothing on self-assignment. */ - if (this != &other) - { - reset (other.m_obj); - other.m_obj = NULL; - } - return *this; - } - - /* Change this instance's referent. OBJ is a reference, management - of which is now transferred to this class. */ - void reset (T *obj) - { - if (m_obj != NULL) - Policy::decref (m_obj); - m_obj = obj; - } - - /* Return this instance's referent without changing the state of - this class. */ - T *get () const - { - return m_obj; - } - - /* Return this instance's referent, and stop managing this - reference. The caller is now responsible for the ownership of - the reference. */ - ATTRIBUTE_UNUSED_RESULT T *release () - { - T *result = m_obj; - - m_obj = NULL; - return result; - } - - /* Let users refer to members of the underlying pointer. */ - T *operator-> () const - { - return m_obj; - } - - /* Acquire a new reference and return a ref_ptr that owns it. */ - static ref_ptr<T, Policy> new_reference (T *obj) - { - Policy::incref (obj); - return ref_ptr<T, Policy> (obj); - } - - private: - - T *m_obj; -}; - -template<typename T, typename Policy> -inline bool operator== (const ref_ptr<T, Policy> &lhs, - const ref_ptr<T, Policy> &rhs) -{ - return lhs.get () == rhs.get (); -} - -template<typename T, typename Policy> -inline bool operator== (const ref_ptr<T, Policy> &lhs, const T *rhs) -{ - return lhs.get () == rhs; -} - -template<typename T, typename Policy> -inline bool operator== (const ref_ptr<T, Policy> &lhs, const std::nullptr_t) -{ - return lhs.get () == nullptr; -} - -template<typename T, typename Policy> -inline bool operator== (const T *lhs, const ref_ptr<T, Policy> &rhs) -{ - return lhs == rhs.get (); -} - -template<typename T, typename Policy> -inline bool operator== (const std::nullptr_t, const ref_ptr<T, Policy> &rhs) -{ - return nullptr == rhs.get (); -} - -template<typename T, typename Policy> -inline bool operator!= (const ref_ptr<T, Policy> &lhs, - const ref_ptr<T, Policy> &rhs) -{ - return lhs.get () != rhs.get (); -} - -template<typename T, typename Policy> -inline bool operator!= (const ref_ptr<T, Policy> &lhs, const T *rhs) -{ - return lhs.get () != rhs; -} - -template<typename T, typename Policy> -inline bool operator!= (const ref_ptr<T, Policy> &lhs, const std::nullptr_t) -{ - return lhs.get () != nullptr; -} - -template<typename T, typename Policy> -inline bool operator!= (const T *lhs, const ref_ptr<T, Policy> &rhs) -{ - return lhs != rhs.get (); -} - -template<typename T, typename Policy> -inline bool operator!= (const std::nullptr_t, const ref_ptr<T, Policy> &rhs) -{ - return nullptr != rhs.get (); -} - -} - -#endif /* COMMON_GDB_REF_PTR_H */ diff --git a/gdb/gdbsupport/gdb_setjmp.h b/gdb/gdbsupport/gdb_setjmp.h deleted file mode 100644 index 168833a..0000000 --- a/gdb/gdbsupport/gdb_setjmp.h +++ /dev/null @@ -1,36 +0,0 @@ -/* Portability wrappers for setjmp and longjmp. - Copyright (C) 1986-2020 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 COMMON_GDB_SETJMP_H -#define COMMON_GDB_SETJMP_H - -#include <setjmp.h> - -#ifdef HAVE_SIGSETJMP -#define SIGJMP_BUF sigjmp_buf -#define SIGSETJMP(buf,val) sigsetjmp((buf), val) -#define SIGLONGJMP(buf,val) siglongjmp((buf), (val)) -#else -#define SIGJMP_BUF jmp_buf -/* We ignore val here because that's safer and avoids having to check - whether _setjmp exists. */ -#define SIGSETJMP(buf,val) setjmp(buf) -#define SIGLONGJMP(buf,val) longjmp((buf), (val)) -#endif - -#endif /* COMMON_GDB_SETJMP_H */ diff --git a/gdb/gdbsupport/gdb_signals.h b/gdb/gdbsupport/gdb_signals.h deleted file mode 100644 index fbbb7be..0000000 --- a/gdb/gdbsupport/gdb_signals.h +++ /dev/null @@ -1,58 +0,0 @@ -/* Target signal translation functions for GDB. - Copyright (C) 1990-2020 Free Software Foundation, Inc. - Contributed by Cygnus Support. - - 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 COMMON_GDB_SIGNALS_H -#define COMMON_GDB_SIGNALS_H - -#include "gdb/signals.h" - -/* Predicate to gdb_signal_to_host(). Return non-zero if the enum - targ_signal SIGNO has an equivalent ``host'' representation. */ -/* FIXME: cagney/1999-11-22: The name below was chosen in preference - to the shorter gdb_signal_p() because it is far less ambigious. - In this context ``gdb_signal'' refers to GDB's internal - representation of the target's set of signals while ``host signal'' - refers to the target operating system's signal. Confused? */ -extern int gdb_signal_to_host_p (enum gdb_signal signo); - -/* Convert between host signal numbers and enum gdb_signal's. - gdb_signal_to_host() returns 0 and prints a warning() on GDB's - console if SIGNO has no equivalent host representation. */ -/* FIXME: cagney/1999-11-22: Here ``host'' is used incorrectly, it is - refering to the target operating system's signal numbering. - Similarly, ``enum gdb_signal'' is named incorrectly, ``enum - gdb_signal'' would probably be better as it is refering to GDB's - internal representation of a target operating system's signal. */ -extern enum gdb_signal gdb_signal_from_host (int); -extern int gdb_signal_to_host (enum gdb_signal); - -/* Return the enum symbol name of SIG as a string, to use in debug - output. */ -extern const char *gdb_signal_to_symbol_string (enum gdb_signal sig); - -/* Return the string for a signal. */ -extern const char *gdb_signal_to_string (enum gdb_signal); - -/* Return the name (SIGHUP, etc.) for a signal. */ -extern const char *gdb_signal_to_name (enum gdb_signal); - -/* Given a name (SIGHUP, etc.), return its signal. */ -enum gdb_signal gdb_signal_from_name (const char *); - -#endif /* COMMON_GDB_SIGNALS_H */ diff --git a/gdb/gdbsupport/gdb_splay_tree.h b/gdb/gdbsupport/gdb_splay_tree.h deleted file mode 100644 index b0f533e..0000000 --- a/gdb/gdbsupport/gdb_splay_tree.h +++ /dev/null @@ -1,42 +0,0 @@ -/* GDB wrapper for splay trees. - - Copyright (C) 2017-2020 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 COMMON_GDB_SPLAY_TREE_H -#define COMMON_GDB_SPLAY_TREE_H - -#include "splay-tree.h" - -namespace gdb { - -struct splay_tree_deleter -{ - void operator() (splay_tree tree) const - { - splay_tree_delete (tree); - } -}; - -} /* namespace gdb */ - -/* A unique pointer to a splay tree. */ - -typedef std::unique_ptr<splay_tree_s, gdb::splay_tree_deleter> - gdb_splay_tree_up; - -#endif /* COMMON_GDB_SPLAY_TREE_H */ diff --git a/gdb/gdbsupport/gdb_string_view.h b/gdb/gdbsupport/gdb_string_view.h deleted file mode 100644 index c0ae7a8..0000000 --- a/gdb/gdbsupport/gdb_string_view.h +++ /dev/null @@ -1,563 +0,0 @@ -// Components for manipulating non-owning sequences of characters -*- C++ -*- - - -#ifndef COMMON_GDB_STRING_VIEW_H -#define COMMON_GDB_STRING_VIEW_H - -// Note: This file has been stolen from the gcc repo -// (libstdc++-v3/include/experimental/string_view) and has local modifications. - -// Copyright (C) 2013-2020 Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) -// any later version. - -// This library 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. - -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// <http://www.gnu.org/licenses/>. - -// -// N3762 basic_string_view library -// - - -#if __cplusplus >= 201703L - -#include <string_view> - -namespace gdb { - using string_view = std::string_view; -} /* namespace gdb */ - -#else /* __cplusplus < 201703L */ - -#include <string> -#include <limits> -#include "gdb_assert.h" - -namespace gdb { - - /** - * @class basic_string_view <experimental/string_view> - * @brief A non-owning reference to a string. - * - * @ingroup strings - * @ingroup sequences - * @ingroup experimental - * - * @tparam _CharT Type of character - * @tparam _Traits Traits for character type, defaults to - * char_traits<_CharT>. - * - * A basic_string_view looks like this: - * - * @code - * _CharT* _M_str - * size_t _M_len - * @endcode - */ - template<typename _CharT, typename _Traits = std::char_traits<_CharT>> - class basic_string_view - { - public: - - // types - using traits_type = _Traits; - using value_type = _CharT; - using pointer = const _CharT*; - using const_pointer = const _CharT*; - using reference = const _CharT&; - using const_reference = const _CharT&; - using const_iterator = const _CharT*; - using iterator = const_iterator; - using const_reverse_iterator = std::reverse_iterator<const_iterator>; - using reverse_iterator = const_reverse_iterator; - using size_type = size_t; - using difference_type = ptrdiff_t; - static constexpr size_type npos = size_type(-1); - - // [string.view.cons], construct/copy - - constexpr - basic_string_view() noexcept - : _M_len{0}, _M_str{nullptr} - { } - - constexpr basic_string_view(const basic_string_view&) noexcept = default; - - template<typename _Allocator> - basic_string_view(const std::basic_string<_CharT, _Traits, - _Allocator>& __str) noexcept - : _M_len{__str.length()}, _M_str{__str.data()} - { } - - /*constexpr*/ basic_string_view(const _CharT* __str) - : _M_len{__str == nullptr ? 0 : traits_type::length(__str)}, - _M_str{__str} - { } - - constexpr basic_string_view(const _CharT* __str, size_type __len) - : _M_len{__len}, - _M_str{__str} - { } - - basic_string_view& - operator=(const basic_string_view&) noexcept = default; - - // [string.view.iterators], iterators - - constexpr const_iterator - begin() const noexcept - { return this->_M_str; } - - constexpr const_iterator - end() const noexcept - { return this->_M_str + this->_M_len; } - - constexpr const_iterator - cbegin() const noexcept - { return this->_M_str; } - - constexpr const_iterator - cend() const noexcept - { return this->_M_str + this->_M_len; } - - const_reverse_iterator - rbegin() const noexcept - { return const_reverse_iterator(this->end()); } - - const_reverse_iterator - rend() const noexcept - { return const_reverse_iterator(this->begin()); } - - const_reverse_iterator - crbegin() const noexcept - { return const_reverse_iterator(this->end()); } - - const_reverse_iterator - crend() const noexcept - { return const_reverse_iterator(this->begin()); } - - // [string.view.capacity], capacity - - constexpr size_type - size() const noexcept - { return this->_M_len; } - - constexpr size_type - length() const noexcept - { return _M_len; } - - constexpr size_type - max_size() const noexcept - { - return (npos - sizeof(size_type) - sizeof(void*)) - / sizeof(value_type) / 4; - } - - constexpr bool - empty() const noexcept - { return this->_M_len == 0; } - - // [string.view.access], element access - - constexpr const _CharT& - operator[](size_type __pos) const - { - // TODO: Assert to restore in a way compatible with the constexpr. - // __glibcxx_assert(__pos < this->_M_len); - return *(this->_M_str + __pos); - } - - constexpr const _CharT& - at(size_type __pos) const - { - return __pos < this->_M_len - ? *(this->_M_str + __pos) - : (error (_("basic_string_view::at: __pos " - "(which is %zu) >= this->size() " - "(which is %zu)"), - __pos, this->size()), - *this->_M_str); - } - - constexpr const _CharT& - front() const - { - // TODO: Assert to restore in a way compatible with the constexpr. - // __glibcxx_assert(this->_M_len > 0); - return *this->_M_str; - } - - constexpr const _CharT& - back() const - { - // TODO: Assert to restore in a way compatible with the constexpr. - // __glibcxx_assert(this->_M_len > 0); - return *(this->_M_str + this->_M_len - 1); - } - - constexpr const _CharT* - data() const noexcept - { return this->_M_str; } - - // [string.view.modifiers], modifiers: - - /*constexpr*/ void - remove_prefix(size_type __n) - { - gdb_assert (this->_M_len >= __n); - this->_M_str += __n; - this->_M_len -= __n; - } - - /*constexpr*/ void - remove_suffix(size_type __n) - { this->_M_len -= __n; } - - /*constexpr*/ void - swap(basic_string_view& __sv) noexcept - { - auto __tmp = *this; - *this = __sv; - __sv = __tmp; - } - - - // [string.view.ops], string operations: - - template<typename _Allocator> - explicit operator std::basic_string<_CharT, _Traits, _Allocator>() const - { - return { this->_M_str, this->_M_len }; - } - - template<typename _Allocator = std::allocator<_CharT>> - std::basic_string<_CharT, _Traits, _Allocator> - to_string(const _Allocator& __alloc = _Allocator()) const - { - return { this->_M_str, this->_M_len, __alloc }; - } - - size_type - copy(_CharT* __str, size_type __n, size_type __pos = 0) const - { - gdb_assert (__str != nullptr || __n == 0); - if (__pos > this->_M_len) - error (_("basic_string_view::copy: __pos " - "(which is %zu) > this->size() " - "(which is %zu)"), - __pos, this->size()); - size_type __rlen{std::min(__n, size_type{this->_M_len - __pos})}; - for (auto __begin = this->_M_str + __pos, - __end = __begin + __rlen; __begin != __end;) - *__str++ = *__begin++; - return __rlen; - } - - - // [string.view.ops], string operations: - - /*constexpr*/ basic_string_view - substr(size_type __pos, size_type __n=npos) const - { - return __pos <= this->_M_len - ? basic_string_view{this->_M_str + __pos, - std::min(__n, size_type{this->_M_len - __pos})} - : (error (_("basic_string_view::substr: __pos " - "(which is %zu) > this->size() " - "(which is %zu)"), - __pos, this->size()), basic_string_view{}); - } - - /*constexpr*/ int - compare(basic_string_view __str) const noexcept - { - int __ret = traits_type::compare(this->_M_str, __str._M_str, - std::min(this->_M_len, __str._M_len)); - if (__ret == 0) - __ret = _S_compare(this->_M_len, __str._M_len); - return __ret; - } - - /*constexpr*/ int - compare(size_type __pos1, size_type __n1, basic_string_view __str) const - { return this->substr(__pos1, __n1).compare(__str); } - - /*constexpr*/ int - compare(size_type __pos1, size_type __n1, - basic_string_view __str, size_type __pos2, size_type __n2) const - { return this->substr(__pos1, __n1).compare(__str.substr(__pos2, __n2)); } - - /*constexpr*/ int - compare(const _CharT* __str) const noexcept - { return this->compare(basic_string_view{__str}); } - - /*constexpr*/ int - compare(size_type __pos1, size_type __n1, const _CharT* __str) const - { return this->substr(__pos1, __n1).compare(basic_string_view{__str}); } - - /*constexpr*/ int - compare(size_type __pos1, size_type __n1, - const _CharT* __str, size_type __n2) const - { - return this->substr(__pos1, __n1) - .compare(basic_string_view(__str, __n2)); - } - - /*constexpr*/ size_type - find(basic_string_view __str, size_type __pos = 0) const noexcept - { return this->find(__str._M_str, __pos, __str._M_len); } - - /*constexpr*/ size_type - find(_CharT __c, size_type __pos=0) const noexcept; - - /*constexpr*/ size_type - find(const _CharT* __str, size_type __pos, size_type __n) const noexcept; - - /*constexpr*/ size_type - find(const _CharT* __str, size_type __pos=0) const noexcept - { return this->find(__str, __pos, traits_type::length(__str)); } - - /*constexpr*/ size_type - rfind(basic_string_view __str, size_type __pos = npos) const noexcept - { return this->rfind(__str._M_str, __pos, __str._M_len); } - - /*constexpr*/ size_type - rfind(_CharT __c, size_type __pos = npos) const noexcept; - - /*constexpr*/ size_type - rfind(const _CharT* __str, size_type __pos, size_type __n) const noexcept; - - /*constexpr*/ size_type - rfind(const _CharT* __str, size_type __pos = npos) const noexcept - { return this->rfind(__str, __pos, traits_type::length(__str)); } - - /*constexpr*/ size_type - find_first_of(basic_string_view __str, size_type __pos = 0) const noexcept - { return this->find_first_of(__str._M_str, __pos, __str._M_len); } - - /*constexpr*/ size_type - find_first_of(_CharT __c, size_type __pos = 0) const noexcept - { return this->find(__c, __pos); } - - /*constexpr*/ size_type - find_first_of(const _CharT* __str, size_type __pos, size_type __n) const; - - /*constexpr*/ size_type - find_first_of(const _CharT* __str, size_type __pos = 0) const noexcept - { return this->find_first_of(__str, __pos, traits_type::length(__str)); } - - /*constexpr*/ size_type - find_last_of(basic_string_view __str, - size_type __pos = npos) const noexcept - { return this->find_last_of(__str._M_str, __pos, __str._M_len); } - - size_type - find_last_of(_CharT __c, size_type __pos=npos) const noexcept - { return this->rfind(__c, __pos); } - - /*constexpr*/ size_type - find_last_of(const _CharT* __str, size_type __pos, size_type __n) const; - - /*constexpr*/ size_type - find_last_of(const _CharT* __str, size_type __pos = npos) const noexcept - { return this->find_last_of(__str, __pos, traits_type::length(__str)); } - - /*constexpr*/ size_type - find_first_not_of(basic_string_view __str, - size_type __pos = 0) const noexcept - { return this->find_first_not_of(__str._M_str, __pos, __str._M_len); } - - /*constexpr*/ size_type - find_first_not_of(_CharT __c, size_type __pos = 0) const noexcept; - - /*constexpr*/ size_type - find_first_not_of(const _CharT* __str, - size_type __pos, size_type __n) const; - - /*constexpr*/ size_type - find_first_not_of(const _CharT* __str, size_type __pos = 0) const noexcept - { - return this->find_first_not_of(__str, __pos, - traits_type::length(__str)); - } - - /*constexpr*/ size_type - find_last_not_of(basic_string_view __str, - size_type __pos = npos) const noexcept - { return this->find_last_not_of(__str._M_str, __pos, __str._M_len); } - - /*constexpr*/ size_type - find_last_not_of(_CharT __c, size_type __pos = npos) const noexcept; - - /*constexpr*/ size_type - find_last_not_of(const _CharT* __str, - size_type __pos, size_type __n) const; - - /*constexpr*/ size_type - find_last_not_of(const _CharT* __str, - size_type __pos = npos) const noexcept - { - return this->find_last_not_of(__str, __pos, - traits_type::length(__str)); - } - - private: - - static constexpr int - _S_compare(size_type __n1, size_type __n2) noexcept - { - return difference_type(__n1 - __n2) > std::numeric_limits<int>::max() - ? std::numeric_limits<int>::max() - : difference_type(__n1 - __n2) < std::numeric_limits<int>::min() - ? std::numeric_limits<int>::min() - : static_cast<int>(difference_type(__n1 - __n2)); - } - - size_t _M_len; - const _CharT* _M_str; - }; - - // [string.view.comparison], non-member basic_string_view comparison functions - - namespace __detail - { - // Identity transform to create a non-deduced context, so that only one - // argument participates in template argument deduction and the other - // argument gets implicitly converted to the deduced type. See n3766.html. - template<typename _Tp> - using __idt = typename std::common_type<_Tp>::type; - } - - template<typename _CharT, typename _Traits> - /*constexpr*/ bool - operator==(basic_string_view<_CharT, _Traits> __x, - basic_string_view<_CharT, _Traits> __y) noexcept - { return __x.size() == __y.size() && __x.compare(__y) == 0; } - - template<typename _CharT, typename _Traits> - /*constexpr*/ bool - operator==(basic_string_view<_CharT, _Traits> __x, - __detail::__idt<basic_string_view<_CharT, _Traits>> __y) noexcept - { return __x.size() == __y.size() && __x.compare(__y) == 0; } - - template<typename _CharT, typename _Traits> - /*constexpr*/ bool - operator==(__detail::__idt<basic_string_view<_CharT, _Traits>> __x, - basic_string_view<_CharT, _Traits> __y) noexcept - { return __x.size() == __y.size() && __x.compare(__y) == 0; } - - template<typename _CharT, typename _Traits> - /*constexpr*/ bool - operator!=(basic_string_view<_CharT, _Traits> __x, - basic_string_view<_CharT, _Traits> __y) noexcept - { return !(__x == __y); } - - template<typename _CharT, typename _Traits> - /*constexpr*/ bool - operator!=(basic_string_view<_CharT, _Traits> __x, - __detail::__idt<basic_string_view<_CharT, _Traits>> __y) noexcept - { return !(__x == __y); } - - template<typename _CharT, typename _Traits> - /*constexpr*/ bool - operator!=(__detail::__idt<basic_string_view<_CharT, _Traits>> __x, - basic_string_view<_CharT, _Traits> __y) noexcept - { return !(__x == __y); } - - template<typename _CharT, typename _Traits> - /*constexpr*/ bool - operator< (basic_string_view<_CharT, _Traits> __x, - basic_string_view<_CharT, _Traits> __y) noexcept - { return __x.compare(__y) < 0; } - - template<typename _CharT, typename _Traits> - /*constexpr*/ bool - operator< (basic_string_view<_CharT, _Traits> __x, - __detail::__idt<basic_string_view<_CharT, _Traits>> __y) noexcept - { return __x.compare(__y) < 0; } - - template<typename _CharT, typename _Traits> - /*constexpr*/ bool - operator< (__detail::__idt<basic_string_view<_CharT, _Traits>> __x, - basic_string_view<_CharT, _Traits> __y) noexcept - { return __x.compare(__y) < 0; } - - template<typename _CharT, typename _Traits> - /*constexpr*/ bool - operator> (basic_string_view<_CharT, _Traits> __x, - basic_string_view<_CharT, _Traits> __y) noexcept - { return __x.compare(__y) > 0; } - - template<typename _CharT, typename _Traits> - /*constexpr*/ bool - operator> (basic_string_view<_CharT, _Traits> __x, - __detail::__idt<basic_string_view<_CharT, _Traits>> __y) noexcept - { return __x.compare(__y) > 0; } - - template<typename _CharT, typename _Traits> - /*constexpr*/ bool - operator> (__detail::__idt<basic_string_view<_CharT, _Traits>> __x, - basic_string_view<_CharT, _Traits> __y) noexcept - { return __x.compare(__y) > 0; } - - template<typename _CharT, typename _Traits> - /*constexpr*/ bool - operator<=(basic_string_view<_CharT, _Traits> __x, - basic_string_view<_CharT, _Traits> __y) noexcept - { return __x.compare(__y) <= 0; } - - template<typename _CharT, typename _Traits> - /*constexpr*/ bool - operator<=(basic_string_view<_CharT, _Traits> __x, - __detail::__idt<basic_string_view<_CharT, _Traits>> __y) noexcept - { return __x.compare(__y) <= 0; } - - template<typename _CharT, typename _Traits> - /*constexpr*/ bool - operator<=(__detail::__idt<basic_string_view<_CharT, _Traits>> __x, - basic_string_view<_CharT, _Traits> __y) noexcept - { return __x.compare(__y) <= 0; } - - template<typename _CharT, typename _Traits> - /*constexpr*/ bool - operator>=(basic_string_view<_CharT, _Traits> __x, - basic_string_view<_CharT, _Traits> __y) noexcept - { return __x.compare(__y) >= 0; } - - template<typename _CharT, typename _Traits> - /*constexpr*/ bool - operator>=(basic_string_view<_CharT, _Traits> __x, - __detail::__idt<basic_string_view<_CharT, _Traits>> __y) noexcept - { return __x.compare(__y) >= 0; } - - template<typename _CharT, typename _Traits> - /*constexpr*/ bool - operator>=(__detail::__idt<basic_string_view<_CharT, _Traits>> __x, - basic_string_view<_CharT, _Traits> __y) noexcept - { return __x.compare(__y) >= 0; } - - // basic_string_view typedef names - - using string_view = basic_string_view<char>; -} /* namespace gdb */ - -#include "gdb_string_view.tcc" - -#endif // __cplusplus < 201703L - -#endif /* COMMON_GDB_STRING_VIEW_H */ diff --git a/gdb/gdbsupport/gdb_string_view.tcc b/gdb/gdbsupport/gdb_string_view.tcc deleted file mode 100644 index ebf5907..0000000 --- a/gdb/gdbsupport/gdb_string_view.tcc +++ /dev/null @@ -1,219 +0,0 @@ -// Components for manipulating non-owning sequences of characters -*- C++ -*- - -// Note: This file has been stolen from the gcc repo -// (libstdc++-v3/include/experimental/bits/string_view.tcc) and has local -// modifications. - -// Copyright (C) 2013-2020 Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) -// any later version. - -// This library 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. - -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// <http://www.gnu.org/licenses/>. - -/** @file experimental/bits/string_view.tcc - * This is an internal header file, included by other library headers. - * Do not attempt to use it directly. @headername{experimental/string_view} - */ - -// -// N3762 basic_string_view library -// - -#ifndef GDB_STRING_VIEW_TCC -#define GDB_STRING_VIEW_TCC 1 - -namespace gdb -{ - template<typename _CharT, typename _Traits> - /*constexpr*/ typename basic_string_view<_CharT, _Traits>::size_type - basic_string_view<_CharT, _Traits>:: - find(const _CharT* __str, size_type __pos, size_type __n) const noexcept - { - gdb_assert (__str != nullptr || __n == 0); - - if (__n == 0) - return __pos <= this->_M_len ? __pos : npos; - - if (__n <= this->_M_len) - { - for (; __pos <= this->_M_len - __n; ++__pos) - if (traits_type::eq(this->_M_str[__pos], __str[0]) - && traits_type::compare(this->_M_str + __pos + 1, - __str + 1, __n - 1) == 0) - return __pos; - } - return npos; - } - - template<typename _CharT, typename _Traits> - /*constexpr*/ typename basic_string_view<_CharT, _Traits>::size_type - basic_string_view<_CharT, _Traits>:: - find(_CharT __c, size_type __pos) const noexcept - { - size_type __ret = npos; - if (__pos < this->_M_len) - { - const size_type __n = this->_M_len - __pos; - const _CharT* __p = traits_type::find(this->_M_str + __pos, __n, __c); - if (__p) - __ret = __p - this->_M_str; - } - return __ret; - } - - template<typename _CharT, typename _Traits> - /*constexpr*/ typename basic_string_view<_CharT, _Traits>::size_type - basic_string_view<_CharT, _Traits>:: - rfind(const _CharT* __str, size_type __pos, size_type __n) const noexcept - { - gdb_assert (__str != nullptr || __n == 0); - - if (__n <= this->_M_len) - { - __pos = std::min(size_type(this->_M_len - __n), __pos); - do - { - if (traits_type::compare(this->_M_str + __pos, __str, __n) == 0) - return __pos; - } - while (__pos-- > 0); - } - return npos; - } - - template<typename _CharT, typename _Traits> - /*constexpr*/ typename basic_string_view<_CharT, _Traits>::size_type - basic_string_view<_CharT, _Traits>:: - rfind(_CharT __c, size_type __pos) const noexcept - { - size_type __size = this->_M_len; - if (__size > 0) - { - if (--__size > __pos) - __size = __pos; - for (++__size; __size-- > 0; ) - if (traits_type::eq(this->_M_str[__size], __c)) - return __size; - } - return npos; - } - - template<typename _CharT, typename _Traits> - /*constexpr*/ typename basic_string_view<_CharT, _Traits>::size_type - basic_string_view<_CharT, _Traits>:: - find_first_of(const _CharT* __str, size_type __pos, size_type __n) const - { - gdb_assert (__str != nullptr || __n == 0); - for (; __n && __pos < this->_M_len; ++__pos) - { - const _CharT* __p = traits_type::find(__str, __n, - this->_M_str[__pos]); - if (__p) - return __pos; - } - return npos; - } - - template<typename _CharT, typename _Traits> - /*constexpr*/ typename basic_string_view<_CharT, _Traits>::size_type - basic_string_view<_CharT, _Traits>:: - find_last_of(const _CharT* __str, size_type __pos, size_type __n) const - { - gdb_assert (__str != nullptr || __n == 0); - size_type __size = this->size(); - if (__size && __n) - { - if (--__size > __pos) - __size = __pos; - do - { - if (traits_type::find(__str, __n, this->_M_str[__size])) - return __size; - } - while (__size-- != 0); - } - return npos; - } - - template<typename _CharT, typename _Traits> - /*constexpr*/ typename basic_string_view<_CharT, _Traits>::size_type - basic_string_view<_CharT, _Traits>:: - find_first_not_of(const _CharT* __str, size_type __pos, size_type __n) const - { - gdb_assert (__str != nullptr || __n == 0); - for (; __pos < this->_M_len; ++__pos) - if (!traits_type::find(__str, __n, this->_M_str[__pos])) - return __pos; - return npos; - } - - template<typename _CharT, typename _Traits> - /*constexpr*/ typename basic_string_view<_CharT, _Traits>::size_type - basic_string_view<_CharT, _Traits>:: - find_first_not_of(_CharT __c, size_type __pos) const noexcept - { - for (; __pos < this->_M_len; ++__pos) - if (!traits_type::eq(this->_M_str[__pos], __c)) - return __pos; - return npos; - } - - template<typename _CharT, typename _Traits> - /*constexpr*/ typename basic_string_view<_CharT, _Traits>::size_type - basic_string_view<_CharT, _Traits>:: - find_last_not_of(const _CharT* __str, size_type __pos, size_type __n) const - { - gdb_assert (__str != nullptr || __n == 0); - size_type __size = this->_M_len; - if (__size) - { - if (--__size > __pos) - __size = __pos; - do - { - if (!traits_type::find(__str, __n, this->_M_str[__size])) - return __size; - } - while (__size--); - } - return npos; - } - - template<typename _CharT, typename _Traits> - /*constexpr*/ typename basic_string_view<_CharT, _Traits>::size_type - basic_string_view<_CharT, _Traits>:: - find_last_not_of(_CharT __c, size_type __pos) const noexcept - { - size_type __size = this->_M_len; - if (__size) - { - if (--__size > __pos) - __size = __pos; - do - { - if (!traits_type::eq(this->_M_str[__size], __c)) - return __size; - } - while (__size--); - } - return npos; - } -} // namespace gdb - -#endif // GDB_STRING_VIEW_TCC diff --git a/gdb/gdbsupport/gdb_sys_time.h b/gdb/gdbsupport/gdb_sys_time.h deleted file mode 100644 index b3b0cbe..0000000 --- a/gdb/gdbsupport/gdb_sys_time.h +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (C) 2015-2020 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 COMMON_GDB_SYS_TIME_H -#define COMMON_GDB_SYS_TIME_H - -#include <sys/time.h> - -/* On MinGW-w64, gnulib's sys/time.h replaces 'struct timeval' and - gettimeofday with versions that support 64-bit time_t, for POSIX - compliance. However, the gettimeofday replacement does not ever - return time_t values larger than 31-bit, as it simply returns the - system's gettimeofday's (signed) 32-bit result as (signed) 64-bit. - Because we don't really need the POSIX compliance, and it ends up - causing conflicts with other libraries we use that don't use gnulib - and thus work with the native struct timeval, such as Winsock2's - native 'select' and libiberty, simply undefine away gnulib's - replacements. */ -#if GNULIB_defined_struct_timeval -# undef timeval -# undef gettimeofday -#endif - -#endif /* COMMON_GDB_SYS_TIME_H */ diff --git a/gdb/gdbsupport/gdb_tilde_expand.c b/gdb/gdbsupport/gdb_tilde_expand.c deleted file mode 100644 index 6671629..0000000 --- a/gdb/gdbsupport/gdb_tilde_expand.c +++ /dev/null @@ -1,95 +0,0 @@ -/* Perform tilde expansion on paths for GDB and gdbserver. - - Copyright (C) 2017-2020 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 "common-defs.h" -#include "gdb_tilde_expand.h" -#include <glob.h> - -/* RAII-style class wrapping "glob". */ - -class gdb_glob -{ -public: - /* Construct a "gdb_glob" object by calling "glob" with the provided - parameters. This function can throw if "glob" fails. */ - gdb_glob (const char *pattern, int flags, - int (*errfunc) (const char *epath, int eerrno)) - { - int ret = glob (pattern, flags, errfunc, &m_glob); - - if (ret != 0) - { - if (ret == GLOB_NOMATCH) - error (_("Could not find a match for '%s'."), pattern); - else - error (_("glob could not process pattern '%s'."), - pattern); - } - } - - /* Destroy the object and free M_GLOB. */ - ~gdb_glob () - { - globfree (&m_glob); - } - - /* Return the GL_PATHC component of M_GLOB. */ - int pathc () const - { - return m_glob.gl_pathc; - } - - /* Return the GL_PATHV component of M_GLOB. */ - char **pathv () const - { - return m_glob.gl_pathv; - } - -private: - /* The actual glob object we're dealing with. */ - glob_t m_glob; -}; - -/* See gdbsupport/gdb_tilde_expand.h. */ - -std::string -gdb_tilde_expand (const char *dir) -{ - gdb_glob glob (dir, GLOB_TILDE_CHECK, NULL); - - gdb_assert (glob.pathc () > 0); - /* "glob" may return more than one match to the path provided by the - user, but we are only interested in the first match. */ - std::string expanded_dir = glob.pathv ()[0]; - - return expanded_dir; -} - -/* See gdbsupport/gdb_tilde_expand.h. */ - -gdb::unique_xmalloc_ptr<char> -gdb_tilde_expand_up (const char *dir) -{ - gdb_glob glob (dir, GLOB_TILDE_CHECK, NULL); - - gdb_assert (glob.pathc () > 0); - /* "glob" may return more than one match to the path provided by the - user, but we are only interested in the first match. */ - return make_unique_xstrdup (glob.pathv ()[0]); -} diff --git a/gdb/gdbsupport/gdb_tilde_expand.h b/gdb/gdbsupport/gdb_tilde_expand.h deleted file mode 100644 index 5f4ef60..0000000 --- a/gdb/gdbsupport/gdb_tilde_expand.h +++ /dev/null @@ -1,31 +0,0 @@ -/* Perform tilde expansion on paths for GDB and gdbserver. - - Copyright (C) 2017-2020 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 COMMON_GDB_TILDE_EXPAND_H -#define COMMON_GDB_TILDE_EXPAND_H - -/* Perform path expansion (i.e., tilde expansion) on DIR, and return - the full path. */ -extern std::string gdb_tilde_expand (const char *dir); - -/* Same as GDB_TILDE_EXPAND, but return the full path as a - gdb::unique_xmalloc_ptr<char>. */ -extern gdb::unique_xmalloc_ptr<char> gdb_tilde_expand_up (const char *dir); - -#endif /* COMMON_GDB_TILDE_EXPAND_H */ diff --git a/gdb/gdbsupport/gdb_unique_ptr.h b/gdb/gdbsupport/gdb_unique_ptr.h deleted file mode 100644 index 5e383b9..0000000 --- a/gdb/gdbsupport/gdb_unique_ptr.h +++ /dev/null @@ -1,67 +0,0 @@ -/* std::unique_ptr specializations for GDB. - - Copyright (C) 2016-2020 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 COMMON_GDB_UNIQUE_PTR_H -#define COMMON_GDB_UNIQUE_PTR_H - -#include <memory> - -namespace gdb -{ -/* Define gdb::unique_xmalloc_ptr, a std::unique_ptr that manages - xmalloc'ed memory. */ - -/* The deleter for std::unique_xmalloc_ptr. Uses xfree. */ -template <typename T> -struct xfree_deleter -{ - void operator() (T *ptr) const { xfree (ptr); } -}; - -/* Same, for arrays. */ -template <typename T> -struct xfree_deleter<T[]> -{ - void operator() (T *ptr) const { xfree (ptr); } -}; - -/* Import the standard unique_ptr to our namespace with a custom - deleter. */ - -template<typename T> using unique_xmalloc_ptr - = std::unique_ptr<T, xfree_deleter<T>>; - -/* A no-op deleter. */ -template<typename T> -struct noop_deleter -{ - void operator() (T *ptr) const { } -}; - -} /* namespace gdb */ - -/* Dup STR and return a unique_xmalloc_ptr for the result. */ - -static inline gdb::unique_xmalloc_ptr<char> -make_unique_xstrdup (const char *str) -{ - return gdb::unique_xmalloc_ptr<char> (xstrdup (str)); -} - -#endif /* COMMON_GDB_UNIQUE_PTR_H */ diff --git a/gdb/gdbsupport/gdb_unlinker.h b/gdb/gdbsupport/gdb_unlinker.h deleted file mode 100644 index 9d64cca..0000000 --- a/gdb/gdbsupport/gdb_unlinker.h +++ /dev/null @@ -1,60 +0,0 @@ -/* Unlinking class - - Copyright (C) 2016-2020 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 COMMON_GDB_UNLINKER_H -#define COMMON_GDB_UNLINKER_H - -namespace gdb -{ - -/* An object of this class holds a filename and, when the object goes - of scope, the file is removed using unlink. - - A user of this class can request that the file be preserved using - the "keep" method. */ -class unlinker -{ - public: - - unlinker (const char *filename) ATTRIBUTE_NONNULL (2) - : m_filename (filename) - { - gdb_assert (filename != NULL); - } - - ~unlinker () - { - if (m_filename != NULL) - unlink (m_filename); - } - - /* Keep the file, rather than unlink it. */ - void keep () - { - m_filename = NULL; - } - - private: - - const char *m_filename; -}; - -} - -#endif /* COMMON_GDB_UNLINKER_H */ diff --git a/gdb/gdbsupport/gdb_vecs.c b/gdb/gdbsupport/gdb_vecs.c deleted file mode 100644 index bb81396..0000000 --- a/gdb/gdbsupport/gdb_vecs.c +++ /dev/null @@ -1,88 +0,0 @@ -/* Some commonly-used VEC types. - - Copyright (C) 2012-2020 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 "common-defs.h" -#include "gdb_vecs.h" -#include "host-defs.h" - -/* Worker function to split character delimiter separated string of fields - STR into a char pointer vector. */ - -static void -delim_string_to_char_ptr_vec_append - (std::vector<gdb::unique_xmalloc_ptr<char>> *vecp, const char *str, - char delimiter) -{ - do - { - size_t this_len; - const char *next_field; - char *this_field; - - next_field = strchr (str, delimiter); - if (next_field == NULL) - this_len = strlen (str); - else - { - this_len = next_field - str; - next_field++; - } - - this_field = (char *) xmalloc (this_len + 1); - memcpy (this_field, str, this_len); - this_field[this_len] = '\0'; - vecp->emplace_back (this_field); - - str = next_field; - } - while (str != NULL); -} - -/* See gdb_vecs.h. */ - -std::vector<gdb::unique_xmalloc_ptr<char>> -delim_string_to_char_ptr_vec (const char *str, char delimiter) -{ - std::vector<gdb::unique_xmalloc_ptr<char>> retval; - - delim_string_to_char_ptr_vec_append (&retval, str, delimiter); - - return retval; -} - -/* See gdb_vecs.h. */ - -void -dirnames_to_char_ptr_vec_append - (std::vector<gdb::unique_xmalloc_ptr<char>> *vecp, const char *dirnames) -{ - delim_string_to_char_ptr_vec_append (vecp, dirnames, DIRNAME_SEPARATOR); -} - -/* See gdb_vecs.h. */ - -std::vector<gdb::unique_xmalloc_ptr<char>> -dirnames_to_char_ptr_vec (const char *dirnames) -{ - std::vector<gdb::unique_xmalloc_ptr<char>> retval; - - dirnames_to_char_ptr_vec_append (&retval, dirnames); - - return retval; -} diff --git a/gdb/gdbsupport/gdb_vecs.h b/gdb/gdbsupport/gdb_vecs.h deleted file mode 100644 index ca7097a..0000000 --- a/gdb/gdbsupport/gdb_vecs.h +++ /dev/null @@ -1,88 +0,0 @@ -/* Some commonly-used VEC types. - - Copyright (C) 2012-2020 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 COMMON_GDB_VECS_H -#define COMMON_GDB_VECS_H - -/* Split STR, a list of DELIMITER-separated fields, into a char pointer vector. - - You may modify the returned strings. */ - -extern std::vector<gdb::unique_xmalloc_ptr<char>> - delim_string_to_char_ptr_vec (const char *str, char delimiter); - -/* Like dirnames_to_char_ptr_vec, but append the directories to *VECP. */ - -extern void dirnames_to_char_ptr_vec_append - (std::vector<gdb::unique_xmalloc_ptr<char>> *vecp, const char *dirnames); - -/* Split DIRNAMES by DIRNAME_SEPARATOR delimiter and return a list of all the - elements in their original order. For empty string ("") DIRNAMES return - list of one empty string ("") element. - - You may modify the returned strings. */ - -extern std::vector<gdb::unique_xmalloc_ptr<char>> - dirnames_to_char_ptr_vec (const char *dirnames); - -/* Remove the element pointed by iterator IT from VEC, not preserving the order - of the remaining elements. Return the removed element. */ - -template <typename T> -T -unordered_remove (std::vector<T> &vec, typename std::vector<T>::iterator it) -{ - gdb_assert (it >= vec.begin () && it < vec.end ()); - - T removed = std::move (*it); - if (it != vec.end () - 1) - *it = std::move (vec.back ()); - vec.pop_back (); - - return removed; -} - -/* Remove the element at position IX from VEC, not preserving the order of the - remaining elements. Return the removed element. */ - -template <typename T> -T -unordered_remove (std::vector<T> &vec, typename std::vector<T>::size_type ix) -{ - gdb_assert (ix < vec.size ()); - - return unordered_remove (vec, vec.begin () + ix); -} - -/* Remove the element at position IX from VEC, preserving the order the - remaining elements. Return the removed element. */ - -template <typename T> -T -ordered_remove (std::vector<T> &vec, typename std::vector<T>::size_type ix) -{ - gdb_assert (ix < vec.size ()); - - T removed = std::move (vec[ix]); - vec.erase (vec.begin () + ix); - - return removed; -} - -#endif /* COMMON_GDB_VECS_H */ diff --git a/gdb/gdbsupport/gdb_wait.c b/gdb/gdbsupport/gdb_wait.c deleted file mode 100644 index 3213994..0000000 --- a/gdb/gdbsupport/gdb_wait.c +++ /dev/null @@ -1,85 +0,0 @@ -/* Support code for standard wait macros in gdb_wait.h. - - Copyright (C) 2019 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 "common-defs.h" - -#include "gdb_wait.h" - -#ifdef __MINGW32__ - -/* The underlying idea is that when a Windows program is terminated by - a fatal exception, its exit code is the value of that exception, as - defined by the various EXCEPTION_* symbols in the Windows API - headers. We thus emulate WTERMSIG etc. by translating the fatal - exception codes to more-or-less equivalent Posix signals. - - The translation below is not perfect, because a program could - legitimately exit normally with a status whose value happens to - have the high bits set, but that's extremely rare, to say the - least, and it is deemed such a negligibly small probability of - false positives is justified by the utility of reporting the - terminating signal in the "normal" cases. */ - -# include <signal.h> - -# define WIN32_LEAN_AND_MEAN -# include <windows.h> /* for EXCEPTION_* constants */ - -struct xlate_status -{ - /* The exit status (actually, fatal exception code). */ - DWORD status; - - /* The corresponding signal value. */ - int sig; -}; - -int -windows_status_to_termsig (unsigned long status) -{ - static const xlate_status status_xlate_tbl[] = - { - {EXCEPTION_ACCESS_VIOLATION, SIGSEGV}, - {EXCEPTION_IN_PAGE_ERROR, SIGSEGV}, - {EXCEPTION_INVALID_HANDLE, SIGSEGV}, - {EXCEPTION_ILLEGAL_INSTRUCTION, SIGILL}, - {EXCEPTION_NONCONTINUABLE_EXCEPTION, SIGILL}, - {EXCEPTION_ARRAY_BOUNDS_EXCEEDED, SIGSEGV}, - {EXCEPTION_FLT_DENORMAL_OPERAND, SIGFPE}, - {EXCEPTION_FLT_DIVIDE_BY_ZERO, SIGFPE}, - {EXCEPTION_FLT_INEXACT_RESULT, SIGFPE}, - {EXCEPTION_FLT_INVALID_OPERATION, SIGFPE}, - {EXCEPTION_FLT_OVERFLOW, SIGFPE}, - {EXCEPTION_FLT_STACK_CHECK, SIGFPE}, - {EXCEPTION_FLT_UNDERFLOW, SIGFPE}, - {EXCEPTION_INT_DIVIDE_BY_ZERO, SIGFPE}, - {EXCEPTION_INT_OVERFLOW, SIGFPE}, - {EXCEPTION_PRIV_INSTRUCTION, SIGILL}, - {EXCEPTION_STACK_OVERFLOW, SIGSEGV}, - {CONTROL_C_EXIT, SIGTERM} - }; - - for (const xlate_status &x : status_xlate_tbl) - if (x.status == status) - return x.sig; - - return -1; -} - -#endif /* __MINGW32__ */ diff --git a/gdb/gdbsupport/gdb_wait.h b/gdb/gdbsupport/gdb_wait.h deleted file mode 100644 index 3563b9c..0000000 --- a/gdb/gdbsupport/gdb_wait.h +++ /dev/null @@ -1,135 +0,0 @@ -/* Standard wait macros. - Copyright (C) 2000-2020 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 COMMON_GDB_WAIT_H -#define COMMON_GDB_WAIT_H - -#ifdef HAVE_SYS_WAIT_H -#include <sys/wait.h> /* POSIX */ -#else -#ifdef HAVE_WAIT_H -#include <wait.h> /* legacy */ -#endif -#endif - -/* Define how to access the int that the wait system call stores. - This has been compatible in all Unix systems since time immemorial, - but various well-meaning people have defined various different - words for the same old bits in the same old int (sometimes claimed - to be a struct). We just know it's an int and we use these macros - to access the bits. */ - -/* The following macros are defined equivalently to their definitions - in POSIX.1. We fail to define WNOHANG and WUNTRACED, which POSIX.1 - <sys/wait.h> defines, since our code does not use waitpid() (but - NOTE exception for GNU/Linux below). We also fail to declare - wait() and waitpid(). - - For MinGW, we use the fact that when a Windows program is - terminated by a fatal exception, its exit code is the value of that - exception, as defined by the various EXCEPTION_* symbols in the - Windows API headers. See also gdb_wait.c. */ - -#ifndef WIFEXITED -# ifdef __MINGW32__ -# define WIFEXITED(w) (((w) & 0xC0000000) == 0) -# else -# define WIFEXITED(w) (((w)&0377) == 0) -# endif -#endif - -#ifndef WIFSIGNALED -# ifdef __MINGW32__ -# define WIFSIGNALED(w) (((w) & 0xC0000000) == 0xC0000000) -# else -# define WIFSIGNALED(w) (((w)&0377) != 0177 && ((w)&~0377) == 0) -# endif -#endif - -#ifndef WIFSTOPPED -#ifdef IBM6000 - -/* Unfortunately, the above comment (about being compatible in all Unix - systems) is not quite correct for AIX, sigh. And AIX 3.2 can generate - status words like 0x57c (sigtrap received after load), and gdb would - choke on it. */ - -#define WIFSTOPPED(w) ((w)&0x40) - -#else -#define WIFSTOPPED(w) (((w)&0377) == 0177) -#endif -#endif - -#ifndef WEXITSTATUS -# ifdef __MINGW32__ -# define WEXITSTATUS(w) ((w) & ~0xC0000000) -# else -# define WEXITSTATUS(w) (((w) >> 8) & 0377) /* same as WRETCODE */ -# endif -#endif - -#ifndef WTERMSIG -# ifdef __MINGW32__ -extern int windows_status_to_termsig (unsigned long); -# define WTERMSIG(w) windows_status_to_termsig (w) -# else -# define WTERMSIG(w) ((w) & 0177) -# endif -#endif - -#ifndef WSTOPSIG -#define WSTOPSIG WEXITSTATUS -#endif - -/* These are not defined in POSIX, but are used by our programs. */ - -#ifndef WSETEXIT -# ifdef W_EXITCODE -#define WSETEXIT(w,status) ((w) = W_EXITCODE(status,0)) -# else -#define WSETEXIT(w,status) ((w) = (0 | ((status) << 8))) -# endif -#endif - -#ifndef W_STOPCODE -#define W_STOPCODE(sig) ((sig) << 8 | 0x7f) -#endif - -#ifndef WSETSTOP -#define WSETSTOP(w,sig) ((w) = W_STOPCODE(sig)) -#endif - -/* For native GNU/Linux we may use waitpid and the __WCLONE option. - <GRIPE> It is of course dangerous not to use the REAL header file... - </GRIPE>. */ - -/* Bits in the third argument to `waitpid'. */ -#ifndef WNOHANG -#define WNOHANG 1 /* Don't block waiting. */ -#endif - -#ifndef WUNTRACED -#define WUNTRACED 2 /* Report status of stopped children. */ -#endif - -#ifndef __WCLONE -#define __WCLONE 0x80000000 /* Wait for cloned process. */ -#endif - -#endif /* COMMON_GDB_WAIT_H */ diff --git a/gdb/gdbsupport/hash_enum.h b/gdb/gdbsupport/hash_enum.h deleted file mode 100644 index a6c519a..0000000 --- a/gdb/gdbsupport/hash_enum.h +++ /dev/null @@ -1,45 +0,0 @@ -/* A hasher for enums. - - Copyright (C) 2017-2020 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 COMMON_HASH_ENUM_H -#define COMMON_HASH_ENUM_H - -/* A hasher for enums, which was missing in C++11: - http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2148 -*/ - -namespace gdb { - -/* Helper struct for hashing enum types. */ -template<typename T> -struct hash_enum -{ - typedef size_t result_type; - typedef T argument_type; - - size_t operator() (T val) const noexcept - { - using underlying = typename std::underlying_type<T>::type; - return std::hash<underlying> () (static_cast<underlying> (val)); - } -}; - -} /* namespace gdb */ - -#endif /* COMMON_HASH_ENUM_H */ diff --git a/gdb/gdbsupport/host-defs.h b/gdb/gdbsupport/host-defs.h deleted file mode 100644 index 925a497..0000000 --- a/gdb/gdbsupport/host-defs.h +++ /dev/null @@ -1,61 +0,0 @@ -/* Basic host-specific definitions for GDB. - Copyright (C) 1986-2020 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 COMMON_HOST_DEFS_H -#define COMMON_HOST_DEFS_H - -#include <limits.h> - -/* Static host-system-dependent parameters for GDB. */ - -/* * Number of bits in a char or unsigned char for the target machine. - Just like CHAR_BIT in <limits.h> but describes the target machine. */ -#if !defined (TARGET_CHAR_BIT) -#define TARGET_CHAR_BIT 8 -#endif - -/* * If we picked up a copy of CHAR_BIT from a configuration file - (which may get it by including <limits.h>) then use it to set - the number of bits in a host char. If not, use the same size - as the target. */ - -#if defined (CHAR_BIT) -#define HOST_CHAR_BIT CHAR_BIT -#else -#define HOST_CHAR_BIT TARGET_CHAR_BIT -#endif - -#ifdef __MSDOS__ -# define CANT_FORK -# define GLOBAL_CURDIR -# define DIRNAME_SEPARATOR ';' -#endif - -#if !defined (__CYGWIN__) && defined (_WIN32) -# define DIRNAME_SEPARATOR ';' -#endif - -#ifndef DIRNAME_SEPARATOR -#define DIRNAME_SEPARATOR ':' -#endif - -#ifndef SLASH_STRING -#define SLASH_STRING "/" -#endif - -#endif /* COMMON_HOST_DEFS_H */ diff --git a/gdb/gdbsupport/job-control.c b/gdb/gdbsupport/job-control.c deleted file mode 100644 index 381c5f0..0000000 --- a/gdb/gdbsupport/job-control.c +++ /dev/null @@ -1,86 +0,0 @@ -/* Job control and terminal related functions, for GDB and gdbserver - when running under Unix. - - Copyright (C) 1986-2020 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 "common-defs.h" -#include "job-control.h" -#ifdef HAVE_TERMIOS_H -#include <termios.h> -#endif -#include <unistd.h> - -/* Nonzero if we have job control. */ -int job_control; - -/* Set the process group ID of the inferior. - - Just using job_control only does part of it because setpgid or - setpgrp might not exist on a system without job control. - - For a more clean implementation, in libiberty, put a setpgid which merely - calls setpgrp and a setpgrp which does nothing (any system with job control - will have one or the other). */ - -int -gdb_setpgid () -{ - int retval = 0; - - if (job_control) - { -#ifdef HAVE_SETPGID - /* The call setpgid (0, 0) is supposed to work and mean the same - thing as this, but on Ultrix 4.2A it fails with EPERM (and - setpgid (getpid (), getpid ()) succeeds). */ - retval = setpgid (getpid (), getpid ()); -#else -#ifdef HAVE_SETPGRP -#ifdef SETPGRP_VOID - retval = setpgrp (); -#else - retval = setpgrp (getpid (), getpid ()); -#endif -#endif /* HAVE_SETPGRP */ -#endif /* HAVE_SETPGID */ - } - - return retval; -} - -/* See gdbsupport/common-terminal.h. */ - -void -have_job_control () -{ - /* OK, figure out whether we have job control. If termios is not - available, leave job_control 0. */ -#if defined (HAVE_TERMIOS_H) - /* Do all systems with termios have the POSIX way of identifying job - control? I hope so. */ -#ifdef _POSIX_JOB_CONTROL - job_control = 1; -#else -#ifdef _SC_JOB_CONTROL - job_control = sysconf (_SC_JOB_CONTROL); -#else - job_control = 0; /* Have to assume the worst. */ -#endif /* _SC_JOB_CONTROL */ -#endif /* _POSIX_JOB_CONTROL */ -#endif /* HAVE_TERMIOS_H */ -} diff --git a/gdb/gdbsupport/job-control.h b/gdb/gdbsupport/job-control.h deleted file mode 100644 index 23e503d..0000000 --- a/gdb/gdbsupport/job-control.h +++ /dev/null @@ -1,38 +0,0 @@ -/* Job control and terminal related functions, for GDB and gdbserver - when running under Unix. - - Copyright (C) 1986-2020 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 COMMON_JOB_CONTROL_H -#define COMMON_JOB_CONTROL_H - -/* Do we have job control? Can be assumed to always be the same - within a given run of GDB. Use in gdb/inflow.c and - gdbsupport/common-inflow.c. */ -extern int job_control; - -/* Set the process group of the caller to its own pid, or do nothing - if we lack job control. */ -extern int gdb_setpgid (); - -/* Determine whether we have job control, and set variable JOB_CONTROL - accordingly. This function must be called before any use of - JOB_CONTROL. */ -extern void have_job_control (); - -#endif /* COMMON_JOB_CONTROL_H */ diff --git a/gdb/gdbsupport/netstuff.c b/gdb/gdbsupport/netstuff.c deleted file mode 100644 index 1bf8f4b..0000000 --- a/gdb/gdbsupport/netstuff.c +++ /dev/null @@ -1,154 +0,0 @@ -/* Operations on network stuff. - Copyright (C) 2018-2020 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 "common-defs.h" -#include "netstuff.h" -#include <algorithm> - -#ifdef USE_WIN32API -#include <ws2tcpip.h> -#else -#include <netinet/in.h> -#include <arpa/inet.h> -#include <netdb.h> -#include <sys/socket.h> -#include <netinet/tcp.h> -#endif - -/* See gdbsupport/netstuff.h. */ - -scoped_free_addrinfo::~scoped_free_addrinfo () -{ - freeaddrinfo (m_res); -} - -/* See gdbsupport/netstuff.h. */ - -parsed_connection_spec -parse_connection_spec_without_prefix (std::string spec, struct addrinfo *hint) -{ - parsed_connection_spec ret; - size_t last_colon_pos = 0; - /* We're dealing with IPv6 if: - - - ai_family is AF_INET6, or - - ai_family is not AF_INET, and - - spec[0] is '[', or - - the number of ':' on spec is greater than 1. */ - bool is_ipv6 = (hint->ai_family == AF_INET6 - || (hint->ai_family != AF_INET - && (spec[0] == '[' - || std::count (spec.begin (), - spec.end (), ':') > 1))); - - if (is_ipv6) - { - if (spec[0] == '[') - { - /* IPv6 addresses can be written as '[ADDR]:PORT', and we - support this notation. */ - size_t close_bracket_pos = spec.find_first_of (']'); - - if (close_bracket_pos == std::string::npos) - error (_("Missing close bracket in hostname '%s'"), - spec.c_str ()); - - hint->ai_family = AF_INET6; - - const char c = spec[close_bracket_pos + 1]; - - if (c == '\0') - last_colon_pos = std::string::npos; - else if (c != ':') - error (_("Invalid cruft after close bracket in '%s'"), - spec.c_str ()); - - /* Erase both '[' and ']'. */ - spec.erase (0, 1); - spec.erase (close_bracket_pos - 1, 1); - } - else if (spec.find_first_of (']') != std::string::npos) - error (_("Missing open bracket in hostname '%s'"), - spec.c_str ()); - } - - if (last_colon_pos == 0) - last_colon_pos = spec.find_last_of (':'); - - /* The length of the hostname part. */ - size_t host_len; - - if (last_colon_pos != std::string::npos) - { - /* The user has provided a port. */ - host_len = last_colon_pos; - ret.port_str = spec.substr (last_colon_pos + 1); - } - else - host_len = spec.size (); - - ret.host_str = spec.substr (0, host_len); - - /* Default hostname is localhost. */ - if (ret.host_str.empty ()) - ret.host_str = "localhost"; - - return ret; -} - -/* See gdbsupport/netstuff.h. */ - -parsed_connection_spec -parse_connection_spec (const char *spec, struct addrinfo *hint) -{ - /* Struct to hold the association between valid prefixes, their - family and socktype. */ - struct host_prefix - { - /* The prefix. */ - const char *prefix; - - /* The 'ai_family'. */ - int family; - - /* The 'ai_socktype'. */ - int socktype; - }; - static const struct host_prefix prefixes[] = - { - { "udp:", AF_UNSPEC, SOCK_DGRAM }, - { "tcp:", AF_UNSPEC, SOCK_STREAM }, - { "udp4:", AF_INET, SOCK_DGRAM }, - { "tcp4:", AF_INET, SOCK_STREAM }, - { "udp6:", AF_INET6, SOCK_DGRAM }, - { "tcp6:", AF_INET6, SOCK_STREAM }, - }; - - for (const host_prefix prefix : prefixes) - if (startswith (spec, prefix.prefix)) - { - spec += strlen (prefix.prefix); - hint->ai_family = prefix.family; - hint->ai_socktype = prefix.socktype; - hint->ai_protocol - = hint->ai_socktype == SOCK_DGRAM ? IPPROTO_UDP : IPPROTO_TCP; - break; - } - - return parse_connection_spec_without_prefix (spec, hint); -} diff --git a/gdb/gdbsupport/netstuff.h b/gdb/gdbsupport/netstuff.h deleted file mode 100644 index a987d7f..0000000 --- a/gdb/gdbsupport/netstuff.h +++ /dev/null @@ -1,76 +0,0 @@ -/* Operations on network stuff. - Copyright (C) 2018-2020 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 COMMON_NETSTUFF_H -#define COMMON_NETSTUFF_H - -#include <string> - -/* Like NI_MAXHOST/NI_MAXSERV, but enough for numeric forms. */ -#define GDB_NI_MAX_ADDR 64 -#define GDB_NI_MAX_PORT 16 - -/* Helper class to guarantee that we always call 'freeaddrinfo'. */ - -class scoped_free_addrinfo -{ -public: - /* Default constructor. */ - explicit scoped_free_addrinfo (struct addrinfo *ainfo) - : m_res (ainfo) - { - } - - /* Destructor responsible for free'ing M_RES by calling - 'freeaddrinfo'. */ - ~scoped_free_addrinfo (); - - DISABLE_COPY_AND_ASSIGN (scoped_free_addrinfo); - -private: - /* The addrinfo resource. */ - struct addrinfo *m_res; -}; - -/* The struct we return after parsing the connection spec. */ - -struct parsed_connection_spec -{ - /* The hostname. */ - std::string host_str; - - /* The port, if any. */ - std::string port_str; -}; - - -/* Parse SPEC (which is a string in the form of "ADDR:PORT") and - return a 'parsed_connection_spec' structure with the proper fields - filled in. Also adjust HINT accordingly. */ -extern parsed_connection_spec - parse_connection_spec_without_prefix (std::string spec, - struct addrinfo *hint); - -/* Parse SPEC (which is a string in the form of - "[tcp[6]:|udp[6]:]ADDR:PORT") and return a 'parsed_connection_spec' - structure with the proper fields filled in. Also adjust HINT - accordingly. */ -extern parsed_connection_spec parse_connection_spec (const char *spec, - struct addrinfo *hint); - -#endif /* COMMON_NETSTUFF_H */ diff --git a/gdb/gdbsupport/new-op.c b/gdb/gdbsupport/new-op.c deleted file mode 100644 index cf2525c..0000000 --- a/gdb/gdbsupport/new-op.c +++ /dev/null @@ -1,95 +0,0 @@ -/* Replace operator new/new[], for GDB, the GNU debugger. - - Copyright (C) 2016-2020 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/>. */ - -/* GCC does not understand __has_feature. */ -#if !defined(__has_feature) -# define __has_feature(x) 0 -#endif - -#if !__has_feature(address_sanitizer) && !defined(__SANITIZE_ADDRESS__) -#include "common-defs.h" -#include "host-defs.h" -#include <new> - -/* Override operator new / operator new[], in order to internal_error - on allocation failure and thus query the user for abort/core - dump/continue, just like xmalloc does. We don't do this from a - new-handler function instead (std::set_new_handler) because we want - to catch allocation errors from within global constructors too. - - Skip overriding if building with -fsanitize=address though. - Address sanitizer wants to override operator new/delete too in - order to detect malloc+delete and new+free mismatches. Our - versions would mask out ASan's, with the result of losing that - useful mismatch detection. - - Note that C++ implementations could either have their throw - versions call the nothrow versions (libstdc++), or the other way - around (clang/libc++). For that reason, we replace both throw and - nothrow variants and call malloc directly. */ - -void * -operator new (std::size_t sz) -{ - /* malloc (0) is unpredictable; avoid it. */ - if (sz == 0) - sz = 1; - - void *p = malloc (sz); /* ARI: malloc */ - if (p == NULL) - { - /* If the user decides to continue debugging, throw a - gdb_quit_bad_alloc exception instead of a regular QUIT - gdb_exception. The former extends both std::bad_alloc and a - QUIT gdb_exception. This is necessary because operator new - can only ever throw std::bad_alloc, or something that extends - it. */ - try - { - malloc_failure (sz); - } - catch (gdb_exception &ex) - { - throw gdb_quit_bad_alloc (std::move (ex)); - } - } - return p; -} - -void * -operator new (std::size_t sz, const std::nothrow_t&) noexcept -{ - /* malloc (0) is unpredictable; avoid it. */ - if (sz == 0) - sz = 1; - return malloc (sz); /* ARI: malloc */ -} - -void * -operator new[] (std::size_t sz) -{ - return ::operator new (sz); -} - -void* -operator new[] (std::size_t sz, const std::nothrow_t&) noexcept -{ - return ::operator new (sz, std::nothrow); -} -#endif diff --git a/gdb/gdbsupport/next-iterator.h b/gdb/gdbsupport/next-iterator.h deleted file mode 100644 index ad37412..0000000 --- a/gdb/gdbsupport/next-iterator.h +++ /dev/null @@ -1,102 +0,0 @@ -/* A "next" iterator for GDB, the GNU debugger. - Copyright (C) 2019-2020 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 COMMON_NEXT_ITERATOR_H -#define COMMON_NEXT_ITERATOR_H - -/* An iterator that uses the 'next' field of a type to iterate. This - can be used with various GDB types that are stored as linked - lists. */ - -template<typename T> -struct next_iterator -{ - typedef next_iterator self_type; - typedef T *value_type; - typedef T *&reference; - typedef T **pointer; - typedef std::forward_iterator_tag iterator_category; - typedef int difference_type; - - explicit next_iterator (T *item) - : m_item (item) - { - } - - /* Create a one-past-the-end iterator. */ - next_iterator () - : m_item (nullptr) - { - } - - value_type operator* () const - { - return m_item; - } - - bool operator== (const self_type &other) const - { - return m_item == other.m_item; - } - - bool operator!= (const self_type &other) const - { - return m_item != other.m_item; - } - - self_type &operator++ () - { - m_item = m_item->next; - return *this; - } - -private: - - T *m_item; -}; - -/* A range adapter that allows iterating over a linked list. */ - -template<typename T, typename Iterator = next_iterator<T>> -class next_adapter -{ -public: - - explicit next_adapter (T *item) - : m_item (item) - { - } - - using iterator = Iterator; - - iterator begin () const - { - return iterator (m_item); - } - - iterator end () const - { - return iterator (); - } - -private: - - T *m_item; -}; - -#endif /* COMMON_NEXT_ITERATOR_H */ diff --git a/gdb/gdbsupport/observable.h b/gdb/gdbsupport/observable.h deleted file mode 100644 index 0468eba..0000000 --- a/gdb/gdbsupport/observable.h +++ /dev/null @@ -1,119 +0,0 @@ -/* Observers - - Copyright (C) 2016-2020 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 COMMON_OBSERVABLE_H -#define COMMON_OBSERVABLE_H - -#include <algorithm> -#include <functional> -#include <vector> - -namespace gdb -{ - -namespace observers -{ - -extern unsigned int observer_debug; - -/* An observer is an entity which is interested in being notified - when GDB reaches certain states, or certain events occur in GDB. - The entity being observed is called the observable. To receive - notifications, the observer attaches a callback to the observable. - One observable can have several observers. - - The observer implementation is also currently not reentrant. In - particular, it is therefore not possible to call the attach or - detach routines during a notification. */ - -/* The type of a key that can be passed to attach, which can be passed - to detach to remove associated observers. Tokens have address - identity, and are thus usually const globals. */ -struct token -{ - token () = default; - - DISABLE_COPY_AND_ASSIGN (token); -}; - -template<typename... T> -class observable -{ -public: - - typedef std::function<void (T...)> func_type; - - explicit observable (const char *name) - : m_name (name) - { - } - - DISABLE_COPY_AND_ASSIGN (observable); - - /* Attach F as an observer to this observable. F cannot be - detached. */ - void attach (const func_type &f) - { - m_observers.emplace_back (nullptr, f); - } - - /* Attach F as an observer to this observable. T is a reference to - a token that can be used to later remove F. */ - void attach (const func_type &f, const token &t) - { - m_observers.emplace_back (&t, f); - } - - /* Remove observers associated with T from this observable. T is - the token that was previously passed to any number of "attach" - calls. */ - void detach (const token &t) - { - auto iter = std::remove_if (m_observers.begin (), - m_observers.end (), - [&] (const std::pair<const token *, - func_type> &e) - { - return e.first == &t; - }); - - m_observers.erase (iter, m_observers.end ()); - } - - /* Notify all observers that are attached to this observable. */ - void notify (T... args) const - { - if (observer_debug) - fprintf_unfiltered (gdb_stdlog, "observable %s notify() called\n", - m_name); - for (auto &&e : m_observers) - e.second (args...); - } - -private: - - std::vector<std::pair<const token *, func_type>> m_observers; - const char *m_name; -}; - -} /* namespace observers */ - -} /* namespace gdb */ - -#endif /* COMMON_OBSERVABLE_H */ diff --git a/gdb/gdbsupport/offset-type.h b/gdb/gdbsupport/offset-type.h deleted file mode 100644 index b68cb45..0000000 --- a/gdb/gdbsupport/offset-type.h +++ /dev/null @@ -1,133 +0,0 @@ -/* Offset types for GDB. - - Copyright (C) 2017-2020 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/>. */ - -/* Define an "offset" type. Offset types are distinct integer types - that are used to represent an offset into anything that is - addressable. For example, an offset into a DWARF debug section. - The idea is catch mixing unrelated offset types at compile time, in - code that needs to manipulate multiple different kinds of offsets - that are easily confused. They're safer to use than native - integers, because they have no implicit conversion to anything. - And also, since they're implemented as "enum class" strong - typedefs, they're still integers ABI-wise, making them a bit more - efficient than wrapper structs on some ABIs. - - Some properties of offset types, loosely modeled on pointers: - - - You can compare offsets of the same type for equality and order. - You can't compare an offset with an unrelated type. - - - You can add/substract an integer to/from an offset, which gives - you back a shifted offset. - - - You can subtract two offsets of the same type, which gives you - back the delta as an integer (of the enum class's underlying - type), not as an offset type. - - - You can't add two offsets of the same type, as that would not - make sense. - - However, unlike pointers, you can't deference offset types. */ - -#ifndef COMMON_OFFSET_TYPE_H -#define COMMON_OFFSET_TYPE_H - -/* Declare TYPE as being an offset type. This declares the type and - enables the operators defined below. */ -#define DEFINE_OFFSET_TYPE(TYPE, UNDERLYING) \ - enum class TYPE : UNDERLYING {}; \ - void is_offset_type (TYPE) - -/* The macro macro is all you need to know use offset types. The rest - below is all implementation detail. */ - -/* For each enum class type that you want to support arithmetic - operators, declare an "is_offset_type" overload that has exactly - one parameter, of type that enum class. E.g.,: - - void is_offset_type (sect_offset); - - The function does not need to be defined, only declared. - DEFINE_OFFSET_TYPE declares this. - - A function declaration is preferred over a traits type, because the - former allows calling the DEFINE_OFFSET_TYPE macro inside a - namespace to define the corresponding offset type in that - namespace. The compiler finds the corresponding is_offset_type - function via ADL. -*/ - -/* Adding or subtracting an integer to an offset type shifts the - offset. This is like "PTR = PTR + INT" and "PTR += INT". */ - -#define DEFINE_OFFSET_ARITHM_OP(OP) \ - template<typename E, \ - typename = decltype (is_offset_type (std::declval<E> ()))> \ - constexpr E \ - operator OP (E lhs, typename std::underlying_type<E>::type rhs) \ - { \ - using underlying = typename std::underlying_type<E>::type; \ - return (E) (static_cast<underlying> (lhs) OP rhs); \ - } \ - \ - template<typename E, \ - typename = decltype (is_offset_type (std::declval<E> ()))> \ - constexpr E \ - operator OP (typename std::underlying_type<E>::type lhs, E rhs) \ - { \ - using underlying = typename std::underlying_type<E>::type; \ - return (E) (lhs OP static_cast<underlying> (rhs)); \ - } \ - \ - template<typename E, \ - typename = decltype (is_offset_type (std::declval<E> ()))> \ - E & \ - operator OP ## = (E &lhs, typename std::underlying_type<E>::type rhs) \ - { \ - using underlying = typename std::underlying_type<E>::type; \ - lhs = (E) (static_cast<underlying> (lhs) OP rhs); \ - return lhs; \ - } - -DEFINE_OFFSET_ARITHM_OP(+) -DEFINE_OFFSET_ARITHM_OP(-) - -/* Adding two offset types doesn't make sense, just like "PTR + PTR" - doesn't make sense. This is defined as a deleted function so that - a compile error easily brings you to this comment. */ - -template<typename E, - typename = decltype (is_offset_type (std::declval<E> ()))> -constexpr typename std::underlying_type<E>::type -operator+ (E lhs, E rhs) = delete; - -/* Subtracting two offset types, however, gives you back the - difference between the offsets, as an underlying type. Similar to - how "PTR2 - PTR1" returns a ptrdiff_t. */ - -template<typename E, - typename = decltype (is_offset_type (std::declval<E> ()))> -constexpr typename std::underlying_type<E>::type -operator- (E lhs, E rhs) -{ - using underlying = typename std::underlying_type<E>::type; - return static_cast<underlying> (lhs) - static_cast<underlying> (rhs); -} - -#endif /* COMMON_OFFSET_TYPE_H */ diff --git a/gdb/gdbsupport/parallel-for.h b/gdb/gdbsupport/parallel-for.h deleted file mode 100644 index 2545152..0000000 --- a/gdb/gdbsupport/parallel-for.h +++ /dev/null @@ -1,86 +0,0 @@ -/* Parallel for loops - - Copyright (C) 2019-2020 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_PARALLEL_FOR_H -#define GDBSUPPORT_PARALLEL_FOR_H - -#include <algorithm> -#if CXX_STD_THREAD -#include <thread> -#include "gdbsupport/thread-pool.h" -#endif - -namespace gdb -{ - -/* A very simple "parallel for". This splits the range of iterators - into subranges, and then passes each subrange to the callback. The - work may or may not be done in separate threads. - - This approach was chosen over having the callback work on single - items because it makes it simple for the caller to do - once-per-subrange initialization and destruction. */ - -template<class RandomIt, class RangeFunction> -void -parallel_for_each (RandomIt first, RandomIt last, RangeFunction callback) -{ -#if CXX_STD_THREAD - /* So we can use a local array below. */ - const size_t local_max = 16; - size_t n_threads = std::min (thread_pool::g_thread_pool->thread_count (), - local_max); - size_t n_actual_threads = 0; - std::future<void> futures[local_max]; - - size_t n_elements = last - first; - if (n_threads > 1) - { - /* Arbitrarily require that there should be at least 10 elements - in a thread. */ - if (n_elements / n_threads < 10) - n_threads = std::max (n_elements / 10, (size_t) 1); - size_t elts_per_thread = n_elements / n_threads; - n_actual_threads = n_threads - 1; - for (int i = 0; i < n_actual_threads; ++i) - { - RandomIt end = first + elts_per_thread; - auto task = [=] () - { - callback (first, end); - }; - - futures[i] = gdb::thread_pool::g_thread_pool->post_task (task); - first = end; - } - } -#endif /* CXX_STD_THREAD */ - - /* Process all the remaining elements in the main thread. */ - callback (first, last); - -#if CXX_STD_THREAD - for (int i = 0; i < n_actual_threads; ++i) - futures[i].wait (); -#endif /* CXX_STD_THREAD */ -} - -} - -#endif /* GDBSUPPORT_PARALLEL_FOR_H */ diff --git a/gdb/gdbsupport/pathstuff.c b/gdb/gdbsupport/pathstuff.c deleted file mode 100644 index 1f60fd0..0000000 --- a/gdb/gdbsupport/pathstuff.c +++ /dev/null @@ -1,290 +0,0 @@ -/* Path manipulation routines for GDB and gdbserver. - - Copyright (C) 1986-2020 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 "common-defs.h" -#include "pathstuff.h" -#include "host-defs.h" -#include "filenames.h" -#include "gdb_tilde_expand.h" - -#ifdef USE_WIN32API -#include <windows.h> -#endif - -/* See gdbsupport/pathstuff.h. */ - -gdb::unique_xmalloc_ptr<char> -gdb_realpath (const char *filename) -{ -/* On most hosts, we rely on canonicalize_file_name to compute - the FILENAME's realpath. - - But the situation is slightly more complex on Windows, due to some - versions of GCC which were reported to generate paths where - backlashes (the directory separator) were doubled. For instance: - c:\\some\\double\\slashes\\dir - ... instead of ... - c:\some\double\slashes\dir - Those double-slashes were getting in the way when comparing paths, - for instance when trying to insert a breakpoint as follow: - (gdb) b c:/some/double/slashes/dir/foo.c:4 - No source file named c:/some/double/slashes/dir/foo.c:4. - (gdb) b c:\some\double\slashes\dir\foo.c:4 - No source file named c:\some\double\slashes\dir\foo.c:4. - To prevent this from happening, we need this function to always - strip those extra backslashes. While canonicalize_file_name does - perform this simplification, it only works when the path is valid. - Since the simplification would be useful even if the path is not - valid (one can always set a breakpoint on a file, even if the file - does not exist locally), we rely instead on GetFullPathName to - perform the canonicalization. */ - -#if defined (_WIN32) - { - char buf[MAX_PATH]; - DWORD len = GetFullPathName (filename, MAX_PATH, buf, NULL); - - /* The file system is case-insensitive but case-preserving. - So it is important we do not lowercase the path. Otherwise, - we might not be able to display the original casing in a given - path. */ - if (len > 0 && len < MAX_PATH) - return make_unique_xstrdup (buf); - } -#else - { - char *rp = canonicalize_file_name (filename); - - if (rp != NULL) - return gdb::unique_xmalloc_ptr<char> (rp); - } -#endif - - /* This system is a lost cause, just dup the buffer. */ - return make_unique_xstrdup (filename); -} - -/* See gdbsupport/pathstuff.h. */ - -gdb::unique_xmalloc_ptr<char> -gdb_realpath_keepfile (const char *filename) -{ - const char *base_name = lbasename (filename); - char *dir_name; - char *result; - - /* Extract the basename of filename, and return immediately - a copy of filename if it does not contain any directory prefix. */ - if (base_name == filename) - return make_unique_xstrdup (filename); - - dir_name = (char *) alloca ((size_t) (base_name - filename + 2)); - /* Allocate enough space to store the dir_name + plus one extra - character sometimes needed under Windows (see below), and - then the closing \000 character. */ - strncpy (dir_name, filename, base_name - filename); - dir_name[base_name - filename] = '\000'; - -#ifdef HAVE_DOS_BASED_FILE_SYSTEM - /* We need to be careful when filename is of the form 'd:foo', which - is equivalent of d:./foo, which is totally different from d:/foo. */ - if (strlen (dir_name) == 2 && isalpha (dir_name[0]) && dir_name[1] == ':') - { - dir_name[2] = '.'; - dir_name[3] = '\000'; - } -#endif - - /* Canonicalize the directory prefix, and build the resulting - filename. If the dirname realpath already contains an ending - directory separator, avoid doubling it. */ - gdb::unique_xmalloc_ptr<char> path_storage = gdb_realpath (dir_name); - const char *real_path = path_storage.get (); - if (IS_DIR_SEPARATOR (real_path[strlen (real_path) - 1])) - result = concat (real_path, base_name, (char *) NULL); - else - result = concat (real_path, SLASH_STRING, base_name, (char *) NULL); - - return gdb::unique_xmalloc_ptr<char> (result); -} - -/* See gdbsupport/pathstuff.h. */ - -gdb::unique_xmalloc_ptr<char> -gdb_abspath (const char *path) -{ - gdb_assert (path != NULL && path[0] != '\0'); - - if (path[0] == '~') - return gdb_tilde_expand_up (path); - - if (IS_ABSOLUTE_PATH (path) || current_directory == NULL) - return make_unique_xstrdup (path); - - /* Beware the // my son, the Emacs barfs, the botch that catch... */ - return gdb::unique_xmalloc_ptr<char> - (concat (current_directory, - IS_DIR_SEPARATOR (current_directory[strlen (current_directory) - 1]) - ? "" : SLASH_STRING, - path, (char *) NULL)); -} - -/* See gdbsupport/pathstuff.h. */ - -const char * -child_path (const char *parent, const char *child) -{ - /* The child path must start with the parent path. */ - size_t parent_len = strlen (parent); - if (filename_ncmp (parent, child, parent_len) != 0) - return NULL; - - /* The parent path must be a directory and the child must contain at - least one component underneath the parent. */ - const char *child_component; - if (parent_len > 0 && IS_DIR_SEPARATOR (parent[parent_len - 1])) - { - /* The parent path ends in a directory separator, so it is a - directory. The first child component starts after the common - prefix. */ - child_component = child + parent_len; - } - else - { - /* The parent path does not end in a directory separator. The - first character in the child after the common prefix must be - a directory separator. - - Note that CHILD must hold at least parent_len characters for - filename_ncmp to return zero. If the character at parent_len - is nul due to CHILD containing the same path as PARENT, the - IS_DIR_SEPARATOR check will fail here. */ - if (!IS_DIR_SEPARATOR (child[parent_len])) - return NULL; - - /* The first child component starts after the separator after the - common prefix. */ - child_component = child + parent_len + 1; - } - - /* The child must contain at least one non-separator character after - the parent. */ - while (*child_component != '\0') - { - if (!IS_DIR_SEPARATOR (*child_component)) - return child_component; - - child_component++; - } - return NULL; -} - -/* See gdbsupport/pathstuff.h. */ - -bool -contains_dir_separator (const char *path) -{ - for (; *path != '\0'; path++) - { - if (IS_DIR_SEPARATOR (*path)) - return true; - } - - return false; -} - -/* See gdbsupport/pathstuff.h. */ - -std::string -get_standard_cache_dir () -{ -#ifdef __APPLE__ -#define HOME_CACHE_DIR "Library/Caches" -#else -#define HOME_CACHE_DIR ".cache" -#endif - -#ifndef __APPLE__ - const char *xdg_cache_home = getenv ("XDG_CACHE_HOME"); - if (xdg_cache_home != NULL) - { - /* Make sure the path is absolute and tilde-expanded. */ - gdb::unique_xmalloc_ptr<char> abs (gdb_abspath (xdg_cache_home)); - return string_printf ("%s/gdb", abs.get ()); - } -#endif - - const char *home = getenv ("HOME"); - if (home != NULL) - { - /* Make sure the path is absolute and tilde-expanded. */ - gdb::unique_xmalloc_ptr<char> abs (gdb_abspath (home)); - return string_printf ("%s/" HOME_CACHE_DIR "/gdb", abs.get ()); - } - - return {}; -} - -/* See gdbsupport/pathstuff.h. */ - -std::string -get_standard_temp_dir () -{ -#ifdef WIN32 - const char *tmp = getenv ("TMP"); - if (tmp != nullptr) - return tmp; - - tmp = getenv ("TEMP"); - if (tmp != nullptr) - return tmp; - - error (_("Couldn't find temp dir path, both TMP and TEMP are unset.")); - -#else - const char *tmp = getenv ("TMPDIR"); - if (tmp != nullptr) - return tmp; - - return "/tmp"; -#endif -} - -/* See gdbsupport/pathstuff.h. */ - -const char * -get_shell () -{ - const char *ret = getenv ("SHELL"); - if (ret == NULL) - ret = "/bin/sh"; - - return ret; -} - -/* See gdbsupport/pathstuff.h. */ - -gdb::char_vector -make_temp_filename (const std::string &f) -{ - gdb::char_vector filename_temp (f.length () + 8); - strcpy (filename_temp.data (), f.c_str ()); - strcat (filename_temp.data () + f.size (), "-XXXXXX"); - return filename_temp; -} diff --git a/gdb/gdbsupport/pathstuff.h b/gdb/gdbsupport/pathstuff.h deleted file mode 100644 index 4bc0d89..0000000 --- a/gdb/gdbsupport/pathstuff.h +++ /dev/null @@ -1,98 +0,0 @@ -/* Path manipulation routines for GDB and gdbserver. - - Copyright (C) 1986-2020 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 COMMON_PATHSTUFF_H -#define COMMON_PATHSTUFF_H - -#include "gdbsupport/byte-vector.h" - -/* Path utilities. */ - -/* Return the real path of FILENAME, expanding all the symbolic links. - - Contrary to "gdb_abspath", this function does not use - CURRENT_DIRECTORY for path expansion. Instead, it relies on the - current working directory (CWD) of GDB or gdbserver. */ - -extern gdb::unique_xmalloc_ptr<char> gdb_realpath (const char *filename); - -/* Return a copy of FILENAME, with its directory prefix canonicalized - by gdb_realpath. */ - -extern gdb::unique_xmalloc_ptr<char> - gdb_realpath_keepfile (const char *filename); - -/* Return PATH in absolute form, performing tilde-expansion if necessary. - PATH cannot be NULL or the empty string. - This does not resolve symlinks however, use gdb_realpath for that. - - Contrary to "gdb_realpath", this function uses CURRENT_DIRECTORY - for the path expansion. This may lead to scenarios the current - working directory (CWD) is different than CURRENT_DIRECTORY. - - If CURRENT_DIRECTORY is NULL, this function returns a copy of - PATH. */ - -extern gdb::unique_xmalloc_ptr<char> gdb_abspath (const char *path); - -/* If the path in CHILD is a child of the path in PARENT, return a - pointer to the first component in the CHILD's pathname below the - PARENT. Otherwise, return NULL. */ - -extern const char *child_path (const char *parent, const char *child); - -/* Return whether PATH contains a directory separator character. */ - -extern bool contains_dir_separator (const char *path); - -/* Get the usual user cache directory for the current platform. - - On Linux, it follows the XDG Base Directory specification: use - $XDG_CACHE_HOME/gdb if the XDG_CACHE_HOME environment variable is - defined, otherwise $HOME/.cache. - - On macOS, it follows the local convention and uses - ~/Library/Caches/gdb. - - The return value is absolute and tilde-expanded. Return an empty - string if neither XDG_CACHE_HOME (on Linux) or HOME are defined. */ - -extern std::string get_standard_cache_dir (); - -/* Get the usual temporary directory for the current platform. - - On Windows, this is the TMP or TEMP environment variable. - - On the rest, this is the TMPDIR environment variable, if defined, else /tmp. - - Throw an exception on error. */ - -extern std::string get_standard_temp_dir (); - -/* Return the file name of the user's shell. Normally this comes from - the SHELL environment variable. */ - -extern const char *get_shell (); - -/* Make a filename suitable to pass to mkstemp based on F (e.g. - /tmp/foo -> /tmp/foo-XXXXXX). */ - -extern gdb::char_vector make_temp_filename (const std::string &f); - -#endif /* COMMON_PATHSTUFF_H */ diff --git a/gdb/gdbsupport/poison.h b/gdb/gdbsupport/poison.h deleted file mode 100644 index 5e1b2cc..0000000 --- a/gdb/gdbsupport/poison.h +++ /dev/null @@ -1,248 +0,0 @@ -/* Poison symbols at compile time. - - Copyright (C) 2017-2020 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 COMMON_POISON_H -#define COMMON_POISON_H - -#include "traits.h" -#include "obstack.h" - -/* Poison memset of non-POD types. The idea is catching invalid - initialization of non-POD structs that is easy to be introduced as - side effect of refactoring. For example, say this: - - struct S { VEC(foo_s) *m_data; }; - -is converted to this at some point: - - struct S { - S() { m_data.reserve (10); } - std::vector<foo> m_data; - }; - -and old code was initializing S objects like this: - - struct S s; - memset (&s, 0, sizeof (S)); // whoops, now wipes vector. - -Declaring memset as deleted for non-POD types makes the memset above -be a compile-time error. */ - -/* Helper for SFINAE. True if "T *" is memsettable. I.e., if T is - either void, or POD. */ -template<typename T> -struct IsMemsettable - : gdb::Or<std::is_void<T>, - std::is_pod<T>> -{}; - -template <typename T, - typename = gdb::Requires<gdb::Not<IsMemsettable<T>>>> -void *memset (T *s, int c, size_t n) = delete; - -#if HAVE_IS_TRIVIALLY_COPYABLE - -/* Similarly, poison memcpy and memmove of non trivially-copyable - types, which is undefined. */ - -/* True if "T *" is relocatable. I.e., copyable with memcpy/memmove. - I.e., T is either trivially copyable, or void. */ -template<typename T> -struct IsRelocatable - : gdb::Or<std::is_void<T>, - std::is_trivially_copyable<T>> -{}; - -/* True if both source and destination are relocatable. */ - -template <typename D, typename S> -using BothAreRelocatable - = gdb::And<IsRelocatable<D>, IsRelocatable<S>>; - -template <typename D, typename S, - typename = gdb::Requires<gdb::Not<BothAreRelocatable<D, S>>>> -void *memcpy (D *dest, const S *src, size_t n) = delete; - -template <typename D, typename S, - typename = gdb::Requires<gdb::Not<BothAreRelocatable<D, S>>>> -void *memmove (D *dest, const S *src, size_t n) = delete; - -#endif /* HAVE_IS_TRIVIALLY_COPYABLE */ - -/* Poison XNEW and friends to catch usages of malloc-style allocations on - objects that require new/delete. */ - -template<typename T> -#if HAVE_IS_TRIVIALLY_CONSTRUCTIBLE -using IsMallocable = std::is_trivially_constructible<T>; -#else -using IsMallocable = std::true_type; -#endif - -template<typename T> -using IsFreeable = gdb::Or<std::is_trivially_destructible<T>, std::is_void<T>>; - -template <typename T, typename = gdb::Requires<gdb::Not<IsFreeable<T>>>> -void free (T *ptr) = delete; - -template<typename T> -static T * -xnew () -{ - static_assert (IsMallocable<T>::value, "Trying to use XNEW with a non-POD \ -data type. Use operator new instead."); - return XNEW (T); -} - -#undef XNEW -#define XNEW(T) xnew<T>() - -template<typename T> -static T * -xcnew () -{ - static_assert (IsMallocable<T>::value, "Trying to use XCNEW with a non-POD \ -data type. Use operator new instead."); - return XCNEW (T); -} - -#undef XCNEW -#define XCNEW(T) xcnew<T>() - -template<typename T> -static void -xdelete (T *p) -{ - static_assert (IsFreeable<T>::value, "Trying to use XDELETE with a non-POD \ -data type. Use operator delete instead."); - XDELETE (p); -} - -#undef XDELETE -#define XDELETE(P) xdelete (P) - -template<typename T> -static T * -xnewvec (size_t n) -{ - static_assert (IsMallocable<T>::value, "Trying to use XNEWVEC with a \ -non-POD data type. Use operator new[] (or std::vector) instead."); - return XNEWVEC (T, n); -} - -#undef XNEWVEC -#define XNEWVEC(T, N) xnewvec<T> (N) - -template<typename T> -static T * -xcnewvec (size_t n) -{ - static_assert (IsMallocable<T>::value, "Trying to use XCNEWVEC with a \ -non-POD data type. Use operator new[] (or std::vector) instead."); - return XCNEWVEC (T, n); -} - -#undef XCNEWVEC -#define XCNEWVEC(T, N) xcnewvec<T> (N) - -template<typename T> -static T * -xresizevec (T *p, size_t n) -{ - static_assert (IsMallocable<T>::value, "Trying to use XRESIZEVEC with a \ -non-POD data type."); - return XRESIZEVEC (T, p, n); -} - -#undef XRESIZEVEC -#define XRESIZEVEC(T, P, N) xresizevec<T> (P, N) - -template<typename T> -static void -xdeletevec (T *p) -{ - static_assert (IsFreeable<T>::value, "Trying to use XDELETEVEC with a \ -non-POD data type. Use operator delete[] (or std::vector) instead."); - XDELETEVEC (p); -} - -#undef XDELETEVEC -#define XDELETEVEC(P) xdeletevec (P) - -template<typename T> -static T * -xnewvar (size_t s) -{ - static_assert (IsMallocable<T>::value, "Trying to use XNEWVAR with a \ -non-POD data type."); - return XNEWVAR (T, s);; -} - -#undef XNEWVAR -#define XNEWVAR(T, S) xnewvar<T> (S) - -template<typename T> -static T * -xcnewvar (size_t s) -{ - static_assert (IsMallocable<T>::value, "Trying to use XCNEWVAR with a \ -non-POD data type."); - return XCNEWVAR (T, s); -} - -#undef XCNEWVAR -#define XCNEWVAR(T, S) xcnewvar<T> (S) - -template<typename T> -static T * -xresizevar (T *p, size_t s) -{ - static_assert (IsMallocable<T>::value, "Trying to use XRESIZEVAR with a \ -non-POD data type."); - return XRESIZEVAR (T, p, s); -} - -#undef XRESIZEVAR -#define XRESIZEVAR(T, P, S) xresizevar<T> (P, S) - -template<typename T> -static T * -xobnew (obstack *ob) -{ - static_assert (IsMallocable<T>::value, "Trying to use XOBNEW with a \ -non-POD data type."); - return XOBNEW (ob, T); -} - -#undef XOBNEW -#define XOBNEW(O, T) xobnew<T> (O) - -template<typename T> -static T * -xobnewvec (obstack *ob, size_t n) -{ - static_assert (IsMallocable<T>::value, "Trying to use XOBNEWVEC with a \ -non-POD data type."); - return XOBNEWVEC (ob, T, n); -} - -#undef XOBNEWVEC -#define XOBNEWVEC(O, T, N) xobnewvec<T> (O, N) - -#endif /* COMMON_POISON_H */ diff --git a/gdb/gdbsupport/preprocessor.h b/gdb/gdbsupport/preprocessor.h deleted file mode 100644 index 6130280..0000000 --- a/gdb/gdbsupport/preprocessor.h +++ /dev/null @@ -1,35 +0,0 @@ -/* Copyright (C) 2017-2020 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 COMMON_PREPROCESSOR_H -#define COMMON_PREPROCESSOR_H - -/* Generally useful preprocessor bits. */ - -/* Concatenate two tokens. */ -#define CONCAT_1(a, b) a ## b -#define CONCAT(a, b) CONCAT_1 (a, b) - -/* Stringification. */ -#define STRINGIFY_1(x) #x -#define STRINGIFY(x) STRINGIFY_1 (x) - -/* Escape parens out. Useful if you need to pass an argument that - includes commas to another macro. */ -#define ESC_PARENS(...) __VA_ARGS__ - -#endif /* COMMON_PREPROCESSOR_H */ diff --git a/gdb/gdbsupport/print-utils.c b/gdb/gdbsupport/print-utils.c deleted file mode 100644 index a8d8681..0000000 --- a/gdb/gdbsupport/print-utils.c +++ /dev/null @@ -1,326 +0,0 @@ -/* Cell-based print utility routines for GDB, the GNU debugger. - - Copyright (C) 1986-2020 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 "common-defs.h" -#include "print-utils.h" -/* Temporary storage using circular buffer. */ - -/* Number of cells in the circular buffer. */ -#define NUMCELLS 16 - -/* Return the next entry in the circular buffer. */ - -char * -get_print_cell (void) -{ - static char buf[NUMCELLS][PRINT_CELL_SIZE]; - static int cell = 0; - - if (++cell >= NUMCELLS) - cell = 0; - return buf[cell]; -} - -static char * -decimal2str (const char *sign, ULONGEST addr, int width) -{ - /* Steal code from valprint.c:print_decimal(). Should this worry - about the real size of addr as the above does? */ - unsigned long temp[3]; - char *str = get_print_cell (); - int i = 0; - - do - { - temp[i] = addr % (1000 * 1000 * 1000); - addr /= (1000 * 1000 * 1000); - i++; - width -= 9; - } - while (addr != 0 && i < (sizeof (temp) / sizeof (temp[0]))); - - width += 9; - if (width < 0) - width = 0; - - switch (i) - { - case 1: - xsnprintf (str, PRINT_CELL_SIZE, "%s%0*lu", sign, width, temp[0]); - break; - case 2: - xsnprintf (str, PRINT_CELL_SIZE, "%s%0*lu%09lu", sign, width, - temp[1], temp[0]); - break; - case 3: - xsnprintf (str, PRINT_CELL_SIZE, "%s%0*lu%09lu%09lu", sign, width, - temp[2], temp[1], temp[0]); - break; - default: - internal_error (__FILE__, __LINE__, - _("failed internal consistency check")); - } - - return str; -} - -static char * -octal2str (ULONGEST addr, int width) -{ - unsigned long temp[3]; - char *str = get_print_cell (); - int i = 0; - - do - { - temp[i] = addr % (0100000 * 0100000); - addr /= (0100000 * 0100000); - i++; - width -= 10; - } - while (addr != 0 && i < (sizeof (temp) / sizeof (temp[0]))); - - width += 10; - if (width < 0) - width = 0; - - switch (i) - { - case 1: - if (temp[0] == 0) - xsnprintf (str, PRINT_CELL_SIZE, "%*o", width, 0); - else - xsnprintf (str, PRINT_CELL_SIZE, "0%0*lo", width, temp[0]); - break; - case 2: - xsnprintf (str, PRINT_CELL_SIZE, "0%0*lo%010lo", width, temp[1], temp[0]); - break; - case 3: - xsnprintf (str, PRINT_CELL_SIZE, "0%0*lo%010lo%010lo", width, - temp[2], temp[1], temp[0]); - break; - default: - internal_error (__FILE__, __LINE__, - _("failed internal consistency check")); - } - - return str; -} - -/* See print-utils.h. */ - -char * -pulongest (ULONGEST u) -{ - return decimal2str ("", u, 0); -} - -/* See print-utils.h. */ - -char * -plongest (LONGEST l) -{ - if (l < 0) - return decimal2str ("-", -l, 0); - else - return decimal2str ("", l, 0); -} - -/* Eliminate warning from compiler on 32-bit systems. */ -static int thirty_two = 32; - -/* See print-utils.h. */ - -char * -phex (ULONGEST l, int sizeof_l) -{ - char *str; - - switch (sizeof_l) - { - case 8: - str = get_print_cell (); - xsnprintf (str, PRINT_CELL_SIZE, "%08lx%08lx", - (unsigned long) (l >> thirty_two), - (unsigned long) (l & 0xffffffff)); - break; - case 4: - str = get_print_cell (); - xsnprintf (str, PRINT_CELL_SIZE, "%08lx", (unsigned long) l); - break; - case 2: - str = get_print_cell (); - xsnprintf (str, PRINT_CELL_SIZE, "%04x", (unsigned short) (l & 0xffff)); - break; - default: - str = phex (l, sizeof (l)); - break; - } - - return str; -} - -/* See print-utils.h. */ - -char * -phex_nz (ULONGEST l, int sizeof_l) -{ - char *str; - - switch (sizeof_l) - { - case 8: - { - unsigned long high = (unsigned long) (l >> thirty_two); - - str = get_print_cell (); - if (high == 0) - xsnprintf (str, PRINT_CELL_SIZE, "%lx", - (unsigned long) (l & 0xffffffff)); - else - xsnprintf (str, PRINT_CELL_SIZE, "%lx%08lx", high, - (unsigned long) (l & 0xffffffff)); - break; - } - case 4: - str = get_print_cell (); - xsnprintf (str, PRINT_CELL_SIZE, "%lx", (unsigned long) l); - break; - case 2: - str = get_print_cell (); - xsnprintf (str, PRINT_CELL_SIZE, "%x", (unsigned short) (l & 0xffff)); - break; - default: - str = phex_nz (l, sizeof (l)); - break; - } - - return str; -} - -/* See print-utils.h. */ - -char * -hex_string (LONGEST num) -{ - char *result = get_print_cell (); - - xsnprintf (result, PRINT_CELL_SIZE, "0x%s", phex_nz (num, sizeof (num))); - return result; -} - -/* See print-utils.h. */ - -char * -hex_string_custom (LONGEST num, int width) -{ - char *result = get_print_cell (); - char *result_end = result + PRINT_CELL_SIZE - 1; - const char *hex = phex_nz (num, sizeof (num)); - int hex_len = strlen (hex); - - if (hex_len > width) - width = hex_len; - if (width + 2 >= PRINT_CELL_SIZE) - internal_error (__FILE__, __LINE__, _("\ -hex_string_custom: insufficient space to store result")); - - strcpy (result_end - width - 2, "0x"); - memset (result_end - width, '0', width); - strcpy (result_end - hex_len, hex); - return result_end - width - 2; -} - -/* See print-utils.h. */ - -char * -int_string (LONGEST val, int radix, int is_signed, int width, - int use_c_format) -{ - switch (radix) - { - case 16: - { - char *result; - - if (width == 0) - result = hex_string (val); - else - result = hex_string_custom (val, width); - if (! use_c_format) - result += 2; - return result; - } - case 10: - { - if (is_signed && val < 0) - return decimal2str ("-", -val, width); - else - return decimal2str ("", val, width); - } - case 8: - { - char *result = octal2str (val, width); - - if (use_c_format || val == 0) - return result; - else - return result + 1; - } - default: - internal_error (__FILE__, __LINE__, - _("failed internal consistency check")); - } -} - -/* See print-utils.h. */ - -const char * -core_addr_to_string (const CORE_ADDR addr) -{ - char *str = get_print_cell (); - - strcpy (str, "0x"); - strcat (str, phex (addr, sizeof (addr))); - return str; -} - -/* See print-utils.h. */ - -const char * -core_addr_to_string_nz (const CORE_ADDR addr) -{ - char *str = get_print_cell (); - - strcpy (str, "0x"); - strcat (str, phex_nz (addr, sizeof (addr))); - return str; -} - -/* See print-utils.h. */ - -const char * -host_address_to_string_1 (const void *addr) -{ - char *str = get_print_cell (); - - xsnprintf (str, PRINT_CELL_SIZE, "0x%s", - phex_nz ((uintptr_t) addr, sizeof (addr))); - return str; -} diff --git a/gdb/gdbsupport/print-utils.h b/gdb/gdbsupport/print-utils.h deleted file mode 100644 index 7541791..0000000 --- a/gdb/gdbsupport/print-utils.h +++ /dev/null @@ -1,85 +0,0 @@ -/* Cell-based print utility routines for GDB, the GNU debugger. - - Copyright (C) 1986-2020 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 COMMON_PRINT_UTILS_H -#define COMMON_PRINT_UTILS_H - -/* How many characters (including the terminating null byte) fit in a - cell. */ -#define PRINT_CELL_SIZE 50 - -/* %u for ULONGEST. The result is stored in a circular static buffer, - NUMCELLS deep. */ - -extern char *pulongest (ULONGEST u); - -/* %d for LONGEST. The result is stored in a circular static buffer, - NUMCELLS deep. */ - -extern char *plongest (LONGEST l); - -/* Convert a ULONGEST into a HEX string, like %lx, with leading zeros. - The result is stored in a circular static buffer, NUMCELLS deep. */ - -extern char *phex (ULONGEST l, int sizeof_l); - -/* Convert a ULONGEST into a HEX string, like %lx, without leading zeros. - The result is stored in a circular static buffer, NUMCELLS deep. */ - -extern char *phex_nz (ULONGEST l, int sizeof_l); - -/* Converts a LONGEST to a C-format hexadecimal literal and stores it - in a static string. Returns a pointer to this string. */ - -extern char *hex_string (LONGEST num); - -/* Converts a LONGEST number to a C-format hexadecimal literal and - stores it in a static string. Returns a pointer to this string - that is valid until the next call. The number is padded on the - left with 0s to at least WIDTH characters. */ - -extern char *hex_string_custom (LONGEST num, int width); - -/* Convert VAL to a numeral in the given radix. For - * radix 10, IS_SIGNED may be true, indicating a signed quantity; - * otherwise VAL is interpreted as unsigned. If WIDTH is supplied, - * it is the minimum width (0-padded if needed). USE_C_FORMAT means - * to use C format in all cases. If it is false, then 'x' - * and 'o' formats do not include a prefix (0x or leading 0). */ - -extern char *int_string (LONGEST val, int radix, int is_signed, int width, - int use_c_format); - -/* Convert a CORE_ADDR into a string. */ - -extern const char *core_addr_to_string (const CORE_ADDR addr); - -extern const char *core_addr_to_string_nz (const CORE_ADDR addr); - -extern const char *host_address_to_string_1 (const void *addr); - -/* Wrapper that avoids adding a pointless cast to all callers. */ -#define host_address_to_string(ADDR) \ - host_address_to_string_1 ((const void *) (ADDR)) - -/* Return the next entry in the circular print buffer. */ - -extern char *get_print_cell (void); - -#endif /* COMMON_PRINT_UTILS_H */ diff --git a/gdb/gdbsupport/ptid.c b/gdb/gdbsupport/ptid.c deleted file mode 100644 index 9638943..0000000 --- a/gdb/gdbsupport/ptid.c +++ /dev/null @@ -1,26 +0,0 @@ -/* The ptid_t type and common functions operating on it. - - Copyright (C) 1986-2020 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 "common-defs.h" -#include "ptid.h" - -/* See ptid.h for these. */ - -ptid_t const null_ptid = ptid_t::make_null (); -ptid_t const minus_one_ptid = ptid_t::make_minus_one (); diff --git a/gdb/gdbsupport/ptid.h b/gdb/gdbsupport/ptid.h deleted file mode 100644 index ef52d55..0000000 --- a/gdb/gdbsupport/ptid.h +++ /dev/null @@ -1,155 +0,0 @@ -/* The ptid_t type and common functions operating on it. - - Copyright (C) 1986-2020 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 COMMON_PTID_H -#define COMMON_PTID_H - -/* The ptid struct is a collection of the various "ids" necessary for - identifying the inferior process/thread being debugged. This - consists of the process id (pid), lightweight process id (lwp) and - thread id (tid). When manipulating ptids, the constructors, - accessors, and predicates declared in this file should be used. Do - NOT access the struct ptid members directly. - - process_stratum targets that handle threading themselves should - prefer using the ptid.lwp field, leaving the ptid.tid field for any - thread_stratum target that might want to sit on top. -*/ - -class ptid_t -{ -public: - /* Must have a trivial defaulted default constructor so that the - type remains POD. */ - ptid_t () noexcept = default; - - /* Make a ptid given the necessary PID, LWP, and TID components. - - A ptid with only a PID (LWP and TID equal to zero) is usually used to - represent a whole process, including all its lwps/threads. */ - - explicit constexpr ptid_t (int pid, long lwp = 0, long tid = 0) - : m_pid (pid), m_lwp (lwp), m_tid (tid) - {} - - /* Fetch the pid (process id) component from the ptid. */ - - constexpr int pid () const - { return m_pid; } - - /* Return true if the ptid's lwp member is non-zero. */ - - constexpr bool lwp_p () const - { return m_lwp != 0; } - - /* Fetch the lwp (lightweight process) component from the ptid. */ - - constexpr long lwp () const - { return m_lwp; } - - /* Return true if the ptid's tid member is non-zero. */ - - constexpr bool tid_p () const - { return m_tid != 0; } - - /* Fetch the tid (thread id) component from a ptid. */ - - constexpr long tid () const - { return m_tid; } - - /* Return true if the ptid represents a whole process, including all its - lwps/threads. Such ptids have the form of (pid, 0, 0), with - pid != -1. */ - - constexpr bool is_pid () const - { - return (*this != make_null () - && *this != make_minus_one () - && m_lwp == 0 - && m_tid == 0); - } - - /* Compare two ptids to see if they are equal. */ - - constexpr bool operator== (const ptid_t &other) const - { - return (m_pid == other.m_pid - && m_lwp == other.m_lwp - && m_tid == other.m_tid); - } - - /* Compare two ptids to see if they are different. */ - - constexpr bool operator!= (const ptid_t &other) const - { - return !(*this == other); - } - - /* Return true if the ptid matches FILTER. FILTER can be the wild - card MINUS_ONE_PTID (all ptids match it); can be a ptid representing - a process (ptid.is_pid () returns true), in which case, all lwps and - threads of that given process match, lwps and threads of other - processes do not; or, it can represent a specific thread, in which - case, only that thread will match true. The ptid must represent a - specific LWP or THREAD, it can never be a wild card. */ - - constexpr bool matches (const ptid_t &filter) const - { - return (/* If filter represents any ptid, it's always a match. */ - filter == make_minus_one () - /* If filter is only a pid, any ptid with that pid - matches. */ - || (filter.is_pid () && m_pid == filter.pid ()) - - /* Otherwise, this ptid only matches if it's exactly equal - to filter. */ - || *this == filter); - } - - /* Make a null ptid. */ - - static constexpr ptid_t make_null () - { return ptid_t (0, 0, 0); } - - /* Make a minus one ptid. */ - - static constexpr ptid_t make_minus_one () - { return ptid_t (-1, 0, 0); } - -private: - /* Process id. */ - int m_pid; - - /* Lightweight process id. */ - long m_lwp; - - /* Thread id. */ - long m_tid; -}; - -/* The null or zero ptid, often used to indicate no process. */ - -extern const ptid_t null_ptid; - -/* The (-1,0,0) ptid, often used to indicate either an error condition - or a "don't care" condition, i.e, "run all threads." */ - -extern const ptid_t minus_one_ptid; - -#endif /* COMMON_PTID_H */ diff --git a/gdb/gdbsupport/refcounted-object.h b/gdb/gdbsupport/refcounted-object.h deleted file mode 100644 index 95a3127..0000000 --- a/gdb/gdbsupport/refcounted-object.h +++ /dev/null @@ -1,70 +0,0 @@ -/* Base class of intrusively reference-counted objects. - Copyright (C) 2017-2020 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 COMMON_REFCOUNTED_OBJECT_H -#define COMMON_REFCOUNTED_OBJECT_H - -/* Base class of intrusively reference-countable objects. - Incrementing and decrementing the reference count is an external - responsibility. */ - -class refcounted_object -{ -public: - refcounted_object () = default; - - /* Increase the refcount. */ - void incref () - { - gdb_assert (m_refcount >= 0); - m_refcount++; - } - - /* Decrease the refcount. */ - void decref () - { - m_refcount--; - gdb_assert (m_refcount >= 0); - } - - int refcount () const { return m_refcount; } - -private: - DISABLE_COPY_AND_ASSIGN (refcounted_object); - - /* The reference count. */ - int m_refcount = 0; -}; - -/* A policy class to interface gdb::ref_ptr with a - refcounted_object. */ - -struct refcounted_object_ref_policy -{ - static void incref (refcounted_object *ptr) - { - ptr->incref (); - } - - static void decref (refcounted_object *ptr) - { - ptr->decref (); - } -}; - -#endif /* COMMON_REFCOUNTED_OBJECT_H */ diff --git a/gdb/gdbsupport/rsp-low.c b/gdb/gdbsupport/rsp-low.c deleted file mode 100644 index 9bb1660..0000000 --- a/gdb/gdbsupport/rsp-low.c +++ /dev/null @@ -1,307 +0,0 @@ -/* Low-level RSP routines for GDB, the GNU debugger. - - Copyright (C) 1988-2020 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 "common-defs.h" -#include "rsp-low.h" - -/* See rsp-low.h. */ - -int -fromhex (int a) -{ - if (a >= '0' && a <= '9') - return a - '0'; - else if (a >= 'a' && a <= 'f') - return a - 'a' + 10; - else if (a >= 'A' && a <= 'F') - return a - 'A' + 10; - else - error (_("Reply contains invalid hex digit %d"), a); -} - -/* See rsp-low.h. */ - -int -tohex (int nib) -{ - if (nib < 10) - return '0' + nib; - else - return 'a' + nib - 10; -} - -/* Encode 64 bits in 16 chars of hex. */ - -static const char hexchars[] = "0123456789abcdef"; - -static int -ishex (int ch, int *val) -{ - if ((ch >= 'a') && (ch <= 'f')) - { - *val = ch - 'a' + 10; - return 1; - } - if ((ch >= 'A') && (ch <= 'F')) - { - *val = ch - 'A' + 10; - return 1; - } - if ((ch >= '0') && (ch <= '9')) - { - *val = ch - '0'; - return 1; - } - return 0; -} - -/* See rsp-low.h. */ - -char * -pack_nibble (char *buf, int nibble) -{ - *buf++ = hexchars[(nibble & 0x0f)]; - return buf; -} - -/* See rsp-low.h. */ - -char * -pack_hex_byte (char *pkt, int byte) -{ - *pkt++ = hexchars[(byte >> 4) & 0xf]; - *pkt++ = hexchars[(byte & 0xf)]; - return pkt; -} - -/* See rsp-low.h. */ - -const char * -unpack_varlen_hex (const char *buff, /* packet to parse */ - ULONGEST *result) -{ - int nibble; - ULONGEST retval = 0; - - while (ishex (*buff, &nibble)) - { - buff++; - retval = retval << 4; - retval |= nibble & 0x0f; - } - *result = retval; - return buff; -} - -/* See rsp-low.h. */ - -int -hex2bin (const char *hex, gdb_byte *bin, int count) -{ - int i; - - for (i = 0; i < count; i++) - { - if (hex[0] == 0 || hex[1] == 0) - { - /* Hex string is short, or of uneven length. - Return the count that has been converted so far. */ - return i; - } - *bin++ = fromhex (hex[0]) * 16 + fromhex (hex[1]); - hex += 2; - } - return i; -} - -/* See rsp-low.h. */ - -gdb::byte_vector -hex2bin (const char *hex) -{ - size_t bin_len = strlen (hex) / 2; - gdb::byte_vector bin (bin_len); - - hex2bin (hex, bin.data (), bin_len); - - return bin; -} - -/* See rsp-low.h. */ - -std::string -hex2str (const char *hex) -{ - return hex2str (hex, strlen (hex)); -} - -/* See rsp-low.h. */ - -std::string -hex2str (const char *hex, int count) -{ - std::string ret; - - ret.reserve (count); - for (size_t i = 0; i < count; ++i) - { - if (hex[0] == '\0' || hex[1] == '\0') - { - /* Hex string is short, or of uneven length. Return what we - have so far. */ - return ret; - } - ret += fromhex (hex[0]) * 16 + fromhex (hex[1]); - hex += 2; - } - - return ret; -} - -/* See rsp-low.h. */ - -int -bin2hex (const gdb_byte *bin, char *hex, int count) -{ - int i; - - for (i = 0; i < count; i++) - { - *hex++ = tohex ((*bin >> 4) & 0xf); - *hex++ = tohex (*bin++ & 0xf); - } - *hex = 0; - return i; -} - -/* See rsp-low.h. */ - -std::string -bin2hex (const gdb_byte *bin, int count) -{ - std::string ret; - - ret.reserve (count * 2); - for (int i = 0; i < count; ++i) - { - ret += tohex ((*bin >> 4) & 0xf); - ret += tohex (*bin++ & 0xf); - } - - return ret; -} - -/* Return whether byte B needs escaping when sent as part of binary data. */ - -static int -needs_escaping (gdb_byte b) -{ - return b == '$' || b == '#' || b == '}' || b == '*'; -} - -/* See rsp-low.h. */ - -int -remote_escape_output (const gdb_byte *buffer, int len_units, int unit_size, - gdb_byte *out_buf, int *out_len_units, - int out_maxlen_bytes) -{ - int input_unit_index, output_byte_index = 0, byte_index_in_unit; - int number_escape_bytes_needed; - - /* Try to copy integral addressable memory units until - (1) we run out of space or - (2) we copied all of them. */ - for (input_unit_index = 0; - input_unit_index < len_units; - input_unit_index++) - { - /* Find out how many escape bytes we need for this unit. */ - number_escape_bytes_needed = 0; - for (byte_index_in_unit = 0; - byte_index_in_unit < unit_size; - byte_index_in_unit++) - { - int idx = input_unit_index * unit_size + byte_index_in_unit; - gdb_byte b = buffer[idx]; - if (needs_escaping (b)) - number_escape_bytes_needed++; - } - - /* Check if we have room to fit this escaped unit. */ - if (output_byte_index + unit_size + number_escape_bytes_needed > - out_maxlen_bytes) - break; - - /* Copy the unit byte per byte, adding escapes. */ - for (byte_index_in_unit = 0; - byte_index_in_unit < unit_size; - byte_index_in_unit++) - { - int idx = input_unit_index * unit_size + byte_index_in_unit; - gdb_byte b = buffer[idx]; - if (needs_escaping (b)) - { - out_buf[output_byte_index++] = '}'; - out_buf[output_byte_index++] = b ^ 0x20; - } - else - out_buf[output_byte_index++] = b; - } - } - - *out_len_units = input_unit_index; - return output_byte_index; -} - -/* See rsp-low.h. */ - -int -remote_unescape_input (const gdb_byte *buffer, int len, - gdb_byte *out_buf, int out_maxlen) -{ - int input_index, output_index; - int escaped; - - output_index = 0; - escaped = 0; - for (input_index = 0; input_index < len; input_index++) - { - gdb_byte b = buffer[input_index]; - - if (output_index + 1 > out_maxlen) - error (_("Received too much data from the target.")); - - if (escaped) - { - out_buf[output_index++] = b ^ 0x20; - escaped = 0; - } - else if (b == '}') - escaped = 1; - else - out_buf[output_index++] = b; - } - - if (escaped) - error (_("Unmatched escape character in target response.")); - - return output_index; -} - diff --git a/gdb/gdbsupport/rsp-low.h b/gdb/gdbsupport/rsp-low.h deleted file mode 100644 index 84eb839..0000000 --- a/gdb/gdbsupport/rsp-low.h +++ /dev/null @@ -1,101 +0,0 @@ -/* Low-level RSP routines for GDB, the GNU debugger. - - Copyright (C) 1988-2020 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 COMMON_RSP_LOW_H -#define COMMON_RSP_LOW_H - -#include "gdbsupport/byte-vector.h" - -/* Convert hex digit A to a number, or throw an exception. */ - -extern int fromhex (int a); - -/* Convert number NIB to a hex digit. */ - -extern int tohex (int nib); - -/* Write a character representing the low order four bits of NIBBLE in - hex to *BUF. Returns BUF+1. */ - -extern char *pack_nibble (char *buf, int nibble); - -/* Write the low byte of BYTE in hex to *BUF. Returns BUF+2. */ - -extern char *pack_hex_byte (char *pkt, int byte); - -/* Read hex digits from BUFF and convert to a number, which is stored - in RESULT. Reads until a non-hex digit is seen. Returns a pointer - to the terminating character. */ - -extern const char *unpack_varlen_hex (const char *buff, ULONGEST *result); - -/* HEX is a string of characters representing hexadecimal digits. - Convert pairs of hex digits to bytes and store sequentially into - BIN. COUNT is the maximum number of characters to convert. This - will convert fewer characters if the number of hex characters - actually seen is odd, or if HEX terminates before COUNT characters. - Returns the number of characters actually converted. */ - -extern int hex2bin (const char *hex, gdb_byte *bin, int count); - -/* Like the above, but return a gdb::byte_vector. */ - -gdb::byte_vector hex2bin (const char *hex); - -/* Like hex2bin, but return a std::string. */ - -extern std::string hex2str (const char *hex); - -/* Like hex2bin, but return a std::string. */ - -extern std::string hex2str (const char *hex, int count); - -/* Convert some bytes to a hexadecimal representation. BIN holds the - bytes to convert. COUNT says how many bytes to convert. The - resulting characters are stored in HEX, followed by a NUL - character. Returns the number of bytes actually converted. */ - -extern int bin2hex (const gdb_byte *bin, char *hex, int count); - -/* Overloaded version of bin2hex that returns a std::string. */ - -extern std::string bin2hex (const gdb_byte *bin, int count); - -/* Convert BUFFER, binary data at least LEN_UNITS addressable memory units - long, into escaped binary data in OUT_BUF. Only copy memory units that fit - completely in OUT_BUF. Set *OUT_LEN_UNITS to the number of units from - BUFFER successfully encoded in OUT_BUF, and return the number of bytes used - in OUT_BUF. The total number of bytes in the output buffer will be at most - OUT_MAXLEN_BYTES. This function properly escapes '*', and so is suitable - for the server side as well as the client. */ - -extern int remote_escape_output (const gdb_byte *buffer, int len_units, - int unit_size, gdb_byte *out_buf, - int *out_len_units, int out_maxlen_bytes); - -/* Convert BUFFER, escaped data LEN bytes long, into binary data - in OUT_BUF. Return the number of bytes written to OUT_BUF. - Raise an error if the total number of bytes exceeds OUT_MAXLEN. - - This function reverses remote_escape_output. */ - -extern int remote_unescape_input (const gdb_byte *buffer, int len, - gdb_byte *out_buf, int out_maxlen); - -#endif /* COMMON_RSP_LOW_H */ diff --git a/gdb/gdbsupport/run-time-clock.c b/gdb/gdbsupport/run-time-clock.c deleted file mode 100644 index 24dc19c..0000000 --- a/gdb/gdbsupport/run-time-clock.c +++ /dev/null @@ -1,58 +0,0 @@ -/* User/system CPU time clocks that follow the std::chrono interface. - Copyright (C) 2016-2020 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 "common-defs.h" -#include "run-time-clock.h" -#if defined HAVE_SYS_RESOURCE_H -#include <sys/resource.h> -#endif - -using namespace std::chrono; - -run_time_clock::time_point -run_time_clock::now () noexcept -{ - return time_point (microseconds (get_run_time ())); -} - -#ifdef HAVE_GETRUSAGE -static std::chrono::microseconds -timeval_to_microseconds (struct timeval *tv) -{ - return (seconds (tv->tv_sec) + microseconds (tv->tv_usec)); -} -#endif - -void -run_time_clock::now (user_cpu_time_clock::time_point &user, - system_cpu_time_clock::time_point &system) noexcept -{ -#ifdef HAVE_GETRUSAGE - struct rusage rusage; - - getrusage (RUSAGE_SELF, &rusage); - - microseconds utime = timeval_to_microseconds (&rusage.ru_utime); - microseconds stime = timeval_to_microseconds (&rusage.ru_stime); - user = user_cpu_time_clock::time_point (utime); - system = system_cpu_time_clock::time_point (stime); -#else - user = user_cpu_time_clock::time_point (microseconds (get_run_time ())); - system = system_cpu_time_clock::time_point (microseconds::zero ()); -#endif -} diff --git a/gdb/gdbsupport/run-time-clock.h b/gdb/gdbsupport/run-time-clock.h deleted file mode 100644 index fef0c34..0000000 --- a/gdb/gdbsupport/run-time-clock.h +++ /dev/null @@ -1,75 +0,0 @@ -/* User/system CPU time clocks that follow the std::chrono interface. - Copyright (C) 2016-2020 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 COMMON_RUN_TIME_CLOCK_H -#define COMMON_RUN_TIME_CLOCK_H - -#include <chrono> - -/* Count the total amount of time spent executing in user mode. */ - -struct user_cpu_time_clock -{ - using duration = std::chrono::microseconds; - using rep = duration::rep; - using period = duration::period; - using time_point = std::chrono::time_point<user_cpu_time_clock>; - - static constexpr bool is_steady = true; - - /* Use run_time_clock::now instead. */ - static time_point now () noexcept = delete; -}; - -/* Count the total amount of time spent executing in kernel mode. */ - -struct system_cpu_time_clock -{ - using duration = std::chrono::microseconds; - using rep = duration::rep; - using period = duration::period; - using time_point = std::chrono::time_point<system_cpu_time_clock>; - - static constexpr bool is_steady = true; - - /* Use run_time_clock::now instead. */ - static time_point now () noexcept = delete; -}; - -/* Count the total amount of time spent executing in userspace+kernel - mode. */ - -struct run_time_clock -{ - using duration = std::chrono::microseconds; - using rep = duration::rep; - using period = duration::period; - using time_point = std::chrono::time_point<run_time_clock>; - - static constexpr bool is_steady = true; - - static time_point now () noexcept; - - /* Return the user/system time as separate time points, if - supported. If not supported, then the combined user+kernel time - is returned in USER and SYSTEM is set to zero. */ - static void now (user_cpu_time_clock::time_point &user, - system_cpu_time_clock::time_point &system) noexcept; -}; - -#endif /* COMMON_RUN_TIME_CLOCK_H */ diff --git a/gdb/gdbsupport/safe-iterator.h b/gdb/gdbsupport/safe-iterator.h deleted file mode 100644 index 04fe52a..0000000 --- a/gdb/gdbsupport/safe-iterator.h +++ /dev/null @@ -1,135 +0,0 @@ -/* A safe iterator for GDB, the GNU debugger. - Copyright (C) 2018-2020 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 COMMON_SAFE_ITERATOR_H -#define COMMON_SAFE_ITERATOR_H - -/* A forward iterator that wraps Iterator, such that when iterating - with iterator IT, it is possible to delete *IT without invalidating - IT. Suitably wrapped in a range type and used with range-for, this - allow convenient patterns like this: - - // range_safe() returns a range type whose begin()/end() methods - // return safe iterators. - for (foo *f : range_safe ()) - { - if (f->should_delete ()) - { - // The ++it operation implicitly done by the range-for is - // still OK after this. - delete f; - } - } -*/ - -template<typename Iterator> -class basic_safe_iterator -{ -public: - typedef basic_safe_iterator self_type; - typedef typename Iterator::value_type value_type; - typedef typename Iterator::reference reference; - typedef typename Iterator::pointer pointer; - typedef typename Iterator::iterator_category iterator_category; - typedef typename Iterator::difference_type difference_type; - - /* Construct using the given argument; the end iterator is default - constructed. */ - template<typename Arg> - explicit basic_safe_iterator (Arg &&arg) - : m_it (std::forward<Arg> (arg)), - m_next (m_it) - { - if (m_it != m_end) - ++m_next; - } - - /* Construct the iterator using the first argument, and construct - the end iterator using the second argument. */ - template<typename Arg> - explicit basic_safe_iterator (Arg &&arg, Arg &&arg2) - : m_it (std::forward<Arg> (arg)), - m_next (m_it), - m_end (std::forward<Arg> (arg2)) - { - if (m_it != m_end) - ++m_next; - } - - /* Create a one-past-end iterator. */ - basic_safe_iterator () - {} - - value_type operator* () const { return *m_it; } - - self_type &operator++ () - { - m_it = m_next; - if (m_it != m_end) - ++m_next; - return *this; - } - - bool operator== (const self_type &other) const - { return m_it == other.m_it; } - - bool operator!= (const self_type &other) const - { return m_it != other.m_it; } - -private: - /* The current element. */ - Iterator m_it {}; - - /* The next element. Always one element ahead of M_IT. */ - Iterator m_next {}; - - /* A one-past-end iterator. */ - Iterator m_end {}; -}; - -/* A range adapter that wraps another range, and then returns safe - iterators wrapping the original range's iterators. */ - -template<typename Range> -class basic_safe_range -{ -public: - - typedef basic_safe_iterator<typename Range::iterator> iterator; - - explicit basic_safe_range (Range range) - : m_range (range) - { - } - - iterator begin () - { - return iterator (m_range.begin (), m_range.end ()); - } - - iterator end () - { - return iterator (m_range.end (), m_range.end ()); - } - -private: - - Range m_range; -}; - -#endif /* COMMON_SAFE_ITERATOR_H */ diff --git a/gdb/gdbsupport/safe-strerror.c b/gdb/gdbsupport/safe-strerror.c deleted file mode 100644 index 5804621..0000000 --- a/gdb/gdbsupport/safe-strerror.c +++ /dev/null @@ -1,56 +0,0 @@ -/* Safe version of strerror for GDB, the GNU debugger. - - Copyright (C) 2006-2020 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 "common-defs.h" -#include <string.h> - -/* There are two different versions of strerror_r; one is GNU-specific, the - other XSI-compliant. They differ in the return type. This overload lets - us choose the right behavior for each return type. We cannot rely on Gnulib - to solve this for us because IPA does not use Gnulib but uses this - function. */ - -/* Called if we have a XSI-compliant strerror_r. */ -ATTRIBUTE_UNUSED static char * -select_strerror_r (int res, char *buf) -{ - return res == 0 ? buf : nullptr; -} - -/* Called if we have a GNU strerror_r. */ -ATTRIBUTE_UNUSED static char * -select_strerror_r (char *res, char *) -{ - return res; -} - -/* Implementation of safe_strerror as defined in common-utils.h. */ - -const char * -safe_strerror (int errnum) -{ - static thread_local char buf[1024]; - - char *res = select_strerror_r (strerror_r (errnum, buf, sizeof (buf)), buf); - if (res != nullptr) - return res; - - xsnprintf (buf, sizeof buf, "(undocumented errno %d)", errnum); - return buf; -} diff --git a/gdb/gdbsupport/scope-exit.h b/gdb/gdbsupport/scope-exit.h deleted file mode 100644 index 192f666..0000000 --- a/gdb/gdbsupport/scope-exit.h +++ /dev/null @@ -1,186 +0,0 @@ -/* Copyright (C) 2019-2020 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 COMMON_SCOPE_EXIT_H -#define COMMON_SCOPE_EXIT_H - -#include <functional> -#include <type_traits> -#include "gdbsupport/preprocessor.h" - -/* scope_exit is a general-purpose scope guard that calls its exit - function at the end of the current scope. A scope_exit may be - canceled by calling the "release" method. The API is modeled on - P0052R5 - Generic Scope Guard and RAII Wrapper for the Standard - Library, which is itself based on Andrej Alexandrescu's - ScopeGuard/SCOPE_EXIT. - - There are two forms available: - - - The "make_scope_exit" form allows canceling the scope guard. Use - it like this: - - auto cleanup = make_scope_exit ( <function, function object, lambda> ); - ... - cleanup.release (); // cancel - - - If you don't need to cancel the guard, you can use the SCOPE_EXIT - macro, like this: - - SCOPE_EXIT - { - // any code you like here. - } - - See also forward_scope_exit. -*/ - -/* CRTP base class for cancelable scope_exit-like classes. Implements - the common call-custom-function-from-dtor functionality. Classes - that inherit this implement the on_exit() method, which is called - from scope_exit_base's dtor. */ - -template <typename CRTP> -class scope_exit_base -{ -public: - scope_exit_base () = default; - - ~scope_exit_base () - { - if (!m_released) - { - auto *self = static_cast<CRTP *> (this); - self->on_exit (); - } - } - - /* This is needed for make_scope_exit because copy elision isn't - guaranteed until C++17. An optimizing compiler will usually skip - calling this, but it must exist. */ - scope_exit_base (const scope_exit_base &other) - : m_released (other.m_released) - { - other.m_released = true; - } - - void operator= (const scope_exit_base &) = delete; - - /* If this is called, then the wrapped function will not be called - on destruction. */ - void release () noexcept - { - m_released = true; - } - -private: - - /* True if released. Mutable because of the copy ctor hack - above. */ - mutable bool m_released = false; -}; - -/* The scope_exit class. */ - -template<typename EF> -class scope_exit : public scope_exit_base<scope_exit<EF>> -{ - /* For access to on_exit(). */ - friend scope_exit_base<scope_exit<EF>>; - -public: - - template<typename EFP, - typename = gdb::Requires<std::is_constructible<EF, EFP>>> - scope_exit (EFP &&f) - try : m_exit_function ((!std::is_lvalue_reference<EFP>::value - && std::is_nothrow_constructible<EF, EFP>::value) - ? std::move (f) - : f) - { - } - catch (...) - { - /* "If the initialization of exit_function throws an exception, - calls f()." */ - f (); - } - - template<typename EFP, - typename = gdb::Requires<std::is_constructible<EF, EFP>>> - scope_exit (scope_exit &&rhs) - noexcept (std::is_nothrow_move_constructible<EF>::value - || std::is_nothrow_copy_constructible<EF>::value) - : m_exit_function (std::is_nothrow_constructible<EFP>::value - ? std::move (rhs) - : rhs) - { - rhs.release (); - } - - /* This is needed for make_scope_exit because copy elision isn't - guaranteed until C++17. An optimizing compiler will usually skip - calling this, but it must exist. */ - scope_exit (const scope_exit &other) - : scope_exit_base<scope_exit<EF>> (other), - m_exit_function (other.m_exit_function) - { - } - - void operator= (const scope_exit &) = delete; - void operator= (scope_exit &&) = delete; - -private: - void on_exit () - { - m_exit_function (); - } - - /* The function to call on scope exit. */ - EF m_exit_function; -}; - -template <typename EF> -scope_exit<typename std::decay<EF>::type> -make_scope_exit (EF &&f) -{ - return scope_exit<typename std::decay<EF>::type> (std::forward<EF> (f)); -} - -namespace detail -{ - -enum class scope_exit_lhs {}; - -template<typename EF> -scope_exit<typename std::decay<EF>::type> -operator+ (scope_exit_lhs, EF &&rhs) -{ - return scope_exit<typename std::decay<EF>::type> (std::forward<EF> (rhs)); -} - -} - -/* Register a block of code to run on scope exit. Note that the local - context is captured by reference, which means you should be careful - to avoid inadvertently changing a captured local's value before the - scope exit runs. */ - -#define SCOPE_EXIT \ - auto CONCAT(scope_exit_, __LINE__) = ::detail::scope_exit_lhs () + [&] () - -#endif /* COMMON_SCOPE_EXIT_H */ diff --git a/gdb/gdbsupport/scoped_fd.h b/gdb/gdbsupport/scoped_fd.h deleted file mode 100644 index f40ce8b..0000000 --- a/gdb/gdbsupport/scoped_fd.h +++ /dev/null @@ -1,87 +0,0 @@ -/* scoped_fd, automatically close a file descriptor - - Copyright (C) 2018-2020 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 COMMON_SCOPED_FD_H -#define COMMON_SCOPED_FD_H - -#include <unistd.h> -#include "filestuff.h" - -/* A smart-pointer-like class to automatically close a file descriptor. */ - -class scoped_fd -{ -public: - explicit scoped_fd (int fd = -1) noexcept : m_fd (fd) {} - - scoped_fd (scoped_fd &&other) - : m_fd (other.m_fd) - { - other.m_fd = -1; - } - - ~scoped_fd () - { - if (m_fd >= 0) - close (m_fd); - } - - scoped_fd &operator= (scoped_fd &&other) - { - if (m_fd != other.m_fd) - { - if (m_fd >= 0) - close (m_fd); - m_fd = other.m_fd; - other.m_fd = -1; - } - return *this; - } - - DISABLE_COPY_AND_ASSIGN (scoped_fd); - - ATTRIBUTE_UNUSED_RESULT int release () noexcept - { - int fd = m_fd; - m_fd = -1; - return fd; - } - - /* Like release, but return a gdb_file_up that owns the file - descriptor. On success, this scoped_fd will be released. On - failure, return NULL and leave this scoped_fd in possession of - the fd. */ - gdb_file_up to_file (const char *mode) noexcept - { - gdb_file_up result (fdopen (m_fd, mode)); - if (result != nullptr) - m_fd = -1; - return result; - } - - int get () const noexcept - { - return m_fd; - } - -private: - int m_fd; -}; - -#endif /* COMMON_SCOPED_FD_H */ diff --git a/gdb/gdbsupport/scoped_mmap.c b/gdb/gdbsupport/scoped_mmap.c deleted file mode 100644 index 6b424dc..0000000 --- a/gdb/gdbsupport/scoped_mmap.c +++ /dev/null @@ -1,49 +0,0 @@ -/* scoped_mmap, automatically unmap files - - Copyright (C) 2018-2020 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 "common-defs.h" -#include "scoped_mmap.h" -#include "scoped_fd.h" -#include "gdbsupport/filestuff.h" - -#ifdef HAVE_SYS_MMAN_H - -scoped_mmap -mmap_file (const char *filename) -{ - scoped_fd fd (gdb_open_cloexec (filename, O_RDONLY, 0)); - if (fd.get () < 0) - perror_with_name (("open")); - - off_t size = lseek (fd.get (), 0, SEEK_END); - if (size < 0) - perror_with_name (("lseek")); - - /* We can't map an empty file. */ - if (size == 0) - error (_("file to mmap is empty")); - - scoped_mmap mmapped_file (nullptr, size, PROT_READ, MAP_PRIVATE, fd.get (), 0); - if (mmapped_file.get () == MAP_FAILED) - perror_with_name (("mmap")); - - return mmapped_file; -} - -#endif /* HAVE_SYS_MMAN_H */ diff --git a/gdb/gdbsupport/scoped_mmap.h b/gdb/gdbsupport/scoped_mmap.h deleted file mode 100644 index bab988f..0000000 --- a/gdb/gdbsupport/scoped_mmap.h +++ /dev/null @@ -1,94 +0,0 @@ -/* scoped_mmap, automatically unmap files - - Copyright (C) 2018-2020 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 COMMON_SCOPED_MMAP_H -#define COMMON_SCOPED_MMAP_H - -#ifdef HAVE_SYS_MMAN_H - -#include <sys/mman.h> - -/* A smart-pointer-like class to mmap() and automatically munmap() a memory - mapping. */ - -class scoped_mmap -{ -public: - scoped_mmap () noexcept : m_mem (MAP_FAILED), m_length (0) {} - scoped_mmap (void *addr, size_t length, int prot, int flags, int fd, - off_t offset) noexcept : m_length (length) - { - m_mem = mmap (addr, m_length, prot, flags, fd, offset); - } - - ~scoped_mmap () - { - destroy (); - } - - scoped_mmap (scoped_mmap &&rhs) - { - destroy (); - - m_mem = rhs.m_mem; - m_length = rhs.m_length; - - rhs.m_mem = MAP_FAILED; - rhs.m_length = 0; - } - - DISABLE_COPY_AND_ASSIGN (scoped_mmap); - - ATTRIBUTE_UNUSED_RESULT void *release () noexcept - { - void *mem = m_mem; - m_mem = MAP_FAILED; - m_length = 0; - return mem; - } - - void reset (void *addr, size_t length, int prot, int flags, int fd, - off_t offset) noexcept - { - destroy (); - - m_length = length; - m_mem = mmap (addr, m_length, prot, flags, fd, offset); - } - - size_t size () const noexcept { return m_length; } - void *get () const noexcept { return m_mem; } - -private: - void destroy () - { - if (m_mem != MAP_FAILED) - munmap (m_mem, m_length); - } - - void *m_mem; - size_t m_length; -}; - -/* Map FILENAME in memory. Throw an error if anything goes wrong. */ -scoped_mmap mmap_file (const char *filename); - -#endif /* HAVE_SYS_MMAN_H */ - -#endif /* COMMON_SCOPED_MMAP_H */ diff --git a/gdb/gdbsupport/scoped_restore.h b/gdb/gdbsupport/scoped_restore.h deleted file mode 100644 index 0dca6d0..0000000 --- a/gdb/gdbsupport/scoped_restore.h +++ /dev/null @@ -1,118 +0,0 @@ -/* scoped_restore, a simple class for saving and restoring a value - - Copyright (C) 2016-2020 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 COMMON_SCOPED_RESTORE_H -#define COMMON_SCOPED_RESTORE_H - -/* Base class for scoped_restore_tmpl. */ -class scoped_restore_base -{ -public: - /* This informs the (scoped_restore_tmpl<T>) dtor that you no longer - want the original value restored. */ - void release () const - { m_saved_var = NULL; } - -protected: - scoped_restore_base (void *saved_var) - : m_saved_var (saved_var) - {} - - /* The type-erased saved variable. This is here so that clients can - call release() on a "scoped_restore" local, which is a typedef to - a scoped_restore_base. See below. */ - mutable void *m_saved_var; -}; - -/* A convenience typedef. Users of make_scoped_restore declare the - local RAII object as having this type. */ -typedef const scoped_restore_base &scoped_restore; - -/* An RAII-based object that saves a variable's value, and then - restores it again when this object is destroyed. */ -template<typename T> -class scoped_restore_tmpl : public scoped_restore_base -{ - public: - - /* Create a new scoped_restore object that saves the current value - of *VAR. *VAR will be restored when this scoped_restore object - is destroyed. */ - scoped_restore_tmpl (T *var) - : scoped_restore_base (var), - m_saved_value (*var) - { - } - - /* Create a new scoped_restore object that saves the current value - of *VAR, and sets *VAR to VALUE. *VAR will be restored when this - scoped_restore object is destroyed. This is templated on T2 to - allow passing VALUEs of types convertible to T. - E.g.: T='base'; T2='derived'. */ - template <typename T2> - scoped_restore_tmpl (T *var, T2 value) - : scoped_restore_base (var), - m_saved_value (*var) - { - *var = value; - } - - scoped_restore_tmpl (const scoped_restore_tmpl<T> &other) - : scoped_restore_base {other.m_saved_var}, - m_saved_value (other.m_saved_value) - { - other.m_saved_var = NULL; - } - - ~scoped_restore_tmpl () - { - if (saved_var () != NULL) - *saved_var () = m_saved_value; - } - -private: - /* Return a pointer to the saved variable with its type - restored. */ - T *saved_var () - { return static_cast<T *> (m_saved_var); } - - /* No need for this. It is intentionally not defined anywhere. */ - scoped_restore_tmpl &operator= (const scoped_restore_tmpl &); - - /* The saved value. */ - const T m_saved_value; -}; - -/* Make a scoped_restore. This is useful because it lets template - argument deduction work. */ -template<typename T> -scoped_restore_tmpl<T> make_scoped_restore (T *var) -{ - return scoped_restore_tmpl<T> (var); -} - -/* Make a scoped_restore. This is useful because it lets template - argument deduction work. */ -template<typename T, typename T2> -scoped_restore_tmpl<T> make_scoped_restore (T *var, T2 value) -{ - return scoped_restore_tmpl<T> (var, value); -} - -#endif /* COMMON_SCOPED_RESTORE_H */ diff --git a/gdb/gdbsupport/selftest.c b/gdb/gdbsupport/selftest.c deleted file mode 100644 index 8ab63be..0000000 --- a/gdb/gdbsupport/selftest.c +++ /dev/null @@ -1,111 +0,0 @@ -/* GDB self-testing. - Copyright (C) 2016-2020 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 "common-defs.h" -#include "common-exceptions.h" -#include "common-debug.h" -#include "selftest.h" -#include <map> - -namespace selftests -{ -/* All the tests that have been registered. Using an std::map allows keeping - the order of tests stable and easily looking up whether a test name - exists. */ - -static std::map<std::string, std::unique_ptr<selftest>> tests; - -/* A selftest that calls the test function without arguments. */ - -struct simple_selftest : public selftest -{ - simple_selftest (self_test_function *function_) - : function (function_) - {} - - void operator() () const override - { - function (); - } - - self_test_function *function; -}; - -/* See selftest.h. */ - -void -register_test (const std::string &name, selftest *test) -{ - /* Check that no test with this name already exist. */ - gdb_assert (tests.find (name) == tests.end ()); - - tests[name] = std::unique_ptr<selftest> (test); -} - -/* See selftest.h. */ - -void -register_test (const std::string &name, self_test_function *function) -{ - register_test (name, new simple_selftest (function)); -} - -/* See selftest.h. */ - -void -run_tests (const char *filter) -{ - int ran = 0, failed = 0; - - for (const auto &pair : tests) - { - const std::string &name = pair.first; - const std::unique_ptr<selftest> &test = pair.second; - - if (filter != NULL && *filter != '\0' - && name.find (filter) == std::string::npos) - continue; - - try - { - debug_printf (_("Running selftest %s.\n"), name.c_str ()); - ++ran; - (*test) (); - } - catch (const gdb_exception_error &ex) - { - ++failed; - debug_printf ("Self test failed: %s\n", ex.what ()); - } - - reset (); - } - - debug_printf (_("Ran %d unit tests, %d failed\n"), - ran, failed); -} - -/* See selftest.h. */ - -void for_each_selftest (for_each_selftest_ftype func) -{ - for (const auto &pair : tests) - func (pair.first); -} - -} // namespace selftests diff --git a/gdb/gdbsupport/selftest.h b/gdb/gdbsupport/selftest.h deleted file mode 100644 index 1c47fe1..0000000 --- a/gdb/gdbsupport/selftest.h +++ /dev/null @@ -1,73 +0,0 @@ -/* GDB self-testing. - Copyright (C) 2016-2020 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 COMMON_SELFTEST_H -#define COMMON_SELFTEST_H - -/* A test is just a function that does some checks and throws an - exception if something has gone wrong. */ - -typedef void self_test_function (void); - -namespace selftests -{ - -/* Interface for the various kinds of selftests. */ - -struct selftest -{ - virtual ~selftest () = default; - virtual void operator() () const = 0; -}; - -/* Register a new self-test. */ - -extern void register_test (const std::string &name, selftest *test); - -/* Register a new self-test. */ - -extern void register_test (const std::string &name, - self_test_function *function); - -/* Run all the self tests. This print a message describing the number - of test and the number of failures. - - If FILTER is not NULL and not empty, only tests with names containing FILTER - will be ran. */ - -extern void run_tests (const char *filter); - -/* Reset GDB or GDBserver's internal state. */ -extern void reset (); - -typedef void for_each_selftest_ftype (const std::string &name); - -/* Call FUNC for each registered selftest. */ - -extern void for_each_selftest (for_each_selftest_ftype func); -} - -/* Check that VALUE is true, and, if not, throw an exception. */ - -#define SELF_CHECK(VALUE) \ - do { \ - if (!(VALUE)) \ - error (_("self-test failed at %s:%d"), __FILE__, __LINE__); \ - } while (0) - -#endif /* COMMON_SELFTEST_H */ diff --git a/gdb/gdbsupport/signals-state-save-restore.c b/gdb/gdbsupport/signals-state-save-restore.c deleted file mode 100644 index c292d49..0000000 --- a/gdb/gdbsupport/signals-state-save-restore.c +++ /dev/null @@ -1,114 +0,0 @@ -/* Copyright (C) 2016-2020 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 "common-defs.h" -#include "signals-state-save-restore.h" -#include "gdbsupport/gdb-sigmask.h" - -#include <signal.h> - -/* The original signal actions and mask. */ - -#ifdef HAVE_SIGACTION -static struct sigaction original_signal_actions[NSIG]; - -static sigset_t original_signal_mask; -#endif - -/* See signals-state-save-restore.h. */ - -void -save_original_signals_state (bool quiet) -{ -#ifdef HAVE_SIGACTION - int i; - int res; - - res = gdb_sigmask (0, NULL, &original_signal_mask); - if (res == -1) - perror_with_name (("sigprocmask")); - - bool found_preinstalled = false; - - for (i = 1; i < NSIG; i++) - { - struct sigaction *oldact = &original_signal_actions[i]; - - res = sigaction (i, NULL, oldact); - if (res == -1 && errno == EINVAL) - { - /* Some signal numbers in the range are invalid. */ - continue; - } - else if (res == -1) - perror_with_name (("sigaction")); - - /* If we find a custom signal handler already installed, then - this function was called too late. This is a warning instead - of an internal error because this can also happen if you - LD_PRELOAD a library that installs a signal handler early via - __attribute__((constructor)), like libSegFault.so. */ - if (!quiet - && oldact->sa_handler != SIG_DFL - && oldact->sa_handler != SIG_IGN) - { - found_preinstalled = true; - - /* Use raw fprintf here because we're being called in early - startup, before GDB's filtered streams are created. */ - fprintf (stderr, - _("warning: Found custom handler for signal " - "%d (%s) preinstalled.\n"), i, - strsignal (i)); - } - } - - if (found_preinstalled) - { - fprintf (stderr, _("\ -Some signal dispositions inherited from the environment (SIG_DFL/SIG_IGN)\n\ -won't be propagated to spawned programs.\n")); - } -#endif -} - -/* See signals-state-save-restore.h. */ - -void -restore_original_signals_state (void) -{ -#ifdef HAVE_SIGACTION - int i; - int res; - - for (i = 1; i < NSIG; i++) - { - res = sigaction (i, &original_signal_actions[i], NULL); - if (res == -1 && errno == EINVAL) - { - /* Some signal numbers in the range are invalid. */ - continue; - } - else if (res == -1) - perror_with_name (("sigaction")); - } - - res = gdb_sigmask (SIG_SETMASK, &original_signal_mask, NULL); - if (res == -1) - perror_with_name (("sigprocmask")); -#endif -} diff --git a/gdb/gdbsupport/signals-state-save-restore.h b/gdb/gdbsupport/signals-state-save-restore.h deleted file mode 100644 index 8726bf1..0000000 --- a/gdb/gdbsupport/signals-state-save-restore.h +++ /dev/null @@ -1,40 +0,0 @@ -/* Copyright (C) 2016-2020 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 COMMON_SIGNALS_STATE_SAVE_RESTORE_H -#define COMMON_SIGNALS_STATE_SAVE_RESTORE_H - -/* Save/restore the signal actions of all signals, and the signal - mask. - - Since the exec family of functions does not reset the signal - disposition of signals set to SIG_IGN, nor does it reset the signal - mask, in order to be transparent, when spawning new child processes - to debug (with "run", etc.), we must reset signal actions and mask - back to what was originally inherited from gdb/gdbserver's parent, - just before execing the target program to debug. */ - -/* Save the signal state of all signals. If !QUIET, warn if we detect - a custom signal handler preinstalled. */ - -extern void save_original_signals_state (bool quiet); - -/* Restore the signal state of all signals. */ - -extern void restore_original_signals_state (void); - -#endif /* COMMON_SIGNALS_STATE_SAVE_RESTORE_H */ diff --git a/gdb/gdbsupport/signals.c b/gdb/gdbsupport/signals.c deleted file mode 100644 index 485e0f0..0000000 --- a/gdb/gdbsupport/signals.c +++ /dev/null @@ -1,653 +0,0 @@ -/* Target signal translation functions for GDB. - Copyright (C) 1990-2020 Free Software Foundation, Inc. - Contributed by Cygnus Support. - - 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 "common-defs.h" - -#ifdef HAVE_SIGNAL_H -#include <signal.h> -#endif - -#include "gdb_signals.h" - -struct gdbarch; - -/* Always use __SIGRTMIN if it's available. SIGRTMIN is the lowest - _available_ realtime signal, not the lowest supported; glibc takes - several for its own use. */ - -#ifndef REALTIME_LO -# if defined(__SIGRTMIN) -# define REALTIME_LO __SIGRTMIN -# define REALTIME_HI (__SIGRTMAX + 1) -# elif defined(SIGRTMIN) -# define REALTIME_LO SIGRTMIN -# define REALTIME_HI (SIGRTMAX + 1) -# endif -#endif - -/* This table must match in order and size the signals in enum - gdb_signal. */ - -static const struct { - const char *symbol; - const char *name; - const char *string; - } signals [] = -{ -#define SET(symbol, constant, name, string) { #symbol, name, string }, -#include "gdb/signals.def" -#undef SET -}; - -const char * -gdb_signal_to_symbol_string (enum gdb_signal sig) -{ - gdb_assert ((int) sig >= GDB_SIGNAL_FIRST && (int) sig <= GDB_SIGNAL_LAST); - - return signals[sig].symbol; -} - -/* Return the string for a signal. */ -const char * -gdb_signal_to_string (enum gdb_signal sig) -{ - if ((int) sig >= GDB_SIGNAL_FIRST && (int) sig <= GDB_SIGNAL_LAST) - return signals[sig].string; - else - return signals[GDB_SIGNAL_UNKNOWN].string; -} - -/* Return the name for a signal. */ -const char * -gdb_signal_to_name (enum gdb_signal sig) -{ - if ((int) sig >= GDB_SIGNAL_FIRST && (int) sig <= GDB_SIGNAL_LAST - && signals[sig].name != NULL) - return signals[sig].name; - else - /* I think the code which prints this will always print it along - with the string, so no need to be verbose (very old comment). */ - return "?"; -} - -/* Given a name, return its signal. */ -enum gdb_signal -gdb_signal_from_name (const char *name) -{ - enum gdb_signal sig; - - /* It's possible we also should allow "SIGCLD" as well as "SIGCHLD" - for GDB_SIGNAL_SIGCHLD. SIGIOT, on the other hand, is more - questionable; seems like by now people should call it SIGABRT - instead. */ - - /* This ugly cast brought to you by the native VAX compiler. */ - for (sig = GDB_SIGNAL_HUP; - sig < GDB_SIGNAL_LAST; - sig = (enum gdb_signal) ((int) sig + 1)) - if (signals[sig].name != NULL - && strcmp (name, signals[sig].name) == 0) - return sig; - return GDB_SIGNAL_UNKNOWN; -} - -/* The following functions are to help certain targets deal - with the signal/waitstatus stuff. They could just as well be in - a file called native-utils.c or unixwaitstatus-utils.c or whatever. */ - -/* Convert host signal to our signals. */ -enum gdb_signal -gdb_signal_from_host (int hostsig) -{ - /* A switch statement would make sense but would require special - kludges to deal with the cases where more than one signal has the - same number. Signals are ordered ANSI-standard signals first, - other signals second, with signals in each block ordered by their - numerical values on a typical POSIX platform. */ - - if (hostsig == 0) - return GDB_SIGNAL_0; - - /* SIGINT, SIGILL, SIGABRT, SIGFPE, SIGSEGV and SIGTERM - are ANSI-standard signals and are always available. */ - if (hostsig == SIGINT) - return GDB_SIGNAL_INT; - if (hostsig == SIGILL) - return GDB_SIGNAL_ILL; - if (hostsig == SIGABRT) - return GDB_SIGNAL_ABRT; - if (hostsig == SIGFPE) - return GDB_SIGNAL_FPE; - if (hostsig == SIGSEGV) - return GDB_SIGNAL_SEGV; - if (hostsig == SIGTERM) - return GDB_SIGNAL_TERM; - - /* All other signals need preprocessor conditionals. */ -#if defined (SIGHUP) - if (hostsig == SIGHUP) - return GDB_SIGNAL_HUP; -#endif -#if defined (SIGQUIT) - if (hostsig == SIGQUIT) - return GDB_SIGNAL_QUIT; -#endif -#if defined (SIGTRAP) - if (hostsig == SIGTRAP) - return GDB_SIGNAL_TRAP; -#endif -#if defined (SIGEMT) - if (hostsig == SIGEMT) - return GDB_SIGNAL_EMT; -#endif -#if defined (SIGKILL) - if (hostsig == SIGKILL) - return GDB_SIGNAL_KILL; -#endif -#if defined (SIGBUS) - if (hostsig == SIGBUS) - return GDB_SIGNAL_BUS; -#endif -#if defined (SIGSYS) - if (hostsig == SIGSYS) - return GDB_SIGNAL_SYS; -#endif -#if defined (SIGPIPE) - if (hostsig == SIGPIPE) - return GDB_SIGNAL_PIPE; -#endif -#if defined (SIGALRM) - if (hostsig == SIGALRM) - return GDB_SIGNAL_ALRM; -#endif -#if defined (SIGUSR1) - if (hostsig == SIGUSR1) - return GDB_SIGNAL_USR1; -#endif -#if defined (SIGUSR2) - if (hostsig == SIGUSR2) - return GDB_SIGNAL_USR2; -#endif -#if defined (SIGCLD) - if (hostsig == SIGCLD) - return GDB_SIGNAL_CHLD; -#endif -#if defined (SIGCHLD) - if (hostsig == SIGCHLD) - return GDB_SIGNAL_CHLD; -#endif -#if defined (SIGPWR) - if (hostsig == SIGPWR) - return GDB_SIGNAL_PWR; -#endif -#if defined (SIGWINCH) - if (hostsig == SIGWINCH) - return GDB_SIGNAL_WINCH; -#endif -#if defined (SIGURG) - if (hostsig == SIGURG) - return GDB_SIGNAL_URG; -#endif -#if defined (SIGIO) - if (hostsig == SIGIO) - return GDB_SIGNAL_IO; -#endif -#if defined (SIGPOLL) - if (hostsig == SIGPOLL) - return GDB_SIGNAL_POLL; -#endif -#if defined (SIGSTOP) - if (hostsig == SIGSTOP) - return GDB_SIGNAL_STOP; -#endif -#if defined (SIGTSTP) - if (hostsig == SIGTSTP) - return GDB_SIGNAL_TSTP; -#endif -#if defined (SIGCONT) - if (hostsig == SIGCONT) - return GDB_SIGNAL_CONT; -#endif -#if defined (SIGTTIN) - if (hostsig == SIGTTIN) - return GDB_SIGNAL_TTIN; -#endif -#if defined (SIGTTOU) - if (hostsig == SIGTTOU) - return GDB_SIGNAL_TTOU; -#endif -#if defined (SIGVTALRM) - if (hostsig == SIGVTALRM) - return GDB_SIGNAL_VTALRM; -#endif -#if defined (SIGPROF) - if (hostsig == SIGPROF) - return GDB_SIGNAL_PROF; -#endif -#if defined (SIGXCPU) - if (hostsig == SIGXCPU) - return GDB_SIGNAL_XCPU; -#endif -#if defined (SIGXFSZ) - if (hostsig == SIGXFSZ) - return GDB_SIGNAL_XFSZ; -#endif -#if defined (SIGWIND) - if (hostsig == SIGWIND) - return GDB_SIGNAL_WIND; -#endif -#if defined (SIGPHONE) - if (hostsig == SIGPHONE) - return GDB_SIGNAL_PHONE; -#endif -#if defined (SIGLOST) - if (hostsig == SIGLOST) - return GDB_SIGNAL_LOST; -#endif -#if defined (SIGWAITING) - if (hostsig == SIGWAITING) - return GDB_SIGNAL_WAITING; -#endif -#if defined (SIGCANCEL) - if (hostsig == SIGCANCEL) - return GDB_SIGNAL_CANCEL; -#endif -#if defined (SIGLWP) - if (hostsig == SIGLWP) - return GDB_SIGNAL_LWP; -#endif -#if defined (SIGDANGER) - if (hostsig == SIGDANGER) - return GDB_SIGNAL_DANGER; -#endif -#if defined (SIGGRANT) - if (hostsig == SIGGRANT) - return GDB_SIGNAL_GRANT; -#endif -#if defined (SIGRETRACT) - if (hostsig == SIGRETRACT) - return GDB_SIGNAL_RETRACT; -#endif -#if defined (SIGMSG) - if (hostsig == SIGMSG) - return GDB_SIGNAL_MSG; -#endif -#if defined (SIGSOUND) - if (hostsig == SIGSOUND) - return GDB_SIGNAL_SOUND; -#endif -#if defined (SIGSAK) - if (hostsig == SIGSAK) - return GDB_SIGNAL_SAK; -#endif -#if defined (SIGPRIO) - if (hostsig == SIGPRIO) - return GDB_SIGNAL_PRIO; -#endif - - /* Mach exceptions. Assumes that the values for EXC_ are positive! */ -#if defined (EXC_BAD_ACCESS) && defined (_NSIG) - if (hostsig == _NSIG + EXC_BAD_ACCESS) - return GDB_EXC_BAD_ACCESS; -#endif -#if defined (EXC_BAD_INSTRUCTION) && defined (_NSIG) - if (hostsig == _NSIG + EXC_BAD_INSTRUCTION) - return GDB_EXC_BAD_INSTRUCTION; -#endif -#if defined (EXC_ARITHMETIC) && defined (_NSIG) - if (hostsig == _NSIG + EXC_ARITHMETIC) - return GDB_EXC_ARITHMETIC; -#endif -#if defined (EXC_EMULATION) && defined (_NSIG) - if (hostsig == _NSIG + EXC_EMULATION) - return GDB_EXC_EMULATION; -#endif -#if defined (EXC_SOFTWARE) && defined (_NSIG) - if (hostsig == _NSIG + EXC_SOFTWARE) - return GDB_EXC_SOFTWARE; -#endif -#if defined (EXC_BREAKPOINT) && defined (_NSIG) - if (hostsig == _NSIG + EXC_BREAKPOINT) - return GDB_EXC_BREAKPOINT; -#endif - -#if defined (SIGINFO) - if (hostsig == SIGINFO) - return GDB_SIGNAL_INFO; -#endif -#if defined (SIGLIBRT) - if (hostsig == SIGLIBRT) - return GDB_SIGNAL_LIBRT; -#endif - -#if defined (REALTIME_LO) - if (hostsig >= REALTIME_LO && hostsig < REALTIME_HI) - { - /* This block of GDB_SIGNAL_REALTIME value is in order. */ - if (33 <= hostsig && hostsig <= 63) - return (enum gdb_signal) - (hostsig - 33 + (int) GDB_SIGNAL_REALTIME_33); - else if (hostsig == 32) - return GDB_SIGNAL_REALTIME_32; - else if (64 <= hostsig && hostsig <= 127) - return (enum gdb_signal) - (hostsig - 64 + (int) GDB_SIGNAL_REALTIME_64); - else - error (_("GDB bug: target.c (gdb_signal_from_host): " - "unrecognized real-time signal")); - } -#endif - - return GDB_SIGNAL_UNKNOWN; -} - -/* Convert a OURSIG (an enum gdb_signal) to the form used by the - target operating system (refered to as the ``host'') or zero if the - equivalent host signal is not available. Set/clear OURSIG_OK - accordingly. */ - -static int -do_gdb_signal_to_host (enum gdb_signal oursig, - int *oursig_ok) -{ - int retsig; - /* Silence the 'not used' warning, for targets that - do not support signals. */ - (void) retsig; - - /* Signals are ordered ANSI-standard signals first, other signals - second, with signals in each block ordered by their numerical - values on a typical POSIX platform. */ - - *oursig_ok = 1; - switch (oursig) - { - case GDB_SIGNAL_0: - return 0; - - /* SIGINT, SIGILL, SIGABRT, SIGFPE, SIGSEGV and SIGTERM - are ANSI-standard signals and are always available. */ - case GDB_SIGNAL_INT: - return SIGINT; - case GDB_SIGNAL_ILL: - return SIGILL; - case GDB_SIGNAL_ABRT: - return SIGABRT; - case GDB_SIGNAL_FPE: - return SIGFPE; - case GDB_SIGNAL_SEGV: - return SIGSEGV; - case GDB_SIGNAL_TERM: - return SIGTERM; - - /* All other signals need preprocessor conditionals. */ -#if defined (SIGHUP) - case GDB_SIGNAL_HUP: - return SIGHUP; -#endif -#if defined (SIGQUIT) - case GDB_SIGNAL_QUIT: - return SIGQUIT; -#endif -#if defined (SIGTRAP) - case GDB_SIGNAL_TRAP: - return SIGTRAP; -#endif -#if defined (SIGEMT) - case GDB_SIGNAL_EMT: - return SIGEMT; -#endif -#if defined (SIGKILL) - case GDB_SIGNAL_KILL: - return SIGKILL; -#endif -#if defined (SIGBUS) - case GDB_SIGNAL_BUS: - return SIGBUS; -#endif -#if defined (SIGSYS) - case GDB_SIGNAL_SYS: - return SIGSYS; -#endif -#if defined (SIGPIPE) - case GDB_SIGNAL_PIPE: - return SIGPIPE; -#endif -#if defined (SIGALRM) - case GDB_SIGNAL_ALRM: - return SIGALRM; -#endif -#if defined (SIGUSR1) - case GDB_SIGNAL_USR1: - return SIGUSR1; -#endif -#if defined (SIGUSR2) - case GDB_SIGNAL_USR2: - return SIGUSR2; -#endif -#if defined (SIGCHLD) || defined (SIGCLD) - case GDB_SIGNAL_CHLD: -#if defined (SIGCHLD) - return SIGCHLD; -#else - return SIGCLD; -#endif -#endif /* SIGCLD or SIGCHLD */ -#if defined (SIGPWR) - case GDB_SIGNAL_PWR: - return SIGPWR; -#endif -#if defined (SIGWINCH) - case GDB_SIGNAL_WINCH: - return SIGWINCH; -#endif -#if defined (SIGURG) - case GDB_SIGNAL_URG: - return SIGURG; -#endif -#if defined (SIGIO) - case GDB_SIGNAL_IO: - return SIGIO; -#endif -#if defined (SIGPOLL) - case GDB_SIGNAL_POLL: - return SIGPOLL; -#endif -#if defined (SIGSTOP) - case GDB_SIGNAL_STOP: - return SIGSTOP; -#endif -#if defined (SIGTSTP) - case GDB_SIGNAL_TSTP: - return SIGTSTP; -#endif -#if defined (SIGCONT) - case GDB_SIGNAL_CONT: - return SIGCONT; -#endif -#if defined (SIGTTIN) - case GDB_SIGNAL_TTIN: - return SIGTTIN; -#endif -#if defined (SIGTTOU) - case GDB_SIGNAL_TTOU: - return SIGTTOU; -#endif -#if defined (SIGVTALRM) - case GDB_SIGNAL_VTALRM: - return SIGVTALRM; -#endif -#if defined (SIGPROF) - case GDB_SIGNAL_PROF: - return SIGPROF; -#endif -#if defined (SIGXCPU) - case GDB_SIGNAL_XCPU: - return SIGXCPU; -#endif -#if defined (SIGXFSZ) - case GDB_SIGNAL_XFSZ: - return SIGXFSZ; -#endif -#if defined (SIGWIND) - case GDB_SIGNAL_WIND: - return SIGWIND; -#endif -#if defined (SIGPHONE) - case GDB_SIGNAL_PHONE: - return SIGPHONE; -#endif -#if defined (SIGLOST) - case GDB_SIGNAL_LOST: - return SIGLOST; -#endif -#if defined (SIGWAITING) - case GDB_SIGNAL_WAITING: - return SIGWAITING; -#endif -#if defined (SIGCANCEL) - case GDB_SIGNAL_CANCEL: - return SIGCANCEL; -#endif -#if defined (SIGLWP) - case GDB_SIGNAL_LWP: - return SIGLWP; -#endif -#if defined (SIGDANGER) - case GDB_SIGNAL_DANGER: - return SIGDANGER; -#endif -#if defined (SIGGRANT) - case GDB_SIGNAL_GRANT: - return SIGGRANT; -#endif -#if defined (SIGRETRACT) - case GDB_SIGNAL_RETRACT: - return SIGRETRACT; -#endif -#if defined (SIGMSG) - case GDB_SIGNAL_MSG: - return SIGMSG; -#endif -#if defined (SIGSOUND) - case GDB_SIGNAL_SOUND: - return SIGSOUND; -#endif -#if defined (SIGSAK) - case GDB_SIGNAL_SAK: - return SIGSAK; -#endif -#if defined (SIGPRIO) - case GDB_SIGNAL_PRIO: - return SIGPRIO; -#endif - - /* Mach exceptions. Assumes that the values for EXC_ are positive! */ -#if defined (EXC_BAD_ACCESS) && defined (_NSIG) - case GDB_EXC_BAD_ACCESS: - return _NSIG + EXC_BAD_ACCESS; -#endif -#if defined (EXC_BAD_INSTRUCTION) && defined (_NSIG) - case GDB_EXC_BAD_INSTRUCTION: - return _NSIG + EXC_BAD_INSTRUCTION; -#endif -#if defined (EXC_ARITHMETIC) && defined (_NSIG) - case GDB_EXC_ARITHMETIC: - return _NSIG + EXC_ARITHMETIC; -#endif -#if defined (EXC_EMULATION) && defined (_NSIG) - case GDB_EXC_EMULATION: - return _NSIG + EXC_EMULATION; -#endif -#if defined (EXC_SOFTWARE) && defined (_NSIG) - case GDB_EXC_SOFTWARE: - return _NSIG + EXC_SOFTWARE; -#endif -#if defined (EXC_BREAKPOINT) && defined (_NSIG) - case GDB_EXC_BREAKPOINT: - return _NSIG + EXC_BREAKPOINT; -#endif - -#if defined (SIGINFO) - case GDB_SIGNAL_INFO: - return SIGINFO; -#endif -#if defined (SIGLIBRT) - case GDB_SIGNAL_LIBRT: - return SIGLIBRT; -#endif - - default: -#if defined (REALTIME_LO) - retsig = 0; - - if (oursig >= GDB_SIGNAL_REALTIME_33 - && oursig <= GDB_SIGNAL_REALTIME_63) - { - /* This block of signals is continuous, and - GDB_SIGNAL_REALTIME_33 is 33 by definition. */ - retsig = (int) oursig - (int) GDB_SIGNAL_REALTIME_33 + 33; - } - else if (oursig == GDB_SIGNAL_REALTIME_32) - { - /* GDB_SIGNAL_REALTIME_32 isn't contiguous with - GDB_SIGNAL_REALTIME_33. It is 32 by definition. */ - retsig = 32; - } - else if (oursig >= GDB_SIGNAL_REALTIME_64 - && oursig <= GDB_SIGNAL_REALTIME_127) - { - /* This block of signals is continuous, and - GDB_SIGNAL_REALTIME_64 is 64 by definition. */ - retsig = (int) oursig - (int) GDB_SIGNAL_REALTIME_64 + 64; - } - - if (retsig >= REALTIME_LO && retsig < REALTIME_HI) - return retsig; -#endif - - *oursig_ok = 0; - return 0; - } -} - -int -gdb_signal_to_host_p (enum gdb_signal oursig) -{ - int oursig_ok; - do_gdb_signal_to_host (oursig, &oursig_ok); - return oursig_ok; -} - -int -gdb_signal_to_host (enum gdb_signal oursig) -{ - int oursig_ok; - int targ_signo = do_gdb_signal_to_host (oursig, &oursig_ok); - if (!oursig_ok) - { - /* The user might be trying to do "signal SIGSAK" where this system - doesn't have SIGSAK. */ - warning (_("Signal %s does not exist on this system."), - gdb_signal_to_name (oursig)); - return 0; - } - else - return targ_signo; -} diff --git a/gdb/gdbsupport/symbol.h b/gdb/gdbsupport/symbol.h deleted file mode 100644 index 3cc3adf..0000000 --- a/gdb/gdbsupport/symbol.h +++ /dev/null @@ -1,37 +0,0 @@ -/* Declarations of common symbol functions. - - Copyright (C) 2014-2020 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 COMMON_SYMBOL_H -#define COMMON_SYMBOL_H - -struct objfile; - -/* Find a symbol that matches NAME. Limit the search to OBJFILE if - OBJFILE is non-NULL and the implementation supports limiting the - search to specific object files. NAME may be mangled or demangled. - If a match is found, store the matching symbol's address in ADDR - and return zero. Returns nonzero if no symbol matching NAME is - found. Raise an exception if OBJFILE is non-NULL and the - implementation does not support limiting searches to specific - object files. This function must be provided by the client. */ - -extern int find_minimal_symbol_address (const char *name, CORE_ADDR *addr, - struct objfile *objfile); - -#endif /* COMMON_SYMBOL_H */ diff --git a/gdb/gdbsupport/tdesc.c b/gdb/gdbsupport/tdesc.c deleted file mode 100644 index aaea8e0..0000000 --- a/gdb/gdbsupport/tdesc.c +++ /dev/null @@ -1,401 +0,0 @@ -/* Target description support for GDB. - - Copyright (C) 2018-2020 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 "common-defs.h" -#include "gdbsupport/tdesc.h" - -tdesc_reg::tdesc_reg (struct tdesc_feature *feature, const std::string &name_, - int regnum, int save_restore_, const char *group_, - int bitsize_, const char *type_) - : name (name_), target_regnum (regnum), - save_restore (save_restore_), - group (group_ != NULL ? group_ : ""), - bitsize (bitsize_), - type (type_ != NULL ? type_ : "<unknown>") -{ - /* If the register's type is target-defined, look it up now. We may not - have easy access to the containing feature when we want it later. */ - tdesc_type = tdesc_named_type (feature, type.c_str ()); -} - -/* Predefined types. */ -static tdesc_type_builtin tdesc_predefined_types[] = -{ - { "bool", TDESC_TYPE_BOOL }, - { "int8", TDESC_TYPE_INT8 }, - { "int16", TDESC_TYPE_INT16 }, - { "int32", TDESC_TYPE_INT32 }, - { "int64", TDESC_TYPE_INT64 }, - { "int128", TDESC_TYPE_INT128 }, - { "uint8", TDESC_TYPE_UINT8 }, - { "uint16", TDESC_TYPE_UINT16 }, - { "uint32", TDESC_TYPE_UINT32 }, - { "uint64", TDESC_TYPE_UINT64 }, - { "uint128", TDESC_TYPE_UINT128 }, - { "code_ptr", TDESC_TYPE_CODE_PTR }, - { "data_ptr", TDESC_TYPE_DATA_PTR }, - { "ieee_half", TDESC_TYPE_IEEE_HALF }, - { "ieee_single", TDESC_TYPE_IEEE_SINGLE }, - { "ieee_double", TDESC_TYPE_IEEE_DOUBLE }, - { "arm_fpa_ext", TDESC_TYPE_ARM_FPA_EXT }, - { "i387_ext", TDESC_TYPE_I387_EXT } -}; - -void tdesc_feature::accept (tdesc_element_visitor &v) const -{ - v.visit_pre (this); - - for (const tdesc_type_up &type : types) - type->accept (v); - - for (const tdesc_reg_up ® : registers) - reg->accept (v); - - v.visit_post (this); -} - -bool tdesc_feature::operator== (const tdesc_feature &other) const -{ - if (name != other.name) - return false; - - if (registers.size () != other.registers.size ()) - return false; - - for (int ix = 0; ix < registers.size (); ix++) - { - const tdesc_reg_up ®1 = registers[ix]; - const tdesc_reg_up ®2 = other.registers[ix]; - - if (reg1 != reg2 && *reg1 != *reg2) - return false; - } - - if (types.size () != other.types.size ()) - return false; - - for (int ix = 0; ix < types.size (); ix++) - { - const tdesc_type_up &type1 = types[ix]; - const tdesc_type_up &type2 = other.types[ix]; - - if (type1 != type2 && *type1 != *type2) - return false; - } - - return true; -} - -/* Lookup a predefined type. */ - -static struct tdesc_type * -tdesc_predefined_type (enum tdesc_type_kind kind) -{ - for (int ix = 0; ix < ARRAY_SIZE (tdesc_predefined_types); ix++) - if (tdesc_predefined_types[ix].kind == kind) - return &tdesc_predefined_types[ix]; - - gdb_assert_not_reached ("bad predefined tdesc type"); -} - -/* See gdbsupport/tdesc.h. */ - -struct tdesc_type * -tdesc_named_type (const struct tdesc_feature *feature, const char *id) -{ - /* First try target-defined types. */ - for (const tdesc_type_up &type : feature->types) - if (type->name == id) - return type.get (); - - /* Next try the predefined types. */ - for (int ix = 0; ix < ARRAY_SIZE (tdesc_predefined_types); ix++) - if (tdesc_predefined_types[ix].name == id) - return &tdesc_predefined_types[ix]; - - return NULL; -} - -/* See gdbsupport/tdesc.h. */ - -void -tdesc_create_reg (struct tdesc_feature *feature, const char *name, - int regnum, int save_restore, const char *group, - int bitsize, const char *type) -{ - tdesc_reg *reg = new tdesc_reg (feature, name, regnum, save_restore, - group, bitsize, type); - - feature->registers.emplace_back (reg); -} - -/* See gdbsupport/tdesc.h. */ - -struct tdesc_type * -tdesc_create_vector (struct tdesc_feature *feature, const char *name, - struct tdesc_type *field_type, int count) -{ - tdesc_type_vector *type = new tdesc_type_vector (name, field_type, count); - feature->types.emplace_back (type); - - return type; -} - -/* See gdbsupport/tdesc.h. */ - -tdesc_type_with_fields * -tdesc_create_struct (struct tdesc_feature *feature, const char *name) -{ - tdesc_type_with_fields *type - = new tdesc_type_with_fields (name, TDESC_TYPE_STRUCT); - feature->types.emplace_back (type); - - return type; -} - -/* See gdbsupport/tdesc.h. */ - -void -tdesc_set_struct_size (tdesc_type_with_fields *type, int size) -{ - gdb_assert (type->kind == TDESC_TYPE_STRUCT); - gdb_assert (size > 0); - type->size = size; -} - -/* See gdbsupport/tdesc.h. */ - -tdesc_type_with_fields * -tdesc_create_union (struct tdesc_feature *feature, const char *name) -{ - tdesc_type_with_fields *type - = new tdesc_type_with_fields (name, TDESC_TYPE_UNION); - feature->types.emplace_back (type); - - return type; -} - -/* See gdbsupport/tdesc.h. */ - -tdesc_type_with_fields * -tdesc_create_flags (struct tdesc_feature *feature, const char *name, - int size) -{ - gdb_assert (size > 0); - - tdesc_type_with_fields *type - = new tdesc_type_with_fields (name, TDESC_TYPE_FLAGS, size); - feature->types.emplace_back (type); - - return type; -} - -/* See gdbsupport/tdesc.h. */ - -tdesc_type_with_fields * -tdesc_create_enum (struct tdesc_feature *feature, const char *name, - int size) -{ - gdb_assert (size > 0); - - tdesc_type_with_fields *type - = new tdesc_type_with_fields (name, TDESC_TYPE_ENUM, size); - feature->types.emplace_back (type); - - return type; -} - -/* See gdbsupport/tdesc.h. */ - -void -tdesc_add_field (tdesc_type_with_fields *type, const char *field_name, - struct tdesc_type *field_type) -{ - gdb_assert (type->kind == TDESC_TYPE_UNION - || type->kind == TDESC_TYPE_STRUCT); - - /* Initialize start and end so we know this is not a bit-field - when we print-c-tdesc. */ - type->fields.emplace_back (field_name, field_type, -1, -1); -} - -/* See gdbsupport/tdesc.h. */ - -void -tdesc_add_typed_bitfield (tdesc_type_with_fields *type, const char *field_name, - int start, int end, struct tdesc_type *field_type) -{ - gdb_assert (type->kind == TDESC_TYPE_STRUCT - || type->kind == TDESC_TYPE_FLAGS); - gdb_assert (start >= 0 && end >= start); - - type->fields.emplace_back (field_name, field_type, start, end); -} - -/* See gdbsupport/tdesc.h. */ - -void -tdesc_add_bitfield (tdesc_type_with_fields *type, const char *field_name, - int start, int end) -{ - struct tdesc_type *field_type; - - gdb_assert (start >= 0 && end >= start); - - if (type->size > 4) - field_type = tdesc_predefined_type (TDESC_TYPE_UINT64); - else - field_type = tdesc_predefined_type (TDESC_TYPE_UINT32); - - tdesc_add_typed_bitfield (type, field_name, start, end, field_type); -} - -/* See gdbsupport/tdesc.h. */ - -void -tdesc_add_flag (tdesc_type_with_fields *type, int start, - const char *flag_name) -{ - gdb_assert (type->kind == TDESC_TYPE_FLAGS - || type->kind == TDESC_TYPE_STRUCT); - - type->fields.emplace_back (flag_name, - tdesc_predefined_type (TDESC_TYPE_BOOL), - start, start); -} - -/* See gdbsupport/tdesc.h. */ - -void -tdesc_add_enum_value (tdesc_type_with_fields *type, int value, - const char *name) -{ - gdb_assert (type->kind == TDESC_TYPE_ENUM); - type->fields.emplace_back (name, - tdesc_predefined_type (TDESC_TYPE_INT32), - value, -1); -} - -void print_xml_feature::visit_pre (const tdesc_feature *e) -{ - string_appendf (*m_buffer, "<feature name=\"%s\">\n", e->name.c_str ()); -} - -void print_xml_feature::visit_post (const tdesc_feature *e) -{ - string_appendf (*m_buffer, "</feature>\n"); -} - -void print_xml_feature::visit (const tdesc_type_builtin *t) -{ - error (_("xml output is not supported for type \"%s\"."), t->name.c_str ()); -} - -void print_xml_feature::visit (const tdesc_type_vector *t) -{ - string_appendf (*m_buffer, "<vector id=\"%s\" type=\"%s\" count=\"%d\"/>\n", - t->name.c_str (), t->element_type->name.c_str (), t->count); -} - -void print_xml_feature::visit (const tdesc_type_with_fields *t) -{ - const static char *types[] = { "struct", "union", "flags", "enum" }; - - gdb_assert (t->kind >= TDESC_TYPE_STRUCT && t->kind <= TDESC_TYPE_ENUM); - - string_appendf (*m_buffer, - "<%s id=\"%s\"", types[t->kind - TDESC_TYPE_STRUCT], - t->name.c_str ()); - - switch (t->kind) - { - case TDESC_TYPE_STRUCT: - case TDESC_TYPE_FLAGS: - if (t->size > 0) - string_appendf (*m_buffer, " size=\"%d\"", t->size); - string_appendf (*m_buffer, ">\n"); - - for (const tdesc_type_field &f : t->fields) - { - string_appendf (*m_buffer, " <field name=\"%s\" ", f.name.c_str ()); - if (f.start == -1) - string_appendf (*m_buffer, "type=\"%s\"/>\n", - f.type->name.c_str ()); - else - string_appendf (*m_buffer, "start=\"%d\" end=\"%d\"/>\n", f.start, - f.end); - } - break; - - case TDESC_TYPE_ENUM: - string_appendf (*m_buffer, ">\n"); - for (const tdesc_type_field &f : t->fields) - string_appendf (*m_buffer, " <field name=\"%s\" start=\"%d\"/>\n", - f.name.c_str (), f.start); - break; - - case TDESC_TYPE_UNION: - string_appendf (*m_buffer, ">\n"); - for (const tdesc_type_field &f : t->fields) - string_appendf (*m_buffer, " <field name=\"%s\" type=\"%s\"/>\n", - f.name.c_str (), f.type->name.c_str ()); - break; - - default: - error (_("xml output is not supported for type \"%s\"."), - t->name.c_str ()); - } - - string_appendf (*m_buffer, "</%s>\n", types[t->kind - TDESC_TYPE_STRUCT]); -} - -void print_xml_feature::visit (const tdesc_reg *r) -{ - string_appendf (*m_buffer, - "<reg name=\"%s\" bitsize=\"%d\" type=\"%s\" regnum=\"%ld\"", - r->name.c_str (), r->bitsize, r->type.c_str (), - r->target_regnum); - - if (r->group.length () > 0) - string_appendf (*m_buffer, " group=\"%s\"", r->group.c_str ()); - - if (r->save_restore == 0) - string_appendf (*m_buffer, " save-restore=\"no\""); - - string_appendf (*m_buffer, "/>\n"); -} - -void print_xml_feature::visit_pre (const target_desc *e) -{ -#ifndef IN_PROCESS_AGENT - string_appendf (*m_buffer, "<?xml version=\"1.0\"?>\n"); - string_appendf (*m_buffer, "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">\n"); - string_appendf (*m_buffer, "<target>\n<architecture>%s</architecture>\n", - tdesc_architecture_name (e)); - - const char *osabi = tdesc_osabi_name (e); - if (osabi != nullptr) - string_appendf (*m_buffer, "<osabi>%s</osabi>", osabi); -#endif -} - -void print_xml_feature::visit_post (const target_desc *e) -{ - string_appendf (*m_buffer, "</target>\n"); -} diff --git a/gdb/gdbsupport/tdesc.h b/gdb/gdbsupport/tdesc.h deleted file mode 100644 index 3b1f1f5..0000000 --- a/gdb/gdbsupport/tdesc.h +++ /dev/null @@ -1,408 +0,0 @@ -/* Copyright (C) 2006-2020 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 COMMON_TDESC_H -#define COMMON_TDESC_H - -struct tdesc_feature; -struct tdesc_type; -struct tdesc_type_builtin; -struct tdesc_type_vector; -struct tdesc_type_with_fields; -struct tdesc_reg; -struct target_desc; - -/* The interface to visit different elements of target description. */ - -class tdesc_element_visitor -{ -public: - virtual void visit_pre (const target_desc *e) - {} - - virtual void visit_post (const target_desc *e) - {} - - virtual void visit_pre (const tdesc_feature *e) - {} - - virtual void visit_post (const tdesc_feature *e) - {} - - virtual void visit (const tdesc_type_builtin *e) - {} - - virtual void visit (const tdesc_type_vector *e) - {} - - virtual void visit (const tdesc_type_with_fields *e) - {} - - virtual void visit (const tdesc_reg *e) - {} -}; - -class tdesc_element -{ -public: - virtual void accept (tdesc_element_visitor &v) const = 0; -}; - -/* An individual register from a target description. */ - -struct tdesc_reg : tdesc_element -{ - tdesc_reg (struct tdesc_feature *feature, const std::string &name_, - int regnum, int save_restore_, const char *group_, - int bitsize_, const char *type_); - - virtual ~tdesc_reg () = default; - - DISABLE_COPY_AND_ASSIGN (tdesc_reg); - - /* The name of this register. In standard features, it may be - recognized by the architecture support code, or it may be purely - for the user. */ - std::string name; - - /* The register number used by this target to refer to this - register. This is used for remote p/P packets and to determine - the ordering of registers in the remote g/G packets. */ - long target_regnum; - - /* If this flag is set, GDB should save and restore this register - around calls to an inferior function. */ - int save_restore; - - /* The name of the register group containing this register, or empty - if the group should be automatically determined from the - register's type. If this is "general", "float", or "vector", the - corresponding "info" command should display this register's - value. It can be an arbitrary string, but should be limited to - alphanumeric characters and internal hyphens. Currently other - strings are ignored (treated as empty). */ - std::string group; - - /* The size of the register, in bits. */ - int bitsize; - - /* The type of the register. This string corresponds to either - a named type from the target description or a predefined - type from GDB. */ - std::string type; - - /* The target-described type corresponding to TYPE, if found. */ - struct tdesc_type *tdesc_type; - - void accept (tdesc_element_visitor &v) const override - { - v.visit (this); - } - - bool operator== (const tdesc_reg &other) const - { - return (name == other.name - && target_regnum == other.target_regnum - && save_restore == other.save_restore - && bitsize == other.bitsize - && group == other.group - && type == other.type); - } - - bool operator!= (const tdesc_reg &other) const - { - return !(*this == other); - } -}; - -typedef std::unique_ptr<tdesc_reg> tdesc_reg_up; - -enum tdesc_type_kind -{ - /* Predefined types. */ - TDESC_TYPE_BOOL, - TDESC_TYPE_INT8, - TDESC_TYPE_INT16, - TDESC_TYPE_INT32, - TDESC_TYPE_INT64, - TDESC_TYPE_INT128, - TDESC_TYPE_UINT8, - TDESC_TYPE_UINT16, - TDESC_TYPE_UINT32, - TDESC_TYPE_UINT64, - TDESC_TYPE_UINT128, - TDESC_TYPE_CODE_PTR, - TDESC_TYPE_DATA_PTR, - TDESC_TYPE_IEEE_HALF, - TDESC_TYPE_IEEE_SINGLE, - TDESC_TYPE_IEEE_DOUBLE, - TDESC_TYPE_ARM_FPA_EXT, - TDESC_TYPE_I387_EXT, - - /* Types defined by a target feature. */ - TDESC_TYPE_VECTOR, - TDESC_TYPE_STRUCT, - TDESC_TYPE_UNION, - TDESC_TYPE_FLAGS, - TDESC_TYPE_ENUM -}; - -struct tdesc_type : tdesc_element -{ - tdesc_type (const std::string &name_, enum tdesc_type_kind kind_) - : name (name_), kind (kind_) - {} - - virtual ~tdesc_type () = default; - - DISABLE_COPY_AND_ASSIGN (tdesc_type); - - /* The name of this type. */ - std::string name; - - /* Identify the kind of this type. */ - enum tdesc_type_kind kind; - - bool operator== (const tdesc_type &other) const - { - return name == other.name && kind == other.kind; - } - - bool operator!= (const tdesc_type &other) const - { - return !(*this == other); - } -}; - -typedef std::unique_ptr<tdesc_type> tdesc_type_up; - -struct tdesc_type_builtin : tdesc_type -{ - tdesc_type_builtin (const std::string &name, enum tdesc_type_kind kind) - : tdesc_type (name, kind) - {} - - void accept (tdesc_element_visitor &v) const override - { - v.visit (this); - } -}; - -/* tdesc_type for vector types. */ - -struct tdesc_type_vector : tdesc_type -{ - tdesc_type_vector (const std::string &name, tdesc_type *element_type_, - int count_) - : tdesc_type (name, TDESC_TYPE_VECTOR), - element_type (element_type_), count (count_) - {} - - void accept (tdesc_element_visitor &v) const override - { - v.visit (this); - } - - struct tdesc_type *element_type; - int count; -}; - -/* A named type from a target description. */ - -struct tdesc_type_field -{ - tdesc_type_field (const std::string &name_, tdesc_type *type_, - int start_, int end_) - : name (name_), type (type_), start (start_), end (end_) - {} - - std::string name; - struct tdesc_type *type; - /* For non-enum-values, either both are -1 (non-bitfield), or both are - not -1 (bitfield). For enum values, start is the value (which could be - -1), end is -1. */ - int start, end; -}; - -/* tdesc_type for struct, union, flags, and enum types. */ - -struct tdesc_type_with_fields : tdesc_type -{ - tdesc_type_with_fields (const std::string &name, tdesc_type_kind kind, - int size_ = 0) - : tdesc_type (name, kind), size (size_) - {} - - void accept (tdesc_element_visitor &v) const override - { - v.visit (this); - } - - std::vector<tdesc_type_field> fields; - int size; -}; - -/* A feature from a target description. Each feature is a collection - of other elements, e.g. registers and types. */ - -struct tdesc_feature : tdesc_element -{ - tdesc_feature (const std::string &name_) - : name (name_) - {} - - virtual ~tdesc_feature () = default; - - DISABLE_COPY_AND_ASSIGN (tdesc_feature); - - /* The name of this feature. It may be recognized by the architecture - support code. */ - std::string name; - - /* The registers associated with this feature. */ - std::vector<tdesc_reg_up> registers; - - /* The types associated with this feature. */ - std::vector<tdesc_type_up> types; - - void accept (tdesc_element_visitor &v) const override; - - bool operator== (const tdesc_feature &other) const; - - bool operator!= (const tdesc_feature &other) const - { - return !(*this == other); - } -}; - -typedef std::unique_ptr<tdesc_feature> tdesc_feature_up; - -/* Allocate a new target_desc. */ -target_desc *allocate_target_description (void); - -/* Set TARGET_DESC's architecture by NAME. */ -void set_tdesc_architecture (target_desc *target_desc, - const char *name); - -/* Return the architecture associated with this target description as a string, - or NULL if no architecture was specified. */ -const char *tdesc_architecture_name (const struct target_desc *target_desc); - -/* Set TARGET_DESC's osabi by NAME. */ -void set_tdesc_osabi (target_desc *target_desc, const char *name); - -/* Return the osabi associated with this target description as a string, - or NULL if no osabi was specified. */ -const char *tdesc_osabi_name (const struct target_desc *target_desc); - -/* Return the type associated with ID in the context of FEATURE, or - NULL if none. */ -struct tdesc_type *tdesc_named_type (const struct tdesc_feature *feature, - const char *id); - -/* Return the created feature named NAME in target description TDESC. */ -struct tdesc_feature *tdesc_create_feature (struct target_desc *tdesc, - const char *name); - -/* Return the created vector tdesc_type named NAME in FEATURE. */ -struct tdesc_type *tdesc_create_vector (struct tdesc_feature *feature, - const char *name, - struct tdesc_type *field_type, - int count); - -/* Return the created struct tdesc_type named NAME in FEATURE. */ -tdesc_type_with_fields *tdesc_create_struct (struct tdesc_feature *feature, - const char *name); - -/* Return the created union tdesc_type named NAME in FEATURE. */ -tdesc_type_with_fields *tdesc_create_union (struct tdesc_feature *feature, - const char *name); - -/* Return the created flags tdesc_type named NAME in FEATURE. */ -tdesc_type_with_fields *tdesc_create_flags (struct tdesc_feature *feature, - const char *name, - int size); - -/* Return the created enum tdesc_type named NAME in FEATURE. */ -tdesc_type_with_fields *tdesc_create_enum (struct tdesc_feature *feature, - const char *name, - int size); - -/* Add a new field to TYPE. FIELD_NAME is its name, and FIELD_TYPE is - its type. */ -void tdesc_add_field (tdesc_type_with_fields *type, const char *field_name, - struct tdesc_type *field_type); - -/* Add a new bitfield to TYPE, with range START to END. FIELD_NAME is its name, - and FIELD_TYPE is its type. */ -void tdesc_add_typed_bitfield (tdesc_type_with_fields *type, - const char *field_name, - int start, int end, - struct tdesc_type *field_type); - -/* Set the total length of TYPE. Structs which contain bitfields may - omit the reserved bits, so the end of the last field may not - suffice. */ -void tdesc_set_struct_size (tdesc_type_with_fields *type, int size); - -/* Add a new untyped bitfield to TYPE. - Untyped bitfields become either uint32 or uint64 depending on the size - of the underlying type. */ -void tdesc_add_bitfield (tdesc_type_with_fields *type, const char *field_name, - int start, int end); - -/* A flag is just a typed(bool) single-bit bitfield. - This function is kept to minimize changes in generated files. */ -void tdesc_add_flag (tdesc_type_with_fields *type, int start, - const char *flag_name); - -/* Add field with VALUE and NAME to the enum TYPE. */ -void tdesc_add_enum_value (tdesc_type_with_fields *type, int value, - const char *name); - -/* Create a register in feature FEATURE. */ -void tdesc_create_reg (struct tdesc_feature *feature, const char *name, - int regnum, int save_restore, const char *group, - int bitsize, const char *type); - -/* Return the tdesc in string XML format. */ - -const char *tdesc_get_features_xml (const target_desc *tdesc); - -/* Print target description as xml. */ - -class print_xml_feature : public tdesc_element_visitor -{ -public: - print_xml_feature (std::string *buffer_) - : m_buffer (buffer_) - {} - - void visit_pre (const target_desc *e) override; - void visit_post (const target_desc *e) override; - void visit_pre (const tdesc_feature *e) override; - void visit_post (const tdesc_feature *e) override; - void visit (const tdesc_type_builtin *type) override; - void visit (const tdesc_type_vector *type) override; - void visit (const tdesc_type_with_fields *type) override; - void visit (const tdesc_reg *reg) override; - -private: - std::string *m_buffer; -}; - -#endif /* COMMON_TDESC_H */ diff --git a/gdb/gdbsupport/thread-pool.c b/gdb/gdbsupport/thread-pool.c deleted file mode 100644 index fc83ff7..0000000 --- a/gdb/gdbsupport/thread-pool.c +++ /dev/null @@ -1,167 +0,0 @@ -/* Thread pool - - Copyright (C) 2019-2020 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 "common-defs.h" - -#if CXX_STD_THREAD - -#include "gdbsupport/thread-pool.h" -#include "gdbsupport/alt-stack.h" -#include "gdbsupport/block-signals.h" -#include <algorithm> - -/* On the off chance that we have the pthread library on a Windows - host, but std::thread is not using it, avoid calling - pthread_setname_np on Windows. */ -#ifndef _WIN32 -#ifdef HAVE_PTHREAD_SETNAME_NP -#define USE_PTHREAD_SETNAME_NP -#endif -#endif - -#ifdef USE_PTHREAD_SETNAME_NP - -#include <pthread.h> - -/* Handle platform discrepancies in pthread_setname_np: macOS uses a - single-argument form, while Linux uses a two-argument form. This - wrapper handles the difference. */ - -ATTRIBUTE_UNUSED static void -set_thread_name (int (*set_name) (pthread_t, const char *), const char *name) -{ - set_name (pthread_self (), name); -} - -/* The macOS man page says that pthread_setname_np returns "void", but - the headers actually declare it returning "int". */ -ATTRIBUTE_UNUSED static void -set_thread_name (int (*set_name) (const char *), const char *name) -{ - set_name (name); -} - -#endif /* USE_PTHREAD_SETNAME_NP */ - -namespace gdb -{ - -/* The thread pool detach()s its threads, so that the threads will not - prevent the process from exiting. However, it was discovered that - if any detached threads were still waiting on a condition variable, - then the condition variable's destructor would wait for the threads - to exit -- defeating the purpose. - - Allocating the thread pool on the heap and simply "leaking" it - avoids this problem. -*/ -thread_pool *thread_pool::g_thread_pool = new thread_pool (); - -thread_pool::~thread_pool () -{ - /* Because this is a singleton, we don't need to clean up. The - threads are detached so that they won't prevent process exit. - And, cleaning up here would be actively harmful in at least one - case -- see the comment by the definition of g_thread_pool. */ -} - -void -thread_pool::set_thread_count (size_t num_threads) -{ - std::lock_guard<std::mutex> guard (m_tasks_mutex); - - /* If the new size is larger, start some new threads. */ - if (m_thread_count < num_threads) - { - /* Ensure that signals used by gdb are blocked in the new - threads. */ - block_signals blocker; - for (size_t i = m_thread_count; i < num_threads; ++i) - { - std::thread thread (&thread_pool::thread_function, this); - thread.detach (); - } - } - /* If the new size is smaller, terminate some existing threads. */ - if (num_threads < m_thread_count) - { - for (size_t i = num_threads; i < m_thread_count; ++i) - m_tasks.emplace (); - m_tasks_cv.notify_all (); - } - - m_thread_count = num_threads; -} - -std::future<void> -thread_pool::post_task (std::function<void ()> func) -{ - std::packaged_task<void ()> t (func); - std::future<void> f = t.get_future (); - - if (m_thread_count == 0) - { - /* Just execute it now. */ - t (); - } - else - { - std::lock_guard<std::mutex> guard (m_tasks_mutex); - m_tasks.emplace (std::move (t)); - m_tasks_cv.notify_one (); - } - return f; -} - -void -thread_pool::thread_function () -{ -#ifdef USE_PTHREAD_SETNAME_NP - /* This must be done here, because on macOS one can only set the - name of the current thread. */ - set_thread_name (pthread_setname_np, "gdb worker"); -#endif - - /* Ensure that SIGSEGV is delivered to an alternate signal - stack. */ - gdb::alternate_signal_stack signal_stack; - - while (true) - { - optional<task> t; - - { - /* We want to hold the lock while examining the task list, but - not while invoking the task function. */ - std::unique_lock<std::mutex> guard (m_tasks_mutex); - while (m_tasks.empty ()) - m_tasks_cv.wait (guard); - t = std::move (m_tasks.front()); - m_tasks.pop (); - } - - if (!t.has_value ()) - break; - (*t) (); - } -} - -} - -#endif /* CXX_STD_THREAD */ diff --git a/gdb/gdbsupport/thread-pool.h b/gdb/gdbsupport/thread-pool.h deleted file mode 100644 index 2fb4453..0000000 --- a/gdb/gdbsupport/thread-pool.h +++ /dev/null @@ -1,90 +0,0 @@ -/* Thread pool - - Copyright (C) 2019-2020 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_THREAD_POOL_H -#define GDBSUPPORT_THREAD_POOL_H - -#include <queue> -#include <thread> -#include <vector> -#include <functional> -#include <mutex> -#include <condition_variable> -#include <future> -#include "gdbsupport/gdb_optional.h" - -namespace gdb -{ - -/* A thread pool. - - There is a single global thread pool, see g_thread_pool. Tasks can - be submitted to the thread pool. They will be processed in worker - threads as time allows. */ -class thread_pool -{ -public: - /* The sole global thread pool. */ - static thread_pool *g_thread_pool; - - ~thread_pool (); - DISABLE_COPY_AND_ASSIGN (thread_pool); - - /* Set the thread count of this thread pool. By default, no threads - are created -- the thread count must be set first. */ - void set_thread_count (size_t num_threads); - - /* Return the number of executing threads. */ - size_t thread_count () const - { - return m_thread_count; - } - - /* Post a task to the thread pool. A future is returned, which can - be used to wait for the result. */ - std::future<void> post_task (std::function<void ()> func); - -private: - - thread_pool () = default; - - /* The callback for each worker thread. */ - void thread_function (); - - /* The current thread count. */ - size_t m_thread_count = 0; - - /* A convenience typedef for the type of a task. */ - typedef std::packaged_task<void ()> task; - - /* The tasks that have not been processed yet. An optional is used - to represent a task. If the optional is empty, then this means - that the receiving thread should terminate. If the optional is - non-empty, then it is an actual task to evaluate. */ - std::queue<optional<task>> m_tasks; - - /* A condition variable and mutex that are used for communication - between the main thread and the worker threads. */ - std::condition_variable m_tasks_cv; - std::mutex m_tasks_mutex; -}; - -} - -#endif /* GDBSUPPORT_THREAD_POOL_H */ diff --git a/gdb/gdbsupport/traits.h b/gdb/gdbsupport/traits.h deleted file mode 100644 index 2a6f006..0000000 --- a/gdb/gdbsupport/traits.h +++ /dev/null @@ -1,109 +0,0 @@ -/* Copyright (C) 2017-2020 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 COMMON_TRAITS_H -#define COMMON_TRAITS_H - -#include <type_traits> - -/* GCC does not understand __has_feature. */ -#if !defined(__has_feature) -# define __has_feature(x) 0 -#endif - -/* HAVE_IS_TRIVIALLY_COPYABLE is defined as 1 iff - std::is_trivially_copyable is available. GCC only implemented it - in GCC 5. */ -#if (__has_feature(is_trivially_copyable) \ - || (defined __GNUC__ && __GNUC__ >= 5)) -# define HAVE_IS_TRIVIALLY_COPYABLE 1 -#endif - -/* HAVE_IS_TRIVIALLY_CONSTRUCTIBLE is defined as 1 iff - std::is_trivially_constructible is available. GCC only implemented it - in GCC 5. */ -#if (__has_feature(is_trivially_constructible) \ - || (defined __GNUC__ && __GNUC__ >= 5)) -# define HAVE_IS_TRIVIALLY_CONSTRUCTIBLE 1 -#endif - -namespace gdb { - -/* Pre C++14-safe (CWG 1558) version of C++17's std::void_t. See - <http://en.cppreference.com/w/cpp/types/void_t>. */ - -template<typename... Ts> -struct make_void { typedef void type; }; - -template<typename... Ts> -using void_t = typename make_void<Ts...>::type; - -/* A few trait helpers, mainly stolen from libstdc++. Uppercase - because "and/or", etc. are reserved keywords. */ - -template<typename Predicate> -struct Not : public std::integral_constant<bool, !Predicate::value> -{}; - -template<typename...> -struct Or; - -template<> -struct Or<> : public std::false_type -{}; - -template<typename B1> -struct Or<B1> : public B1 -{}; - -template<typename B1, typename B2> -struct Or<B1, B2> - : public std::conditional<B1::value, B1, B2>::type -{}; - -template<typename B1,typename B2,typename B3, typename... Bn> -struct Or<B1, B2, B3, Bn...> - : public std::conditional<B1::value, B1, Or<B2, B3, Bn...>>::type -{}; - -template<typename...> -struct And; - -template<> -struct And<> : public std::true_type -{}; - -template<typename B1> -struct And<B1> : public B1 -{}; - -template<typename B1, typename B2> -struct And<B1, B2> - : public std::conditional<B1::value, B2, B1>::type -{}; - -template<typename B1, typename B2, typename B3, typename... Bn> -struct And<B1, B2, B3, Bn...> - : public std::conditional<B1::value, And<B2, B3, Bn...>, B1>::type -{}; - -/* Concepts-light-like helper to make SFINAE logic easier to read. */ -template<typename Condition> -using Requires = typename std::enable_if<Condition::value, void>::type; -} - -#endif /* COMMON_TRAITS_H */ diff --git a/gdb/gdbsupport/underlying.h b/gdb/gdbsupport/underlying.h deleted file mode 100644 index a90aedb..0000000 --- a/gdb/gdbsupport/underlying.h +++ /dev/null @@ -1,32 +0,0 @@ -/* Copyright (C) 2017-2020 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 COMMON_UNDERLYING_H -#define COMMON_UNDERLYING_H - -#include <type_traits> - -/* Convert an enum to its underlying value. */ - -template<typename E> -constexpr typename std::underlying_type<E>::type -to_underlying (E val) noexcept -{ - return static_cast<typename std::underlying_type<E>::type> (val); -} - -#endif diff --git a/gdb/gdbsupport/valid-expr.h b/gdb/gdbsupport/valid-expr.h deleted file mode 100644 index b1c8446..0000000 --- a/gdb/gdbsupport/valid-expr.h +++ /dev/null @@ -1,108 +0,0 @@ -/* Compile-time valid expression checker for GDB, the GNU debugger. - - Copyright (C) 2017-2020 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/>. */ - -/* Helper macros used to build compile-time unit tests that make sure - that invalid expressions that should not compile would not compile, - and that expressions that should compile do compile, and have the - right type. This is mainly used to verify that some utility's API - is really as safe as intended. */ - -#ifndef COMMON_VALID_EXPR_H -#define COMMON_VALID_EXPR_H - -#include "gdbsupport/preprocessor.h" -#include "gdbsupport/traits.h" - -/* Macro that uses SFINAE magic to detect whether the EXPR expression - is either valid or ill-formed, at compile time, without actually - producing compile-time errors. I.e., check that bad uses of the - types (e.g., involving mismatching types) would be caught at - compile time. If the expression is valid, also check whether the - expression has the right type. - - EXPR must be defined in terms of some of the template parameters, - so that template substitution failure discards the overload instead - of causing a real compile error. TYPES is thus the list of types - involved in the expression, and TYPENAMES is the same list, but - with each element prefixed by "typename". These are passed as - template parameter types to the templates within the macro. - - VALID is a boolean that indicates whether the expression is - supposed to be valid or invalid. - - EXPR_TYPE is the expected type of EXPR. Only meaningful iff VALID - is true. If VALID is false, then you must pass "void" as expected - type. - - Each invocation of the macro is wrapped in its own namespace to - avoid ODR violations. The generated namespace only includes the - line number, so client code should wrap sets of calls in a - test-specific namespace too, to fully guarantee uniqueness between - the multiple clients in the codebase. */ -#define CHECK_VALID_EXPR_INT(TYPENAMES, TYPES, VALID, EXPR_TYPE, EXPR) \ - namespace CONCAT (check_valid_expr, __LINE__) { \ - \ - template<typename, typename, typename = void> \ - struct is_valid_expression \ - : std::false_type {}; \ - \ - template <TYPENAMES> \ - struct is_valid_expression<TYPES, gdb::void_t<decltype (EXPR)>> \ - : std::true_type {}; \ - \ - static_assert (is_valid_expression<TYPES>::value == VALID, \ - ""); \ - \ - template<TYPENAMES, typename = void> \ - struct is_same_type \ - : std::is_same<EXPR_TYPE, void> {}; \ - \ - template <TYPENAMES> \ - struct is_same_type<TYPES, gdb::void_t<decltype (EXPR)>> \ - : std::is_same<EXPR_TYPE, decltype (EXPR)> {}; \ - \ - static_assert (is_same_type<TYPES>::value, ""); \ - } /* namespace */ - -/* A few convenience macros that support expressions involving a - varying numbers of types. If you need more types, feel free to add - another variant. */ - -#define CHECK_VALID_EXPR_1(T1, VALID, EXPR_TYPE, EXPR) \ - CHECK_VALID_EXPR_INT (ESC_PARENS (typename T1), \ - ESC_PARENS (T1), \ - VALID, EXPR_TYPE, EXPR) - -#define CHECK_VALID_EXPR_2(T1, T2, VALID, EXPR_TYPE, EXPR) \ - CHECK_VALID_EXPR_INT (ESC_PARENS(typename T1, typename T2), \ - ESC_PARENS (T1, T2), \ - VALID, EXPR_TYPE, EXPR) - -#define CHECK_VALID_EXPR_3(T1, T2, T3, VALID, EXPR_TYPE, EXPR) \ - CHECK_VALID_EXPR_INT (ESC_PARENS (typename T1, typename T2, typename T3), \ - ESC_PARENS (T1, T2, T3), \ - VALID, EXPR_TYPE, EXPR) - -#define CHECK_VALID_EXPR_4(T1, T2, T3, T4, VALID, EXPR_TYPE, EXPR) \ - CHECK_VALID_EXPR_INT (ESC_PARENS (typename T1, typename T2, \ - typename T3, typename T4), \ - ESC_PARENS (T1, T2, T3, T4), \ - VALID, EXPR_TYPE, EXPR) - -#endif /* COMMON_VALID_EXPR_H */ diff --git a/gdb/gdbsupport/version.h b/gdb/gdbsupport/version.h deleted file mode 100644 index 9c94fec..0000000 --- a/gdb/gdbsupport/version.h +++ /dev/null @@ -1,31 +0,0 @@ -/* Version information for GDB. - Copyright (C) 1999-2020 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 COMMON_VERSION_H -#define COMMON_VERSION_H - -/* Version number of GDB, as a string. */ -extern const char version[]; - -/* Canonical host name as a string. */ -extern const char host_name[]; - -/* Canonical target name as a string. */ -extern const char target_name[]; - -#endif /* COMMON_VERSION_H */ diff --git a/gdb/gdbsupport/x86-xstate.h b/gdb/gdbsupport/x86-xstate.h deleted file mode 100644 index 0331d8f..0000000 --- a/gdb/gdbsupport/x86-xstate.h +++ /dev/null @@ -1,88 +0,0 @@ -/* Common code for x86 XSAVE extended state. - - Copyright (C) 2010-2020 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 COMMON_X86_XSTATE_H -#define COMMON_X86_XSTATE_H - -/* The extended state feature bits. */ -#define X86_XSTATE_X87 (1ULL << 0) -#define X86_XSTATE_SSE (1ULL << 1) -#define X86_XSTATE_AVX (1ULL << 2) -#define X86_XSTATE_BNDREGS (1ULL << 3) -#define X86_XSTATE_BNDCFG (1ULL << 4) -#define X86_XSTATE_MPX (X86_XSTATE_BNDREGS | X86_XSTATE_BNDCFG) - -/* AVX 512 adds three feature bits. All three must be enabled. */ -#define X86_XSTATE_K (1ULL << 5) -#define X86_XSTATE_ZMM_H (1ULL << 6) -#define X86_XSTATE_ZMM (1ULL << 7) -#define X86_XSTATE_AVX512 (X86_XSTATE_K | X86_XSTATE_ZMM_H \ - | X86_XSTATE_ZMM) - -#define X86_XSTATE_PKRU (1ULL << 9) - -/* Supported mask and size of the extended state. */ -#define X86_XSTATE_X87_MASK X86_XSTATE_X87 -#define X86_XSTATE_SSE_MASK (X86_XSTATE_X87 | X86_XSTATE_SSE) -#define X86_XSTATE_AVX_MASK (X86_XSTATE_SSE_MASK | X86_XSTATE_AVX) -#define X86_XSTATE_MPX_MASK (X86_XSTATE_SSE_MASK | X86_XSTATE_MPX) -#define X86_XSTATE_AVX_MPX_MASK (X86_XSTATE_AVX_MASK | X86_XSTATE_MPX) -#define X86_XSTATE_AVX_AVX512_MASK (X86_XSTATE_AVX_MASK | X86_XSTATE_AVX512) -#define X86_XSTATE_AVX_MPX_AVX512_PKU_MASK (X86_XSTATE_AVX_MPX_MASK\ - | X86_XSTATE_AVX512 | X86_XSTATE_PKRU) - -#define X86_XSTATE_ALL_MASK (X86_XSTATE_AVX_MPX_AVX512_PKU_MASK) - - -#define X86_XSTATE_SSE_SIZE 576 -#define X86_XSTATE_AVX_SIZE 832 -#define X86_XSTATE_BNDREGS_SIZE 1024 -#define X86_XSTATE_BNDCFG_SIZE 1088 -#define X86_XSTATE_AVX512_SIZE 2688 -#define X86_XSTATE_PKRU_SIZE 2696 -#define X86_XSTATE_MAX_SIZE 2696 - - -/* In case one of the MPX XCR0 bits is set we consider we have MPX. */ -#define HAS_MPX(XCR0) (((XCR0) & X86_XSTATE_MPX) != 0) -#define HAS_AVX(XCR0) (((XCR0) & X86_XSTATE_AVX) != 0) -#define HAS_AVX512(XCR0) (((XCR0) & X86_XSTATE_AVX512) != 0) -#define HAS_PKRU(XCR0) (((XCR0) & X86_XSTATE_PKRU) != 0) - -/* Get I386 XSAVE extended state size. */ -#define X86_XSTATE_SIZE(XCR0) \ - (HAS_PKRU (XCR0) ? X86_XSTATE_PKRU_SIZE : \ - (HAS_AVX512 (XCR0) ? X86_XSTATE_AVX512_SIZE : \ - (HAS_MPX (XCR0) ? X86_XSTATE_BNDCFG_SIZE : \ - (HAS_AVX (XCR0) ? X86_XSTATE_AVX_SIZE : X86_XSTATE_SSE_SIZE)))) - -/* Initial value for fctrl register, as defined in the X86 manual, and - confirmed in the (Linux) kernel source. When the x87 floating point - feature is not enabled in an inferior we use this as the value of the - fcrtl register. */ - -#define I387_FCTRL_INIT_VAL 0x037f - -/* Initial value for mxcsr register. When the avx and sse floating point - features are not enabled in an inferior we use this as the value of the - mxcsr register. */ - -#define I387_MXCSR_INIT_VAL 0x1f80 - -#endif /* COMMON_X86_XSTATE_H */ diff --git a/gdb/gdbsupport/xml-utils.c b/gdb/gdbsupport/xml-utils.c deleted file mode 100644 index 3c6c11a..0000000 --- a/gdb/gdbsupport/xml-utils.c +++ /dev/null @@ -1,63 +0,0 @@ -/* Shared helper routines for manipulating XML. - - Copyright (C) 2006-2020 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 "common-defs.h" -#include "xml-utils.h" - -/* See xml-utils.h. */ - -std::string -xml_escape_text (const char *text) -{ - std::string result; - - xml_escape_text_append (&result, text); - - return result; -} - -/* See xml-utils.h. */ - -void -xml_escape_text_append (std::string *result, const char *text) -{ - /* Expand the result. */ - for (int i = 0; text[i] != '\0'; i++) - switch (text[i]) - { - case '\'': - *result += "'"; - break; - case '\"': - *result += """; - break; - case '&': - *result += "&"; - break; - case '<': - *result += "<"; - break; - case '>': - *result += ">"; - break; - default: - *result += text[i]; - break; - } -} diff --git a/gdb/gdbsupport/xml-utils.h b/gdb/gdbsupport/xml-utils.h deleted file mode 100644 index 19dead4..0000000 --- a/gdb/gdbsupport/xml-utils.h +++ /dev/null @@ -1,33 +0,0 @@ -/* Shared helper routines for manipulating XML. - - Copyright (C) 2006-2020 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 COMMON_XML_UTILS_H -#define COMMON_XML_UTILS_H - -/* Return a string with special characters from TEXT replaced by entity - references. */ - -extern std::string xml_escape_text (const char *text); - -/* Append TEXT to RESULT, with special characters replaced by entity - references. */ - -extern void xml_escape_text_append (std::string *result, const char *text); - -#endif /* COMMON_XML_UTILS_H */ diff --git a/gdb/nat/linux-btrace.c b/gdb/nat/linux-btrace.c index 03fc85e..3a3cd8d 100644 --- a/gdb/nat/linux-btrace.c +++ b/gdb/nat/linux-btrace.c @@ -20,6 +20,14 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include "gdbsupport/common-defs.h" + +#undef PACKAGE +#undef PACKAGE_NAME +#undef PACKAGE_VERSION +#undef PACKAGE_STRING +#undef PACKAGE_TARNAME + +#include <config.h> #include "linux-btrace.h" #include "gdbsupport/common-regcache.h" #include "gdbsupport/gdb_wait.h" diff --git a/gdb/nat/linux-ptrace.c b/gdb/nat/linux-ptrace.c index 5335d69..859feb7 100644 --- a/gdb/nat/linux-ptrace.c +++ b/gdb/nat/linux-ptrace.c @@ -17,6 +17,14 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include "gdbsupport/common-defs.h" + +#undef PACKAGE +#undef PACKAGE_NAME +#undef PACKAGE_VERSION +#undef PACKAGE_STRING +#undef PACKAGE_TARNAME + +#include <config.h> #include "linux-ptrace.h" #include "linux-procfs.h" #include "linux-waitpid.h" diff --git a/gdb/nat/x86-linux-dregs.c b/gdb/nat/x86-linux-dregs.c index b5dd71e..31683aa 100644 --- a/gdb/nat/x86-linux-dregs.c +++ b/gdb/nat/x86-linux-dregs.c @@ -18,6 +18,14 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include "gdbsupport/common-defs.h" + +#undef PACKAGE +#undef PACKAGE_NAME +#undef PACKAGE_VERSION +#undef PACKAGE_STRING +#undef PACKAGE_TARNAME + +#include <config.h> #include "nat/gdb_ptrace.h" #include <sys/user.h> #include "target/waitstatus.h" |