Index: gcc/gcc/dwarf2out.c =================================================================== --- gcc.orig/gcc/dwarf2out.c 2011-02-12 19:46:22.000000000 +0100 +++ gcc/gcc/dwarf2out.c 2011-02-24 10:01:08.286708200 +0100 @@ -21560,7 +21560,7 @@ file_table_eq (const void *p1_p, const v const struct dwarf_file_data *const p1 = (const struct dwarf_file_data *) p1_p; const char *const p2 = (const char *) p2_p; - return strcmp (p1->filename, p2) == 0; + return filename_cmp (p1->filename, p2) == 0; } static hashval_t @@ -21591,7 +21591,7 @@ lookup_filename (const char *file_name) call matches this file name. If so, return the index. */ if (file_table_last_lookup && (file_name == file_table_last_lookup->filename - || strcmp (file_table_last_lookup->filename, file_name) == 0)) + || filename_cmp (file_table_last_lookup->filename, file_name) == 0)) return file_table_last_lookup; /* Didn't match the previous lookup, search the table. */ Index: gcc/gcc/final.c =================================================================== --- gcc.orig/gcc/final.c 2011-02-02 08:18:28.000000000 +0100 +++ gcc/gcc/final.c 2011-02-24 09:59:37.412510500 +0100 @@ -1492,7 +1492,7 @@ remap_debug_filename (const char *filena size_t name_len; for (map = debug_prefix_maps; map; map = map->next) - if (strncmp (filename, map->old_prefix, map->old_len) == 0) + if (filename_ncmp (filename, map->old_prefix, map->old_len) == 0) break; if (!map) return filename; Index: gcc/include/filenames.h =================================================================== --- gcc.orig/include/filenames.h 2010-09-09 16:15:02.000000000 +0200 +++ gcc/include/filenames.h 2011-02-24 10:17:55.807335100 +0100 @@ -73,6 +73,9 @@ extern "C" { extern int filename_cmp (const char *s1, const char *s2); #define FILENAME_CMP(s1, s2) filename_cmp(s1, s2) +extern int filename_ncmp (const char *s1, const char *s2, + size_t n); + #ifdef __cplusplus } #endif Index: gcc/libiberty/filename_cmp.c =================================================================== --- gcc.orig/libiberty/filename_cmp.c 2010-09-09 16:15:04.000000000 +0200 +++ gcc/libiberty/filename_cmp.c 2011-02-24 10:28:56.891147000 +0100 @@ -76,3 +76,52 @@ filename_cmp (const char *s1, const char #endif } +/* + +@deftypefn Extension int filename_ncmp (const char *@var{s1}, const char *@var{s2}, size_t @var{n}) + +Return zero if the two file names @var{s1} and @var{s2} are equivalent +in range @var{n}. +If not equivalent, the returned value is similar to what @code{strncmp} +would return. In other words, it returns a negative value if @var{s1} +is less than @var{s2}, or a positive value if @var{s2} is greater than +@var{s2}. + +This function does not normalize file names. As a result, this function +will treat filenames that are spelled differently as different even in +the case when the two filenames point to the same underlying file. +However, it does handle the fact that on DOS-like file systems, forward +and backward slashes are equal. + +@end deftypefn + +*/ + +int +filename_ncmp (const char *s1, const char *s2, size_t n) +{ +#ifndef HAVE_DOS_BASED_FILE_SYSTEM + return strncmp(s1, s2, n); +#else + if (!n) + return 0; + for (; n > 0; --n) + { + 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 == '\0' || c1 != c2) + return (c1 - c2); + + s1++; + s2++; + } + return 0; +#endif +} Index: gcc/libiberty/functions.texi =================================================================== --- gcc.orig/libiberty/functions.texi 2011-02-03 21:36:57.000000000 +0100 +++ gcc/libiberty/functions.texi 2011-02-24 10:14:02.136969900 +0100 @@ -296,6 +296,24 @@ and backward slashes are equal. @end deftypefn +@c filename_cmp.c:81 +@deftypefn Extension int filename_ncmp (const char *@var{s1}, const char *@var{s2}, size_t @var{n}) + +Return zero if the two file names @var{s1} and @var{s2} are equivalent +in range @var{n}. +If not equivalent, the returned value is similar to what @code{strncmp} +would return. In other words, it returns a negative value if @var{s1} +is less than @var{s2}, or a positive value if @var{s2} is greater than +@var{s2}. + +This function does not normalize file names. As a result, this function +will treat filenames that are spelled differently as different even in +the case when the two filenames point to the same underlying file. +However, it does handle the fact that on DOS-like file systems, forward +and backward slashes are equal. + +@end deftypefn + @c fnmatch.txh:1 @deftypefn Replacement int fnmatch (const char *@var{pattern}, @ const char *@var{string}, int @var{flags})