This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


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

timevar ifdef deforestation


timevar.c uses a complex series of #ifdefs to figure out which of
times, getrusage, and clock to use to get timing information, and what
additional declarations may be necessary.  This patch replaces all
that with some straightforward autoconf probes and a very few
declarations provided if not already available.

With this and the patch to use gstab.h always, there is only one
remaining use of #ifdef USG, in tsystem.h.  I'll be patching that out
after these two go in.

Bootstrapping now, i686-linux, mainline, Java turned off.

zw

	* configure.in: Probe for times, clock, struct tms, and clock_t.
	* configure, config.in: Regenerate.
	* timevar.c: Replace ifdef forest in get_time with
	(relatively) straightforward series of checks based on
	autoconf's probes.

===================================================================
Index: configure.in
--- configure.in	2001/04/12 15:36:24	1.515
+++ configure.in	2001/04/20 19:10:46
@@ -544,7 +544,7 @@ fi
 dnl Disabled until we have a complete test for buggy enum bitfields.
 dnl gcc_AC_C_ENUM_BF_UNSIGNED
 
-AC_CHECK_FUNCS(strtoul bsearch popen \
+AC_CHECK_FUNCS(strtoul bsearch popen times clock \
 	strchr strrchr kill getrlimit setrlimit atoll atoq \
 	sysconf isascii gettimeofday strsignal putc_unlocked fputc_unlocked \
 	fputs_unlocked getrusage iconv nl_langinfo lstat)
@@ -591,7 +591,7 @@ saved_CFLAGS="$CFLAGS"
 CFLAGS="$CFLAGS -I${srcdir} -I${srcdir}/../include"
 gcc_AC_CHECK_DECLS(getenv atol sbrk abort atof getcwd getwd \
 	strsignal putc_unlocked fputs_unlocked strstr environ errno \
-	malloc realloc calloc free basename getopt, , ,[
+	malloc realloc calloc free basename getopt clock, , ,[
 #include "ansidecl.h"
 #include "system.h"])
 
@@ -602,6 +602,40 @@ gcc_AC_CHECK_DECLS(getrlimit setrlimit g
 #include <sys/resource.h>
 #endif
 ])
+
+gcc_AC_CHECK_DECLS(times, , ,[
+#include "ansidecl.h"
+#include "system.h"
+#ifdef HAVE_SYS_TIMES_H
+#include <sys/times.h>
+#endif
+])
+
+# More time-related stuff.
+AC_CACHE_CHECK(for struct tms, ac_cv_struct_tms, [
+AC_TRY_COMPILE([
+#include "ansidecl.h"
+#include "system.h"
+#ifdef HAVE_SYS_TIMES_H
+#include <sys/times.h>
+#endif
+], [struct tms tms;], ac_cv_struct_tms=yes, ac_cv_struct_tms=no)])
+if test $ac_cv_struct_tms = yes; then
+  AC_DEFINE(HAVE_STRUCT_TMS, 1,
+  [Define if <sys/times.h> defines struct tms.])
+fi
+
+# use gcc_cv_* here because this doesn't match the behavior of AC_CHECK_TYPE.
+# revisit after autoconf 2.50.
+AC_CACHE_CHECK(for clock_t, gcc_cv_type_clock_t, [
+AC_TRY_COMPILE([
+#include "ansidecl.h"
+#include "system.h"
+], [clock_t x;], gcc_cv_type_clock_t=yes, gcc_cv_type_clock_t=no)])
+if test $gcc_cv_type_clock_t = yes; then
+  AC_DEFINE(HAVE_CLOCK_T, 1,
+  [Define if <time.h> defines clock_t.])
+fi
 
 # Restore CFLAGS from before the gcc_AC_NEED_DECLARATIONS tests.
 CFLAGS="$saved_CFLAGS"
===================================================================
Index: timevar.c
*** timevar.c	2001/03/02 21:41:36	1.12
--- timevar.c	2001/04/20 19:12:56
***************
*** 26,39 ****
  #ifdef HAVE_SYS_TIMES_H
  # include <sys/times.h>
  #endif
- 
  #ifdef HAVE_SYS_RESOURCE_H
  #include <sys/resource.h>
  #endif
! #ifdef NEED_DECLARATION_GETRUSAGE
  extern int getrusage PARAMS ((int, struct rusage *));
  #endif
  
  #include "flags.h"
  #include "timevar.h"
  
--- 26,102 ----
  #ifdef HAVE_SYS_TIMES_H
  # include <sys/times.h>
  #endif
  #ifdef HAVE_SYS_RESOURCE_H
  #include <sys/resource.h>
+ #endif
+ 
+ #ifndef HAVE_CLOCK_T
+ typedef int clock_t;
+ #endif
+ 
+ #ifndef HAVE_STRUCT_TMS
+ struct tms
+ {
+   clock_t tms_utime;
+   clock_t tms_stime;
+   clock_t tms_cutime;
+   clock_t tms_cstime;
+ };
  #endif
! 
! #if defined HAVE_DECL_GETRUSAGE && !HAVE_DECL_GETRUSAGE
  extern int getrusage PARAMS ((int, struct rusage *));
  #endif
+ #if defined HAVE_DECL_TIMES && !HAVE_DECL_TIMES
+ extern clock_t times PARAMS ((struct tms *));
+ #endif
+ #if defined HAVE_DECL_CLOCK && !HAVE_DECL_CLOCK
+ extern clock_t clock PARAMS ((void));
+ #endif
  
+ #ifndef RUSAGE_SELF
+ # define RUSAGE_SELF 0
+ #endif
+ 
+ /* Calculation of scale factor to convert ticks to microseconds.
+    We mustn't use CLOCKS_PER_SEC except with clock().  */
+ #if HAVE_SYSCONF && defined _SC_CLK_TCK
+ # define TICKS_PER_SECOND sysconf (_SC_CLK_TCK) /* POSIX 1003.1-1996 */
+ #else
+ # ifdef CLK_TCK
+ #  define TICKS_PER_SECOND CLK_TCK /* POSIX 1003.1-1988; obsolescent */
+ # else
+ #  ifdef HZ
+ #   define TICKS_PER_SECOND HZ  /* traditional UNIX */
+ #  else
+ #   define TICKS_PER_SECOND 100 /* often the correct value */
+ #  endif
+ # endif
+ #endif
+ 
+ #define TICKS_TO_USEC (1000000 / TICKS_PER_SECOND)
+ #define CLOCKS_TO_USEC (1000000 / CLOCKS_PER_SEC)
+ 
+ /* Prefer times to getrusage to clock (each gives successively less
+    information).  */
+ #ifdef HAVE_TIMES
+ # define USE_TIMES
+ # define HAVE_USER_TIME
+ # define HAVE_SYS_TIME
+ # define HAVE_WALL_TIME
+ #else
+ #ifdef HAVE_GETRUSAGE
+ # define USE_GETRUSAGE
+ # define HAVE_USER_TIME
+ # define HAVE_SYS_TIME
+ #else
+ #ifdef HAVE_CLOCK
+ # define USE_CLOCK
+ # define HAVE_USER_TIME
+ #endif
+ #endif
+ #endif
+ 
  #include "flags.h"
  #include "timevar.h"
  
*************** get_time (now)
*** 114,199 ****
    if (!TIMEVAR_ENABLE)
      return;
  
- #ifdef __BEOS__
-   /* Nothing.  */
- #else /* not BeOS */
- #if defined (_WIN32) && !defined (__CYGWIN__)
-   if (clock () >= 0)
-     now->user = clock () * 1000;
- #define HAVE_USER_TIME
- 
- #else /* not _WIN32 */
- #ifdef _SC_CLK_TCK
-   {
-     static int tick;
-     struct tms tms;
-     if (tick == 0)
-       tick = 1000000 / sysconf (_SC_CLK_TCK);
-     now->wall = times (&tms) * tick;
-     now->user = tms.tms_utime * tick;
-     now->sys = tms.tms_stime * tick;
-   }
- #define HAVE_USER_TIME
- #define HAVE_SYS_TIME
- #define HAVE_WALL_TIME
- 
- #else
- #ifdef USG
    {
      struct tms tms;
! #   if HAVE_SYSCONF && defined _SC_CLK_TCK
! #    define TICKS_PER_SECOND sysconf (_SC_CLK_TCK) /* POSIX 1003.1-1996 */
! #   else
! #    ifdef CLK_TCK
! #     define TICKS_PER_SECOND CLK_TCK /* POSIX 1003.1-1988; obsolescent */
! #    else
! #     define TICKS_PER_SECOND HZ /* traditional UNIX */
! #    endif
! #   endif
!     now->wall = times (&tms) * (1000000 / TICKS_PER_SECOND);
!     now->user = tms.tms_utime * (1000000 / TICKS_PER_SECOND);
!     now->sys = tms.tms_stime * (1000000 / TICKS_PER_SECOND);
!   }
! #define HAVE_USER_TIME
! #define HAVE_SYS_TIME
! #define HAVE_WALL_TIME
  
! #else
! #ifndef VMS
!   {
      struct rusage rusage;
!     getrusage (0, &rusage);
      now->user 
        = rusage.ru_utime.tv_sec * 1000000 + rusage.ru_utime.tv_usec;
      now->sys 
        = rusage.ru_stime.tv_sec * 1000000 + rusage.ru_stime.tv_usec;
!   }
! #define HAVE_USER_TIME
! #define HAVE_SYS_TIME
! 
! #else /* VMS */
!   {
!     struct
!       {
!         int proc_user_time;
!         int proc_system_time;
!         int child_user_time;
!         int child_system_time;
!       } vms_times;
!     now->wall = times ((void *) &vms_times) * 10000;
!     now->user = vms_times.proc_user_time * 10000;
!     now->sys = vms_times.proc_system_time * 10000;
    }
! #define HAVE_USER_TIME
! #define HAVE_SYS_TIME
! #define HAVE_WALL_TIME
! 
! #endif	/* VMS */
! #endif	/* USG */
! #endif  /* _SC_CLK_TCK */
! #endif	/* _WIN32 */
! #endif	/* __BEOS__ */
! }  
  
  /* Add the difference between STOP_TIME and START_TIME to TIMER.  */
  
--- 177,213 ----
    if (!TIMEVAR_ENABLE)
      return;
  
    {
+ #ifdef USE_TIMES
+     /* libc is very likely to have snuck a call to sysconf() into one
+        of the underlying constants, and that can make system calls, so
+        we have to precompute the value.  Whose wonderful idea was it
+        to make all those _constants_ variable at run time, anyway?  */
+     static int ticks_to_usec;
      struct tms tms;
!     if (ticks_to_usec == 0)
!       ticks_to_usec = TICKS_TO_USEC;
  
!     now->wall = times (&tms) * ticks_to_usec;
!     now->user = tms.tms_utime * ticks_to_usec;
!     now->sys = tms.tms_stime * ticks_to_usec;
! #endif
! #ifdef USE_GETRUSAGE
      struct rusage rusage;
!     getrusage (RUSAGE_SELF, &rusage);
      now->user 
        = rusage.ru_utime.tv_sec * 1000000 + rusage.ru_utime.tv_usec;
      now->sys 
        = rusage.ru_stime.tv_sec * 1000000 + rusage.ru_stime.tv_usec;
! #endif
! #ifdef USE_CLOCK
!     static int clocks_to_usec;
!     if (clocks_to_usec == 0)
!       clocks_to_usec = CLOCKS_TO_USEC;
!     now->user = clock () * clocks_to_usec;
! #endif
    }
! }
  
  /* Add the difference between STOP_TIME and START_TIME to TIMER.  */
  


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