From e23faea6aec97b75f7a7567350538c1c0dfc1cee Mon Sep 17 00:00:00 2001 From: Stefan Liebler Date: Fri, 7 Oct 2016 09:56:47 +0200 Subject: 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 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. --- sysdeps/unix/sysv/linux/x86/gettimeofday.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) (limited to 'sysdeps/unix/sysv/linux/x86/gettimeofday.c') diff --git a/sysdeps/unix/sysv/linux/x86/gettimeofday.c b/sysdeps/unix/sysv/linux/x86/gettimeofday.c index 36f7c26ffb..c82452f855 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 __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 -- cgit 1.4.1