This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH 3/8] i386, x86: Use libc_ifunc macro for time, gettimeofday.
- From: Stefan Liebler <stli at linux dot vnet dot ibm dot com>
- To: libc-alpha at sourceware dot org
- Date: Mon, 4 Jul 2016 15:45:09 +0200
- Subject: Re: [PATCH 3/8] i386, x86: Use libc_ifunc macro for time, gettimeofday.
- Authentication-results: sourceware.org; auth=none
- References: <1466682952-6301-1-git-send-email-stli@linux.vnet.ibm.com> <1466682952-6301-3-git-send-email-stli@linux.vnet.ibm.com> <f04bfe8f-0849-1813-a020-94ddf14c89a4@redhat.com>
On 07/04/2016 10:54 AM, Florian Weimer wrote:
On 06/23/2016 01:55 PM, Stefan Liebler wrote:
This patch uses the libc_ifunc 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.
I'm not sure if I understand what is going on here.
sysdeps/unix/sysv/linux/x86/gettimeofday.c is compiled straight for
x86_64, but wrapped on i386, right?
Yes you are right, e.g. ...:
-x86_64 compiles sysdeps/unix/sysv/linux/x86/gettimeofday.c
-i686 compiles sysdeps/unix/sysv/linux/i386/gettimeofday.c
I wonder if it possible to avoid some of the preprocessor magic by
introducing a separate x86_64 file.
Do you mean moving x86/gettimeofday.c to x86_64/gettimeofday.c
and get rid of #include <sysdeps/unix/sysv/linux/x86/gettimeofday.c>?
I think it won't save much of the preprocessor stuff.
The redirection of __gettimeofday in sys/time.h and the redifinition of
libc_hidden_def are needed.
We can only save the define/undef __gettimeofday around inclusion of
x86/gettimeofday.c. But then we have to duplicate the code.
In file sysdeps/unix/sysv/linux/i386/time.c we can't save anything.
Thanks,
Florian
The attached patch only updates the typo in ChangeLog.
>From a8ea51a141f137447a6a483cb820bcc12b265675 Mon Sep 17 00:00:00 2001
From: Stefan Liebler <stli@linux.vnet.ibm.com>
Date: Mon, 4 Jul 2016 15:33:56 +0200
Subject: [PATCH 3/8] i386, x86: Use libc_ifunc macro for time, gettimeofday.
This patch uses the libc_ifunc 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 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 and create a copy of the prototype
for using as ifunc function. Add appropriate aliases to the real symbol
names.
* 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 | 19 ++++++++++++++++---
sysdeps/unix/sysv/linux/i386/time.c | 15 ++++++++++++---
sysdeps/unix/sysv/linux/x86/gettimeofday.c | 20 ++++++--------------
sysdeps/unix/sysv/linux/x86/time.c | 18 +++++-------------
5 files changed, 39 insertions(+), 48 deletions(-)
diff --git a/include/libc-symbols.h b/include/libc-symbols.h
index 5938eae..b0ea8f4 100644
--- a/include/libc-symbols.h
+++ b/include/libc-symbols.h
@@ -730,21 +730,6 @@ for linking")
#define libm_ifunc_init()
#define libm_ifunc(name, expr) __ifunc (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..fc6cfdd 100644
--- a/sysdeps/unix/sysv/linux/i386/gettimeofday.c
+++ b/sysdeps/unix/sysv/linux/i386/gettimeofday.c
@@ -16,14 +16,27 @@
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
-# undef libc_ifunc_hidden_def
-# define libc_ifunc_hidden_def(name) \
- libc_ifunc_hidden_def1 (__GI_##name, __gettimeofday_syscall)
+extern __typeof (__redirect___gettimeofday) __libc___gettimeofday;
+# define __gettimeofday __libc___gettimeofday
+# 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>
+
+#ifdef SHARED
+# undef __gettimeofday
+strong_alias (__libc___gettimeofday, __gettimeofday)
+#endif
diff --git a/sysdeps/unix/sysv/linux/i386/time.c b/sysdeps/unix/sysv/linux/i386/time.c
index 62b78b2..bacbf84 100644
--- a/sysdeps/unix/sysv/linux/i386/time.c
+++ b/sysdeps/unix/sysv/linux/i386/time.c
@@ -17,10 +17,19 @@
<http://www.gnu.org/licenses/>. */
#ifdef SHARED
+# define time __redirect_time
+#endif
+
+#include <time.h>
+
+#ifdef SHARED
+# undef time
+
+extern __typeof (__redirect_time) 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..02f8d6e 100644
--- a/sysdeps/unix/sysv/linux/x86/gettimeofday.c
+++ b/sysdeps/unix/sysv/linux/x86/gettimeofday.c
@@ -29,20 +29,12 @@ __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)
+# 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 (__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..957d586 100644
--- a/sysdeps/unix/sysv/linux/x86/time.c
+++ b/sysdeps/unix/sysv/linux/x86/time.c
@@ -30,20 +30,12 @@ __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);
-
+#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 (time, (_dl_vdso_vsym ("__vdso_time", &linux26)
+ ?: &__time_syscall))
+libc_hidden_def (time)
#else
--
2.3.0