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


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

[PATCH] Enforce NAME_MAX in readdir_r


This patch enforces the NAME_MAX limit in readdir_r. The situation is similar to getwd, realpath, and others with PATH_MAX—Linux does not actually enforce the limit we've baked into the ABI. User code does not take this into account, so we have to check for the NAME_MAX limit and skip large file names. Error reporting is delayed until the end of the directory, so that we do not truncate it on the first long name.

This patch supersedes the GETDENTS_64BIT_ALIGNED workaround for the issue reported in bug 11333. On architectures which define this macro, the kernel-supplied string is sometimes truncated by glibc and not properly NUL-terminated. After the patch, we look at the actual string length and check if it fits into the caller-supplied buffer. This works on all architectures, so the architecture-specific macro is no longer necessary.

I did not touch readdir because it does not appear to be directly harmful to return large names in that function because we manage the buffer and the system call has a proper length check.

I regression-tested this on x86_64-redhat-linux-gnu.

--
Florian Weimer / Red Hat Product Security Team
diff --git a/ChangeLog b/ChangeLog
index 250d01c..4bac228 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,141 +1,16 @@
-2012-10-11  H.J. Lu  <hongjiu.lu@intel.com>
-
-	* sysdeps/x86_64/multiarch/ifunc-impl-list.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/x86_64/multiarch/memcmp.S: Add comments for
-	ifunc-impl-list.c.
-	* sysdeps/x86_64/multiarch/memcpy.S: Likewise.
-	* sysdeps/x86_64/multiarch/memcpy_chk.S: Likewise.
-	* sysdeps/x86_64/multiarch/memmove.c: Likewise.
-	* sysdeps/x86_64/multiarch/memmove_chk.c: Likewise.
-	* sysdeps/x86_64/multiarch/mempcpy.S: Likewise.
-	* sysdeps/x86_64/multiarch/mempcpy_chk.S: Likewise.
-	* sysdeps/x86_64/multiarch/memset.S: Likewise.
-	* sysdeps/x86_64/multiarch/memset_chk.S: Likewise.
-	* sysdeps/x86_64/multiarch/rawmemchr.S: Likewise.
-	* sysdeps/x86_64/multiarch/stpcpy.S: Likewise.
-	* sysdeps/x86_64/multiarch/stpncpy.S: Likewise.
-	* sysdeps/x86_64/multiarch/strcasecmp_l.S: Likewise.
-	* sysdeps/x86_64/multiarch/strcasestr-c.c: Likewise.
-	* sysdeps/x86_64/multiarch/strcat.S: Likewise.
-	* sysdeps/x86_64/multiarch/strchr.S: Likewise.
-	* sysdeps/x86_64/multiarch/strcmp.S: Likewise.
-	* sysdeps/x86_64/multiarch/strcpy.S: Likewise.
-	* sysdeps/x86_64/multiarch/strcspn.S: Likewise.
-	* sysdeps/x86_64/multiarch/strlen.S: Likewise.
-	* sysdeps/x86_64/multiarch/strncase_l.S: Likewise.
-	* sysdeps/x86_64/multiarch/strncat.S: Likewise.
-	* sysdeps/x86_64/multiarch/strncmp.S: Likewise.
-	* sysdeps/x86_64/multiarch/strncpy.S: Likewise.
-	* sysdeps/x86_64/multiarch/strnlen.S: Likewise.
-	* sysdeps/x86_64/multiarch/strpbrk.S: Likewise.
-	* sysdeps/x86_64/multiarch/strrchr.S: Likewise.
-	* sysdeps/x86_64/multiarch/strspn.S: Likewise.
-	* sysdeps/x86_64/multiarch/strstr-c.c: Likewise.
-	* sysdeps/x86_64/multiarch/wcscpy.S: Likewise.
-	* sysdeps/x86_64/multiarch/wmemcmp.S: Likewise.
-
-	* 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/bcopy.S: Add comments for
-	ifunc-impl-list.c.
-	* sysdeps/i386/i686/multiarch/bzero.S: Likewise.
-	* sysdeps/i386/i686/multiarch/memchr.S: Likewise.
-	* sysdeps/i386/i686/multiarch/memcmp.S: Likewise.
-	* sysdeps/i386/i686/multiarch/memcpy.S: Likewise.
-	* sysdeps/i386/i686/multiarch/memcpy_chk.S: Likewise.
-	* sysdeps/i386/i686/multiarch/memmove.S: Likewise.
-	* sysdeps/i386/i686/multiarch/memmove_chk.S: Likewise.
-	* sysdeps/i386/i686/multiarch/mempcpy.S: Likewise.
-	* sysdeps/i386/i686/multiarch/mempcpy_chk.S: Likewise.
-	* sysdeps/i386/i686/multiarch/memrchr.S: Likewise.
-	* sysdeps/i386/i686/multiarch/memset.S: Likewise.
-	* sysdeps/i386/i686/multiarch/memset_chk.S: Likewise.
-	* sysdeps/i386/i686/multiarch/rawmemchr.S: Likewise.
-	* sysdeps/i386/i686/multiarch/stpcpy.S: Likewise.
-	* sysdeps/i386/i686/multiarch/stpncpy.S: Likewise.
-	* sysdeps/i386/i686/multiarch/strcasecmp.S: Likewise.
-	* sysdeps/i386/i686/multiarch/strcasecmp_l.S: Likewise.
-	* sysdeps/i386/i686/multiarch/strcasestr-c.c: Likewise.
-	* sysdeps/i386/i686/multiarch/strcat.S: Likewise.
-	* sysdeps/i386/i686/multiarch/strchr.S: Likewise.
-	* sysdeps/i386/i686/multiarch/strcmp.S: Likewise.
-	* sysdeps/i386/i686/multiarch/strcpy.S: Likewise.
-	* sysdeps/i386/i686/multiarch/strcspn.S: Likewise.
-	* sysdeps/i386/i686/multiarch/strlen.S: Likewise.
-	* sysdeps/i386/i686/multiarch/strncase.S: Likewise.
-	* sysdeps/i386/i686/multiarch/strncase_l.S: Likewise.
-	* sysdeps/i386/i686/multiarch/strncat.S: Likewise.
-	* sysdeps/i386/i686/multiarch/strncmp.S: Likewise.
-	* sysdeps/i386/i686/multiarch/strncpy.S: Likewise.
-	* sysdeps/i386/i686/multiarch/strnlen.S: Likewise.
-	* sysdeps/i386/i686/multiarch/strpbrk.S: Likewise.
-	* sysdeps/i386/i686/multiarch/strrchr.S: Likewise.
-	* sysdeps/i386/i686/multiarch/strspn.S: Likewise.
-	* sysdeps/i386/i686/multiarch/strstr-c.c: Likewise.
-	* sysdeps/i386/i686/multiarch/wcschr.S: Likewise.
-	* sysdeps/i386/i686/multiarch/wcscmp.S: Likewise.
-	* sysdeps/i386/i686/multiarch/wcscpy.S: Likewise.
-	* sysdeps/i386/i686/multiarch/wcslen.S: Likewise.
-	* sysdeps/i386/i686/multiarch/wcsrchr.S: Likewise.
-	* sysdeps/i386/i686/multiarch/wmemcmp.S: Likewise.
-	* sysdeps/i386/i686/multiarch/ifunc-impl-list.c: New file.
-
-	* Rules [$(multi-arch) = no] (tests): Filter out $(tests-ifunc).
-	[$(multi-arch) = no] (xtests): Filter out $(xtests-ifunc).
-	* include/ifunc-impl-list.h: New file.
-	* misc/ifunc-impl-list.c: Likewise.
-	* misc/Makefile (routines): Add ifunc-impl-list.
-	* misc/Versions (GLIBC_PRIVATE): Add __libc_ifunc_impl_list.
-	* string/test-string.h: Include <ifunc-impl-list.h>.
-	[TEST_IFUNC && TEST_NAME] (func_list, func_count, impl_count,
-	impl_array): New variables.
-	(FOR_EACH_IMPL): Support func_list if TEST_IFUNC and TEST_NAME
-	are defined.
-	(test_init): Call __libc_ifunc_impl_list to initialize
-	func_list if TEST_IFUNC and TEST_NAME are defined.
-
-	* string/Makefile (strop-tests): Add bcopy and bzero.
-	* string/test-bcopy.c: New file.
-	* string/test-bzero.c: Likewise.
-	* string/test-memmove.c: Support bcopy test if TEST_BCOPY is
-	defined.
-	* string/test-memset.c: Support bzero test if TEST_BZERO is
-	defined.
-	* sysdeps/x86_64/multiarch/bcopy.S (bcopy): Jump to
-	__libc_memmove.
-	* sysdeps/x86_64/multiarch/bzero.S (__bzero): Jump to
-	__libc_memset.
-	* sysdeps/x86_64/multiarch/memset.S (__libc_memset): New alias
-	of memset.
+2012-10-12  Florian Weimer  <fweimer@redhat.com>
+
+	[BZ #14699]
+	* sysdeps/posix/dirstream.h (struct __dirstream): Add errcode
+	member.
+	* sysdeps/posix/opendir.c (__alloc_dir): Initialize errcode
+	member.
+	* sysdeps/posix/readdir_r.c (__READDIR_R): Enforce NAME_MAX limit.
+	Return delayed error code.  Remove GETDENTS_64BIT_ALIGNED
+	conditonal.
+	* sysdeps/unix/sysv/linux/wordsize-64/readdir_r.c: Do not define
+	GETDENTS_64BIT_ALIGNED.
+	* sysdeps/unix/sysv/linux/i386/readdir64_r.c: Likewise.
 
 2012-10-10  Joseph Myers  <joseph@codesourcery.com>
 
diff --git a/Rules b/Rules
index 5e33610..17d938e 100644
--- a/Rules
+++ b/Rules
@@ -84,11 +84,6 @@ 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/ifunc-impl-list.h b/include/ifunc-impl-list.h
deleted file mode 100644
index 36444d3..0000000
--- a/include/ifunc-impl-list.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/* Internal header file for __libc_supported_implementations.
-   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 _IFUNC_IMPL_LIST_H
-#define _IFUNC_IMPL_LIST_H	1
-
-#include <stdbool.h>
-#include <stddef.h>
-
-struct libc_ifunc_impl
-{
-  /* The name of function to be tested.  */
-  const char *name;
-  /* The address of function to be tested.  */
-  void (*fn) (void);
-  /* True if this implementation is usable on this machine.  */
-  bool usable;
-};
-
-/* Add an IFUNC implementation, IMPL, for function FUNC, to ARRAY with
-   USABLE at index I and advance I by one.  */
-#define IFUNC_IMPL_ADD(array, i, func, usable, impl) \
-  extern __typeof (func) impl attribute_hidden; \
-  (array)[i++] = (struct libc_ifunc_impl) { #impl, (void (*) (void)) impl, (usable) };
-
-/* Return the number of IFUNC implementations, N, for function FUNC if
-   string NAME matches FUNC.  */
-#define IFUNC_IMPL(n, name, func, ...) \
-  if (strcmp (name, #func) == 0) \
-    { \
-      __VA_ARGS__; \
-      return n; \
-    }
-
-/* Fill ARRAY of MAX elements with IFUNC implementations for function
-   NAME and return the number of valid entries.  */
-extern size_t __libc_ifunc_impl_list (const char *name,
-				      struct libc_ifunc_impl *array,
-				      size_t max);
-
-#endif /* ifunc-impl-list.h */
diff --git a/misc/Makefile b/misc/Makefile
index ea68d26..e5e9b9f 100644
--- a/misc/Makefile
+++ b/misc/Makefile
@@ -65,7 +65,7 @@ routines := brk sbrk sstk ioctl \
 	    getloadavg getclktck \
 	    fgetxattr flistxattr fremovexattr fsetxattr getxattr \
 	    listxattr lgetxattr llistxattr lremovexattr lsetxattr \
-	    removexattr setxattr getauxval ifunc-impl-list
+	    removexattr setxattr getauxval
 
 generated := tst-error1.mtrace tst-error1-mem
 
diff --git a/misc/Versions b/misc/Versions
index 64632f0..b2a9147 100644
--- a/misc/Versions
+++ b/misc/Versions
@@ -151,6 +151,5 @@ libc {
   }
   GLIBC_PRIVATE {
     __madvise;
-    __libc_ifunc_impl_list;
   }
 }
diff --git a/misc/ifunc-impl-list.c b/misc/ifunc-impl-list.c
deleted file mode 100644
index c4b460d..0000000
--- a/misc/ifunc-impl-list.c
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Enumerate available IFUNC implementations of a function.  Stub version.
-   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 <ifunc-impl-list.h>
-
-/* Fill ARRAY of MAX elements with IFUNC implementations for function
-   NAME supported on target machine and return the number of valid
-   entries.  */
-
-size_t
-__libc_ifunc_impl_list
-  (const char *name __attribute__ ((unused)),
-   struct libc_ifunc_impl *array __attribute__ ((unused)),
-   size_t max __attribute__ ((unused)))
-{
-  return 0;
-}
diff --git a/string/Makefile b/string/Makefile
index 8d1db74..6f2c6c3 100644
--- a/string/Makefile
+++ b/string/Makefile
@@ -49,7 +49,7 @@ strop-tests	:= memchr memcmp memcpy memmove mempcpy memset memccpy	\
 		   stpcpy stpncpy strcat strchr strcmp strcpy strcspn	\
 		   strlen strncmp strncpy strpbrk strrchr strspn memmem	\
 		   strstr strcasestr strnlen strcasecmp strncasecmp	\
-		   strncat rawmemchr strchrnul bcopy bzero
+		   strncat rawmemchr strchrnul
 tests		:= tester inl-tester noinl-tester testcopy test-ffs	\
 		   tst-strlen stratcliff tst-svc tst-inlcall		\
 		   bug-strncat1 bug-strspn1 bug-strpbrk1 tst-bswap	\
diff --git a/string/test-bcopy.c b/string/test-bcopy.c
deleted file mode 100644
index bf9347b..0000000
--- a/string/test-bcopy.c
+++ /dev/null
@@ -1,20 +0,0 @@
-/* Test and measure bcopy functions.
-   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/>.  */
-
-#define TEST_BCOPY
-#include "test-memmove.c"
diff --git a/string/test-bzero.c b/string/test-bzero.c
deleted file mode 100644
index b59a7e4..0000000
--- a/string/test-bzero.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Test and measure bzero functions.
-   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/>.  */
-#define TEST_BZERO
-#include "test-memset.c"
diff --git a/string/test-memmove.c b/string/test-memmove.c
index cbd40cd..7d10712 100644
--- a/string/test-memmove.c
+++ b/string/test-memmove.c
@@ -1,5 +1,5 @@
 /* Test and measure memmove functions.
-   Copyright (C) 1999-2012 Free Software Foundation, Inc.
+   Copyright (C) 1999, 2002, 2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Written by Jakub Jelinek <jakub@redhat.com>, 1999.
 
@@ -20,26 +20,11 @@
 #define TEST_MAIN
 #include "test-string.h"
 
-char *simple_memmove (char *, const char *, size_t);
-
-#ifdef TEST_BCOPY
-typedef void (*proto_t) (const char *, char *, size_t);
-void simple_bcopy (const char *, char *, size_t);
-
-IMPL (simple_bcopy, 0)
-IMPL (bcopy, 1)
-
-void
-simple_bcopy (const char *src, char *dst, size_t n)
-{
-  simple_memmove (dst, src, n);
-}
-#else
 typedef char *(*proto_t) (char *, const char *, size_t);
+char *simple_memmove (char *, const char *, size_t);
 
 IMPL (simple_memmove, 0)
 IMPL (memmove, 1)
-#endif
 
 char *
 simple_memmove (char *dst, const char *src, size_t n)
@@ -62,12 +47,9 @@ static void
 do_one_test (impl_t *impl, char *dst, char *src, const char *orig_src,
 	     size_t len)
 {
-  memcpy (src, orig_src, len);
-#ifdef TEST_BCOPY
-  CALL (impl, src, dst, len);
-#else
   char *res;
 
+  memcpy (src, orig_src, len);
   res = CALL (impl, dst, src, len);
   if (res != dst)
     {
@@ -76,7 +58,6 @@ do_one_test (impl_t *impl, char *dst, char *src, const char *orig_src,
       ret = 1;
       return;
     }
-#endif
 
   if (memcmp (dst, orig_src, len) != 0)
     {
@@ -96,11 +77,7 @@ do_one_test (impl_t *impl, char *dst, char *src, const char *orig_src,
       for (i = 0; i < 32; ++i)
 	{
 	  HP_TIMING_NOW (start);
-#ifdef TEST_BCOPY
-	  CALL (impl, src, dst, len);
-#else
 	  CALL (impl, dst, src, len);
-#endif
 	  HP_TIMING_NOW (stop);
 	  HP_TIMING_BEST (best_time, start, stop);
 	}
@@ -146,9 +123,7 @@ do_random_tests (void)
   size_t srcstart, srcend, dststart, dstend;
   int c;
   unsigned char *p1, *p2;
-#ifndef TEST_BCOPY
   unsigned char *res;
-#endif
 
   for (n = 0; n < ITERATIONS; n++)
     {
@@ -203,9 +178,6 @@ do_random_tests (void)
 	{
 	  memset (p2 + dststart, c, dstend - dststart);
 	  memcpy (p2 + srcstart, p1 + srcstart, srcend - srcstart);
-#ifdef TEST_BCOPY
-	  CALL (impl, (char *) (p2 + align1), (char *) (p2 + align2), len);
-#else
 	  res = (unsigned char *) CALL (impl,
 					(char *) (p2 + align2),
 					(char *) (p2 + align1), len);
@@ -215,7 +187,6 @@ do_random_tests (void)
 		     n, impl->name, align1, align2, len, res, p2 + align2);
 	      ret = 1;
 	    }
-#endif
 	  if (memcmp (p1 + align1, p2 + align2, len))
 	    {
 	      error (0, 0, "Iteration %zd - different strings, %s (%zd, %zd, %zd)",
diff --git a/string/test-memset.c b/string/test-memset.c
index e8dd406..839b8a1 100644
--- a/string/test-memset.c
+++ b/string/test-memset.c
@@ -1,5 +1,5 @@
 /* Test and measure memset functions.
-   Copyright (C) 1999-2012 Free Software Foundation, Inc.
+   Copyright (C) 1999, 2002, 2003, 2005 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Written by Jakub Jelinek <jakub@redhat.com>, 1999.
 
@@ -21,30 +21,8 @@
 #define MIN_PAGE_SIZE 131072
 #include "test-string.h"
 
-char *simple_memset (char *, int, size_t);
-
-#ifdef TEST_BZERO
-typedef void (*proto_t) (char *, size_t);
-void simple_bzero (char *, size_t);
-void builtin_bzero (char *, size_t);
-
-IMPL (simple_bzero, 0)
-IMPL (builtin_bzero, 0)
-IMPL (bzero, 1)
-
-void
-simple_bzero (char *s, size_t n)
-{
-  simple_memset (s, 0, n);
-}
-
-void
-builtin_bzero (char *s, size_t n)
-{
-  __builtin_bzero (s, n);
-}
-#else
 typedef char *(*proto_t) (char *, int, size_t);
+char *simple_memset (char *, int, size_t);
 char *builtin_memset (char *, int, size_t);
 
 IMPL (simple_memset, 0)
@@ -52,13 +30,6 @@ IMPL (builtin_memset, 0)
 IMPL (memset, 1)
 
 char *
-builtin_memset (char *s, int c, size_t n)
-{
-  return __builtin_memset (s, c, n);
-}
-#endif
-
-char *
 simple_memset (char *s, int c, size_t n)
 {
   char *r = s, *end = s + n;
@@ -67,20 +38,20 @@ simple_memset (char *s, int c, size_t n)
   return s;
 }
 
+char *
+builtin_memset (char *s, int c, size_t n)
+{
+  return __builtin_memset (s, c, n);
+}
+
 static void
-do_one_test (impl_t *impl, char *s, int c __attribute ((unused)), size_t n)
+do_one_test (impl_t *impl, char *s, int c, size_t n)
 {
-  char tstbuf[n];
-#ifdef TEST_BZERO
-  simple_bzero (tstbuf, n);
-  CALL (impl, s, n);
-  if (memcmp (s, tstbuf, n) != 0)
-#else
   char *res = CALL (impl, s, c, n);
+  char tstbuf[n];
   if (res != s
       || simple_memset (tstbuf, c, n) != tstbuf
       || memcmp (s, tstbuf, n) != 0)
-#endif
     {
       error (0, 0, "Wrong result in function %s", impl->name);
       ret = 1;
@@ -97,12 +68,7 @@ do_one_test (impl_t *impl, char *s, int c __attribute ((unused)), size_t n)
       for (i = 0; i < 32; ++i)
 	{
 	  HP_TIMING_NOW (start);
-#ifdef TEST_BZERO
-	  CALL (impl, s, n);
-#else
 	  CALL (impl, s, c, n);
-#endif
-
 	  HP_TIMING_NOW (stop);
 	  HP_TIMING_BEST (best_time, start, stop);
 	}
@@ -128,7 +94,6 @@ do_test (size_t align, int c, size_t len)
     putchar ('\n');
 }
 
-#ifndef TEST_BZERO
 static void
 do_random_tests (void)
 {
@@ -213,13 +178,12 @@ do_random_tests (void)
 	}
     }
 }
-#endif
 
 int
 test_main (void)
 {
   size_t i;
-  int c = 0;
+  int c;
 
   test_init ();
 
@@ -228,9 +192,7 @@ test_main (void)
     printf ("\t%s", impl->name);
   putchar ('\n');
 
-#ifndef TEST_BZERO
   for (c = -65; c <= 130; c += 65)
-#endif
     {
       for (i = 0; i < 18; ++i)
 	do_test (0, c, 1 << i);
@@ -246,10 +208,7 @@ test_main (void)
       do_test (2, c, 25);
     }
 
-#ifndef TEST_BZERO
   do_random_tests ();
-#endif
-
   return ret;
 }
 
diff --git a/string/test-string.h b/string/test-string.h
index 102702c..c94d822 100644
--- a/string/test-string.h
+++ b/string/test-string.h
@@ -50,7 +50,6 @@ extern impl_t __start_impls[], __stop_impls[];
 #include <error.h>
 #include <errno.h>
 #include <time.h>
-#include <ifunc-impl-list.h>
 #define GL(x) _##x
 #define GLRO(x) _##x
 #include <hp-timing.h>
@@ -107,57 +106,9 @@ size_t iterations = 100000;
 #define CALL(impl, ...)	\
   (* (proto_t) (impl)->fn) (__VA_ARGS__)
 
-#if defined TEST_IFUNC && defined TEST_NAME
-/* Increase size of FUNC_LIST if assert is triggered at run-time.  */
-static struct libc_ifunc_impl 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++;						\
-	  a = impl_array = malloc ((impl_count + func_count) *		\
-				   sizeof (impl_t));			\
-	  for (impl = __start_impls; impl < __stop_impls; ++impl)	\
-	    if (impl != skip)						\
-	      *a++ = *impl;						\
-	  for (f = 0; f < func_count; f++)				\
-	    if (func_list[f].usable)					\
-	      {								\
-		a->name = func_list[f].name;				\
-		a->fn = func_list[f].fn;				\
-		a->test = 1;						\
-		a++;							\
-	      }								\
-	  impl_count = a - impl_array;					\
-	}								\
-      else								\
-        {								\
-	  impl_count = __stop_impls - __start_impls;			\
-	  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) \
+#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									\
@@ -176,12 +127,6 @@ static impl_t *impl_array;
 static void
 test_init (void)
 {
-#if defined TEST_IFUNC && defined TEST_NAME
-  func_count = __libc_ifunc_impl_list (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/i386/i686/multiarch/bcopy.S b/sysdeps/i386/i686/multiarch/bcopy.S
index b0744da..9db3424 100644
--- a/sysdeps/i386/i686/multiarch/bcopy.S
+++ b/sysdeps/i386/i686/multiarch/bcopy.S
@@ -1,5 +1,4 @@
 /* Multiple versions of bcopy
-   All versions must be listed in ifunc-impl-list.c.
    Copyright (C) 2010, 2012 Free Software Foundation, Inc.
    Contributed by Intel Corporation.
    This file is part of the GNU C Library.
@@ -68,8 +67,6 @@ 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 150c24c..86db169 100644
--- a/sysdeps/i386/i686/multiarch/bzero.S
+++ b/sysdeps/i386/i686/multiarch/bzero.S
@@ -1,5 +1,4 @@
 /* Multiple versions of bzero
-   All versions must be listed in ifunc-impl-list.c.
    Copyright (C) 2010, 2012 Free Software Foundation, Inc.
    Contributed by Intel Corporation.
    This file is part of the GNU C Library.
@@ -68,8 +67,6 @@ 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/ifunc-impl-list.c b/sysdeps/i386/i686/multiarch/ifunc-impl-list.c
deleted file mode 100644
index 005c286..0000000
--- a/sysdeps/i386/i686/multiarch/ifunc-impl-list.c
+++ /dev/null
@@ -1,326 +0,0 @@
-/* Enumerate available IFUNC implementations of a function.  i686 version.
-   Copyright (C) 2012 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <assert.h>
-#include <string.h>
-#include <wchar.h>
-#include <ifunc-impl-list.h>
-#include "init-arch.h"
-
-/* Maximum number of IFUNC implementations.  */
-#define MAX_IFUNC	3
-
-/* Fill ARRAY of MAX elements with IFUNC implementations for function
-   NAME and return the number of valid entries.  */
-
-size_t
-__libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
-			size_t max)
-{
-  assert (max >= MAX_IFUNC);
-
-  size_t i = 0;
-
-  /* Support sysdeps/i386/i686/multiarch/bcopy.S.  */
-  IFUNC_IMPL (i, name, bcopy,
-	      IFUNC_IMPL_ADD (array, i, bcopy, HAS_SSSE3,
-			      __bcopy_ssse3_rep)
-	      IFUNC_IMPL_ADD (array, i, bcopy, HAS_SSSE3, __bcopy_ssse3)
-	      IFUNC_IMPL_ADD (array, i, bcopy, 1, __bcopy_ia32))
-
-  /* Support sysdeps/i386/i686/multiarch/bzero.S.  */
-  IFUNC_IMPL (i, name, bzero,
-	      IFUNC_IMPL_ADD (array, i, bzero, HAS_SSE2, __bzero_sse2_rep)
-	      IFUNC_IMPL_ADD (array, i, bzero, HAS_SSE2, __bzero_sse2)
-	      IFUNC_IMPL_ADD (array, i, bzero, 1, __bzero_ia32))
-
-  /* Support sysdeps/i386/i686/multiarch/memchr.S.  */
-  IFUNC_IMPL (i, name, memchr,
-	      IFUNC_IMPL_ADD (array, i, memchr, HAS_SSE2,
-			      __memchr_sse2_bsf)
-	      IFUNC_IMPL_ADD (array, i, memchr, HAS_SSE2, __memchr_sse2)
-	      IFUNC_IMPL_ADD (array, i, memchr, 1, __memchr_ia32))
-
-  /* Support sysdeps/i386/i686/multiarch/memcmp.S.  */
-  IFUNC_IMPL (i, name, memcmp,
-	      IFUNC_IMPL_ADD (array, i, memcmp, HAS_SSE4_2,
-			      __memcmp_sse4_2)
-	      IFUNC_IMPL_ADD (array, i, memcmp, HAS_SSSE3, __memcmp_ssse3)
-	      IFUNC_IMPL_ADD (array, i, memcmp, 1, __memcmp_ia32))
-
-  /* Support sysdeps/i386/i686/multiarch/memmove_chk.S.  */
-  IFUNC_IMPL (i, name, __memmove_chk,
-	      IFUNC_IMPL_ADD (array, i, __memmove_chk, HAS_SSSE3,
-			      __memmove_chk_ssse3_rep)
-	      IFUNC_IMPL_ADD (array, i, __memmove_chk, HAS_SSSE3,
-			      __memmove_chk_ssse3)
-	      IFUNC_IMPL_ADD (array, i, __memmove_chk, 1,
-			      __memmove_chk_ia32))
-
-  /* Support sysdeps/i386/i686/multiarch/memmove.S.  */
-  IFUNC_IMPL (i, name, memmove,
-	      IFUNC_IMPL_ADD (array, i, memmove, HAS_SSSE3,
-			      __memmove_ssse3_rep)
-	      IFUNC_IMPL_ADD (array, i, memmove, HAS_SSSE3,
-			      __memmove_ssse3)
-	      IFUNC_IMPL_ADD (array, i, memmove, 1, __memmove_ia32))
-
-  /* Support sysdeps/i386/i686/multiarch/memrchr.S.  */
-  IFUNC_IMPL (i, name, memrchr,
-	      IFUNC_IMPL_ADD (array, i, memrchr, HAS_SSE2,
-			      __memrchr_sse2_bsf)
-	      IFUNC_IMPL_ADD (array, i, memrchr, HAS_SSE2, __memrchr_sse2)
-	      IFUNC_IMPL_ADD (array, i, memrchr, 1, __memrchr_ia32))
-
-  /* Support sysdeps/i386/i686/multiarch/memset_chk.S.  */
-  IFUNC_IMPL (i, name, __memset_chk,
-	      IFUNC_IMPL_ADD (array, i, __memset_chk, HAS_SSE2,
-			      __memset_chk_sse2_rep)
-	      IFUNC_IMPL_ADD (array, i, __memset_chk, HAS_SSE2,
-			      __memset_chk_sse2)
-	      IFUNC_IMPL_ADD (array, i, __memset_chk, 1,
-			      __memset_chk_ia32))
-
-  /* Support sysdeps/i386/i686/multiarch/memset.S.  */
-  IFUNC_IMPL (i, name, memset,
-	      IFUNC_IMPL_ADD (array, i, memset, HAS_SSE2,
-			      __memset_sse2_rep)
-	      IFUNC_IMPL_ADD (array, i, memset, HAS_SSE2, __memset_sse2)
-	      IFUNC_IMPL_ADD (array, i, memset, 1, __memset_ia32))
-
-  /* Support sysdeps/i386/i686/multiarch/rawmemchr.S.  */
-  IFUNC_IMPL (i, name, rawmemchr,
-	      IFUNC_IMPL_ADD (array, i, rawmemchr, HAS_SSE2,
-			      __rawmemchr_sse2_bsf)
-	      IFUNC_IMPL_ADD (array, i, rawmemchr, HAS_SSE2,
-			      __rawmemchr_sse2)
-	      IFUNC_IMPL_ADD (array, i, rawmemchr, 1, __rawmemchr_ia32))
-
-  /* Support sysdeps/i386/i686/multiarch/stpncpy.S.  */
-  IFUNC_IMPL (i, name, stpncpy,
-	      IFUNC_IMPL_ADD (array, i, stpncpy, HAS_SSSE3,
-			      __stpncpy_ssse3)
-	      IFUNC_IMPL_ADD (array, i, stpncpy, HAS_SSE2, __stpncpy_sse2)
-	      IFUNC_IMPL_ADD (array, i, stpncpy, 1, __stpncpy_ia32))
-
-  /* Support sysdeps/i386/i686/multiarch/stpcpy.S.  */
-  IFUNC_IMPL (i, name, stpcpy,
-	      IFUNC_IMPL_ADD (array, i, stpcpy, HAS_SSSE3, __stpcpy_ssse3)
-	      IFUNC_IMPL_ADD (array, i, stpcpy, HAS_SSE2, __stpcpy_sse2)
-	      IFUNC_IMPL_ADD (array, i, stpcpy, 1, __stpcpy_ia32))
-
-  /* Support sysdeps/i386/i686/multiarch/strcasecmp.S.  */
-  IFUNC_IMPL (i, name, strcasecmp,
-	      IFUNC_IMPL_ADD (array, i, strcasecmp, HAS_SSE4_2,
-			      __strcasecmp_sse4_2)
-	      IFUNC_IMPL_ADD (array, i, strcasecmp, HAS_SSSE3,
-			      __strcasecmp_ssse3)
-	      IFUNC_IMPL_ADD (array, i, strcasecmp, 1, __strcasecmp_ia32))
-
-  /* Support sysdeps/i386/i686/multiarch/strcasecmp_l.S.  */
-  IFUNC_IMPL (i, name, strcasecmp_l,
-	      IFUNC_IMPL_ADD (array, i, strcasecmp_l, HAS_SSE4_2,
-			      __strcasecmp_l_sse4_2)
-	      IFUNC_IMPL_ADD (array, i, strcasecmp_l, HAS_SSSE3,
-			      __strcasecmp_l_ssse3)
-	      IFUNC_IMPL_ADD (array, i, strcasecmp_l, 1,
-			      __strcasecmp_l_ia32))
-
-  /* Support sysdeps/i386/i686/multiarch/strcasestr.c.  */
-  IFUNC_IMPL (i, name, strcasestr,
-	      IFUNC_IMPL_ADD (array, i, strcasestr, HAS_SSE4_2,
-			      __strcasestr_sse42)
-	      IFUNC_IMPL_ADD (array, i, strcasestr, 1, __strcasestr_ia32))
-
-  /* Support sysdeps/i386/i686/multiarch/strcat.S.  */
-  IFUNC_IMPL (i, name, strcat,
-	      IFUNC_IMPL_ADD (array, i, strcat, HAS_SSSE3, __strcat_ssse3)
-	      IFUNC_IMPL_ADD (array, i, strcat, HAS_SSE2, __strcat_sse2)
-	      IFUNC_IMPL_ADD (array, i, strcat, 1, __strcat_ia32))
-
-  /* Support sysdeps/i386/i686/multiarch/strchr.S.  */
-  IFUNC_IMPL (i, name, strchr,
-	      IFUNC_IMPL_ADD (array, i, strchr, HAS_SSE2,
-			      __strchr_sse2_bsf)
-	      IFUNC_IMPL_ADD (array, i, strchr, HAS_SSE2, __strchr_sse2)
-	      IFUNC_IMPL_ADD (array, i, strchr, 1, __strchr_ia32))
-
-  /* Support sysdeps/i386/i686/multiarch/strcmp.S.  */
-  IFUNC_IMPL (i, name, strcmp,
-	      IFUNC_IMPL_ADD (array, i, strcmp, HAS_SSE4_2,
-			      __strcmp_sse4_2)
-	      IFUNC_IMPL_ADD (array, i, strcmp, HAS_SSSE3, __strcmp_ssse3)
-	      IFUNC_IMPL_ADD (array, i, strcmp, 1, __strcmp_ia32))
-
-  /* Support sysdeps/i386/i686/multiarch/strcpy.S.  */
-  IFUNC_IMPL (i, name, strcpy,
-	      IFUNC_IMPL_ADD (array, i, strcpy, HAS_SSSE3, __strcpy_ssse3)
-	      IFUNC_IMPL_ADD (array, i, strcpy, HAS_SSE2, __strcpy_sse2)
-	      IFUNC_IMPL_ADD (array, i, strcpy, 1, __strcpy_ia32))
-
-  /* Support sysdeps/i386/i686/multiarch/strcspn.S.  */
-  IFUNC_IMPL (i, name, strcspn,
-	      IFUNC_IMPL_ADD (array, i, strcspn, HAS_SSE4_2,
-			      __strcspn_sse42)
-	      IFUNC_IMPL_ADD (array, i, strcspn, 1, __strcspn_ia32))
-
-  /* Support sysdeps/i386/i686/multiarch/strncase.S.  */
-  IFUNC_IMPL (i, name, strncasecmp,
-	      IFUNC_IMPL_ADD (array, i, strncasecmp, HAS_SSE4_2,
-			      __strncasecmp_sse4_2)
-	      IFUNC_IMPL_ADD (array, i, strncasecmp, HAS_SSSE3,
-			      __strncasecmp_ssse3)
-	      IFUNC_IMPL_ADD (array, i, strncasecmp, 1,
-			      __strncasecmp_ia32))
-
-  /* Support sysdeps/i386/i686/multiarch/strncase_l.S.  */
-  IFUNC_IMPL (i, name, strncasecmp_l,
-	      IFUNC_IMPL_ADD (array, i, strncasecmp_l,
-			      HAS_SSE4_2, __strncasecmp_l_sse4_2)
-	      IFUNC_IMPL_ADD (array, i, strncasecmp_l,
-			      HAS_SSSE3, __strncasecmp_l_ssse3)
-	      IFUNC_IMPL_ADD (array, i, strncasecmp_l, 1,
-			      __strncasecmp_l_ia32))
-
-  /* Support sysdeps/i386/i686/multiarch/strncat.S.  */
-  IFUNC_IMPL (i, name, strncat,
-	      IFUNC_IMPL_ADD (array, i, strncat, HAS_SSSE3,
-			      __strncat_ssse3)
-	      IFUNC_IMPL_ADD (array, i, strncat, HAS_SSE2, __strncat_sse2)
-	      IFUNC_IMPL_ADD (array, i, strncat, 1, __strncat_ia32))
-
-  /* Support sysdeps/i386/i686/multiarch/strncpy.S.  */
-  IFUNC_IMPL (i, name, strncpy,
-	      IFUNC_IMPL_ADD (array, i, strncpy, HAS_SSSE3,
-			      __strncpy_ssse3)
-	      IFUNC_IMPL_ADD (array, i, strncpy, HAS_SSE2, __strncpy_sse2)
-	      IFUNC_IMPL_ADD (array, i, strncpy, 1, __strncpy_ia32))
-
-  /* Support sysdeps/i386/i686/multiarch/strnlen.S.  */
-  IFUNC_IMPL (i, name, strnlen,
-	      IFUNC_IMPL_ADD (array, i, strnlen, HAS_SSE2, __strnlen_sse2)
-	      IFUNC_IMPL_ADD (array, i, strnlen, 1, __strnlen_ia32))
-
-  /* Support sysdeps/i386/i686/multiarch/strpbrk.S.  */
-  IFUNC_IMPL (i, name, strpbrk,
-	      IFUNC_IMPL_ADD (array, i, strpbrk, HAS_SSE4_2,
-			      __strpbrk_sse42)
-	      IFUNC_IMPL_ADD (array, i, strpbrk, 1, __strpbrk_ia32))
-
-  /* Support sysdeps/i386/i686/multiarch/strrchr.S.  */
-  IFUNC_IMPL (i, name, strrchr,
-	      IFUNC_IMPL_ADD (array, i, strrchr, HAS_SSE2,
-			      __strrchr_sse2_bsf)
-	      IFUNC_IMPL_ADD (array, i, strrchr, HAS_SSE2, __strrchr_sse2)
-	      IFUNC_IMPL_ADD (array, i, strrchr, 1, __strrchr_ia32))
-
-  /* Support sysdeps/i386/i686/multiarch/strspn.S.  */
-  IFUNC_IMPL (i, name, strspn,
-	      IFUNC_IMPL_ADD (array, i, strspn, HAS_SSE4_2, __strspn_sse42)
-	      IFUNC_IMPL_ADD (array, i, strspn, 1, __strspn_ia32))
-
-  /* Support sysdeps/i386/i686/multiarch/strstr-c.c.  */
-  IFUNC_IMPL (i, name, strstr,
-	      IFUNC_IMPL_ADD (array, i, strstr, HAS_SSE4_2, __strstr_sse42)
-	      IFUNC_IMPL_ADD (array, i, strstr, 1, __strstr_ia32))
-
-  /* Support sysdeps/i386/i686/multiarch/wcschr.S.  */
-  IFUNC_IMPL (i, name, wcschr,
-	      IFUNC_IMPL_ADD (array, i, wcschr, HAS_SSE2, __wcschr_sse2)
-	      IFUNC_IMPL_ADD (array, i, wcschr, 1, __wcschr_ia32))
-
-  /* Support sysdeps/i386/i686/multiarch/wcscmp.S.  */
-  IFUNC_IMPL (i, name, wcscmp,
-	      IFUNC_IMPL_ADD (array, i, wcscmp, HAS_SSE2, __wcscmp_sse2)
-	      IFUNC_IMPL_ADD (array, i, wcscmp, 1, __wcscmp_ia32))
-
-  /* Support sysdeps/i386/i686/multiarch/wcscpy.S.  */
-  IFUNC_IMPL (i, name, wcscpy,
-	      IFUNC_IMPL_ADD (array, i, wcscpy, HAS_SSSE3, __wcscpy_ssse3)
-	      IFUNC_IMPL_ADD (array, i, wcscpy, 1, __wcscpy_ia32))
-
-  /* Support sysdeps/i386/i686/multiarch/wcslen.S.  */
-  IFUNC_IMPL (i, name, wcslen,
-	      IFUNC_IMPL_ADD (array, i, wcslen, HAS_SSE2, __wcslen_sse2)
-	      IFUNC_IMPL_ADD (array, i, wcslen, 1, __wcslen_ia32))
-
-  /* Support sysdeps/i386/i686/multiarch/wcsrchr.S.  */
-  IFUNC_IMPL (i, name, wcsrchr,
-	      IFUNC_IMPL_ADD (array, i, wcsrchr, HAS_SSE2, __wcsrchr_sse2)
-	      IFUNC_IMPL_ADD (array, i, wcsrchr, 1, __wcsrchr_ia32))
-
-  /* Support sysdeps/i386/i686/multiarch/wmemcmp.S.  */
-  IFUNC_IMPL (i, name, wmemcmp,
-	      IFUNC_IMPL_ADD (array, i, wmemcmp, HAS_SSE4_2,
-			      __wmemcmp_sse4_2)
-	      IFUNC_IMPL_ADD (array, i, wmemcmp, HAS_SSSE3,
-			      __wmemcmp_ssse3)
-	      IFUNC_IMPL_ADD (array, i, wmemcmp, 1, __wmemcmp_ia32))
-
-#ifdef SHARED
-  /* Support sysdeps/i386/i686/multiarch/memcpy_chk.S.  */
-  IFUNC_IMPL (i, name, __memcpy_chk,
-	      IFUNC_IMPL_ADD (array, i, __memcpy_chk, HAS_SSSE3,
-			      __memcpy_chk_ssse3_rep)
-	      IFUNC_IMPL_ADD (array, i, __memcpy_chk, HAS_SSSE3,
-			      __memcpy_chk_ssse3)
-	      IFUNC_IMPL_ADD (array, i, __memcpy_chk, 1,
-			      __memcpy_chk_ia32))
-
-  /* Support sysdeps/i386/i686/multiarch/memcpy.S.  */
-  IFUNC_IMPL (i, name, memcpy,
-	      IFUNC_IMPL_ADD (array, i, memcpy, HAS_SSSE3,
-			      __memcpy_ssse3_rep)
-	      IFUNC_IMPL_ADD (array, i, memcpy, HAS_SSSE3, __memcpy_ssse3)
-	      IFUNC_IMPL_ADD (array, i, memcpy, 1, __memcpy_ia32))
-
-  /* Support sysdeps/i386/i686/multiarch/mempcpy_chk.S.  */
-  IFUNC_IMPL (i, name, __mempcpy_chk,
-	      IFUNC_IMPL_ADD (array, i, __mempcpy_chk, HAS_SSSE3,
-			      __mempcpy_chk_ssse3_rep)
-	      IFUNC_IMPL_ADD (array, i, __mempcpy_chk, HAS_SSSE3,
-			      __mempcpy_chk_ssse3)
-	      IFUNC_IMPL_ADD (array, i, __mempcpy_chk, 1,
-			      __mempcpy_chk_ia32))
-
-  /* Support sysdeps/i386/i686/multiarch/mempcpy.S.  */
-  IFUNC_IMPL (i, name, mempcpy,
-	      IFUNC_IMPL_ADD (array, i, mempcpy, HAS_SSSE3,
-			      __mempcpy_ssse3_rep)
-	      IFUNC_IMPL_ADD (array, i, mempcpy, HAS_SSSE3,
-			      __mempcpy_ssse3)
-	      IFUNC_IMPL_ADD (array, i, mempcpy, 1, __mempcpy_ia32))
-
-  /* Support sysdeps/i386/i686/multiarch/strlen.S.  */
-  IFUNC_IMPL (i, name, strlen,
-	      IFUNC_IMPL_ADD (array, i, strlen, HAS_SSE2,
-			      __strlen_sse2_bsf)
-	      IFUNC_IMPL_ADD (array, i, strlen, HAS_SSE2, __strlen_sse2)
-	      IFUNC_IMPL_ADD (array, i, strlen, 1, __strlen_ia32))
-
-  /* Support sysdeps/i386/i686/multiarch/strncmp.S.  */
-  IFUNC_IMPL (i, name, strncmp,
-	      IFUNC_IMPL_ADD (array, i, strncmp, HAS_SSE4_2,
-			      __strncmp_sse4_2)
-	      IFUNC_IMPL_ADD (array, i, strncmp, HAS_SSSE3,
-			      __strncmp_ssse3)
-	      IFUNC_IMPL_ADD (array, i, strncmp, 1, __strncmp_ia32))
-#endif
-
-  return i;
-}
diff --git a/sysdeps/i386/i686/multiarch/memchr.S b/sysdeps/i386/i686/multiarch/memchr.S
index 8b0344b..2cf4542 100644
--- a/sysdeps/i386/i686/multiarch/memchr.S
+++ b/sysdeps/i386/i686/multiarch/memchr.S
@@ -1,5 +1,4 @@
 /* Multiple versions of memchr
-   All versions must be listed in ifunc-impl-list.c.
    Copyright (C) 2011-2012 Free Software Foundation, Inc.
    Contributed by Intel Corporation.
    This file is part of the GNU C Library.
diff --git a/sysdeps/i386/i686/multiarch/memcmp.S b/sysdeps/i386/i686/multiarch/memcmp.S
index 7b9c1c4..d8076b9 100644
--- a/sysdeps/i386/i686/multiarch/memcmp.S
+++ b/sysdeps/i386/i686/multiarch/memcmp.S
@@ -1,5 +1,4 @@
 /* Multiple versions of memcmp
-   All versions must be listed in ifunc-impl-list.c.
    Copyright (C) 2010, 2012 Free Software Foundation, Inc.
    Contributed by Intel Corporation.
    This file is part of the GNU C Library.
@@ -68,8 +67,6 @@ 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 0d4a101..558c04f 100644
--- a/sysdeps/i386/i686/multiarch/memcpy.S
+++ b/sysdeps/i386/i686/multiarch/memcpy.S
@@ -1,5 +1,4 @@
 /* Multiple versions of memcpy
-   All versions must be listed in ifunc-impl-list.c.
    Copyright (C) 2010, 2012 Free Software Foundation, Inc.
    Contributed by Intel Corporation.
    This file is part of the GNU C Library.
@@ -52,8 +51,6 @@ 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/memcpy_chk.S b/sysdeps/i386/i686/multiarch/memcpy_chk.S
index d9d7e1f..40deada 100644
--- a/sysdeps/i386/i686/multiarch/memcpy_chk.S
+++ b/sysdeps/i386/i686/multiarch/memcpy_chk.S
@@ -1,5 +1,4 @@
 /* Multiple versions of __memcpy_chk
-   All versions must be listed in ifunc-impl-list.c.
    Copyright (C) 2010, 2012 Free Software Foundation, Inc.
    Contributed by Intel Corporation.
    This file is part of the GNU C Library.
diff --git a/sysdeps/i386/i686/multiarch/memmove.S b/sysdeps/i386/i686/multiarch/memmove.S
index b692f47..b8892c0 100644
--- a/sysdeps/i386/i686/multiarch/memmove.S
+++ b/sysdeps/i386/i686/multiarch/memmove.S
@@ -1,5 +1,4 @@
 /* Multiple versions of memmove
-   All versions must be listed in ifunc-impl-list.c.
    Copyright (C) 2010, 2012 Free Software Foundation, Inc.
    Contributed by Intel Corporation.
    This file is part of the GNU C Library.
@@ -51,8 +50,6 @@ 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/memmove_chk.S b/sysdeps/i386/i686/multiarch/memmove_chk.S
index 20dc3e3..8139cd9 100644
--- a/sysdeps/i386/i686/multiarch/memmove_chk.S
+++ b/sysdeps/i386/i686/multiarch/memmove_chk.S
@@ -1,5 +1,4 @@
 /* Multiple versions of __memmove_chk
-   All versions must be listed in ifunc-impl-list.c.
    Copyright (C) 2010, 2012 Free Software Foundation, Inc.
    Contributed by Intel Corporation.
    This file is part of the GNU C Library.
diff --git a/sysdeps/i386/i686/multiarch/mempcpy.S b/sysdeps/i386/i686/multiarch/mempcpy.S
index 500e6e7..95bda46 100644
--- a/sysdeps/i386/i686/multiarch/mempcpy.S
+++ b/sysdeps/i386/i686/multiarch/mempcpy.S
@@ -1,5 +1,4 @@
 /* Multiple versions of mempcpy
-   All versions must be listed in ifunc-impl-list.c.
    Copyright (C) 2010, 2012 Free Software Foundation, Inc.
    Contributed by Intel Corporation.
    This file is part of the GNU C Library.
@@ -52,8 +51,6 @@ 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/mempcpy_chk.S b/sysdeps/i386/i686/multiarch/mempcpy_chk.S
index 12f3453..e491f94 100644
--- a/sysdeps/i386/i686/multiarch/mempcpy_chk.S
+++ b/sysdeps/i386/i686/multiarch/mempcpy_chk.S
@@ -1,5 +1,4 @@
 /* Multiple versions of __mempcpy_chk
-   All versions must be listed in ifunc-impl-list.c.
    Copyright (C) 2010, 2012 Free Software Foundation, Inc.
    Contributed by Intel Corporation.
    This file is part of the GNU C Library.
diff --git a/sysdeps/i386/i686/multiarch/memrchr.S b/sysdeps/i386/i686/multiarch/memrchr.S
index f94862b..762489d 100644
--- a/sysdeps/i386/i686/multiarch/memrchr.S
+++ b/sysdeps/i386/i686/multiarch/memrchr.S
@@ -1,5 +1,4 @@
 /* Multiple versions of memrchr
-   All versions must be listed in ifunc-impl-list.c.
    Copyright (C) 2011, 2012 Free Software Foundation, Inc.
    Contributed by Intel Corporation.
    This file is part of the GNU C Library.
diff --git a/sysdeps/i386/i686/multiarch/memset.S b/sysdeps/i386/i686/multiarch/memset.S
index 65745d4..8878340 100644
--- a/sysdeps/i386/i686/multiarch/memset.S
+++ b/sysdeps/i386/i686/multiarch/memset.S
@@ -1,5 +1,4 @@
 /* Multiple versions of memset
-   All versions must be listed in ifunc-impl-list.c.
    Copyright (C) 2010, 2012 Free Software Foundation, Inc.
    Contributed by Intel Corporation.
    This file is part of the GNU C Library.
diff --git a/sysdeps/i386/i686/multiarch/memset_chk.S b/sysdeps/i386/i686/multiarch/memset_chk.S
index d499b8c..02649df 100644
--- a/sysdeps/i386/i686/multiarch/memset_chk.S
+++ b/sysdeps/i386/i686/multiarch/memset_chk.S
@@ -1,5 +1,4 @@
 /* Multiple versions of __memset_chk
-   All versions must be listed in ifunc-impl-list.c.
    Copyright (C) 2010, 2012 Free Software Foundation, Inc.
    Contributed by Intel Corporation.
    This file is part of the GNU C Library.
diff --git a/sysdeps/i386/i686/multiarch/rawmemchr.S b/sysdeps/i386/i686/multiarch/rawmemchr.S
index f2af368..5bea20b 100644
--- a/sysdeps/i386/i686/multiarch/rawmemchr.S
+++ b/sysdeps/i386/i686/multiarch/rawmemchr.S
@@ -1,5 +1,4 @@
 /* Multiple versions of rawmemchr
-   All versions must be listed in ifunc-impl-list.c.
    Copyright (C) 2011-2012 Free Software Foundation, Inc.
    Contributed by Intel Corporation.
    This file is part of the GNU C Library.
diff --git a/sysdeps/i386/i686/multiarch/stpcpy.S b/sysdeps/i386/i686/multiarch/stpcpy.S
index ee81ab6..b63d308 100644
--- a/sysdeps/i386/i686/multiarch/stpcpy.S
+++ b/sysdeps/i386/i686/multiarch/stpcpy.S
@@ -1,5 +1,3 @@
-/* Multiple versions of stpcpy
-   All versions must be listed in ifunc-impl-list.c.  */
 #define USE_AS_STPCPY
 #define STRCPY __stpcpy
 #include "strcpy.S"
diff --git a/sysdeps/i386/i686/multiarch/stpncpy.S b/sysdeps/i386/i686/multiarch/stpncpy.S
index 2698ca6..ff89a89 100644
--- a/sysdeps/i386/i686/multiarch/stpncpy.S
+++ b/sysdeps/i386/i686/multiarch/stpncpy.S
@@ -1,5 +1,3 @@
-/* Multiple versions of stpncpy
-   All versions must be listed in ifunc-impl-list.c.  */
 #define STRCPY __stpncpy
 #define USE_AS_STPCPY
 #define USE_AS_STRNCPY
diff --git a/sysdeps/i386/i686/multiarch/strcasecmp.S b/sysdeps/i386/i686/multiarch/strcasecmp.S
index cf83e6e..fbd2de3 100644
--- a/sysdeps/i386/i686/multiarch/strcasecmp.S
+++ b/sysdeps/i386/i686/multiarch/strcasecmp.S
@@ -1,5 +1,4 @@
 /* Entry point for multi-version x86 strcasecmp.
-   All versions must be listed in ifunc-impl-list.c.
    Copyright (C) 2011-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
diff --git a/sysdeps/i386/i686/multiarch/strcasecmp_l.S b/sysdeps/i386/i686/multiarch/strcasecmp_l.S
index 711c09b..1322bd8 100644
--- a/sysdeps/i386/i686/multiarch/strcasecmp_l.S
+++ b/sysdeps/i386/i686/multiarch/strcasecmp_l.S
@@ -1,5 +1,3 @@
-/* Multiple versions of strcasecmp_l
-   All versions must be listed in ifunc-impl-list.c.  */
 #define STRCMP __strcasecmp_l
 #define USE_AS_STRCASECMP_L
 #include "strcmp.S"
diff --git a/sysdeps/i386/i686/multiarch/strcasestr-c.c b/sysdeps/i386/i686/multiarch/strcasestr-c.c
index c1d6dac..0d52b0e 100644
--- a/sysdeps/i386/i686/multiarch/strcasestr-c.c
+++ b/sysdeps/i386/i686/multiarch/strcasestr-c.c
@@ -1,4 +1,2 @@
-/* Multiple versions of strcasestr
-   All versions must be listed in ifunc-impl-list.c.  */
 #define __strcasestr_sse2 __strcasestr_ia32
 #include <sysdeps/x86_64/multiarch/strcasestr-c.c>
diff --git a/sysdeps/i386/i686/multiarch/strcat.S b/sysdeps/i386/i686/multiarch/strcat.S
index a7d3224..e68feca 100644
--- a/sysdeps/i386/i686/multiarch/strcat.S
+++ b/sysdeps/i386/i686/multiarch/strcat.S
@@ -1,5 +1,4 @@
 /* Multiple versions of strcat
-   All versions must be listed in ifunc-impl-list.c.
    Copyright (C) 2011-2012 Free Software Foundation, Inc.
    Contributed by Intel Corporation.
    This file is part of the GNU C Library.
@@ -95,8 +94,6 @@ 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/strchr.S b/sysdeps/i386/i686/multiarch/strchr.S
index c6205da..e236d60 100644
--- a/sysdeps/i386/i686/multiarch/strchr.S
+++ b/sysdeps/i386/i686/multiarch/strchr.S
@@ -1,5 +1,4 @@
 /* Multiple versions of strchr
-   All versions must be listed in ifunc-impl-list.c.
    Copyright (C) 2011-2012 Free Software Foundation, Inc.
    Contributed by Intel Corporation.
    This file is part of the GNU C Library.
diff --git a/sysdeps/i386/i686/multiarch/strcmp.S b/sysdeps/i386/i686/multiarch/strcmp.S
index 76ac1f8..b3b9eb8 100644
--- a/sysdeps/i386/i686/multiarch/strcmp.S
+++ b/sysdeps/i386/i686/multiarch/strcmp.S
@@ -1,5 +1,4 @@
 /* Multiple versions of strcmp
-   All versions must be listed in ifunc-impl-list.c.
    Copyright (C) 2010-2012 Free Software Foundation, Inc.
    Contributed by Intel Corporation.
    This file is part of the GNU C Library.
@@ -96,8 +95,6 @@ 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 44fa6d2..71eee76 100644
--- a/sysdeps/i386/i686/multiarch/strcpy.S
+++ b/sysdeps/i386/i686/multiarch/strcpy.S
@@ -1,5 +1,4 @@
 /* Multiple versions of strcpy
-   All versions must be listed in ifunc-impl-list.c.
    Copyright (C) 2011-2012 Free Software Foundation, Inc.
    Contributed by Intel Corporation.
    This file is part of the GNU C Library.
@@ -111,8 +110,6 @@ 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
diff --git a/sysdeps/i386/i686/multiarch/strcspn.S b/sysdeps/i386/i686/multiarch/strcspn.S
index 8495430..8a00a02 100644
--- a/sysdeps/i386/i686/multiarch/strcspn.S
+++ b/sysdeps/i386/i686/multiarch/strcspn.S
@@ -1,5 +1,4 @@
 /* Multiple versions of strcspn
-   All versions must be listed in ifunc-impl-list.c.
    Copyright (C) 2009, 2012 Free Software Foundation, Inc.
    Contributed by Intel Corporation.
    This file is part of the GNU C Library.
diff --git a/sysdeps/i386/i686/multiarch/strlen.S b/sysdeps/i386/i686/multiarch/strlen.S
index c1d8b6c..310765c 100644
--- a/sysdeps/i386/i686/multiarch/strlen.S
+++ b/sysdeps/i386/i686/multiarch/strlen.S
@@ -1,5 +1,4 @@
 /* Multiple versions of strlen
-   All versions must be listed in ifunc-impl-list.c.
    Copyright (C) 2009, 2010, 2012 Free Software Foundation, Inc.
    Contributed by Intel Corporation.
    This file is part of the GNU C Library.
diff --git a/sysdeps/i386/i686/multiarch/strncase.S b/sysdeps/i386/i686/multiarch/strncase.S
index ca5f863..37fccb8 100644
--- a/sysdeps/i386/i686/multiarch/strncase.S
+++ b/sysdeps/i386/i686/multiarch/strncase.S
@@ -1,5 +1,4 @@
 /* Entry point for multi-version x86 strncasecmp.
-   All versions must be listed in ifunc-impl-list.c.
    Copyright (C) 2011-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
diff --git a/sysdeps/i386/i686/multiarch/strncase_l.S b/sysdeps/i386/i686/multiarch/strncase_l.S
index 8a74ee8..a808c8c 100644
--- a/sysdeps/i386/i686/multiarch/strncase_l.S
+++ b/sysdeps/i386/i686/multiarch/strncase_l.S
@@ -1,5 +1,3 @@
-/* Multiple versions of strncasecmp_l
-   All versions must be listed in ifunc-impl-list.c.  */
 #define STRCMP __strncasecmp_l
 #define USE_AS_STRNCASECMP_L
 #include "strcmp.S"
diff --git a/sysdeps/i386/i686/multiarch/strncat.S b/sysdeps/i386/i686/multiarch/strncat.S
index 5c1bf41..fd569c2 100644
--- a/sysdeps/i386/i686/multiarch/strncat.S
+++ b/sysdeps/i386/i686/multiarch/strncat.S
@@ -1,5 +1,3 @@
-/* Multiple versions of strncat
-   All versions must be listed in ifunc-impl-list.c.  */
 #define STRCAT strncat
 #define USE_AS_STRNCAT
 #include "strcat.S"
diff --git a/sysdeps/i386/i686/multiarch/strncmp.S b/sysdeps/i386/i686/multiarch/strncmp.S
index 150d478..b681431 100644
--- a/sysdeps/i386/i686/multiarch/strncmp.S
+++ b/sysdeps/i386/i686/multiarch/strncmp.S
@@ -1,5 +1,3 @@
-/* Multiple versions of strncmp
-   All versions must be listed in ifunc-impl-list.c.  */
 #define USE_AS_STRNCMP
 #define STRCMP	strncmp
 #include "strcmp.S"
diff --git a/sysdeps/i386/i686/multiarch/strncpy.S b/sysdeps/i386/i686/multiarch/strncpy.S
index 9c257ef..30a5bd2 100644
--- a/sysdeps/i386/i686/multiarch/strncpy.S
+++ b/sysdeps/i386/i686/multiarch/strncpy.S
@@ -1,5 +1,3 @@
-/* Multiple versions of strncpy
-   All versions must be listed in ifunc-impl-list.c.  */
 #define USE_AS_STRNCPY
 #define STRCPY strncpy
 #include "strcpy.S"
diff --git a/sysdeps/i386/i686/multiarch/strnlen.S b/sysdeps/i386/i686/multiarch/strnlen.S
index b82052e..44ad0b3 100644
--- a/sysdeps/i386/i686/multiarch/strnlen.S
+++ b/sysdeps/i386/i686/multiarch/strnlen.S
@@ -1,5 +1,4 @@
 /* Multiple versions of strnlen
-   All versions must be listed in ifunc-impl-list.c.
    Copyright (C) 2011-2012 Free Software Foundation, Inc.
    Contributed by Intel Corporation.
    This file is part of the GNU C Library.
diff --git a/sysdeps/i386/i686/multiarch/strpbrk.S b/sysdeps/i386/i686/multiarch/strpbrk.S
index 7201d63..ed5bca6 100644
--- a/sysdeps/i386/i686/multiarch/strpbrk.S
+++ b/sysdeps/i386/i686/multiarch/strpbrk.S
@@ -1,5 +1,3 @@
-/* Multiple versions of strpbrk
-   All versions must be listed in ifunc-impl-list.c.  */
 #define STRCSPN strpbrk
 #define USE_AS_STRPBRK
 #include "strcspn.S"
diff --git a/sysdeps/i386/i686/multiarch/strrchr.S b/sysdeps/i386/i686/multiarch/strrchr.S
index 37468f1..f851b77 100644
--- a/sysdeps/i386/i686/multiarch/strrchr.S
+++ b/sysdeps/i386/i686/multiarch/strrchr.S
@@ -1,5 +1,4 @@
 /* Multiple versions of strrchr
-   All versions must be listed in ifunc-impl-list.c.
    Copyright (C) 2011-2012 Free Software Foundation, Inc.
    Contributed by Intel Corporation.
    This file is part of the GNU C Library.
diff --git a/sysdeps/i386/i686/multiarch/strspn.S b/sysdeps/i386/i686/multiarch/strspn.S
index f90df63..8170f9c 100644
--- a/sysdeps/i386/i686/multiarch/strspn.S
+++ b/sysdeps/i386/i686/multiarch/strspn.S
@@ -1,5 +1,4 @@
 /* Multiple versions of strspn
-   All versions must be listed in ifunc-impl-list.c.
    Copyright (C) 2009,2010,2012 Free Software Foundation, Inc.
    Contributed by Intel Corporation.
    This file is part of the GNU C Library.
diff --git a/sysdeps/i386/i686/multiarch/strstr-c.c b/sysdeps/i386/i686/multiarch/strstr-c.c
index 7516c7f..17c75c5 100644
--- a/sysdeps/i386/i686/multiarch/strstr-c.c
+++ b/sysdeps/i386/i686/multiarch/strstr-c.c
@@ -1,6 +1,3 @@
-/* Multiple versions of strstr
-   All versions must be listed in ifunc-impl-list.c.  */
-
 #include "init-arch.h"
 
 #define STRSTR __strstr_ia32
diff --git a/sysdeps/i386/i686/multiarch/wcschr.S b/sysdeps/i386/i686/multiarch/wcschr.S
index 03fe3ca..34ea47d 100644
--- a/sysdeps/i386/i686/multiarch/wcschr.S
+++ b/sysdeps/i386/i686/multiarch/wcschr.S
@@ -1,5 +1,4 @@
 /* Multiple versions of wcschr
-   All versions must be listed in ifunc-impl-list.c.
    Copyright (C) 2011-2012 Free Software Foundation, Inc.
    Contributed by Intel Corporation.
    This file is part of the GNU C Library.
diff --git a/sysdeps/i386/i686/multiarch/wcscmp.S b/sysdeps/i386/i686/multiarch/wcscmp.S
index e23ba05..d458476 100644
--- a/sysdeps/i386/i686/multiarch/wcscmp.S
+++ b/sysdeps/i386/i686/multiarch/wcscmp.S
@@ -1,5 +1,4 @@
 /* Multiple versions of wcscmp
-   All versions must be listed in ifunc-impl-list.c.
    Copyright (C) 2011-2012 Free Software Foundation, Inc.
    Contributed by Intel Corporation.
    This file is part of the GNU C Library.
diff --git a/sysdeps/i386/i686/multiarch/wcscpy.S b/sysdeps/i386/i686/multiarch/wcscpy.S
index 6eea48a..8c3ba1d 100644
--- a/sysdeps/i386/i686/multiarch/wcscpy.S
+++ b/sysdeps/i386/i686/multiarch/wcscpy.S
@@ -1,5 +1,4 @@
 /* Multiple versions of wcscpy
-   All versions must be listed in ifunc-impl-list.c.
    Copyright (C) 2011-2012 Free Software Foundation, Inc.
    Contributed by Intel Corporation.
    This file is part of the GNU C Library.
diff --git a/sysdeps/i386/i686/multiarch/wcslen.S b/sysdeps/i386/i686/multiarch/wcslen.S
index cdae516..f8b2fab 100644
--- a/sysdeps/i386/i686/multiarch/wcslen.S
+++ b/sysdeps/i386/i686/multiarch/wcslen.S
@@ -1,5 +1,4 @@
 /* Multiple versions of wcslen
-   All versions must be listed in ifunc-impl-list.c.
    Copyright (C) 2011-2012 Free Software Foundation, Inc.
    Contributed by Intel Corporation.
    This file is part of the GNU C Library.
diff --git a/sysdeps/i386/i686/multiarch/wcsrchr.S b/sysdeps/i386/i686/multiarch/wcsrchr.S
index f4b0618..ec550b0 100644
--- a/sysdeps/i386/i686/multiarch/wcsrchr.S
+++ b/sysdeps/i386/i686/multiarch/wcsrchr.S
@@ -1,5 +1,4 @@
 /* Multiple versions of wcsrchr
-   All versions must be listed in ifunc-impl-list.c.
    Copyright (C) 2011-2012 Free Software Foundation, Inc.
    Contributed by Intel Corporation.
    This file is part of the GNU C Library.
diff --git a/sysdeps/i386/i686/multiarch/wmemcmp.S b/sysdeps/i386/i686/multiarch/wmemcmp.S
index 7c485f7..61d55cd 100644
--- a/sysdeps/i386/i686/multiarch/wmemcmp.S
+++ b/sysdeps/i386/i686/multiarch/wmemcmp.S
@@ -1,5 +1,4 @@
 /* Multiple versions of wmemcmp
-   All versions must be listed in ifunc-impl-list.c.
    Copyright (C) 2011-2012 Free Software Foundation, Inc.
    Contributed by Intel Corporation.
    This file is part of the GNU C Library.
diff --git a/sysdeps/posix/dirstream.h b/sysdeps/posix/dirstream.h
index 6ca2904..a4ba36f 100644
--- a/sysdeps/posix/dirstream.h
+++ b/sysdeps/posix/dirstream.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993, 1995, 1996, 2007 Free Software Foundation, Inc.
+/* Copyright (C) 1993-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
@@ -39,6 +39,8 @@ struct __dirstream
 
     off_t filepos;		/* Position of next entry to read.  */
 
+    int errcode;		/* Delayed error code.  */
+
     /* Directory block.  */
     char data[0] __attribute__ ((aligned (__alignof__ (void*))));
   };
diff --git a/sysdeps/posix/opendir.c b/sysdeps/posix/opendir.c
index e093142..a738d6c 100644
--- a/sysdeps/posix/opendir.c
+++ b/sysdeps/posix/opendir.c
@@ -1,5 +1,4 @@
-/* Copyright (C) 1991-1996,98,2000-2003,2005,2007,2009,2011
-   Free Software Foundation, Inc.
+/* Copyright (C) 1991-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
@@ -223,6 +222,7 @@ __alloc_dir (int fd, bool close_fd, int flags, const struct stat64 *statp)
   dirp->size = 0;
   dirp->offset = 0;
   dirp->filepos = 0;
+  dirp->errcode = 0;
 
   return dirp;
 }
diff --git a/sysdeps/posix/readdir_r.c b/sysdeps/posix/readdir_r.c
index bfa2c0b..8db96c7 100644
--- a/sysdeps/posix/readdir_r.c
+++ b/sysdeps/posix/readdir_r.c
@@ -1,5 +1,4 @@
-/* Copyright (C) 1991,92,93,94,95,96,97,98,99,2000,02,10
-	Free Software Foundation, Inc.
+/* Copyright (C) 1991-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
@@ -41,6 +40,7 @@ __READDIR_R (DIR *dirp, DIRENT_TYPE *entry, DIRENT_TYPE **result)
   DIRENT_TYPE *dp;
   size_t reclen;
   const int saved_errno = errno;
+  int ret;
 
   __libc_lock_lock (dirp->lock);
 
@@ -71,10 +71,10 @@ __READDIR_R (DIR *dirp, DIRENT_TYPE *entry, DIRENT_TYPE **result)
 		  bytes = 0;
 		  __set_errno (saved_errno);
 		}
+	      if (bytes < 0)
+		dirp->errcode = errno;
 
 	      dp = NULL;
-	      /* Reclen != 0 signals that an error occurred.  */
-	      reclen = bytes != 0;
 	      break;
 	    }
 	  dirp->size = (size_t) bytes;
@@ -107,29 +107,47 @@ __READDIR_R (DIR *dirp, DIRENT_TYPE *entry, DIRENT_TYPE **result)
       dirp->filepos += reclen;
 #endif
 
-      /* Skip deleted files.  */
+#ifdef NAME_MAX
+      if (reclen > offsetof (DIRENT_TYPE, d_name) + NAME_MAX + 1)
+	{
+	  /* The record is very long.  It could still fit into the
+	     caller-supplied buffer if we can skip padding at the
+	     end.  */
+	  size_t namelen = strlen(dp->d_name);
+	  if (namelen <= NAME_MAX)
+	    reclen = offsetof (DIRENT_TYPE, d_name) + namelen + 1;
+	  else
+	    {
+	      /* The name is too long.  Ignore this file.  */
+	      dirp->errcode = ENAMETOOLONG;
+	      dp->d_ino = 0;
+	      continue;
+	    }
+	}
+#endif
+
+      /* Skip deleted and ignored files.  */
     }
   while (dp->d_ino == 0);
 
   if (dp != NULL)
     {
-#ifdef GETDENTS_64BIT_ALIGNED
-      /* The d_reclen value might include padding which is not part of
-	 the DIRENT_TYPE data structure.  */
-      reclen = MIN (reclen,
-		    offsetof (DIRENT_TYPE, d_name) + sizeof (dp->d_name));
-#endif
       *result = memcpy (entry, dp, reclen);
-#ifdef GETDENTS_64BIT_ALIGNED
+#ifdef _DIRENT_HAVE_D_RECLEN
       entry->d_reclen = reclen;
 #endif
     }
   else
     *result = NULL;
 
+  if (dp != 0)
+    ret = 0;
+  else
+    ret = dirp->errcode;
+
   __libc_lock_unlock (dirp->lock);
 
-  return dp != NULL ? 0 : reclen ? errno : 0;
+  return ret;
 }
 
 #ifdef __READDIR_R_ALIAS
diff --git a/sysdeps/unix/sysv/linux/i386/readdir64_r.c b/sysdeps/unix/sysv/linux/i386/readdir64_r.c
index 8471f03..5256974 100644
--- a/sysdeps/unix/sysv/linux/i386/readdir64_r.c
+++ b/sysdeps/unix/sysv/linux/i386/readdir64_r.c
@@ -18,7 +18,6 @@
 #define __READDIR_R __readdir64_r
 #define __GETDENTS __getdents64
 #define DIRENT_TYPE struct dirent64
-#define GETDENTS_64BIT_ALIGNED 1
 
 #include <sysdeps/posix/readdir_r.c>
 
diff --git a/sysdeps/unix/sysv/linux/wordsize-64/readdir_r.c b/sysdeps/unix/sysv/linux/wordsize-64/readdir_r.c
index 5ed8e95..290f2c8 100644
--- a/sysdeps/unix/sysv/linux/wordsize-64/readdir_r.c
+++ b/sysdeps/unix/sysv/linux/wordsize-64/readdir_r.c
@@ -1,5 +1,4 @@
 #define readdir64_r __no_readdir64_r_decl
-#define GETDENTS_64BIT_ALIGNED 1
 #include <sysdeps/posix/readdir_r.c>
 #undef readdir64_r
 weak_alias (__readdir_r, readdir64_r)
diff --git a/sysdeps/x86_64/multiarch/bcopy.S b/sysdeps/x86_64/multiarch/bcopy.S
index 639f02b..11e250f 100644
--- a/sysdeps/x86_64/multiarch/bcopy.S
+++ b/sysdeps/x86_64/multiarch/bcopy.S
@@ -3,5 +3,5 @@
 	.text
 ENTRY(bcopy)
 	xchg	%rdi, %rsi
-	jmp	__libc_memmove	/* Branch to IFUNC memmove.  */
+	jmp	HIDDEN_BUILTIN_JUMPTARGET(memmove)
 END(bcopy)
diff --git a/sysdeps/x86_64/multiarch/bzero.S b/sysdeps/x86_64/multiarch/bzero.S
index 23beab7..92e9fcf 100644
--- a/sysdeps/x86_64/multiarch/bzero.S
+++ b/sysdeps/x86_64/multiarch/bzero.S
@@ -1,5 +1,5 @@
-/* bzero.  x86-64 version.
-   Copyright (C) 2010-2012 Free Software Foundation, Inc.
+/* Multiple versions of bzero
+   Copyright (C) 2010 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
@@ -21,8 +21,35 @@
 
 	.text
 ENTRY(__bzero)
+	.type	__bzero, @gnu_indirect_function
+	cmpl	$0, __cpu_features+KIND_OFFSET(%rip)
+	jne	1f
+	call	__init_cpu_features
+1:	leaq	__bzero_x86_64(%rip), %rax
+	testl	$bit_Prefer_SSE_for_memop, __cpu_features+FEATURE_OFFSET+index_Prefer_SSE_for_memop(%rip)
+	jz	2f
+	leaq	__bzero_sse2(%rip), %rax
+2:	ret
+END(__bzero)
+
+	.type	__bzero_sse2, @function
+__bzero_sse2:
+	cfi_startproc
+	CALL_MCOUNT
 	mov	%rsi,%rdx	/* Adjust parameter.  */
 	xorl	%esi,%esi	/* Fill with 0s.  */
-	jmp	__libc_memset	/* Branch to IFUNC memset.  */
-END(__bzero)
+	jmp	__memset_sse2
+	cfi_endproc
+	.size __bzero_sse2, .-__bzero_sse2
+
+	.type	__bzero_x86_64, @function
+__bzero_x86_64:
+	cfi_startproc
+	CALL_MCOUNT
+	mov	%rsi,%rdx	/* Adjust parameter.  */
+	xorl	%esi,%esi	/* Fill with 0s.  */
+	jmp	__memset_x86_64
+	cfi_endproc
+	.size __bzero_x86_64, .-__bzero_x86_64
+
 weak_alias (__bzero, bzero)
diff --git a/sysdeps/x86_64/multiarch/ifunc-impl-list.c b/sysdeps/x86_64/multiarch/ifunc-impl-list.c
deleted file mode 100644
index 332a60d..0000000
--- a/sysdeps/x86_64/multiarch/ifunc-impl-list.c
+++ /dev/null
@@ -1,283 +0,0 @@
-/* Enumerate available IFUNC implementations of a function.  x86-64 version.
-   Copyright (C) 2012 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <assert.h>
-#include <string.h>
-#include <wchar.h>
-#include <ifunc-impl-list.h>
-#include "init-arch.h"
-
-/* Maximum number of IFUNC implementations.  */
-#define MAX_IFUNC	4
-
-/* Fill ARRAY of MAX elements with IFUNC implementations for function
-   NAME supported on target machine and return the number of valid
-   entries.  */
-
-size_t
-__libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
-			size_t max)
-{
-  assert (max >= MAX_IFUNC);
-
-  size_t i = 0;
-
-  /* Support sysdeps/x86_64/multiarch/memcmp.S.  */
-  IFUNC_IMPL (i, name, memcmp,
-	      IFUNC_IMPL_ADD (array, i, memcmp, HAS_SSE4_1,
-			      __memcmp_sse4_1)
-	      IFUNC_IMPL_ADD (array, i, memcmp, HAS_SSSE3, __memcmp_ssse3)
-	      IFUNC_IMPL_ADD (array, i, memcmp, 1, __memcmp_sse2))
-
-  /* Support sysdeps/x86_64/multiarch/memmove_chk.S.  */
-  IFUNC_IMPL (i, name, __memmove_chk,
-	      IFUNC_IMPL_ADD (array, i, __memmove_chk, HAS_SSSE3,
-			      __memmove_chk_ssse3_back)
-	      IFUNC_IMPL_ADD (array, i, __memmove_chk, HAS_SSSE3,
-			      __memmove_chk_ssse3)
-	      IFUNC_IMPL_ADD (array, i, __memmove_chk, 1,
-			      __memmove_chk_sse2))
-
-  /* Support sysdeps/x86_64/multiarch/memmove.S.  */
-  IFUNC_IMPL (i, name, memmove,
-	      IFUNC_IMPL_ADD (array, i, memmove, HAS_SSSE3,
-			      __memmove_ssse3_back)
-	      IFUNC_IMPL_ADD (array, i, memmove, HAS_SSSE3,
-			      __memmove_ssse3)
-	      IFUNC_IMPL_ADD (array, i, memmove, 1, __memmove_sse2))
-
-  /* Support sysdeps/x86_64/multiarch/memset_chk.S.  */
-  IFUNC_IMPL (i, name, __memset_chk,
-	      IFUNC_IMPL_ADD (array, i, __memset_chk, 1, __memset_chk_sse2)
-	      IFUNC_IMPL_ADD (array, i, __memset_chk, 1,
-			      __memset_chk_x86_64))
-
-  /* Support sysdeps/x86_64/multiarch/memset.S.  */
-  IFUNC_IMPL (i, name, memset,
-	      IFUNC_IMPL_ADD (array, i, memset, 1, __memset_sse2)
-	      IFUNC_IMPL_ADD (array, i, memset, 1, __memset_x86_64))
-
-  /* Support sysdeps/x86_64/multiarch/rawmemchr.S.  */
-  IFUNC_IMPL (i, name, rawmemchr,
-	      IFUNC_IMPL_ADD (array, i, rawmemchr, HAS_SSE4_2,
-			      __rawmemchr_sse42)
-	      IFUNC_IMPL_ADD (array, i, rawmemchr, 1, __rawmemchr_sse2))
-
-  /* Support sysdeps/x86_64/multiarch/stpncpy.S.  */
-  IFUNC_IMPL (i, name, stpncpy,
-	      IFUNC_IMPL_ADD (array, i, stpncpy, HAS_SSSE3,
-			      __stpncpy_ssse3)
-	      IFUNC_IMPL_ADD (array, i, stpncpy, 1,
-			      __stpncpy_sse2_unaligned)
-	      IFUNC_IMPL_ADD (array, i, stpncpy, 1, __stpncpy_sse2))
-
-  /* Support sysdeps/x86_64/multiarch/stpcpy.S.  */
-  IFUNC_IMPL (i, name, stpcpy,
-	      IFUNC_IMPL_ADD (array, i, stpcpy, HAS_SSSE3, __stpcpy_ssse3)
-	      IFUNC_IMPL_ADD (array, i, stpcpy, 1, __stpcpy_sse2_unaligned)
-	      IFUNC_IMPL_ADD (array, i, stpcpy, 1, __stpcpy_sse2))
-
-  /* Support sysdeps/x86_64/multiarch/strcasecmp_l.S.  */
-  IFUNC_IMPL (i, name, strcasecmp,
-	      IFUNC_IMPL_ADD (array, i, strcasecmp, HAS_AVX,
-			      __strcasecmp_avx)
-	      IFUNC_IMPL_ADD (array, i, strcasecmp, HAS_SSE4_2,
-			      __strcasecmp_sse42)
-	      IFUNC_IMPL_ADD (array, i, strcasecmp, HAS_SSSE3,
-			      __strcasecmp_ssse3)
-	      IFUNC_IMPL_ADD (array, i, strcasecmp, 1, __strcasecmp_sse2))
-
-  /* Support sysdeps/x86_64/multiarch/strcasecmp_l.S.  */
-  IFUNC_IMPL (i, name, strcasecmp_l,
-	      IFUNC_IMPL_ADD (array, i, strcasecmp_l, HAS_AVX,
-			      __strcasecmp_l_avx)
-	      IFUNC_IMPL_ADD (array, i, strcasecmp_l, HAS_SSE4_2,
-			      __strcasecmp_l_sse42)
-	      IFUNC_IMPL_ADD (array, i, strcasecmp_l, HAS_SSSE3,
-			      __strcasecmp_l_ssse3)
-	      IFUNC_IMPL_ADD (array, i, strcasecmp_l, 1,
-			      __strcasecmp_l_sse2))
-
-  /* Support sysdeps/x86_64/multiarch/strcasestr.c.  */
-  IFUNC_IMPL (i, name, strcasestr,
-	      IFUNC_IMPL_ADD (array, i, strcasestr, HAS_SSE4_2,
-			      __strcasestr_sse42)
-	      IFUNC_IMPL_ADD (array, i, strcasestr, 1, __strcasestr_sse2))
-
-  /* Support sysdeps/x86_64/multiarch/strcat.S.  */
-  IFUNC_IMPL (i, name, strcat,
-	      IFUNC_IMPL_ADD (array, i, strcat, HAS_SSSE3, __strcat_ssse3)
-	      IFUNC_IMPL_ADD (array, i, strcat, 1, __strcat_sse2_unaligned)
-	      IFUNC_IMPL_ADD (array, i, strcat, 1, __strcat_sse2))
-
-  /* Support sysdeps/x86_64/multiarch/strchr.S.  */
-  IFUNC_IMPL (i, name, strchr,
-	      IFUNC_IMPL_ADD (array, i, strchr, HAS_SSE4_2, __strchr_sse42)
-	      IFUNC_IMPL_ADD (array, i, strchr, 1, __strchr_sse2_no_bsf)
-	      IFUNC_IMPL_ADD (array, i, strchr, 1, __strchr_sse2))
-
-  /* Support sysdeps/x86_64/multiarch/strcmp.S.  */
-  IFUNC_IMPL (i, name, strcmp,
-	      IFUNC_IMPL_ADD (array, i, strcmp, HAS_SSE4_2, __strcmp_sse42)
-	      IFUNC_IMPL_ADD (array, i, strcmp, HAS_SSSE3, __strcmp_ssse3)
-	      IFUNC_IMPL_ADD (array, i, strcmp, 1, __strcmp_sse2))
-
-  /* Support sysdeps/x86_64/multiarch/strcpy.S.  */
-  IFUNC_IMPL (i, name, strcpy,
-	      IFUNC_IMPL_ADD (array, i, strcpy, HAS_SSSE3, __strcpy_ssse3)
-	      IFUNC_IMPL_ADD (array, i, strcpy, 1, __strcpy_sse2_unaligned)
-	      IFUNC_IMPL_ADD (array, i, strcpy, 1, __strcpy_sse2))
-
-  /* Support sysdeps/x86_64/multiarch/strcspn.S.  */
-  IFUNC_IMPL (i, name, strcspn,
-	      IFUNC_IMPL_ADD (array, i, strcspn, HAS_SSE4_2,
-			      __strcspn_sse42)
-	      IFUNC_IMPL_ADD (array, i, strcspn, 1, __strcspn_sse2))
-
-  /* Support sysdeps/x86_64/multiarch/strncase_l.S.  */
-  IFUNC_IMPL (i, name, strncasecmp,
-	      IFUNC_IMPL_ADD (array, i, strncasecmp, HAS_AVX,
-			      __strncasecmp_avx)
-	      IFUNC_IMPL_ADD (array, i, strncasecmp, HAS_SSE4_2,
-			      __strncasecmp_sse42)
-	      IFUNC_IMPL_ADD (array, i, strncasecmp, HAS_SSSE3,
-			      __strncasecmp_ssse3)
-	      IFUNC_IMPL_ADD (array, i, strncasecmp, 1,
-			      __strncasecmp_sse2))
-
-  /* Support sysdeps/x86_64/multiarch/strncase_l.S.  */
-  IFUNC_IMPL (i, name, strncasecmp_l,
-	      IFUNC_IMPL_ADD (array, i, strncasecmp_l, HAS_AVX,
-			      __strncasecmp_l_avx)
-	      IFUNC_IMPL_ADD (array, i, strncasecmp_l, HAS_SSE4_2,
-			      __strncasecmp_l_sse42)
-	      IFUNC_IMPL_ADD (array, i, strncasecmp_l, HAS_SSSE3,
-			      __strncasecmp_l_ssse3)
-	      IFUNC_IMPL_ADD (array, i, strncasecmp_l, 1,
-			      __strncasecmp_l_sse2))
-
-  /* Support sysdeps/x86_64/multiarch/strncat.S.  */
-  IFUNC_IMPL (i, name, strncat,
-	      IFUNC_IMPL_ADD (array, i, strncat, HAS_SSSE3,
-			      __strncat_ssse3)
-	      IFUNC_IMPL_ADD (array, i, strncat, 1,
-			      __strncat_sse2_unaligned)
-	      IFUNC_IMPL_ADD (array, i, strncat, 1, __strncat_sse2))
-
-  /* Support sysdeps/x86_64/multiarch/strncpy.S.  */
-  IFUNC_IMPL (i, name, strncpy,
-	      IFUNC_IMPL_ADD (array, i, strncpy, HAS_SSSE3,
-			      __strncpy_ssse3)
-	      IFUNC_IMPL_ADD (array, i, strncpy, 1,
-			      __strncpy_sse2_unaligned)
-	      IFUNC_IMPL_ADD (array, i, strncpy, 1, __strncpy_sse2))
-
-  /* Support sysdeps/x86_64/multiarch/strnlen.S.  */
-  IFUNC_IMPL (i, name, strnlen,
-	      IFUNC_IMPL_ADD (array, i, strnlen, 1, __strnlen_sse2_no_bsf)
-	      IFUNC_IMPL_ADD (array, i, strnlen, 1, __strnlen_sse2))
-
-  /* Support sysdeps/x86_64/multiarch/strpbrk.S.  */
-  IFUNC_IMPL (i, name, strpbrk,
-	      IFUNC_IMPL_ADD (array, i, strpbrk, HAS_SSE4_2,
-			      __strpbrk_sse42)
-	      IFUNC_IMPL_ADD (array, i, strpbrk, 1, __strpbrk_sse2))
-
-  /* Support sysdeps/x86_64/multiarch/strrchr.S.  */
-  IFUNC_IMPL (i, name, strrchr,
-	      IFUNC_IMPL_ADD (array, i, strrchr, HAS_SSE4_2,
-			      __strrchr_sse42)
-	      IFUNC_IMPL_ADD (array, i, strrchr, 1, __strrchr_sse2_no_bsf)
-	      IFUNC_IMPL_ADD (array, i, strrchr, 1, __strrchr_sse2))
-
-  /* Support sysdeps/x86_64/multiarch/strspn.S.  */
-  IFUNC_IMPL (i, name, strspn,
-	      IFUNC_IMPL_ADD (array, i, strspn, HAS_SSE4_2, __strspn_sse42)
-	      IFUNC_IMPL_ADD (array, i, strspn, 1, __strspn_sse2))
-
-  /* Support sysdeps/x86_64/multiarch/strstr-c.c.  */
-  IFUNC_IMPL (i, name, strstr,
-	      IFUNC_IMPL_ADD (array, i, strstr, HAS_SSE4_2, __strstr_sse42)
-	      IFUNC_IMPL_ADD (array, i, strstr, 1, __strstr_sse2))
-
-  /* Support sysdeps/x86_64/multiarch/wcscpy.S.  */
-  IFUNC_IMPL (i, name, wcscpy,
-	      IFUNC_IMPL_ADD (array, i, wcscpy, HAS_SSSE3, __wcscpy_ssse3)
-	      IFUNC_IMPL_ADD (array, i, wcscpy, 1, __wcscpy_sse2))
-
-  /* Support sysdeps/x86_64/multiarch/wmemcmp.S.  */
-  IFUNC_IMPL (i, name, wmemcmp,
-	      IFUNC_IMPL_ADD (array, i, wmemcmp, HAS_SSE4_1,
-			      __wmemcmp_sse4_1)
-	      IFUNC_IMPL_ADD (array, i, wmemcmp, HAS_SSSE3,
-			      __wmemcmp_ssse3)
-	      IFUNC_IMPL_ADD (array, i, wmemcmp, 1, __wmemcmp_sse2))
-
-#ifdef SHARED
-  /* Support sysdeps/x86_64/multiarch/memcpy_chk.S.  */
-  IFUNC_IMPL (i, name, __memcpy_chk,
-	      IFUNC_IMPL_ADD (array, i, __memcpy_chk, HAS_SSSE3,
-			      __memcpy_chk_ssse3_back)
-	      IFUNC_IMPL_ADD (array, i, __memcpy_chk, HAS_SSSE3,
-			      __memcpy_chk_ssse3)
-	      IFUNC_IMPL_ADD (array, i, __memcpy_chk, 1,
-			      __memcpy_chk_sse2))
-
-  /* Support sysdeps/x86_64/multiarch/memcpy.S.  */
-  IFUNC_IMPL (i, name, memcpy,
-	      IFUNC_IMPL_ADD (array, i, memcpy, HAS_SSSE3,
-			      __memcpy_ssse3_back)
-	      IFUNC_IMPL_ADD (array, i, memcpy, HAS_SSSE3, __memcpy_ssse3)
-	      IFUNC_IMPL_ADD (array, i, memcpy, 1, __memcpy_sse2))
-
-  /* Support sysdeps/x86_64/multiarch/mempcpy_chk.S.  */
-  IFUNC_IMPL (i, name, __mempcpy_chk,
-	      IFUNC_IMPL_ADD (array, i, __mempcpy_chk, HAS_SSSE3,
-			      __mempcpy_chk_ssse3_back)
-	      IFUNC_IMPL_ADD (array, i, __mempcpy_chk, HAS_SSSE3,
-			      __mempcpy_chk_ssse3)
-	      IFUNC_IMPL_ADD (array, i, __mempcpy_chk, 1,
-			      __mempcpy_chk_sse2))
-
-  /* Support sysdeps/x86_64/multiarch/mempcpy.S.  */
-  IFUNC_IMPL (i, name, mempcpy,
-	      IFUNC_IMPL_ADD (array, i, mempcpy, HAS_SSSE3,
-			      __mempcpy_ssse3_back)
-	      IFUNC_IMPL_ADD (array, i, mempcpy, HAS_SSSE3,
-			      __mempcpy_ssse3)
-	      IFUNC_IMPL_ADD (array, i, mempcpy, 1, __mempcpy_sse2))
-
-  /* Support sysdeps/x86_64/multiarch/strlen.S.  */
-  IFUNC_IMPL (i, name, strlen,
-	      IFUNC_IMPL_ADD (array, i, strlen, HAS_SSE4_2, __strlen_sse42)
-	      IFUNC_IMPL_ADD (array, i, strlen, 1, __strlen_sse2_pminub)
-	      IFUNC_IMPL_ADD (array, i, strlen, 1, __strlen_sse2_no_bsf)
-	      IFUNC_IMPL_ADD (array, i, strlen, 1, __strlen_sse2)
-	      IFUNC_IMPL_ADD (array, i, strlen, 1, __strlen_sse2))
-
-  /* Support sysdeps/x86_64/multiarch/strncmp.S.  */
-  IFUNC_IMPL (i, name, strncmp,
-	      IFUNC_IMPL_ADD (array, i, strncmp, HAS_SSE4_2,
-			      __strncmp_sse42)
-	      IFUNC_IMPL_ADD (array, i, strncmp, HAS_SSSE3,
-			      __strncmp_ssse3)
-	      IFUNC_IMPL_ADD (array, i, strncmp, 1, __strncmp_sse2))
-#endif
-
-  return i;
-}
diff --git a/sysdeps/x86_64/multiarch/memcmp.S b/sysdeps/x86_64/multiarch/memcmp.S
index a3f6a38..b2bc4d7 100644
--- a/sysdeps/x86_64/multiarch/memcmp.S
+++ b/sysdeps/x86_64/multiarch/memcmp.S
@@ -1,6 +1,5 @@
 /* Multiple versions of memcmp
-   All versions must be listed in ifunc-impl-list.c.
-   Copyright (C) 2010-2012 Free Software Foundation, Inc.
+   Copyright (C) 2010, 2011 Free Software Foundation, Inc.
    Contributed by Intel Corporation.
    This file is part of the GNU C Library.
 
@@ -49,8 +48,6 @@ 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 c7a193f..a77cdfb 100644
--- a/sysdeps/x86_64/multiarch/memcpy.S
+++ b/sysdeps/x86_64/multiarch/memcpy.S
@@ -1,6 +1,6 @@
 /* Multiple versions of memcpy
-   All versions must be listed in ifunc-impl-list.c.
-   Copyright (C) 2010-2012 Free Software Foundation, Inc.
+   Copyright (C) 2010, 2011
+   Free Software Foundation, Inc.
    Contributed by Intel Corporation.
    This file is part of the GNU C Library.
 
@@ -45,8 +45,6 @@ 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/memcpy_chk.S b/sysdeps/x86_64/multiarch/memcpy_chk.S
index 2283cf6..5d0059e 100644
--- a/sysdeps/x86_64/multiarch/memcpy_chk.S
+++ b/sysdeps/x86_64/multiarch/memcpy_chk.S
@@ -1,6 +1,5 @@
 /* Multiple versions of __memcpy_chk
-   All versions must be listed in ifunc-impl-list.c.
-   Copyright (C) 2010-2012 Free Software Foundation, Inc.
+   Copyright (C) 2010 Free Software Foundation, Inc.
    Contributed by Intel Corporation.
    This file is part of the GNU C Library.
 
diff --git a/sysdeps/x86_64/multiarch/memmove.c b/sysdeps/x86_64/multiarch/memmove.c
index af870d4..d6bdab4 100644
--- a/sysdeps/x86_64/multiarch/memmove.c
+++ b/sysdeps/x86_64/multiarch/memmove.c
@@ -1,5 +1,4 @@
 /* Multiple versions of memmove.
-   All versions must be listed in ifunc-impl-list.c.
    Copyright (C) 2010-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
diff --git a/sysdeps/x86_64/multiarch/memmove_chk.c b/sysdeps/x86_64/multiarch/memmove_chk.c
index da8160d..f1f99d9 100644
--- a/sysdeps/x86_64/multiarch/memmove_chk.c
+++ b/sysdeps/x86_64/multiarch/memmove_chk.c
@@ -1,6 +1,5 @@
 /* Multiple versions of __memmove_chk.
-   All versions must be listed in ifunc-impl-list.c.
-   Copyright (C) 2010-2012 Free Software Foundation, Inc.
+   Copyright (C) 2010 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
diff --git a/sysdeps/x86_64/multiarch/mempcpy.S b/sysdeps/x86_64/multiarch/mempcpy.S
index b5a5d6d..caa435b 100644
--- a/sysdeps/x86_64/multiarch/mempcpy.S
+++ b/sysdeps/x86_64/multiarch/mempcpy.S
@@ -1,6 +1,5 @@
 /* Multiple versions of mempcpy
-   All versions must be listed in ifunc-impl-list.c.
-   Copyright (C) 2010-2012 Free Software Foundation, Inc.
+   Copyright (C) 2010 Free Software Foundation, Inc.
    Contributed by Intel Corporation.
    This file is part of the GNU C Library.
 
@@ -44,8 +43,6 @@ 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/mempcpy_chk.S b/sysdeps/x86_64/multiarch/mempcpy_chk.S
index a3d3a59..604a721 100644
--- a/sysdeps/x86_64/multiarch/mempcpy_chk.S
+++ b/sysdeps/x86_64/multiarch/mempcpy_chk.S
@@ -1,6 +1,5 @@
 /* Multiple versions of __mempcpy_chk
-   All versions must be listed in ifunc-impl-list.c.
-   Copyright (C) 2010-2012 Free Software Foundation, Inc.
+   Copyright (C) 2010 Free Software Foundation, Inc.
    Contributed by Intel Corporation.
    This file is part of the GNU C Library.
 
diff --git a/sysdeps/x86_64/multiarch/memset.S b/sysdeps/x86_64/multiarch/memset.S
index f7c6a9f..1a7fa2d 100644
--- a/sysdeps/x86_64/multiarch/memset.S
+++ b/sysdeps/x86_64/multiarch/memset.S
@@ -1,6 +1,5 @@
 /* Multiple versions of memset
-   All versions must be listed in ifunc-impl-list.c.
-   Copyright (C) 2010-2012 Free Software Foundation, Inc.
+   Copyright (C) 2010 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
@@ -34,11 +33,6 @@ ENTRY(memset)
 2:	ret
 END(memset)
 
-/* Define internal IFUNC memset for bzero.  */
-	.globl __libc_memset
-	.hidden __libc_memset
-	__libc_memset = memset
-
 # define USE_SSE2 1
 
 # undef ENTRY
diff --git a/sysdeps/x86_64/multiarch/memset_chk.S b/sysdeps/x86_64/multiarch/memset_chk.S
index 5a10f17..47d8841 100644
--- a/sysdeps/x86_64/multiarch/memset_chk.S
+++ b/sysdeps/x86_64/multiarch/memset_chk.S
@@ -1,6 +1,5 @@
 /* Multiple versions of __memset_chk
-   All versions must be listed in ifunc-impl-list.c.
-   Copyright (C) 2010-2012 Free Software Foundation, Inc.
+   Copyright (C) 2010 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
diff --git a/sysdeps/x86_64/multiarch/rawmemchr.S b/sysdeps/x86_64/multiarch/rawmemchr.S
index be6ce84..c4157ad 100644
--- a/sysdeps/x86_64/multiarch/rawmemchr.S
+++ b/sysdeps/x86_64/multiarch/rawmemchr.S
@@ -1,6 +1,4 @@
-/* Multiple versions of rawmemchr
-   All versions must be listed in ifunc-impl-list.c.
-   Copyright (C) 2009-2012 Free Software Foundation, Inc.
+/* Copyright (C) 2009, 2011 Free Software Foundation, Inc.
    Contributed by Ulrich Drepper <drepper@redhat.com>.
    This file is part of the GNU C Library.
 
@@ -46,8 +44,6 @@ 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
@@ -85,8 +81,6 @@ __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/stpcpy.S b/sysdeps/x86_64/multiarch/stpcpy.S
index ee81ab6..b63d308 100644
--- a/sysdeps/x86_64/multiarch/stpcpy.S
+++ b/sysdeps/x86_64/multiarch/stpcpy.S
@@ -1,5 +1,3 @@
-/* Multiple versions of stpcpy
-   All versions must be listed in ifunc-impl-list.c.  */
 #define USE_AS_STPCPY
 #define STRCPY __stpcpy
 #include "strcpy.S"
diff --git a/sysdeps/x86_64/multiarch/stpncpy.S b/sysdeps/x86_64/multiarch/stpncpy.S
index 2698ca6..ff89a89 100644
--- a/sysdeps/x86_64/multiarch/stpncpy.S
+++ b/sysdeps/x86_64/multiarch/stpncpy.S
@@ -1,5 +1,3 @@
-/* Multiple versions of stpncpy
-   All versions must be listed in ifunc-impl-list.c.  */
 #define STRCPY __stpncpy
 #define USE_AS_STPCPY
 #define USE_AS_STRNCPY
diff --git a/sysdeps/x86_64/multiarch/strcasecmp_l.S b/sysdeps/x86_64/multiarch/strcasecmp_l.S
index 49f5b9f..5456b3a 100644
--- a/sysdeps/x86_64/multiarch/strcasecmp_l.S
+++ b/sysdeps/x86_64/multiarch/strcasecmp_l.S
@@ -1,5 +1,3 @@
-/* Multiple versions of strcasecmp and strcasecmp_l
-   All versions must be listed in ifunc-impl-list.c.  */
 #define STRCMP __strcasecmp_l
 #define USE_AS_STRCASECMP_L
 #include "strcmp.S"
diff --git a/sysdeps/x86_64/multiarch/strcasestr-c.c b/sysdeps/x86_64/multiarch/strcasestr-c.c
index c13a4c4..551492d 100644
--- a/sysdeps/x86_64/multiarch/strcasestr-c.c
+++ b/sysdeps/x86_64/multiarch/strcasestr-c.c
@@ -1,6 +1,3 @@
-/* Multiple versions of strcasestr
-   All versions must be listed in ifunc-impl-list.c.  */
-
 #include "init-arch.h"
 
 #define STRCASESTR __strcasestr_sse2
diff --git a/sysdeps/x86_64/multiarch/strcat.S b/sysdeps/x86_64/multiarch/strcat.S
index ec48668..0c256de 100644
--- a/sysdeps/x86_64/multiarch/strcat.S
+++ b/sysdeps/x86_64/multiarch/strcat.S
@@ -1,6 +1,5 @@
 /* Multiple versions of strcat
-   All versions must be listed in ifunc-impl-list.c.
-   Copyright (C) 2009-2012 Free Software Foundation, Inc.
+   Copyright (C) 2009, 2011 Free Software Foundation, Inc.
    Contributed by Intel Corporation.
    This file is part of the GNU C Library.
 
@@ -64,8 +63,6 @@ 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 5b589ba..b9f88e4 100644
--- a/sysdeps/x86_64/multiarch/strchr.S
+++ b/sysdeps/x86_64/multiarch/strchr.S
@@ -1,5 +1,5 @@
-/* Multiple versions of strchr
-   Copyright (C) 2009-2012 Free Software Foundation, Inc.
+/* strchr with SSE4.2
+   Copyright (C) 2009, 2010 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
@@ -82,8 +82,6 @@ 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
@@ -166,8 +164,6 @@ 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 e13b8ad..9d00bbc 100644
--- a/sysdeps/x86_64/multiarch/strcmp-sse42.S
+++ b/sysdeps/x86_64/multiarch/strcmp-sse42.S
@@ -1,5 +1,5 @@
 /* strcmp with SSE4.2
-   Copyright (C) 2009-2012 Free Software Foundation, Inc.
+   Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc.
    Contributed by Intel Corporation.
    This file is part of the GNU C Library.
 
@@ -48,8 +48,6 @@
 	.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 f64ff46..d366d09 100644
--- a/sysdeps/x86_64/multiarch/strcmp.S
+++ b/sysdeps/x86_64/multiarch/strcmp.S
@@ -1,4 +1,4 @@
-/* Multiple versions of strcmp
+/* strcmp with SSE4.2
    Copyright (C) 2009-2012 Free Software Foundation, Inc.
    Contributed by Intel Corporation.
    This file is part of the GNU C Library.
@@ -171,8 +171,6 @@ 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
@@ -183,8 +181,6 @@ 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) \
@@ -195,8 +191,6 @@ 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 082d03e..7be1b8b 100644
--- a/sysdeps/x86_64/multiarch/strcpy.S
+++ b/sysdeps/x86_64/multiarch/strcpy.S
@@ -1,6 +1,5 @@
 /* Multiple versions of strcpy
-   All versions must be listed in ifunc-impl-list.c.
-   Copyright (C) 2009-2012 Free Software Foundation, Inc.
+   Copyright (C) 2009, 2011 Free Software Foundation, Inc.
    Contributed by Intel Corporation.
    This file is part of the GNU C Library.
 
@@ -78,8 +77,6 @@ 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/strcspn.S b/sysdeps/x86_64/multiarch/strcspn.S
index 2d35ea6..715a1c4 100644
--- a/sysdeps/x86_64/multiarch/strcspn.S
+++ b/sysdeps/x86_64/multiarch/strcspn.S
@@ -1,6 +1,5 @@
 /* Multiple versions of strcspn
-   All versions must be listed in ifunc-impl-list.c.
-   Copyright (C) 2009-2012 Free Software Foundation, Inc.
+   Copyright (C) 2009 Free Software Foundation, Inc.
    Contributed by Intel Corporation.
    This file is part of the GNU C Library.
 
diff --git a/sysdeps/x86_64/multiarch/strlen.S b/sysdeps/x86_64/multiarch/strlen.S
index f93432e..0c46b4f 100644
--- a/sysdeps/x86_64/multiarch/strlen.S
+++ b/sysdeps/x86_64/multiarch/strlen.S
@@ -1,6 +1,5 @@
-/* Multiple versions of strlen(str) -- determine the length of the string STR.
-   All versions must be listed in ifunc-impl-list.c.
-   Copyright (C) 2009-2012 Free Software Foundation, Inc.
+/* strlen(str) -- determine the length of the string STR.
+   Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc.
    Contributed by Ulrich Drepper <drepper@redhat.com>.
    This file is part of the GNU C Library.
 
@@ -50,8 +49,6 @@ 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/strncase_l.S b/sysdeps/x86_64/multiarch/strncase_l.S
index 9c01497..c725cd8 100644
--- a/sysdeps/x86_64/multiarch/strncase_l.S
+++ b/sysdeps/x86_64/multiarch/strncase_l.S
@@ -1,5 +1,3 @@
-/* Multiple versions of strncasecmp and strncasecmp_l
-   All versions must be listed in ifunc-impl-list.c.  */
 #define STRCMP __strncasecmp_l
 #define USE_AS_STRNCASECMP_L
 #include "strcmp.S"
diff --git a/sysdeps/x86_64/multiarch/strncat.S b/sysdeps/x86_64/multiarch/strncat.S
index 5c1bf41..fd569c2 100644
--- a/sysdeps/x86_64/multiarch/strncat.S
+++ b/sysdeps/x86_64/multiarch/strncat.S
@@ -1,5 +1,3 @@
-/* Multiple versions of strncat
-   All versions must be listed in ifunc-impl-list.c.  */
 #define STRCAT strncat
 #define USE_AS_STRNCAT
 #include "strcat.S"
diff --git a/sysdeps/x86_64/multiarch/strncmp.S b/sysdeps/x86_64/multiarch/strncmp.S
index fd5eb13..0af34e7 100644
--- a/sysdeps/x86_64/multiarch/strncmp.S
+++ b/sysdeps/x86_64/multiarch/strncmp.S
@@ -1,5 +1,3 @@
-/* Multiple versions of strncmp
-   All versions must be listed in ifunc-impl-list.c.  */
 #define STRCMP strncmp
 #define USE_AS_STRNCMP
 #include "strcmp.S"
diff --git a/sysdeps/x86_64/multiarch/strncpy.S b/sysdeps/x86_64/multiarch/strncpy.S
index 6d87a0b..327a4ce 100644
--- a/sysdeps/x86_64/multiarch/strncpy.S
+++ b/sysdeps/x86_64/multiarch/strncpy.S
@@ -1,5 +1,3 @@
-/* Multiple versions of strncpy
-   All versions must be listed in ifunc-impl-list.c.  */
 #define STRCPY strncpy
 #define USE_AS_STRNCPY
 #include "strcpy.S"
diff --git a/sysdeps/x86_64/multiarch/strnlen.S b/sysdeps/x86_64/multiarch/strnlen.S
index 4df05fc..044b910 100644
--- a/sysdeps/x86_64/multiarch/strnlen.S
+++ b/sysdeps/x86_64/multiarch/strnlen.S
@@ -1,6 +1,5 @@
 /* multiple version of strnlen
-   All versions must be listed in ifunc-impl-list.c.
-   Copyright (C) 2011-2012 Free Software Foundation, Inc.
+   Copyright (C) 2011 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
@@ -41,8 +40,6 @@ 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/strpbrk.S b/sysdeps/x86_64/multiarch/strpbrk.S
index 7201d63..ed5bca6 100644
--- a/sysdeps/x86_64/multiarch/strpbrk.S
+++ b/sysdeps/x86_64/multiarch/strpbrk.S
@@ -1,5 +1,3 @@
-/* Multiple versions of strpbrk
-   All versions must be listed in ifunc-impl-list.c.  */
 #define STRCSPN strpbrk
 #define USE_AS_STRPBRK
 #include "strcspn.S"
diff --git a/sysdeps/x86_64/multiarch/strrchr.S b/sysdeps/x86_64/multiarch/strrchr.S
index 6e548e5..c87d8fa 100644
--- a/sysdeps/x86_64/multiarch/strrchr.S
+++ b/sysdeps/x86_64/multiarch/strrchr.S
@@ -1,6 +1,5 @@
-/* Multiple versions of strrchr
-   All versions must be listed in ifunc-impl-list.c.
-   Copyright (C) 2009-2012 Free Software Foundation, Inc.
+/* strrchr with SSE4.2
+   Copyright (C) 2009 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
@@ -88,8 +87,6 @@ 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
@@ -268,8 +265,6 @@ 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
diff --git a/sysdeps/x86_64/multiarch/strspn.S b/sysdeps/x86_64/multiarch/strspn.S
index b4ee900..2d72888 100644
--- a/sysdeps/x86_64/multiarch/strspn.S
+++ b/sysdeps/x86_64/multiarch/strspn.S
@@ -1,6 +1,5 @@
 /* Multiple versions of strspn
-   All versions must be listed in ifunc-impl-list.c.
-   Copyright (C) 2009-2012 Free Software Foundation, Inc.
+   Copyright (C) 2009 Free Software Foundation, Inc.
    Contributed by Intel Corporation.
    This file is part of the GNU C Library.
 
diff --git a/sysdeps/x86_64/multiarch/strstr-c.c b/sysdeps/x86_64/multiarch/strstr-c.c
index bb1f8c9..e05c5f1 100644
--- a/sysdeps/x86_64/multiarch/strstr-c.c
+++ b/sysdeps/x86_64/multiarch/strstr-c.c
@@ -1,5 +1,4 @@
 /* Multiple versions of strstr.
-   All versions must be listed in ifunc-impl-list.c.
    Copyright (C) 2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
diff --git a/sysdeps/x86_64/multiarch/wcscpy.S b/sysdeps/x86_64/multiarch/wcscpy.S
index 29261aa..194df00 100644
--- a/sysdeps/x86_64/multiarch/wcscpy.S
+++ b/sysdeps/x86_64/multiarch/wcscpy.S
@@ -1,6 +1,5 @@
 /* Multiple versions of wcscpy
-   All versions must be listed in ifunc-impl-list.c.
-   Copyright (C)  2011-2012 Free Software Foundation, Inc.
+   Copyright (C)  2011 Free Software Foundation, Inc.
    Contributed by Intel Corporation.
    This file is part of the GNU C Library.
 
diff --git a/sysdeps/x86_64/multiarch/wmemcmp.S b/sysdeps/x86_64/multiarch/wmemcmp.S
index 98a187d..1bb529f 100644
--- a/sysdeps/x86_64/multiarch/wmemcmp.S
+++ b/sysdeps/x86_64/multiarch/wmemcmp.S
@@ -1,6 +1,5 @@
 /* Multiple versions of wmemcmp
-   All versions must be listed in ifunc-impl-list.c.
-   Copyright (C)  2011-2012 Free Software Foundation, Inc.
+   Copyright (C)  2011 Free Software Foundation, Inc.
    Contributed by Intel Corporation.
    This file is part of the GNU C Library.
 

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