[4/6] strncpy, stpncpy and strstr fixes

Message ID 20170601131017.GJ8842@bubble.grove.modra.org
State Committed
Delegated to: Tulio Magno Quites Machado Filho
Headers

Commit Message

Alan Modra June 1, 2017, 1:10 p.m. UTC
  Makes __stpncpy_power8 call __memset_power8 directly rather than via an
IFUNC.  Fixes a missing _mcount, and removes some redundant NOPS.  The
*_is_local defines are also used in a followup patch.

	* sysdeps/powerpc/powerpc64/multiarch/strncpy-power7.S: Define
	MEMSET_is_local.
	* sysdeps/powerpc/powerpc64/multiarch/strncpy-power8.S: Likewise.
	* sysdeps/powerpc/powerpc64/multiarch/stpncpy-power7.S: Likewise.
	* sysdeps/powerpc/powerpc64/multiarch/stpncpy-power8.S: Likewise.
	Define MEMSET.
	* sysdeps/powerpc/powerpc64/multiarch/strstr-power7.S: Define
	STRLEN_is_local, STRNLEN_is_local, and STRCHR_is_local.
	* sysdeps/powerpc/powerpc64/power7/strstr.S: Likewise.  Don't add
	nop after local calls.
	* sysdeps/powerpc/powerpc64/power7/strncpy.S: Define MEMSET_is_local.
	Don't add nop after local call.
	* sysdeps/powerpc/powerpc64/power8/strncpy.S: Likewise.  Add missing
	CALL_MCOUNT.
  

Comments

Tulio Magno Quites Machado Filho June 12, 2017, 7:53 p.m. UTC | #1
Alan Modra <amodra@gmail.com> writes:

> Makes __stpncpy_power8 call __memset_power8 directly rather than via an
> IFUNC.  Fixes a missing _mcount, and removes some redundant NOPS.  The
> *_is_local defines are also used in a followup patch.
>
> 	* sysdeps/powerpc/powerpc64/multiarch/strncpy-power7.S: Define
> 	MEMSET_is_local.
> 	* sysdeps/powerpc/powerpc64/multiarch/strncpy-power8.S: Likewise.
> 	* sysdeps/powerpc/powerpc64/multiarch/stpncpy-power7.S: Likewise.
> 	* sysdeps/powerpc/powerpc64/multiarch/stpncpy-power8.S: Likewise.
> 	Define MEMSET.
> 	* sysdeps/powerpc/powerpc64/multiarch/strstr-power7.S: Define
> 	STRLEN_is_local, STRNLEN_is_local, and STRCHR_is_local.
> 	* sysdeps/powerpc/powerpc64/power7/strstr.S: Likewise.  Don't add
> 	nop after local calls.
> 	* sysdeps/powerpc/powerpc64/power7/strncpy.S: Define MEMSET_is_local.
> 	Don't add nop after local call.
> 	* sysdeps/powerpc/powerpc64/power8/strncpy.S: Likewise.  Add missing
> 	CALL_MCOUNT.

Looks good to me.
  

Patch

diff --git a/sysdeps/powerpc/powerpc64/multiarch/stpncpy-power7.S b/sysdeps/powerpc/powerpc64/multiarch/stpncpy-power7.S
index 6636b01..6e6fa3e 100644
--- a/sysdeps/powerpc/powerpc64/multiarch/stpncpy-power7.S
+++ b/sysdeps/powerpc/powerpc64/multiarch/stpncpy-power7.S
@@ -26,5 +26,8 @@ 
 #define libc_hidden_builtin_def(name)
 
 #define MEMSET __memset_power7
+#ifdef SHARED
+#define MEMSET_is_local
+#endif
 
 #include <sysdeps/powerpc/powerpc64/power7/stpncpy.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/stpncpy-power8.S b/sysdeps/powerpc/powerpc64/multiarch/stpncpy-power8.S
index 6ce706a..9663659 100644
--- a/sysdeps/powerpc/powerpc64/multiarch/stpncpy-power8.S
+++ b/sysdeps/powerpc/powerpc64/multiarch/stpncpy-power8.S
@@ -25,4 +25,9 @@ 
 #undef libc_hidden_builtin_def
 #define libc_hidden_builtin_def(name)
 
+#define MEMSET __memset_power8
+#ifdef SHARED
+#define MEMSET_is_local
+#endif
+
 #include <sysdeps/powerpc/powerpc64/power8/stpncpy.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strncpy-power7.S b/sysdeps/powerpc/powerpc64/multiarch/strncpy-power7.S
index 03f7f83..a36e5dd 100644
--- a/sysdeps/powerpc/powerpc64/multiarch/strncpy-power7.S
+++ b/sysdeps/powerpc/powerpc64/multiarch/strncpy-power7.S
@@ -24,5 +24,8 @@ 
 #define libc_hidden_builtin_def(name)
 
 #define MEMSET __memset_power7
+#ifdef SHARED
+#define MEMSET_is_local
+#endif
 
 #include <sysdeps/powerpc/powerpc64/power7/strncpy.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strncpy-power8.S b/sysdeps/powerpc/powerpc64/multiarch/strncpy-power8.S
index 17117eb..3edb2c6 100644
--- a/sysdeps/powerpc/powerpc64/multiarch/strncpy-power8.S
+++ b/sysdeps/powerpc/powerpc64/multiarch/strncpy-power8.S
@@ -25,5 +25,8 @@ 
 
 /* memset is used to pad the end of the string.  */
 #define MEMSET __memset_power8
+#ifdef SHARED
+#define MEMSET_is_local
+#endif
 
 #include <sysdeps/powerpc/powerpc64/power8/strncpy.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strstr-power7.S b/sysdeps/powerpc/powerpc64/multiarch/strstr-power7.S
index 3991df7..900d3be 100644
--- a/sysdeps/powerpc/powerpc64/multiarch/strstr-power7.S
+++ b/sysdeps/powerpc/powerpc64/multiarch/strstr-power7.S
@@ -26,5 +26,10 @@ 
 #define STRLEN __strlen_power7
 #define STRNLEN __strnlen_power7
 #define STRCHR __strchr_power7
+#ifdef SHARED
+#define STRLEN_is_local
+#define STRNLEN_is_local
+#define STRCHR_is_local
+#endif
 
 #include <sysdeps/powerpc/powerpc64/power7/strstr.S>
diff --git a/sysdeps/powerpc/powerpc64/power7/strncpy.S b/sysdeps/powerpc/powerpc64/power7/strncpy.S
index 0224f74..88d7979 100644
--- a/sysdeps/powerpc/powerpc64/power7/strncpy.S
+++ b/sysdeps/powerpc/powerpc64/power7/strncpy.S
@@ -59,6 +59,7 @@ 
 /* For builds with no IFUNC support, local calls should be made to internal
    GLIBC symbol (created by libc_hidden_builtin_def).  */
 # ifdef SHARED
+#  define MEMSET_is_local
 #  define MEMSET   __GI_memset
 # else
 #  define MEMSET   memset
@@ -223,7 +224,9 @@  L(zeroFill):
 	li r4, 0		/* zero fill buffer  */
 	mr r5, r8		/* how many bytes to fill buffer with  */
 	bl MEMSET		/* call optimized memset  */
+#ifndef MEMSET_is_local
 	nop
+#endif
 
 L(update3return):
 #ifdef USE_AS_STPNCPY
diff --git a/sysdeps/powerpc/powerpc64/power7/strstr.S b/sysdeps/powerpc/powerpc64/power7/strstr.S
index 260db2e..1c43253 100644
--- a/sysdeps/powerpc/powerpc64/power7/strstr.S
+++ b/sysdeps/powerpc/powerpc64/power7/strstr.S
@@ -34,6 +34,7 @@ 
    GLIBC symbol (created by libc_hidden_builtin_def).  */
 # ifdef SHARED
 #  define STRLEN   __GI_strlen
+#  define STRLEN_is_local
 # else
 #  define STRLEN   strlen
 # endif
@@ -44,6 +45,7 @@ 
    GLIBC symbol (created by libc_hidden_builtin_def).  */
 # ifdef SHARED
 #  define STRNLEN   __GI_strnlen
+#  define STRNLEN_is_local
 # else
 #  define STRNLEN  __strnlen
 # endif
@@ -52,6 +54,7 @@ 
 #ifndef STRCHR
 # ifdef SHARED
 #  define STRCHR   __GI_strchr
+#  define STRCHR_is_local
 # else
 #  define STRCHR   strchr
 # endif
@@ -86,7 +89,9 @@  EALIGN (STRSTR, 4, 0)
 	mr	r30, r4
 	mr	r3, r4
 	bl	STRLEN
+#ifndef STRLEN_is_local
 	nop
+#endif
 
 	cmpdi	cr7, r3, 0	/* If search str is null.  */
 	beq	cr7, L(ret_r3)
@@ -95,14 +100,18 @@  EALIGN (STRSTR, 4, 0)
 	mr	r4, r3
 	mr	r3, r29
 	bl	STRNLEN
+#ifndef STRNLEN_is_local
 	nop
+#endif
 
 	cmpd	cr7, r3, r31 	/* If len(r3) < len(r4).  */
 	blt	cr7, L(retnull)
 	mr	r3, r29
 	lbz	r4, 0(r30)
 	bl	STRCHR
+#ifndef STRCHR_is_local
 	nop
+#endif
 
 	mr	r11, r3
 	/* If first char of search str is not present.  */
@@ -334,7 +343,9 @@  L(begin):
 	beq	cr7, L(default)
 	lbz	r4, 0(r30)
 	bl	STRCHR
+#ifndef STRCHR_is_local
 	nop
+#endif
 	/* If first char of search str is not present.  */
 	cmpdi	cr7, r3, 0
 	ble	cr7, L(end)
@@ -437,7 +448,9 @@  L(nextbyte):
 	beq	cr7, L(default)
 	lbz	r4, 0(r30)
 	bl	STRCHR
+#ifndef STRCHR_is_local
 	nop
+#endif
 	/* If first char of search str is not present.  */
 	cmpdi	cr7, r3, 0
 	ble	cr7, L(end)
diff --git a/sysdeps/powerpc/powerpc64/power8/strncpy.S b/sysdeps/powerpc/powerpc64/power8/strncpy.S
index 6d40f30..552c5cc 100644
--- a/sysdeps/powerpc/powerpc64/power8/strncpy.S
+++ b/sysdeps/powerpc/powerpc64/power8/strncpy.S
@@ -36,6 +36,7 @@ 
 /* For builds without IFUNC support, local calls should be made to internal
    GLIBC symbol (created by libc_hidden_builtin_def).  */
 # ifdef SHARED
+#  define MEMSET_is_local
 #  define MEMSET   __GI_memset
 # else
 #  define MEMSET   memset
@@ -61,6 +62,7 @@ 
 
 	.machine  power7
 EALIGN (FUNC_NAME, 4, 0)
+	CALL_MCOUNT 3
 
         /* Check if the [src]+15 will cross a 4K page by checking if the bit
            indicating the page size changes.  Basically:
@@ -242,7 +244,9 @@  L(zero_pad_start_1):
 	cfi_adjust_cfa_offset(FRAMESIZE)
 
 	bl	MEMSET
+#ifndef MEMSET_is_local
 	nop
+#endif
 
 	/* Restore the stack frame.  */
 	addi	r1,r1,FRAMESIZE