This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: PowerPC: gettimeofday optimization by using IFUNC


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)


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]