This breaks build on hppa64-hp-hpux11.11.  This target has clock_gettime
but it doesn't have CLOCK_MONOTONIC.  It has CLOCK_REALTIME.  I modified
timevar.cc as follows to restore build.

Dave
---

diff --git a/gcc/timevar.cc b/gcc/timevar.cc
index e12775e6ff3..412d9b62a8f 100644
--- a/gcc/timevar.cc
+++ b/gcc/timevar.cc
@@ -160,7 +160,11 @@ get_time (struct timevar_time_def *now)

 #ifdef HAVE_CLOCK_GETTIME
   struct timespec ts;
+#if _POSIX_TIMERS > 0 && defined(_POSIX_MONOTONIC_CLOCK)
   clock_gettime (CLOCK_MONOTONIC, &ts);
+#else
+  clock_gettime (CLOCK_REALTIME, &ts);
+#endif
   now->wall = ts.tv_sec * 1000000000 + ts.tv_nsec;
   return;
 #define HAVE_WALL_TIME 1

On Thu, Oct 31, 2024 at 10:05:29AM -0700, Andi Kleen wrote:
> > I'm getting a build failure:
> > 
> > timevar.cc:163: undefined reference to `clock_gettime'
> > 
> > Our frozen build tools are intended to produce binaries that work
> > "everywhere", so they're a few years old, but apparently something didn't
> > configure correctly.
> > 
> > I see that libbacktrace configure correctly detects that clock_gettime is
> > missing by default, but that it can be found in -lrt.
> > 
> > I'm investigating if I have a configuration problem on my end, but I think a
> > configure test might be appropriate in gcc/configure, something like the one
> > in the other subdirectories.
> 
> Here's a patch. I'll commit it as obvious unless someone complains.
> 
> 
>     Add autoconf check for clock_gettime
>     
>     Reported by Andrew Stubbs
>     
>     gcc/ChangeLog:
>     
>             * config.in: Regenerate.
>             * configure: Regenerate.
>             * configure.ac: Check for HAVE_CLOCK_GETTIME.
>             * timevar.cc (get_time): Use HAVE_CLOCK_GETTIME.
> 
> diff --git a/gcc/config.in b/gcc/config.in
> index 3fc4666d60b5..0a506d1783a4 100644
> --- a/gcc/config.in
> +++ b/gcc/config.in
> @@ -883,6 +883,12 @@
>  #endif
>  
>  
> +/* Define to 1 if you have the `clock_gettime' function. */
> +#ifndef USED_FOR_TARGET
> +#undef HAVE_CLOCK_GETTIME
> +#endif
> +
> +
>  /* Define if <time.h> defines clock_t. */
>  #ifndef USED_FOR_TARGET
>  #undef HAVE_CLOCK_T
> diff --git a/gcc/configure b/gcc/configure
> index 47c58036530f..150ab6164142 100755
> --- a/gcc/configure
> +++ b/gcc/configure
> @@ -10613,7 +10613,8 @@ fi
>  for ac_func in times clock kill getrlimit setrlimit atoq \
>       popen sysconf strsignal getrusage nl_langinfo \
>       gettimeofday mbstowcs wcswidth mmap posix_fallocate setlocale \
> -     clearerr_unlocked feof_unlocked   ferror_unlocked fflush_unlocked 
> fgetc_unlocked fgets_unlocked   fileno_unlocked fprintf_unlocked 
> fputc_unlocked fputs_unlocked   fread_unlocked fwrite_unlocked 
> getchar_unlocked getc_unlocked   putchar_unlocked putc_unlocked madvise 
> mallinfo mallinfo2 fstatat getauxval
> +     clearerr_unlocked feof_unlocked   ferror_unlocked fflush_unlocked 
> fgetc_unlocked fgets_unlocked   fileno_unlocked fprintf_unlocked 
> fputc_unlocked fputs_unlocked   fread_unlocked fwrite_unlocked 
> getchar_unlocked getc_unlocked   putchar_unlocked putc_unlocked madvise 
> mallinfo mallinfo2 fstatat getauxval \
> +     clock_gettime
>  do :
>    as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
>  ac_fn_cxx_check_func "$LINENO" "$ac_func" "$as_ac_var"
> @@ -10626,6 +10627,54 @@ fi
>  done
>  
>  
> +# At least for glibc, clock_gettime is in librt.  But don't pull that
> +# in if it still doesn't give us the function we want.
> +if test $ac_cv_func_clock_gettime = no; then
> +  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clock_gettime in 
> -lrt" >&5
> +$as_echo_n "checking for clock_gettime in -lrt... " >&6; }
> +if ${ac_cv_lib_rt_clock_gettime+:} false; then :
> +  $as_echo_n "(cached) " >&6
> +else
> +  ac_check_lib_save_LIBS=$LIBS
> +LIBS="-lrt  $LIBS"
> +cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> +/* end confdefs.h.  */
> +
> +/* Override any GCC internal prototype to avoid an error.
> +   Use char because int might match the return type of a GCC
> +   builtin and then its argument prototype would still apply.  */
> +#ifdef __cplusplus
> +extern "C"
> +#endif
> +char clock_gettime ();
> +int
> +main ()
> +{
> +return clock_gettime ();
> +  ;
> +  return 0;
> +}
> +_ACEOF
> +if ac_fn_cxx_try_link "$LINENO"; then :
> +  ac_cv_lib_rt_clock_gettime=yes
> +else
> +  ac_cv_lib_rt_clock_gettime=no
> +fi
> +rm -f core conftest.err conftest.$ac_objext \
> +    conftest$ac_exeext conftest.$ac_ext
> +LIBS=$ac_check_lib_save_LIBS
> +fi
> +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: 
> $ac_cv_lib_rt_clock_gettime" >&5
> +$as_echo "$ac_cv_lib_rt_clock_gettime" >&6; }
> +if test "x$ac_cv_lib_rt_clock_gettime" = xyes; then :
> +  LIBS="-lrt $LIBS"
> +
> +$as_echo "#define HAVE_CLOCK_GETTIME 1" >>confdefs.h
> +
> +fi
> +
> +fi
> +
>  if test x$ac_cv_func_mbstowcs = xyes; then
>    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mbstowcs works" 
> >&5
>  $as_echo_n "checking whether mbstowcs works... " >&6; }
> @@ -21405,7 +21454,7 @@ else
>    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
>    lt_status=$lt_dlunknown
>    cat > conftest.$ac_ext <<_LT_EOF
> -#line 21408 "configure"
> +#line 21457 "configure"
>  #include "confdefs.h"
>  
>  #if HAVE_DLFCN_H
> @@ -21511,7 +21560,7 @@ else
>    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
>    lt_status=$lt_dlunknown
>    cat > conftest.$ac_ext <<_LT_EOF
> -#line 21514 "configure"
> +#line 21563 "configure"
>  #include "confdefs.h"
>  
>  #if HAVE_DLFCN_H
> diff --git a/gcc/configure.ac b/gcc/configure.ac
> index dc8346a7b823..bdb22d53e2ca 100644
> --- a/gcc/configure.ac
> +++ b/gcc/configure.ac
> @@ -1557,7 +1557,17 @@ define(gcc_UNLOCKED_FUNCS, clearerr_unlocked 
> feof_unlocked dnl
>  AC_CHECK_FUNCS(times clock kill getrlimit setrlimit atoq \
>       popen sysconf strsignal getrusage nl_langinfo \
>       gettimeofday mbstowcs wcswidth mmap posix_fallocate setlocale \
> -     gcc_UNLOCKED_FUNCS madvise mallinfo mallinfo2 fstatat getauxval)
> +     gcc_UNLOCKED_FUNCS madvise mallinfo mallinfo2 fstatat getauxval \
> +     clock_gettime)
> +
> +# At least for glibc, clock_gettime is in librt.  But don't pull that
> +# in if it still doesn't give us the function we want.
> +if test $ac_cv_func_clock_gettime = no; then
> +  AC_CHECK_LIB(rt, clock_gettime,
> +    [LIBS="-lrt $LIBS"
> +     AC_DEFINE(HAVE_CLOCK_GETTIME, 1,
> +            [Define to 1 if you have the `clock_gettime' function.])])
> +fi
>  
>  if test x$ac_cv_func_mbstowcs = xyes; then
>    AC_CACHE_CHECK(whether mbstowcs works, gcc_cv_func_mbstowcs_works,
> diff --git a/gcc/timevar.cc b/gcc/timevar.cc
> index 4a57e74230d3..e12775e6ff3a 100644
> --- a/gcc/timevar.cc
> +++ b/gcc/timevar.cc
> @@ -158,7 +158,7 @@ get_time (struct timevar_time_def *now)
>    now->wall = 0;
>    now->ggc_mem = timevar_ggc_mem_total;
>  
> -#if _POSIX_C_SOURCE >= 199309L
> +#ifdef HAVE_CLOCK_GETTIME
>    struct timespec ts;
>    clock_gettime (CLOCK_MONOTONIC, &ts);
>    now->wall = ts.tv_sec * 1000000000 + ts.tv_nsec;

Attachment: signature.asc
Description: PGP signature

Reply via email to