summaryrefslogtreecommitdiff
path: root/libgfortran
diff options
context:
space:
mode:
authorbstarynk <bstarynk@138bc75d-0d04-0410-961f-82ee72b054a4>2011-02-02 15:17:45 +0000
committerbstarynk <bstarynk@138bc75d-0d04-0410-961f-82ee72b054a4>2011-02-02 15:17:45 +0000
commit473b39e749c43bbac18af0f7be22e0b2abb48e42 (patch)
treef5bedd667b23309956b2154486b16b9068eb1ef6 /libgfortran
parent00fc5e9d279e07d29741de257413ff6c0abe42a6 (diff)
downloadgcc-473b39e749c43bbac18af0f7be22e0b2abb48e42.tar.gz
2011-02-02 Basile Starynkevitch <basile@starynkevitch.net>
MELT branch merged with trunk rev 169522 git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/melt-branch@169528 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libgfortran')
-rw-r--r--libgfortran/ChangeLog9
-rwxr-xr-xlibgfortran/configure4
-rw-r--r--libgfortran/configure.ac6
-rw-r--r--libgfortran/intrinsics/time_1.h36
4 files changed, 42 insertions, 13 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index 3a51f9b1758..47ab730be5b 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -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.
diff --git a/libgfortran/configure b/libgfortran/configure
index ec5c7ed999b..d052a05cdcf 100755
--- a/libgfortran/configure
+++ b/libgfortran/configure
@@ -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
diff --git a/libgfortran/configure.ac b/libgfortran/configure.ac
index ed1e2cc31a1..816165988ce 100644
--- a/libgfortran/configure.ac
+++ b/libgfortran/configure.ac
@@ -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
diff --git a/libgfortran/intrinsics/time_1.h b/libgfortran/intrinsics/time_1.h
index 58c51af287a..86e4331e889 100644
--- a/libgfortran/intrinsics/time_1.h
+++ b/libgfortran/intrinsics/time_1.h
@@ -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);