d8307d
commit 914a4e05572e108201d71dcd3e47da8aeeecd70d
d8307d
Author: Stefan Liebler <stli@linux.ibm.com>
d8307d
Date:   Tue Dec 18 13:57:10 2018 +0100
d8307d
d8307d
    S390: Refactor strcpy ifunc handling.
d8307d
    
d8307d
    The ifunc handling for strcpy is adjusted in order to omit ifunc
d8307d
    variants if those will never be used as the minimum architecture level
d8307d
    already supports newer CPUs by default.
d8307d
    Glibc internal calls will then also use the "newer" ifunc variant.
d8307d
    
d8307d
    Note: The fallback s390-32/s390-64 ifunc variants with mvst instruction
d8307d
    are now moved to the unified strcpy-z900.S file which can be used for
d8307d
    31/64bit. The s390-32/s390-64 files multiarch/strcpy.c and strcpy.S
d8307d
    are deleted.
d8307d
    
d8307d
    ChangeLog:
d8307d
    
d8307d
            * sysdeps/s390/multiarch/Makefile
d8307d
            (sysdep_routines): Remove strcpy variants.
d8307d
            * sysdeps/s390/Makefile (sysdep_routines): Add strcpy variants.
d8307d
            * sysdeps/s390/multiarch/ifunc-impl-list.c
d8307d
            (__libc_ifunc_impl_list): Refactor ifunc handling for strcpy.
d8307d
            * sysdeps/s390/multiarch/strcpy-vx.S: Move to ...
d8307d
            * sysdeps/s390/strcpy-vx.S: ... here and adjust ifunc handling.
d8307d
            * sysdeps/s390/multiarch/strcpy.c: Move to ...
d8307d
            * sysdeps/s390/strcpy.c: ... here and adjust ifunc handling.
d8307d
            * sysdeps/s390/ifunc-strcpy.h: New file.
d8307d
            * sysdeps/s390/s390-64/strcpy.S: Move to ...
d8307d
            * sysdeps/s390/strcpy-z900.S: ... here and adjust to be usable
d8307d
            for 31/64bit and ifunc handling.
d8307d
            * sysdeps/s390/s390-32/multiarch/strcpy.c: Delete file.
d8307d
            * sysdeps/s390/s390-64/multiarch/strcpy.c: Likewise.
d8307d
            * sysdeps/s390/s390-32/strcpy.S: Likewise.
d8307d
d8307d
diff --git a/sysdeps/s390/Makefile b/sysdeps/s390/Makefile
d8307d
index f092355743e3908f..e4191319531ecb01 100644
d8307d
--- a/sysdeps/s390/Makefile
d8307d
+++ b/sysdeps/s390/Makefile
d8307d
@@ -38,5 +38,6 @@ sysdep_routines += bzero memset memset-z900 \
d8307d
 		   strstr strstr-vx strstr-c \
d8307d
 		   memmem memmem-vx memmem-c \
d8307d
 		   strlen strlen-vx strlen-c \
d8307d
-		   strnlen strnlen-vx strnlen-c
d8307d
+		   strnlen strnlen-vx strnlen-c \
d8307d
+		   strcpy strcpy-vx strcpy-z900
d8307d
 endif
d8307d
diff --git a/sysdeps/s390/ifunc-strcpy.h b/sysdeps/s390/ifunc-strcpy.h
d8307d
new file mode 100644
d8307d
index 0000000000000000..85e45556e6a61dd5
d8307d
--- /dev/null
d8307d
+++ b/sysdeps/s390/ifunc-strcpy.h
d8307d
@@ -0,0 +1,52 @@
d8307d
+/* strcpy variant information on S/390 version.
d8307d
+   Copyright (C) 2018 Free Software Foundation, Inc.
d8307d
+   This file is part of the GNU C Library.
d8307d
+
d8307d
+   The GNU C Library is free software; you can redistribute it and/or
d8307d
+   modify it under the terms of the GNU Lesser General Public
d8307d
+   License as published by the Free Software Foundation; either
d8307d
+   version 2.1 of the License, or (at your option) any later version.
d8307d
+
d8307d
+   The GNU C Library is distributed in the hope that it will be useful,
d8307d
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
d8307d
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
d8307d
+   Lesser General Public License for more details.
d8307d
+
d8307d
+   You should have received a copy of the GNU Lesser General Public
d8307d
+   License along with the GNU C Library; if not, see
d8307d
+   <http://www.gnu.org/licenses/>.  */
d8307d
+
d8307d
+#if defined USE_MULTIARCH && IS_IN (libc)		\
d8307d
+  && ! defined HAVE_S390_MIN_Z13_ZARCH_ASM_SUPPORT
d8307d
+# define HAVE_STRCPY_IFUNC	1
d8307d
+#else
d8307d
+# define HAVE_STRCPY_IFUNC	0
d8307d
+#endif
d8307d
+
d8307d
+#ifdef HAVE_S390_VX_ASM_SUPPORT
d8307d
+# define HAVE_STRCPY_IFUNC_AND_VX_SUPPORT HAVE_STRCPY_IFUNC
d8307d
+#else
d8307d
+# define HAVE_STRCPY_IFUNC_AND_VX_SUPPORT 0
d8307d
+#endif
d8307d
+
d8307d
+#if defined HAVE_S390_MIN_Z13_ZARCH_ASM_SUPPORT
d8307d
+# define STRCPY_DEFAULT		STRCPY_Z13
d8307d
+# define HAVE_STRCPY_Z900_G5	0
d8307d
+# define HAVE_STRCPY_Z13	1
d8307d
+#else
d8307d
+# define STRCPY_DEFAULT		STRCPY_Z900_G5
d8307d
+# define HAVE_STRCPY_Z900_G5	1
d8307d
+# define HAVE_STRCPY_Z13	HAVE_STRCPY_IFUNC_AND_VX_SUPPORT
d8307d
+#endif
d8307d
+
d8307d
+#if HAVE_STRCPY_Z900_G5
d8307d
+# define STRCPY_Z900_G5		__strcpy_default
d8307d
+#else
d8307d
+# define STRCPY_Z900_G5		NULL
d8307d
+#endif
d8307d
+
d8307d
+#if HAVE_STRCPY_Z13
d8307d
+# define STRCPY_Z13		__strcpy_vx
d8307d
+#else
d8307d
+# define STRCPY_Z13		NULL
d8307d
+#endif
d8307d
diff --git a/sysdeps/s390/multiarch/Makefile b/sysdeps/s390/multiarch/Makefile
d8307d
index 35ba223c5d4fb52f..50f7f0b78df723bb 100644
d8307d
--- a/sysdeps/s390/multiarch/Makefile
d8307d
+++ b/sysdeps/s390/multiarch/Makefile
d8307d
@@ -1,6 +1,5 @@
d8307d
 ifeq ($(subdir),string)
d8307d
-sysdep_routines += strcpy strcpy-vx \
d8307d
-		   stpcpy stpcpy-vx stpcpy-c \
d8307d
+sysdep_routines += stpcpy stpcpy-vx stpcpy-c \
d8307d
 		   strncpy strncpy-vx \
d8307d
 		   stpncpy stpncpy-vx stpncpy-c \
d8307d
 		   strcat strcat-vx strcat-c \
d8307d
diff --git a/sysdeps/s390/multiarch/ifunc-impl-list.c b/sysdeps/s390/multiarch/ifunc-impl-list.c
d8307d
index 680e5b738bfb7f32..1784372db9828463 100644
d8307d
--- a/sysdeps/s390/multiarch/ifunc-impl-list.c
d8307d
+++ b/sysdeps/s390/multiarch/ifunc-impl-list.c
d8307d
@@ -28,6 +28,7 @@
d8307d
 #include <ifunc-memmem.h>
d8307d
 #include <ifunc-strlen.h>
d8307d
 #include <ifunc-strnlen.h>
d8307d
+#include <ifunc-strcpy.h>
d8307d
 
d8307d
 /* Maximum number of IFUNC implementations.  */
d8307d
 #define MAX_IFUNC	3
d8307d
@@ -190,6 +191,18 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
d8307d
 		)
d8307d
 #endif /* HAVE_STRNLEN_IFUNC  */
d8307d
 
d8307d
+#if HAVE_STRCPY_IFUNC
d8307d
+    IFUNC_IMPL (i, name, strcpy,
d8307d
+# if HAVE_STRCPY_Z13
d8307d
+		IFUNC_IMPL_ADD (array, i, strcpy,
d8307d
+				dl_hwcap & HWCAP_S390_VX, STRCPY_Z13)
d8307d
+# endif
d8307d
+# if HAVE_STRCPY_Z900_G5
d8307d
+		IFUNC_IMPL_ADD (array, i, strcpy, 1, STRCPY_Z900_G5)
d8307d
+# endif
d8307d
+		)
d8307d
+#endif /* HAVE_STRCPY_IFUNC  */
d8307d
+
d8307d
 #ifdef HAVE_S390_VX_ASM_SUPPORT
d8307d
 
d8307d
 # define IFUNC_VX_IMPL(FUNC)						\
d8307d
@@ -202,7 +215,6 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
d8307d
 
d8307d
   IFUNC_VX_IMPL (wcsnlen);
d8307d
 
d8307d
-  IFUNC_VX_IMPL (strcpy);
d8307d
   IFUNC_VX_IMPL (wcscpy);
d8307d
 
d8307d
   IFUNC_VX_IMPL (stpcpy);
d8307d
diff --git a/sysdeps/s390/s390-32/multiarch/strcpy.c b/sysdeps/s390/s390-32/multiarch/strcpy.c
d8307d
deleted file mode 100644
d8307d
index 6a22e31a03c8c1c4..0000000000000000
d8307d
--- a/sysdeps/s390/s390-32/multiarch/strcpy.c
d8307d
+++ /dev/null
d8307d
@@ -1,21 +0,0 @@
d8307d
-/* Multiple versions of strcpy.
d8307d
-   Copyright (C) 2015-2018 Free Software Foundation, Inc.
d8307d
-   This file is part of the GNU C Library.
d8307d
-
d8307d
-   The GNU C Library is free software; you can redistribute it and/or
d8307d
-   modify it under the terms of the GNU Lesser General Public
d8307d
-   License as published by the Free Software Foundation; either
d8307d
-   version 2.1 of the License, or (at your option) any later version.
d8307d
-
d8307d
-   The GNU C Library is distributed in the hope that it will be useful,
d8307d
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
d8307d
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
d8307d
-   Lesser General Public License for more details.
d8307d
-
d8307d
-   You should have received a copy of the GNU Lesser General Public
d8307d
-   License along with the GNU C Library; if not, see
d8307d
-   <http://www.gnu.org/licenses/>.  */
d8307d
-
d8307d
-/* This wrapper-file is needed, because otherwise file
d8307d
-   sysdeps/s390/s390-[32|64]/strcpy.S will be used.  */
d8307d
-#include <sysdeps/s390/multiarch/strcpy.c>
d8307d
diff --git a/sysdeps/s390/s390-32/strcpy.S b/sysdeps/s390/s390-32/strcpy.S
d8307d
deleted file mode 100644
d8307d
index d49136ee92b83378..0000000000000000
d8307d
--- a/sysdeps/s390/s390-32/strcpy.S
d8307d
+++ /dev/null
d8307d
@@ -1,36 +0,0 @@
d8307d
-/* strcpy - copy a string from source to destination. For IBM S390
d8307d
-   This file is part of the GNU C Library.
d8307d
-   Copyright (C) 2000-2018 Free Software Foundation, Inc.
d8307d
-   Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
d8307d
-
d8307d
-   The GNU C Library is free software; you can redistribute it and/or
d8307d
-   modify it under the terms of the GNU Lesser General Public
d8307d
-   License as published by the Free Software Foundation; either
d8307d
-   version 2.1 of the License, or (at your option) any later version.
d8307d
-
d8307d
-   The GNU C Library is distributed in the hope that it will be useful,
d8307d
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
d8307d
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
d8307d
-   Lesser General Public License for more details.
d8307d
-
d8307d
-   You should have received a copy of the GNU Lesser General Public
d8307d
-   License along with the GNU C Library; if not, see
d8307d
-   <http://www.gnu.org/licenses/>.  */
d8307d
-
d8307d
-/*
d8307d
- * R2 = address of destination
d8307d
- * R3 = address of source
d8307d
- */
d8307d
-
d8307d
-#include "sysdep.h"
d8307d
-#include "asm-syntax.h"
d8307d
-
d8307d
-	.text
d8307d
-ENTRY(strcpy)
d8307d
-	slr   %r0,%r0
d8307d
-	lr    %r1,%r2
d8307d
-0:      mvst  %r1,%r3
d8307d
-	jo    0b
d8307d
-	br    %r14
d8307d
-END(strcpy)
d8307d
-libc_hidden_builtin_def (strcpy)
d8307d
diff --git a/sysdeps/s390/s390-64/multiarch/strcpy.c b/sysdeps/s390/s390-64/multiarch/strcpy.c
d8307d
deleted file mode 100644
d8307d
index 6a22e31a03c8c1c4..0000000000000000
d8307d
--- a/sysdeps/s390/s390-64/multiarch/strcpy.c
d8307d
+++ /dev/null
d8307d
@@ -1,21 +0,0 @@
d8307d
-/* Multiple versions of strcpy.
d8307d
-   Copyright (C) 2015-2018 Free Software Foundation, Inc.
d8307d
-   This file is part of the GNU C Library.
d8307d
-
d8307d
-   The GNU C Library is free software; you can redistribute it and/or
d8307d
-   modify it under the terms of the GNU Lesser General Public
d8307d
-   License as published by the Free Software Foundation; either
d8307d
-   version 2.1 of the License, or (at your option) any later version.
d8307d
-
d8307d
-   The GNU C Library is distributed in the hope that it will be useful,
d8307d
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
d8307d
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
d8307d
-   Lesser General Public License for more details.
d8307d
-
d8307d
-   You should have received a copy of the GNU Lesser General Public
d8307d
-   License along with the GNU C Library; if not, see
d8307d
-   <http://www.gnu.org/licenses/>.  */
d8307d
-
d8307d
-/* This wrapper-file is needed, because otherwise file
d8307d
-   sysdeps/s390/s390-[32|64]/strcpy.S will be used.  */
d8307d
-#include <sysdeps/s390/multiarch/strcpy.c>
d8307d
diff --git a/sysdeps/s390/multiarch/strcpy-vx.S b/sysdeps/s390/strcpy-vx.S
d8307d
similarity index 85%
d8307d
rename from sysdeps/s390/multiarch/strcpy-vx.S
d8307d
rename to sysdeps/s390/strcpy-vx.S
d8307d
index 52197f57f7b5d5cf..844d23e4fee32c9b 100644
d8307d
--- a/sysdeps/s390/multiarch/strcpy-vx.S
d8307d
+++ b/sysdeps/s390/strcpy-vx.S
d8307d
@@ -16,13 +16,13 @@
d8307d
    License along with the GNU C Library; if not, see
d8307d
    <http://www.gnu.org/licenses/>.  */
d8307d
 
d8307d
-#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc)
d8307d
-
d8307d
-# include "sysdep.h"
d8307d
-# include "asm-syntax.h"
d8307d
+#include <ifunc-strcpy.h>
d8307d
+#include "sysdep.h"
d8307d
+#include "asm-syntax.h"
d8307d
 
d8307d
 	.text
d8307d
 
d8307d
+#if HAVE_STRCPY_Z13
d8307d
 /* char * strcpy (const char *dest, const char *src)
d8307d
    Copy string src to dest.
d8307d
 
d8307d
@@ -36,7 +36,7 @@
d8307d
    -v17=index of zero
d8307d
    -v18=part of src
d8307d
 */
d8307d
-ENTRY(__strcpy_vx)
d8307d
+ENTRY(STRCPY_Z13)
d8307d
 	.machine "z13"
d8307d
 	.machinemode "zarch_nohighgprs"
d8307d
 
d8307d
@@ -97,13 +97,13 @@ ENTRY(__strcpy_vx)
d8307d
 .Lfound_align:
d8307d
 	vstl	%v16,%r5,0(%r2)	/* Copy characters including zero.  */
d8307d
 	br	%r14
d8307d
-END(__strcpy_vx)
d8307d
+END(STRCPY_Z13)
d8307d
 
d8307d
-/* Use mvst-strcpy-implementation as default implementation.  */
d8307d
-# define strcpy __strcpy_c
d8307d
-# undef libc_hidden_builtin_def
d8307d
-# define libc_hidden_builtin_def(name) strong_alias(__strcpy_c, __GI_strcpy)
d8307d
-#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */
d8307d
+# if ! HAVE_STRCPY_IFUNC
d8307d
+strong_alias (STRCPY_Z13, strcpy)
d8307d
+# endif
d8307d
 
d8307d
-/* Include mvst-strcpy-implementation in s390-32/s390-64 subdirectory.  */
d8307d
-#include <strcpy.S>
d8307d
+# if ! HAVE_STRCPY_Z900_G5 && defined SHARED && IS_IN (libc)
d8307d
+strong_alias (STRCPY_Z13, __GI_strcpy)
d8307d
+# endif
d8307d
+#endif
d8307d
diff --git a/sysdeps/s390/s390-64/strcpy.S b/sysdeps/s390/strcpy-z900.S
d8307d
similarity index 66%
d8307d
rename from sysdeps/s390/s390-64/strcpy.S
d8307d
rename to sysdeps/s390/strcpy-z900.S
d8307d
index 203c73c905d0d86c..42798b1fd5c51187 100644
d8307d
--- a/sysdeps/s390/s390-64/strcpy.S
d8307d
+++ b/sysdeps/s390/strcpy-z900.S
d8307d
@@ -1,4 +1,4 @@
d8307d
-/* strcpy - copy a string from source to destination.  64 bit S/390 version.
d8307d
+/* strcpy - copy a string from source to destination.  64/31 bit S/390 version.
d8307d
    Copyright (C) 2001-2018 Free Software Foundation, Inc.
d8307d
    Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
d8307d
    This file is part of the GNU C Library.
d8307d
@@ -21,15 +21,36 @@
d8307d
      %r2 = address of destination
d8307d
      %r3 = address of source.  */
d8307d
 
d8307d
+#include <ifunc-strcpy.h>
d8307d
 #include "sysdep.h"
d8307d
 #include "asm-syntax.h"
d8307d
 
d8307d
+#if HAVE_STRCPY_Z900_G5
d8307d
+# if defined __s390x__
d8307d
+#  define SLGR	slgr
d8307d
+#  define LGR	lgr
d8307d
+# else
d8307d
+#  define SLGR	slr
d8307d
+#  define LGR	lr
d8307d
+# endif /* ! defined __s390x__  */
d8307d
+
d8307d
         .text
d8307d
-ENTRY(strcpy)
d8307d
-	slgr  %r0,%r0
d8307d
-	lgr   %r1,%r2
d8307d
+ENTRY(STRCPY_Z900_G5)
d8307d
+	SLGR  %r0,%r0
d8307d
+	LGR   %r1,%r2
d8307d
 0:	mvst  %r1,%r3
d8307d
 	jo    0b
d8307d
 	br    %r14
d8307d
-END(strcpy)
d8307d
-libc_hidden_builtin_def (strcpy)
d8307d
+END(STRCPY_Z900_G5)
d8307d
+
d8307d
+# undef SLGR
d8307d
+# undef LGR
d8307d
+
d8307d
+# if ! HAVE_STRCPY_IFUNC
d8307d
+strong_alias (STRCPY_Z900_G5, strcpy)
d8307d
+# endif
d8307d
+
d8307d
+# if defined SHARED && IS_IN (libc)
d8307d
+strong_alias (STRCPY_Z900_G5, __GI_strcpy)
d8307d
+# endif
d8307d
+#endif
d8307d
diff --git a/sysdeps/s390/multiarch/strcpy.c b/sysdeps/s390/strcpy.c
d8307d
similarity index 69%
d8307d
rename from sysdeps/s390/multiarch/strcpy.c
d8307d
rename to sysdeps/s390/strcpy.c
d8307d
index 8f32a13f6730c427..f4e28e24c85b7162 100644
d8307d
--- a/sysdeps/s390/multiarch/strcpy.c
d8307d
+++ b/sysdeps/s390/strcpy.c
d8307d
@@ -16,12 +16,25 @@
d8307d
    License along with the GNU C Library; if not, see
d8307d
    <http://www.gnu.org/licenses/>.  */
d8307d
 
d8307d
-#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc)
d8307d
+#include <ifunc-strcpy.h>
d8307d
+
d8307d
+#if HAVE_STRCPY_IFUNC
d8307d
 # define strcpy __redirect_strcpy
d8307d
 # include <string.h>
d8307d
 # undef strcpy
d8307d
 # include <ifunc-resolve.h>
d8307d
 
d8307d
-s390_vx_libc_ifunc2_redirected (__redirect_strcpy, __strcpy, strcpy)
d8307d
+# if HAVE_STRCPY_Z900_G5
d8307d
+extern __typeof (__redirect_strcpy) STRCPY_Z900_G5 attribute_hidden;
d8307d
+# endif
d8307d
+
d8307d
+# if HAVE_STRCPY_Z13
d8307d
+extern __typeof (__redirect_strcpy) STRCPY_Z13 attribute_hidden;
d8307d
+# endif
d8307d
 
d8307d
+s390_libc_ifunc_expr (__redirect_strcpy, strcpy,
d8307d
+		      (HAVE_STRCPY_Z13 && (hwcap & HWCAP_S390_VX))
d8307d
+		      ? STRCPY_Z13
d8307d
+		      : STRCPY_DEFAULT
d8307d
+		      )
d8307d
 #endif