From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 130491 invoked by alias); 28 Feb 2018 16:39:36 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 130481 invoked by uid 89); 28 Feb 2018 16:39:35 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-24.5 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_SHORT,TRACKER_ID,T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 spammy= X-HELO: mx1.redhat.com Received: from mx3-rdu2.redhat.com (HELO mx1.redhat.com) (66.187.233.73) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 28 Feb 2018 16:39:32 +0000 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 83F4481902AB; Wed, 28 Feb 2018 16:39:30 +0000 (UTC) Received: from localhost (unused-10-15-17-196.yyz.redhat.com [10.15.17.196]) by smtp.corp.redhat.com (Postfix) with ESMTP id 57DE12024CA8; Wed, 28 Feb 2018 16:39:30 +0000 (UTC) From: Sergio Durigan Junior To: GDB Patches Cc: Simon Marchi , Pedro Alves , Joel Brobecker Subject: Re: [PATCH v3 1/2] Create new common/pathstuff.[ch] References: <20180210014241.19278-3-sergiodj@redhat.com> <20180228032708.19670-1-sergiodj@redhat.com> <20180228032708.19670-2-sergiodj@redhat.com> Date: Wed, 28 Feb 2018 16:39:00 -0000 In-Reply-To: <20180228032708.19670-2-sergiodj@redhat.com> (Sergio Durigan Junior's message of "Tue, 27 Feb 2018 22:27:07 -0500") Message-ID: <87inahkr0d.fsf@redhat.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-IsSubscribed: yes X-SW-Source: 2018-02/txt/msg00468.txt.bz2 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 > > * 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 > > * 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 > +#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 > +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 (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. */ > +extern gdb::unique_xmalloc_ptr 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 . */ > + > +#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 > +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 (xstrdup (buf)); > + } > +#else > + { > + char *rp = canonicalize_file_name (filename); > + > + if (rp != NULL) > + return gdb::unique_xmalloc_ptr (rp); > + } > +#endif > + > + /* This system is a lost cause, just dup the buffer. */ > + return gdb::unique_xmalloc_ptr (xstrdup (filename)); > +} > + > +/* See common/pathstuff.h. */ > + > +gdb::unique_xmalloc_ptr > +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 (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 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 (result); > +} > + > +/* See common/pathstuff.h. */ > + > +gdb::unique_xmalloc_ptr > +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 (xstrdup (path)); > + > + /* Beware the // my son, the Emacs barfs, the botch that catch... */ > + return gdb::unique_xmalloc_ptr > + (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 . */ > + > +#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 gdb_realpath (const char *filename); > + > +/* Return a copy of FILENAME, with its directory prefix canonicalized > + by gdb_realpath. */ > + > +extern gdb::unique_xmalloc_ptr > + 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 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 > #include > #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 > #include "solist.h" > #include > +#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 > #include "nat/linux-namespaces.h" > #include > +#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 > +#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 > > 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 > +#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 > +#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 > +#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 > -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 (xstrdup (buf)); > - } > -#else > - { > - char *rp = canonicalize_file_name (filename); > - > - if (rp != NULL) > - return gdb::unique_xmalloc_ptr (rp); > - } > -#endif > - > - /* This system is a lost cause, just dup the buffer. */ > - return gdb::unique_xmalloc_ptr (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 > -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 (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 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 (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 > -gdb_abspath (const char *path) > -{ > - gdb_assert (path != NULL && path[0] != '\0'); > - > - if (path[0] == '~') > - return gdb::unique_xmalloc_ptr (tilde_expand (path)); > - > - if (IS_ABSOLUTE_PATH (path)) > - return gdb::unique_xmalloc_ptr (xstrdup (path)); > - > - /* Beware the // my son, the Emacs barfs, the botch that catch... */ > - return gdb::unique_xmalloc_ptr > - (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 gdb_realpath (const char *); > - > -extern gdb::unique_xmalloc_ptr gdb_realpath_keepfile (const char *); > - > -extern gdb::unique_xmalloc_ptr 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/