From de7ee73d6f5000478173ac065ded4077fd6ddee2 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Wed, 14 Jun 2017 10:44:59 +0930 Subject: PowerPC64 strncpy, stpncpy and strstr fixes 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. --- sysdeps/powerpc/powerpc64/multiarch/stpncpy-power7.S | 3 +++ sysdeps/powerpc/powerpc64/multiarch/stpncpy-power8.S | 5 +++++ sysdeps/powerpc/powerpc64/multiarch/strncpy-power7.S | 3 +++ sysdeps/powerpc/powerpc64/multiarch/strncpy-power8.S | 3 +++ sysdeps/powerpc/powerpc64/multiarch/strstr-power7.S | 5 +++++ sysdeps/powerpc/powerpc64/power7/strncpy.S | 3 +++ sysdeps/powerpc/powerpc64/power7/strstr.S | 13 +++++++++++++ sysdeps/powerpc/powerpc64/power8/strncpy.S | 4 ++++ 8 files changed, 39 insertions(+) (limited to 'sysdeps') diff --git a/sysdeps/powerpc/powerpc64/multiarch/stpncpy-power7.S b/sysdeps/powerpc/powerpc64/multiarch/stpncpy-power7.S index 6636b01d07..6e6fa3e1f2 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 diff --git a/sysdeps/powerpc/powerpc64/multiarch/stpncpy-power8.S b/sysdeps/powerpc/powerpc64/multiarch/stpncpy-power8.S index 6ce706a879..96636593bd 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 diff --git a/sysdeps/powerpc/powerpc64/multiarch/strncpy-power7.S b/sysdeps/powerpc/powerpc64/multiarch/strncpy-power7.S index 03f7f83448..a36e5dd3a6 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 diff --git a/sysdeps/powerpc/powerpc64/multiarch/strncpy-power8.S b/sysdeps/powerpc/powerpc64/multiarch/strncpy-power8.S index 17117eb7ec..3edb2c6a9f 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 diff --git a/sysdeps/powerpc/powerpc64/multiarch/strstr-power7.S b/sysdeps/powerpc/powerpc64/multiarch/strstr-power7.S index 3991df74a8..900d3be065 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 diff --git a/sysdeps/powerpc/powerpc64/power7/strncpy.S b/sysdeps/powerpc/powerpc64/power7/strncpy.S index 0224f74898..88d797908c 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 260db2ed6d..1c432534a3 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 6d40f30ff7..552c5cc577 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 -- cgit 1.4.1