From: Joel Brobecker <brobecker@adacore.com>
To: gcc-patches@gcc.gnu.org
Cc: gdb-patches@sourceware.org
Subject: [RFA/libiberty] Enhance FILENAME_CMP for Windows filesystems
Date: Wed, 28 Mar 2007 19:17:00 -0000 [thread overview]
Message-ID: <20070328191845.GB3956@adacore.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 2236 bytes --]
Hello,
We are using the FILENAME_CMP macro in GDB quite a bit, and it is
currently defined in include/filenames.h as:
#define FILENAME_CMP(s1, s2) strcasecmp(s1, s2)
This is for "DOSish" filesystems. For other filesystems, it's defined as
a straight strcmp:
#define FILENAME_CMP(s1, s2) strcmp(s1, s2)
I came across a case where the DWARF debug info unfortunately used '\'
as the directory separator in one case (in the .debug_info section),
while using '/' in another case (in the .debug_line section).
As a result, FILENAME_CMP returned that the following two files were
not equal:
c:\cygwin\home\brobecke\tgdb\ex\\foo.adb
c:/cygwin/home/brobecke/tgdb/ex//foo.adb
This causes the following problem in GDB, when we compile the unit
by giving GCC the full path name to the associated file, such as:
% gcc -c -g c:\full\path\to\foo.adb
The GDB error looks like this:
% gdb foo
(gdb) b foo.adb:3
No line 3 in file "c:\cygwin\home\brobecke\tgdb\ex\\foo.adb".
I propose to add a new filename_cmp function to libiberty:
- On Unix, no change, it calls strcmp
- On Windows, we make slash and backslash equal.
This is a modest improvement, since there are many other things we
can do to enhance it (such as normalizing the path so that '//' and '/'
are treated as equal for instance). But this paves the path for
further improvements of that sort. And in the meantime, if fixes
the problem we are facing.
For that, I added a new file, filename_cmp.c, updated the Makefile
to add this file to the list of required objects, and then changed
the FILENAME_CMP define to unconditionally call this new function.
libiberty/ change:
2007-03-28 Joel Brobecker <brobecker@adacore.com>
* filename_cmp.c: New file.
* Makefile.in (CFILES): Add filename_cmp.c.
(REQUIRED_OFILES): Add filename_cmp.o
(filename_cmp.o): New rule.
include/ change:
2007-03-28 Joel Brobecker <brobecker@adacore.com>
* filenames.h (FILENAME_CMP): Adjust define to call filename_cmp
regardless of the type of file system.
Tested on x86-linux and x86-windows, without any regression (using
the GDB testsuite).
OK to apply?
Thank you,
--
Joel
[-- Attachment #2: filename_cmp.c --]
[-- Type: text/plain, Size: 1959 bytes --]
/* File name comparison routine.
*
Copyright (C) 2007 Free Software Foundation, Inc.
This file is part of the libiberty library, which is part of GCC.
This file 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 2 of the License, or
(at your option) any later version.
In addition to the permissions in the GNU General Public License, the
Free Software Foundation gives you unlimited permission to link the
compiled version of this file into combinations with other programs,
and to distribute those combinations without any restriction coming
from the use of this file. (The General Public License restrictions
do apply in other respects; for example, they cover modification of
the file, and distribution when not linked into a combined
executable.)
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, write to the Free Software
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifdef HAVE_STRING_H
#include <string.h>
#endif
#include <ctype.h>
#include "filenames.h"
int
filename_cmp (const char *s1, const char *s2)
{
#ifndef HAVE_DOS_BASED_FILE_SYSTEM
return strcmp(s1, s2);
#else
for (;;)
{
int c1 = tolower (*s1);
int c2 = tolower (*s2);
/* On DOS-based file systems, the '/' and the '\' are equivalent. */
if (c1 == '/')
c1 = '\\';
if (c2 == '/')
c2 = '\\';
if (c1 != c2)
return (c1 - c2);
if (c1 == '\0')
return 0;
s1++;
s2++;
}
#endif
}
[-- Attachment #3: filename_cmp.diff --]
[-- Type: text/plain, Size: 3385 bytes --]
Index: libiberty/Makefile.in
===================================================================
RCS file: /cvs/src/src/libiberty/Makefile.in,v
retrieving revision 1.85
diff -u -p -r1.85 Makefile.in
--- libiberty/Makefile.in 5 Mar 2007 22:15:38 -0000 1.85
+++ libiberty/Makefile.in 28 Mar 2007 19:16:41 -0000
@@ -1,6 +1,6 @@
#
# Makefile
-# Copyright (C) 1990, 91-99, 2000, 2001, 2002, 2003, 2004, 2005, 2006
+# Copyright (C) 1990, 91-99, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
# Free Software Foundation
#
# This file is part of the libiberty library.
@@ -131,8 +131,8 @@ CFILES = alloca.c argv.c asprintf.c atex
calloc.c choose-temp.c clock.c concat.c cp-demangle.c \
cp-demint.c cplus-dem.c \
dyn-string.c \
- fdmatch.c ffs.c fibheap.c floatformat.c fnmatch.c \
- fopen_unlocked.c \
+ fdmatch.c ffs.c fibheap.c filename_cmp.c floatformat.c \
+ fnmatch.c fopen_unlocked.c \
getcwd.c getopt.c getopt1.c getpagesize.c getpwd.c getruntime.c \
gettimeofday.c \
hashtab.c hex.c \
@@ -165,8 +165,8 @@ REQUIRED_OFILES = ./regex.o ./cplus-dem.
./alloca.o ./argv.o \
./choose-temp.o ./concat.o ./cp-demint.o \
./dyn-string.o \
- ./fdmatch.o ./fibheap.o ./floatformat.o ./fnmatch.o \
- ./fopen_unlocked.o \
+ ./fdmatch.o ./fibheap.o ./filename_cmp.o ./floatformat.o \
+ ./fnmatch.o ./fopen_unlocked.o \
./getopt.o ./getopt1.o ./getpwd.o ./getruntime.o \
./hashtab.o ./hex.o \
./lbasename.o ./lrealpath.o \
@@ -651,6 +651,12 @@ $(CONFIGURED_OFILES): stamp-picdir
else true; fi
$(COMPILE.c) $(srcdir)/fibheap.c $(OUTPUT_OPTION)
+./filename_cmp.o: $(srcdir)/filename_cmp.c $(INCDIR)/filenames.h
+ if [ x"$(PICFLAG)" != x ]; then \
+ $(COMPILE.c) $(PICFLAG) $(srcdir)/filename_cmp.c -o pic/$@; \
+ else true; fi
+ $(COMPILE.c) $(srcdir)/filename_cmp.c $(OUTPUT_OPTION)
+
./floatformat.o: $(srcdir)/floatformat.c config.h $(INCDIR)/ansidecl.h \
$(INCDIR)/floatformat.h $(INCDIR)/libiberty.h
if [ x"$(PICFLAG)" != x ]; then \
Index: include/filenames.h
===================================================================
RCS file: /cvs/src/src/include/filenames.h,v
retrieving revision 1.3
diff -u -p -r1.3 filenames.h
--- include/filenames.h 10 May 2005 10:21:08 -0000 1.3
+++ include/filenames.h 28 Mar 2007 19:16:41 -0000
@@ -5,7 +5,7 @@
use forward- and back-slash in path names interchangeably, and
some of them have case-insensitive file names.
- Copyright 2000, 2001 Free Software Foundation, Inc.
+ Copyright 2000, 2001, 2007 Free Software Foundation, Inc.
This file is part of BFD, the Binary File Descriptor library.
@@ -38,14 +38,15 @@ Foundation, Inc., 51 Franklin Street - F
want to know whether to prepend the current working directory to
a file name, which should not be done with a name like d:foo. */
#define IS_ABSOLUTE_PATH(f) (IS_DIR_SEPARATOR((f)[0]) || (((f)[0]) && ((f)[1] == ':')))
-#define FILENAME_CMP(s1, s2) strcasecmp(s1, s2)
#else /* not DOSish */
#define IS_DIR_SEPARATOR(c) ((c) == '/')
#define IS_ABSOLUTE_PATH(f) (IS_DIR_SEPARATOR((f)[0]))
-#define FILENAME_CMP(s1, s2) strcmp(s1, s2)
#endif /* not DOSish */
+extern int filename_cmp (const char *s1, const char *s2);
+#define FILENAME_CMP(s1, s2) filename_cmp(s1, s2)
+
#endif /* FILENAMES_H */
next reply other threads:[~2007-03-28 19:17 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-03-28 19:17 Joel Brobecker [this message]
2007-03-28 19:31 ` DJ Delorie
2007-03-28 19:36 ` Joel Brobecker
2007-03-28 20:23 ` Joel Brobecker
2007-03-28 20:44 ` DJ Delorie
2007-03-29 20:56 ` Joel Brobecker
2007-03-29 21:02 ` Joel Brobecker
2007-03-29 21:03 ` Daniel Jacobowitz
2007-03-29 21:07 ` DJ Delorie
2007-03-29 21:44 ` Joel Brobecker
2007-03-31 11:57 ` Eli Zaretskii
2007-03-31 22:40 ` Christopher Faylor
2007-04-01 3:04 ` Eli Zaretskii
2007-04-02 7:01 ` Joel Brobecker
2007-04-01 20:58 ` Andreas Schwab
2007-04-02 6:34 ` Joel Brobecker
2007-04-02 11:21 ` Andreas Schwab
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20070328191845.GB3956@adacore.com \
--to=brobecker@adacore.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=gdb-patches@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox