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 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


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