mirror of
https://sourceware.org/git/glibc.git
synced 2025-12-24 17:51:17 +03:00
PowerPC: gettimeofday optimization by using IFUNC
This commit is contained in:
@@ -32,6 +32,16 @@ extern void *__vdso_get_tbfreq;
|
||||
|
||||
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 /* _LIBC_VDSO_H */
|
||||
|
||||
@@ -15,25 +15,49 @@
|
||||
License along with the GNU C Library; if not, see
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <stddef.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,
|
||||
putting it into *TV and *TZ. If TZ is NULL, *TZ is not filled.
|
||||
Returns 0 on success, -1 on errors. */
|
||||
# include <dl-vdso.h>
|
||||
# include <bits/libc-vdso.h>
|
||||
|
||||
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
|
||||
__gettimeofday (tv, tz)
|
||||
struct timeval *tv;
|
||||
struct timezone *tz;
|
||||
__gettimeofday (struct timeval *tv, struct timezone *tz)
|
||||
{
|
||||
return INLINE_VSYSCALL (gettimeofday, 2, tv, tz);
|
||||
return INLINE_SYSCALL (gettimeofday, 2, tv, tz);
|
||||
}
|
||||
libc_hidden_def (__gettimeofday)
|
||||
|
||||
#endif
|
||||
weak_alias (__gettimeofday, gettimeofday)
|
||||
libc_hidden_weak (gettimeofday)
|
||||
|
||||
Reference in New Issue
Block a user