OSDN Git Service

PR 47571 Weakref trickery for clock_gettime()
authorjb <jb@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 2 Feb 2011 08:48:24 +0000 (08:48 +0000)
committerjb <jb@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 2 Feb 2011 08:48:24 +0000 (08:48 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@169517 138bc75d-0d04-0410-961f-82ee72b054a4

libgfortran/ChangeLog
libgfortran/configure
libgfortran/configure.ac
libgfortran/intrinsics/time_1.h

index 3a51f9b..47ab730 100644 (file)
@@ -1,3 +1,12 @@
+2011-02-02  Janne Blomqvist  <jb@gcc.gnu.org>
+
+       PR libfortran/47571
+       * configure: Regenerated.
+       * configure.ac: Don't add librt to LIBS.
+       * intrinsics/time_1.h (weak_gettime): Weakref trickery for
+       clock_gettime().
+       (gf_gettime): Use weak_gettime() instead of clock_gettime().
+
 2011-02-01  Janne Blomqvist  <jb@gcc.gnu.org>
 
        * intrinsics/time_1.h: Include errno.h needed by fallbacks.
index ec5c7ed..d052a05 100755 (executable)
@@ -25262,7 +25262,8 @@ fi
 
 # 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.
-# This test is copied from libgomp.
+# This test is copied from libgomp, and modified to not link in -lrt
+# as libgfortran calls clock_gettime via a weak reference.
 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; }
@@ -25304,7 +25305,6 @@ 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" = x""yes; then :
-  LIBS="-lrt $LIBS"
 
 $as_echo "#define HAVE_CLOCK_GETTIME 1" >>confdefs.h
 
index ed1e2cc..8161659 100644 (file)
@@ -486,11 +486,11 @@ AC_CHECK_LIB([m],[feenableexcept],[have_feenableexcept=yes AC_DEFINE([HAVE_FEENA
 
 # 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.
-# This test is copied from libgomp.
+# This test is copied from libgomp, and modified to not link in -lrt
+# as libgfortran calls clock_gettime via a weak reference.
 if test $ac_cv_func_clock_gettime = no; then
   AC_CHECK_LIB(rt, clock_gettime,
-    [LIBS="-lrt $LIBS"  
-     AC_DEFINE(HAVE_CLOCK_GETTIME, 1,
+    [AC_DEFINE(HAVE_CLOCK_GETTIME, 1,
                [Define to 1 if you have the `clock_gettime' function.])])
 fi
 
index 58c51af..86e4331 100644 (file)
@@ -189,6 +189,22 @@ gf_cputime (long *user_sec, long *user_usec, long *system_sec, long *system_usec
 #define GF_CLOCK_MONOTONIC GF_CLOCK_REALTIME
 #endif
 
+/* Weakref trickery for clock_gettime().  On Glibc, clock_gettime()
+   requires us to link in librt, which also pulls in libpthread.  In
+   order to avoid this by default, only call clock_gettime() through a
+   weak reference.  */
+#ifdef HAVE_CLOCK_GETTIME
+#ifdef SUPPORTS_WEAK
+static int weak_gettime (clockid_t, struct timespec *) 
+  __attribute__((__weakref__("clock_gettime")));
+#else
+static inline int weak_gettime (clockid_t clk_id, struct timespec *res)
+{
+  return clock_gettime (clk_id, res);
+}
+#endif
+#endif
+
 /* Arguments:
    clock_id - INPUT, must be either GF_CLOCK_REALTIME or GF_CLOCK_MONOTONIC
    secs     - OUTPUT, seconds
@@ -208,14 +224,18 @@ gf_gettime (int clock_id __attribute__((unused)), time_t * secs,
             long * nanosecs)
 {
 #ifdef HAVE_CLOCK_GETTIME
-  struct timespec ts;
-  int err;
-  err = clock_gettime (clock_id, &ts);
-  *secs = ts.tv_sec;
-  if (nanosecs)
-    *nanosecs = ts.tv_nsec;
-  return err;
-#elif HAVE_GETTIMEOFDAY
+  if (weak_gettime)
+    {
+      struct timespec ts;
+      int err;
+      err = weak_gettime (clock_id, &ts);
+      *secs = ts.tv_sec;
+      if (nanosecs)
+       *nanosecs = ts.tv_nsec;
+      return err;
+    }
+#endif
+#ifdef HAVE_GETTIMEOFDAY
   struct timeval tv;
   int err;
   err = gettimeofday (&tv, NULL);