[3/8] i386, x86: Use libc_ifunc macro for time, gettimeofday.

Message ID fb7211b4-1481-1825-0e44-0a2fd4a9e3e6@linux.vnet.ibm.com
State Superseded
Headers

Commit Message

Stefan Liebler Aug. 5, 2016, 6:46 a.m. UTC
  This is an updated version due to changes in the first patch with 
libc_ifunc fallback if gcc does not support gcc attribute ifunc.
  

Comments

Andreas Schwab Aug. 5, 2016, 8:38 a.m. UTC | #1
On Fr, Aug 05 2016, Stefan Liebler <stli@linux.vnet.ibm.com> wrote:

> diff --git a/sysdeps/unix/sysv/linux/i386/gettimeofday.c b/sysdeps/unix/sysv/linux/i386/gettimeofday.c
> index 965bb81..cbf7833 100644
> --- a/sysdeps/unix/sysv/linux/i386/gettimeofday.c
> +++ b/sysdeps/unix/sysv/linux/i386/gettimeofday.c
> @@ -16,14 +16,20 @@
>     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 redirection __redirect___gettimeofday

Please use a more specific name for this macro.

Andreas.
  
Stefan Liebler Aug. 8, 2016, 2:46 p.m. UTC | #2
On 08/05/2016 10:38 AM, Andreas Schwab wrote:
> On Fr, Aug 05 2016, Stefan Liebler <stli@linux.vnet.ibm.com> wrote:
>
>> diff --git a/sysdeps/unix/sysv/linux/i386/gettimeofday.c b/sysdeps/unix/sysv/linux/i386/gettimeofday.c
>> index 965bb81..cbf7833 100644
>> --- a/sysdeps/unix/sysv/linux/i386/gettimeofday.c
>> +++ b/sysdeps/unix/sysv/linux/i386/gettimeofday.c
>> @@ -16,14 +16,20 @@
>>     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 redirection __redirect___gettimeofday
>
> Please use a more specific name for this macro.
>
> Andreas.
>
Okay. Renamed to time_type and __gettimeofday_type.
I've posted the whole series again. See follow-up thread:

"[PATCH v2 4/9] i386, x86: Use libc_ifunc macro for time, gettimeofday."
https://www.sourceware.org/ml/libc-alpha/2016-08/msg00257.html
  

Patch

From 72ee959cd28ed906cb8f35283ba2bd091995728b Mon Sep 17 00:00:00 2001
From: Stefan Liebler <stli@linux.vnet.ibm.com>
Date: Thu, 4 Aug 2016 18:46:23 +0200
Subject: [PATCH 3/8] i386, x86: Use libc_ifunc macro for time, gettimeofday.

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.
	(redirection): New define.
	* sysdeps/unix/sysv/linux/i386/time.c (time): Likewise.
	* include/libc-symbols.h
	(libc_ifunc_hidden_def, libc_ifunc_hidden_def1): Delete macro.
---
 include/libc-symbols.h                      | 15 ---------------
 sysdeps/unix/sysv/linux/i386/gettimeofday.c | 14 ++++++++++----
 sysdeps/unix/sysv/linux/i386/time.c         | 14 +++++++++++---
 sysdeps/unix/sysv/linux/x86/gettimeofday.c  | 28 ++++++++++++++--------------
 sysdeps/unix/sysv/linux/x86/time.c          | 26 +++++++++++++-------------
 5 files changed, 48 insertions(+), 49 deletions(-)

diff --git a/include/libc-symbols.h b/include/libc-symbols.h
index db6aba2..4c59404 100644
--- a/include/libc-symbols.h
+++ b/include/libc-symbols.h
@@ -772,21 +772,6 @@  for linking")
 #define libm_ifunc_init()
 #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.  */
diff --git a/sysdeps/unix/sysv/linux/i386/gettimeofday.c b/sysdeps/unix/sysv/linux/i386/gettimeofday.c
index 965bb81..cbf7833 100644
--- a/sysdeps/unix/sysv/linux/i386/gettimeofday.c
+++ b/sysdeps/unix/sysv/linux/i386/gettimeofday.c
@@ -16,14 +16,20 @@ 
    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 redirection __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>
diff --git a/sysdeps/unix/sysv/linux/i386/time.c b/sysdeps/unix/sysv/linux/i386/time.c
index 62b78b2..c1c0cbd 100644
--- a/sysdeps/unix/sysv/linux/i386/time.c
+++ b/sysdeps/unix/sysv/linux/i386/time.c
@@ -17,10 +17,18 @@ 
    <http://www.gnu.org/licenses/>.  */
 
 #ifdef SHARED
+# define time __redirect_time
+#endif
+
+#include <time.h>
+
+#ifdef SHARED
+# undef time
+# define redirection __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>
diff --git a/sysdeps/unix/sysv/linux/x86/gettimeofday.c b/sysdeps/unix/sysv/linux/x86/gettimeofday.c
index 36f7c26..4e53801 100644
--- a/sysdeps/unix/sysv/linux/x86/gettimeofday.c
+++ b/sysdeps/unix/sysv/linux/x86/gettimeofday.c
@@ -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 redirection
+/* The i386 gettimeofday.c includes this file with a defined redirection.
+   For x86_64 we have to define it to __gettimeofday as the internal symbol is
+   the ifunc'ed one.  */
+#  define redirection __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 (redirection, __gettimeofday,
+		   (_dl_vdso_vsym ("__vdso_gettimeofday", &linux26)
+		    ?: &__gettimeofday_syscall))
+libc_hidden_def (__gettimeofday)
 
 #else
 
diff --git a/sysdeps/unix/sysv/linux/x86/time.c b/sysdeps/unix/sysv/linux/x86/time.c
index f5f7f91..88ee750 100644
--- a/sysdeps/unix/sysv/linux/x86/time.c
+++ b/sysdeps/unix/sysv/linux/x86/time.c
@@ -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 redirection
+/* The i386 time.c includes this file with a defined redirection.
+   For x86_64 we have to define it to time as the internal symbol is the
+   ifunc'ed one.  */
+#  define redirection 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 (redirection, time,
+		   (_dl_vdso_vsym ("__vdso_time", &linux26)
+		    ?:  &__time_syscall))
+libc_hidden_def (time)
 
 #else
 
-- 
2.3.0