public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
From: Stefan Liebler <stli@linux.vnet.ibm.com>
To: libc-alpha@sourceware.org
Cc: stli@linux.vnet.ibm.com, fweimer@redhat.com,
	murphyp@linux.vnet.ibm.com, schwab@linux-m68k.org,
	joseph_myers@mentor.com
Subject: [PATCH v3 5/9] ppc: Use libc_ifunc macro for time, gettimeofday.
Date: Wed, 24 Aug 2016 14:05:00 -0000	[thread overview]
Message-ID: <1472047472-30307-5-git-send-email-stli@linux.vnet.ibm.com> (raw)
In-Reply-To: <1472047472-30307-1-git-send-email-stli@linux.vnet.ibm.com>

This patch uses the libc_ifunc_hidden macro to create already existing ifunc functions
time and gettimeofday on power. This way, the libc_hidden_def macro can be used
instead of inline assemblies.
On ppc32, the __GI_* symbols do not target the ifunc symbol and thus the
redirection construct has to be applied here.

ChangeLog:

	* sysdeps/unix/sysv/linux/powerpc/gettimeofday.c (__gettimeofday):
	Use libc_ifunc_hidden and libc_hidden_def macro. Redirect ifunced function
	in header for using it as type for ifunc function because __GI_* symbols
	for ppc32 do not target the ifunc symbols.
	* sysdeps/unix/sysv/linux/powerpc/time.c (time): Likewise.
---
 sysdeps/unix/sysv/linux/powerpc/gettimeofday.c | 60 ++++++++++++-----------
 sysdeps/unix/sysv/linux/powerpc/time.c         | 67 +++++++++++++-------------
 2 files changed, 65 insertions(+), 62 deletions(-)

diff --git a/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c b/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c
index 25a4e7c..16c00d7 100644
--- a/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c
+++ b/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c
@@ -15,6 +15,11 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#if defined SHARED && !defined __powerpc64__
+# define __gettimeofday __redirect___gettimeofday
+#else
+# define __redirect___gettimeofday __gettimeofday
+#endif
 
 #include <sys/time.h>
 
@@ -24,30 +29,14 @@
 # include <libc-vdso.h>
 # include <dl-machine.h>
 
-void *gettimeofday_ifunc (void) __asm__ ("__gettimeofday");
-
-static int
-__gettimeofday_syscall (struct timeval *tv, struct timezone *tz)
-{
-  return INLINE_SYSCALL (gettimeofday, 2, tv, tz);
-}
+# ifndef __powerpc64__
+#  undef __gettimeofday
 
-void *
-gettimeofday_ifunc (void)
+int
+__gettimeofday_vsyscall (struct timeval *tv, struct timezone *tz)
 {
-  PREPARE_VERSION (linux2615, "LINUX_2.6.15", 123718565);
-
-  /* If the vDSO is not available we fall back syscall.  */
-  void *vdso_gettimeofday = _dl_vdso_vsym ("__kernel_gettimeofday", &linux2615);
-  return (vdso_gettimeofday ? VDSO_IFUNC_RET (vdso_gettimeofday)
-	  : (void*)__gettimeofday_syscall);
+  return INLINE_VSYSCALL (gettimeofday, 2, tv, tz);
 }
-asm (".type __gettimeofday, %gnu_indirect_function");
-
-/* This is doing "libc_hidden_def (__gettimeofday)" but the compiler won't
-   let us do it in C because it doesn't know we're defining __gettimeofday
-   here in this file.  */
-asm (".globl __GI___gettimeofday");
 
 /* __GI___gettimeofday is defined as hidden and for ppc32 it enables the
    compiler make a local call (symbol@local) for internal GLIBC usage. It
@@ -55,16 +44,29 @@ asm (".globl __GI___gettimeofday");
    For ppc64 a call to a function in another translation unit might use a
    different toc pointer thus disallowing direct branchess and making internal
    ifuncs calls safe.  */
-#ifdef __powerpc64__
-asm ("__GI___gettimeofday = __gettimeofday");
-#else
-int
-__gettimeofday_vsyscall (struct timeval *tv, struct timezone *tz)
+#  undef libc_hidden_def
+#  define libc_hidden_def(name)					\
+  __hidden_ver1 (__gettimeofday_vsyscall, __GI___gettimeofday,	\
+	       __gettimeofday_vsyscall);
+
+# endif /* !__powerpc64__  */
+
+static int
+__gettimeofday_syscall (struct timeval *tv, struct timezone *tz)
 {
-  return INLINE_VSYSCALL (gettimeofday, 2, tv, tz);
+  return INLINE_SYSCALL (gettimeofday, 2, tv, tz);
 }
-asm ("__GI___gettimeofday = __gettimeofday_vsyscall");
-#endif
+
+# define INIT_ARCH()							\
+  PREPARE_VERSION (linux2615, "LINUX_2.6.15", 123718565);		\
+  void *vdso_gettimeofday = _dl_vdso_vsym ("__kernel_gettimeofday", &linux2615);
+
+/* If the vDSO is not available we fall back syscall.  */
+libc_ifunc_hidden (__redirect___gettimeofday, __gettimeofday,
+		   vdso_gettimeofday
+		   ? VDSO_IFUNC_RET (vdso_gettimeofday)
+		   : (void *) __gettimeofday_syscall);
+libc_hidden_def (__gettimeofday)
 
 #else
 
diff --git a/sysdeps/unix/sysv/linux/powerpc/time.c b/sysdeps/unix/sysv/linux/powerpc/time.c
index 7973419..3da0b66 100644
--- a/sysdeps/unix/sysv/linux/powerpc/time.c
+++ b/sysdeps/unix/sysv/linux/powerpc/time.c
@@ -17,6 +17,11 @@
    <http://www.gnu.org/licenses/>.  */
 
 #ifdef SHARED
+# ifndef __powerpc64__
+#  define time __redirect_time
+# else
+#  define __redirect_time time
+# endif
 
 # include <time.h>
 # include <sysdep.h>
@@ -24,7 +29,26 @@
 # include <libc-vdso.h>
 # include <dl-machine.h>
 
-void *time_ifunc (void) asm ("time");
+# ifndef __powerpc64__
+#  undef time
+
+time_t
+__time_vsyscall (time_t *t)
+{
+  return INLINE_VSYSCALL (time, 1, t);
+}
+
+/* __GI_time is defined as hidden and for ppc32 it enables the
+   compiler make a local call (symbol@local) for internal GLIBC usage. It
+   means the PLT won't be used and the ifunc resolver will be called directly.
+   For ppc64 a call to a function in another translation unit might use a
+   different toc pointer thus disallowing direct branchess and making internal
+   ifuncs calls safe.  */
+#  undef libc_hidden_def
+#  define libc_hidden_def(name)					\
+  __hidden_ver1 (__time_vsyscall, __GI_time, __time_vsyscall);
+
+# endif /* !__powerpc64__  */
 
 static time_t
 time_syscall (time_t *t)
@@ -42,42 +66,19 @@ time_syscall (time_t *t)
   return result;
 }
 
-void *
-time_ifunc (void)
-{
-  PREPARE_VERSION (linux2615, "LINUX_2.6.15", 123718565);
-
-  /* If the vDSO is not available we fall back to the syscall.  */
+# define INIT_ARCH()							\
+  PREPARE_VERSION (linux2615, "LINUX_2.6.15", 123718565);		\
   void *vdso_time = _dl_vdso_vsym ("__kernel_time", &linux2615);
-  return (vdso_time ? VDSO_IFUNC_RET (vdso_time)
-	  : (void*)time_syscall);
-}
-asm (".type time, %gnu_indirect_function");
 
-/* This is doing "libc_hidden_def (time)" but the compiler won't
- * let us do it in C because it doesn't know we're defining time
- * here in this file.  */
-asm (".globl __GI_time");
-
-/* __GI_time is defined as hidden and for ppc32 it enables the
-   compiler make a local call (symbol@local) for internal GLIBC usage. It
-   means the PLT won't be used and the ifunc resolver will be called directly.
-   For ppc64 a call to a function in another translation unit might use a
-   different toc pointer thus disallowing direct branchess and making internal
-   ifuncs calls safe.  */
-#ifdef __powerpc64__
-asm ("__GI_time = time");
-#else
-time_t
-__time_vsyscall (time_t *t)
-{
-  return INLINE_VSYSCALL (time, 1, t);
-}
-asm ("__GI_time = __time_vsyscall");
-#endif
+/* If the vDSO is not available we fall back to the syscall.  */
+libc_ifunc_hidden (__redirect_time, time,
+		   vdso_time
+		   ? VDSO_IFUNC_RET (vdso_time)
+		   : (void *) time_syscall);
+libc_hidden_def (time)
 
 #else
 
 #include <sysdeps/posix/time.c>
 
-#endif
+#endif /* !SHARED */
-- 
2.3.0

  parent reply	other threads:[~2016-08-24 14:05 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-08-24 14:05 [PATCH v3 1/9] Add configure check to test if gcc supports attribute ifunc Stefan Liebler
2016-08-24 14:05 ` [PATCH v3 3/9] s390: Refactor ifunc resolvers due to false debuginfo Stefan Liebler
2016-08-30 12:31   ` Florian Weimer
2016-08-30 14:12     ` Stefan Liebler
2016-08-24 14:05 ` [PATCH v3 2/9] Use gcc attribute ifunc in libc_ifunc macro instead of inline assembly " Stefan Liebler
2016-08-29 20:16   ` Paul E. Murphy
2016-08-30 14:12     ` Stefan Liebler
2016-09-29 18:38   ` Adhemerval Zanella
2016-09-30 13:45     ` Stefan Liebler
2016-10-04 13:14       ` Adhemerval Zanella
2016-08-24 14:05 ` [PATCH v3 6/9] Use libc_ifunc macro for clock_* symbols in librt Stefan Liebler
2016-08-30 12:39   ` Florian Weimer
2016-08-24 14:05 ` [PATCH v3 4/9] i386, x86: Use libc_ifunc macro for time, gettimeofday Stefan Liebler
2016-09-29 14:34   ` Andreas Schwab
2016-08-24 14:05 ` Stefan Liebler [this message]
2016-08-30 13:46   ` [PATCH v3 5/9] ppc: " Paul E. Murphy
2016-08-24 14:05 ` [PATCH v3 9/9] Use libc_ifunc macro for siglongjmp, longjmp in libpthread Stefan Liebler
2016-10-06 11:59   ` Florian Weimer
2016-08-24 14:05 ` [PATCH v3 8/9] Use libc_ifunc macro for vfork " Stefan Liebler
2016-08-30 12:40   ` Florian Weimer
2016-08-24 17:02 ` [PATCH v3 7/9] Use libc_ifunc macro for system " Stefan Liebler
2016-08-30 12:39   ` Florian Weimer
2016-08-29  9:34 ` [PATCH v3 1/9] Add configure check to test if gcc supports attribute ifunc Florian Weimer
2016-08-30 14:12   ` Stefan Liebler
2016-09-05  7:13 ` [PING][PATCH " Stefan Liebler
2016-09-29 13:50   ` Stefan Liebler
2016-10-07  9:19 ` [PATCH " Stefan Liebler

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1472047472-30307-5-git-send-email-stli@linux.vnet.ibm.com \
    --to=stli@linux.vnet.ibm.com \
    --cc=fweimer@redhat.com \
    --cc=joseph_myers@mentor.com \
    --cc=libc-alpha@sourceware.org \
    --cc=murphyp@linux.vnet.ibm.com \
    --cc=schwab@linux-m68k.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).