This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH v3 1/2] Create new common/pathstuff.[ch]


On Tuesday, February 27 2018, I wrote:

> Changes from v2:
>
> - Added comments to the path manipulation functions.
>
>
> This commit moves the path manipulation routines found on utils.c to a
> new common/pathstuff.c, and updates the Makefile.in's accordingly.
> The routines moved are "gdb_realpath", "gdb_realpath_keepfile" and
> "gdb_abspath".
>
> This will be needed because gdbserver will have to call "gdb_abspath"
> on my next patch, which implements a way to expand the path of the
> inferior provided by the user in order to allow specifying just the
> binary name when starting gdbserver, like:
>
>   $ gdbserver :1234 a.out
>
> With the recent addition of the startup-with-shell feature on
> gdbserver, this scenario doesn't work anymore if the user doesn't have
> the current directory listed in the PATH variable.
>
> I had to do a minor adjustment on "gdb_abspath" because we don't have
> access to "tilde_expand" on gdbserver, so now the function is using
> "gdb_tilde_expand" instead.  Otherwise, the code is the same.
>
> Regression tested on the BuildBot, without regressions.

Pushed.

b4987c956dfa44ca9fd8552f63e15f5fa094b2a4

Thanks,

>
> gdb/ChangeLog:
> yyyy-mm-dd  Sergio Durigan Junior  <sergiodj@redhat.com>
>
> 	* Makefile.in (COMMON_SFILES): Add "common/pathstuff.c".
> 	(HFILES_NO_SRCDIR): Add "common/pathstuff.h".
> 	* auto-load.c: Include "common/pathstuff.h".
> 	* common/common-def.h (current_directory): Move here.
> 	* common/gdb_tilde_expand.c (gdb_tilde_expand_up): New
> 	function.
> 	* common/gdb_tilde_expand.h (gdb_tilde_expand_up): New
> 	prototype.
> 	* common/pathstuff.c: New file.
> 	* common/pathstuff.h: New file.
> 	* compile/compile.c: Include "common/pathstuff.h".
> 	* defs.h (current_directory): Move to "common/common-defs.h".
> 	* dwarf2read.c: Include "common/pathstuff.h".
> 	* exec.c: Likewise.
> 	* guile/scm-safe-call.c: Likewise.
> 	* linux-thread-db.c: Likewise.
> 	* main.c: Likewise.
> 	* nto-tdep.c: Likewise.
> 	* objfiles.c: Likewise.
> 	* source.c: Likewise.
> 	* symtab.c: Likewise.
> 	* utils.c: Include "common/pathstuff.h".
> 	(gdb_realpath): Move to "common/pathstuff.c".
> 	(gdb_realpath_keepfile): Likewise.
> 	(gdb_abspath): Likewise.
> 	* utils.h (gdb_realpath): Move to "common/pathstuff.h".
> 	(gdb_realpath_keepfile): Likewise.
> 	(gdb_abspath): Likewise.
>
> gdb/gdbserver/ChangeLog:
> yyyy-mm-dd  Sergio Durigan Junior  <sergiodj@redhat.com>
>
> 	* Makefile.in (SFILES): Add "$(srcdir)/common/pathstuff.c".
> 	(OBJS): Add "pathstuff.o".
> 	* server.c (current_directory): New global variable.
> 	(captured_main): Initialize "current_directory".
> ---
>  gdb/Makefile.in               |   2 +
>  gdb/auto-load.c               |   1 +
>  gdb/common/common-defs.h      |   3 +
>  gdb/common/gdb_tilde_expand.c |  13 ++++
>  gdb/common/gdb_tilde_expand.h |   4 ++
>  gdb/common/pathstuff.c        | 142 ++++++++++++++++++++++++++++++++++++++++++
>  gdb/common/pathstuff.h        |  49 +++++++++++++++
>  gdb/compile/compile.c         |   1 +
>  gdb/defs.h                    |   4 --
>  gdb/dwarf2read.c              |   1 +
>  gdb/exec.c                    |   1 +
>  gdb/gdbserver/Makefile.in     |   2 +
>  gdb/gdbserver/server.c        |  11 ++++
>  gdb/guile/scm-safe-call.c     |   1 +
>  gdb/linux-thread-db.c         |   1 +
>  gdb/main.c                    |   1 +
>  gdb/nto-tdep.c                |   1 +
>  gdb/objfiles.c                |   1 +
>  gdb/source.c                  |   1 +
>  gdb/symtab.c                  |   1 +
>  gdb/utils.c                   | 120 +----------------------------------
>  gdb/utils.h                   |   6 --
>  22 files changed, 238 insertions(+), 129 deletions(-)
>  create mode 100644 gdb/common/pathstuff.c
>  create mode 100644 gdb/common/pathstuff.h
>
> diff --git a/gdb/Makefile.in b/gdb/Makefile.in
> index 1c58b9270d..19be64f226 100644
> --- a/gdb/Makefile.in
> +++ b/gdb/Makefile.in
> @@ -955,6 +955,7 @@ COMMON_SFILES = \
>  	common/gdb_tilde_expand.c \
>  	common/gdb_vecs.c \
>  	common/new-op.c \
> +	common/pathstuff.c \
>  	common/print-utils.c \
>  	common/ptid.c \
>  	common/rsp-low.c \
> @@ -1429,6 +1430,7 @@ HFILES_NO_SRCDIR = \
>  	common/gdb_wait.h \
>  	common/common-inferior.h \
>  	common/host-defs.h \
> +	common/pathstuff.h \
>  	common/print-utils.h \
>  	common/ptid.h \
>  	common/queue.h \
> diff --git a/gdb/auto-load.c b/gdb/auto-load.c
> index b79341faf6..9dd8754e1a 100644
> --- a/gdb/auto-load.c
> +++ b/gdb/auto-load.c
> @@ -40,6 +40,7 @@
>  #include "extension.h"
>  #include "gdb/section-scripts.h"
>  #include <algorithm>
> +#include "common/pathstuff.h"
>  
>  /* The section to look in for auto-loaded scripts (in file formats that
>     support sections).
> diff --git a/gdb/common/common-defs.h b/gdb/common/common-defs.h
> index acbc32ca69..881a4eaaff 100644
> --- a/gdb/common/common-defs.h
> +++ b/gdb/common/common-defs.h
> @@ -91,4 +91,7 @@
>  /* Pull in gdb::unique_xmalloc_ptr.  */
>  #include "common/gdb_unique_ptr.h"
>  
> +/* String containing the current directory (what getwd would return).  */
> +extern char *current_directory;
> +
>  #endif /* COMMON_DEFS_H */
> diff --git a/gdb/common/gdb_tilde_expand.c b/gdb/common/gdb_tilde_expand.c
> index b4f371464d..fcb97961ac 100644
> --- a/gdb/common/gdb_tilde_expand.c
> +++ b/gdb/common/gdb_tilde_expand.c
> @@ -80,3 +80,16 @@ gdb_tilde_expand (const char *dir)
>  
>    return expanded_dir;
>  }
> +
> +/* See common/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 gdb::unique_xmalloc_ptr<char> (xstrdup (glob.pathv ()[0]));
> +}
> diff --git a/gdb/common/gdb_tilde_expand.h b/gdb/common/gdb_tilde_expand.h
> index d0dfb37857..22860d3969 100644
> --- a/gdb/common/gdb_tilde_expand.h
> +++ b/gdb/common/gdb_tilde_expand.h
> @@ -24,4 +24,8 @@
>     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 /* ! GDB_TILDE_EXPAND_H */
> diff --git a/gdb/common/pathstuff.c b/gdb/common/pathstuff.c
> new file mode 100644
> index 0000000000..02f6e44794
> --- /dev/null
> +++ b/gdb/common/pathstuff.c
> @@ -0,0 +1,142 @@
> +/* Path manipulation routines for GDB and gdbserver.
> +
> +   Copyright (C) 1986-2018 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"
> +
> +/* See common/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 gdb::unique_xmalloc_ptr<char> (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 gdb::unique_xmalloc_ptr<char> (xstrdup (filename));
> +}
> +
> +/* See common/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 gdb::unique_xmalloc_ptr<char> (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 common/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))
> +    return gdb::unique_xmalloc_ptr<char> (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));
> +}
> diff --git a/gdb/common/pathstuff.h b/gdb/common/pathstuff.h
> new file mode 100644
> index 0000000000..3cb02c86d6
> --- /dev/null
> +++ b/gdb/common/pathstuff.h
> @@ -0,0 +1,49 @@
> +/* Path manipulation routines for GDB and gdbserver.
> +
> +   Copyright (C) 1986-2018 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 PATHSTUFF_H
> +#define PATHSTUFF_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.  */
> +
> +extern gdb::unique_xmalloc_ptr<char> gdb_abspath (const char *path);
> +
> +#endif /* PATHSTUFF_H */
> diff --git a/gdb/compile/compile.c b/gdb/compile/compile.c
> index 70c4570de7..7f35272872 100644
> --- a/gdb/compile/compile.c
> +++ b/gdb/compile/compile.c
> @@ -41,6 +41,7 @@
>  #include "valprint.h"
>  #include "common/gdb_optional.h"
>  #include "common/gdb_unlinker.h"
> +#include "common/pathstuff.h"
>  
>  
>  
> diff --git a/gdb/defs.h b/gdb/defs.h
> index c85bf2cf11..a924573b57 100644
> --- a/gdb/defs.h
> +++ b/gdb/defs.h
> @@ -402,10 +402,6 @@ enum info_proc_what
>      IP_ALL
>    };
>  
> -/* * String containing the current directory (what getwd would return).  */
> -
> -extern char *current_directory;
> -
>  /* * Default radixes for input and output.  Only some values supported.  */
>  extern unsigned input_radix;
>  extern unsigned output_radix;
> diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
> index 1e4376e4de..9825117fa7 100644
> --- a/gdb/dwarf2read.c
> +++ b/gdb/dwarf2read.c
> @@ -87,6 +87,7 @@
>  #include <set>
>  #include <forward_list>
>  #include "rust-lang.h"
> +#include "common/pathstuff.h"
>  
>  /* When == 1, print basic high level tracing messages.
>     When > 1, be more verbose.
> diff --git a/gdb/exec.c b/gdb/exec.c
> index 0b4237ff63..6b910e8f54 100644
> --- a/gdb/exec.c
> +++ b/gdb/exec.c
> @@ -45,6 +45,7 @@
>  #include <sys/stat.h>
>  #include "solist.h"
>  #include <algorithm>
> +#include "common/pathstuff.h"
>  
>  void (*deprecated_file_changed_hook) (const char *);
>  
> diff --git a/gdb/gdbserver/Makefile.in b/gdb/gdbserver/Makefile.in
> index 2dbf9ae63d..f2936920fe 100644
> --- a/gdb/gdbserver/Makefile.in
> +++ b/gdb/gdbserver/Makefile.in
> @@ -209,6 +209,7 @@ SFILES = \
>  	$(srcdir)/common/gdb_tilde_expand.c \
>  	$(srcdir)/common/gdb_vecs.c \
>  	$(srcdir)/common/new-op.c \
> +	$(srcdir)/common/pathstuff.c \
>  	$(srcdir)/common/print-utils.c \
>  	$(srcdir)/common/ptid.c \
>  	$(srcdir)/common/rsp-low.c \
> @@ -249,6 +250,7 @@ OBS = \
>  	common/gdb_tilde_expand.o \
>  	common/gdb_vecs.o \
>  	common/new-op.o \
> +	common/pathstuff.o \
>  	common/print-utils.o \
>  	common/ptid.o \
>  	common/rsp-low.o \
> diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c
> index cb02b58507..922d5269b3 100644
> --- a/gdb/gdbserver/server.c
> +++ b/gdb/gdbserver/server.c
> @@ -56,6 +56,10 @@
>        break;					\
>      }
>  
> +/* String containing the current directory (what getwd would return).  */
> +
> +char *current_directory;
> +
>  /* The environment to pass to the inferior when creating it.  */
>  
>  static gdb_environ our_environ;
> @@ -3539,6 +3543,13 @@ captured_main (int argc, char *argv[])
>    const char *selftest_filter = NULL;
>  #endif
>  
> +  current_directory = getcwd (NULL, 0);
> +  if (current_directory == NULL)
> +    {
> +      error (_("%s: error finding working directory"),
> +	     safe_strerror (errno));
> +    }
> +
>    while (*next_arg != NULL && **next_arg == '-')
>      {
>        if (strcmp (*next_arg, "--version") == 0)
> diff --git a/gdb/guile/scm-safe-call.c b/gdb/guile/scm-safe-call.c
> index a9ce7b72c1..2cba399e23 100644
> --- a/gdb/guile/scm-safe-call.c
> +++ b/gdb/guile/scm-safe-call.c
> @@ -23,6 +23,7 @@
>  #include "defs.h"
>  #include "filenames.h"
>  #include "guile-internal.h"
> +#include "common/pathstuff.h"
>  
>  /* Struct to marshall args to scscm_safe_call_body.  */
>  
> diff --git a/gdb/linux-thread-db.c b/gdb/linux-thread-db.c
> index 5ba4c03df6..10c85f56ad 100644
> --- a/gdb/linux-thread-db.c
> +++ b/gdb/linux-thread-db.c
> @@ -46,6 +46,7 @@
>  #include <ctype.h>
>  #include "nat/linux-namespaces.h"
>  #include <algorithm>
> +#include "common/pathstuff.h"
>  
>  /* GNU/Linux libthread_db support.
>  
> diff --git a/gdb/main.c b/gdb/main.c
> index 3c98787edb..189266f90e 100644
> --- a/gdb/main.c
> +++ b/gdb/main.c
> @@ -46,6 +46,7 @@
>  #include "infrun.h"
>  #include "signals-state-save-restore.h"
>  #include <vector>
> +#include "common/pathstuff.h"
>  
>  /* The selected interpreter.  This will be used as a set command
>     variable, so it should always be malloc'ed - since
> diff --git a/gdb/nto-tdep.c b/gdb/nto-tdep.c
> index 8eb864b871..82a4fcbbb9 100644
> --- a/gdb/nto-tdep.c
> +++ b/gdb/nto-tdep.c
> @@ -32,6 +32,7 @@
>  #include "gdbcore.h"
>  #include "objfiles.h"
>  #include "source.h"
> +#include "common/pathstuff.h"
>  
>  #define QNX_NOTE_NAME	"QNX"
>  #define QNX_INFO_SECT_NAME "QNX_info"
> diff --git a/gdb/objfiles.c b/gdb/objfiles.c
> index 70e369b8b4..a9aaf89540 100644
> --- a/gdb/objfiles.c
> +++ b/gdb/objfiles.c
> @@ -52,6 +52,7 @@
>  #include "solist.h"
>  #include "gdb_bfd.h"
>  #include "btrace.h"
> +#include "common/pathstuff.h"
>  
>  #include <vector>
>  
> diff --git a/gdb/source.c b/gdb/source.c
> index 8a27b2e666..04ee3b33d2 100644
> --- a/gdb/source.c
> +++ b/gdb/source.c
> @@ -44,6 +44,7 @@
>  #include "readline/readline.h"
>  #include "common/enum-flags.h"
>  #include <algorithm>
> +#include "common/pathstuff.h"
>  
>  #define OPEN_MODE (O_RDONLY | O_BINARY)
>  #define FDOPEN_MODE FOPEN_RB
> diff --git a/gdb/symtab.c b/gdb/symtab.c
> index 0fd3f3a30f..567195304f 100644
> --- a/gdb/symtab.c
> +++ b/gdb/symtab.c
> @@ -66,6 +66,7 @@
>  #include "filename-seen-cache.h"
>  #include "arch-utils.h"
>  #include <algorithm>
> +#include "common/pathstuff.h"
>  
>  /* Forward declarations for local functions.  */
>  
> diff --git a/gdb/utils.c b/gdb/utils.c
> index c531748fe4..577f9df4ec 100644
> --- a/gdb/utils.c
> +++ b/gdb/utils.c
> @@ -70,6 +70,7 @@
>  #include "common/gdb_optional.h"
>  #include "cp-support.h"
>  #include <algorithm>
> +#include "common/pathstuff.h"
>  
>  #if !HAVE_DECL_MALLOC
>  extern PTR malloc ();		/* ARI: PTR */
> @@ -2838,57 +2839,6 @@ string_to_core_addr (const char *my_string)
>    return addr;
>  }
>  
> -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 gdb::unique_xmalloc_ptr<char> (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 gdb::unique_xmalloc_ptr<char> (xstrdup (filename));
> -}
> -
>  #if GDB_SELF_TEST
>  
>  static void
> @@ -2925,74 +2875,6 @@ gdb_realpath_tests ()
>  
>  #endif /* GDB_SELF_TEST */
>  
> -/* Return a copy of FILENAME, with its directory prefix canonicalized
> -   by gdb_realpath.  */
> -
> -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 gdb::unique_xmalloc_ptr<char> (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);
> -}
> -
> -/* 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.  */
> -
> -gdb::unique_xmalloc_ptr<char>
> -gdb_abspath (const char *path)
> -{
> -  gdb_assert (path != NULL && path[0] != '\0');
> -
> -  if (path[0] == '~')
> -    return gdb::unique_xmalloc_ptr<char> (tilde_expand (path));
> -
> -  if (IS_ABSOLUTE_PATH (path))
> -    return gdb::unique_xmalloc_ptr<char> (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));
> -}
> -
>  ULONGEST
>  align_up (ULONGEST v, int n)
>  {
> diff --git a/gdb/utils.h b/gdb/utils.h
> index b234762929..8ca3eb0369 100644
> --- a/gdb/utils.h
> +++ b/gdb/utils.h
> @@ -295,12 +295,6 @@ extern struct cleanup *make_bpstat_clear_actions_cleanup (void);
>  
>  /* Path utilities.  */
>  
> -extern gdb::unique_xmalloc_ptr<char> gdb_realpath (const char *);
> -
> -extern gdb::unique_xmalloc_ptr<char> gdb_realpath_keepfile (const char *);
> -
> -extern gdb::unique_xmalloc_ptr<char> gdb_abspath (const char *);
> -
>  extern int gdb_filename_fnmatch (const char *pattern, const char *string,
>  				 int flags);
>  
> -- 
> 2.14.3

-- 
Sergio
GPG key ID: 237A 54B1 0287 28BF 00EF  31F4 D0EB 7628 65FC 5E36
Please send encrypted e-mail if possible
http://sergiodj.net/


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]