]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
i386, x86: Use libc_ifunc macro for time, gettimeofday.
authorStefan Liebler <stli@linux.vnet.ibm.com>
Fri, 7 Oct 2016 07:56:47 +0000 (09:56 +0200)
committerStefan Liebler <stli@linux.vnet.ibm.com>
Fri, 7 Oct 2016 08:12:42 +0000 (10:12 +0200)
This patch uses the libc_ifunc_hidden macro to create already existing ifunc functions
time and gettimeofday on intel. This way, the libc_hidden_def macro can be used
instead of the libc_ifunc_hidden_def one which was only used here. Thus the
macro is removed from libc-symbols.h.
On i386, the __GI_* symbols do not target the ifunc symbol and thus the
redirection construct has to be applied here.

ChangeLog:

* sysdeps/unix/sysv/linux/x86/gettimeofday.c (__gettimeofday):
Use libc_ifunc_hidden macro. Use libc_hidden_def instead of
libc_ifunc_hidden_def.
* sysdeps/unix/sysv/linux/x86/time.c (time): Likewise.
* sysdeps/unix/sysv/linux/i386/gettimeofday.c (__gettimeofday):
Redirect ifunced function in header for using it as type of ifunc'ed
function. Redefine libc_hidden_def to use fallback non ifunc'ed
function for __GI_* symbol.
* sysdeps/unix/sysv/linux/i386/time.c (time): Likewise.
* include/libc-symbols.h
(libc_ifunc_hidden_def, libc_ifunc_hidden_def1): Delete macro.

ChangeLog
include/libc-symbols.h
sysdeps/unix/sysv/linux/i386/gettimeofday.c
sysdeps/unix/sysv/linux/i386/time.c
sysdeps/unix/sysv/linux/x86/gettimeofday.c
sysdeps/unix/sysv/linux/x86/time.c

index 6069c23606d0a3ba8877bfc1f7fdf96f5a3f75a0..1378071b1f25aa316f500190507d738e8028067d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2016-10-07  Stefan Liebler  <stli@linux.vnet.ibm.com>
+
+       * sysdeps/unix/sysv/linux/x86/gettimeofday.c (__gettimeofday):
+       Use libc_ifunc_hidden macro. Use libc_hidden_def instead of
+       libc_ifunc_hidden_def.
+       * sysdeps/unix/sysv/linux/x86/time.c (time): Likewise.
+       * sysdeps/unix/sysv/linux/i386/gettimeofday.c (__gettimeofday):
+       Redirect ifunced function in header for using it as type of ifunc'ed
+       function. Redefine libc_hidden_def to use fallback non ifunc'ed
+       function for __GI_* symbol.
+       * sysdeps/unix/sysv/linux/i386/time.c (time): Likewise.
+       * include/libc-symbols.h
+       (libc_ifunc_hidden_def, libc_ifunc_hidden_def1): Delete macro.
+
 2016-10-07  Stefan Liebler  <stli@linux.vnet.ibm.com>
 
        [BZ #20478]
index 6ae309a1ba07446e3ffbfaf478c0439d9cfcd130..1c91f2e6a3eff656d040b31ba471c896fd9c9a22 100644 (file)
@@ -869,21 +869,6 @@ for linking")
 #define libm_ifunc(name, expr)                         \
   __ifunc (name, name, expr, void, libm_ifunc_init)
 
-#ifdef HAVE_ASM_SET_DIRECTIVE
-# define libc_ifunc_hidden_def1(local, name)                           \
-    __asm__ (".globl " #local "\n\t"                                   \
-            ".hidden " #local "\n\t"                                   \
-            ".set " #local ", " #name);
-#else
-# define libc_ifunc_hidden_def1(local, name)                           \
-    __asm__ (".globl " #local "\n\t"                                   \
-            ".hidden " #local "\n\t"                                   \
-            #local " = " #name);
-#endif
-
-#define libc_ifunc_hidden_def(name) \
-  libc_ifunc_hidden_def1 (__GI_##name, name)
-
 /* Add the compiler optimization to inhibit loop transformation to library
    calls.  This is used to avoid recursive calls in memset and memmove
    default implementations.  */
index 965bb81a4bb19baced057d87b17f93368938b63c..6ab12155191de648cf38423732a6865f1150c69b 100644 (file)
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifdef SHARED
+# define __gettimeofday __redirect___gettimeofday
+#endif
+
 #include <sys/time.h>
 
 #ifdef SHARED
+# undef __gettimeofday
+# define __gettimeofday_type __redirect___gettimeofday
 
-# undef libc_ifunc_hidden_def
-# define libc_ifunc_hidden_def(name)  \
-  libc_ifunc_hidden_def1 (__GI_##name, __gettimeofday_syscall)
-
+# undef libc_hidden_def
+# define libc_hidden_def(name) \
+  __hidden_ver1 (__gettimeofday_syscall, __GI___gettimeofday, \
+              __gettimeofday_syscall);
 #endif
 
 #include <sysdeps/unix/sysv/linux/x86/gettimeofday.c>
index 62b78b22dea2acae31ebe041b08adbd224816669..980a11828fcb1eb4d5160ee154d0d3175c50739c 100644 (file)
    <http://www.gnu.org/licenses/>.  */
 
 #ifdef SHARED
+# define time __redirect_time
+#endif
+
+#include <time.h>
+
+#ifdef SHARED
+# undef time
+# define time_type __redirect_time
 
-# undef libc_ifunc_hidden_def
-# define libc_ifunc_hidden_def(name)  \
-  libc_ifunc_hidden_def1 (__GI_##name, __time_syscall)
+# undef libc_hidden_def
+# define libc_hidden_def(name)  \
+  __hidden_ver1 (__time_syscall, __GI_time, __time_syscall);
 #endif
 
 #include <sysdeps/unix/sysv/linux/x86/time.c>
index 36f7c26ffb0e818709d032c605fec8c4bd22a14e..c82452f855bbdeacda522654fe454a096b4219e5 100644 (file)
@@ -29,20 +29,20 @@ __gettimeofday_syscall (struct timeval *tv, struct timezone *tz)
   return INLINE_SYSCALL (gettimeofday, 2, tv, tz);
 }
 
-void *gettimeofday_ifunc (void) __asm__ ("__gettimeofday");
-
-void *
-gettimeofday_ifunc (void)
-{
-  PREPARE_VERSION_KNOWN (linux26, LINUX_2_6);
-
-  /* If the vDSO is not available we fall back to syscall.  */
-  return (_dl_vdso_vsym ("__vdso_gettimeofday", &linux26)
-         ?: (void*) (&__gettimeofday_syscall));
-}
-asm (".type __gettimeofday, %gnu_indirect_function");
-
-libc_ifunc_hidden_def(__gettimeofday)
+# ifndef __gettimeofday_type
+/* The i386 gettimeofday.c includes this file with a defined
+   __gettimeofday_type macro.  For x86_64 we have to define it to __gettimeofday
+   as the internal symbol is the ifunc'ed one.  */
+#  define __gettimeofday_type __gettimeofday
+# endif
+
+# undef INIT_ARCH
+# define INIT_ARCH() PREPARE_VERSION_KNOWN (linux26, LINUX_2_6)
+/* If the vDSO is not available we fall back to syscall.  */
+libc_ifunc_hidden (__gettimeofday_type, __gettimeofday,
+                  (_dl_vdso_vsym ("__vdso_gettimeofday", &linux26)
+                   ?: &__gettimeofday_syscall))
+libc_hidden_def (__gettimeofday)
 
 #else
 
index f5f7f918c9e6bfabb1c16759f516aa6170baff24..a40fe3943d50702691647888e043beebf8c4a1f9 100644 (file)
@@ -30,20 +30,20 @@ __time_syscall (time_t *t)
   return INTERNAL_SYSCALL (time, err, 1, t);
 }
 
-void *time_ifunc (void) __asm__ ("time");
-
-void *
-time_ifunc (void)
-{
-  PREPARE_VERSION_KNOWN (linux26, LINUX_2_6);
-
+# ifndef time_type
+/* The i386 time.c includes this file with a defined time_type macro.
+   For x86_64 we have to define it to time as the internal symbol is the
+   ifunc'ed one.  */
+#  define time_type time
+# endif
+
+#undef INIT_ARCH
+#define INIT_ARCH() PREPARE_VERSION_KNOWN (linux26, LINUX_2_6);
 /* If the vDSO is not available we fall back on the syscall.  */
-  return _dl_vdso_vsym ("__vdso_time", &linux26)
-                       ?: (void*) &__time_syscall;
-}
-asm (".type time, %gnu_indirect_function");
-
-libc_ifunc_hidden_def(time)
+libc_ifunc_hidden (time_type, time,
+                  (_dl_vdso_vsym ("__vdso_time", &linux26)
+                   ?:  &__time_syscall))
+libc_hidden_def (time)
 
 #else