]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
PowerPC64 strncpy, stpncpy and strstr fixes
authorAlan Modra <amodra@gmail.com>
Wed, 14 Jun 2017 01:14:59 +0000 (10:44 +0930)
committerAlan Modra <amodra@gmail.com>
Wed, 14 Jun 2017 01:14:59 +0000 (10:44 +0930)
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.

ChangeLog
sysdeps/powerpc/powerpc64/multiarch/stpncpy-power7.S
sysdeps/powerpc/powerpc64/multiarch/stpncpy-power8.S
sysdeps/powerpc/powerpc64/multiarch/strncpy-power7.S
sysdeps/powerpc/powerpc64/multiarch/strncpy-power8.S
sysdeps/powerpc/powerpc64/multiarch/strstr-power7.S
sysdeps/powerpc/powerpc64/power7/strncpy.S
sysdeps/powerpc/powerpc64/power7/strstr.S
sysdeps/powerpc/powerpc64/power8/strncpy.S

index 3b4693461e1a3277ff736355d95bf84629ba373d..335fe05d7c2875c7b3ae3bb8974c1e0e7d311c49 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,20 @@
+2017-06-14  Alan Modra  <amodra@gmail.com>
+
+       * 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.
+
 2017-06-14  Alan Modra  <amodra@gmail.com>
 
        * sysdeps/powerpc/powerpc64/sysdep.h: Formatting.
index 6636b01d07348a9fffda2cbb18ac71774493199a..6e6fa3e1f275397d2e1dce62e3075459aafce4a1 100644 (file)
@@ -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>
index 6ce706a8793232a981d1dc5dcb112aedba9c0871..96636593bd067bc616389b33ea90ad84105c200c 100644 (file)
@@ -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>
index 03f7f834485235764f81adde9db2d80e562d4dac..a36e5dd3a6194a58bb7fa6ce78267fbbf336bc7d 100644 (file)
@@ -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>
index 17117eb7eca703823bc0935a28357947b42e5dc2..3edb2c6a9f71329f0d494894774fc7fa3217f9ca 100644 (file)
@@ -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>
index 3991df74a89f938b5585f41e5cf01111bb551096..900d3be0658bcbcf95bd60759df160fa0d22a220 100644 (file)
 #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>
index 0224f7489809a316accc5e80b04a8cf625df0a6b..88d797908ce90cfc31ae3d14b7d1111ea6dd000b 100644 (file)
@@ -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
index 260db2ed6d2796319581ecdb59076976e3af1a79..1c432534a363a0b11d404aec8dd4834743c9f798 100644 (file)
@@ -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)
index 6d40f30ff7015cdea89516f955873724ff74eb4a..552c5cc577ed8e36b862f9514be982debab660cc 100644 (file)
@@ -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