1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-08-01 10:06:57 +03:00

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.
This commit is contained in:
Stefan Liebler
2016-10-07 09:56:47 +02:00
parent 18d6c45e12
commit e23faea6ae
6 changed files with 60 additions and 47 deletions

View File

@ -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> 2016-10-07 Stefan Liebler <stli@linux.vnet.ibm.com>
[BZ #20478] [BZ #20478]

View File

@ -869,21 +869,6 @@ for linking")
#define libm_ifunc(name, expr) \ #define libm_ifunc(name, expr) \
__ifunc (name, name, expr, void, libm_ifunc_init) __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 /* Add the compiler optimization to inhibit loop transformation to library
calls. This is used to avoid recursive calls in memset and memmove calls. This is used to avoid recursive calls in memset and memmove
default implementations. */ default implementations. */

View File

@ -16,14 +16,20 @@
License along with the GNU C Library; if not, see License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#ifdef SHARED
# define __gettimeofday __redirect___gettimeofday
#endif
#include <sys/time.h> #include <sys/time.h>
#ifdef SHARED #ifdef SHARED
# undef __gettimeofday
# define __gettimeofday_type __redirect___gettimeofday
# undef libc_ifunc_hidden_def # undef libc_hidden_def
# define libc_ifunc_hidden_def(name) \ # define libc_hidden_def(name) \
libc_ifunc_hidden_def1 (__GI_##name, __gettimeofday_syscall) __hidden_ver1 (__gettimeofday_syscall, __GI___gettimeofday, \
__gettimeofday_syscall);
#endif #endif
#include <sysdeps/unix/sysv/linux/x86/gettimeofday.c> #include <sysdeps/unix/sysv/linux/x86/gettimeofday.c>

View File

@ -17,10 +17,18 @@
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#ifdef SHARED #ifdef SHARED
# define time __redirect_time
#endif
# undef libc_ifunc_hidden_def #include <time.h>
# define libc_ifunc_hidden_def(name) \
libc_ifunc_hidden_def1 (__GI_##name, __time_syscall) #ifdef SHARED
# undef time
# define time_type __redirect_time
# undef libc_hidden_def
# define libc_hidden_def(name) \
__hidden_ver1 (__time_syscall, __GI_time, __time_syscall);
#endif #endif
#include <sysdeps/unix/sysv/linux/x86/time.c> #include <sysdeps/unix/sysv/linux/x86/time.c>

View File

@ -29,20 +29,20 @@ __gettimeofday_syscall (struct timeval *tv, struct timezone *tz)
return INLINE_SYSCALL (gettimeofday, 2, tv, tz); return INLINE_SYSCALL (gettimeofday, 2, tv, tz);
} }
void *gettimeofday_ifunc (void) __asm__ ("__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
void * # undef INIT_ARCH
gettimeofday_ifunc (void) # define INIT_ARCH() PREPARE_VERSION_KNOWN (linux26, LINUX_2_6)
{ /* If the vDSO is not available we fall back to syscall. */
PREPARE_VERSION_KNOWN (linux26, LINUX_2_6); libc_ifunc_hidden (__gettimeofday_type, __gettimeofday,
(_dl_vdso_vsym ("__vdso_gettimeofday", &linux26)
/* If the vDSO is not available we fall back to syscall. */ ?: &__gettimeofday_syscall))
return (_dl_vdso_vsym ("__vdso_gettimeofday", &linux26) libc_hidden_def (__gettimeofday)
?: (void*) (&__gettimeofday_syscall));
}
asm (".type __gettimeofday, %gnu_indirect_function");
libc_ifunc_hidden_def(__gettimeofday)
#else #else

View File

@ -30,20 +30,20 @@ __time_syscall (time_t *t)
return INTERNAL_SYSCALL (time, err, 1, t); return INTERNAL_SYSCALL (time, err, 1, t);
} }
void *time_ifunc (void) __asm__ ("time"); # ifndef time_type
/* The i386 time.c includes this file with a defined time_type macro.
void * For x86_64 we have to define it to time as the internal symbol is the
time_ifunc (void) ifunc'ed one. */
{ # define time_type time
PREPARE_VERSION_KNOWN (linux26, LINUX_2_6); # 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. */ /* If the vDSO is not available we fall back on the syscall. */
return _dl_vdso_vsym ("__vdso_time", &linux26) libc_ifunc_hidden (time_type, time,
?: (void*) &__time_syscall; (_dl_vdso_vsym ("__vdso_time", &linux26)
} ?: &__time_syscall))
asm (".type time, %gnu_indirect_function"); libc_hidden_def (time)
libc_ifunc_hidden_def(time)
#else #else