This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH 6/7] Consolidate alphasort{64} and versionsort{64} implementation


I will commit this shortly if no one opposes it.

On 02/03/2018 15:59, Adhemerval Zanella wrote:
> This patch consolidates both alphasort{64} and versionsort{64}
> implementation on just the default dirent/alphasort{64}c and
> dirent/versionsort{64} respectively.  It changes the logic
> to follow the conventions used on other code consolidation:
> 
>   * the non-LFS variant is only built for _DIRENT_MATCHES_DIRENT64 being 0.
> 
>   * the LFS variant is always built and aliased to getdents for ABIs
>     that define _DIRENT_MATCHES_DIRENT64 to 1.
> 
> Also on Linux the compat symbol for old non-LFS dirent64 definition
> requires a platform-specific scandir64.c.  For powerpc32 and sparcv9
> it requires to add specific arch-implementation to override the
> generic Linux one because neither ABI exports an compat symbol for
> non-LFS alphasort64 and versionsort64 variant.  Considering both
> architectures do export other compat symbols for other dirent.h
> functions I think this is a bug (I need confirmation).
> 
> Checked on aarch64-linux-gnu, x86_64-linux-gnu, i686-linux-gnu,
> sparcv9-linux-gnu, sparc64-linux-gnu, powerpc-linux-gnu, and
> powerpc64le-linux-gnu.
> 
> 	* dirent/alphasort.c (alphasort): Build iff _DIRENT_MATCHES_DIRENT64 is
> 	defined.
> 	* dirent/versionsort.c (versionsort): Likewise.
> 	* dirent/alphasort64.c (alphasort64): Build regardless and alias to
> 	alphasort if _DIRENT_MATCHES_DIRENT64 is defined.
> 	* dirent/versionsort64.c (versionsort64): Likewise.
> 	* sysdeps/unix/sysv/linux/i386/alphasort64.c: Remove file.
> 	* sysdeps/unix/sysv/linux/arm/alphasort64.c: Likewise.
> 	* sysdeps/unix/sysv/linux/arm/versionsort64.c: Likewise.
> 	* sysdeps/unix/sysv/linux/m68k/alphasort64.c: Likewise.
> 	* sysdeps/unix/sysv/linux/m68k/versionsort64.c: Likewise.
> 	* sysdeps/unix/sysv/linux/s390/s390-32/alphasort64.c: Likewise.
> 	* sysdeps/unix/sysv/linux/s390/s390-32/versionsort64.c: Likewise.
> 	* sysdeps/unix/sysv/linux/i386/versionsort64.c: Likewise.
> 	* sysdeps/unix/sysv/linux/alphasort64.c: New file.
> 	* sysdeps/unix/sysv/linux/versionsort64.c: Likewise.
> 	* sysdeps/unix/sysv/linux/powerpc/powerpc32/alphasort64.c: Likewise.
> 	* sysdeps/unix/sysv/linux/powerpc/powerpc32/versionsort64.c: Likewise.
> 	* sysdeps/unix/sysv/linux/sparc/sparc32/alphasort64.c: Likewise.
> 	* sysdeps/unix/sysv/linux/sparc/sparc32/versionsort64.c: Likewise.
> ---
>  ChangeLog                                          | 21 +++++++++++++++++++++
>  dirent/alphasort.c                                 | 13 ++-----------
>  dirent/alphasort64.c                               |  7 ++++---
>  dirent/versionsort.c                               | 12 ++----------
>  dirent/versionsort64.c                             |  7 ++++---
>  sysdeps/unix/sysv/linux/{i386 => }/alphasort64.c   | 22 +++++++++++-----------
>  sysdeps/unix/sysv/linux/arm/alphasort64.c          |  1 -
>  sysdeps/unix/sysv/linux/arm/versionsort64.c        |  1 -
>  sysdeps/unix/sysv/linux/m68k/alphasort64.c         |  1 -
>  sysdeps/unix/sysv/linux/m68k/versionsort64.c       |  1 -
>  .../sysv/linux/powerpc/powerpc32/alphasort64.c     |  3 +++
>  .../sysv/linux/powerpc/powerpc32/versionsort64.c   |  3 +++
>  sysdeps/unix/sysv/linux/s390/s390-32/alphasort64.c |  1 -
>  .../unix/sysv/linux/s390/s390-32/versionsort64.c   |  1 -
>  .../unix/sysv/linux/sparc/sparc32/alphasort64.c    |  3 +++
>  .../unix/sysv/linux/sparc/sparc32/versionsort64.c  |  3 +++
>  sysdeps/unix/sysv/linux/{i386 => }/versionsort64.c | 22 +++++++++++-----------
>  17 files changed, 67 insertions(+), 55 deletions(-)
>  rename sysdeps/unix/sysv/linux/{i386 => }/alphasort64.c (77%)
>  delete mode 100644 sysdeps/unix/sysv/linux/arm/alphasort64.c
>  delete mode 100644 sysdeps/unix/sysv/linux/arm/versionsort64.c
>  delete mode 100644 sysdeps/unix/sysv/linux/m68k/alphasort64.c
>  delete mode 100644 sysdeps/unix/sysv/linux/m68k/versionsort64.c
>  create mode 100644 sysdeps/unix/sysv/linux/powerpc/powerpc32/alphasort64.c
>  create mode 100644 sysdeps/unix/sysv/linux/powerpc/powerpc32/versionsort64.c
>  delete mode 100644 sysdeps/unix/sysv/linux/s390/s390-32/alphasort64.c
>  delete mode 100644 sysdeps/unix/sysv/linux/s390/s390-32/versionsort64.c
>  create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc32/alphasort64.c
>  create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc32/versionsort64.c
>  rename sysdeps/unix/sysv/linux/{i386 => }/versionsort64.c (77%)
> 
> diff --git a/dirent/alphasort.c b/dirent/alphasort.c
> index a6cd151..6b2a707 100644
> --- a/dirent/alphasort.c
> +++ b/dirent/alphasort.c
> @@ -15,23 +15,14 @@
>     License along with the GNU C Library; if not, see
>     <http://www.gnu.org/licenses/>.  */
>  
> -/* 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 <dirent.h>
>  
> -#undef  alphasort64
> -
> -#include <string.h>
> +#if !_DIRENT_MATCHES_DIRENT64
> +# include <string.h>
>  
>  int
>  alphasort (const struct dirent **a, const struct dirent **b)
>  {
>    return strcoll ((*a)->d_name, (*b)->d_name);
>  }
> -
> -#if _DIRENT_MATCHES_DIRENT64
> -weak_alias (alphasort, alphasort64)
>  #endif
> diff --git a/dirent/alphasort64.c b/dirent/alphasort64.c
> index 3a47a97..b822333 100644
> --- a/dirent/alphasort64.c
> +++ b/dirent/alphasort64.c
> @@ -15,16 +15,17 @@
>     License along with the GNU C Library; if not, see
>     <http://www.gnu.org/licenses/>.  */
>  
> +#define alphasort __no_alphasort_decl
>  #include <dirent.h>
> +#undef alphasort
>  #include <string.h>
>  
> -/* alphasort.c defines alphasort64 as an alias if _DIRENT_MATCHES_DIRENT64.  */
> -#if !_DIRENT_MATCHES_DIRENT64
> -
>  int
>  alphasort64 (const struct dirent64 **a, const struct dirent64 **b)
>  {
>    return strcoll ((*a)->d_name, (*b)->d_name);
>  }
>  
> +#if _DIRENT_MATCHES_DIRENT64
> +weak_alias (alphasort64, alphasort)
>  #endif
> diff --git a/dirent/versionsort.c b/dirent/versionsort.c
> index 5ec15e8..ca38c2d 100644
> --- a/dirent/versionsort.c
> +++ b/dirent/versionsort.c
> @@ -15,16 +15,10 @@
>     License along with the GNU C Library; if not, see
>     <http://www.gnu.org/licenses/>.  */
>  
> -/* 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 <dirent.h>
>  
> -#undef  versionsort64
> -
> -#include <string.h>
> +#if !_DIRENT_MATCHES_DIRENT64
> +# include <string.h>
>  
>  int
>  versionsort (const struct dirent **a, const struct dirent **b)
> @@ -32,6 +26,4 @@ versionsort (const struct dirent **a, const struct dirent **b)
>    return __strverscmp ((*a)->d_name, (*b)->d_name);
>  }
>  
> -#if _DIRENT_MATCHES_DIRENT64
> -weak_alias (versionsort, versionsort64)
>  #endif
> diff --git a/dirent/versionsort64.c b/dirent/versionsort64.c
> index 7689c26..8f47e60 100644
> --- a/dirent/versionsort64.c
> +++ b/dirent/versionsort64.c
> @@ -15,16 +15,17 @@
>     License along with the GNU C Library; if not, see
>     <http://www.gnu.org/licenses/>.  */
>  
> +#define versionsort __no_versionsort_decl
>  #include <dirent.h>
> +#undef versionsort
>  #include <string.h>
>  
> -/* versionsort.c defines a versionsort64 alias if _DIRENT_MATCHES_DIRENT64.  */
> -#if !_DIRENT_MATCHES_DIRENT64
> -
>  int
>  versionsort64 (const struct dirent64 **a, const struct dirent64 **b)
>  {
>    return __strverscmp ((*a)->d_name, (*b)->d_name);
>  }
>  
> +#if !_DIRENT_MATCHES_DIRENT64
> +weak_alias (versionsort64, versionsort)
>  #endif
> diff --git a/sysdeps/unix/sysv/linux/i386/alphasort64.c b/sysdeps/unix/sysv/linux/alphasort64.c
> similarity index 77%
> rename from sysdeps/unix/sysv/linux/i386/alphasort64.c
> rename to sysdeps/unix/sysv/linux/alphasort64.c
> index ee3b00b..7eee9d0 100644
> --- a/sysdeps/unix/sysv/linux/i386/alphasort64.c
> +++ b/sysdeps/unix/sysv/linux/alphasort64.c
> @@ -15,7 +15,9 @@
>     License along with the GNU C Library; if not, see
>     <http://www.gnu.org/licenses/>.  */
>  
> +#define alphasort __no_alphasort_decl
>  #include <dirent.h>
> +#undef alphasort
>  #include <string.h>
>  
>  int
> @@ -24,17 +26,14 @@ __alphasort64 (const struct dirent64 **a, const struct dirent64 **b)
>    return strcoll ((*a)->d_name, (*b)->d_name);
>  }
>  
> -#include <shlib-compat.h>
> -
> +#ifdef _DIRENT_MATCHES_DIRENT64
> +weak_alias (__alphasort64, alphasort64)
> +weak_alias (__alphasort64, alphasort)
> +#else
> +# include <shlib-compat.h>
>  versioned_symbol (libc, __alphasort64, alphasort64, GLIBC_2_2);
> -
> -#if SHLIB_COMPAT(libc, GLIBC_2_1, GLIBC_2_2)
> -
> -#include <olddirent.h>
> -
> -int
> -__old_alphasort64 (const struct __old_dirent64 **a,
> -		   const struct __old_dirent64 **b);
> +# if SHLIB_COMPAT(libc, GLIBC_2_1, GLIBC_2_2)
> +#  include <olddirent.h>
>  
>  int
>  attribute_compat_text_section
> @@ -45,4 +44,5 @@ __old_alphasort64 (const struct __old_dirent64 **a,
>  }
>  
>  compat_symbol (libc, __old_alphasort64, alphasort64, GLIBC_2_1);
> -#endif
> +# endif /* SHLIB_COMPAT(libc, GLIBC_2_1, GLIBC_2_2)  */
> +#endif /* _DIRENT_MATCHES_DIRENT64  */
> diff --git a/sysdeps/unix/sysv/linux/arm/alphasort64.c b/sysdeps/unix/sysv/linux/arm/alphasort64.c
> deleted file mode 100644
> index 0b5ae47..0000000
> --- a/sysdeps/unix/sysv/linux/arm/alphasort64.c
> +++ /dev/null
> @@ -1 +0,0 @@
> -#include <sysdeps/unix/sysv/linux/i386/alphasort64.c>
> diff --git a/sysdeps/unix/sysv/linux/arm/versionsort64.c b/sysdeps/unix/sysv/linux/arm/versionsort64.c
> deleted file mode 100644
> index 144b691..0000000
> --- a/sysdeps/unix/sysv/linux/arm/versionsort64.c
> +++ /dev/null
> @@ -1 +0,0 @@
> -#include <sysdeps/unix/sysv/linux/i386/versionsort64.c>
> diff --git a/sysdeps/unix/sysv/linux/m68k/alphasort64.c b/sysdeps/unix/sysv/linux/m68k/alphasort64.c
> deleted file mode 100644
> index 0b5ae47..0000000
> --- a/sysdeps/unix/sysv/linux/m68k/alphasort64.c
> +++ /dev/null
> @@ -1 +0,0 @@
> -#include <sysdeps/unix/sysv/linux/i386/alphasort64.c>
> diff --git a/sysdeps/unix/sysv/linux/m68k/versionsort64.c b/sysdeps/unix/sysv/linux/m68k/versionsort64.c
> deleted file mode 100644
> index 144b691..0000000
> --- a/sysdeps/unix/sysv/linux/m68k/versionsort64.c
> +++ /dev/null
> @@ -1 +0,0 @@
> -#include <sysdeps/unix/sysv/linux/i386/versionsort64.c>
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/alphasort64.c b/sysdeps/unix/sysv/linux/powerpc/powerpc32/alphasort64.c
> new file mode 100644
> index 0000000..c7de3a7
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/alphasort64.c
> @@ -0,0 +1,3 @@
> +/* Although powerpc32 define _DIRENT_MATCHES_DIRENT64=0 and have compat
> +   mode for 2.1, it does have a compat symbol for alphasort64.  */
> +#include <dirent/alphasort64.c>
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/versionsort64.c b/sysdeps/unix/sysv/linux/powerpc/powerpc32/versionsort64.c
> new file mode 100644
> index 0000000..ee0e866
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/versionsort64.c
> @@ -0,0 +1,3 @@
> +/* Although powerpc32 define _DIRENT_MATCHES_DIRENT64=0 and have compat
> +   mode for 2.1, it does have a compat symbol for alphasort64.  */
> +#include <dirent/versionsort64.c>
> diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/alphasort64.c b/sysdeps/unix/sysv/linux/s390/s390-32/alphasort64.c
> deleted file mode 100644
> index 0b5ae47..0000000
> --- a/sysdeps/unix/sysv/linux/s390/s390-32/alphasort64.c
> +++ /dev/null
> @@ -1 +0,0 @@
> -#include <sysdeps/unix/sysv/linux/i386/alphasort64.c>
> diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/versionsort64.c b/sysdeps/unix/sysv/linux/s390/s390-32/versionsort64.c
> deleted file mode 100644
> index 144b691..0000000
> --- a/sysdeps/unix/sysv/linux/s390/s390-32/versionsort64.c
> +++ /dev/null
> @@ -1 +0,0 @@
> -#include <sysdeps/unix/sysv/linux/i386/versionsort64.c>
> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/alphasort64.c b/sysdeps/unix/sysv/linux/sparc/sparc32/alphasort64.c
> new file mode 100644
> index 0000000..3970086
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/alphasort64.c
> @@ -0,0 +1,3 @@
> +/* Although sparc32 define _DIRENT_MATCHES_DIRENT64=0 and have compat
> +   mode for 2.1, it does have a compat symbol for alphasort64.  */
> +#include <dirent/alphasort64.c>
> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/versionsort64.c b/sysdeps/unix/sysv/linux/sparc/sparc32/versionsort64.c
> new file mode 100644
> index 0000000..b195442
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/versionsort64.c
> @@ -0,0 +1,3 @@
> +/* Although sparc32 define _DIRENT_MATCHES_DIRENT64=0 and have compat
> +   mode for 2.1, it does have a compat symbol for alphasort64.  */
> +#include <dirent/versionsort64.c>
> diff --git a/sysdeps/unix/sysv/linux/i386/versionsort64.c b/sysdeps/unix/sysv/linux/versionsort64.c
> similarity index 77%
> rename from sysdeps/unix/sysv/linux/i386/versionsort64.c
> rename to sysdeps/unix/sysv/linux/versionsort64.c
> index 1777eb2..a3a3a66 100644
> --- a/sysdeps/unix/sysv/linux/i386/versionsort64.c
> +++ b/sysdeps/unix/sysv/linux/versionsort64.c
> @@ -15,7 +15,9 @@
>     License along with the GNU C Library; if not, see
>     <http://www.gnu.org/licenses/>.  */
>  
> +#define versionsort __no_versionsort_decl
>  #include <dirent.h>
> +#undef versionsort
>  #include <string.h>
>  
>  int
> @@ -24,17 +26,14 @@ __versionsort64 (const struct dirent64 **a, const struct dirent64 **b)
>    return __strverscmp ((*a)->d_name, (*b)->d_name);
>  }
>  
> -#include <shlib-compat.h>
> -
> +#if _DIRENT_MATCHES_DIRENT64
> +weak_alias (__versionsort64, versionsort64)
> +weak_alias (__versionsort64, versionsort)
> +#else
> +# include <shlib-compat.h>
>  versioned_symbol (libc, __versionsort64, versionsort64, GLIBC_2_2);
> -
> -#if SHLIB_COMPAT(libc, GLIBC_2_1, GLIBC_2_2)
> -
> -#include <olddirent.h>
> -
> -int
> -__old_versionsort64 (const struct __old_dirent64 **a,
> -		     const struct __old_dirent64 **b);
> +# if SHLIB_COMPAT(libc, GLIBC_2_1, GLIBC_2_2)
> +#  include <olddirent.h>
>  
>  int
>  attribute_compat_text_section
> @@ -45,4 +44,5 @@ __old_versionsort64 (const struct __old_dirent64 **a,
>  }
>  
>  compat_symbol (libc, __old_versionsort64, versionsort64, GLIBC_2_1);
> -#endif
> +# endif /* SHLIB_COMPAT(libc, GLIBC_2_1, GLIBC_2_2)  */
> +#endif /* _DIRENT_MATCHES_DIRENT64  */
> 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]