]> sourceware.org Git - glibc.git/commitdiff
PowerPC: ifunc improvement for internal calls
authorAdhemerval Zanella <azanella@linux.vnet.ibm.com>
Fri, 2 May 2014 17:00:36 +0000 (12:00 -0500)
committerAdhemerval Zanella <azanella@linux.vnet.ibm.com>
Mon, 5 May 2014 18:30:16 +0000 (13:30 -0500)
This patch changes de default symbol redirection for internal call of
memcpy, memset, memchr, and strlen to the IFUNC resolved ones.  The
performance improvement is noticeable in algorithms that uses these
symbols extensible, like the regex functions.

ChangeLog
sysdeps/powerpc/powerpc32/power4/multiarch/memchr-ppc32.c
sysdeps/powerpc/powerpc64/multiarch/memcpy-ppc64.S
sysdeps/powerpc/powerpc64/multiarch/memcpy.c
sysdeps/powerpc/powerpc64/multiarch/memset-ppc64.S
sysdeps/powerpc/powerpc64/multiarch/memset.c
sysdeps/powerpc/powerpc64/multiarch/strlen-ppc64.S
sysdeps/powerpc/powerpc64/multiarch/strlen.c

index ac0d69eb073dab49b20c775124ed33fd0ad17db5..ad0484b45feaffb776de015fb6768f1757676b22 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+2014-05-04  Adhemerval Zanella  <azanella@linux.vnet.ibm.com>
+
+       * sysdeps/powerpc/powerpc32/power4/multiarch/memchr-ppc32.c
+       [libc_hidden_builtin_def]: Define to empty value.
+       * sysdeps/powerpc/powerpc64/multiarch/memcpy-ppc64.S:
+       [libc_hidden_builtin_def]: Likewise.
+       * sysdeps/powerpc/powerpc64/multiarch/memset-ppc64.S:
+       [libc_hidden_builtin_def]: Likewise.
+       * sysdeps/powerpc/powerpc64/multiarch/strlen-ppc64.S:
+       [libc_hidden_builtin_def]: Likewise.
+       * sysdeps/powerpc/powerpc64/multiarch/memcpy.c (memcpy): Redefined to
+       __redirect_memcpy and define ifunc as default hidden symbol.
+       * sysdeps/powerpc/powerpc64/multiarch/memset.c (memset): Likewise.
+       * sysdeps/powerpc/powerpc64/multiarch/strlen.c (strlen): Likewise.
+
 2014-05-04  Adam Conrad  <adconrad@0c3.net>
 
        * locale/iso-4217.def: Reintroduce XDR currency.
index 43c5652cb2f773904866bcf3feaeff9cb54f85ef..4bd6bb996b3aa68db78abeb216c490916123acc8 100644 (file)
@@ -25,8 +25,7 @@
 
 #ifdef SHARED
 # undef libc_hidden_builtin_def
-# define libc_hidden_builtin_def(name)  \
-  __hidden_ver1 (__memchr_ppc, __GI_memchr, __memchr_ppc);
+# define libc_hidden_builtin_def(name)
 #endif
 
 extern __typeof (memchr) __memchr_ppc attribute_hidden;
index a09d7603a6c38f22304ec852cdbf86eb56f00353..c63065439f65cf8b72aa833c08ec794bf7f76998 100644 (file)
@@ -36,8 +36,7 @@
    END_2(__memcpy_ppc)
 
 # undef libc_hidden_builtin_def
-# define libc_hidden_builtin_def(name)                         \
-   .globl __GI_memcpy; __GI_memcpy = __memcpy_ppc
+# define libc_hidden_builtin_def(name)
 #endif
 
 #include <sysdeps/powerpc/powerpc64/memcpy.S>
index 6a916301e17f3ffecf5a553a03660386ede1fca8..305e963e63a3f4e5189ee5672397aa90767379b4 100644 (file)
    DSO.  In static binaries we need memcpy before the initialization
    happened.  */
 #if defined SHARED && !defined NOT_IN_libc
+/* Redefine memcpy so that the compiler won't complain about the type
+   mismatch with the IFUNC selector in strong_alias, below.  */
+# undef memcpy
+# define memcpy __redirect_memcpy
 # include <string.h>
-# include <shlib-compat.h>
 # include "init-arch.h"
 
-extern __typeof (memcpy) __memcpy_ppc attribute_hidden;
-extern __typeof (memcpy) __memcpy_power4 attribute_hidden;
-extern __typeof (memcpy) __memcpy_cell attribute_hidden;
-extern __typeof (memcpy) __memcpy_power6 attribute_hidden;
-extern __typeof (memcpy) __memcpy_a2 attribute_hidden;
-extern __typeof (memcpy) __memcpy_power7 attribute_hidden;
+extern __typeof (__redirect_memcpy) __libc_memcpy;
 
-/* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle
-   ifunc symbol properly.  */
-libc_ifunc (memcpy,
+extern __typeof (__redirect_memcpy) __memcpy_ppc attribute_hidden;
+extern __typeof (__redirect_memcpy) __memcpy_power4 attribute_hidden;
+extern __typeof (__redirect_memcpy) __memcpy_cell attribute_hidden;
+extern __typeof (__redirect_memcpy) __memcpy_power6 attribute_hidden;
+extern __typeof (__redirect_memcpy) __memcpy_a2 attribute_hidden;
+extern __typeof (__redirect_memcpy) __memcpy_power7 attribute_hidden;
+
+libc_ifunc (__libc_memcpy,
             (hwcap & PPC_FEATURE_HAS_VSX)
             ? __memcpy_power7 :
              (hwcap & PPC_FEATURE_ARCH_2_06)
@@ -45,4 +48,8 @@ libc_ifunc (memcpy,
                    (hwcap & PPC_FEATURE_POWER4)
                    ? __memcpy_power4
             : __memcpy_ppc);
+
+#undef memcpy
+strong_alias (__libc_memcpy, memcpy);
+libc_hidden_ver (__libc_memcpy, memcpy);
 #endif
index 65b3afe25055db8799d0d92817a1f48bc3c84b9e..3601a77cd44344f6470f2ec2a56e086a7b1989c7 100644 (file)
@@ -47,8 +47,7 @@ END_GEN_TB (__bzero_ppc,TB_TOCLESS)
   END_2(__memset_ppc)
 
 # undef libc_hidden_builtin_def
-# define libc_hidden_builtin_def(name)                         \
-  .globl __GI_memset; __GI_memset = __memset_ppc
+# define libc_hidden_builtin_def(name)
 #endif
 
 /* Do not implement __bzero at powerpc64/memset.S.  */
index 829d12759a5eb1669208416563b4a9aae3acb92e..aa2ae7056e09d88cf314a2cfea1b4fa86285a2f6 100644 (file)
 
 /* Define multiple versions only for definition in libc.  */
 #if defined SHARED && !defined NOT_IN_libc
+/* Redefine memset so that the compiler won't complain about the type
+   mismatch with the IFUNC selector in strong_alias, below.  */
+# undef memset
+# define memset __redirect_memset
 # include <string.h>
 # include <shlib-compat.h>
 # include "init-arch.h"
 
-extern __typeof (memset) __memset_ppc attribute_hidden;
-extern __typeof (memset) __memset_power4 attribute_hidden;
-extern __typeof (memset) __memset_power6 attribute_hidden;
-extern __typeof (memset) __memset_power7 attribute_hidden;
+extern __typeof (__redirect_memset) __libc_memset;
+
+extern __typeof (__redirect_memset) __memset_ppc attribute_hidden;
+extern __typeof (__redirect_memset) __memset_power4 attribute_hidden;
+extern __typeof (__redirect_memset) __memset_power6 attribute_hidden;
+extern __typeof (__redirect_memset) __memset_power7 attribute_hidden;
 
 /* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle
    ifunc symbol properly.  */
-libc_ifunc (memset,
+libc_ifunc (__libc_memset,
             (hwcap & PPC_FEATURE_HAS_VSX)
             ? __memset_power7 :
              (hwcap & PPC_FEATURE_ARCH_2_05)
@@ -37,4 +43,8 @@ libc_ifunc (memset,
                  (hwcap & PPC_FEATURE_POWER4)
                ? __memset_power4
             : __memset_ppc);
+
+#undef memset
+strong_alias (__libc_memset, memset);
+libc_hidden_ver (__libc_memset, memset);
 #endif
index efcc212d7f2ebe611406b36ef002a3f0f49d1c7d..a195e9a0c14f239cd8aca6784c14cffd12b66c16 100644 (file)
@@ -35,8 +35,7 @@
   END_2(__strlen_ppc)
 
 # undef libc_hidden_builtin_def
-# define libc_hidden_builtin_def(name)                         \
-    .globl __GI_strlen; __GI_strlen = __strlen_ppc
+# define libc_hidden_builtin_def(name)
 #endif
 
 #include <sysdeps/powerpc/powerpc64/strlen.S>
index 65746964434e602e4d7f1c4819c9d00e8aa5e9ff..d2c26e9a9c0fd4cfd6a08f6b5b7b81551cf718b2 100644 (file)
    <http://www.gnu.org/licenses/>.  */
 
 #if defined SHARED && !defined NOT_IN_libc
+/* Redefine strlen so that the compiler won't complain about the type
+   mismatch with the IFUNC selector in strong_alias, below.  */
+# undef strlen
+# define strlen __redirect_strlen
 # include <string.h>
 # include <shlib-compat.h>
 # include "init-arch.h"
 
-extern __typeof (strlen) __strlen_ppc attribute_hidden;
-extern __typeof (strlen) __strlen_power7 attribute_hidden;
+extern __typeof (__redirect_strlen) __libc_strlen;
 
-libc_ifunc (strlen,
+extern __typeof (__redirect_strlen) __strlen_ppc attribute_hidden;
+extern __typeof (__redirect_strlen) __strlen_power7 attribute_hidden;
+
+libc_ifunc (__libc_strlen,
             (hwcap & PPC_FEATURE_HAS_VSX)
             ? __strlen_power7
             : __strlen_ppc);
+
+#undef strlen
+strong_alias (__libc_strlen, strlen)
+libc_hidden_ver (__libc_strlen, strlen)
 #endif
This page took 0.119958 seconds and 5 git commands to generate.