From: Kai Tietz Date: Mon, 28 Feb 2011 18:23:25 +0000 (+0000) Subject: re PR debug/28047 (DWARF output_file_names should really understand DOS pathnames) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=94369251651270268df0a79ea5917265617b7fb4;p=gcc.git re PR debug/28047 (DWARF output_file_names should really understand DOS pathnames) 2011-02-28 Kai Tietz PR debug/28047 * dwarf2out.c (file_table_eq): Use filename_cmp instead of strcmp. (lookup_filename): Likewise. * final.c (remap_debug_filename): Use filename_ncmp instead of strncmp. 2011-02-28 Kai Tietz * filename_cmp.c (filename_ncmp): New function. * functions.texi: Regenerated. 2011-02-28 Kai Tietz * filenames.h (filename_ncmp): New prototype. From-SVN: r170570 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c4c7a13052c..b50ed6f2ab3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2011-02-28 Kai Tietz + + PR debug/28047 + * dwarf2out.c (file_table_eq): Use filename_cmp instead of strcmp. + (lookup_filename): Likewise. + * final.c (remap_debug_filename): Use filename_ncmp instead of + strncmp. + 2011-02-28 Bernd Schmidt Jakub Jelinek diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index fea820967f9..1450e806556 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -21560,7 +21560,7 @@ file_table_eq (const void *p1_p, const void *p2_p) 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. */ diff --git a/gcc/final.c b/gcc/final.c index ceb79744c41..1e1424feabc 100644 --- a/gcc/final.c +++ b/gcc/final.c @@ -1492,7 +1492,7 @@ remap_debug_filename (const char *filename) 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; diff --git a/include/ChangeLog b/include/ChangeLog index 709d9c60998..c4ec00efe6d 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,3 +1,7 @@ +2011-02-28 Kai Tietz + + * filenames.h (filename_ncmp): New prototype. + 2011-02-23 Kai Tietz * dwarf2.h (_ELF_DWARF2_H): Renamed to diff --git a/include/filenames.h b/include/filenames.h index ca23d325314..d4955df661c 100644 --- a/include/filenames.h +++ b/include/filenames.h @@ -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 diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog index da4b2be6b9d..dc926382a8e 100644 --- a/libiberty/ChangeLog +++ b/libiberty/ChangeLog @@ -1,3 +1,8 @@ +2011-02-28 Kai Tietz + + * filename_cmp.c (filename_ncmp): New function. + * functions.texi: Regenerated. + 2011-02-03 Ralf Wildenhues * splay-tree.c: Escape wrapping newlines in texinfo markup diff --git a/libiberty/filename_cmp.c b/libiberty/filename_cmp.c index 0a4d0d85091..0eed12086bf 100644 --- a/libiberty/filename_cmp.c +++ b/libiberty/filename_cmp.c @@ -76,3 +76,52 @@ filename_cmp (const char *s1, const char *s2) #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 +} diff --git a/libiberty/functions.texi b/libiberty/functions.texi index f6d0a23f1e6..c9df186be0f 100644 --- a/libiberty/functions.texi +++ b/libiberty/functions.texi @@ -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})