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: PING: PATCH: Automatically test IFUNC implementations


On Sat, Oct 6, 2012 at 2:43 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
> On Fri, Oct 05, 2012 at 03:47:49PM -0700, Roland McGrath wrote:
>> * Each find_* in libc-func.c should have a comment saying it must match the
>>   set used in the corresponding IFUNC selector, naming the exact source
>>   file name (sysdeps/.../foo.S) that contains the selector.  Likewise, each
>>   selector's source should have a comment with a reminder to update
>>   sysdeps/.../libc-func.c when changing the set used by the selector.
>> * Why does libc-func.c need "#ifndef NOT_IN_libc"?
>>   This file should never be compiled at all in any circumstance where
>>   NOT_IN_libc is defined.
>> * Use a macro like:
>>       #define FIND_FUNC(func) \
>>         if (strcmp (name, #func) == 0) \
>>           return find_##func (array, max);
>>   rather than repeating the pattern.
>> * In each find_* function, use a simple pattern of:
>>       array[i++] = LIBC_FUNC_INIT (foobar);
>>   rather than error-prone arithmetic.
>>   In fact, I'd use a macro like:
>>       #define FIND_FUNC(cond, func) \
>>         if (cond) \
>>           array[i++] = LIBC_FUNC_INIT (func)
>>   Then call this as:
>>       FIND_FUNC (HAS_SSSE3, __memmove_chk_ssse3_back);
>>       FIND_FUNC (HAS_SSSE3, __memmove_chk_ssse3);
>>       FIND_FUNC (1, __memmove_chk_sse2);
>>   To further avoid boilerplate, add another macro:
>>       #define FUNC_FINDER(name, ...) \
>>         static int \
>>         find_##name (struct libc_func_test *array, size_t max) \
>>         { \
>>           size_t i = 0; \
>>           __VA_ARGS__; \
>>         }
>>   Then each one looks like:
>>       FUNC_FINDER (__memmove_chk,
>>                    FIND_FUNC (HAS_SSSE3, __memmove_chk_ssse3_back),
>>                    FIND_FUNC (HAS_SSSE3, __memmove_chk_ssse3),
>>                    FIND_FUNC (1, __memmove_chk_sse2)
>>                    )
>>
>
> Here are patches for i686 and x86_64 __libc_supported_implementations.
> Do they look OK?
>
> Thanks.
>
> H.J.
> ---
> From 62ab1afdb01807046e97a9c5d2f48f66c6fffad8 Mon Sep 17 00:00:00 2001
> From: "H.J. Lu" <hjl.tools@gmail.com>
> Date: Sat, 6 Oct 2012 11:40:47 -0700
> Subject: [PATCH 2/6] Add i686 __libc_supported_implementations
>
> ---
>  ChangeLog                               |  12 ++
>  sysdeps/i386/i686/multiarch/bcopy.S     |   2 +
>  sysdeps/i386/i686/multiarch/bzero.S     |   2 +
>  sysdeps/i386/i686/multiarch/libc-func.c | 300 ++++++++++++++++++++++++++++++++
>  sysdeps/i386/i686/multiarch/memcmp.S    |   2 +
>  sysdeps/i386/i686/multiarch/memcpy.S    |   2 +
>  sysdeps/i386/i686/multiarch/memmove.S   |   2 +
>  sysdeps/i386/i686/multiarch/mempcpy.S   |   2 +
>  sysdeps/i386/i686/multiarch/strcat.S    |   2 +
>  sysdeps/i386/i686/multiarch/strcmp.S    |   2 +
>  sysdeps/i386/i686/multiarch/strcpy.S    |   2 +
>  11 files changed, 330 insertions(+)
>  create mode 100644 sysdeps/i386/i686/multiarch/libc-func.c
>
> diff --git a/ChangeLog b/ChangeLog
> index af97647..4e34fc7 100644
> --- a/ChangeLog
> +++ b/ChangeLog
> @@ -1,5 +1,17 @@
>  2012-10-08  H.J. Lu  <hongjiu.lu@intel.com>
>
> +       * sysdeps/i386/i686/multiarch/bcopy.S (__bcopy_ia32): Make it
> +       global and hidden.
> +       * sysdeps/i386/i686/multiarch/bzero.S (__bzero_ia32): Likewise.
> +       * sysdeps/i386/i686/multiarch/memcmp.S (__memcmp_ia32): Likewise.
> +       * sysdeps/i386/i686/multiarch/memcpy.S (__memcpy_ia32): Likewise.
> +       * sysdeps/i386/i686/multiarch/memmove.S (__memmove_ia32): Likewise.
> +       * sysdeps/i386/i686/multiarch/mempcpy.S (__mempcpy_ia32): Likewise.
> +       * sysdeps/i386/i686/multiarch/strcat.S (STRCAT_IA32): Likewise.
> +       * sysdeps/i386/i686/multiarch/strcmp.S (__STRCMP_IA32): Likewise.
> +       * sysdeps/i386/i686/multiarch/strcpy.S (STRCPY_IA32): Likewise.
> +       * sysdeps/i386/i686/multiarch/libc-func.c: New file.
> +
>         * Rules (tests): Filter out $(tests-ifunc) if multi-arch isn't
>         enabled.
>         (xtests): Filter out $(xtests-ifunc) if multi-arch isn't enabled.
> diff --git a/sysdeps/i386/i686/multiarch/bcopy.S b/sysdeps/i386/i686/multiarch/bcopy.S
> index 9db3424..ca507b0 100644
> --- a/sysdeps/i386/i686/multiarch/bcopy.S
> +++ b/sysdeps/i386/i686/multiarch/bcopy.S
> @@ -67,6 +67,8 @@ END(bcopy)
>  # define ENTRY(name) \
>         .type __bcopy_ia32, @function; \
>         .p2align 4; \
> +       .globl __bcopy_ia32; \
> +       .hidden __bcopy_ia32; \
>         __bcopy_ia32: cfi_startproc; \
>         CALL_MCOUNT
>  # undef END
> diff --git a/sysdeps/i386/i686/multiarch/bzero.S b/sysdeps/i386/i686/multiarch/bzero.S
> index 86db169..2226e7a 100644
> --- a/sysdeps/i386/i686/multiarch/bzero.S
> +++ b/sysdeps/i386/i686/multiarch/bzero.S
> @@ -67,6 +67,8 @@ END(__bzero)
>  # define ENTRY(name) \
>         .type __bzero_ia32, @function; \
>         .p2align 4; \
> +       .globl __bzero_ia32; \
> +       .hidden __bzero_ia32; \
>         __bzero_ia32: cfi_startproc; \
>         CALL_MCOUNT
>  # undef END
> diff --git a/sysdeps/i386/i686/multiarch/libc-func.c b/sysdeps/i386/i686/multiarch/libc-func.c
> new file mode 100644
> index 0000000..06c2d6a
> --- /dev/null
> +++ b/sysdeps/i386/i686/multiarch/libc-func.c
> @@ -0,0 +1,300 @@
> +/* __libc_supported_implementations for i686.
> +   Copyright (C) 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
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <http://www.gnu.org/licenses/>.  */
> +
> +#include <assert.h>
> +#include <string.h>
> +#include <wchar.h>
> +#include <libc-func.h>
> +#include "init-arch.h"
> +
> +extern void *__memcpy_chk (void *, const void *, size_t, size_t);
> +extern void *__memmove_chk (void *, const void *, size_t, size_t);
> +extern void *__mempcpy_chk (void *, const void *, size_t, size_t);
> +extern void *__memset_chk (void *, int c, size_t, size_t);
> +
> +/* Maximum number of IFUNC implementations.  */
> +#define MAX_IFUNC      3
> +
> +/* Fill ARRAY of MAX elements with IFUNC implementations for function
> +   NAME supported on target machine and return the number of valid
> +   entries.  */
> +
> +size_t
> +__libc_supported_implementations (const char *name,
> +                                 struct libc_func_test *array,
> +                                 size_t max)
> +{
> +  assert (max >= MAX_IFUNC);
> +
> +  size_t i = 0;
> +
> +#define FIND_FUNC(func, cond, impl) \
> +  if (cond) \
> +    { \
> +      extern __typeof (func) impl attribute_hidden; \
> +      array[i++] = LIBC_FUNC_INIT (impl); \
> +    }
> +
> +  /* Return the number of IFUNC implementations supported on target
> +     machine.  */
> +#define FUNC_FINDER(func, ...) \
> +  if (strcmp (name, #func) == 0) \
> +    { \
> +      __VA_ARGS__; \
> +      return i; \
> +    }
> +
> +  /* Support sysdeps/i386/i686/multiarch/bcopy.S.  */
> +  FUNC_FINDER (bcopy,
> +              FIND_FUNC (bcopy, HAS_SSSE3, __bcopy_ssse3_rep)
> +              FIND_FUNC (bcopy, HAS_SSSE3, __bcopy_ssse3)
> +              FIND_FUNC (bcopy, 1, __bcopy_ia32))
> +
> +  /* Support sysdeps/i386/i686/multiarch/bzero.S.  */
> +  FUNC_FINDER (bzero,
> +              FIND_FUNC (bzero, HAS_SSE2, __bzero_sse2_rep)
> +              FIND_FUNC (bzero, HAS_SSE2, __bzero_sse2)
> +              FIND_FUNC (bzero, 1, __bzero_ia32))
> +
> +  /* Support sysdeps/i386/i686/multiarch/memchr.S.  */
> +  FUNC_FINDER (memchr,
> +              FIND_FUNC (memchr, HAS_SSE2, __memchr_sse2_bsf)
> +              FIND_FUNC (memchr, HAS_SSE2, __memchr_sse2)
> +              FIND_FUNC (memchr, 1, __memchr_ia32))
> +
> +  /* Support sysdeps/i386/i686/multiarch/memcmp.S.  */
> +  FUNC_FINDER (memcmp,
> +              FIND_FUNC (memcmp, HAS_SSE4_2, __memcmp_sse4_2)
> +              FIND_FUNC (memcmp, HAS_SSSE3, __memcmp_ssse3)
> +              FIND_FUNC (memcmp, 1, __memcmp_ia32))
> +
> +  /* Support sysdeps/i386/i686/multiarch/memmove_chk.S.  */
> +  FUNC_FINDER (__memmove_chk,
> +              FIND_FUNC (__memmove_chk, HAS_SSSE3, __memmove_chk_ssse3_rep)
> +              FIND_FUNC (__memmove_chk, HAS_SSSE3, __memmove_chk_ssse3)
> +              FIND_FUNC (__memmove_chk, 1, __memmove_chk_ia32))
> +
> +  /* Support sysdeps/i386/i686/multiarch/memmove.S.  */
> +  FUNC_FINDER (memmove,
> +              FIND_FUNC (memmove, HAS_SSSE3, __memmove_ssse3_rep)
> +              FIND_FUNC (memmove, HAS_SSSE3, __memmove_ssse3)
> +              FIND_FUNC (memmove, 1, __memmove_ia32))
> +
> +  /* Support sysdeps/i386/i686/multiarch/memrchr.S.  */
> +  FUNC_FINDER (memrchr,
> +              FIND_FUNC (memrchr, HAS_SSE2, __memrchr_sse2_bsf)
> +              FIND_FUNC (memrchr, HAS_SSE2, __memrchr_sse2)
> +              FIND_FUNC (memrchr, 1, __memrchr_ia32))
> +
> +  /* Support sysdeps/i386/i686/multiarch/memset_chk.S.  */
> +  FUNC_FINDER (__memset_chk,
> +              FIND_FUNC (__memset_chk, HAS_SSE2, __memset_chk_sse2_rep)
> +              FIND_FUNC (__memset_chk, HAS_SSE2, __memset_chk_sse2)
> +              FIND_FUNC (__memset_chk, 1, __memset_chk_ia32))
> +
> +  /* Support sysdeps/i386/i686/multiarch/memset.S.  */
> +  FUNC_FINDER (memset,
> +              FIND_FUNC (memset, HAS_SSE2, __memset_sse2_rep)
> +              FIND_FUNC (memset, HAS_SSE2, __memset_sse2)
> +              FIND_FUNC (memset, 1, __memset_ia32))
> +
> +  /* Support sysdeps/i386/i686/multiarch/rawmemchr.S.  */
> +  FUNC_FINDER (rawmemchr,
> +              FIND_FUNC (rawmemchr, HAS_SSE2, __rawmemchr_sse2_bsf)
> +              FIND_FUNC (rawmemchr, HAS_SSE2, __rawmemchr_sse2)
> +              FIND_FUNC (rawmemchr, 1, __rawmemchr_ia32))
> +
> +  /* Support sysdeps/i386/i686/multiarch/stpncpy.S.  */
> +  FUNC_FINDER (stpncpy,
> +              FIND_FUNC (stpncpy, HAS_SSSE3, __stpncpy_ssse3)
> +              FIND_FUNC (stpncpy, HAS_SSE2, __stpncpy_sse2)
> +              FIND_FUNC (stpncpy, 1, __stpncpy_ia32))
> +
> +  /* Support sysdeps/i386/i686/multiarch/stpcpy.S.  */
> +  FUNC_FINDER (stpcpy,
> +              FIND_FUNC (stpcpy, HAS_SSSE3, __stpcpy_ssse3)
> +              FIND_FUNC (stpcpy, HAS_SSE2, __stpcpy_sse2)
> +              FIND_FUNC (stpcpy, 1, __stpcpy_ia32))
> +
> +  /* Support sysdeps/i386/i686/multiarch/strcasecmp.S.  */
> +  FUNC_FINDER (strcasecmp,
> +              FIND_FUNC (strcasecmp, HAS_SSE4_2, __strcasecmp_sse4_2)
> +              FIND_FUNC (strcasecmp, HAS_SSSE3, __strcasecmp_ssse3)
> +              FIND_FUNC (strcasecmp, 1, __strcasecmp_ia32))
> +
> +  /* Support sysdeps/i386/i686/multiarch/strcasecmp_l.S.  */
> +  FUNC_FINDER (strcasecmp_l,
> +              FIND_FUNC (strcasecmp_l, HAS_SSE4_2, __strcasecmp_l_sse4_2)
> +              FIND_FUNC (strcasecmp_l, HAS_SSSE3, __strcasecmp_l_ssse3)
> +              FIND_FUNC (strcasecmp_l, 1, __strcasecmp_l_ia32))
> +
> +  /* Support sysdeps/i386/i686/multiarch/strcasestr.c.  */
> +  FUNC_FINDER (strcasestr,
> +              FIND_FUNC (strcasestr, HAS_SSE4_2, __strcasestr_sse42)
> +              FIND_FUNC (strcasestr, 1, __strcasestr_ia32))
> +
> +  /* Support sysdeps/i386/i686/multiarch/strcat.S.  */
> +  FUNC_FINDER (strcat,
> +              FIND_FUNC (strcat, HAS_SSSE3, __strcat_ssse3)
> +              FIND_FUNC (strcat, HAS_SSE2, __strcat_sse2)
> +              FIND_FUNC (strcat, 1, __strcat_ia32))
> +
> +  /* Support sysdeps/i386/i686/multiarch/strchr.S.  */
> +  FUNC_FINDER (strchr,
> +              FIND_FUNC (strchr, HAS_SSE2, __strchr_sse2_bsf)
> +              FIND_FUNC (strchr, HAS_SSE2, __strchr_sse2)
> +              FIND_FUNC (strchr, 1, __strchr_ia32))
> +
> +  /* Support sysdeps/i386/i686/multiarch/strcmp.S.  */
> +  FUNC_FINDER (strcmp,
> +              FIND_FUNC (strcmp, HAS_SSE4_2, __strcmp_sse4_2)
> +              FIND_FUNC (strcmp, HAS_SSSE3, __strcmp_ssse3)
> +              FIND_FUNC (strcmp, 1, __strcmp_ia32))
> +
> +  /* Support sysdeps/i386/i686/multiarch/strcpy.S.  */
> +  FUNC_FINDER (strcpy,
> +              FIND_FUNC (strcpy, HAS_SSSE3, __strcpy_ssse3)
> +              FIND_FUNC (strcpy, HAS_SSE2, __strcpy_sse2)
> +              FIND_FUNC (strcpy, 1, __strcpy_ia32))
> +
> +  /* Support sysdeps/i386/i686/multiarch/strcspn.S.  */
> +  FUNC_FINDER (strcspn,
> +              FIND_FUNC (strcspn, HAS_SSE4_2, __strcspn_sse42)
> +              FIND_FUNC (strcspn, 1, __strcspn_ia32))
> +
> +  /* Support sysdeps/i386/i686/multiarch/strncase.S.  */
> +  FUNC_FINDER (strncasecmp,
> +              FIND_FUNC (strncasecmp, HAS_SSE4_2, __strncasecmp_sse4_2)
> +              FIND_FUNC (strncasecmp, HAS_SSSE3, __strncasecmp_ssse3)
> +              FIND_FUNC (strncasecmp, 1, __strncasecmp_ia32))
> +
> +  /* Support sysdeps/i386/i686/multiarch/strncase_l.S.  */
> +  FUNC_FINDER (strncasecmp_l,
> +              FIND_FUNC (strncasecmp_l, HAS_SSE4_2, __strncasecmp_l_sse4_2)
> +              FIND_FUNC (strncasecmp_l, HAS_SSSE3, __strncasecmp_l_ssse3)
> +              FIND_FUNC (strncasecmp_l, 1, __strncasecmp_l_ia32))
> +
> +  /* Support sysdeps/i386/i686/multiarch/strncat.S.  */
> +  FUNC_FINDER (strncat,
> +              FIND_FUNC (strncat, HAS_SSSE3, __strncat_ssse3)
> +              FIND_FUNC (strncat, HAS_SSE2, __strncat_sse2)
> +              FIND_FUNC (strncat, 1, __strncat_ia32))
> +
> +  /* Support sysdeps/i386/i686/multiarch/strncpy.S.  */
> +  FUNC_FINDER (strncpy,
> +              FIND_FUNC (strncpy, HAS_SSSE3, __strncpy_ssse3)
> +              FIND_FUNC (strncpy, HAS_SSE2, __strncpy_sse2)
> +              FIND_FUNC (strncpy, 1, __strncpy_ia32))
> +
> +  /* Support sysdeps/i386/i686/multiarch/strnlen.S.  */
> +  FUNC_FINDER (strnlen,
> +              FIND_FUNC (strnlen, HAS_SSE2, __strnlen_sse2)
> +              FIND_FUNC (strnlen, 1, __strnlen_ia32))
> +
> +  /* Support sysdeps/i386/i686/multiarch/strpbrk.S.  */
> +  FUNC_FINDER (strpbrk,
> +              FIND_FUNC (strpbrk, HAS_SSE4_2, __strpbrk_sse42)
> +              FIND_FUNC (strpbrk, 1, __strpbrk_ia32))
> +
> +  /* Support sysdeps/i386/i686/multiarch/strrchr.S.  */
> +  FUNC_FINDER (strrchr,
> +              FIND_FUNC (strrchr, HAS_SSE2, __strrchr_sse2_bsf)
> +              FIND_FUNC (strrchr, HAS_SSE2, __strrchr_sse2)
> +              FIND_FUNC (strrchr, 1, __strrchr_ia32))
> +
> +  /* Support sysdeps/i386/i686/multiarch/strspn.S.  */
> +  FUNC_FINDER (strspn,
> +              FIND_FUNC (strspn, HAS_SSE4_2, __strspn_sse42)
> +              FIND_FUNC (strspn, 1, __strspn_ia32))
> +
> +  /* Support sysdeps/i386/i686/multiarch/strstr-c.c.  */
> +  FUNC_FINDER (strstr,
> +              FIND_FUNC (strstr, HAS_SSE4_2, __strstr_sse42)
> +              FIND_FUNC (strstr, 1, __strstr_ia32))
> +
> +  /* Support sysdeps/i386/i686/multiarch/wcschr.S.  */
> +  FUNC_FINDER (wcschr,
> +              FIND_FUNC (wcschr, HAS_SSE2, __wcschr_sse2)
> +              FIND_FUNC (wcschr, 1, __wcschr_ia32))
> +
> +  /* Support sysdeps/i386/i686/multiarch/wcscmp.S.  */
> +  FUNC_FINDER (wcscmp,
> +              FIND_FUNC (wcscmp, HAS_SSE2, __wcscmp_sse2)
> +              FIND_FUNC (wcscmp, 1, __wcscmp_ia32))
> +
> +  /* Support sysdeps/i386/i686/multiarch/wcscpy.S.  */
> +  FUNC_FINDER (wcscpy,
> +              FIND_FUNC (wcscpy, HAS_SSSE3, __wcscpy_ssse3)
> +              FIND_FUNC (wcscpy, 1, __wcscpy_ia32))
> +
> +  /* Support sysdeps/i386/i686/multiarch/wcslen.S.  */
> +  FUNC_FINDER (wcslen,
> +              FIND_FUNC (wcslen, HAS_SSE2, __wcslen_sse2)
> +              FIND_FUNC (wcslen, 1, __wcslen_ia32))
> +
> +  /* Support sysdeps/i386/i686/multiarch/wcsrchr.S.  */
> +  FUNC_FINDER (wcsrchr,
> +              FIND_FUNC (wcsrchr, HAS_SSE2, __wcsrchr_sse2)
> +              FIND_FUNC (wcsrchr, 1, __wcsrchr_ia32))
> +
> +  /* Support sysdeps/i386/i686/multiarch/wmemcmp.S.  */
> +  FUNC_FINDER (wmemcmp,
> +              FIND_FUNC (wmemcmp, HAS_SSE4_2, __wmemcmp_sse4_2)
> +              FIND_FUNC (wmemcmp, HAS_SSSE3, __wmemcmp_ssse3)
> +              FIND_FUNC (wmemcmp, 1, __wmemcmp_ia32))
> +
> +#ifdef SHARED
> +  /* Support sysdeps/i386/i686/multiarch/memcpy_chk.S.  */
> +  FUNC_FINDER (__memcpy_chk,
> +              FIND_FUNC (__memcpy_chk, HAS_SSSE3, __memcpy_chk_ssse3_rep)
> +              FIND_FUNC (__memcpy_chk, HAS_SSSE3, __memcpy_chk_ssse3)
> +              FIND_FUNC (__memcpy_chk, 1, __memcpy_chk_ia32))
> +
> +  /* Support sysdeps/i386/i686/multiarch/memcpy.S.  */
> +  FUNC_FINDER (memcpy,
> +              FIND_FUNC (memcpy, HAS_SSSE3, __memcpy_ssse3_rep)
> +              FIND_FUNC (memcpy, HAS_SSSE3, __memcpy_ssse3)
> +              FIND_FUNC (memcpy, 1, __memcpy_ia32))
> +
> +  /* Support sysdeps/i386/i686/multiarch/mempcpy_chk.S.  */
> +  FUNC_FINDER (__mempcpy_chk,
> +              FIND_FUNC (__mempcpy_chk, HAS_SSSE3, __mempcpy_chk_ssse3_rep)
> +              FIND_FUNC (__mempcpy_chk, HAS_SSSE3, __mempcpy_chk_ssse3)
> +              FIND_FUNC (__mempcpy_chk, 1, __mempcpy_chk_ia32))
> +
> +  /* Support sysdeps/i386/i686/multiarch/mempcpy.S.  */
> +  FUNC_FINDER (mempcpy,
> +              FIND_FUNC (mempcpy, HAS_SSSE3, __mempcpy_ssse3_rep)
> +              FIND_FUNC (mempcpy, HAS_SSSE3, __mempcpy_ssse3)
> +              FIND_FUNC (mempcpy, 1, __mempcpy_ia32))
> +
> +  /* Support sysdeps/i386/i686/multiarch/strlen.S.  */
> +  FUNC_FINDER (strlen,
> +              FIND_FUNC (strlen, HAS_SSE2, __strlen_sse2_bsf)
> +              FIND_FUNC (strlen, HAS_SSE2, __strlen_sse2)
> +              FIND_FUNC (strlen, 1, __strlen_ia32))
> +
> +  /* Support sysdeps/i386/i686/multiarch/strncmp.S.  */
> +  FUNC_FINDER (strncmp,
> +              FIND_FUNC (strncmp, HAS_SSE4_2, __strncmp_sse4_2)
> +              FIND_FUNC (strncmp, HAS_SSSE3, __strncmp_ssse3)
> +              FIND_FUNC (strncmp, 1, __strncmp_ia32))
> +#endif
> +
> +  return i;
> +}
> diff --git a/sysdeps/i386/i686/multiarch/memcmp.S b/sysdeps/i386/i686/multiarch/memcmp.S
> index d8076b9..2756f0c 100644
> --- a/sysdeps/i386/i686/multiarch/memcmp.S
> +++ b/sysdeps/i386/i686/multiarch/memcmp.S
> @@ -67,6 +67,8 @@ END(memcmp)
>  # define ENTRY(name) \
>         .type __memcmp_ia32, @function; \
>         .p2align 4; \
> +       .globl __memcmp_ia32; \
> +       .hidden __memcmp_ia32; \
>         __memcmp_ia32: cfi_startproc; \
>         CALL_MCOUNT
>  # undef END
> diff --git a/sysdeps/i386/i686/multiarch/memcpy.S b/sysdeps/i386/i686/multiarch/memcpy.S
> index 558c04f..646e039 100644
> --- a/sysdeps/i386/i686/multiarch/memcpy.S
> +++ b/sysdeps/i386/i686/multiarch/memcpy.S
> @@ -51,6 +51,8 @@ END(memcpy)
>  # define ENTRY(name) \
>         .type __memcpy_ia32, @function; \
>         .p2align 4; \
> +       .globl __memcpy_ia32; \
> +       .hidden __memcpy_ia32; \
>         __memcpy_ia32: cfi_startproc; \
>         CALL_MCOUNT
>  # undef END
> diff --git a/sysdeps/i386/i686/multiarch/memmove.S b/sysdeps/i386/i686/multiarch/memmove.S
> index b8892c0..de452e3 100644
> --- a/sysdeps/i386/i686/multiarch/memmove.S
> +++ b/sysdeps/i386/i686/multiarch/memmove.S
> @@ -50,6 +50,8 @@ END(memmove)
>  # define ENTRY(name) \
>         .type __memmove_ia32, @function; \
>         .p2align 4; \
> +       .globl __memmove_ia32; \
> +       .hidden __memmove_ia32; \
>         __memmove_ia32: cfi_startproc; \
>         CALL_MCOUNT
>  # else
> diff --git a/sysdeps/i386/i686/multiarch/mempcpy.S b/sysdeps/i386/i686/multiarch/mempcpy.S
> index 95bda46..224fbe4 100644
> --- a/sysdeps/i386/i686/multiarch/mempcpy.S
> +++ b/sysdeps/i386/i686/multiarch/mempcpy.S
> @@ -51,6 +51,8 @@ END(__mempcpy)
>  # define ENTRY(name) \
>         .type __mempcpy_ia32, @function; \
>         .p2align 4; \
> +       .globl __mempcpy_ia32; \
> +       .hidden __mempcpy_ia32; \
>         __mempcpy_ia32: cfi_startproc; \
>         CALL_MCOUNT
>  # undef END
> diff --git a/sysdeps/i386/i686/multiarch/strcat.S b/sysdeps/i386/i686/multiarch/strcat.S
> index e68feca..4bfa21d 100644
> --- a/sysdeps/i386/i686/multiarch/strcat.S
> +++ b/sysdeps/i386/i686/multiarch/strcat.S
> @@ -94,6 +94,8 @@ END(STRCAT)
>  # define ENTRY(name) \
>         .type STRCAT_IA32, @function; \
>         .align 16; \
> +       .globl STRCAT_IA32; \
> +       .hidden STRCAT_IA32; \
>         STRCAT_IA32: cfi_startproc; \
>         CALL_MCOUNT
>  # undef END
> diff --git a/sysdeps/i386/i686/multiarch/strcmp.S b/sysdeps/i386/i686/multiarch/strcmp.S
> index b3b9eb8..a94cd5b 100644
> --- a/sysdeps/i386/i686/multiarch/strcmp.S
> +++ b/sysdeps/i386/i686/multiarch/strcmp.S
> @@ -95,6 +95,8 @@ END(STRCMP)
>  # define ENTRY(name) \
>         .type __STRCMP_IA32, @function; \
>         .p2align 4; \
> +       .globl __STRCMP_IA32; \
> +       .hidden __STRCMP_IA32; \
>         __STRCMP_IA32: cfi_startproc; \
>         CALL_MCOUNT
>  # undef END
> diff --git a/sysdeps/i386/i686/multiarch/strcpy.S b/sysdeps/i386/i686/multiarch/strcpy.S
> index 71eee76..de940dc 100644
> --- a/sysdeps/i386/i686/multiarch/strcpy.S
> +++ b/sysdeps/i386/i686/multiarch/strcpy.S
> @@ -110,6 +110,8 @@ END(STRCPY)
>  # define ENTRY(name) \
>         .type STRCPY_IA32, @function; \
>         .align 16; \
> +       .globl STRCPY_IA32; \
> +       .hidden STRCPY_IA32; \
>         STRCPY_IA32: cfi_startproc; \
>         CALL_MCOUNT
>  # undef END
> --
> 1.7.11.4
>
> From 6cc674e8410108c592f1facc523677b8ff71d60f Mon Sep 17 00:00:00 2001
> From: "H.J. Lu" <hjl.tools@gmail.com>
> Date: Sat, 6 Oct 2012 11:41:18 -0700
> Subject: [PATCH 3/6] Add x86_64 __libc_supported_implementations
>
> ---
>  ChangeLog                               |  21 +++
>  sysdeps/x86_64/multiarch/libc-func.c    | 259 ++++++++++++++++++++++++++++++++
>  sysdeps/x86_64/multiarch/memcmp.S       |   2 +
>  sysdeps/x86_64/multiarch/memcpy.S       |   2 +
>  sysdeps/x86_64/multiarch/mempcpy.S      |   2 +
>  sysdeps/x86_64/multiarch/rawmemchr.S    |   4 +
>  sysdeps/x86_64/multiarch/strcat.S       |   2 +
>  sysdeps/x86_64/multiarch/strchr.S       |   4 +
>  sysdeps/x86_64/multiarch/strcmp-sse42.S |   2 +
>  sysdeps/x86_64/multiarch/strcmp.S       |   6 +
>  sysdeps/x86_64/multiarch/strcpy.S       |   2 +
>  sysdeps/x86_64/multiarch/strlen.S       |   2 +
>  sysdeps/x86_64/multiarch/strnlen.S      |   2 +
>  sysdeps/x86_64/multiarch/strrchr.S      |   4 +
>  14 files changed, 314 insertions(+)
>  create mode 100644 sysdeps/x86_64/multiarch/libc-func.c
>
> diff --git a/ChangeLog b/ChangeLog
> index 4e34fc7..332e036 100644
> --- a/ChangeLog
> +++ b/ChangeLog
> @@ -1,5 +1,26 @@
>  2012-10-08  H.J. Lu  <hongjiu.lu@intel.com>
>
> +       * sysdeps/x86_64/multiarch/libc-func.c: New file.
> +       * sysdeps/x86_64/multiarch/memcmp.S (__memcmp_sse2): Make it
> +       global and hidden.
> +       * sysdeps/x86_64/multiarch/memcpy.S (__memcpy_sse2): Likewise.
> +       * sysdeps/x86_64/multiarch/mempcpy.S (__mempcpy_sse2): Likewise.
> +       * sysdeps/x86_64/multiarch/rawmemchr.S (__rawmemchr_sse42):
> +       Likewise.
> +       (__rawmemchr_sse2): Likewise.
> +       * sysdeps/x86_64/multiarch/strcat.S (STRCAT_SSE2): Likewise.
> +       * sysdeps/x86_64/multiarch/strchr.S (__strchr_sse42): Likewise.
> +       (__strchr_sse2): Likewise.
> +       * sysdeps/x86_64/multiarch/strcmp-sse42.S (STRCMP_SSE42): Likewise.
> +       * sysdeps/x86_64/multiarch/strcmp.S (STRCMP_SSE2): Likewise.
> +       (__strcasecmp_sse2): Likewise.
> +       (__strncasecmp_sse2): Likewise.
> +       * sysdeps/x86_64/multiarch/strcpy.S (STRCPY_SSE2): Likewise.
> +       * sysdeps/x86_64/multiarch/strlen.S (__strlen_sse2): Likewise.
> +       * sysdeps/x86_64/multiarch/strnlen.S (__strnlen_sse2): Likewise.
> +       * sysdeps/x86_64/multiarch/strrchr.S (__strrchr_sse42): Likewise.
> +       (__strrchr_sse2): Likewise.
> +
>         * sysdeps/i386/i686/multiarch/bcopy.S (__bcopy_ia32): Make it
>         global and hidden.
>         * sysdeps/i386/i686/multiarch/bzero.S (__bzero_ia32): Likewise.
> diff --git a/sysdeps/x86_64/multiarch/libc-func.c b/sysdeps/x86_64/multiarch/libc-func.c
> new file mode 100644
> index 0000000..89e10ad
> --- /dev/null
> +++ b/sysdeps/x86_64/multiarch/libc-func.c
> @@ -0,0 +1,259 @@
> +/* __libc_supported_implementations for x86_64.
> +   Copyright (C) 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
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <http://www.gnu.org/licenses/>.  */
> +
> +#include <assert.h>
> +#include <string.h>
> +#include <wchar.h>
> +#include <libc-func.h>
> +#include "init-arch.h"
> +
> +extern void *__memcpy_chk (void *, const void *, size_t, size_t);
> +extern void *__memmove_chk (void *, const void *, size_t, size_t);
> +extern void *__mempcpy_chk (void *, const void *, size_t, size_t);
> +extern void *__memset_chk (void *, int c, size_t, size_t);
> +
> +/* Maximum number of IFUNC implementations.  */
> +#define MAX_IFUNC      4
> +
> +/* Fill ARRAY of MAX elements with IFUNC implementations for function
> +   NAME supported on target machine and return the number of valid
> +   entries.  */
> +
> +size_t
> +__libc_supported_implementations (const char *name,
> +                                 struct libc_func_test *array,
> +                                 size_t max)
> +{
> +  assert (max >= MAX_IFUNC);
> +
> +  size_t i = 0;
> +
> +#define FIND_FUNC(func, cond, impl) \
> +  if (cond) \
> +    { \
> +      extern __typeof (func) impl attribute_hidden; \
> +      array[i++] = LIBC_FUNC_INIT (impl); \
> +    }
> +
> +  /* Return the number of IFUNC implementations supported on target
> +     machine.  */
> +#define FUNC_FINDER(func, ...) \
> +  if (strcmp (name, #func) == 0) \
> +    { \
> +      __VA_ARGS__; \
> +      return i; \
> +    }
> +
> +  /* Support sysdeps/x86_64/multiarch/memcmp.S.  */
> +  FUNC_FINDER (memcmp,
> +              FIND_FUNC (memcmp, HAS_SSE4_1, __memcmp_sse4_1)
> +              FIND_FUNC (memcmp, HAS_SSSE3, __memcmp_ssse3)
> +              FIND_FUNC (memcmp, 1, __memcmp_sse2))
> +
> +  /* Support sysdeps/x86_64/multiarch/memmove_chk.S.  */
> +  FUNC_FINDER (__memmove_chk,
> +              FIND_FUNC (__memmove_chk, HAS_SSSE3, __memmove_chk_ssse3_back)
> +              FIND_FUNC (__memmove_chk, HAS_SSSE3, __memmove_chk_ssse3)
> +              FIND_FUNC (__memmove_chk, 1, __memmove_chk_sse2))
> +
> +  /* Support sysdeps/x86_64/multiarch/memmove.S.  */
> +  FUNC_FINDER (memmove,
> +              FIND_FUNC (memmove, HAS_SSSE3, __memmove_ssse3_back)
> +              FIND_FUNC (memmove, HAS_SSSE3, __memmove_ssse3)
> +              FIND_FUNC (memmove, 1, __memmove_sse2))
> +
> +  /* Support sysdeps/x86_64/multiarch/memset_chk.S.  */
> +  FUNC_FINDER (__memset_chk,
> +              FIND_FUNC (__memset_chk, 1, __memset_chk_sse2)
> +              FIND_FUNC (__memset_chk, 1, __memset_chk_x86_64))
> +
> +  /* Support sysdeps/x86_64/multiarch/memset.S.  */
> +  FUNC_FINDER (memset,
> +              FIND_FUNC (memset, 1, __memset_sse2)
> +              FIND_FUNC (memset, 1, __memset_x86_64))
> +
> +  /* Support sysdeps/x86_64/multiarch/rawmemchr.S.  */
> +  FUNC_FINDER (rawmemchr,
> +              FIND_FUNC (rawmemchr, HAS_SSE4_2, __rawmemchr_sse42)
> +              FIND_FUNC (rawmemchr, 1, __rawmemchr_sse2))
> +
> +  /* Support sysdeps/x86_64/multiarch/stpncpy.S.  */
> +  FUNC_FINDER (stpncpy,
> +              FIND_FUNC (stpncpy, HAS_SSSE3, __stpncpy_ssse3)
> +              FIND_FUNC (stpncpy, 1, __stpncpy_sse2_unaligned)
> +              FIND_FUNC (stpncpy, 1, __stpncpy_sse2))
> +
> +  /* Support sysdeps/x86_64/multiarch/stpcpy.S.  */
> +  FUNC_FINDER (stpcpy,
> +              FIND_FUNC (stpcpy, HAS_SSSE3, __stpcpy_ssse3)
> +              FIND_FUNC (stpcpy, 1, __stpcpy_sse2_unaligned)
> +              FIND_FUNC (stpcpy, 1, __stpcpy_sse2))
> +
> +  /* Support sysdeps/x86_64/multiarch/strcasecmp_l.S.  */
> +  FUNC_FINDER (strcasecmp,
> +              FIND_FUNC (strcasecmp, HAS_AVX, __strcasecmp_avx)
> +              FIND_FUNC (strcasecmp, HAS_SSE4_2, __strcasecmp_sse42)
> +              FIND_FUNC (strcasecmp, HAS_SSSE3, __strcasecmp_ssse3)
> +              FIND_FUNC (strcasecmp, 1, __strcasecmp_sse2))
> +
> +  /* Support sysdeps/x86_64/multiarch/strcasecmp_l.S.  */
> +  FUNC_FINDER (strcasecmp_l,
> +              FIND_FUNC (strcasecmp_l, HAS_AVX, __strcasecmp_l_avx)
> +              FIND_FUNC (strcasecmp_l, HAS_SSE4_2, __strcasecmp_l_sse42)
> +              FIND_FUNC (strcasecmp_l, HAS_SSSE3, __strcasecmp_l_ssse3)
> +              FIND_FUNC (strcasecmp_l, 1, __strcasecmp_l_sse2))
> +
> +  /* Support sysdeps/x86_64/multiarch/strcasestr.c.  */
> +  FUNC_FINDER (strcasestr,
> +              FIND_FUNC (strcasestr, HAS_SSE4_2, __strcasestr_sse42)
> +              FIND_FUNC (strcasestr, 1, __strcasestr_sse2))
> +
> +  /* Support sysdeps/x86_64/multiarch/strcat.S.  */
> +  FUNC_FINDER (strcat,
> +              FIND_FUNC (strcat, HAS_SSSE3, __strcat_ssse3)
> +              FIND_FUNC (strcat, 1, __strcat_sse2_unaligned)
> +              FIND_FUNC (strcat, 1, __strcat_sse2))
> +
> +  /* Support sysdeps/x86_64/multiarch/strchr.S.  */
> +  FUNC_FINDER (strchr,
> +              FIND_FUNC (strchr, HAS_SSE4_2, __strchr_sse42)
> +              FIND_FUNC (strchr, 1, __strchr_sse2_no_bsf)
> +              FIND_FUNC (strchr, 1, __strchr_sse2))
> +
> +  /* Support sysdeps/x86_64/multiarch/strcmp.S.  */
> +  FUNC_FINDER (strcmp,
> +              FIND_FUNC (strcmp, HAS_SSE4_2, __strcmp_sse42)
> +              FIND_FUNC (strcmp, HAS_SSSE3, __strcmp_ssse3)
> +              FIND_FUNC (strcmp, 1, __strcmp_sse2))
> +
> +  /* Support sysdeps/x86_64/multiarch/strcpy.S.  */
> +  FUNC_FINDER (strcpy,
> +              FIND_FUNC (strcpy, HAS_SSSE3, __strcpy_ssse3)
> +              FIND_FUNC (strcpy, 1, __strcpy_sse2_unaligned)
> +              FIND_FUNC (strcpy, 1, __strcpy_sse2))
> +
> +  /* Support sysdeps/x86_64/multiarch/strcspn.S.  */
> +  FUNC_FINDER (strcspn,
> +              FIND_FUNC (strcspn, HAS_SSE4_2, __strcspn_sse42)
> +              FIND_FUNC (strcspn, 1, __strcspn_sse2))
> +
> +  /* Support sysdeps/x86_64/multiarch/strncase_l.S.  */
> +  FUNC_FINDER (strncasecmp,
> +              FIND_FUNC (strncasecmp, HAS_AVX, __strncasecmp_avx)
> +              FIND_FUNC (strncasecmp, HAS_SSE4_2, __strncasecmp_sse42)
> +              FIND_FUNC (strncasecmp, HAS_SSSE3, __strncasecmp_ssse3)
> +              FIND_FUNC (strncasecmp, 1, __strncasecmp_sse2))
> +
> +  /* Support sysdeps/x86_64/multiarch/strncase_l.S.  */
> +  FUNC_FINDER (strncasecmp_l,
> +              FIND_FUNC (strncasecmp_l, HAS_AVX, __strncasecmp_l_avx)
> +              FIND_FUNC (strncasecmp_l, HAS_SSE4_2, __strncasecmp_l_sse42)
> +              FIND_FUNC (strncasecmp_l, HAS_SSSE3, __strncasecmp_l_ssse3)
> +              FIND_FUNC (strncasecmp_l, 1, __strncasecmp_l_sse2))
> +
> +  /* Support sysdeps/x86_64/multiarch/strncat.S.  */
> +  FUNC_FINDER (strncat,
> +              FIND_FUNC (strncat, HAS_SSSE3, __strncat_ssse3)
> +              FIND_FUNC (strncat, 1, __strncat_sse2_unaligned)
> +              FIND_FUNC (strncat, 1, __strncat_sse2))
> +
> +  /* Support sysdeps/x86_64/multiarch/strncpy.S.  */
> +  FUNC_FINDER (strncpy,
> +              FIND_FUNC (strncpy, HAS_SSSE3, __strncpy_ssse3)
> +              FIND_FUNC (strncpy, 1, __strncpy_sse2_unaligned)
> +              FIND_FUNC (strncpy, 1, __strncpy_sse2))
> +
> +  /* Support sysdeps/x86_64/multiarch/strnlen.S.  */
> +  FUNC_FINDER (strnlen,
> +              FIND_FUNC (strnlen, 1, __strnlen_sse2_no_bsf)
> +              FIND_FUNC (strnlen, 1, __strnlen_sse2))
> +
> +  /* Support sysdeps/x86_64/multiarch/strpbrk.S.  */
> +  FUNC_FINDER (strpbrk,
> +              FIND_FUNC (strpbrk, HAS_SSE4_2, __strpbrk_sse42)
> +              FIND_FUNC (strpbrk, 1, __strpbrk_sse2))
> +
> +  /* Support sysdeps/x86_64/multiarch/strrchr.S.  */
> +  FUNC_FINDER (strrchr,
> +              FIND_FUNC (strrchr, HAS_SSE4_2, __strrchr_sse42)
> +              FIND_FUNC (strrchr, 1, __strrchr_sse2_no_bsf)
> +              FIND_FUNC (strrchr, 1, __strrchr_sse2))
> +
> +  /* Support sysdeps/x86_64/multiarch/strspn.S.  */
> +  FUNC_FINDER (strspn,
> +              FIND_FUNC (strspn, HAS_SSE4_2, __strspn_sse42)
> +              FIND_FUNC (strspn, 1, __strspn_sse2))
> +
> +  /* Support sysdeps/x86_64/multiarch/strstr-c.c.  */
> +  FUNC_FINDER (strstr,
> +              FIND_FUNC (strstr, HAS_SSE4_2, __strstr_sse42)
> +              FIND_FUNC (strstr, 1, __strstr_sse2))
> +
> +  /* Support sysdeps/x86_64/multiarch/wcscpy.S.  */
> +  FUNC_FINDER (wcscpy,
> +              FIND_FUNC (wcscpy, HAS_SSSE3, __wcscpy_ssse3)
> +              FIND_FUNC (wcscpy, 1, __wcscpy_sse2))
> +
> +  /* Support sysdeps/x86_64/multiarch/wmemcmp.S.  */
> +  FUNC_FINDER (wmemcmp,
> +              FIND_FUNC (wmemcmp, HAS_SSE4_1, __wmemcmp_sse4_1)
> +              FIND_FUNC (wmemcmp, HAS_SSSE3, __wmemcmp_ssse3)
> +              FIND_FUNC (wmemcmp, 1, __wmemcmp_sse2))
> +
> +#ifdef SHARED
> +  /* Support sysdeps/x86_64/multiarch/memcpy_chk.S.  */
> +  FUNC_FINDER (__memcpy_chk,
> +              FIND_FUNC (__memcpy_chk, HAS_SSSE3, __memcpy_chk_ssse3_back)
> +              FIND_FUNC (__memcpy_chk, HAS_SSSE3, __memcpy_chk_ssse3)
> +              FIND_FUNC (__memcpy_chk, 1, __memcpy_chk_sse2))
> +
> +  /* Support sysdeps/x86_64/multiarch/memcpy.S.  */
> +  FUNC_FINDER (memcpy,
> +              FIND_FUNC (memcpy, HAS_SSSE3, __memcpy_ssse3_back)
> +              FIND_FUNC (memcpy, HAS_SSSE3, __memcpy_ssse3)
> +              FIND_FUNC (memcpy, 1, __memcpy_sse2))
> +
> +  /* Support sysdeps/x86_64/multiarch/mempcpy_chk.S.  */
> +  FUNC_FINDER (__mempcpy_chk,
> +              FIND_FUNC (__mempcpy_chk, HAS_SSSE3, __mempcpy_chk_ssse3_back)
> +              FIND_FUNC (__mempcpy_chk, HAS_SSSE3, __mempcpy_chk_ssse3)
> +              FIND_FUNC (__mempcpy_chk, 1, __mempcpy_chk_sse2))
> +
> +  /* Support sysdeps/x86_64/multiarch/mempcpy.S.  */
> +  FUNC_FINDER (mempcpy,
> +              FIND_FUNC (mempcpy, HAS_SSSE3, __mempcpy_ssse3_back)
> +              FIND_FUNC (mempcpy, HAS_SSSE3, __mempcpy_ssse3)
> +              FIND_FUNC (mempcpy, 1, __mempcpy_sse2))
> +
> +  /* Support sysdeps/x86_64/multiarch/strlen.S.  */
> +  FUNC_FINDER (strlen,
> +              FIND_FUNC (strlen, HAS_SSE4_2, __strlen_sse42)
> +              FIND_FUNC (strlen, 1, __strlen_sse2_pminub)
> +              FIND_FUNC (strlen, 1, __strlen_sse2_no_bsf)
> +              FIND_FUNC (strlen, 1, __strlen_sse2)
> +              FIND_FUNC (strlen, 1, __strlen_sse2))
> +
> +  /* Support sysdeps/x86_64/multiarch/strncmp.S.  */
> +  FUNC_FINDER (strncmp,
> +              FIND_FUNC (strncmp, HAS_SSE4_2, __strncmp_sse42)
> +              FIND_FUNC (strncmp, HAS_SSSE3, __strncmp_ssse3)
> +              FIND_FUNC (strncmp, 1, __strncmp_sse2))
> +#endif
> +
> +  return i;
> +}
> diff --git a/sysdeps/x86_64/multiarch/memcmp.S b/sysdeps/x86_64/multiarch/memcmp.S
> index b2bc4d7..f2c9b30 100644
> --- a/sysdeps/x86_64/multiarch/memcmp.S
> +++ b/sysdeps/x86_64/multiarch/memcmp.S
> @@ -48,6 +48,8 @@ END(memcmp)
>  # define ENTRY(name) \
>         .type __memcmp_sse2, @function; \
>         .p2align 4; \
> +       .globl __memcmp_sse2; \
> +       .hidden __memcmp_sse2; \
>         __memcmp_sse2: cfi_startproc; \
>         CALL_MCOUNT
>  # undef END
> diff --git a/sysdeps/x86_64/multiarch/memcpy.S b/sysdeps/x86_64/multiarch/memcpy.S
> index a77cdfb..0c1c1e6 100644
> --- a/sysdeps/x86_64/multiarch/memcpy.S
> +++ b/sysdeps/x86_64/multiarch/memcpy.S
> @@ -45,6 +45,8 @@ END(__new_memcpy)
>  # undef ENTRY
>  # define ENTRY(name) \
>         .type __memcpy_sse2, @function; \
> +       .globl __memcpy_sse2; \
> +       .hidden __memcpy_sse2; \
>         .p2align 4; \
>         __memcpy_sse2: cfi_startproc; \
>         CALL_MCOUNT
> diff --git a/sysdeps/x86_64/multiarch/mempcpy.S b/sysdeps/x86_64/multiarch/mempcpy.S
> index caa435b..2fac9d7 100644
> --- a/sysdeps/x86_64/multiarch/mempcpy.S
> +++ b/sysdeps/x86_64/multiarch/mempcpy.S
> @@ -43,6 +43,8 @@ END(__mempcpy)
>  # define ENTRY(name) \
>         .type __mempcpy_sse2, @function; \
>         .p2align 4; \
> +       .globl __mempcpy_sse2; \
> +       .hidden __mempcpy_sse2; \
>         __mempcpy_sse2: cfi_startproc; \
>         CALL_MCOUNT
>  # undef END
> diff --git a/sysdeps/x86_64/multiarch/rawmemchr.S b/sysdeps/x86_64/multiarch/rawmemchr.S
> index c4157ad..ebcc17e 100644
> --- a/sysdeps/x86_64/multiarch/rawmemchr.S
> +++ b/sysdeps/x86_64/multiarch/rawmemchr.S
> @@ -44,6 +44,8 @@ strong_alias (rawmemchr, __rawmemchr)
>         .section .text.sse4.2,"ax",@progbits
>         .align  16
>         .type   __rawmemchr_sse42, @function
> +       .globl __rawmemchr_sse42
> +       .hidden __rawmemchr_sse42
>  __rawmemchr_sse42:
>         cfi_startproc
>         CALL_MCOUNT
> @@ -81,6 +83,8 @@ __rawmemchr_sse42:
>  # define ENTRY(name) \
>         .type __rawmemchr_sse2, @function; \
>         .align 16; \
> +       .globl __rawmemchr_sse2; \
> +       .hidden __rawmemchr_sse2; \
>         __rawmemchr_sse2: cfi_startproc; \
>         CALL_MCOUNT
>  # undef END
> diff --git a/sysdeps/x86_64/multiarch/strcat.S b/sysdeps/x86_64/multiarch/strcat.S
> index 0c256de..1ba69b6 100644
> --- a/sysdeps/x86_64/multiarch/strcat.S
> +++ b/sysdeps/x86_64/multiarch/strcat.S
> @@ -63,6 +63,8 @@ END(STRCAT)
>  # define ENTRY(name) \
>         .type STRCAT_SSE2, @function; \
>         .align 16; \
> +       .globl STRCAT_SSE2; \
> +       .hidden STRCAT_SSE2; \
>         STRCAT_SSE2: cfi_startproc; \
>         CALL_MCOUNT
>  # undef END
> diff --git a/sysdeps/x86_64/multiarch/strchr.S b/sysdeps/x86_64/multiarch/strchr.S
> index b9f88e4..5c8aa7c 100644
> --- a/sysdeps/x86_64/multiarch/strchr.S
> +++ b/sysdeps/x86_64/multiarch/strchr.S
> @@ -82,6 +82,8 @@ END(strchr)
>         .section .text.sse4.2,"ax",@progbits
>         .align  16
>         .type   __strchr_sse42, @function
> +       .globl  __strchr_sse42
> +       .hidden __strchr_sse42
>  __strchr_sse42:
>         cfi_startproc
>         CALL_MCOUNT
> @@ -164,6 +166,8 @@ L(loop_exit):
>  # define ENTRY(name) \
>         .type __strchr_sse2, @function; \
>         .align 16; \
> +       .globl __strchr_sse2; \
> +       .hidden __strchr_sse2; \
>         __strchr_sse2: cfi_startproc; \
>         CALL_MCOUNT
>  # undef END
> diff --git a/sysdeps/x86_64/multiarch/strcmp-sse42.S b/sysdeps/x86_64/multiarch/strcmp-sse42.S
> index 9d00bbc..4fadfcb 100644
> --- a/sysdeps/x86_64/multiarch/strcmp-sse42.S
> +++ b/sysdeps/x86_64/multiarch/strcmp-sse42.S
> @@ -48,6 +48,8 @@
>         .section .text.SECTION,"ax",@progbits
>         .align  16
>         .type   STRCMP_SSE42, @function
> +       .globl  STRCMP_SSE42
> +       .hidden STRCMP_SSE42
>  #ifdef USE_AS_STRCASECMP_L
>  ENTRY (GLABEL(__strcasecmp))
>         movq    __libc_tsd_LOCALE@gottpoff(%rip),%rax
> diff --git a/sysdeps/x86_64/multiarch/strcmp.S b/sysdeps/x86_64/multiarch/strcmp.S
> index d366d09..fb9b0fb 100644
> --- a/sysdeps/x86_64/multiarch/strcmp.S
> +++ b/sysdeps/x86_64/multiarch/strcmp.S
> @@ -171,6 +171,8 @@ weak_alias (__strncasecmp, strncasecmp)
>  # define ENTRY(name) \
>         .type STRCMP_SSE2, @function; \
>         .align 16; \
> +       .globl STRCMP_SSE2; \
> +       .hidden STRCMP_SSE2; \
>         STRCMP_SSE2: cfi_startproc; \
>         CALL_MCOUNT
>  # undef END
> @@ -181,6 +183,8 @@ weak_alias (__strncasecmp, strncasecmp)
>  #  define ENTRY2(name) \
>         .type __strcasecmp_sse2, @function; \
>         .align 16; \
> +       .globl __strcasecmp_sse2; \
> +       .hidden __strcasecmp_sse2; \
>         __strcasecmp_sse2: cfi_startproc; \
>         CALL_MCOUNT
>  #  define END2(name) \
> @@ -191,6 +195,8 @@ weak_alias (__strncasecmp, strncasecmp)
>  #  define ENTRY2(name) \
>         .type __strncasecmp_sse2, @function; \
>         .align 16; \
> +       .globl __strncasecmp_sse2; \
> +       .hidden __strncasecmp_sse2; \
>         __strncasecmp_sse2: cfi_startproc; \
>         CALL_MCOUNT
>  #  define END2(name) \
> diff --git a/sysdeps/x86_64/multiarch/strcpy.S b/sysdeps/x86_64/multiarch/strcpy.S
> index 7be1b8b..b97215e 100644
> --- a/sysdeps/x86_64/multiarch/strcpy.S
> +++ b/sysdeps/x86_64/multiarch/strcpy.S
> @@ -77,6 +77,8 @@ END(STRCPY)
>  # define ENTRY(name) \
>         .type STRCPY_SSE2, @function; \
>         .align 16; \
> +       .globl STRCPY_SSE2; \
> +       .hidden STRCPY_SSE2; \
>         STRCPY_SSE2: cfi_startproc; \
>         CALL_MCOUNT
>  # undef END
> diff --git a/sysdeps/x86_64/multiarch/strlen.S b/sysdeps/x86_64/multiarch/strlen.S
> index 0c46b4f..bab0ac3 100644
> --- a/sysdeps/x86_64/multiarch/strlen.S
> +++ b/sysdeps/x86_64/multiarch/strlen.S
> @@ -49,6 +49,8 @@ END(strlen)
>  # define ENTRY(name) \
>         .type __strlen_sse2, @function; \
>         .align 16; \
> +       .globl __strlen_sse2; \
> +       .hidden __strlen_sse2; \
>         __strlen_sse2: cfi_startproc; \
>         CALL_MCOUNT
>  # undef END
> diff --git a/sysdeps/x86_64/multiarch/strnlen.S b/sysdeps/x86_64/multiarch/strnlen.S
> index 044b910..86b32d8 100644
> --- a/sysdeps/x86_64/multiarch/strnlen.S
> +++ b/sysdeps/x86_64/multiarch/strnlen.S
> @@ -40,6 +40,8 @@ END(__strnlen)
>  # define ENTRY(name) \
>         .type __strnlen_sse2, @function; \
>         .align 16; \
> +       .globl __strnlen_sse2; \
> +       .hidden __strnlen_sse2; \
>         __strnlen_sse2: cfi_startproc; \
>         CALL_MCOUNT
>  # undef END
> diff --git a/sysdeps/x86_64/multiarch/strrchr.S b/sysdeps/x86_64/multiarch/strrchr.S
> index c87d8fa..1ccaf4a 100644
> --- a/sysdeps/x86_64/multiarch/strrchr.S
> +++ b/sysdeps/x86_64/multiarch/strrchr.S
> @@ -87,6 +87,8 @@ END(strrchr)
>         .section .text.sse4.2,"ax",@progbits
>         .align  16
>         .type   __strrchr_sse42, @function
> +       .globl  __strrchr_sse42
> +       .hidden __strrchr_sse42
>  __strrchr_sse42:
>         cfi_startproc
>         CALL_MCOUNT
> @@ -265,6 +267,8 @@ L(psrldq_table):
>  # define ENTRY(name) \
>         .type __strrchr_sse2, @function; \
>         .align 16; \
> +       .globl __strrchr_sse2; \
> +       .hidden __strrchr_sse2; \
>         __strrchr_sse2: cfi_startproc; \
>         CALL_MCOUNT
>  # undef END
> --
> 1.7.11.4
>

Are they OK to install?

-- 
H.J.


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