This is the mail archive of the
glibc-cvs@sourceware.org
mailing list for the glibc project.
GNU C Library master sources branch hjl/ifunc/test created. glibc-2.16-ports-merge-466-gbc8819c
- From: hjl at sourceware dot org
- To: glibc-cvs at sourceware dot org
- Date: 10 Oct 2012 15:00:31 -0000
- Subject: GNU C Library master sources branch hjl/ifunc/test created. glibc-2.16-ports-merge-466-gbc8819c
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".
The branch, hjl/ifunc/test has been created
at bc8819cc5a352f8b96af42325d1b7598c2794450 (commit)
- Log -----------------------------------------------------------------
http://sources.redhat.com/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=bc8819cc5a352f8b96af42325d1b7598c2794450
commit bc8819cc5a352f8b96af42325d1b7598c2794450
Author: H.J. Lu <hjl.tools@gmail.com>
Date: Wed Sep 26 07:33:06 2012 -0700
Add wcsmbs IFUNC tests
diff --git a/ChangeLog b/ChangeLog
index 7b89cf4..7ba9edd 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
2012-10-08 H.J. Lu <hongjiu.lu@intel.com>
+ * wcsmbs/Makefile (ifunc-tests): New macro.
+ (tests-ifunc): Likewise.
+ (tests): Add $(tests-ifunc).
+ * wcsmbs/test-wcschr-ifunc.c: New file.
+ * wcsmbs/test-wcscmp-ifunc.c: Likewise.
+ * wcsmbs/test-wcscpy-ifunc.c: Likewise.
+ * wcsmbs/test-wcslen-ifunc.c: Likewise.
+ * wcsmbs/test-wcsrchr-ifunc.c: Likewise.
+ * wcsmbs/test-wmemcmp-ifunc.c: Likewise.
+
* string/Makefile (ifunc-tests): New macro.
(tests-ifunc): Likewise.
(tests): Add $(tests-ifunc).
diff --git a/wcsmbs/Makefile b/wcsmbs/Makefile
index 7402ec9..b8e4e68 100644
--- a/wcsmbs/Makefile
+++ b/wcsmbs/Makefile
@@ -45,6 +45,9 @@ strop-tests := wcscmp wmemcmp wcslen wcschr wcsrchr wcscpy
tests := tst-wcstof wcsmbs-tst1 tst-wcsnlen tst-btowc tst-mbrtowc \
tst-wcrtomb tst-wcpncpy tst-mbsrtowcs tst-wchar-h tst-mbrtowc2 \
tst-c16c32-1 wcsatcliff $(addprefix test-,$(strop-tests))
+ifunc-tests = $(addprefix test-,$(strop-tests))
+tests-ifunc = $(addsuffix -ifunc,$(ifunc-tests))
+tests += $(tests-ifunc)
include ../Rules
diff --git a/wcsmbs/test-wcschr-ifunc.c b/wcsmbs/test-wcschr-ifunc.c
new file mode 100644
index 0000000..29fb77d
--- /dev/null
+++ b/wcsmbs/test-wcschr-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-wcschr.c"
diff --git a/wcsmbs/test-wcscmp-ifunc.c b/wcsmbs/test-wcscmp-ifunc.c
new file mode 100644
index 0000000..9384579
--- /dev/null
+++ b/wcsmbs/test-wcscmp-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-wcscmp.c"
diff --git a/wcsmbs/test-wcscpy-ifunc.c b/wcsmbs/test-wcscpy-ifunc.c
new file mode 100644
index 0000000..3b69ea2
--- /dev/null
+++ b/wcsmbs/test-wcscpy-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-wcscpy.c"
diff --git a/wcsmbs/test-wcslen-ifunc.c b/wcsmbs/test-wcslen-ifunc.c
new file mode 100644
index 0000000..49735c4
--- /dev/null
+++ b/wcsmbs/test-wcslen-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-wcslen.c"
diff --git a/wcsmbs/test-wcsrchr-ifunc.c b/wcsmbs/test-wcsrchr-ifunc.c
new file mode 100644
index 0000000..b02a2a2
--- /dev/null
+++ b/wcsmbs/test-wcsrchr-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-wcsrchr.c"
diff --git a/wcsmbs/test-wmemcmp-ifunc.c b/wcsmbs/test-wmemcmp-ifunc.c
new file mode 100644
index 0000000..b07341e
--- /dev/null
+++ b/wcsmbs/test-wmemcmp-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-wmemcmp.c"
http://sources.redhat.com/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=02169744ef5a9e5c3ce73c0b9f979838f15f600b
commit 02169744ef5a9e5c3ce73c0b9f979838f15f600b
Author: H.J. Lu <hjl.tools@gmail.com>
Date: Wed Sep 26 07:29:35 2012 -0700
Add string IFUNC tests
diff --git a/ChangeLog b/ChangeLog
index 8db08b2..7b89cf4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,64 @@
2012-10-08 H.J. Lu <hongjiu.lu@intel.com>
+ * string/Makefile (ifunc-tests): New macro.
+ (tests-ifunc): Likewise.
+ (tests): Add $(tests-ifunc).
+ * string/test-memccpy.c (TEST_NAME): New macro.
+ * string/test-memchr.c (TEST_NAME): Likewise.
+ * string/test-memcmp.c (TEST_NAME): Likewise.
+ * string/test-memcpy.c (TEST_NAME): Likewise.
+ * string/test-memmem.c (TEST_NAME): Likewise.
+ * string/test-memmove.c (TEST_NAME): Likewise.
+ * string/test-memset.c (TEST_NAME): Likewise.
+ * string/test-rawmemchr.c (TEST_NAME): Likewise.
+ * string/test-stpcpy.c (TEST_NAME): Likewise.
+ * string/test-stpncpy.c (TEST_NAME): Likewise.
+ * string/test-strcasecmp.c (TEST_NAME): Likewise.
+ * string/test-strcasestr.c (TEST_NAME): Likewise.
+ * string/test-strcat.c (TEST_NAME): Likewise.
+ * string/test-strchr.c (TEST_NAME): Likewise.
+ * string/test-strcmp.c(TEST_NAME): Likewise.
+ * string/test-strcpy.c (TEST_NAME): Likewise.
+ * string/test-strcspn.c (TEST_NAME): Likewise.
+ * string/test-strlen.c (TEST_NAME): Likewise.
+ * string/test-strncasecmp.c (TEST_NAME): Likewise.
+ * string/test-strncmp.c (TEST_NAME): Likewise.
+ * string/test-strncpy.c (TEST_NAME): Likewise.
+ * string/test-strnlen.c (TEST_NAME): Likewise.
+ * string/test-strpbrk.c (TEST_NAME): Likewise.
+ * string/test-strrchr.c (TEST_NAME): Likewise.
+ * string/test-strspn.c (TEST_NAME): Likewise.
+ * string/test-strstr.c (TEST_NAME): Likewise.
+ * string/test-memccpy-ifunc.c: New file.
+ * string/test-memchr-ifunc.c: Likewise.
+ * string/test-memcmp-ifunc.c: Likewise.
+ * string/test-memcpy-ifunc.c: Likewise.
+ * string/test-memmem-ifunc.c: Likewise.
+ * string/test-memmove-ifunc.c: Likewise.
+ * string/test-mempcpy-ifunc.c: Likewise.
+ * string/test-memset-ifunc.c: Likewise.
+ * string/test-rawmemchr-ifunc.c: Likewise.
+ * string/test-stpcpy-ifunc.c: Likewise.
+ * string/test-stpncpy-ifunc.c: Likewise.
+ * string/test-strcasecmp-ifunc.c: Likewise.
+ * string/test-strcasestr-ifunc.c: Likewise.
+ * string/test-strcat-ifunc.c: Likewise.
+ * string/test-strchr-ifunc.c: Likewise.
+ * string/test-strchrnul-ifunc.c: Likewise.
+ * string/test-strcmp-ifunc.c: Likewise.
+ * string/test-strcpy-ifunc.c: Likewise.
+ * string/test-strcspn-ifunc.c: Likewise.
+ * string/test-strlen-ifunc.c: Likewise.
+ * string/test-strncasecmp-ifunc.c: Likewise.
+ * string/test-strncat-ifunc.c: Likewise.
+ * string/test-strncmp-ifunc.c: Likewise.
+ * string/test-strncpy-ifunc.c: Likewise.
+ * string/test-strnlen-ifunc.c: Likewise.
+ * string/test-strpbrk-ifunc.c: Likewise.
+ * string/test-strrchr-ifunc.c: Likewise.
+ * string/test-strspn-ifunc.c: Likewise.
+ * string/test-strstr-ifunc.c: Likewise.
+
* debug/Makefile (ifunc-tests): New variable.
(tests-ifunc): Likewise.
* debug/test-stpcpy_chk.c (TEST_NAME): New macro.
diff --git a/string/Makefile b/string/Makefile
index 6f2c6c3..cf53009 100644
--- a/string/Makefile
+++ b/string/Makefile
@@ -58,6 +58,9 @@ tests := tester inl-tester noinl-tester testcopy test-ffs \
bug-envz1 tst-strxfrm2 tst-endian tst-svc2 \
tst-strtok_r
+ifunc-tests = $(addprefix test-,$(strop-tests))
+tests-ifunc = $(addsuffix -ifunc,$(ifunc-tests))
+tests += $(tests-ifunc)
include ../Rules
diff --git a/string/test-memccpy-ifunc.c b/string/test-memccpy-ifunc.c
new file mode 100644
index 0000000..4ae2d67
--- /dev/null
+++ b/string/test-memccpy-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-memccpy.c"
diff --git a/string/test-memccpy.c b/string/test-memccpy.c
index 8fa96bc..05940ee 100644
--- a/string/test-memccpy.c
+++ b/string/test-memccpy.c
@@ -1,5 +1,5 @@
/* Test and measure memccpy functions.
- Copyright (C) 1999, 2002, 2003, 2005 Free Software Foundation, Inc.
+ Copyright (C) 1999-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Written by Jakub Jelinek <jakub@redhat.com>, 1999.
@@ -18,6 +18,7 @@
<http://www.gnu.org/licenses/>. */
#define TEST_MAIN
+#define TEST_NAME "memccpy"
#include "test-string.h"
void *simple_memccpy (void *, const void *, int, size_t);
diff --git a/string/test-memchr-ifunc.c b/string/test-memchr-ifunc.c
new file mode 100644
index 0000000..4b9068b
--- /dev/null
+++ b/string/test-memchr-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-memchr.c"
diff --git a/string/test-memchr.c b/string/test-memchr.c
index 315726d..cad639b 100644
--- a/string/test-memchr.c
+++ b/string/test-memchr.c
@@ -1,5 +1,5 @@
/* Test and measure memchr functions.
- Copyright (C) 1999, 2002, 2003, 2005, 2009 Free Software Foundation, Inc.
+ Copyright (C) 1999-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Written by Jakub Jelinek <jakub@redhat.com>, 1999.
@@ -18,6 +18,7 @@
<http://www.gnu.org/licenses/>. */
#define TEST_MAIN
+#define TEST_NAME "memchr"
#include "test-string.h"
typedef char *(*proto_t) (const char *, int, size_t);
diff --git a/string/test-memcmp-ifunc.c b/string/test-memcmp-ifunc.c
new file mode 100644
index 0000000..de7d29c
--- /dev/null
+++ b/string/test-memcmp-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-memcmp.c"
diff --git a/string/test-memcmp.c b/string/test-memcmp.c
index 69076d0..fc9d4d2 100644
--- a/string/test-memcmp.c
+++ b/string/test-memcmp.c
@@ -19,6 +19,11 @@
<http://www.gnu.org/licenses/>. */
#define TEST_MAIN
+#ifdef WIDE
+# define TEST_NAME "wmemcmp"
+#else
+# define TEST_NAME "memcmp"
+#endif
#include "test-string.h"
#ifdef WIDE
# include <inttypes.h>
diff --git a/string/test-memcpy-ifunc.c b/string/test-memcpy-ifunc.c
new file mode 100644
index 0000000..36d70a0
--- /dev/null
+++ b/string/test-memcpy-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-memcpy.c"
diff --git a/string/test-memcpy.c b/string/test-memcpy.c
index 311b4b4..1340c75 100644
--- a/string/test-memcpy.c
+++ b/string/test-memcpy.c
@@ -1,5 +1,5 @@
/* Test and measure memcpy functions.
- Copyright (C) 1999, 2002, 2003, 2005 Free Software Foundation, Inc.
+ Copyright (C) 1999-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Written by Jakub Jelinek <jakub@redhat.com>, 1999.
@@ -21,6 +21,7 @@
# define MEMCPY_RESULT(dst, len) dst
# define MIN_PAGE_SIZE 131072
# define TEST_MAIN
+# define TEST_NAME "memcpy"
# include "test-string.h"
char *simple_memcpy (char *, const char *, size_t);
diff --git a/string/test-memmem-ifunc.c b/string/test-memmem-ifunc.c
new file mode 100644
index 0000000..ae87c13
--- /dev/null
+++ b/string/test-memmem-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-memmem.c"
diff --git a/string/test-memmem.c b/string/test-memmem.c
index 4076029..bfeaaa9 100644
--- a/string/test-memmem.c
+++ b/string/test-memmem.c
@@ -1,5 +1,5 @@
/* Test and measure memmem functions.
- Copyright (C) 2008 Free Software Foundation, Inc.
+ Copyright (C) 2008-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Written by Ulrich Drepper <drepper@redhat.com>, 2008.
@@ -18,6 +18,7 @@
<http://www.gnu.org/licenses/>. */
#define TEST_MAIN
+#define TEST_NAME "memmem"
#define BUF1PAGES 20
#define ITERATIONS 500
#include "test-string.h"
diff --git a/string/test-memmove-ifunc.c b/string/test-memmove-ifunc.c
new file mode 100644
index 0000000..0d8f836
--- /dev/null
+++ b/string/test-memmove-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-memmove.c"
diff --git a/string/test-memmove.c b/string/test-memmove.c
index 7d10712..f7e6777 100644
--- a/string/test-memmove.c
+++ b/string/test-memmove.c
@@ -1,5 +1,5 @@
/* Test and measure memmove functions.
- Copyright (C) 1999, 2002, 2003 Free Software Foundation, Inc.
+ Copyright (C) 1999-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Written by Jakub Jelinek <jakub@redhat.com>, 1999.
@@ -18,6 +18,7 @@
<http://www.gnu.org/licenses/>. */
#define TEST_MAIN
+#define TEST_NAME "memmove"
#include "test-string.h"
typedef char *(*proto_t) (char *, const char *, size_t);
diff --git a/string/test-mempcpy-ifunc.c b/string/test-mempcpy-ifunc.c
new file mode 100644
index 0000000..d5f5bd5
--- /dev/null
+++ b/string/test-mempcpy-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-mempcpy.c"
diff --git a/string/test-mempcpy.c b/string/test-mempcpy.c
index c021a66..1679e9d 100644
--- a/string/test-mempcpy.c
+++ b/string/test-mempcpy.c
@@ -1,5 +1,5 @@
/* Test and measure mempcpy functions.
- Copyright (C) 1999, 2002 Free Software Foundation, Inc.
+ Copyright (C) 1999-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Written by Jakub Jelinek <jakub@redhat.com>, 1999.
@@ -19,6 +19,7 @@
#define MEMCPY_RESULT(dst, len) (dst) + (len)
#define TEST_MAIN
+#define TEST_NAME "mempcpy"
#include "test-string.h"
char *simple_mempcpy (char *, const char *, size_t);
diff --git a/string/test-memset-ifunc.c b/string/test-memset-ifunc.c
new file mode 100644
index 0000000..bf19402
--- /dev/null
+++ b/string/test-memset-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-memset.c"
diff --git a/string/test-memset.c b/string/test-memset.c
index 839b8a1..5f60bc5 100644
--- a/string/test-memset.c
+++ b/string/test-memset.c
@@ -1,5 +1,5 @@
/* Test and measure memset functions.
- Copyright (C) 1999, 2002, 2003, 2005 Free Software Foundation, Inc.
+ Copyright (C) 1999-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Written by Jakub Jelinek <jakub@redhat.com>, 1999.
@@ -18,6 +18,7 @@
<http://www.gnu.org/licenses/>. */
#define TEST_MAIN
+#define TEST_NAME "memset"
#define MIN_PAGE_SIZE 131072
#include "test-string.h"
diff --git a/string/test-rawmemchr-ifunc.c b/string/test-rawmemchr-ifunc.c
new file mode 100644
index 0000000..91a30a0
--- /dev/null
+++ b/string/test-rawmemchr-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-rawmemchr.c"
diff --git a/string/test-rawmemchr.c b/string/test-rawmemchr.c
index c8000d6..a3f2c11 100644
--- a/string/test-rawmemchr.c
+++ b/string/test-rawmemchr.c
@@ -1,5 +1,5 @@
/* Test and measure memchr functions.
- Copyright (C) 1999,2002,2003,2005,2009,2011 Free Software Foundation, Inc.
+ Copyright (C) 1999-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Written by Jakub Jelinek <jakub@redhat.com>, 1999.
@@ -20,6 +20,7 @@
#include <assert.h>
#define TEST_MAIN
+#define TEST_NAME "rawmemchr"
#include "test-string.h"
typedef char *(*proto_t) (const char *, int);
diff --git a/string/test-stpcpy-ifunc.c b/string/test-stpcpy-ifunc.c
new file mode 100644
index 0000000..5968d23
--- /dev/null
+++ b/string/test-stpcpy-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-stpcpy.c"
diff --git a/string/test-stpcpy.c b/string/test-stpcpy.c
index accc05c..6a7af0c 100644
--- a/string/test-stpcpy.c
+++ b/string/test-stpcpy.c
@@ -1,5 +1,5 @@
/* Test and measure stpcpy functions.
- Copyright (C) 1999, 2002 Free Software Foundation, Inc.
+ Copyright (C) 1999-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Written by Jakub Jelinek <jakub@redhat.com>, 1999.
@@ -19,6 +19,7 @@
#define STRCPY_RESULT(dst, len) ((dst) + (len))
#define TEST_MAIN
+#define TEST_NAME "stpcpy"
#include "test-string.h"
char *simple_stpcpy (char *, const char *);
diff --git a/string/test-stpncpy-ifunc.c b/string/test-stpncpy-ifunc.c
new file mode 100644
index 0000000..4485c27
--- /dev/null
+++ b/string/test-stpncpy-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-stpncpy.c"
diff --git a/string/test-stpncpy.c b/string/test-stpncpy.c
index 8fb6d79..8647299 100644
--- a/string/test-stpncpy.c
+++ b/string/test-stpncpy.c
@@ -1,5 +1,5 @@
/* Test and measure stpncpy functions.
- Copyright (C) 1999, 2002 Free Software Foundation, Inc.
+ Copyright (C) 1999-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Written by Jakub Jelinek <jakub@redhat.com>, 1999.
@@ -19,6 +19,7 @@
#define STRNCPY_RESULT(dst, len, n) ((dst) + ((len) > (n) ? (n) : (len)))
#define TEST_MAIN
+#define TEST_NAME "stpncpy"
#include "test-string.h"
char *simple_stpncpy (char *, const char *, size_t);
diff --git a/string/test-strcasecmp-ifunc.c b/string/test-strcasecmp-ifunc.c
new file mode 100644
index 0000000..5ae7121
--- /dev/null
+++ b/string/test-strcasecmp-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-strcasecmp.c"
diff --git a/string/test-strcasecmp.c b/string/test-strcasecmp.c
index 039d9c1..202ac60 100644
--- a/string/test-strcasecmp.c
+++ b/string/test-strcasecmp.c
@@ -1,5 +1,5 @@
/* Test and measure strcasecmp functions.
- Copyright (C) 1999, 2002, 2003, 2005, 2010 Free Software Foundation, Inc.
+ Copyright (C) 1999-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Written by Jakub Jelinek <jakub@redhat.com>, 1999.
@@ -19,6 +19,7 @@
#include <ctype.h>
#define TEST_MAIN
+#define TEST_NAME "strcasecmp"
#include "test-string.h"
typedef int (*proto_t) (const char *, const char *);
diff --git a/string/test-strcasestr-ifunc.c b/string/test-strcasestr-ifunc.c
new file mode 100644
index 0000000..07475b1
--- /dev/null
+++ b/string/test-strcasestr-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-strcasestr.c"
diff --git a/string/test-strcasestr.c b/string/test-strcasestr.c
index fc01858..9a0f30c 100644
--- a/string/test-strcasestr.c
+++ b/string/test-strcasestr.c
@@ -1,5 +1,5 @@
/* Test and measure strcasestr functions.
- Copyright (C) 2010 Free Software Foundation, Inc.
+ Copyright (C) 2010-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Written by Ulrich Drepper <drepper@redhat.com>, 2010.
@@ -18,6 +18,7 @@
<http://www.gnu.org/licenses/>. */
#define TEST_MAIN
+#define TEST_NAME "strcasestr"
#include "test-string.h"
diff --git a/string/test-strcat-ifunc.c b/string/test-strcat-ifunc.c
new file mode 100644
index 0000000..9a157cd
--- /dev/null
+++ b/string/test-strcat-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-strcat.c"
diff --git a/string/test-strcat.c b/string/test-strcat.c
index 7dcd7bc..2d90d52 100644
--- a/string/test-strcat.c
+++ b/string/test-strcat.c
@@ -1,5 +1,5 @@
/* Test and measure strcat functions.
- Copyright (C) 1999, 2002, 2003, 2005 Free Software Foundation, Inc.
+ Copyright (C) 1999-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Written by Jakub Jelinek <jakub@redhat.com>, 1999.
@@ -18,6 +18,7 @@
<http://www.gnu.org/licenses/>. */
#define TEST_MAIN
+#define TEST_NAME "strcat"
#include "test-string.h"
typedef char *(*proto_t) (char *, const char *);
diff --git a/string/test-strchr-ifunc.c b/string/test-strchr-ifunc.c
new file mode 100644
index 0000000..6e85e18
--- /dev/null
+++ b/string/test-strchr-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-strchr.c"
diff --git a/string/test-strchr.c b/string/test-strchr.c
index 161ac45..1ed6966 100644
--- a/string/test-strchr.c
+++ b/string/test-strchr.c
@@ -1,5 +1,5 @@
/* Test and measure STRCHR functions.
- Copyright (C) 1999, 2002, 2003, 2011 Free Software Foundation, Inc.
+ Copyright (C) 1999-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Written by Jakub Jelinek <jakub@redhat.com>, 1999.
Added wcschr support by Liubov Dmitrieva <liubov.dmitrieva@gmail.com>, 2011
@@ -19,6 +19,15 @@
<http://www.gnu.org/licenses/>. */
#define TEST_MAIN
+#ifndef WIDE
+# ifdef USE_FOR_STRCHRNUL
+# define TEST_NAME "strchrnul"
+# else
+# define TEST_NAME "strchr"
+# endif
+#else
+# define TEST_NAME "wcschr"
+#endif
#include "test-string.h"
#ifndef WIDE
diff --git a/string/test-strchrnul-ifunc.c b/string/test-strchrnul-ifunc.c
new file mode 100644
index 0000000..eb8854f
--- /dev/null
+++ b/string/test-strchrnul-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-strchrnul.c"
diff --git a/string/test-strcmp-ifunc.c b/string/test-strcmp-ifunc.c
new file mode 100644
index 0000000..ea2795f
--- /dev/null
+++ b/string/test-strcmp-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-strcmp.c"
diff --git a/string/test-strcmp.c b/string/test-strcmp.c
index 000c510..f186fd6 100644
--- a/string/test-strcmp.c
+++ b/string/test-strcmp.c
@@ -19,6 +19,11 @@
<http://www.gnu.org/licenses/>. */
#define TEST_MAIN
+#ifdef WIDE
+# define TEST_NAME "wcscmp"
+#else
+# define TEST_NAME "strcmp"
+#endif
#include "test-string.h"
#ifdef WIDE
diff --git a/string/test-strcpy-ifunc.c b/string/test-strcpy-ifunc.c
new file mode 100644
index 0000000..127580f
--- /dev/null
+++ b/string/test-strcpy-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-strcpy.c"
diff --git a/string/test-strcpy.c b/string/test-strcpy.c
index 3a0b118..de57c68 100644
--- a/string/test-strcpy.c
+++ b/string/test-strcpy.c
@@ -1,5 +1,5 @@
/* Test and measure strcpy functions.
- Copyright (C) 1999, 2002, 2003, 2005, 2011, 2012 Free Software Foundation, Inc.
+ Copyright (C) 1999-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Written by Jakub Jelinek <jakub@redhat.com>, 1999.
Added wcscpy support by Liubov Dmitrieva <liubov.dmitrieva@gmail.com>, 2011
@@ -42,6 +42,11 @@
#ifndef STRCPY_RESULT
# define STRCPY_RESULT(dst, len) dst
# define TEST_MAIN
+# ifndef WIDE
+# define TEST_NAME "strcpy"
+# else
+# define TEST_NAME "wcscpy"
+# endif
# include "test-string.h"
# ifndef WIDE
# define SIMPLE_STRCPY simple_strcpy
diff --git a/string/test-strcspn-ifunc.c b/string/test-strcspn-ifunc.c
new file mode 100644
index 0000000..5541516
--- /dev/null
+++ b/string/test-strcspn-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-strcspn.c"
diff --git a/string/test-strcspn.c b/string/test-strcspn.c
index d80947a..e2863c7 100644
--- a/string/test-strcspn.c
+++ b/string/test-strcspn.c
@@ -1,5 +1,5 @@
/* Test and measure strcspn functions.
- Copyright (C) 1999, 2002 Free Software Foundation, Inc.
+ Copyright (C) 1999-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Written by Jakub Jelinek <jakub@redhat.com>, 1999.
@@ -20,6 +20,7 @@
#define STRPBRK_RESULT(s, pos) (pos)
#define RES_TYPE size_t
#define TEST_MAIN
+#define TEST_NAME "strcspn"
#include "test-string.h"
typedef size_t (*proto_t) (const char *, const char *);
diff --git a/string/test-strlen-ifunc.c b/string/test-strlen-ifunc.c
new file mode 100644
index 0000000..c879fe8
--- /dev/null
+++ b/string/test-strlen-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-strlen.c"
diff --git a/string/test-strlen.c b/string/test-strlen.c
index 0ac5184..6be7e43 100644
--- a/string/test-strlen.c
+++ b/string/test-strlen.c
@@ -1,5 +1,5 @@
/* Test and measure STRLEN functions.
- Copyright (C) 1999, 2002, 2003, 2005, 2011 Free Software Foundation, Inc.
+ Copyright (C) 1999-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Written by Jakub Jelinek <jakub@redhat.com>, 1999.
Added wcslen support by Liubov Dmitrieva <liubov.dmitrieva@gmail.com>, 2011
@@ -19,6 +19,11 @@
<http://www.gnu.org/licenses/>. */
#define TEST_MAIN
+#ifndef WIDE
+# define TEST_NAME "strlen"
+#else
+# define TEST_NAME "wcslen"
+#endif
#include "test-string.h"
#ifndef WIDE
diff --git a/string/test-strncasecmp-ifunc.c b/string/test-strncasecmp-ifunc.c
new file mode 100644
index 0000000..05824fe
--- /dev/null
+++ b/string/test-strncasecmp-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-strncasecmp.c"
diff --git a/string/test-strncasecmp.c b/string/test-strncasecmp.c
index acfe668..95664f3 100644
--- a/string/test-strncasecmp.c
+++ b/string/test-strncasecmp.c
@@ -19,6 +19,7 @@
#include <ctype.h>
#define TEST_MAIN
+#define TEST_NAME "strncasecmp"
#include "test-string.h"
typedef int (*proto_t) (const char *, const char *, size_t);
diff --git a/string/test-strncat-ifunc.c b/string/test-strncat-ifunc.c
new file mode 100644
index 0000000..61b2c87
--- /dev/null
+++ b/string/test-strncat-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-strncat.c"
diff --git a/string/test-strncat.c b/string/test-strncat.c
index 69c8c0b..0cdaa4f 100644
--- a/string/test-strncat.c
+++ b/string/test-strncat.c
@@ -1,5 +1,5 @@
/* Test and measure strncat functions.
- Copyright (C) 2011 Free Software Foundation, Inc.
+ Copyright (C) 2011-2012 Free Software Foundation, Inc.
Contributed by Intel Corporation.
The GNU C Library is free software; you can redistribute it and/or
@@ -17,6 +17,7 @@
<http://www.gnu.org/licenses/>. */
#define TEST_MAIN
+#define TEST_NAME "strncat"
#include "test-string.h"
typedef char *(*proto_t) (char *, const char *, size_t);
diff --git a/string/test-strncmp-ifunc.c b/string/test-strncmp-ifunc.c
new file mode 100644
index 0000000..a1f14a4
--- /dev/null
+++ b/string/test-strncmp-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-strncmp.c"
diff --git a/string/test-strncmp.c b/string/test-strncmp.c
index 266781b..a66a125 100644
--- a/string/test-strncmp.c
+++ b/string/test-strncmp.c
@@ -1,5 +1,5 @@
/* Test and measure strncmp functions.
- Copyright (C) 1999, 2002, 2003, 2010, 2011 Free Software Foundation, Inc.
+ Copyright (C) 1999-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Written by Jakub Jelinek <jakub@redhat.com>, 1999.
@@ -18,6 +18,7 @@
<http://www.gnu.org/licenses/>. */
#define TEST_MAIN
+#define TEST_NAME "strncmp"
#include "test-string.h"
typedef int (*proto_t) (const char *, const char *, size_t);
diff --git a/string/test-strncpy-ifunc.c b/string/test-strncpy-ifunc.c
new file mode 100644
index 0000000..ed3f04f
--- /dev/null
+++ b/string/test-strncpy-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-strncpy.c"
diff --git a/string/test-strncpy.c b/string/test-strncpy.c
index f683f7d..ba1050f 100644
--- a/string/test-strncpy.c
+++ b/string/test-strncpy.c
@@ -1,5 +1,5 @@
/* Test and measure strncpy functions.
- Copyright (C) 1999, 2002, 2003, 2005 Free Software Foundation, Inc.
+ Copyright (C) 1999-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Written by Jakub Jelinek <jakub@redhat.com>, 1999.
@@ -20,6 +20,7 @@
#ifndef STRNCPY_RESULT
# define STRNCPY_RESULT(dst, len, n) dst
# define TEST_MAIN
+# define TEST_NAME "strncpy"
# include "test-string.h"
char *simple_strncpy (char *, const char *, size_t);
diff --git a/string/test-strnlen-ifunc.c b/string/test-strnlen-ifunc.c
new file mode 100644
index 0000000..8615091
--- /dev/null
+++ b/string/test-strnlen-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-strnlen.c"
diff --git a/string/test-strnlen.c b/string/test-strnlen.c
index 547df45..17a2e22 100644
--- a/string/test-strnlen.c
+++ b/string/test-strnlen.c
@@ -1,5 +1,5 @@
/* Test and measure strlen functions.
- Copyright (C) 1999, 2002, 2003, 2005, 2010 Free Software Foundation, Inc.
+ Copyright (C) 1999-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Written by Jakub Jelinek <jakub@redhat.com>, 1999.
@@ -18,6 +18,7 @@
<http://www.gnu.org/licenses/>. */
#define TEST_MAIN
+#define TEST_NAME "strnlen"
#include "test-string.h"
typedef size_t (*proto_t) (const char *, size_t);
diff --git a/string/test-strpbrk-ifunc.c b/string/test-strpbrk-ifunc.c
new file mode 100644
index 0000000..e904c98
--- /dev/null
+++ b/string/test-strpbrk-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-strpbrk.c"
diff --git a/string/test-strpbrk.c b/string/test-strpbrk.c
index 263a7fd..8a3d2bb 100644
--- a/string/test-strpbrk.c
+++ b/string/test-strpbrk.c
@@ -1,5 +1,5 @@
/* Test and measure strpbrk functions.
- Copyright (C) 1999, 2002, 2003, 2005 Free Software Foundation, Inc.
+ Copyright (C) 1999-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Written by Jakub Jelinek <jakub@redhat.com>, 1999.
@@ -21,6 +21,7 @@
# define STRPBRK_RESULT(s, pos) ((s)[(pos)] ? (s) + (pos) : NULL)
# define RES_TYPE char *
# define TEST_MAIN
+# define TEST_NAME "strpbrk"
# include "test-string.h"
typedef char *(*proto_t) (const char *, const char *);
diff --git a/string/test-strrchr-ifunc.c b/string/test-strrchr-ifunc.c
new file mode 100644
index 0000000..31d1c6b
--- /dev/null
+++ b/string/test-strrchr-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-strrchr.c"
diff --git a/string/test-strrchr.c b/string/test-strrchr.c
index c63c8de..a58435f 100644
--- a/string/test-strrchr.c
+++ b/string/test-strrchr.c
@@ -1,5 +1,5 @@
/* Test and measure STRCHR functions.
- Copyright (C) 1999, 2002, 2003, 2005, 2011 Free Software Foundation, Inc.
+ Copyright (C) 1999-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Written by Jakub Jelinek <jakub@redhat.com>, 1999.
Added wcsrrchr support by Liubov Dmitrieva <liubov.dmitrieva@gmail.com>,
@@ -20,6 +20,11 @@
<http://www.gnu.org/licenses/>. */
#define TEST_MAIN
+#ifdef WIDE
+# define TEST_NAME "wcsrchr"
+#else
+# define TEST_NAME "strrchr"
+#endif
#include "test-string.h"
#ifdef WIDE
diff --git a/string/test-strspn-ifunc.c b/string/test-strspn-ifunc.c
new file mode 100644
index 0000000..67054f8
--- /dev/null
+++ b/string/test-strspn-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-strspn.c"
diff --git a/string/test-strspn.c b/string/test-strspn.c
index 743bc0a..557db0a 100644
--- a/string/test-strspn.c
+++ b/string/test-strspn.c
@@ -1,5 +1,5 @@
/* Test and measure strspn functions.
- Copyright (C) 1999,2002,2003,2005 Free Software Foundation, Inc.
+ Copyright (C) 1999-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Written by Jakub Jelinek <jakub@redhat.com>, 1999.
@@ -18,6 +18,7 @@
<http://www.gnu.org/licenses/>. */
#define TEST_MAIN
+#define TEST_NAME "strspn"
#include "test-string.h"
typedef size_t (*proto_t) (const char *, const char *);
diff --git a/string/test-strstr-ifunc.c b/string/test-strstr-ifunc.c
new file mode 100644
index 0000000..559646a
--- /dev/null
+++ b/string/test-strstr-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-strstr.c"
diff --git a/string/test-strstr.c b/string/test-strstr.c
index d4c0efc..22a00f9 100644
--- a/string/test-strstr.c
+++ b/string/test-strstr.c
@@ -1,5 +1,5 @@
/* Test and measure strstr functions.
- Copyright (C) 2010 Free Software Foundation, Inc.
+ Copyright (C) 2010-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Written by Ulrich Drepper <drepper@redhat.com>, 2010.
@@ -18,6 +18,7 @@
<http://www.gnu.org/licenses/>. */
#define TEST_MAIN
+#define TEST_NAME "strstr"
#include "test-string.h"
http://sources.redhat.com/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=6d2166def785a51f34495860efd9717f2e9bbad5
commit 6d2166def785a51f34495860efd9717f2e9bbad5
Author: H.J. Lu <hjl.tools@gmail.com>
Date: Wed Oct 10 06:29:20 2012 -0700
Add debug IFUNC tests
diff --git a/ChangeLog b/ChangeLog
index be37384..8db08b2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
2012-10-08 H.J. Lu <hongjiu.lu@intel.com>
+ * debug/Makefile (ifunc-tests): New variable.
+ (tests-ifunc): Likewise.
+ * debug/test-stpcpy_chk.c (TEST_NAME): New macro.
+ * debug/test-strcpy_chk.c (TEST_NAME): Likewise.
+ * debug/test-stpcpy_chk-ifunc.c: New file.
+ * debug/test-strcpy_chk-ifunc.c: Likewise.
+
* sysdeps/x86_64/multiarch/ifunc-impl-list.c: New file.
* sysdeps/x86_64/multiarch/memcmp.S (__memcmp_sse2): Make it
global and hidden.
diff --git a/debug/Makefile b/debug/Makefile
index ae5b674..426989b 100644
--- a/debug/Makefile
+++ b/debug/Makefile
@@ -126,6 +126,10 @@ tests = backtrace-tst tst-longjmp_chk tst-chk1 tst-chk2 tst-chk3 \
tst-chk4 tst-chk5 tst-chk6 tst-lfschk4 tst-lfschk5 tst-lfschk6 \
tst-longjmp_chk2
+ifunc-tests = test-stpcpy_chk test-strcpy_chk
+tests-ifunc = $(addsuffix -ifunc,$(ifunc-tests))
+tests += $(tests-ifunc)
+
extra-libs = libSegFault libpcprofile
extra-libs-others = $(extra-libs)
diff --git a/debug/test-stpcpy_chk-ifunc.c b/debug/test-stpcpy_chk-ifunc.c
new file mode 100644
index 0000000..cf86bc1
--- /dev/null
+++ b/debug/test-stpcpy_chk-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-stpcpy_chk.c"
diff --git a/debug/test-stpcpy_chk.c b/debug/test-stpcpy_chk.c
index f7f9a54..8e2d2d9 100644
--- a/debug/test-stpcpy_chk.c
+++ b/debug/test-stpcpy_chk.c
@@ -1,5 +1,5 @@
/* Test and measure stpcpy checking functions.
- Copyright (C) 1999, 2002, 2004 Free Software Foundation, Inc.
+ Copyright (C) 1999-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Written by Jakub Jelinek <jakub@redhat.com>, 1999.
@@ -19,6 +19,7 @@
#define STRCPY_RESULT(dst, len) ((dst) + (len))
#define TEST_MAIN
+#define TEST_NAME "stpcpy_chk"
#include "../string/test-string.h"
extern void __attribute__ ((noreturn)) __chk_fail (void);
diff --git a/debug/test-strcpy_chk-ifunc.c b/debug/test-strcpy_chk-ifunc.c
new file mode 100644
index 0000000..fff7234
--- /dev/null
+++ b/debug/test-strcpy_chk-ifunc.c
@@ -0,0 +1,2 @@
+#define TEST_IFUNC 1
+#include "test-strcpy_chk.c"
diff --git a/debug/test-strcpy_chk.c b/debug/test-strcpy_chk.c
index 2536362..fb9bc78 100644
--- a/debug/test-strcpy_chk.c
+++ b/debug/test-strcpy_chk.c
@@ -1,5 +1,5 @@
/* Test and measure __strcpy_chk functions.
- Copyright (C) 1999, 2002, 2003, 2004 Free Software Foundation, Inc.
+ Copyright (C) 1999-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Written by Jakub Jelinek <jakub@redhat.com>, 1999.
@@ -20,6 +20,7 @@
#ifndef STRCPY_RESULT
# define STRCPY_RESULT(dst, len) dst
# define TEST_MAIN
+# define TEST_NAME "strcpy_chk"
# include "../string/test-string.h"
extern void __attribute__ ((noreturn)) __chk_fail (void);
http://sources.redhat.com/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=028409644ce45a2fb7f5656aa4aa9b8793d57425
commit 028409644ce45a2fb7f5656aa4aa9b8793d57425
Author: H.J. Lu <hjl.tools@gmail.com>
Date: Wed Oct 10 07:49:12 2012 -0700
Add x86-64 __libc_ifunc_impl_list
diff --git a/ChangeLog b/ChangeLog
index 2146f84..be37384 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,58 @@
2012-10-08 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.
diff --git a/sysdeps/x86_64/multiarch/ifunc-impl-list.c b/sysdeps/x86_64/multiarch/ifunc-impl-list.c
new file mode 100644
index 0000000..332a60d
--- /dev/null
+++ b/sysdeps/x86_64/multiarch/ifunc-impl-list.c
@@ -0,0 +1,283 @@
+/* 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 b2bc4d7..a3f6a38 100644
--- a/sysdeps/x86_64/multiarch/memcmp.S
+++ b/sysdeps/x86_64/multiarch/memcmp.S
@@ -1,5 +1,6 @@
/* Multiple versions of memcmp
- Copyright (C) 2010, 2011 Free Software Foundation, Inc.
+ 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.
@@ -48,6 +49,8 @@ END(memcmp)
# define ENTRY(name) \
.type __memcmp_sse2, @function; \
.p2align 4; \
+ .globl __memcmp_sse2; \
+ .hidden __memcmp_sse2; \
__memcmp_sse2: cfi_startproc; \
CALL_MCOUNT
# undef END
diff --git a/sysdeps/x86_64/multiarch/memcpy.S b/sysdeps/x86_64/multiarch/memcpy.S
index a77cdfb..c7a193f 100644
--- a/sysdeps/x86_64/multiarch/memcpy.S
+++ b/sysdeps/x86_64/multiarch/memcpy.S
@@ -1,6 +1,6 @@
/* Multiple versions of memcpy
- Copyright (C) 2010, 2011
- Free Software Foundation, Inc.
+ 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.
@@ -45,6 +45,8 @@ END(__new_memcpy)
# undef ENTRY
# define ENTRY(name) \
.type __memcpy_sse2, @function; \
+ .globl __memcpy_sse2; \
+ .hidden __memcpy_sse2; \
.p2align 4; \
__memcpy_sse2: cfi_startproc; \
CALL_MCOUNT
diff --git a/sysdeps/x86_64/multiarch/memcpy_chk.S b/sysdeps/x86_64/multiarch/memcpy_chk.S
index 5d0059e..2283cf6 100644
--- a/sysdeps/x86_64/multiarch/memcpy_chk.S
+++ b/sysdeps/x86_64/multiarch/memcpy_chk.S
@@ -1,5 +1,6 @@
/* Multiple versions of __memcpy_chk
- Copyright (C) 2010 Free Software Foundation, Inc.
+ 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/x86_64/multiarch/memmove.c b/sysdeps/x86_64/multiarch/memmove.c
index d6bdab4..af870d4 100644
--- a/sysdeps/x86_64/multiarch/memmove.c
+++ b/sysdeps/x86_64/multiarch/memmove.c
@@ -1,4 +1,5 @@
/* 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 f1f99d9..da8160d 100644
--- a/sysdeps/x86_64/multiarch/memmove_chk.c
+++ b/sysdeps/x86_64/multiarch/memmove_chk.c
@@ -1,5 +1,6 @@
/* Multiple versions of __memmove_chk.
- Copyright (C) 2010 Free Software Foundation, Inc.
+ 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.
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 caa435b..b5a5d6d 100644
--- a/sysdeps/x86_64/multiarch/mempcpy.S
+++ b/sysdeps/x86_64/multiarch/mempcpy.S
@@ -1,5 +1,6 @@
/* Multiple versions of mempcpy
- Copyright (C) 2010 Free Software Foundation, Inc.
+ 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.
@@ -43,6 +44,8 @@ END(__mempcpy)
# define ENTRY(name) \
.type __mempcpy_sse2, @function; \
.p2align 4; \
+ .globl __mempcpy_sse2; \
+ .hidden __mempcpy_sse2; \
__mempcpy_sse2: cfi_startproc; \
CALL_MCOUNT
# undef END
diff --git a/sysdeps/x86_64/multiarch/mempcpy_chk.S b/sysdeps/x86_64/multiarch/mempcpy_chk.S
index 604a721..a3d3a59 100644
--- a/sysdeps/x86_64/multiarch/mempcpy_chk.S
+++ b/sysdeps/x86_64/multiarch/mempcpy_chk.S
@@ -1,5 +1,6 @@
/* Multiple versions of __mempcpy_chk
- Copyright (C) 2010 Free Software Foundation, Inc.
+ 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/x86_64/multiarch/memset.S b/sysdeps/x86_64/multiarch/memset.S
index 1a7fa2d..2dfb2ff 100644
--- a/sysdeps/x86_64/multiarch/memset.S
+++ b/sysdeps/x86_64/multiarch/memset.S
@@ -1,5 +1,6 @@
/* Multiple versions of memset
- Copyright (C) 2010 Free Software Foundation, Inc.
+ 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.
The GNU C Library is free software; you can redistribute it and/or
diff --git a/sysdeps/x86_64/multiarch/memset_chk.S b/sysdeps/x86_64/multiarch/memset_chk.S
index 47d8841..5a10f17 100644
--- a/sysdeps/x86_64/multiarch/memset_chk.S
+++ b/sysdeps/x86_64/multiarch/memset_chk.S
@@ -1,5 +1,6 @@
/* Multiple versions of __memset_chk
- Copyright (C) 2010 Free Software Foundation, Inc.
+ 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.
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 c4157ad..be6ce84 100644
--- a/sysdeps/x86_64/multiarch/rawmemchr.S
+++ b/sysdeps/x86_64/multiarch/rawmemchr.S
@@ -1,4 +1,6 @@
-/* Copyright (C) 2009, 2011 Free Software Foundation, Inc.
+/* Multiple versions of rawmemchr
+ All versions must be listed in ifunc-impl-list.c.
+ Copyright (C) 2009-2012 Free Software Foundation, Inc.
Contributed by Ulrich Drepper <drepper@redhat.com>.
This file is part of the GNU C Library.
@@ -44,6 +46,8 @@ strong_alias (rawmemchr, __rawmemchr)
.section .text.sse4.2,"ax",@progbits
.align 16
.type __rawmemchr_sse42, @function
+ .globl __rawmemchr_sse42
+ .hidden __rawmemchr_sse42
__rawmemchr_sse42:
cfi_startproc
CALL_MCOUNT
@@ -81,6 +85,8 @@ __rawmemchr_sse42:
# define ENTRY(name) \
.type __rawmemchr_sse2, @function; \
.align 16; \
+ .globl __rawmemchr_sse2; \
+ .hidden __rawmemchr_sse2; \
__rawmemchr_sse2: cfi_startproc; \
CALL_MCOUNT
# undef END
diff --git a/sysdeps/x86_64/multiarch/stpcpy.S b/sysdeps/x86_64/multiarch/stpcpy.S
index b63d308..ee81ab6 100644
--- a/sysdeps/x86_64/multiarch/stpcpy.S
+++ b/sysdeps/x86_64/multiarch/stpcpy.S
@@ -1,3 +1,5 @@
+/* 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 ff89a89..2698ca6 100644
--- a/sysdeps/x86_64/multiarch/stpncpy.S
+++ b/sysdeps/x86_64/multiarch/stpncpy.S
@@ -1,3 +1,5 @@
+/* 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 5456b3a..49f5b9f 100644
--- a/sysdeps/x86_64/multiarch/strcasecmp_l.S
+++ b/sysdeps/x86_64/multiarch/strcasecmp_l.S
@@ -1,3 +1,5 @@
+/* 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 551492d..c13a4c4 100644
--- a/sysdeps/x86_64/multiarch/strcasestr-c.c
+++ b/sysdeps/x86_64/multiarch/strcasestr-c.c
@@ -1,3 +1,6 @@
+/* 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 0c256de..ec48668 100644
--- a/sysdeps/x86_64/multiarch/strcat.S
+++ b/sysdeps/x86_64/multiarch/strcat.S
@@ -1,5 +1,6 @@
/* Multiple versions of strcat
- Copyright (C) 2009, 2011 Free Software Foundation, Inc.
+ 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.
@@ -63,6 +64,8 @@ END(STRCAT)
# define ENTRY(name) \
.type STRCAT_SSE2, @function; \
.align 16; \
+ .globl STRCAT_SSE2; \
+ .hidden STRCAT_SSE2; \
STRCAT_SSE2: cfi_startproc; \
CALL_MCOUNT
# undef END
diff --git a/sysdeps/x86_64/multiarch/strchr.S b/sysdeps/x86_64/multiarch/strchr.S
index b9f88e4..5b589ba 100644
--- a/sysdeps/x86_64/multiarch/strchr.S
+++ b/sysdeps/x86_64/multiarch/strchr.S
@@ -1,5 +1,5 @@
-/* strchr with SSE4.2
- Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+/* Multiple versions of strchr
+ Copyright (C) 2009-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
@@ -82,6 +82,8 @@ END(strchr)
.section .text.sse4.2,"ax",@progbits
.align 16
.type __strchr_sse42, @function
+ .globl __strchr_sse42
+ .hidden __strchr_sse42
__strchr_sse42:
cfi_startproc
CALL_MCOUNT
@@ -164,6 +166,8 @@ L(loop_exit):
# define ENTRY(name) \
.type __strchr_sse2, @function; \
.align 16; \
+ .globl __strchr_sse2; \
+ .hidden __strchr_sse2; \
__strchr_sse2: cfi_startproc; \
CALL_MCOUNT
# undef END
diff --git a/sysdeps/x86_64/multiarch/strcmp-sse42.S b/sysdeps/x86_64/multiarch/strcmp-sse42.S
index 9d00bbc..e13b8ad 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, 2010, 2011 Free Software Foundation, Inc.
+ Copyright (C) 2009-2012 Free Software Foundation, Inc.
Contributed by Intel Corporation.
This file is part of the GNU C Library.
@@ -48,6 +48,8 @@
.section .text.SECTION,"ax",@progbits
.align 16
.type STRCMP_SSE42, @function
+ .globl STRCMP_SSE42
+ .hidden STRCMP_SSE42
#ifdef USE_AS_STRCASECMP_L
ENTRY (GLABEL(__strcasecmp))
movq __libc_tsd_LOCALE@gottpoff(%rip),%rax
diff --git a/sysdeps/x86_64/multiarch/strcmp.S b/sysdeps/x86_64/multiarch/strcmp.S
index d366d09..f64ff46 100644
--- a/sysdeps/x86_64/multiarch/strcmp.S
+++ b/sysdeps/x86_64/multiarch/strcmp.S
@@ -1,4 +1,4 @@
-/* strcmp with SSE4.2
+/* Multiple versions of strcmp
Copyright (C) 2009-2012 Free Software Foundation, Inc.
Contributed by Intel Corporation.
This file is part of the GNU C Library.
@@ -171,6 +171,8 @@ weak_alias (__strncasecmp, strncasecmp)
# define ENTRY(name) \
.type STRCMP_SSE2, @function; \
.align 16; \
+ .globl STRCMP_SSE2; \
+ .hidden STRCMP_SSE2; \
STRCMP_SSE2: cfi_startproc; \
CALL_MCOUNT
# undef END
@@ -181,6 +183,8 @@ weak_alias (__strncasecmp, strncasecmp)
# define ENTRY2(name) \
.type __strcasecmp_sse2, @function; \
.align 16; \
+ .globl __strcasecmp_sse2; \
+ .hidden __strcasecmp_sse2; \
__strcasecmp_sse2: cfi_startproc; \
CALL_MCOUNT
# define END2(name) \
@@ -191,6 +195,8 @@ weak_alias (__strncasecmp, strncasecmp)
# define ENTRY2(name) \
.type __strncasecmp_sse2, @function; \
.align 16; \
+ .globl __strncasecmp_sse2; \
+ .hidden __strncasecmp_sse2; \
__strncasecmp_sse2: cfi_startproc; \
CALL_MCOUNT
# define END2(name) \
diff --git a/sysdeps/x86_64/multiarch/strcpy.S b/sysdeps/x86_64/multiarch/strcpy.S
index 7be1b8b..082d03e 100644
--- a/sysdeps/x86_64/multiarch/strcpy.S
+++ b/sysdeps/x86_64/multiarch/strcpy.S
@@ -1,5 +1,6 @@
/* Multiple versions of strcpy
- Copyright (C) 2009, 2011 Free Software Foundation, Inc.
+ 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.
@@ -77,6 +78,8 @@ END(STRCPY)
# define ENTRY(name) \
.type STRCPY_SSE2, @function; \
.align 16; \
+ .globl STRCPY_SSE2; \
+ .hidden STRCPY_SSE2; \
STRCPY_SSE2: cfi_startproc; \
CALL_MCOUNT
# undef END
diff --git a/sysdeps/x86_64/multiarch/strcspn.S b/sysdeps/x86_64/multiarch/strcspn.S
index 715a1c4..2d35ea6 100644
--- a/sysdeps/x86_64/multiarch/strcspn.S
+++ b/sysdeps/x86_64/multiarch/strcspn.S
@@ -1,5 +1,6 @@
/* Multiple versions of strcspn
- Copyright (C) 2009 Free Software Foundation, Inc.
+ 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/x86_64/multiarch/strlen.S b/sysdeps/x86_64/multiarch/strlen.S
index 0c46b4f..f93432e 100644
--- a/sysdeps/x86_64/multiarch/strlen.S
+++ b/sysdeps/x86_64/multiarch/strlen.S
@@ -1,5 +1,6 @@
-/* strlen(str) -- determine the length of the string STR.
- Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc.
+/* 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.
Contributed by Ulrich Drepper <drepper@redhat.com>.
This file is part of the GNU C Library.
@@ -49,6 +50,8 @@ END(strlen)
# define ENTRY(name) \
.type __strlen_sse2, @function; \
.align 16; \
+ .globl __strlen_sse2; \
+ .hidden __strlen_sse2; \
__strlen_sse2: cfi_startproc; \
CALL_MCOUNT
# undef END
diff --git a/sysdeps/x86_64/multiarch/strncase_l.S b/sysdeps/x86_64/multiarch/strncase_l.S
index c725cd8..9c01497 100644
--- a/sysdeps/x86_64/multiarch/strncase_l.S
+++ b/sysdeps/x86_64/multiarch/strncase_l.S
@@ -1,3 +1,5 @@
+/* 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 fd569c2..5c1bf41 100644
--- a/sysdeps/x86_64/multiarch/strncat.S
+++ b/sysdeps/x86_64/multiarch/strncat.S
@@ -1,3 +1,5 @@
+/* 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 0af34e7..fd5eb13 100644
--- a/sysdeps/x86_64/multiarch/strncmp.S
+++ b/sysdeps/x86_64/multiarch/strncmp.S
@@ -1,3 +1,5 @@
+/* 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 327a4ce..6d87a0b 100644
--- a/sysdeps/x86_64/multiarch/strncpy.S
+++ b/sysdeps/x86_64/multiarch/strncpy.S
@@ -1,3 +1,5 @@
+/* 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 044b910..4df05fc 100644
--- a/sysdeps/x86_64/multiarch/strnlen.S
+++ b/sysdeps/x86_64/multiarch/strnlen.S
@@ -1,5 +1,6 @@
/* multiple version of strnlen
- Copyright (C) 2011 Free Software Foundation, Inc.
+ 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.
The GNU C Library is free software; you can redistribute it and/or
@@ -40,6 +41,8 @@ END(__strnlen)
# define ENTRY(name) \
.type __strnlen_sse2, @function; \
.align 16; \
+ .globl __strnlen_sse2; \
+ .hidden __strnlen_sse2; \
__strnlen_sse2: cfi_startproc; \
CALL_MCOUNT
# undef END
diff --git a/sysdeps/x86_64/multiarch/strpbrk.S b/sysdeps/x86_64/multiarch/strpbrk.S
index ed5bca6..7201d63 100644
--- a/sysdeps/x86_64/multiarch/strpbrk.S
+++ b/sysdeps/x86_64/multiarch/strpbrk.S
@@ -1,3 +1,5 @@
+/* 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 c87d8fa..6e548e5 100644
--- a/sysdeps/x86_64/multiarch/strrchr.S
+++ b/sysdeps/x86_64/multiarch/strrchr.S
@@ -1,5 +1,6 @@
-/* strrchr with SSE4.2
- Copyright (C) 2009 Free Software Foundation, Inc.
+/* Multiple versions of strrchr
+ All versions must be listed in ifunc-impl-list.c.
+ Copyright (C) 2009-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
@@ -87,6 +88,8 @@ END(strrchr)
.section .text.sse4.2,"ax",@progbits
.align 16
.type __strrchr_sse42, @function
+ .globl __strrchr_sse42
+ .hidden __strrchr_sse42
__strrchr_sse42:
cfi_startproc
CALL_MCOUNT
@@ -265,6 +268,8 @@ L(psrldq_table):
# define ENTRY(name) \
.type __strrchr_sse2, @function; \
.align 16; \
+ .globl __strrchr_sse2; \
+ .hidden __strrchr_sse2; \
__strrchr_sse2: cfi_startproc; \
CALL_MCOUNT
# undef END
diff --git a/sysdeps/x86_64/multiarch/strspn.S b/sysdeps/x86_64/multiarch/strspn.S
index 2d72888..b4ee900 100644
--- a/sysdeps/x86_64/multiarch/strspn.S
+++ b/sysdeps/x86_64/multiarch/strspn.S
@@ -1,5 +1,6 @@
/* Multiple versions of strspn
- Copyright (C) 2009 Free Software Foundation, Inc.
+ 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/x86_64/multiarch/strstr-c.c b/sysdeps/x86_64/multiarch/strstr-c.c
index e05c5f1..bb1f8c9 100644
--- a/sysdeps/x86_64/multiarch/strstr-c.c
+++ b/sysdeps/x86_64/multiarch/strstr-c.c
@@ -1,4 +1,5 @@
/* 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 194df00..29261aa 100644
--- a/sysdeps/x86_64/multiarch/wcscpy.S
+++ b/sysdeps/x86_64/multiarch/wcscpy.S
@@ -1,5 +1,6 @@
/* Multiple versions of wcscpy
- Copyright (C) 2011 Free Software Foundation, Inc.
+ 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/x86_64/multiarch/wmemcmp.S b/sysdeps/x86_64/multiarch/wmemcmp.S
index 1bb529f..98a187d 100644
--- a/sysdeps/x86_64/multiarch/wmemcmp.S
+++ b/sysdeps/x86_64/multiarch/wmemcmp.S
@@ -1,5 +1,6 @@
/* Multiple versions of wmemcmp
- Copyright (C) 2011 Free Software Foundation, Inc.
+ 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.
http://sources.redhat.com/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=f9e144f67a4eaee4e91dcb6774b013814060b68e
commit f9e144f67a4eaee4e91dcb6774b013814060b68e
Author: H.J. Lu <hjl.tools@gmail.com>
Date: Wed Oct 10 07:48:45 2012 -0700
Add i686 __libc_ifunc_impl_list
diff --git a/ChangeLog b/ChangeLog
index 4487004..2146f84 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,61 @@
2012-10-08 H.J. Lu <hongjiu.lu@intel.com>
+ * sysdeps/i386/i686/multiarch/bcopy.S (__bcopy_ia32): Make it
+ global and hidden.
+ * sysdeps/i386/i686/multiarch/bzero.S (__bzero_ia32): Likewise.
+ * sysdeps/i386/i686/multiarch/memcmp.S (__memcmp_ia32): Likewise.
+ * sysdeps/i386/i686/multiarch/memcpy.S (__memcpy_ia32): Likewise.
+ * sysdeps/i386/i686/multiarch/memmove.S (__memmove_ia32):
+ Likewise.
+ * sysdeps/i386/i686/multiarch/mempcpy.S (__mempcpy_ia32):
+ Likewise.
+ * sysdeps/i386/i686/multiarch/strcat.S (STRCAT_IA32): Likewise.
+ * sysdeps/i386/i686/multiarch/strcmp.S (__STRCMP_IA32): Likewise.
+ * sysdeps/i386/i686/multiarch/strcpy.S (STRCPY_IA32): Likewise.
+ * sysdeps/i386/i686/multiarch/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.
diff --git a/sysdeps/i386/i686/multiarch/bcopy.S b/sysdeps/i386/i686/multiarch/bcopy.S
index 9db3424..b0744da 100644
--- a/sysdeps/i386/i686/multiarch/bcopy.S
+++ b/sysdeps/i386/i686/multiarch/bcopy.S
@@ -1,4 +1,5 @@
/* 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.
@@ -67,6 +68,8 @@ END(bcopy)
# define ENTRY(name) \
.type __bcopy_ia32, @function; \
.p2align 4; \
+ .globl __bcopy_ia32; \
+ .hidden __bcopy_ia32; \
__bcopy_ia32: cfi_startproc; \
CALL_MCOUNT
# undef END
diff --git a/sysdeps/i386/i686/multiarch/bzero.S b/sysdeps/i386/i686/multiarch/bzero.S
index 86db169..150c24c 100644
--- a/sysdeps/i386/i686/multiarch/bzero.S
+++ b/sysdeps/i386/i686/multiarch/bzero.S
@@ -1,4 +1,5 @@
/* 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.
@@ -67,6 +68,8 @@ END(__bzero)
# define ENTRY(name) \
.type __bzero_ia32, @function; \
.p2align 4; \
+ .globl __bzero_ia32; \
+ .hidden __bzero_ia32; \
__bzero_ia32: cfi_startproc; \
CALL_MCOUNT
# undef END
diff --git a/sysdeps/i386/i686/multiarch/ifunc-impl-list.c b/sysdeps/i386/i686/multiarch/ifunc-impl-list.c
new file mode 100644
index 0000000..005c286
--- /dev/null
+++ b/sysdeps/i386/i686/multiarch/ifunc-impl-list.c
@@ -0,0 +1,326 @@
+/* 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 2cf4542..8b0344b 100644
--- a/sysdeps/i386/i686/multiarch/memchr.S
+++ b/sysdeps/i386/i686/multiarch/memchr.S
@@ -1,4 +1,5 @@
/* 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 d8076b9..7b9c1c4 100644
--- a/sysdeps/i386/i686/multiarch/memcmp.S
+++ b/sysdeps/i386/i686/multiarch/memcmp.S
@@ -1,4 +1,5 @@
/* 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.
@@ -67,6 +68,8 @@ END(memcmp)
# define ENTRY(name) \
.type __memcmp_ia32, @function; \
.p2align 4; \
+ .globl __memcmp_ia32; \
+ .hidden __memcmp_ia32; \
__memcmp_ia32: cfi_startproc; \
CALL_MCOUNT
# undef END
diff --git a/sysdeps/i386/i686/multiarch/memcpy.S b/sysdeps/i386/i686/multiarch/memcpy.S
index 558c04f..0d4a101 100644
--- a/sysdeps/i386/i686/multiarch/memcpy.S
+++ b/sysdeps/i386/i686/multiarch/memcpy.S
@@ -1,4 +1,5 @@
/* 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.
@@ -51,6 +52,8 @@ END(memcpy)
# define ENTRY(name) \
.type __memcpy_ia32, @function; \
.p2align 4; \
+ .globl __memcpy_ia32; \
+ .hidden __memcpy_ia32; \
__memcpy_ia32: cfi_startproc; \
CALL_MCOUNT
# undef END
diff --git a/sysdeps/i386/i686/multiarch/memcpy_chk.S b/sysdeps/i386/i686/multiarch/memcpy_chk.S
index 40deada..d9d7e1f 100644
--- a/sysdeps/i386/i686/multiarch/memcpy_chk.S
+++ b/sysdeps/i386/i686/multiarch/memcpy_chk.S
@@ -1,4 +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.
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 b8892c0..b692f47 100644
--- a/sysdeps/i386/i686/multiarch/memmove.S
+++ b/sysdeps/i386/i686/multiarch/memmove.S
@@ -1,4 +1,5 @@
/* 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.
@@ -50,6 +51,8 @@ END(memmove)
# define ENTRY(name) \
.type __memmove_ia32, @function; \
.p2align 4; \
+ .globl __memmove_ia32; \
+ .hidden __memmove_ia32; \
__memmove_ia32: cfi_startproc; \
CALL_MCOUNT
# else
diff --git a/sysdeps/i386/i686/multiarch/memmove_chk.S b/sysdeps/i386/i686/multiarch/memmove_chk.S
index 8139cd9..20dc3e3 100644
--- a/sysdeps/i386/i686/multiarch/memmove_chk.S
+++ b/sysdeps/i386/i686/multiarch/memmove_chk.S
@@ -1,4 +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.
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 95bda46..500e6e7 100644
--- a/sysdeps/i386/i686/multiarch/mempcpy.S
+++ b/sysdeps/i386/i686/multiarch/mempcpy.S
@@ -1,4 +1,5 @@
/* 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.
@@ -51,6 +52,8 @@ END(__mempcpy)
# define ENTRY(name) \
.type __mempcpy_ia32, @function; \
.p2align 4; \
+ .globl __mempcpy_ia32; \
+ .hidden __mempcpy_ia32; \
__mempcpy_ia32: cfi_startproc; \
CALL_MCOUNT
# undef END
diff --git a/sysdeps/i386/i686/multiarch/mempcpy_chk.S b/sysdeps/i386/i686/multiarch/mempcpy_chk.S
index e491f94..12f3453 100644
--- a/sysdeps/i386/i686/multiarch/mempcpy_chk.S
+++ b/sysdeps/i386/i686/multiarch/mempcpy_chk.S
@@ -1,4 +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.
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 762489d..f94862b 100644
--- a/sysdeps/i386/i686/multiarch/memrchr.S
+++ b/sysdeps/i386/i686/multiarch/memrchr.S
@@ -1,4 +1,5 @@
/* 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 8878340..65745d4 100644
--- a/sysdeps/i386/i686/multiarch/memset.S
+++ b/sysdeps/i386/i686/multiarch/memset.S
@@ -1,4 +1,5 @@
/* 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 02649df..d499b8c 100644
--- a/sysdeps/i386/i686/multiarch/memset_chk.S
+++ b/sysdeps/i386/i686/multiarch/memset_chk.S
@@ -1,4 +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.
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 5bea20b..f2af368 100644
--- a/sysdeps/i386/i686/multiarch/rawmemchr.S
+++ b/sysdeps/i386/i686/multiarch/rawmemchr.S
@@ -1,4 +1,5 @@
/* 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 b63d308..ee81ab6 100644
--- a/sysdeps/i386/i686/multiarch/stpcpy.S
+++ b/sysdeps/i386/i686/multiarch/stpcpy.S
@@ -1,3 +1,5 @@
+/* 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 ff89a89..2698ca6 100644
--- a/sysdeps/i386/i686/multiarch/stpncpy.S
+++ b/sysdeps/i386/i686/multiarch/stpncpy.S
@@ -1,3 +1,5 @@
+/* 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 fbd2de3..cf83e6e 100644
--- a/sysdeps/i386/i686/multiarch/strcasecmp.S
+++ b/sysdeps/i386/i686/multiarch/strcasecmp.S
@@ -1,4 +1,5 @@
/* 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 1322bd8..711c09b 100644
--- a/sysdeps/i386/i686/multiarch/strcasecmp_l.S
+++ b/sysdeps/i386/i686/multiarch/strcasecmp_l.S
@@ -1,3 +1,5 @@
+/* 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 0d52b0e..c1d6dac 100644
--- a/sysdeps/i386/i686/multiarch/strcasestr-c.c
+++ b/sysdeps/i386/i686/multiarch/strcasestr-c.c
@@ -1,2 +1,4 @@
+/* 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 e68feca..a7d3224 100644
--- a/sysdeps/i386/i686/multiarch/strcat.S
+++ b/sysdeps/i386/i686/multiarch/strcat.S
@@ -1,4 +1,5 @@
/* 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.
@@ -94,6 +95,8 @@ END(STRCAT)
# define ENTRY(name) \
.type STRCAT_IA32, @function; \
.align 16; \
+ .globl STRCAT_IA32; \
+ .hidden STRCAT_IA32; \
STRCAT_IA32: cfi_startproc; \
CALL_MCOUNT
# undef END
diff --git a/sysdeps/i386/i686/multiarch/strchr.S b/sysdeps/i386/i686/multiarch/strchr.S
index e236d60..c6205da 100644
--- a/sysdeps/i386/i686/multiarch/strchr.S
+++ b/sysdeps/i386/i686/multiarch/strchr.S
@@ -1,4 +1,5 @@
/* 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 b3b9eb8..76ac1f8 100644
--- a/sysdeps/i386/i686/multiarch/strcmp.S
+++ b/sysdeps/i386/i686/multiarch/strcmp.S
@@ -1,4 +1,5 @@
/* 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.
@@ -95,6 +96,8 @@ END(STRCMP)
# define ENTRY(name) \
.type __STRCMP_IA32, @function; \
.p2align 4; \
+ .globl __STRCMP_IA32; \
+ .hidden __STRCMP_IA32; \
__STRCMP_IA32: cfi_startproc; \
CALL_MCOUNT
# undef END
diff --git a/sysdeps/i386/i686/multiarch/strcpy.S b/sysdeps/i386/i686/multiarch/strcpy.S
index 71eee76..44fa6d2 100644
--- a/sysdeps/i386/i686/multiarch/strcpy.S
+++ b/sysdeps/i386/i686/multiarch/strcpy.S
@@ -1,4 +1,5 @@
/* 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.
@@ -110,6 +111,8 @@ END(STRCPY)
# define ENTRY(name) \
.type STRCPY_IA32, @function; \
.align 16; \
+ .globl STRCPY_IA32; \
+ .hidden STRCPY_IA32; \
STRCPY_IA32: cfi_startproc; \
CALL_MCOUNT
# undef END
diff --git a/sysdeps/i386/i686/multiarch/strcspn.S b/sysdeps/i386/i686/multiarch/strcspn.S
index 8a00a02..8495430 100644
--- a/sysdeps/i386/i686/multiarch/strcspn.S
+++ b/sysdeps/i386/i686/multiarch/strcspn.S
@@ -1,4 +1,5 @@
/* 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 310765c..c1d8b6c 100644
--- a/sysdeps/i386/i686/multiarch/strlen.S
+++ b/sysdeps/i386/i686/multiarch/strlen.S
@@ -1,4 +1,5 @@
/* 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 37fccb8..ca5f863 100644
--- a/sysdeps/i386/i686/multiarch/strncase.S
+++ b/sysdeps/i386/i686/multiarch/strncase.S
@@ -1,4 +1,5 @@
/* 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 a808c8c..8a74ee8 100644
--- a/sysdeps/i386/i686/multiarch/strncase_l.S
+++ b/sysdeps/i386/i686/multiarch/strncase_l.S
@@ -1,3 +1,5 @@
+/* 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 fd569c2..5c1bf41 100644
--- a/sysdeps/i386/i686/multiarch/strncat.S
+++ b/sysdeps/i386/i686/multiarch/strncat.S
@@ -1,3 +1,5 @@
+/* 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 b681431..150d478 100644
--- a/sysdeps/i386/i686/multiarch/strncmp.S
+++ b/sysdeps/i386/i686/multiarch/strncmp.S
@@ -1,3 +1,5 @@
+/* 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 30a5bd2..9c257ef 100644
--- a/sysdeps/i386/i686/multiarch/strncpy.S
+++ b/sysdeps/i386/i686/multiarch/strncpy.S
@@ -1,3 +1,5 @@
+/* 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 44ad0b3..b82052e 100644
--- a/sysdeps/i386/i686/multiarch/strnlen.S
+++ b/sysdeps/i386/i686/multiarch/strnlen.S
@@ -1,4 +1,5 @@
/* 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 ed5bca6..7201d63 100644
--- a/sysdeps/i386/i686/multiarch/strpbrk.S
+++ b/sysdeps/i386/i686/multiarch/strpbrk.S
@@ -1,3 +1,5 @@
+/* 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 f851b77..37468f1 100644
--- a/sysdeps/i386/i686/multiarch/strrchr.S
+++ b/sysdeps/i386/i686/multiarch/strrchr.S
@@ -1,4 +1,5 @@
/* 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 8170f9c..f90df63 100644
--- a/sysdeps/i386/i686/multiarch/strspn.S
+++ b/sysdeps/i386/i686/multiarch/strspn.S
@@ -1,4 +1,5 @@
/* 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 17c75c5..7516c7f 100644
--- a/sysdeps/i386/i686/multiarch/strstr-c.c
+++ b/sysdeps/i386/i686/multiarch/strstr-c.c
@@ -1,3 +1,6 @@
+/* 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 34ea47d..03fe3ca 100644
--- a/sysdeps/i386/i686/multiarch/wcschr.S
+++ b/sysdeps/i386/i686/multiarch/wcschr.S
@@ -1,4 +1,5 @@
/* 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 d458476..e23ba05 100644
--- a/sysdeps/i386/i686/multiarch/wcscmp.S
+++ b/sysdeps/i386/i686/multiarch/wcscmp.S
@@ -1,4 +1,5 @@
/* 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 8c3ba1d..6eea48a 100644
--- a/sysdeps/i386/i686/multiarch/wcscpy.S
+++ b/sysdeps/i386/i686/multiarch/wcscpy.S
@@ -1,4 +1,5 @@
/* 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 f8b2fab..cdae516 100644
--- a/sysdeps/i386/i686/multiarch/wcslen.S
+++ b/sysdeps/i386/i686/multiarch/wcslen.S
@@ -1,4 +1,5 @@
/* 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 ec550b0..f4b0618 100644
--- a/sysdeps/i386/i686/multiarch/wcsrchr.S
+++ b/sysdeps/i386/i686/multiarch/wcsrchr.S
@@ -1,4 +1,5 @@
/* 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 61d55cd..7c485f7 100644
--- a/sysdeps/i386/i686/multiarch/wmemcmp.S
+++ b/sysdeps/i386/i686/multiarch/wmemcmp.S
@@ -1,4 +1,5 @@
/* 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.
http://sources.redhat.com/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=8f169788e67b69f85e0c7e7eaa67bfc8929d991f
commit 8f169788e67b69f85e0c7e7eaa67bfc8929d991f
Author: H.J. Lu <hjl.tools@gmail.com>
Date: Wed Oct 10 07:47:59 2012 -0700
Framework to test IFUNC implementations on target
diff --git a/ChangeLog b/ChangeLog
index b106e0e..4487004 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+2012-10-08 H.J. Lu <hongjiu.lu@intel.com>
+
+ * 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): __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.
+
2012-10-10 Alexandre Oliva <aoliva@redhat.com>
* NEWS: Add note about FIPS mode. Wording suggested by Roland
diff --git a/Rules b/Rules
index 17d938e..5e33610 100644
--- a/Rules
+++ b/Rules
@@ -84,6 +84,11 @@ common-generated += dummy.o dummy.c
# This makes all the auxiliary and test programs.
.PHONY: others tests
+ifeq ($(multi-arch),no)
+tests := $(filter-out $(tests-ifunc), $(tests))
+xtests := $(filter-out $(xtests-ifunc), $(xtests))
+endif
+
ifeq ($(build-programs),yes)
others: $(addprefix $(objpfx),$(others) $(sysdep-others) $(extra-objs))
else
diff --git a/include/ifunc-impl-list.h b/include/ifunc-impl-list.h
new file mode 100644
index 0000000..36444d3
--- /dev/null
+++ b/include/ifunc-impl-list.h
@@ -0,0 +1,56 @@
+/* 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 e5e9b9f..ea68d26 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
+ removexattr setxattr getauxval ifunc-impl-list
generated := tst-error1.mtrace tst-error1-mem
diff --git a/misc/Versions b/misc/Versions
index b2a9147..64632f0 100644
--- a/misc/Versions
+++ b/misc/Versions
@@ -151,5 +151,6 @@ libc {
}
GLIBC_PRIVATE {
__madvise;
+ __libc_ifunc_impl_list;
}
}
diff --git a/misc/ifunc-impl-list.c b/misc/ifunc-impl-list.c
new file mode 100644
index 0000000..c4b460d
--- /dev/null
+++ b/misc/ifunc-impl-list.c
@@ -0,0 +1,32 @@
+/* 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/test-string.h b/string/test-string.h
index c94d822..5da11fb 100644
--- a/string/test-string.h
+++ b/string/test-string.h
@@ -50,6 +50,7 @@ extern impl_t __start_impls[], __stop_impls[];
#include <error.h>
#include <errno.h>
#include <time.h>
+#include <ifunc-impl-list.h>
#define GL(x) _##x
#define GLRO(x) _##x
#include <hp-timing.h>
@@ -106,9 +107,57 @@ size_t iterations = 100000;
#define CALL(impl, ...) \
(* (proto_t) (impl)->fn) (__VA_ARGS__)
-#define FOR_EACH_IMPL(impl, notall) \
+#if defined TEST_IFUNC && defined TEST_NAME
+/* Increase size of FUNC_LIST if assert is triggered at run-time. */
+static struct libc_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) \
for (impl_t *impl = __start_impls; impl < __stop_impls; ++impl) \
if (!notall || impl->test)
+#endif
#define HP_TIMING_BEST(best_time, start, end) \
do \
@@ -127,6 +176,13 @@ size_t iterations = 100000;
static void
test_init (void)
{
+#if defined TEST_IFUNC && defined TEST_NAME
+# define SIZEOF_ARRAY(array) (sizeof array / sizeof array[0])
+ 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)
-----------------------------------------------------------------------
hooks/post-receive
--
GNU C Library master sources