mirror of
https://sourceware.org/git/glibc.git
synced 2025-01-03 16:21:06 +00:00
PowerPC: gettimeofday optimization by using IFUNC
This commit is contained in:
parent
8cfdb7e056
commit
ef26eece63
@ -1,3 +1,10 @@
|
|||||||
|
2013-03-15 Adhemerval Zanella <azanella@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/powerpc/bits/libc-vdso.h (VDSO_IFUNC_RET): Add
|
||||||
|
macro to return vdso values correctly in IFUNC implementations.
|
||||||
|
* sysdeps/unix/sysv/linux/powerpc/gettimeofday.c (__gettimeofday):
|
||||||
|
Optimization by using IFUNC.
|
||||||
|
|
||||||
2013-03-15 Siddhesh Poyarekar <siddhesh@redhat.com>
|
2013-03-15 Siddhesh Poyarekar <siddhesh@redhat.com>
|
||||||
Richard Henderson <rth@redhat.com>
|
Richard Henderson <rth@redhat.com>
|
||||||
Tulio Magno Quites Machado Filho <tuliom@linux.vnet.ibm.com>
|
Tulio Magno Quites Machado Filho <tuliom@linux.vnet.ibm.com>
|
||||||
|
42
sysdeps/gnu/configure
vendored
42
sysdeps/gnu/configure
vendored
@ -1,42 +0,0 @@
|
|||||||
# This file is generated from configure.in by Autoconf. DO NOT EDIT!
|
|
||||||
|
|
||||||
# Local configure fragment for sysdeps/gnu.
|
|
||||||
|
|
||||||
# The Filesystem Hierarchy Standard prescribes where to place "essential"
|
|
||||||
# files. I.e., when the installation prefix is "/usr" we have to place
|
|
||||||
# shared library objects and the configuration files on the root partition
|
|
||||||
# in /lib and /etc.
|
|
||||||
case "$prefix" in
|
|
||||||
/usr | /usr/)
|
|
||||||
# 64-bit libraries on bi-arch platforms go in /lib64 instead of /lib.
|
|
||||||
# Allow earlier configure scripts to handle libc_cv_slibdir, libdir,
|
|
||||||
# and libc_cv_localedir.
|
|
||||||
test -n "$libc_cv_slibdir" || \
|
|
||||||
case $machine in
|
|
||||||
sparc/sparc64 | x86_64* | powerpc/powerpc64 | s390/s390-64)
|
|
||||||
libc_cv_slibdir=/lib64
|
|
||||||
if test "$libdir" = '${exec_prefix}/lib'; then
|
|
||||||
libdir='${exec_prefix}/lib64';
|
|
||||||
# Locale data can be shared between 32bit and 64bit libraries
|
|
||||||
libc_cv_localedir='${exec_prefix}/lib/locale'
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
libc_cv_slibdir=/lib
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
# Allow the user to override the path with --sysconfdir.
|
|
||||||
if test "$sysconfdir" = '${prefix}/etc'; then
|
|
||||||
libc_cv_sysconfdir=/etc
|
|
||||||
else
|
|
||||||
libc_cv_sysconfdir=$sysconfdir
|
|
||||||
fi
|
|
||||||
# Allow the user to override the path with --localstatedir.
|
|
||||||
if test "$localstatedir" = '${prefix}/var'; then
|
|
||||||
libc_cv_localstatedir=/var
|
|
||||||
else
|
|
||||||
libc_cv_localstatedir=$localstatedir
|
|
||||||
fi
|
|
||||||
libc_cv_rootsbindir=/sbin
|
|
||||||
;;
|
|
||||||
esac
|
|
@ -32,6 +32,16 @@ extern void *__vdso_get_tbfreq;
|
|||||||
|
|
||||||
extern void *__vdso_getcpu;
|
extern void *__vdso_getcpu;
|
||||||
|
|
||||||
|
/* This macro is needed for PPC64 to return a skeleton OPD entry of a vDSO
|
||||||
|
symbol. This works because _dl_vdso_vsym always return the function
|
||||||
|
address, and no vDSO symbols use the TOC or chain pointers from the OPD
|
||||||
|
so we can allow them to be garbage. */
|
||||||
|
#if defined(__PPC64__) || defined(__powerpc64__)
|
||||||
|
#define VDSO_IFUNC_RET(value) &value
|
||||||
|
#else
|
||||||
|
#define VDSO_IFUNC_RET(value) value
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* _LIBC_VDSO_H */
|
#endif /* _LIBC_VDSO_H */
|
||||||
|
@ -15,25 +15,49 @@
|
|||||||
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/>. */
|
||||||
|
|
||||||
#include <sysdep.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#include <time.h>
|
|
||||||
#include <hp-timing.h>
|
|
||||||
|
|
||||||
#include <bits/libc-vdso.h>
|
#ifdef SHARED
|
||||||
|
|
||||||
/* Get the current time of day and timezone information,
|
# include <dl-vdso.h>
|
||||||
putting it into *TV and *TZ. If TZ is NULL, *TZ is not filled.
|
# include <bits/libc-vdso.h>
|
||||||
Returns 0 on success, -1 on errors. */
|
|
||||||
|
void *gettimeofday_ifunc (void) __asm__ ("__gettimeofday");
|
||||||
|
|
||||||
|
static int
|
||||||
|
__gettimeofday_syscall (struct timeval *tv, struct timezone *tz)
|
||||||
|
{
|
||||||
|
return INLINE_SYSCALL (gettimeofday, 2, tv, tz);
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
gettimeofday_ifunc (void)
|
||||||
|
{
|
||||||
|
/* If the vDSO is not available we fall back syscall. */
|
||||||
|
return (__vdso_gettimeofday ? VDSO_IFUNC_RET (__vdso_gettimeofday)
|
||||||
|
: __gettimeofday_syscall);
|
||||||
|
}
|
||||||
|
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\n"
|
||||||
|
"__GI___gettimeofday = __gettimeofday");
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
# include <sysdep.h>
|
||||||
|
# include <errno.h>
|
||||||
|
|
||||||
int
|
int
|
||||||
__gettimeofday (tv, tz)
|
__gettimeofday (struct timeval *tv, struct timezone *tz)
|
||||||
struct timeval *tv;
|
|
||||||
struct timezone *tz;
|
|
||||||
{
|
{
|
||||||
return INLINE_VSYSCALL (gettimeofday, 2, tv, tz);
|
return INLINE_SYSCALL (gettimeofday, 2, tv, tz);
|
||||||
}
|
}
|
||||||
libc_hidden_def (__gettimeofday)
|
libc_hidden_def (__gettimeofday)
|
||||||
|
|
||||||
|
#endif
|
||||||
weak_alias (__gettimeofday, gettimeofday)
|
weak_alias (__gettimeofday, gettimeofday)
|
||||||
libc_hidden_weak (gettimeofday)
|
libc_hidden_weak (gettimeofday)
|
||||||
|
Loading…
Reference in New Issue
Block a user