This is the mail archive of the glibc-cvs@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]

GNU C Library master sources branch hjl/ifunc/test created. glibc-2.16-ports-merge-414-ge29500d


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".

The branch, hjl/ifunc/test has been created
        at  e29500d77589bd8360d2447f48c70efded989cf5 (commit)

- Log -----------------------------------------------------------------
http://sources.redhat.com/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=e29500d77589bd8360d2447f48c70efded989cf5

commit e29500d77589bd8360d2447f48c70efded989cf5
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Wed Sep 26 07:33:06 2012 -0700

    Add wcsmbs IFUNC tests

diff --git a/ChangeLog.test-ifunc b/ChangeLog.test-ifunc
index 36e2ce7..326fd60 100644
--- a/ChangeLog.test-ifunc
+++ b/ChangeLog.test-ifunc
@@ -1,5 +1,15 @@
 2012-09-26  H.J. Lu  <hongjiu.lu@intel.com>
 
+	* wcsmbs/Makefile (ifunc-tests): New macro.
+	(tests-ifunc): Likewise.
+	(tests): Add $(tests-ifunc).
+	* wcsmbs/test-wcschr-ifunc.c: New file.
+	* wcsmbs/test-wcscmp-ifunc.c: Likewise.
+	* wcsmbs/test-wcscpy-ifunc.c: Likewise.
+	* wcsmbs/test-wcslen-ifunc.c: Likewise.
+	* wcsmbs/test-wcsrchr-ifunc.c: Likewise.
+	* wcsmbs/test-wmemcmp-ifunc.c: Likewise.
+
 	* string/Makefile (ifunc-tests): New macro.
 	(tests-ifunc): Likewise.
 	(tests): Add $(tests-ifunc).
diff --git a/wcsmbs/Makefile b/wcsmbs/Makefile
index 7402ec9..b8e4e68 100644
--- a/wcsmbs/Makefile
+++ b/wcsmbs/Makefile
@@ -45,6 +45,9 @@ strop-tests :=  wcscmp wmemcmp wcslen wcschr wcsrchr wcscpy
 tests := tst-wcstof wcsmbs-tst1 tst-wcsnlen tst-btowc tst-mbrtowc \
 	 tst-wcrtomb tst-wcpncpy tst-mbsrtowcs tst-wchar-h tst-mbrtowc2 \
 	 tst-c16c32-1 wcsatcliff $(addprefix test-,$(strop-tests))
+ifunc-tests = $(addprefix test-,$(strop-tests))
+tests-ifunc = $(addsuffix -ifunc,$(ifunc-tests))
+tests += $(tests-ifunc)
 
 include ../Rules
 
diff --git a/wcsmbs/test-wcschr-ifunc.c b/wcsmbs/test-wcschr-ifunc.c
new file mode 100644
index 0000000..29fb77d
--- /dev/null
+++ b/wcsmbs/test-wcschr-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-wcschr.c"
diff --git a/wcsmbs/test-wcscmp-ifunc.c b/wcsmbs/test-wcscmp-ifunc.c
new file mode 100644
index 0000000..9384579
--- /dev/null
+++ b/wcsmbs/test-wcscmp-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-wcscmp.c"
diff --git a/wcsmbs/test-wcscpy-ifunc.c b/wcsmbs/test-wcscpy-ifunc.c
new file mode 100644
index 0000000..3b69ea2
--- /dev/null
+++ b/wcsmbs/test-wcscpy-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-wcscpy.c"
diff --git a/wcsmbs/test-wcslen-ifunc.c b/wcsmbs/test-wcslen-ifunc.c
new file mode 100644
index 0000000..49735c4
--- /dev/null
+++ b/wcsmbs/test-wcslen-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-wcslen.c"
diff --git a/wcsmbs/test-wcsrchr-ifunc.c b/wcsmbs/test-wcsrchr-ifunc.c
new file mode 100644
index 0000000..b02a2a2
--- /dev/null
+++ b/wcsmbs/test-wcsrchr-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-wcsrchr.c"
diff --git a/wcsmbs/test-wmemcmp-ifunc.c b/wcsmbs/test-wmemcmp-ifunc.c
new file mode 100644
index 0000000..b07341e
--- /dev/null
+++ b/wcsmbs/test-wmemcmp-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-wmemcmp.c"

http://sources.redhat.com/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=6b18ffac3a07b037688d89093c0239bba4e62c60

commit 6b18ffac3a07b037688d89093c0239bba4e62c60
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Wed Sep 26 07:29:35 2012 -0700

    Add string IFUNC tests

diff --git a/ChangeLog.test-ifunc b/ChangeLog.test-ifunc
index 4019144..36e2ce7 100644
--- a/ChangeLog.test-ifunc
+++ b/ChangeLog.test-ifunc
@@ -1,5 +1,64 @@
 2012-09-26  H.J. Lu  <hongjiu.lu@intel.com>
 
+	* string/Makefile (ifunc-tests): New macro.
+	(tests-ifunc): Likewise.
+	(tests): Add $(tests-ifunc).
+	* string/test-memccpy.c (TEST_NAME): New macro.
+	* string/test-memchr.c (TEST_NAME): Likewise.
+	* string/test-memcmp.c (TEST_NAME): Likewise.
+	* string/test-memcpy.c (TEST_NAME): Likewise.
+	* string/test-memmem.c (TEST_NAME): Likewise.
+	* string/test-memmove.c (TEST_NAME): Likewise.
+	* string/test-memset.c (TEST_NAME): Likewise.
+	* string/test-rawmemchr.c (TEST_NAME): Likewise.
+	* string/test-stpcpy.c (TEST_NAME): Likewise.
+	* string/test-stpncpy.c (TEST_NAME): Likewise.
+	* string/test-strcasecmp.c (TEST_NAME): Likewise.
+	* string/test-strcasestr.c (TEST_NAME): Likewise.
+	* string/test-strcat.c (TEST_NAME): Likewise.
+	* string/test-strchr.c (TEST_NAME): Likewise.
+	* string/test-strcmp.c(TEST_NAME): Likewise.
+	* string/test-strcpy.c (TEST_NAME): Likewise.
+	* string/test-strcspn.c (TEST_NAME): Likewise.
+	* string/test-strlen.c (TEST_NAME): Likewise.
+	* string/test-strncasecmp.c (TEST_NAME): Likewise.
+	* string/test-strncmp.c (TEST_NAME): Likewise.
+	* string/test-strncpy.c (TEST_NAME): Likewise.
+	* string/test-strnlen.c (TEST_NAME): Likewise.
+	* string/test-strpbrk.c (TEST_NAME): Likewise.
+	* string/test-strrchr.c (TEST_NAME): Likewise.
+	* string/test-strspn.c (TEST_NAME): Likewise.
+	* string/test-strstr.c (TEST_NAME): Likewise.
+	* string/test-memccpy-ifunc.c: New file.
+	* string/test-memchr-ifunc.c: Likewise.
+	* string/test-memcmp-ifunc.c: Likewise.
+	* string/test-memcpy-ifunc.c: Likewise.
+	* string/test-memmem-ifunc.c: Likewise.
+	* string/test-memmove-ifunc.c: Likewise.
+	* string/test-mempcpy-ifunc.c: Likewise.
+	* string/test-memset-ifunc.c: Likewise.
+	* string/test-rawmemchr-ifunc.c: Likewise.
+	* string/test-stpcpy-ifunc.c: Likewise.
+	* string/test-stpncpy-ifunc.c: Likewise.
+	* string/test-strcasecmp-ifunc.c: Likewise.
+	* string/test-strcasestr-ifunc.c: Likewise.
+	* string/test-strcat-ifunc.c: Likewise.
+	* string/test-strchr-ifunc.c: Likewise.
+	* string/test-strchrnul-ifunc.c: Likewise.
+	* string/test-strcmp-ifunc.c: Likewise.
+	* string/test-strcpy-ifunc.c: Likewise.
+	* string/test-strcspn-ifunc.c: Likewise.
+	* string/test-strlen-ifunc.c: Likewise.
+	* string/test-strncasecmp-ifunc.c: Likewise.
+	* string/test-strncat-ifunc.c: Likewise.
+	* string/test-strncmp-ifunc.c: Likewise.
+	* string/test-strncpy-ifunc.c: Likewise.
+	* string/test-strnlen-ifunc.c: Likewise.
+	* string/test-strpbrk-ifunc.c: Likewise.
+	* string/test-strrchr-ifunc.c: Likewise.
+	* string/test-strspn-ifunc.c: Likewise.
+	* string/test-strstr-ifunc.c: Likewise.
+
 	* debug/Makefile (ifunc-tests): New variable.
 	(tests-ifunc): Likewise.
 	* debug/test-stpcpy_chk.c (TEST_NAME): New macro.
diff --git a/string/Makefile b/string/Makefile
index 2f7927a..51e9fde 100644
--- a/string/Makefile
+++ b/string/Makefile
@@ -64,6 +64,9 @@ tests		:= tester inl-tester noinl-tester testcopy test-ffs	\
 		   bug-envz1 tst-strxfrm2 tst-endian tst-svc2		\
 		   bug-strstr1 bug-strcasestr1 bug-strchr1 tst-strtok_r
 
+ifunc-tests = $(addprefix test-,$(strop-tests))
+tests-ifunc = $(addsuffix -ifunc,$(ifunc-tests))
+tests += $(tests-ifunc)
 
 include ../Rules
 
diff --git a/string/test-memccpy-ifunc.c b/string/test-memccpy-ifunc.c
new file mode 100644
index 0000000..4ae2d67
--- /dev/null
+++ b/string/test-memccpy-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-memccpy.c"
diff --git a/string/test-memccpy.c b/string/test-memccpy.c
index 8fa96bc..05940ee 100644
--- a/string/test-memccpy.c
+++ b/string/test-memccpy.c
@@ -1,5 +1,5 @@
 /* Test and measure memccpy functions.
-   Copyright (C) 1999, 2002, 2003, 2005 Free Software Foundation, Inc.
+   Copyright (C) 1999-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Written by Jakub Jelinek <jakub@redhat.com>, 1999.
 
@@ -18,6 +18,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #define TEST_MAIN
+#define TEST_NAME "memccpy"
 #include "test-string.h"
 
 void *simple_memccpy (void *, const void *, int, size_t);
diff --git a/string/test-memchr-ifunc.c b/string/test-memchr-ifunc.c
new file mode 100644
index 0000000..4b9068b
--- /dev/null
+++ b/string/test-memchr-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-memchr.c"
diff --git a/string/test-memchr.c b/string/test-memchr.c
index 315726d..cad639b 100644
--- a/string/test-memchr.c
+++ b/string/test-memchr.c
@@ -1,5 +1,5 @@
 /* Test and measure memchr functions.
-   Copyright (C) 1999, 2002, 2003, 2005, 2009 Free Software Foundation, Inc.
+   Copyright (C) 1999-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Written by Jakub Jelinek <jakub@redhat.com>, 1999.
 
@@ -18,6 +18,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #define TEST_MAIN
+#define TEST_NAME "memchr"
 #include "test-string.h"
 
 typedef char *(*proto_t) (const char *, int, size_t);
diff --git a/string/test-memcmp-ifunc.c b/string/test-memcmp-ifunc.c
new file mode 100644
index 0000000..de7d29c
--- /dev/null
+++ b/string/test-memcmp-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-memcmp.c"
diff --git a/string/test-memcmp.c b/string/test-memcmp.c
index 69076d0..fc9d4d2 100644
--- a/string/test-memcmp.c
+++ b/string/test-memcmp.c
@@ -19,6 +19,11 @@
    <http://www.gnu.org/licenses/>.  */
 
 #define TEST_MAIN
+#ifdef WIDE
+# define TEST_NAME "wmemcmp"
+#else
+# define TEST_NAME "memcmp"
+#endif
 #include "test-string.h"
 #ifdef WIDE
 # include <inttypes.h>
diff --git a/string/test-memcpy-ifunc.c b/string/test-memcpy-ifunc.c
new file mode 100644
index 0000000..36d70a0
--- /dev/null
+++ b/string/test-memcpy-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-memcpy.c"
diff --git a/string/test-memcpy.c b/string/test-memcpy.c
index 311b4b4..1340c75 100644
--- a/string/test-memcpy.c
+++ b/string/test-memcpy.c
@@ -1,5 +1,5 @@
 /* Test and measure memcpy functions.
-   Copyright (C) 1999, 2002, 2003, 2005 Free Software Foundation, Inc.
+   Copyright (C) 1999-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Written by Jakub Jelinek <jakub@redhat.com>, 1999.
 
@@ -21,6 +21,7 @@
 # define MEMCPY_RESULT(dst, len) dst
 # define MIN_PAGE_SIZE 131072
 # define TEST_MAIN
+# define TEST_NAME "memcpy"
 # include "test-string.h"
 
 char *simple_memcpy (char *, const char *, size_t);
diff --git a/string/test-memmem-ifunc.c b/string/test-memmem-ifunc.c
new file mode 100644
index 0000000..ae87c13
--- /dev/null
+++ b/string/test-memmem-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-memmem.c"
diff --git a/string/test-memmem.c b/string/test-memmem.c
index 4076029..bfeaaa9 100644
--- a/string/test-memmem.c
+++ b/string/test-memmem.c
@@ -1,5 +1,5 @@
 /* Test and measure memmem functions.
-   Copyright (C) 2008 Free Software Foundation, Inc.
+   Copyright (C) 2008-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Written by Ulrich Drepper <drepper@redhat.com>, 2008.
 
@@ -18,6 +18,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #define TEST_MAIN
+#define TEST_NAME "memmem"
 #define BUF1PAGES 20
 #define ITERATIONS 500
 #include "test-string.h"
diff --git a/string/test-memmove-ifunc.c b/string/test-memmove-ifunc.c
new file mode 100644
index 0000000..0d8f836
--- /dev/null
+++ b/string/test-memmove-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-memmove.c"
diff --git a/string/test-memmove.c b/string/test-memmove.c
index 7d10712..f7e6777 100644
--- a/string/test-memmove.c
+++ b/string/test-memmove.c
@@ -1,5 +1,5 @@
 /* Test and measure memmove functions.
-   Copyright (C) 1999, 2002, 2003 Free Software Foundation, Inc.
+   Copyright (C) 1999-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Written by Jakub Jelinek <jakub@redhat.com>, 1999.
 
@@ -18,6 +18,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #define TEST_MAIN
+#define TEST_NAME "memmove"
 #include "test-string.h"
 
 typedef char *(*proto_t) (char *, const char *, size_t);
diff --git a/string/test-mempcpy-ifunc.c b/string/test-mempcpy-ifunc.c
new file mode 100644
index 0000000..d5f5bd5
--- /dev/null
+++ b/string/test-mempcpy-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-mempcpy.c"
diff --git a/string/test-mempcpy.c b/string/test-mempcpy.c
index c021a66..1679e9d 100644
--- a/string/test-mempcpy.c
+++ b/string/test-mempcpy.c
@@ -1,5 +1,5 @@
 /* Test and measure mempcpy functions.
-   Copyright (C) 1999, 2002 Free Software Foundation, Inc.
+   Copyright (C) 1999-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Written by Jakub Jelinek <jakub@redhat.com>, 1999.
 
@@ -19,6 +19,7 @@
 
 #define MEMCPY_RESULT(dst, len) (dst) + (len)
 #define TEST_MAIN
+#define TEST_NAME "mempcpy"
 #include "test-string.h"
 
 char *simple_mempcpy (char *, const char *, size_t);
diff --git a/string/test-memset-ifunc.c b/string/test-memset-ifunc.c
new file mode 100644
index 0000000..bf19402
--- /dev/null
+++ b/string/test-memset-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-memset.c"
diff --git a/string/test-memset.c b/string/test-memset.c
index 839b8a1..5f60bc5 100644
--- a/string/test-memset.c
+++ b/string/test-memset.c
@@ -1,5 +1,5 @@
 /* Test and measure memset functions.
-   Copyright (C) 1999, 2002, 2003, 2005 Free Software Foundation, Inc.
+   Copyright (C) 1999-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Written by Jakub Jelinek <jakub@redhat.com>, 1999.
 
@@ -18,6 +18,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #define TEST_MAIN
+#define TEST_NAME "memset"
 #define MIN_PAGE_SIZE 131072
 #include "test-string.h"
 
diff --git a/string/test-rawmemchr-ifunc.c b/string/test-rawmemchr-ifunc.c
new file mode 100644
index 0000000..91a30a0
--- /dev/null
+++ b/string/test-rawmemchr-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-rawmemchr.c"
diff --git a/string/test-rawmemchr.c b/string/test-rawmemchr.c
index c8000d6..a3f2c11 100644
--- a/string/test-rawmemchr.c
+++ b/string/test-rawmemchr.c
@@ -1,5 +1,5 @@
 /* Test and measure memchr functions.
-   Copyright (C) 1999,2002,2003,2005,2009,2011 Free Software Foundation, Inc.
+   Copyright (C) 1999-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Written by Jakub Jelinek <jakub@redhat.com>, 1999.
 
@@ -20,6 +20,7 @@
 #include <assert.h>
 
 #define TEST_MAIN
+#define TEST_NAME "rawmemchr"
 #include "test-string.h"
 
 typedef char *(*proto_t) (const char *, int);
diff --git a/string/test-stpcpy-ifunc.c b/string/test-stpcpy-ifunc.c
new file mode 100644
index 0000000..5968d23
--- /dev/null
+++ b/string/test-stpcpy-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-stpcpy.c"
diff --git a/string/test-stpcpy.c b/string/test-stpcpy.c
index accc05c..6a7af0c 100644
--- a/string/test-stpcpy.c
+++ b/string/test-stpcpy.c
@@ -1,5 +1,5 @@
 /* Test and measure stpcpy functions.
-   Copyright (C) 1999, 2002 Free Software Foundation, Inc.
+   Copyright (C) 1999-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Written by Jakub Jelinek <jakub@redhat.com>, 1999.
 
@@ -19,6 +19,7 @@
 
 #define STRCPY_RESULT(dst, len) ((dst) + (len))
 #define TEST_MAIN
+#define TEST_NAME "stpcpy"
 #include "test-string.h"
 
 char *simple_stpcpy (char *, const char *);
diff --git a/string/test-stpncpy-ifunc.c b/string/test-stpncpy-ifunc.c
new file mode 100644
index 0000000..4485c27
--- /dev/null
+++ b/string/test-stpncpy-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-stpncpy.c"
diff --git a/string/test-stpncpy.c b/string/test-stpncpy.c
index 8fb6d79..8647299 100644
--- a/string/test-stpncpy.c
+++ b/string/test-stpncpy.c
@@ -1,5 +1,5 @@
 /* Test and measure stpncpy functions.
-   Copyright (C) 1999, 2002 Free Software Foundation, Inc.
+   Copyright (C) 1999-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Written by Jakub Jelinek <jakub@redhat.com>, 1999.
 
@@ -19,6 +19,7 @@
 
 #define STRNCPY_RESULT(dst, len, n) ((dst) + ((len) > (n) ? (n) : (len)))
 #define TEST_MAIN
+#define TEST_NAME "stpncpy"
 #include "test-string.h"
 
 char *simple_stpncpy (char *, const char *, size_t);
diff --git a/string/test-strcasecmp-ifunc.c b/string/test-strcasecmp-ifunc.c
new file mode 100644
index 0000000..5ae7121
--- /dev/null
+++ b/string/test-strcasecmp-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-strcasecmp.c"
diff --git a/string/test-strcasecmp.c b/string/test-strcasecmp.c
index 039d9c1..202ac60 100644
--- a/string/test-strcasecmp.c
+++ b/string/test-strcasecmp.c
@@ -1,5 +1,5 @@
 /* Test and measure strcasecmp functions.
-   Copyright (C) 1999, 2002, 2003, 2005, 2010 Free Software Foundation, Inc.
+   Copyright (C) 1999-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Written by Jakub Jelinek <jakub@redhat.com>, 1999.
 
@@ -19,6 +19,7 @@
 
 #include <ctype.h>
 #define TEST_MAIN
+#define TEST_NAME "strcasecmp"
 #include "test-string.h"
 
 typedef int (*proto_t) (const char *, const char *);
diff --git a/string/test-strcasestr-ifunc.c b/string/test-strcasestr-ifunc.c
new file mode 100644
index 0000000..07475b1
--- /dev/null
+++ b/string/test-strcasestr-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-strcasestr.c"
diff --git a/string/test-strcasestr.c b/string/test-strcasestr.c
index 6c1a878..650b865 100644
--- a/string/test-strcasestr.c
+++ b/string/test-strcasestr.c
@@ -1,5 +1,5 @@
 /* Test and measure strcasestr functions.
-   Copyright (C) 2010 Free Software Foundation, Inc.
+   Copyright (C) 2010-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Written by Ulrich Drepper <drepper@redhat.com>, 2010.
 
@@ -18,6 +18,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #define TEST_MAIN
+#define TEST_NAME "strcasestr"
 #include "test-string.h"
 
 
diff --git a/string/test-strcat-ifunc.c b/string/test-strcat-ifunc.c
new file mode 100644
index 0000000..9a157cd
--- /dev/null
+++ b/string/test-strcat-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-strcat.c"
diff --git a/string/test-strcat.c b/string/test-strcat.c
index 7dcd7bc..2d90d52 100644
--- a/string/test-strcat.c
+++ b/string/test-strcat.c
@@ -1,5 +1,5 @@
 /* Test and measure strcat functions.
-   Copyright (C) 1999, 2002, 2003, 2005 Free Software Foundation, Inc.
+   Copyright (C) 1999-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Written by Jakub Jelinek <jakub@redhat.com>, 1999.
 
@@ -18,6 +18,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #define TEST_MAIN
+#define TEST_NAME "strcat"
 #include "test-string.h"
 
 typedef char *(*proto_t) (char *, const char *);
diff --git a/string/test-strchr-ifunc.c b/string/test-strchr-ifunc.c
new file mode 100644
index 0000000..6e85e18
--- /dev/null
+++ b/string/test-strchr-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-strchr.c"
diff --git a/string/test-strchr.c b/string/test-strchr.c
index e544aa7..e7c5298 100644
--- a/string/test-strchr.c
+++ b/string/test-strchr.c
@@ -1,5 +1,5 @@
 /* Test and measure STRCHR functions.
-   Copyright (C) 1999, 2002, 2003, 2011 Free Software Foundation, Inc.
+   Copyright (C) 1999-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Written by Jakub Jelinek <jakub@redhat.com>, 1999.
    Added wcschr support by Liubov Dmitrieva <liubov.dmitrieva@gmail.com>, 2011
@@ -19,6 +19,15 @@
    <http://www.gnu.org/licenses/>.  */
 
 #define TEST_MAIN
+#ifndef WIDE
+# ifdef USE_FOR_STRCHRNUL
+#  define TEST_NAME "strchrnul"
+# else
+#  define TEST_NAME "strchr"
+# endif
+#else
+# define TEST_NAME "wcschr"
+#endif
 #include "test-string.h"
 
 #ifndef WIDE
diff --git a/string/test-strchrnul-ifunc.c b/string/test-strchrnul-ifunc.c
new file mode 100644
index 0000000..eb8854f
--- /dev/null
+++ b/string/test-strchrnul-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-strchrnul.c"
diff --git a/string/test-strcmp-ifunc.c b/string/test-strcmp-ifunc.c
new file mode 100644
index 0000000..ea2795f
--- /dev/null
+++ b/string/test-strcmp-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-strcmp.c"
diff --git a/string/test-strcmp.c b/string/test-strcmp.c
index 000c510..f186fd6 100644
--- a/string/test-strcmp.c
+++ b/string/test-strcmp.c
@@ -19,6 +19,11 @@
    <http://www.gnu.org/licenses/>.  */
 
 #define TEST_MAIN
+#ifdef WIDE
+# define TEST_NAME "wcscmp"
+#else
+# define TEST_NAME "strcmp"
+#endif
 #include "test-string.h"
 
 #ifdef WIDE
diff --git a/string/test-strcpy-ifunc.c b/string/test-strcpy-ifunc.c
new file mode 100644
index 0000000..127580f
--- /dev/null
+++ b/string/test-strcpy-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-strcpy.c"
diff --git a/string/test-strcpy.c b/string/test-strcpy.c
index 3a0b118..de57c68 100644
--- a/string/test-strcpy.c
+++ b/string/test-strcpy.c
@@ -1,5 +1,5 @@
 /* Test and measure strcpy functions.
-   Copyright (C) 1999, 2002, 2003, 2005, 2011, 2012 Free Software Foundation, Inc.
+   Copyright (C) 1999-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Written by Jakub Jelinek <jakub@redhat.com>, 1999.
    Added wcscpy support by Liubov Dmitrieva <liubov.dmitrieva@gmail.com>, 2011
@@ -42,6 +42,11 @@
 #ifndef STRCPY_RESULT
 # define STRCPY_RESULT(dst, len) dst
 # define TEST_MAIN
+# ifndef WIDE
+#  define TEST_NAME "strcpy"
+# else
+#  define TEST_NAME "wcscpy"
+# endif
 # include "test-string.h"
 # ifndef WIDE
 #  define SIMPLE_STRCPY simple_strcpy
diff --git a/string/test-strcspn-ifunc.c b/string/test-strcspn-ifunc.c
new file mode 100644
index 0000000..5541516
--- /dev/null
+++ b/string/test-strcspn-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-strcspn.c"
diff --git a/string/test-strcspn.c b/string/test-strcspn.c
index d80947a..e2863c7 100644
--- a/string/test-strcspn.c
+++ b/string/test-strcspn.c
@@ -1,5 +1,5 @@
 /* Test and measure strcspn functions.
-   Copyright (C) 1999, 2002 Free Software Foundation, Inc.
+   Copyright (C) 1999-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Written by Jakub Jelinek <jakub@redhat.com>, 1999.
 
@@ -20,6 +20,7 @@
 #define STRPBRK_RESULT(s, pos) (pos)
 #define RES_TYPE size_t
 #define TEST_MAIN
+#define TEST_NAME "strcspn"
 #include "test-string.h"
 
 typedef size_t (*proto_t) (const char *, const char *);
diff --git a/string/test-strlen-ifunc.c b/string/test-strlen-ifunc.c
new file mode 100644
index 0000000..c879fe8
--- /dev/null
+++ b/string/test-strlen-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-strlen.c"
diff --git a/string/test-strlen.c b/string/test-strlen.c
index 0ac5184..6be7e43 100644
--- a/string/test-strlen.c
+++ b/string/test-strlen.c
@@ -1,5 +1,5 @@
 /* Test and measure STRLEN functions.
-   Copyright (C) 1999, 2002, 2003, 2005, 2011 Free Software Foundation, Inc.
+   Copyright (C) 1999-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Written by Jakub Jelinek <jakub@redhat.com>, 1999.
    Added wcslen support by Liubov Dmitrieva <liubov.dmitrieva@gmail.com>, 2011
@@ -19,6 +19,11 @@
    <http://www.gnu.org/licenses/>.  */
 
 #define TEST_MAIN
+#ifndef WIDE
+# define TEST_NAME "strlen"
+#else
+# define TEST_NAME "wcslen"
+#endif
 #include "test-string.h"
 
 #ifndef WIDE
diff --git a/string/test-strncasecmp-ifunc.c b/string/test-strncasecmp-ifunc.c
new file mode 100644
index 0000000..05824fe
--- /dev/null
+++ b/string/test-strncasecmp-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-strncasecmp.c"
diff --git a/string/test-strncasecmp.c b/string/test-strncasecmp.c
index acfe668..95664f3 100644
--- a/string/test-strncasecmp.c
+++ b/string/test-strncasecmp.c
@@ -19,6 +19,7 @@
 
 #include <ctype.h>
 #define TEST_MAIN
+#define TEST_NAME "strncasecmp"
 #include "test-string.h"
 
 typedef int (*proto_t) (const char *, const char *, size_t);
diff --git a/string/test-strncat-ifunc.c b/string/test-strncat-ifunc.c
new file mode 100644
index 0000000..61b2c87
--- /dev/null
+++ b/string/test-strncat-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-strncat.c"
diff --git a/string/test-strncat.c b/string/test-strncat.c
index 69c8c0b..0cdaa4f 100644
--- a/string/test-strncat.c
+++ b/string/test-strncat.c
@@ -1,5 +1,5 @@
 /* Test and measure strncat functions.
-   Copyright (C) 2011 Free Software Foundation, Inc.
+   Copyright (C) 2011-2012 Free Software Foundation, Inc.
    Contributed by Intel Corporation.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -17,6 +17,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #define TEST_MAIN
+#define TEST_NAME "strncat"
 #include "test-string.h"
 
 typedef char *(*proto_t) (char *, const char *, size_t);
diff --git a/string/test-strncmp-ifunc.c b/string/test-strncmp-ifunc.c
new file mode 100644
index 0000000..a1f14a4
--- /dev/null
+++ b/string/test-strncmp-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-strncmp.c"
diff --git a/string/test-strncmp.c b/string/test-strncmp.c
index 266781b..a66a125 100644
--- a/string/test-strncmp.c
+++ b/string/test-strncmp.c
@@ -1,5 +1,5 @@
 /* Test and measure strncmp functions.
-   Copyright (C) 1999, 2002, 2003, 2010, 2011 Free Software Foundation, Inc.
+   Copyright (C) 1999-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Written by Jakub Jelinek <jakub@redhat.com>, 1999.
 
@@ -18,6 +18,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #define TEST_MAIN
+#define TEST_NAME "strncmp"
 #include "test-string.h"
 
 typedef int (*proto_t) (const char *, const char *, size_t);
diff --git a/string/test-strncpy-ifunc.c b/string/test-strncpy-ifunc.c
new file mode 100644
index 0000000..ed3f04f
--- /dev/null
+++ b/string/test-strncpy-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-strncpy.c"
diff --git a/string/test-strncpy.c b/string/test-strncpy.c
index f683f7d..ba1050f 100644
--- a/string/test-strncpy.c
+++ b/string/test-strncpy.c
@@ -1,5 +1,5 @@
 /* Test and measure strncpy functions.
-   Copyright (C) 1999, 2002, 2003, 2005 Free Software Foundation, Inc.
+   Copyright (C) 1999-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Written by Jakub Jelinek <jakub@redhat.com>, 1999.
 
@@ -20,6 +20,7 @@
 #ifndef STRNCPY_RESULT
 # define STRNCPY_RESULT(dst, len, n) dst
 # define TEST_MAIN
+# define TEST_NAME "strncpy"
 # include "test-string.h"
 
 char *simple_strncpy (char *, const char *, size_t);
diff --git a/string/test-strnlen-ifunc.c b/string/test-strnlen-ifunc.c
new file mode 100644
index 0000000..8615091
--- /dev/null
+++ b/string/test-strnlen-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-strnlen.c"
diff --git a/string/test-strnlen.c b/string/test-strnlen.c
index 547df45..17a2e22 100644
--- a/string/test-strnlen.c
+++ b/string/test-strnlen.c
@@ -1,5 +1,5 @@
 /* Test and measure strlen functions.
-   Copyright (C) 1999, 2002, 2003, 2005, 2010 Free Software Foundation, Inc.
+   Copyright (C) 1999-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Written by Jakub Jelinek <jakub@redhat.com>, 1999.
 
@@ -18,6 +18,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #define TEST_MAIN
+#define TEST_NAME "strnlen"
 #include "test-string.h"
 
 typedef size_t (*proto_t) (const char *, size_t);
diff --git a/string/test-strpbrk-ifunc.c b/string/test-strpbrk-ifunc.c
new file mode 100644
index 0000000..e904c98
--- /dev/null
+++ b/string/test-strpbrk-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-strpbrk.c"
diff --git a/string/test-strpbrk.c b/string/test-strpbrk.c
index 263a7fd..8a3d2bb 100644
--- a/string/test-strpbrk.c
+++ b/string/test-strpbrk.c
@@ -1,5 +1,5 @@
 /* Test and measure strpbrk functions.
-   Copyright (C) 1999, 2002, 2003, 2005 Free Software Foundation, Inc.
+   Copyright (C) 1999-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Written by Jakub Jelinek <jakub@redhat.com>, 1999.
 
@@ -21,6 +21,7 @@
 # define STRPBRK_RESULT(s, pos) ((s)[(pos)] ? (s) + (pos) : NULL)
 # define RES_TYPE char *
 # define TEST_MAIN
+# define TEST_NAME "strpbrk"
 # include "test-string.h"
 
 typedef char *(*proto_t) (const char *, const char *);
diff --git a/string/test-strrchr-ifunc.c b/string/test-strrchr-ifunc.c
new file mode 100644
index 0000000..31d1c6b
--- /dev/null
+++ b/string/test-strrchr-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-strrchr.c"
diff --git a/string/test-strrchr.c b/string/test-strrchr.c
index c63c8de..a58435f 100644
--- a/string/test-strrchr.c
+++ b/string/test-strrchr.c
@@ -1,5 +1,5 @@
 /* Test and measure STRCHR functions.
-   Copyright (C) 1999, 2002, 2003, 2005, 2011 Free Software Foundation, Inc.
+   Copyright (C) 1999-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Written by Jakub Jelinek <jakub@redhat.com>, 1999.
    Added wcsrrchr support by Liubov Dmitrieva <liubov.dmitrieva@gmail.com>,
@@ -20,6 +20,11 @@
    <http://www.gnu.org/licenses/>.  */
 
 #define TEST_MAIN
+#ifdef WIDE
+# define TEST_NAME "wcsrchr"
+#else
+# define TEST_NAME "strrchr"
+#endif
 #include "test-string.h"
 
 #ifdef WIDE
diff --git a/string/test-strspn-ifunc.c b/string/test-strspn-ifunc.c
new file mode 100644
index 0000000..67054f8
--- /dev/null
+++ b/string/test-strspn-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-strspn.c"
diff --git a/string/test-strspn.c b/string/test-strspn.c
index 743bc0a..557db0a 100644
--- a/string/test-strspn.c
+++ b/string/test-strspn.c
@@ -1,5 +1,5 @@
 /* Test and measure strspn functions.
-   Copyright (C) 1999,2002,2003,2005 Free Software Foundation, Inc.
+   Copyright (C) 1999-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Written by Jakub Jelinek <jakub@redhat.com>, 1999.
 
@@ -18,6 +18,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #define TEST_MAIN
+#define TEST_NAME "strspn"
 #include "test-string.h"
 
 typedef size_t (*proto_t) (const char *, const char *);
diff --git a/string/test-strstr-ifunc.c b/string/test-strstr-ifunc.c
new file mode 100644
index 0000000..559646a
--- /dev/null
+++ b/string/test-strstr-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-strstr.c"
diff --git a/string/test-strstr.c b/string/test-strstr.c
index 6be4601..c2c6705 100644
--- a/string/test-strstr.c
+++ b/string/test-strstr.c
@@ -1,5 +1,5 @@
 /* Test and measure strstr functions.
-   Copyright (C) 2010 Free Software Foundation, Inc.
+   Copyright (C) 2010-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Written by Ulrich Drepper <drepper@redhat.com>, 2010.
 
@@ -18,6 +18,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #define TEST_MAIN
+#define TEST_NAME "strstr"
 #include "test-string.h"
 
 

http://sources.redhat.com/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=7c49691b393b2997ffe69e7d6c747061f3dbc2e9

commit 7c49691b393b2997ffe69e7d6c747061f3dbc2e9
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Wed Sep 26 07:03:26 2012 -0700

    Add debug IFUNC tests

diff --git a/ChangeLog.test-ifunc b/ChangeLog.test-ifunc
index f64d40e..4019144 100644
--- a/ChangeLog.test-ifunc
+++ b/ChangeLog.test-ifunc
@@ -1,5 +1,12 @@
 2012-09-26  H.J. Lu  <hongjiu.lu@intel.com>
 
+	* debug/Makefile (ifunc-tests): New variable.
+	(tests-ifunc): Likewise.
+	* debug/test-stpcpy_chk.c (TEST_NAME): New macro.
+	* debug/test-strcpy_chk.c (TEST_NAME): Likewise.
+	* debug/test-stpcpy_chk-ifunc.c: New file.
+	* debug/test-strcpy_chk-ifunc.c: Likewise.
+
 	* sysdeps/x86_64/multiarch/libc-func.c: New file.
 	* sysdeps/x86_64/multiarch/memcmp.S (__memcmp_sse2): Make it
 	global and hidden.
diff --git a/debug/Makefile b/debug/Makefile
index ae5b674..426989b 100644
--- a/debug/Makefile
+++ b/debug/Makefile
@@ -126,6 +126,10 @@ tests = backtrace-tst tst-longjmp_chk tst-chk1 tst-chk2 tst-chk3 \
 	tst-chk4 tst-chk5 tst-chk6 tst-lfschk4 tst-lfschk5 tst-lfschk6 \
 	tst-longjmp_chk2
 
+ifunc-tests = test-stpcpy_chk test-strcpy_chk
+tests-ifunc = $(addsuffix -ifunc,$(ifunc-tests))
+tests += $(tests-ifunc)
+
 extra-libs = libSegFault libpcprofile
 extra-libs-others = $(extra-libs)
 
diff --git a/debug/test-stpcpy_chk-ifunc.c b/debug/test-stpcpy_chk-ifunc.c
new file mode 100644
index 0000000..cf86bc1
--- /dev/null
+++ b/debug/test-stpcpy_chk-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-stpcpy_chk.c"
diff --git a/debug/test-stpcpy_chk.c b/debug/test-stpcpy_chk.c
index f7f9a54..8e2d2d9 100644
--- a/debug/test-stpcpy_chk.c
+++ b/debug/test-stpcpy_chk.c
@@ -1,5 +1,5 @@
 /* Test and measure stpcpy checking functions.
-   Copyright (C) 1999, 2002, 2004 Free Software Foundation, Inc.
+   Copyright (C) 1999-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Written by Jakub Jelinek <jakub@redhat.com>, 1999.
 
@@ -19,6 +19,7 @@
 
 #define STRCPY_RESULT(dst, len) ((dst) + (len))
 #define TEST_MAIN
+#define TEST_NAME "stpcpy_chk"
 #include "../string/test-string.h"
 
 extern void __attribute__ ((noreturn)) __chk_fail (void);
diff --git a/debug/test-strcpy_chk-ifunc.c b/debug/test-strcpy_chk-ifunc.c
new file mode 100644
index 0000000..fff7234
--- /dev/null
+++ b/debug/test-strcpy_chk-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-strcpy_chk.c"
diff --git a/debug/test-strcpy_chk.c b/debug/test-strcpy_chk.c
index 2536362..fb9bc78 100644
--- a/debug/test-strcpy_chk.c
+++ b/debug/test-strcpy_chk.c
@@ -1,5 +1,5 @@
 /* Test and measure __strcpy_chk functions.
-   Copyright (C) 1999, 2002, 2003, 2004 Free Software Foundation, Inc.
+   Copyright (C) 1999-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Written by Jakub Jelinek <jakub@redhat.com>, 1999.
 
@@ -20,6 +20,7 @@
 #ifndef STRCPY_RESULT
 # define STRCPY_RESULT(dst, len) dst
 # define TEST_MAIN
+# define TEST_NAME "strcpy_chk"
 # include "../string/test-string.h"
 
 extern void __attribute__ ((noreturn)) __chk_fail (void);

http://sources.redhat.com/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=7cf09f7121f7d3ba0c760fe1219899ddc0b11227

commit 7cf09f7121f7d3ba0c760fe1219899ddc0b11227
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Fri Sep 28 17:21:55 2012 -0700

    Add x86_64 multiarch __libc_func

diff --git a/ChangeLog.test-ifunc b/ChangeLog.test-ifunc
index 7867b0e..f64d40e 100644
--- a/ChangeLog.test-ifunc
+++ b/ChangeLog.test-ifunc
@@ -1,5 +1,26 @@
 2012-09-26  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..7c84733
--- /dev/null
+++ b/sysdeps/x86_64/multiarch/libc-func.c
@@ -0,0 +1,855 @@
+/* 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 <stdlib.h>
+#include <string.h>
+#include <wchar.h>
+#include <libc-func.h>
+#include "init-arch.h"
+
+#define find_memcmp(array, max)		0
+#define find_memcpy(array, max)		0
+#define find_memmove(array, max)	0
+#define find_mempcpy(array, max)	0
+#define find___memcpy_chk(array, max)	0
+#define find___memmove_chk(array, max)	0
+#define find___mempcpy_chk(array, max)	0
+#define find_memset(array, max)		0
+#define find_rawmemchr(array, max)	0
+#define find_stpcpy(array, max)		0
+#define find_stpncpy(array, max)	0
+#define find_strcpy(array, max)		0
+#define find_strncpy(array, max)	0
+#define find_strcasecmp(array, max)	0
+#define find_strcasecmp_l(array, max)	0
+#define find_strcat(array, max)		0
+#define find_strncat(array, max)	0
+#define find_strcmp(array, max)		0
+#define find_strncasecmp(array, max)	0
+#define find_strncasecmp_l(array, max)	0
+#define find_strncmp(array, max)	0
+#define find_strnlen(array, max)	0
+#define find_strcasestr(array, max)	0
+#define find_strchr(array, max)		0
+#define find_strcspn(array, max)	0
+#define find_strlen(array, max)		0
+#define find_strpbrk(array, max)	0
+#define find_strrchr(array, max)	0
+#define find_strspn(array, max)		0
+#define find_strstr(array, max)		0
+#define find_wcscpy(array, max)		0
+#define find_wmemcmp(array, max)	0
+
+#ifndef NOT_IN_libc
+
+extern __typeof (memmove) __memmove_sse2 attribute_hidden;
+extern __typeof (memmove) __memmove_ssse3 attribute_hidden;
+extern __typeof (memmove) __memmove_ssse3_back attribute_hidden;
+
+# undef find_memmove
+
+static int
+find_memmove (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSSE3)
+    {
+      array[i] = LIBC_FUNC_INIT (__memmove_ssse3_back);
+      array[i + 1] = LIBC_FUNC_INIT (__memmove_ssse3);
+      i += 2;
+    }
+  array[i] = LIBC_FUNC_INIT (__memmove_sse2);
+  return i + 1;
+}
+
+extern void *__memmove_chk (void *, const void *, size_t, size_t);
+extern __typeof (__memmove_chk) __memmove_chk_sse2 attribute_hidden;
+extern __typeof (__memmove_chk) __memmove_chk_ssse3 attribute_hidden;
+extern __typeof (__memmove_chk) __memmove_chk_ssse3_back attribute_hidden;
+
+# undef find___memmove_chk
+
+static int
+find___memmove_chk (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSSE3)
+    {
+      array[i] = LIBC_FUNC_INIT (__memmove_chk_ssse3_back);
+      array[i + 1] = LIBC_FUNC_INIT (__memmove_chk_ssse3);
+      i += 2;
+    }
+  array[i] = LIBC_FUNC_INIT (__memmove_chk_sse2);
+  return i + 1;
+}
+
+extern __typeof (memset) __memset_x86_64 attribute_hidden;
+extern __typeof (memset) __memset_sse2 attribute_hidden;
+
+# undef find_memset
+
+static int
+find_memset (struct libc_func_test *array, int max)
+{
+  array[0] = LIBC_FUNC_INIT (__memset_sse2);
+  array[1] = LIBC_FUNC_INIT (__memset_x86_64);
+  return 2;
+}
+
+extern __typeof (rawmemchr) __rawmemchr_sse2 attribute_hidden;
+extern __typeof (rawmemchr) __rawmemchr_sse42 attribute_hidden;
+
+# undef find_rawmemchr
+
+static int
+find_rawmemchr (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSE4_2)
+    {
+      array[i] = LIBC_FUNC_INIT (__rawmemchr_sse42);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__rawmemchr_sse2);
+  return i + 1;
+}
+
+extern __typeof (stpcpy) __stpcpy_sse2 attribute_hidden;
+extern __typeof (stpcpy) __stpcpy_sse2_unaligned attribute_hidden;
+extern __typeof (stpcpy) __stpcpy_ssse3 attribute_hidden;
+
+# undef find_stpcpy
+
+static int
+find_stpcpy (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSSE3)
+    {
+      array[i] = LIBC_FUNC_INIT (__stpcpy_ssse3);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__stpcpy_sse2);
+  i++;
+  array[i] = LIBC_FUNC_INIT (__stpcpy_sse2_unaligned);
+  return i + 1;
+}
+
+extern __typeof (stpncpy) __stpncpy_sse2 attribute_hidden;
+extern __typeof (stpncpy) __stpncpy_sse2_unaligned attribute_hidden;
+extern __typeof (stpncpy) __stpncpy_ssse3 attribute_hidden;
+
+# undef find_stpncpy
+
+static int
+find_stpncpy (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSSE3)
+    {
+      array[i] = LIBC_FUNC_INIT (__stpncpy_ssse3);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__stpncpy_sse2);
+  i++;
+  array[i] = LIBC_FUNC_INIT (__stpncpy_sse2_unaligned);
+  return i + 1;
+}
+
+extern __typeof (strcpy) __strcpy_sse2 attribute_hidden;
+extern __typeof (strcpy) __strcpy_sse2_unaligned attribute_hidden;
+extern __typeof (strcpy) __strcpy_ssse3 attribute_hidden;
+
+# undef find_strcpy
+
+static int
+find_strcpy (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSSE3)
+    {
+      array[i] = LIBC_FUNC_INIT (__strcpy_ssse3);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__strcpy_sse2);
+  i++;
+  array[i] = LIBC_FUNC_INIT (__strcpy_sse2_unaligned);
+  return i + 1;
+}
+
+extern __typeof (strncpy) __strncpy_sse2 attribute_hidden;
+extern __typeof (strncpy) __strncpy_sse2_unaligned attribute_hidden;
+extern __typeof (strncpy) __strncpy_ssse3 attribute_hidden;
+
+# undef find_strncpy
+
+static int
+find_strncpy (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSSE3)
+    {
+      array[i] = LIBC_FUNC_INIT (__strncpy_ssse3);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__strncpy_sse2);
+  i++;
+  array[i] = LIBC_FUNC_INIT (__strncpy_sse2_unaligned);
+  return i + 1;
+}
+
+extern __typeof (strcasecmp) __strcasecmp_sse2 attribute_hidden;
+extern __typeof (strcasecmp) __strcasecmp_ssse3 attribute_hidden;
+extern __typeof (strcasecmp) __strcasecmp_sse42 attribute_hidden;
+extern __typeof (strcasecmp) __strcasecmp_avx attribute_hidden;
+
+# undef find_strcasecmp
+
+static int
+find_strcasecmp (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_AVX)
+    {
+      array[i] = LIBC_FUNC_INIT (__strcasecmp_avx);
+      i++;
+    }
+  if (HAS_SSE4_2)
+    {
+      array[i] = LIBC_FUNC_INIT (__strcasecmp_sse42);
+      i++;
+    }
+  if (HAS_SSSE3)
+    {
+      array[i] = LIBC_FUNC_INIT (__strcasecmp_ssse3);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__strcasecmp_sse2);
+  return i + 1;
+}
+
+extern __typeof (strcasecmp_l) __strcasecmp_l_sse2 attribute_hidden;
+extern __typeof (strcasecmp_l) __strcasecmp_l_ssse3 attribute_hidden;
+extern __typeof (strcasecmp_l) __strcasecmp_l_sse42 attribute_hidden;
+extern __typeof (strcasecmp_l) __strcasecmp_l_avx attribute_hidden;
+
+# undef find_strcasecmp_l
+
+static int
+find_strcasecmp_l (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_AVX)
+    {
+      array[i] = LIBC_FUNC_INIT (__strcasecmp_l_avx);
+      i++;
+    }
+  if (HAS_SSE4_2)
+    {
+      array[i] = LIBC_FUNC_INIT (__strcasecmp_l_sse42);
+      i++;
+    }
+  if (HAS_SSSE3)
+    {
+      array[i] = LIBC_FUNC_INIT (__strcasecmp_l_ssse3);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__strcasecmp_l_sse2);
+  return i + 1;
+}
+
+extern __typeof (strcat) __strcat_sse2 attribute_hidden;
+extern __typeof (strcat) __strcat_sse2_unaligned attribute_hidden;
+extern __typeof (strcat) __strcat_ssse3 attribute_hidden;
+
+# undef find_strcat
+
+static int
+find_strcat (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSSE3)
+    {
+      array[i] = LIBC_FUNC_INIT (__strcat_ssse3);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__strcat_sse2);
+  i++;
+  array[i] = LIBC_FUNC_INIT (__strcat_sse2_unaligned);
+  return i + 1;
+}
+
+extern __typeof (strncat) __strncat_sse2 attribute_hidden;
+extern __typeof (strncat) __strncat_sse2_unaligned attribute_hidden;
+extern __typeof (strncat) __strncat_ssse3 attribute_hidden;
+
+# undef find_strncat
+
+static int
+find_strncat (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSSE3)
+    {
+      array[i] = LIBC_FUNC_INIT (__strncat_ssse3);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__strncat_sse2);
+  i++;
+  array[i] = LIBC_FUNC_INIT (__strncat_sse2_unaligned);
+  return i + 1;
+}
+
+extern __typeof (strcmp) __strcmp_sse2 attribute_hidden;
+extern __typeof (strcmp) __strcmp_ssse3 attribute_hidden;
+extern __typeof (strcmp) __strcmp_sse42 attribute_hidden;
+
+# undef find_strcmp
+
+static int
+find_strcmp (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSE4_2)
+    {
+      array[i] = LIBC_FUNC_INIT (__strcmp_sse42);
+      i++;
+    }
+  if (HAS_SSSE3)
+    {
+      array[i] = LIBC_FUNC_INIT (__strcmp_ssse3);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__strcmp_sse2);
+  return i + 1;
+}
+
+extern __typeof (strncasecmp) __strncasecmp_sse2 attribute_hidden;
+extern __typeof (strncasecmp) __strncasecmp_ssse3 attribute_hidden;
+extern __typeof (strncasecmp) __strncasecmp_sse42 attribute_hidden;
+extern __typeof (strncasecmp) __strncasecmp_avx attribute_hidden;
+
+# undef find_strncasecmp
+
+static int
+find_strncasecmp (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_AVX)
+    {
+      array[i] = LIBC_FUNC_INIT (__strncasecmp_avx);
+      i++;
+    }
+  if (HAS_SSE4_2)
+    {
+      array[i] = LIBC_FUNC_INIT (__strncasecmp_sse42);
+      i++;
+    }
+  if (HAS_SSSE3)
+    {
+      array[i] = LIBC_FUNC_INIT (__strncasecmp_ssse3);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__strncasecmp_sse2);
+  return i + 1;
+}
+
+extern __typeof (strncasecmp_l) __strncasecmp_l_sse2 attribute_hidden;
+extern __typeof (strncasecmp_l) __strncasecmp_l_ssse3 attribute_hidden;
+extern __typeof (strncasecmp_l) __strncasecmp_l_sse42 attribute_hidden;
+extern __typeof (strncasecmp_l) __strncasecmp_l_avx attribute_hidden;
+
+# undef find_strncasecmp_l
+
+static int
+find_strncasecmp_l (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_AVX)
+    {
+      array[i] = LIBC_FUNC_INIT (__strncasecmp_l_avx);
+      i++;
+    }
+  if (HAS_SSE4_2)
+    {
+      array[i] = LIBC_FUNC_INIT (__strncasecmp_l_sse42);
+      i++;
+    }
+  if (HAS_SSSE3)
+    {
+      array[i] = LIBC_FUNC_INIT (__strncasecmp_l_ssse3);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__strncasecmp_l_sse2);
+  return i + 1;
+}
+
+extern __typeof (strcasestr) __strcasestr_sse2 attribute_hidden;
+extern __typeof (strcasestr) __strcasestr_sse42 attribute_hidden;
+
+# undef find_strcasestr
+
+static int
+find_strcasestr (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSE4_2)
+    {
+      array[i] = LIBC_FUNC_INIT (__strcasestr_sse42);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__strcasestr_sse2);
+  return i + 1;
+}
+
+extern __typeof (strchr) __strchr_sse2 attribute_hidden;
+extern __typeof (strchr) __strchr_sse2_no_bsf attribute_hidden;
+extern __typeof (strchr) __strchr_sse42 attribute_hidden;
+
+# undef find_strchr
+
+static int
+find_strchr (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSE4_2)
+    {
+      array[i] = LIBC_FUNC_INIT (__strchr_sse42);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__strchr_sse2);
+  i++;
+  array[i] = LIBC_FUNC_INIT (__strchr_sse2_no_bsf);
+  return i + 1;
+}
+
+extern __typeof (strcspn) __strcspn_sse2 attribute_hidden;
+extern __typeof (strcspn) __strcspn_sse42 attribute_hidden;
+
+# undef find_strcspn
+
+static int
+find_strcspn (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSE4_2)
+    {
+      array[i] = LIBC_FUNC_INIT (__strcspn_sse42);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__strcspn_sse2);
+  return i + 1;
+}
+
+extern __typeof (strnlen) __strnlen_sse2 attribute_hidden;
+extern __typeof (strnlen) __strnlen_sse2_no_bsf attribute_hidden;
+
+# undef find_strnlen
+
+static int
+find_strnlen (struct libc_func_test *array, int max)
+{
+  array[0] = LIBC_FUNC_INIT (__strnlen_sse2);
+  array[1] = LIBC_FUNC_INIT (__strnlen_sse2_no_bsf);
+  return 2;
+}
+
+extern __typeof (strpbrk) __strpbrk_sse2 attribute_hidden;
+extern __typeof (strpbrk) __strpbrk_sse42 attribute_hidden;
+
+# undef find_strpbrk
+
+static int
+find_strpbrk (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSE4_2)
+    {
+      array[i] = LIBC_FUNC_INIT (__strpbrk_sse42);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__strpbrk_sse2);
+  return i + 1;
+}
+
+extern __typeof (strrchr) __strrchr_sse2 attribute_hidden;
+extern __typeof (strrchr) __strrchr_sse2_no_bsf attribute_hidden;
+extern __typeof (strrchr) __strrchr_sse42 attribute_hidden;
+
+# undef find_strrchr
+
+static int
+find_strrchr (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSE4_2)
+    {
+      array[i] = LIBC_FUNC_INIT (__strrchr_sse42);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__strrchr_sse2);
+  i++;
+  array[i] = LIBC_FUNC_INIT (__strrchr_sse2_no_bsf);
+  return i + 1;
+}
+
+extern __typeof (strspn) __strspn_sse2 attribute_hidden;
+extern __typeof (strspn) __strspn_sse42 attribute_hidden;
+
+# undef find_strspn
+
+static int
+find_strspn (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSE4_2)
+    {
+      array[i] = LIBC_FUNC_INIT (__strspn_sse42);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__strspn_sse2);
+  return i + 1;
+}
+
+extern __typeof (strstr) __strstr_sse2 attribute_hidden;
+extern __typeof (strstr) __strstr_sse42 attribute_hidden;
+
+# undef find_strstr
+
+static int
+find_strstr (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSE4_2)
+    {
+      array[i] = LIBC_FUNC_INIT (__strstr_sse42);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__strstr_sse2);
+  return i + 1;
+}
+
+extern __typeof (wcscpy) __wcscpy_sse2 attribute_hidden;
+extern __typeof (wcscpy) __wcscpy_ssse3 attribute_hidden;
+
+# undef find_wcscpy
+
+static int
+find_wcscpy (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSSE3)
+    {
+      array[i] = LIBC_FUNC_INIT (__wcscpy_ssse3);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__wcscpy_sse2);
+  return i + 1;
+}
+
+extern __typeof (wmemcmp) __wmemcmp_sse2 attribute_hidden;
+extern __typeof (wmemcmp) __wmemcmp_ssse3 attribute_hidden;
+extern __typeof (wmemcmp) __wmemcmp_sse4_1 attribute_hidden;
+
+# undef find_wmemcmp
+
+static int
+find_wmemcmp (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSE4_1)
+    {
+      array[i] = LIBC_FUNC_INIT (__wmemcmp_sse4_1);
+      i++;
+    }
+  if (HAS_SSSE3)
+    {
+      array[i] = LIBC_FUNC_INIT (__wmemcmp_ssse3);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__wmemcmp_sse2);
+  return i + 1;
+}
+
+# ifdef SHARED
+extern __typeof (memcmp) __memcmp_sse2 attribute_hidden;
+extern __typeof (memcmp) __memcmp_ssse3 attribute_hidden;
+extern __typeof (memcmp) __memcmp_sse4_1 attribute_hidden;
+
+#  undef find_memcmp
+
+static int
+find_memcmp (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSE4_1)
+    {
+      array[i] = LIBC_FUNC_INIT (__memcmp_sse4_1);
+      i++;
+    }
+  if (HAS_SSSE3)
+    {
+      array[i] = LIBC_FUNC_INIT (__memcmp_ssse3);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__memcmp_sse2);
+  return i + 1;
+}
+
+extern __typeof (memcpy) __memcpy_sse2 attribute_hidden;
+extern __typeof (memcpy) __memcpy_ssse3 attribute_hidden;
+extern __typeof (memcpy) __memcpy_ssse3_back attribute_hidden;
+
+#  undef find_memcpy
+
+static int
+find_memcpy (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSSE3)
+    {
+      array[i] = LIBC_FUNC_INIT (__memcpy_ssse3_back);
+      array[i + 1] = LIBC_FUNC_INIT (__memcpy_ssse3);
+      i += 2;
+    }
+  array[i] = LIBC_FUNC_INIT (__memcpy_sse2);
+  return i + 1;
+}
+
+extern __typeof (mempcpy) __mempcpy_sse2 attribute_hidden;
+extern __typeof (mempcpy) __mempcpy_ssse3 attribute_hidden;
+extern __typeof (mempcpy) __mempcpy_ssse3_back attribute_hidden;
+
+#  undef find_mempcpy
+
+static int
+find_mempcpy (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSSE3)
+    {
+      array[i] = LIBC_FUNC_INIT (__mempcpy_ssse3_back);
+      array[i + 1] = LIBC_FUNC_INIT (__mempcpy_ssse3);
+      i += 2;
+    }
+  array[i] = LIBC_FUNC_INIT (__mempcpy_sse2);
+  return i + 1;
+}
+
+extern void *__memcpy_chk (void *, const void *, size_t, size_t);
+extern __typeof (__memcpy_chk) __memcpy_chk_sse2 attribute_hidden;
+extern __typeof (__memcpy_chk) __memcpy_chk_ssse3 attribute_hidden;
+extern __typeof (__memcpy_chk) __memcpy_chk_ssse3_back attribute_hidden;
+
+#  undef find___memcpy_chk
+
+static int
+find___memcpy_chk (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSSE3)
+    {
+      array[i] = LIBC_FUNC_INIT (__memcpy_chk_ssse3_back);
+      array[i + 1] = LIBC_FUNC_INIT (__memcpy_chk_ssse3);
+      i += 2;
+    }
+  array[i] = LIBC_FUNC_INIT (__memcpy_chk_sse2);
+  return i + 1;
+}
+
+extern void *__mempcpy_chk (void *, const void *, size_t, size_t);
+extern __typeof (__mempcpy_chk) __mempcpy_chk_sse2 attribute_hidden;
+extern __typeof (__mempcpy_chk) __mempcpy_chk_ssse3 attribute_hidden;
+extern __typeof (__mempcpy_chk) __mempcpy_chk_ssse3_back attribute_hidden;
+
+#  undef find___mempcpy_chk
+
+static int
+find___mempcpy_chk (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSSE3)
+    {
+      array[i] = LIBC_FUNC_INIT (__mempcpy_chk_ssse3_back);
+      array[i + 1] = LIBC_FUNC_INIT (__mempcpy_chk_ssse3);
+      i += 2;
+    }
+  array[i] = LIBC_FUNC_INIT (__mempcpy_chk_sse2);
+  return i + 1;
+}
+
+extern __typeof (strlen) __strlen_sse2 attribute_hidden;
+extern __typeof (strlen) __strlen_sse2_no_bsf attribute_hidden;
+extern __typeof (strlen) __strlen_sse2_pminub attribute_hidden;
+extern __typeof (strlen) __strlen_sse42 attribute_hidden;
+
+#  undef find_strlen
+
+static int
+find_strlen (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSE4_2)
+    {
+      array[i] = LIBC_FUNC_INIT (__strlen_sse42);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__strlen_sse2);
+  i++;
+  array[i] = LIBC_FUNC_INIT (__strlen_sse2_no_bsf);
+  i++;
+  array[i] = LIBC_FUNC_INIT (__strlen_sse2_pminub);
+  return i + 1;
+}
+
+extern __typeof (strncmp) __strncmp_sse2 attribute_hidden;
+extern __typeof (strncmp) __strncmp_ssse3 attribute_hidden;
+extern __typeof (strncmp) __strncmp_sse42 attribute_hidden;
+
+#  undef find_strncmp
+
+static int
+find_strncmp (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSE4_2)
+    {
+      array[i] = LIBC_FUNC_INIT (__strncmp_sse42);
+      i++;
+    }
+  if (HAS_SSSE3)
+    {
+      array[i] = LIBC_FUNC_INIT (__strncmp_ssse3);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__strncmp_sse2);
+  return i + 1;
+}
+# endif /* SHARED */
+#endif /* NOT_IN_libc */
+
+/* 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.  */
+
+int
+__libc_func (const char *name, struct libc_func_test *array, int max)
+{
+  assert (max >= MAX_IFUNC);
+
+  if (strcmp (name, "memcmp") == 0)
+    return find_memcmp (array, max);
+
+  if (strcmp (name, "memcpy") == 0)
+    return find_memcpy (array, max);
+
+  if (strcmp (name, "memmove") == 0)
+    return find_memmove (array, max);
+
+  if (strcmp (name, "mempcpy") == 0)
+    return find_mempcpy (array, max);
+
+  if (strcmp (name, "__memcpy_chk") == 0)
+    return find___memcpy_chk (array, max);
+
+  if (strcmp (name, "__memmove_chk") == 0)
+    return find___memmove_chk (array, max);
+
+  if (strcmp (name, "__mempcpy_chk") == 0)
+    return find___mempcpy_chk (array, max);
+
+  if (strcmp (name, "memset") == 0)
+    return find_memset (array, max);
+
+  if (strcmp (name, "rawmemchr") == 0)
+    return find_rawmemchr (array, max);
+
+  if (strcmp (name, "stpcpy") == 0)
+    return find_stpcpy (array, max);
+
+  if (strcmp (name, "stpncpy") == 0)
+    return find_stpncpy (array, max);
+
+  if (strcmp (name, "strcpy") == 0)
+    return find_strcpy (array, max);
+
+  if (strcmp (name, "strncpy") == 0)
+    return find_strncpy (array, max);
+
+  if (strcmp (name, "strcasecmp") == 0)
+    return find_strcasecmp (array, max);
+
+  if (strcmp (name, "strcasecmp_l") == 0)
+    return find_strcasecmp_l (array, max);
+
+  if (strcmp (name, "strcat") == 0)
+    return find_strcat (array, max);
+
+  if (strcmp (name, "strcmp") == 0)
+    return find_strcmp (array, max);
+
+  if (strcmp (name, "strncasecmp") == 0)
+    return find_strncasecmp (array, max);
+
+  if (strcmp (name, "strncasecmp_l") == 0)
+    return find_strncasecmp_l (array, max);
+
+  if (strcmp (name, "strncat") == 0)
+    return find_strncat (array, max);
+
+  if (strcmp (name, "strncmp") == 0)
+    return find_strncmp (array, max);
+
+  if (strcmp (name, "strnlen") == 0)
+    return find_strnlen (array, max);
+
+  if (strcmp (name, "strcasestr") == 0)
+    return find_strcasestr (array, max);
+
+  if (strcmp (name, "strchr") == 0)
+    return find_strchr (array, max);
+
+  if (strcmp (name, "strcspn") == 0)
+    return find_strcspn (array, max);
+
+  if (strcmp (name, "strlen") == 0)
+    return find_strlen (array, max);
+
+  if (strcmp (name, "strpbrk") == 0)
+    return find_strpbrk (array, max);
+
+  if (strcmp (name, "strrchr") == 0)
+    return find_strrchr (array, max);
+
+  if (strcmp (name, "strspn") == 0)
+    return find_strspn (array, max);
+
+  if (strcmp (name, "strstr") == 0)
+    return find_strstr (array, max);
+
+  if (strcmp (name, "wcscpy") == 0)
+    return find_wcscpy (array, max);
+
+  if (strcmp (name, "wmemcmp") == 0)
+    return find_wmemcmp (array, max);
+
+  return 0;
+}
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

http://sources.redhat.com/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=1a5259674630cbc385dfb59768b486b6f4971d4c

commit 1a5259674630cbc385dfb59768b486b6f4971d4c
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Fri Sep 28 17:21:16 2012 -0700

    Add i686 multiarch __libc_func

diff --git a/ChangeLog.test-ifunc b/ChangeLog.test-ifunc
index d87a641..7867b0e 100644
--- a/ChangeLog.test-ifunc
+++ b/ChangeLog.test-ifunc
@@ -1,5 +1,17 @@
 2012-09-26  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..f3c762d
--- /dev/null
+++ b/sysdeps/i386/i686/multiarch/libc-func.c
@@ -0,0 +1,995 @@
+/* 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 <stdlib.h>
+#include <string.h>
+#include <wchar.h>
+#include <libc-func.h>
+#include "init-arch.h"
+
+#define find_memcmp(array, max)		0
+#define find_memchr(array, max)		0
+#define find_memrchr(array, max)		0
+#define find_rawmemchr(array, max)	0
+#define find_memcpy(array, max)		0
+#define find_memmove(array, max)		0
+#define find_mempcpy(array, max)		0
+#define find___memcpy_chk(array, max)	0
+#define find___memmove_chk(array, max)	0
+#define find___mempcpy_chk(array, max)	0
+#define find_memset(array, max)		0
+#define find_stpcpy(array, max)		0
+#define find_stpncpy(array, max)		0
+#define find_strcpy(array, max)		0
+#define find_strncpy(array, max)		0
+#define find_strcasecmp(array, max)	0
+#define find_strcasecmp_l(array, max)	0
+#define find_strncasecmp(array, max)	0
+#define find_strncasecmp_l(array, max)	0
+#define find_strcasestr(array, max)	0
+#define find_strcat(array, max)		0
+#define find_strncat(array, max)		0
+#define find_strchr(array, max)		0
+#define find_strrchr(array, max)		0
+#define find_strcmp(array, max)		0
+#define find_strncmp(array, max)		0
+#define find_strcspn(array, max)		0
+#define find_strlen(array, max)		0
+#define find_strnlen(array, max)		0
+#define find_strpbrk(array, max)		0
+#define find_strspn(array, max)		0
+#define find_strstr(array, max)		0
+#define find_wcschr(array, max)		0
+#define find_wcscmp(array, max)		0
+#define find_wcscpy(array, max)		0
+#define find_wcslen(array, max)		0
+#define find_wcsrchr(array, max)		0
+#define find_wmemcmp(array, max)		0
+
+#ifndef NOT_IN_libc
+
+extern __typeof (memmove) __memmove_ia32 attribute_hidden;
+extern __typeof (memmove) __memmove_ssse3 attribute_hidden;
+extern __typeof (memmove) __memmove_ssse3_rep attribute_hidden;
+
+# undef find_memmove
+
+static int
+find_memmove (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSSE3)
+    {
+      array[i] = LIBC_FUNC_INIT (__memmove_ssse3_rep);
+      array[i + 1] = LIBC_FUNC_INIT (__memmove_ssse3);
+      i += 2;
+    }
+  array[i] = LIBC_FUNC_INIT (__memmove_ia32);
+  return i + 1;
+}
+
+extern void *__memmove_chk (void *, const void *, size_t, size_t);
+extern __typeof (__memmove_chk) __memmove_chk_ia32 attribute_hidden;
+extern __typeof (__memmove_chk) __memmove_chk_ssse3 attribute_hidden;
+extern __typeof (__memmove_chk) __memmove_chk_ssse3_rep attribute_hidden;
+
+# undef find___memmove_chk
+
+static int
+find___memmove_chk (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSSE3)
+    {
+      array[i] = LIBC_FUNC_INIT (__memmove_chk_ssse3_rep);
+      array[i + 1] = LIBC_FUNC_INIT (__memmove_chk_ssse3);
+      i += 2;
+    }
+  array[i] = LIBC_FUNC_INIT (__memmove_chk_ia32);
+  return i + 1;
+}
+
+extern __typeof (memchr) __memchr_ia32 attribute_hidden;
+extern __typeof (memchr) __memchr_sse2 attribute_hidden;
+extern __typeof (memchr) __memchr_sse2_bsf attribute_hidden;
+
+# undef find_memchr
+
+static int
+find_memchr (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSE2)
+    {
+      array[i] = LIBC_FUNC_INIT (__memchr_sse2_bsf);
+      array[i + 1] = LIBC_FUNC_INIT (__memchr_sse2);
+      i += 2;
+    }
+  array[i] = LIBC_FUNC_INIT (__memchr_ia32);
+  return i + 1;
+}
+
+extern __typeof (memrchr) __memrchr_ia32 attribute_hidden;
+extern __typeof (memrchr) __memrchr_sse2 attribute_hidden;
+extern __typeof (memrchr) __memrchr_sse2_bsf attribute_hidden;
+
+# undef find_memrchr
+
+static int
+find_memrchr (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSE2)
+    {
+      array[i] = LIBC_FUNC_INIT (__memrchr_sse2_bsf);
+      array[i + 1] = LIBC_FUNC_INIT (__memrchr_sse2);
+      i += 2;
+    }
+  array[i] = LIBC_FUNC_INIT (__memrchr_ia32);
+  return i + 1;
+}
+
+extern __typeof (rawmemchr) __rawmemchr_ia32 attribute_hidden;
+extern __typeof (rawmemchr) __rawmemchr_sse2 attribute_hidden;
+extern __typeof (rawmemchr) __rawmemchr_sse2_bsf attribute_hidden;
+
+# undef find_rawmemchr
+
+static int
+find_rawmemchr (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSE2)
+    {
+      array[i] = LIBC_FUNC_INIT (__rawmemchr_sse2_bsf);
+      array[i + 1] = LIBC_FUNC_INIT (__rawmemchr_sse2);
+      i += 2;
+    }
+  array[i] = LIBC_FUNC_INIT (__rawmemchr_ia32);
+  return i + 1;
+}
+
+extern __typeof (memcmp) __memcmp_ia32 attribute_hidden;
+extern __typeof (memcmp) __memcmp_ssse3 attribute_hidden;
+extern __typeof (memcmp) __memcmp_sse4_2 attribute_hidden;
+
+# undef find_memcmp
+
+static int
+find_memcmp (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSE4_2)
+    {
+      array[i] = LIBC_FUNC_INIT (__memcmp_sse4_2);
+      i++;
+    }
+  if (HAS_SSSE3)
+    {
+      array[i] = LIBC_FUNC_INIT (__memcmp_ssse3);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__memcmp_ia32);
+  return i + 1;
+}
+
+extern __typeof (memset) __memset_ia32 attribute_hidden;
+extern __typeof (memset) __memset_sse2 attribute_hidden;
+extern __typeof (memset) __memset_sse2_rep attribute_hidden;
+
+# undef find_memset
+
+static int
+find_memset (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSE2)
+    {
+      array[i] = LIBC_FUNC_INIT (__memset_sse2_rep);
+      array[i + 1] = LIBC_FUNC_INIT (__memset_sse2);
+      i += 2;
+    }
+  array[i] = LIBC_FUNC_INIT (__memset_ia32);
+  return i + 1;
+}
+
+extern __typeof (stpcpy) __stpcpy_ia32 attribute_hidden;
+extern __typeof (stpcpy) __stpcpy_sse2 attribute_hidden;
+extern __typeof (stpcpy) __stpcpy_ssse3 attribute_hidden;
+
+# undef find_stpcpy
+
+static int
+find_stpcpy (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSSE3)
+    {
+      array[i] = LIBC_FUNC_INIT (__stpcpy_ssse3);
+      i++;
+    }
+  if (HAS_SSE2)
+    {
+      array[i] = LIBC_FUNC_INIT (__stpcpy_sse2);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__stpcpy_ia32);
+  return i + 1;
+}
+
+extern __typeof (stpncpy) __stpncpy_ia32 attribute_hidden;
+extern __typeof (stpncpy) __stpncpy_sse2 attribute_hidden;
+extern __typeof (stpncpy) __stpncpy_ssse3 attribute_hidden;
+
+# undef find_stpncpy
+
+static int
+find_stpncpy (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSSE3)
+    {
+      array[i] = LIBC_FUNC_INIT (__stpncpy_ssse3);
+      i++;
+    }
+  if (HAS_SSE2)
+    {
+      array[i] = LIBC_FUNC_INIT (__stpncpy_sse2);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__stpncpy_ia32);
+  return i + 1;
+}
+
+extern __typeof (strcpy) __strcpy_ia32 attribute_hidden;
+extern __typeof (strcpy) __strcpy_sse2 attribute_hidden;
+extern __typeof (strcpy) __strcpy_ssse3 attribute_hidden;
+
+# undef find_strcpy
+
+static int
+find_strcpy (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSSE3)
+    {
+      array[i] = LIBC_FUNC_INIT (__strcpy_ssse3);
+      i++;
+    }
+  if (HAS_SSE2)
+    {
+      array[i] = LIBC_FUNC_INIT (__strcpy_sse2);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__strcpy_ia32);
+  return i + 1;
+}
+
+extern __typeof (strncpy) __strncpy_ia32 attribute_hidden;
+extern __typeof (strncpy) __strncpy_sse2 attribute_hidden;
+extern __typeof (strncpy) __strncpy_ssse3 attribute_hidden;
+
+# undef find_strncpy
+
+static int
+find_strncpy (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSSE3)
+    {
+      array[i] = LIBC_FUNC_INIT (__strncpy_ssse3);
+      i++;
+    }
+  if (HAS_SSE2)
+    {
+      array[i] = LIBC_FUNC_INIT (__strncpy_sse2);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__strncpy_ia32);
+  return i + 1;
+}
+
+extern __typeof (strcasecmp) __strcasecmp_ia32 attribute_hidden;
+extern __typeof (strcasecmp) __strcasecmp_ssse3 attribute_hidden;
+extern __typeof (strcasecmp) __strcasecmp_sse4_2 attribute_hidden;
+
+# undef find_strcasecmp
+
+static int
+find_strcasecmp (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSE4_2)
+    {
+      array[i] = LIBC_FUNC_INIT (__strcasecmp_sse4_2);
+      i++;
+    }
+  if (HAS_SSSE3)
+    {
+      array[i] = LIBC_FUNC_INIT (__strcasecmp_ssse3);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__strcasecmp_ia32);
+  return i + 1;
+}
+
+extern __typeof (strcasecmp_l) __strcasecmp_l_ia32 attribute_hidden;
+extern __typeof (strcasecmp_l) __strcasecmp_l_ssse3 attribute_hidden;
+extern __typeof (strcasecmp_l) __strcasecmp_l_sse4_2 attribute_hidden;
+
+# undef find_strcasecmp_l
+
+static int
+find_strcasecmp_l (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSE4_2)
+    {
+      array[i] = LIBC_FUNC_INIT (__strcasecmp_l_sse4_2);
+      i++;
+    }
+  if (HAS_SSSE3)
+    {
+      array[i] = LIBC_FUNC_INIT (__strcasecmp_l_ssse3);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__strcasecmp_l_ia32);
+  return i + 1;
+}
+
+extern __typeof (strncasecmp) __strncasecmp_ia32 attribute_hidden;
+extern __typeof (strncasecmp) __strncasecmp_ssse3 attribute_hidden;
+extern __typeof (strncasecmp) __strncasecmp_sse4_2 attribute_hidden;
+
+# undef find_strncasecmp
+
+static int
+find_strncasecmp (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSE4_2)
+    {
+      array[i] = LIBC_FUNC_INIT (__strncasecmp_sse4_2);
+      i++;
+    }
+  if (HAS_SSSE3)
+    {
+      array[i] = LIBC_FUNC_INIT (__strncasecmp_ssse3);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__strncasecmp_ia32);
+  return i + 1;
+}
+
+extern __typeof (strncasecmp_l) __strncasecmp_l_ia32 attribute_hidden;
+extern __typeof (strncasecmp_l) __strncasecmp_l_ssse3 attribute_hidden;
+extern __typeof (strncasecmp_l) __strncasecmp_l_sse4_2 attribute_hidden;
+
+# undef find_strncasecmp_l
+
+static int
+find_strncasecmp_l (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSE4_2)
+    {
+      array[i] = LIBC_FUNC_INIT (__strncasecmp_l_sse4_2);
+      i++;
+    }
+  if (HAS_SSSE3)
+    {
+      array[i] = LIBC_FUNC_INIT (__strncasecmp_l_ssse3);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__strncasecmp_l_ia32);
+  return i + 1;
+}
+
+extern __typeof (strcasestr) __strcasestr_ia32 attribute_hidden;
+extern __typeof (strcasestr) __strcasestr_sse42 attribute_hidden;
+
+# undef find_strcasestr
+
+static int
+find_strcasestr (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSE4_2)
+    {
+      array[i] = LIBC_FUNC_INIT (__strcasestr_sse42);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__strcasestr_ia32);
+  return i + 1;
+}
+
+extern __typeof (strcat) __strcat_ia32 attribute_hidden;
+extern __typeof (strcat) __strcat_sse2 attribute_hidden;
+extern __typeof (strcat) __strcat_ssse3 attribute_hidden;
+
+# undef find_strcat
+
+static int
+find_strcat (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSSE3)
+    {
+      array[i] = LIBC_FUNC_INIT (__strcat_ssse3);
+      i++;
+    }
+  if (HAS_SSE2)
+    {
+      array[i] = LIBC_FUNC_INIT (__strcat_sse2);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__strcat_ia32);
+  return i + 1;
+}
+
+extern __typeof (strncat) __strncat_ia32 attribute_hidden;
+extern __typeof (strncat) __strncat_sse2 attribute_hidden;
+extern __typeof (strncat) __strncat_ssse3 attribute_hidden;
+
+# undef find_strncat
+
+static int
+find_strncat (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSSE3)
+    {
+      array[i] = LIBC_FUNC_INIT (__strncat_ssse3);
+      i++;
+    }
+  if (HAS_SSE2)
+    {
+      array[i] = LIBC_FUNC_INIT (__strncat_sse2);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__strncat_ia32);
+  return i + 1;
+}
+
+extern __typeof (strchr) __strchr_ia32 attribute_hidden;
+extern __typeof (strchr) __strchr_sse2 attribute_hidden;
+extern __typeof (strchr) __strchr_sse2_bsf attribute_hidden;
+
+# undef find_strchr
+
+static int
+find_strchr (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSE2)
+    {
+      array[i] = LIBC_FUNC_INIT (__strchr_sse2_bsf);
+      array[i + 1] = LIBC_FUNC_INIT (__strchr_sse2);
+      i += 2;
+    }
+  array[i] = LIBC_FUNC_INIT (__strchr_ia32);
+  return i + 1;
+}
+
+extern __typeof (strrchr) __strrchr_ia32 attribute_hidden;
+extern __typeof (strrchr) __strrchr_sse2 attribute_hidden;
+extern __typeof (strrchr) __strrchr_sse2_bsf attribute_hidden;
+
+# undef find_strrchr
+
+static int
+find_strrchr (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSE2)
+    {
+      array[i] = LIBC_FUNC_INIT (__strrchr_sse2_bsf);
+      array[i + 1] = LIBC_FUNC_INIT (__strrchr_sse2);
+      i += 2;
+    }
+  array[i] = LIBC_FUNC_INIT (__strrchr_ia32);
+  return i + 1;
+}
+
+extern __typeof (strcmp) __strcmp_ia32 attribute_hidden;
+extern __typeof (strcmp) __strcmp_ssse3 attribute_hidden;
+extern __typeof (strcmp) __strcmp_sse4_2 attribute_hidden;
+
+# undef find_strcmp
+
+static int
+find_strcmp (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSE4_2)
+    {
+      array[i] = LIBC_FUNC_INIT (__strcmp_sse4_2);
+      i++;
+    }
+  if (HAS_SSSE3)
+    {
+      array[i] = LIBC_FUNC_INIT (__strcmp_ssse3);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__strcmp_ia32);
+  return i + 1;
+}
+
+extern __typeof (strcspn) __strcspn_ia32 attribute_hidden;
+extern __typeof (strcspn) __strcspn_sse42 attribute_hidden;
+
+# undef find_strcspn
+
+static int
+find_strcspn (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSE4_2)
+    {
+      array[i] = LIBC_FUNC_INIT (__strcspn_sse42);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__strcspn_ia32);
+  return i + 1;
+}
+
+extern __typeof (strnlen) __strnlen_ia32 attribute_hidden;
+extern __typeof (strnlen) __strnlen_sse2 attribute_hidden;
+
+# undef find_strnlen
+
+static int
+find_strnlen (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSE2)
+    {
+      array[i] = LIBC_FUNC_INIT (__strnlen_sse2);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__strnlen_ia32);
+  return i + 1;
+}
+
+extern __typeof (strpbrk) __strpbrk_ia32 attribute_hidden;
+extern __typeof (strpbrk) __strpbrk_sse42 attribute_hidden;
+
+# undef find_strpbrk
+
+static int
+find_strpbrk (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSE4_2)
+    {
+      array[i] = LIBC_FUNC_INIT (__strpbrk_sse42);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__strpbrk_ia32);
+  return i + 1;
+}
+
+extern __typeof (strspn) __strspn_ia32 attribute_hidden;
+extern __typeof (strspn) __strspn_sse42 attribute_hidden;
+
+# undef find_strspn
+
+static int
+find_strspn (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSE4_2)
+    {
+      array[i] = LIBC_FUNC_INIT (__strspn_sse42);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__strspn_ia32);
+  return i + 1;
+}
+
+extern __typeof (strstr) __strstr_ia32 attribute_hidden;
+extern __typeof (strstr) __strstr_sse42 attribute_hidden;
+
+# undef find_strstr
+
+static int
+find_strstr (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSE4_2)
+    {
+      array[i] = LIBC_FUNC_INIT (__strstr_sse42);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__strstr_ia32);
+  return i + 1;
+}
+
+extern __typeof (wcschr) __wcschr_ia32 attribute_hidden;
+extern __typeof (wcschr) __wcschr_sse2 attribute_hidden;
+
+# undef find_wcschr
+
+static int
+find_wcschr (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSE2)
+    {
+      array[i] = LIBC_FUNC_INIT (__wcschr_sse2);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__wcschr_ia32);
+  return i + 1;
+}
+
+extern __typeof (wcscmp) __wcscmp_ia32 attribute_hidden;
+extern __typeof (wcscmp) __wcscmp_sse2 attribute_hidden;
+
+# undef find_wcscmp
+
+static int
+find_wcscmp (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSE2)
+    {
+      array[i] = LIBC_FUNC_INIT (__wcscmp_sse2);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__wcscmp_ia32);
+  return i + 1;
+}
+
+extern __typeof (wcscpy) __wcscpy_ia32 attribute_hidden;
+extern __typeof (wcscpy) __wcscpy_ssse3 attribute_hidden;
+
+# undef find_wcscpy
+
+static int
+find_wcscpy (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSSE3)
+    {
+      array[i] = LIBC_FUNC_INIT (__wcscpy_ssse3);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__wcscpy_ia32);
+  return i + 1;
+}
+
+extern __typeof (wcslen) __wcslen_ia32 attribute_hidden;
+extern __typeof (wcslen) __wcslen_sse2 attribute_hidden;
+
+# undef find_wcslen
+
+static int
+find_wcslen (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSE2)
+    {
+      array[i] = LIBC_FUNC_INIT (__wcslen_sse2);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__wcslen_ia32);
+  return i + 1;
+}
+
+extern __typeof (wcsrchr) __wcsrchr_ia32 attribute_hidden;
+extern __typeof (wcsrchr) __wcsrchr_sse2 attribute_hidden;
+
+# undef find_wcsrchr
+
+static int
+find_wcsrchr (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSE2)
+    {
+      array[i] = LIBC_FUNC_INIT (__wcsrchr_sse2);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__wcsrchr_ia32);
+  return i + 1;
+}
+
+extern __typeof (wmemcmp) __wmemcmp_ia32 attribute_hidden;
+extern __typeof (wmemcmp) __wmemcmp_ssse3 attribute_hidden;
+extern __typeof (wmemcmp) __wmemcmp_sse4_2 attribute_hidden;
+
+# undef find_wmemcmp
+
+static int
+find_wmemcmp (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSE4_2)
+    {
+      array[i] = LIBC_FUNC_INIT (__wmemcmp_sse4_2);
+      i++;
+    }
+  if (HAS_SSSE3)
+    {
+      array[i] = LIBC_FUNC_INIT (__wmemcmp_ssse3);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__wmemcmp_ia32);
+  return i + 1;
+}
+
+# ifdef SHARED
+extern __typeof (memcpy) __memcpy_ia32 attribute_hidden;
+extern __typeof (memcpy) __memcpy_ssse3 attribute_hidden;
+extern __typeof (memcpy) __memcpy_ssse3_rep attribute_hidden;
+
+#  undef find_memcpy
+
+static int
+find_memcpy (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSSE3)
+    {
+      array[i] = LIBC_FUNC_INIT (__memcpy_ssse3_rep);
+      array[i + 1] = LIBC_FUNC_INIT (__memcpy_ssse3);
+      i += 2;
+    }
+  array[i] = LIBC_FUNC_INIT (__memcpy_ia32);
+  return i + 1;
+}
+
+extern __typeof (mempcpy) __mempcpy_ia32 attribute_hidden;
+extern __typeof (mempcpy) __mempcpy_ssse3 attribute_hidden;
+extern __typeof (mempcpy) __mempcpy_ssse3_rep attribute_hidden;
+
+#  undef find_mempcpy
+
+static int
+find_mempcpy (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSSE3)
+    {
+      array[i] = LIBC_FUNC_INIT (__mempcpy_ssse3_rep);
+      array[i + 1] = LIBC_FUNC_INIT (__mempcpy_ssse3);
+      i += 2;
+    }
+  else
+    i = 0;
+  array[i] = LIBC_FUNC_INIT (__mempcpy_ia32);
+  return i + 1;
+}
+
+extern void *__memcpy_chk (void *, const void *, size_t, size_t);
+extern __typeof (__memcpy_chk) __memcpy_chk_ia32 attribute_hidden;
+extern __typeof (__memcpy_chk) __memcpy_chk_ssse3 attribute_hidden;
+extern __typeof (__memcpy_chk) __memcpy_chk_ssse3_rep attribute_hidden;
+
+#  undef find___memcpy_chk
+
+static int
+find___memcpy_chk (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSSE3)
+    {
+      array[i] = LIBC_FUNC_INIT (__memcpy_chk_ssse3_rep);
+      array[i + 1] = LIBC_FUNC_INIT (__memcpy_chk_ssse3);
+      i += 2;
+    }
+  array[i] = LIBC_FUNC_INIT (__memcpy_chk_ia32);
+  return i + 1;
+}
+
+extern void *__mempcpy_chk (void *, const void *, size_t, size_t);
+extern __typeof (__mempcpy_chk) __mempcpy_chk_ia32 attribute_hidden;
+extern __typeof (__mempcpy_chk) __mempcpy_chk_ssse3 attribute_hidden;
+extern __typeof (__mempcpy_chk) __mempcpy_chk_ssse3_rep attribute_hidden;
+
+#  undef find___mempcpy_chk
+
+static int
+find___mempcpy_chk (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSSE3)
+    {
+      array[i] = LIBC_FUNC_INIT (__mempcpy_chk_ssse3_rep);
+      array[i + 1] = LIBC_FUNC_INIT (__mempcpy_chk_ssse3);
+      i += 2;
+    }
+  array[i] = LIBC_FUNC_INIT (__mempcpy_chk_ia32);
+  return i + 1;
+}
+
+extern __typeof (strlen) __strlen_ia32 attribute_hidden;
+extern __typeof (strlen) __strlen_sse2 attribute_hidden;
+extern __typeof (strlen) __strlen_sse2_bsf attribute_hidden;
+
+#  undef find_strlen
+
+static int
+find_strlen (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSE2)
+    {
+      array[i] = LIBC_FUNC_INIT (__strlen_sse2_bsf);
+      array[i + 1] = LIBC_FUNC_INIT (__strlen_sse2);
+      i += 2;
+    }
+  array[i] = LIBC_FUNC_INIT (__strlen_ia32);
+  return i + 1;
+}
+
+extern __typeof (strncmp) __strncmp_ia32 attribute_hidden;
+extern __typeof (strncmp) __strncmp_ssse3 attribute_hidden;
+extern __typeof (strncmp) __strncmp_sse4_2 attribute_hidden;
+
+# undef find_strncmp
+
+static int
+find_strncmp (struct libc_func_test *array, int max)
+{
+  int i = 0;
+  if (HAS_SSE4_2)
+    {
+      array[i] = LIBC_FUNC_INIT (__strncmp_sse4_2);
+      i++;
+    }
+  if (HAS_SSSE3)
+    {
+      array[i] = LIBC_FUNC_INIT (__strncmp_ssse3);
+      i++;
+    }
+  array[i] = LIBC_FUNC_INIT (__strncmp_ia32);
+  return i + 1;
+}
+# endif /* SHARED */
+#endif /* NOT_IN_libc */
+
+/* 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.  */
+
+int
+__libc_func (const char *name, struct libc_func_test *array, int max)
+{
+  assert (max >= MAX_IFUNC);
+
+  if (strcmp (name, "memcmp") == 0)
+    return find_memcmp (array, max);
+
+  if (strcmp (name, "memchr") == 0)
+    return find_memchr (array, max);
+
+  if (strcmp (name, "memrchr") == 0)
+    return find_memrchr (array, max);
+
+  if (strcmp (name, "rawmemchr") == 0)
+    return find_rawmemchr (array, max);
+
+  if (strcmp (name, "memcpy") == 0)
+    return find_memcpy (array, max);
+
+  if (strcmp (name, "memmove") == 0)
+    return find_memmove (array, max);
+
+  if (strcmp (name, "mempcpy") == 0)
+    return find_mempcpy (array, max);
+
+  if (strcmp (name, "__memcpy_chk") == 0)
+    return find___memcpy_chk (array, max);
+
+  if (strcmp (name, "__memmove_chk") == 0)
+    return find___memmove_chk (array, max);
+
+  if (strcmp (name, "__mempcpy_chk") == 0)
+    return find___mempcpy_chk (array, max);
+
+  if (strcmp (name, "memset") == 0)
+    return find_memset (array, max);
+
+  if (strcmp (name, "stpcpy") == 0)
+    return find_stpcpy (array, max);
+
+  if (strcmp (name, "stpncpy") == 0)
+    return find_stpncpy (array, max);
+
+  if (strcmp (name, "strcpy") == 0)
+    return find_strcpy (array, max);
+
+  if (strcmp (name, "strncpy") == 0)
+    return find_strncpy (array, max);
+
+  if (strcmp (name, "strcasecmp") == 0)
+    return find_strcasecmp (array, max);
+
+  if (strcmp (name, "strcasecmp_l") == 0)
+    return find_strcasecmp_l (array, max);
+
+  if (strcmp (name, "strncasecmp") == 0)
+    return find_strncasecmp (array, max);
+
+  if (strcmp (name, "strncasecmp_l") == 0)
+    return find_strncasecmp_l (array, max);
+
+  if (strcmp (name, "strcasestr") == 0)
+    return find_strcasestr (array, max);
+
+  if (strcmp (name, "strcat") == 0)
+    return find_strcat (array, max);
+
+  if (strcmp (name, "strncat") == 0)
+    return find_strncat (array, max);
+
+  if (strcmp (name, "strcmp") == 0)
+    return find_strcmp (array, max);
+
+  if (strcmp (name, "strncmp") == 0)
+    return find_strncmp (array, max);
+
+  if (strcmp (name, "strchr") == 0)
+    return find_strchr (array, max);
+
+  if (strcmp (name, "strrchr") == 0)
+    return find_strrchr (array, max);
+
+  if (strcmp (name, "strcspn") == 0)
+    return find_strcspn (array, max);
+
+  if (strcmp (name, "strlen") == 0)
+    return find_strlen (array, max);
+
+  if (strcmp (name, "strnlen") == 0)
+    return find_strnlen (array, max);
+
+  if (strcmp (name, "strpbrk") == 0)
+    return find_strpbrk (array, max);
+
+  if (strcmp (name, "strspn") == 0)
+    return find_strspn (array, max);
+
+  if (strcmp (name, "strstr") == 0)
+    return find_strstr (array, max);
+
+  if (strcmp (name, "wcschr") == 0)
+    return find_wcschr (array, max);
+
+  if (strcmp (name, "wcscmp") == 0)
+    return find_wcscmp (array, max);
+
+  if (strcmp (name, "wcscpy") == 0)
+    return find_wcscpy (array, max);
+
+  if (strcmp (name, "wcslen") == 0)
+    return find_wcslen (array, max);
+
+  if (strcmp (name, "wcsrchr") == 0)
+    return find_wcsrchr (array, max);
+
+  if (strcmp (name, "wmemcmp") == 0)
+    return find_wmemcmp (array, max);
+
+  return 0;
+}
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

http://sources.redhat.com/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=72c7fa9beaf9c6f0f762e612cdbd61473308a6da

commit 72c7fa9beaf9c6f0f762e612cdbd61473308a6da
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Fri Sep 28 07:01:53 2012 -0700

    Framework to test IFUNC implementations on target

diff --git a/ChangeLog.test-ifunc b/ChangeLog.test-ifunc
new file mode 100644
index 0000000..d87a641
--- /dev/null
+++ b/ChangeLog.test-ifunc
@@ -0,0 +1,21 @@
+2012-09-26  H.J. Lu  <hongjiu.lu@intel.com>
+
+	* Rules (tests): Filter out $(tests-ifunc) if multi-arch isn't
+	enabled.
+	(xtests): Filter out $(xtests-ifunc) if multi-arch isn't enabled.
+	* include/libc-func.h: New file.
+	* sysdeps/generic/libc-func.c: LIkewise.
+	* string/Makefile: Include ../Makeconfig.
+	(routines): Add libc-func if multi-arch is enabled.
+	* string/Versions: Add __libc_func to GLIBC_PRIVATE if
+	USE_MULTIARCH is defined.
+	* string/test-string.h: Include <libc-func.h>.
+	(func_list): New.  Defined only if TEST_IFUNC and TEST_NAME are
+	defined.
+	(func_count): Likewise.
+	(impl_count): Likewise.
+	(impl_array): Likewise.
+	(FOR_EACH_IMPL): Support func_list if TEST_IFUNC and TEST_NAME
+	are defined.
+	(test_init): Call __libc_func to initialize func_list only if
+	TEST_IFUNC and TEST_NAME are defined.
diff --git a/Rules b/Rules
index 17d938e..5e33610 100644
--- a/Rules
+++ b/Rules
@@ -84,6 +84,11 @@ common-generated += dummy.o dummy.c
 # This makes all the auxiliary and test programs.
 
 .PHONY: others tests
+ifeq ($(multi-arch),no)
+tests := $(filter-out $(tests-ifunc), $(tests))
+xtests := $(filter-out $(xtests-ifunc), $(xtests))
+endif
+
 ifeq ($(build-programs),yes)
 others: $(addprefix $(objpfx),$(others) $(sysdep-others) $(extra-objs))
 else
diff --git a/include/libc-func.h b/include/libc-func.h
new file mode 100644
index 0000000..4e5a127
--- /dev/null
+++ b/include/libc-func.h
@@ -0,0 +1,39 @@
+/* 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/>.  */
+
+#ifndef _LIBC_FUNC_H
+#define _LIBC_FUNC_H	1
+
+struct libc_func_test
+{
+  /* The name of function to be tested.  */
+  const char *name;
+  /* The address of function to be tested.  */
+  void (*fn) (void);
+};
+
+/* Dynamic initializer for struct libc_func_test entry with FN.  */
+#define LIBC_FUNC_INIT(fn) \
+  (struct libc_func_test) { #fn, (void (*) (void)) fn }
+
+/* Fill ARRAY of MAX elements with IFUNC implementations for function
+   NAME supported on target machine and return the number of valid
+   entries.  */
+extern int __libc_func (const char *name, struct libc_func_test *array,
+			int max);
+
+#endif /* libc-func.h */
diff --git a/string/Makefile b/string/Makefile
index a1204d9..2f7927a 100644
--- a/string/Makefile
+++ b/string/Makefile
@@ -20,6 +20,8 @@
 #
 subdir	:= string
 
+include ../Makeconfig
+
 headers	:= string.h strings.h memory.h endian.h bits/endian.h \
 	   argz.h envz.h byteswap.h bits/byteswap.h bits/byteswap-16.h \
 	   bits/string.h bits/string2.h bits/string3.h
@@ -41,6 +43,10 @@ routines	:= strcat strchr strcmp strcoll strcpy strcspn		\
 		   strcoll_l strxfrm_l string-inlines memrchr		\
 		   xpg-strerror strerror_l
 
+ifneq ($(multi-arch),no)
+routines	+= libc-func
+endif
+
 # Gcc internally generates calls to unbounded memcpy and memset
 # for -fbounded-pointer compiles.  Glibc uses memchr for explicit checks.
 o-objects.ob	:= memcpy.o memset.o memchr.o
diff --git a/string/Versions b/string/Versions
index f145fd3..24c77f2 100644
--- a/string/Versions
+++ b/string/Versions
@@ -80,4 +80,10 @@ libc {
   GLIBC_2.6 {
     strerror_l;
   }
+
+%ifdef USE_MULTIARCH
+  GLIBC_PRIVATE {
+    __libc_func;
+  }
+%endif
 }
diff --git a/string/test-string.h b/string/test-string.h
index c94d822..f51504a 100644
--- a/string/test-string.h
+++ b/string/test-string.h
@@ -50,6 +50,7 @@ extern impl_t __start_impls[], __stop_impls[];
 #include <error.h>
 #include <errno.h>
 #include <time.h>
+#include <libc-func.h>
 #define GL(x) _##x
 #define GLRO(x) _##x
 #include <hp-timing.h>
@@ -106,9 +107,56 @@ size_t iterations = 100000;
 #define CALL(impl, ...)	\
   (* (proto_t) (impl)->fn) (__VA_ARGS__)
 
-#define FOR_EACH_IMPL(impl, notall) \
+#if defined TEST_IFUNC && defined TEST_NAME
+/* Increase size of FUNC_LIST if assert is triggered at run-time.  */
+static struct libc_func_test func_list[32];
+static int func_count;
+static int impl_count = -1;
+static impl_t *impl_array;
+
+# define FOR_EACH_IMPL(impl, notall) \
+  impl_t *impl;								\
+  int count;								\
+  if (impl_count == -1)							\
+    {									\
+      impl_count = 0;							\
+      if (func_count != 0)						\
+	{								\
+	  int f;							\
+	  impl_t *skip = NULL, *a;					\
+	  for (impl = __start_impls; impl < __stop_impls; ++impl)	\
+	    if (strcmp (impl->name, TEST_NAME) == 0)			\
+	      skip = impl;						\
+	    else							\
+	      impl_count++;						\
+	  impl_count += func_count;					\
+	  a = impl_array = malloc (impl_count * sizeof (impl_t));	\
+	  for (impl = __start_impls; impl < __stop_impls; ++impl)	\
+	    if (impl != skip)						\
+	      *a++ = *impl;						\
+	  for (f = 0; f < func_count; f++)				\
+	    {								\
+	      a->name = func_list[f].name;				\
+	      a->fn = func_list[f].fn;					\
+	      a->test = 1;						\
+	      a++;							\
+	   }								\
+	}								\
+      else								\
+        {								\
+	  for (impl = __start_impls; impl < __stop_impls; ++impl)	\
+	    impl_count++;						\
+	  impl_array = __start_impls;					\
+        }								\
+    }									\
+  impl = impl_array;							\
+  for (count = 0; count < impl_count; ++count, ++impl)			\
+    if (!notall || impl->test)
+#else
+# define FOR_EACH_IMPL(impl, notall) \
   for (impl_t *impl = __start_impls; impl < __stop_impls; ++impl)	\
     if (!notall || impl->test)
+#endif
 
 #define HP_TIMING_BEST(best_time, start, end)	\
   do									\
@@ -127,6 +175,11 @@ size_t iterations = 100000;
 static void
 test_init (void)
 {
+#if defined TEST_IFUNC && defined TEST_NAME
+  func_count = __libc_func (TEST_NAME, func_list,
+			    sizeof (func_list) / sizeof (func_list[0]));
+#endif
+
   page_size = 2 * getpagesize ();
 #ifdef MIN_PAGE_SIZE
   if (page_size < MIN_PAGE_SIZE)
diff --git a/sysdeps/generic/libc-func.c b/sysdeps/generic/libc-func.c
new file mode 100644
index 0000000..0084dd0
--- /dev/null
+++ b/sysdeps/generic/libc-func.c
@@ -0,0 +1,31 @@
+/* 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 <sys/cdefs.h>
+#include <libc-func.h>
+
+/* Fill ARRAY of MAX elements with IFUNC implementations for function
+   NAME supported on target machine and return the number of valid
+   entries.  */
+
+int
+__libc_func (const char *name __attribute_used__,
+	     struct libc_func_test *array __attribute_used__,
+	     int max __attribute_used__)
+{
+  return 0;
+}

-----------------------------------------------------------------------


hooks/post-receive
-- 
GNU C Library master sources


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