This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: PowerPC: gettimeofday optimization by using IFUNC
- From: Adhemerval Zanella <azanella at linux dot vnet dot ibm dot com>
- To: libc-alpha at sourceware dot org
- Date: Wed, 27 Feb 2013 16:27:47 -0300
- Subject: Re: PowerPC: gettimeofday optimization by using IFUNC
- References: <5127C775.1050804@linux.vnet.ibm.com>
Ping.
On 02/22/2013 04:31 PM, Adhemerval Zanella wrote:
> Hi,
>
> This patch make gettimeofday uses IFUNC and optimizing its call by avoid
> the unnecessary way through glibc's internal __gettimeofday. Any tips,
> advices, comments?
>
>
> 2013-02-22 Adhemerval Zanella <azanella@linux.vnet.ibm.com>
>
> * sysdeps/unix/sysv/linux/powerpc/gettimeofday.c: Optimizing gettimeofday
> by using IFUNC.
> (gettimeofday_ifunc): Add IFUNC.
> (__gettimeofday_syscall): Sycall fallback when vDSO is not present.
> (__gettimeofday): Using SYSCALL directly in static mode.
>
> --
>
> diff --git a/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c b/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c
> index f607485..ee760b7 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c
> +++ b/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c
> @@ -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
> +
> +# 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_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
>
> -/* 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 <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)