From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 11374 invoked by alias); 2 Aug 2012 21:55:54 -0000 Received: (qmail 11355 invoked by uid 22791); 2 Aug 2012 21:55:52 -0000 X-SWARE-Spam-Status: No, hits=-2.9 required=5.0 tests=AWL,BAYES_00,KHOP_THREADED,TW_TR X-Spam-Check-By: sourceware.org Received: from toast.topped-with-meat.com (HELO topped-with-meat.com) (204.197.218.159) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 02 Aug 2012 21:55:31 +0000 Received: by topped-with-meat.com (Postfix, from userid 5281) id 93E2E2C0A9; Thu, 2 Aug 2012 14:55:30 -0700 (PDT) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit From: Roland McGrath To: , Subject: [PATCH roland/dirent64] clean up wordsize-64 struct dirent functions In-Reply-To: Roland McGrath's message of Thursday, 2 August 2012 14:46:48 -0700 <20120802214648.64D7C2C0AA@topped-with-meat.com> References: <20120802172110.E4A912C0DF@topped-with-meat.com> <20120802214648.64D7C2C0AA@topped-with-meat.com> Message-Id: <20120802215530.93E2E2C0A9@topped-with-meat.com> Date: Thu, 02 Aug 2012 21:55:00 -0000 X-CMAE-Score: 0 X-CMAE-Analysis: v=2.0 cv=e8d9udV/ c=1 sm=1 a=tLiCUHaWd6oA:10 a=Z6MIti7PxpgA:10 a=kj9zAlcOel0A:10 a=hOe2yjtxAAAA:8 a=14OXPxybAAAA:8 a=CCpqsmhAAAAA:8 a=mDV3o1hIAAAA:8 a=ZGFsorpA04bCkgrTAvoA:9 a=CjuIK1q_8ugA:10 a=icsXBzGWvBoA:10 a=VGTTP80nfFtF7lVp:21 a=W8Vu-gZ4ZFWEDviO:21 a=WkljmVdYkabdwxfqvArNOQ==:117 X-IsSubscribed: yes Mailing-List: contact libc-ports-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: libc-ports-owner@sourceware.org X-SW-Source: 2012-08/txt/msg00024.txt.bz2 This patch is on the roland/dirent64 branch, which forks from the roland/off64_t branch (the patch won't apply to master). It removes from sysdeps/wordsize-64 the various functions using 'struct dirent' and 'struct dirent64' where those types are identical. I added an __INO_T_MATCHES_INO64_T macro to bits/typesizes.h analogous to __OFF_T_MATCHES_OFF64_T. Then sysdeps/unix/sysv/linux/bits/dirent.h (shared by all machines) defines _DIRENT_MATCHES_DIRENT64 if both __OFF_T_MATCHES_OFF64_T and __INO_T_MATCHES_INO64_T are defined, since the use of those types is the only difference between dirent and dirent64. As before, I've tested that no code changed on x86_64-linux-gnu. I think it should cover all wordsize-64 configurations, but they should be tested: alpha, ia64, mips64, tilegx64, powerpc64, s390x, sparc64 See my last message about roland/off64_t for testing suggestions: http://sourceware.org/ml/libc-alpha/2012-08/msg00054.html Since this branch includes roland/off64_t, folks might as well just test roland/dirent64 first and look no further unless there are problems. Thanks, Roland 2012-08-02 Roland McGrath * dirent/alphasort.c [_DIRENT_MATCHES_DIRENT64]: Define alphasort64 as an alias. * dirent/versionsort.c [_DIRENT_MATCHES_DIRENT64]: Define versionsort64 as an alias. * dirent/scandir.c [_DIRENT_MATCHES_DIRENT64]: Define scandir64 as an alias. * dirent/scandirat.c [_DIRENT_MATCHES_DIRENT64]: Define scandirat64 as an alias. * dirent/alphasort64.c (alphasort64): Conditionalize on [!_DIRENT_MATCHES_DIRENT64]. * dirent/versionsort64.c: Likewise. * dirent/scandir64.c: Likewise. * dirent/scandirat64.c: Likewise. * sysdeps/wordsize-64/alphasort.c: File removed. * sysdeps/wordsize-64/alphasort64.c: File removed. * sysdeps/wordsize-64/scandir.c: File removed. * sysdeps/wordsize-64/scandir64.c: File removed. * sysdeps/wordsize-64/scandirat.c: File removed. * sysdeps/wordsize-64/scandirat64.c: File removed. * sysdeps/wordsize-64/versionsort.c: File removed. * sysdeps/wordsize-64/versionsort64.c: File removed. * bits/typesizes.h [__LP64__] (__INO_T_MATCHES_INO64_T): New macros. * sysdeps/unix/sysv/linux/s390/bits/typesizes.h: [__s390x__] (__INO_T_MATCHES_INO64_T): New macro. * sysdeps/unix/sysv/linux/sparc/bits/typesizes.h [defined __arch64__ || defined __sparcv9] (__INO_T_MATCHES_INO64_T): New macro. * sysdeps/unix/sysv/linux/x86/bits/typesizes.h [__x86_64__] (__INO_T_MATCHES_INO64_T): New macro. * bits/dirent.h (_DIRENT_MATCHES_DIRENT64): New macro. * sysdeps/unix/sysv/linux/bits/dirent.h [defined __OFF_T_MATCHES_OFF64_T && defined __INO_T_MATCHES_INO64_T] (_DIRENT_MATCHES_DIRENT64): New macro. ports/ChangeLog.alpha 2012-08-02 Roland McGrath * sysdeps/unix/sysv/linux/alpha/bits/dirent.h (_DIRENT_MATCHES_DIRENT64): New macro. diff --git a/bits/dirent.h b/bits/dirent.h index ac1928d..5b803c6 100644 --- a/bits/dirent.h +++ b/bits/dirent.h @@ -1,5 +1,5 @@ /* Directory entry structure `struct dirent'. Stub version. - Copyright (C) 1996, 1997 Free Software Foundation, Inc. + Copyright (C) 1996-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -33,3 +33,6 @@ struct dirent64 int d_fileno; }; #endif + +/* Inform libc code that these two types are identical. */ +#define _DIRENT_MATCHES_DIRENT64 1 diff --git a/bits/typesizes.h b/bits/typesizes.h index 09959f2..c3debd0 100644 --- a/bits/typesizes.h +++ b/bits/typesizes.h @@ -66,6 +66,9 @@ for all ABI purposes, even if possibly expressed as different base types for C type-checking purposes. */ # define __OFF_T_MATCHES_OFF64_T 1 + +/* Same for ino_t and ino64_t. */ +# define __INO_T_MATCHES_INO64_T 1 #endif /* Number of descriptors that can fit in an `fd_set'. */ diff --git a/dirent/alphasort.c b/dirent/alphasort.c index 5939322..6fab7f8 100644 --- a/dirent/alphasort.c +++ b/dirent/alphasort.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1992, 1997, 1998, 2009 Free Software Foundation, Inc. +/* Copyright (C) 1992-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -15,7 +15,15 @@ License along with the GNU C Library; if not, see . */ +/* We need to avoid the header declaration of alphasort64, because + the types don't match alphasort and then the compiler will + complain about the mismatch when we do the alias below. */ +#define alphasort64 __renamed_alphasort64 + #include + +#undef alphasort64 + #include int @@ -23,3 +31,7 @@ alphasort (const struct dirent **a, const struct dirent **b) { return strcoll ((*a)->d_name, (*b)->d_name); } + +#ifdef _DIRENT_MATCHES_DIRENT64 +weak_alias (alphasort, alphasort64) +#endif diff --git a/dirent/alphasort64.c b/dirent/alphasort64.c index 4f5c1dd..a4d37ab 100644 --- a/dirent/alphasort64.c +++ b/dirent/alphasort64.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1992, 1997, 1998, 2000, 2009 Free Software Foundation, Inc. +/* Copyright (C) 1992-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -18,8 +18,13 @@ #include #include +/* alphasort.c defines alphasort64 as an alias if _DIRENT_MATCHES_DIRENT64. */ +#ifndef _DIRENT_MATCHES_DIRENT64 + int alphasort64 (const struct dirent64 **a, const struct dirent64 **b) { return strcoll ((*a)->d_name, (*b)->d_name); } + +#endif diff --git a/dirent/scandir.c b/dirent/scandir.c index 8b0a87b..6dce54d 100644 --- a/dirent/scandir.c +++ b/dirent/scandir.c @@ -1,5 +1,4 @@ -/* Copyright (C) 1992-1998,2000,2002,2003,2009,2011 - Free Software Foundation, Inc. +/* Copyright (C) 1992-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -16,7 +15,15 @@ License along with the GNU C Library; if not, see . */ +/* We need to avoid the header declaration of scandir64, because + the types don't match scandir and then the compiler will + complain about the mismatch when we do the alias below. */ +#define scandir64 __renamed_scandir64 + #include + +#undef scandir64 + #include #ifndef SCANDIR @@ -35,3 +42,7 @@ SCANDIR (dir, namelist, select, cmp) { return SCANDIRAT (AT_FDCWD, dir, namelist, select, cmp); } + +#ifdef _DIRENT_MATCHES_DIRENT64 +weak_alias (scandir, scandir64) +#endif diff --git a/dirent/scandir64.c b/dirent/scandir64.c index 78ac570..bba302f 100644 --- a/dirent/scandir64.c +++ b/dirent/scandir64.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2000, 2009, 2011 Free Software Foundation, Inc. +/* Copyright (C) 2000-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -17,8 +17,13 @@ #include +/* scandir.c defines scandir64 as an alias if _DIRENT_MATCHES_DIRENT64. */ +#ifndef _DIRENT_MATCHES_DIRENT64 + #define SCANDIR scandir64 #define SCANDIRAT scandirat64 #define DIRENT_TYPE struct dirent64 #include + +#endif diff --git a/dirent/scandirat.c b/dirent/scandirat.c index 13bd574..c2704ba 100644 --- a/dirent/scandirat.c +++ b/dirent/scandirat.c @@ -1,5 +1,4 @@ -/* Copyright (C) 1992-1998,2000,2002,2003,2009,2011 - Free Software Foundation, Inc. +/* Copyright (C) 1992-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -16,7 +15,15 @@ License along with the GNU C Library; if not, see . */ +/* We need to avoid the header declaration of scandir64, because + the types don't match scandir and then the compiler will + complain about the mismatch when we do the alias below. */ +#define scandirat64 __renamed_scandirat64 + #include + +#undef scandirat64 + #include #include #include @@ -141,3 +148,7 @@ SCANDIRAT (dfd, dir, namelist, select, cmp) return c.cnt; } libc_hidden_def (SCANDIRAT) + +#ifdef _DIRENT_MATCHES_DIRENT64 +weak_alias (scandirat, scandirat64) +#endif diff --git a/dirent/scandirat64.c b/dirent/scandirat64.c index a816ee9..608ca33 100644 --- a/dirent/scandirat64.c +++ b/dirent/scandirat64.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2000, 2009, 2011 Free Software Foundation, Inc. +/* Copyright (C) 2000-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -17,9 +17,14 @@ #include +/* scandirat.c defines scandirat64 as an alias if _DIRENT_MATCHES_DIRENT64. */ +#ifndef _DIRENT_MATCHES_DIRENT64 + #define SCANDIRAT scandirat64 #define READDIR __readdir64 #define DIRENT_TYPE struct dirent64 #define SKIP_SCANDIR_CANCEL 1 #include "scandirat.c" + +#endif diff --git a/dirent/versionsort.c b/dirent/versionsort.c index 47bda04..ee34659 100644 --- a/dirent/versionsort.c +++ b/dirent/versionsort.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1992, 1997, 1998, 2009 Free Software Foundation, Inc. +/* Copyright (C) 1992-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -15,7 +15,15 @@ License along with the GNU C Library; if not, see . */ +/* We need to avoid the header declaration of versionsort64, because + the types don't match versionsort and then the compiler will + complain about the mismatch when we do the alias below. */ +#define versionsort64 __renamed_versionsort64 + #include + +#undef versionsort64 + #include int @@ -23,3 +31,7 @@ versionsort (const struct dirent **a, const struct dirent **b) { return __strverscmp ((*a)->d_name, (*b)->d_name); } + +#ifdef _DIRENT_MATCHES_DIRENT64 +weak_alias (versionsort, versionsort64) +#endif diff --git a/dirent/versionsort64.c b/dirent/versionsort64.c index 5b40e10..dca72e8 100644 --- a/dirent/versionsort64.c +++ b/dirent/versionsort64.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1992, 1997, 1998, 2000, 2009 Free Software Foundation, Inc. +/* Copyright (C) 1992-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -18,8 +18,13 @@ #include #include +/* versionsort.c defines a versionsort64 alias if _DIRENT_MATCHES_DIRENT64. */ +#ifndef _DIRENT_MATCHES_DIRENT64 + int versionsort64 (const struct dirent64 **a, const struct dirent64 **b) { return __strverscmp ((*a)->d_name, (*b)->d_name); } + +#endif diff --git a/ports/sysdeps/unix/sysv/linux/alpha/bits/dirent.h b/ports/sysdeps/unix/sysv/linux/alpha/bits/dirent.h index f146466..487ad15 100644 --- a/ports/sysdeps/unix/sysv/linux/alpha/bits/dirent.h +++ b/ports/sysdeps/unix/sysv/linux/alpha/bits/dirent.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. +/* Copyright (C) 1996-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -51,4 +51,7 @@ struct dirent64 #define _DIRENT_HAVE_D_OFF #define _DIRENT_HAVE_D_TYPE +/* Inform libc code that these two types are effectively identical. */ +#define _DIRENT_MATCHES_DIRENT64 1 + #endif /* bits/dirent.h */ diff --git a/ports/sysdeps/unix/sysv/linux/generic/bits/typesizes.h b/ports/sysdeps/unix/sysv/linux/generic/bits/typesizes.h index 670c6d1..d7d2a5c 100644 --- a/ports/sysdeps/unix/sysv/linux/generic/bits/typesizes.h +++ b/ports/sysdeps/unix/sysv/linux/generic/bits/typesizes.h @@ -67,6 +67,9 @@ for all ABI purposes, even if possibly expressed as different base types for C type-checking purposes. */ # define __OFF_T_MATCHES_OFF64_T 1 + +/* Same for ino_t and ino64_t. */ +# define __INO_T_MATCHES_INO64_T 1 #endif /* Number of descriptors that can fit in an `fd_set'. */ diff --git a/sysdeps/unix/sysv/linux/bits/dirent.h b/sysdeps/unix/sysv/linux/bits/dirent.h index 5728618..11daabe 100644 --- a/sysdeps/unix/sysv/linux/bits/dirent.h +++ b/sysdeps/unix/sysv/linux/bits/dirent.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. +/* Copyright (C) 1996-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -50,3 +50,8 @@ struct dirent64 #define _DIRENT_HAVE_D_RECLEN #define _DIRENT_HAVE_D_OFF #define _DIRENT_HAVE_D_TYPE + +#if defined __OFF_T_MATCHES_OFF64_T && defined __INO_T_MATCHES_INO64_T +/* Inform libc code that these two types are effectively identical. */ +# define _DIRENT_MATCHES_DIRENT64 1 +#endif diff --git a/sysdeps/unix/sysv/linux/s390/bits/typesizes.h b/sysdeps/unix/sysv/linux/s390/bits/typesizes.h index bf3d8b7..b630488 100644 --- a/sysdeps/unix/sysv/linux/s390/bits/typesizes.h +++ b/sysdeps/unix/sysv/linux/s390/bits/typesizes.h @@ -72,6 +72,9 @@ for all ABI purposes, even if possibly expressed as different base types for C type-checking purposes. */ # define __OFF_T_MATCHES_OFF64_T 1 + +/* Same for ino_t and ino64_t. */ +# define __INO_T_MATCHES_INO64_T 1 #endif /* Number of descriptors that can fit in an `fd_set'. */ diff --git a/sysdeps/unix/sysv/linux/sparc/bits/typesizes.h b/sysdeps/unix/sysv/linux/sparc/bits/typesizes.h index 7b1f191..e55d642 100644 --- a/sysdeps/unix/sysv/linux/sparc/bits/typesizes.h +++ b/sysdeps/unix/sysv/linux/sparc/bits/typesizes.h @@ -66,6 +66,9 @@ for all ABI purposes, even if possibly expressed as different base types for C type-checking purposes. */ # define __OFF_T_MATCHES_OFF64_T 1 + +/* Same for ino_t and ino64_t. */ +# define __INO_T_MATCHES_INO64_T 1 #endif /* Number of descriptors that can fit in an `fd_set'. */ diff --git a/sysdeps/unix/sysv/linux/x86/bits/typesizes.h b/sysdeps/unix/sysv/linux/x86/bits/typesizes.h index a477627..397e867 100644 --- a/sysdeps/unix/sysv/linux/x86/bits/typesizes.h +++ b/sysdeps/unix/sysv/linux/x86/bits/typesizes.h @@ -78,6 +78,9 @@ for all ABI purposes, even if possibly expressed as different base types for C type-checking purposes. */ # define __OFF_T_MATCHES_OFF64_T 1 + +/* Same for ino_t and ino64_t. */ +# define __INO_T_MATCHES_INO64_T 1 #endif /* Number of descriptors that can fit in an `fd_set'. */ diff --git a/sysdeps/wordsize-64/alphasort.c b/sysdeps/wordsize-64/alphasort.c deleted file mode 100644 index edc4101..0000000 --- a/sysdeps/wordsize-64/alphasort.c +++ /dev/null @@ -1,7 +0,0 @@ -#define alphasort64 rename_alphasort64 - -#include "../../dirent/alphasort.c" - -#undef alphasort64 - -weak_alias (alphasort, alphasort64) diff --git a/sysdeps/wordsize-64/alphasort64.c b/sysdeps/wordsize-64/alphasort64.c deleted file mode 100644 index 0850913..0000000 --- a/sysdeps/wordsize-64/alphasort64.c +++ /dev/null @@ -1 +0,0 @@ -/* Defined in alphasort.c. */ diff --git a/sysdeps/wordsize-64/scandir.c b/sysdeps/wordsize-64/scandir.c deleted file mode 100644 index 9af7e9b..0000000 --- a/sysdeps/wordsize-64/scandir.c +++ /dev/null @@ -1,6 +0,0 @@ -#define scandir64 scandir64_renamed - -#include "../../dirent/scandir.c" - -#undef scandir64 -weak_alias (scandir, scandir64) diff --git a/sysdeps/wordsize-64/scandir64.c b/sysdeps/wordsize-64/scandir64.c deleted file mode 100644 index 3c2c4a1..0000000 --- a/sysdeps/wordsize-64/scandir64.c +++ /dev/null @@ -1 +0,0 @@ -/* Defined in scandir.c. */ diff --git a/sysdeps/wordsize-64/scandirat.c b/sysdeps/wordsize-64/scandirat.c deleted file mode 100644 index 02b8fde..0000000 --- a/sysdeps/wordsize-64/scandirat.c +++ /dev/null @@ -1,6 +0,0 @@ -#define scandirat64 scandirat64_renamed - -#include "../../dirent/scandirat.c" - -#undef scandirat64 -weak_alias (scandirat, scandirat64) diff --git a/sysdeps/wordsize-64/scandirat64.c b/sysdeps/wordsize-64/scandirat64.c deleted file mode 100644 index fb93865..0000000 --- a/sysdeps/wordsize-64/scandirat64.c +++ /dev/null @@ -1 +0,0 @@ -/* Defined in scandirat.c. */ diff --git a/sysdeps/wordsize-64/versionsort.c b/sysdeps/wordsize-64/versionsort.c deleted file mode 100644 index bb25550..0000000 --- a/sysdeps/wordsize-64/versionsort.c +++ /dev/null @@ -1,7 +0,0 @@ -#define versionsort64 rename_versionsort64 - -#include "../../dirent/versionsort.c" - -#undef versionsort64 - -weak_alias (versionsort, versionsort64) diff --git a/sysdeps/wordsize-64/versionsort64.c b/sysdeps/wordsize-64/versionsort64.c deleted file mode 100644 index ac6c3c7..0000000 --- a/sysdeps/wordsize-64/versionsort64.c +++ /dev/null @@ -1 +0,0 @@ -/* Defined in versionsort.c. */