This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
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