From patchwork Thu Feb 24 09:50:33 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kai Tietz X-Patchwork-Id: 84373 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id 24E55B711E for ; Thu, 24 Feb 2011 20:50:44 +1100 (EST) Received: (qmail 32195 invoked by alias); 24 Feb 2011 09:50:42 -0000 Received: (qmail 32175 invoked by uid 22791); 24 Feb 2011 09:50:40 -0000 X-SWARE-Spam-Status: No, hits=-1.1 required=5.0 tests=AWL, BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, RFC_ABUSE_POST X-Spam-Check-By: sourceware.org Received: from mail-qy0-f175.google.com (HELO mail-qy0-f175.google.com) (209.85.216.175) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 24 Feb 2011 09:50:36 +0000 Received: by qyk35 with SMTP id 35so3975465qyk.20 for ; Thu, 24 Feb 2011 01:50:34 -0800 (PST) MIME-Version: 1.0 Received: by 10.229.215.70 with SMTP id hd6mr433413qcb.102.1298541033766; Thu, 24 Feb 2011 01:50:33 -0800 (PST) Received: by 10.229.89.197 with HTTP; Thu, 24 Feb 2011 01:50:33 -0800 (PST) Date: Thu, 24 Feb 2011 10:50:33 +0100 Message-ID: Subject: [patch libiberty include gcc]: PR debug/28047 DWARF output_file_names should really understand DOS pathnames From: Kai Tietz To: GCC Patches , Binutils , gdb-patches@sourceware.org Cc: Jason Merrill , Nick Clifton X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Hello, For this PR (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=28047) most things are already fixed. Just one point isn't handled correct for DOS-filesystem. As DOS-filesystem normally uses case-insensitive path/file-names and backslash/slash as path-separators, a comparision of file/path-names via strcmp/strncmp isn't suitable. I found in libiberty, that there is alread the filename_cmp function, which handles it proper. As in source also strncmp is used, I added to libiberty the new function filename_ncmp, which is for none-DOS file-systems just the strncmp function, and for DOS-case an implementation of strncasecmp with special handling for the path-separators. ChangeLog gcc/ 2011-02-24 Kai Tietz PR debug/28047 * dwarf2out.c (file_table_eq): Use filename_cmp instead of strcmp. * dwarf2out.c (lookup_filename): Likewise. * final.c (remap_debug_filename): Use filename_ncmp instead of strncmp. ChangeLog /include 2011-02-24 Kai Tietz * filenames.h (filename_ncmp): New prototype. ChangeLog /libiberty 2011-02-24 Kai Tietz * filename_cmp.c (filename_ncmp): New function. * functions.texi: Regenerated. Tested for i686-pc-mingw32, x86_64-w64-mingw32, and regression-tested for x86_64-pc-linux-gnu. Ok for apply? Regards, Kai 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})