Patchwork [libfortran] PR 47571 Fix bootstrap failure on alpha*-dec-osf*

login
register
mail settings
Submitter Janne Blomqvist
Date April 11, 2011, 8:18 p.m.
Message ID <BANLkTi=ZjzOTTt+VajS0ok7jV7F=fH+tYw@mail.gmail.com>
Download mbox | patch
Permalink /patch/90647/
State New
Headers show

Comments

Janne Blomqvist - April 11, 2011, 8:18 p.m.
Hi,

the attached patch hopefully fixes the bootstrap failure on
alpha*-dec-osf* due to said platform having clock_gettime() in librt,
supporting weak symbols but not weak undefined symbols. The patch is
the same as #38 in the PR discussion + adding alpha*-dec-osf* to the
acinclude.m4 blacklist.

Regtested on x86_64-unknown-linux-gnu, Ok for trunk?

Once in trunk for a short while, Ok to backport to the 4.6 branch and
replace the quick-and-dirty hack that was introduced to fix this
shortly before 4.6 release?

Many thanks to Rainer Orth for testing.

2011-04-11  Janne Blomqvist  <jb@gcc.gnu.org>

	PR libfortran/47571
	* configure: Regenerated.
	* config.h.in: Regenerated.
	* acinclude.m4: Add alpha*-dec-osf* to gthread blacklist.
	* configure.ac: Use separate symbol for clock_gettime in librt.
	* intrinsics/system_clock.c: Use weakrefs only when needed and
	supported.
Steve Kargl - April 14, 2011, 3:27 p.m.
On Mon, Apr 11, 2011 at 11:18:53PM +0300, Janne Blomqvist wrote:
> 
> the attached patch hopefully fixes the bootstrap failure on
> alpha*-dec-osf* due to said platform having clock_gettime() in librt,
> supporting weak symbols but not weak undefined symbols. The patch is
> the same as #38 in the PR discussion + adding alpha*-dec-osf* to the
> acinclude.m4 blacklist.
> 
> Regtested on x86_64-unknown-linux-gnu, Ok for trunk?

If Rainer has confirmed that the patch fixes OSF, then
"yes" you can commit the patch and backport to 4.6.
Janne Blomqvist - April 15, 2011, 4:24 a.m.
On Thu, Apr 14, 2011 at 18:27, Steve Kargl
<sgk@troutmask.apl.washington.edu> wrote:
> On Mon, Apr 11, 2011 at 11:18:53PM +0300, Janne Blomqvist wrote:
>>
>> the attached patch hopefully fixes the bootstrap failure on
>> alpha*-dec-osf* due to said platform having clock_gettime() in librt,
>> supporting weak symbols but not weak undefined symbols. The patch is
>> the same as #38 in the PR discussion + adding alpha*-dec-osf* to the
>> acinclude.m4 blacklist.
>>
>> Regtested on x86_64-unknown-linux-gnu, Ok for trunk?
>
> If Rainer has confirmed that the patch fixes OSF, then
> "yes" you can commit the patch and backport to 4.6.

Rainer indicated in #49  that the same patch (AFAICS) works, so,
committed as r172469. Thanks for reviewing.

Patch

diff --git a/libgfortran/acinclude.m4 b/libgfortran/acinclude.m4
index acd1d4d..92e0271 100644
--- a/libgfortran/acinclude.m4
+++ b/libgfortran/acinclude.m4
@@ -110,7 +110,7 @@  void foo (void);
 	      [Define to 1 if the target supports #pragma weak])
   fi
   case "$host" in
-    *-*-darwin* | *-*-hpux* | *-*-cygwin* | *-*-mingw* )
+    *-*-darwin* | *-*-hpux* | *-*-cygwin* | *-*-mingw* | alpha*-dec-osf* )
       AC_DEFINE(GTHREAD_USE_WEAK, 0,
 		[Define to 0 if the target shouldn't use #pragma weak])
       ;;
diff --git a/libgfortran/configure.ac b/libgfortran/configure.ac
index 588f999..9b36103 100644
--- a/libgfortran/configure.ac
+++ b/libgfortran/configure.ac
@@ -491,14 +491,15 @@  LIBGFOR_CHECK_FLOAT128
 # Check for GNU libc feenableexcept
 AC_CHECK_LIB([m],[feenableexcept],[have_feenableexcept=yes AC_DEFINE([HAVE_FEENABLEEXCEPT],[1],[libm includes feenableexcept])])
 
-# 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, and modified to not link in -lrt
-# as libgfortran calls clock_gettime via a weak reference.
+# At least for glibc and Tru64, 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, and modified to not link in -lrt as
+# libgfortran calls clock_gettime via a weak reference if it's found
+# in librt.
 if test $ac_cv_func_clock_gettime = no; then
   AC_CHECK_LIB(rt, clock_gettime,
-    [AC_DEFINE(HAVE_CLOCK_GETTIME, 1,
-               [Define to 1 if you have the `clock_gettime' function.])])
+    [AC_DEFINE(HAVE_CLOCK_GETTIME_LIBRT, 1,
+               [Define to 1 if you have the `clock_gettime' function in librt.])])
 fi
 
 # Check for SysV fpsetmask
diff --git a/libgfortran/intrinsics/system_clock.c b/libgfortran/intrinsics/system_clock.c
index 3a44dd9..f4bac07 100644
--- a/libgfortran/intrinsics/system_clock.c
+++ b/libgfortran/intrinsics/system_clock.c
@@ -29,14 +29,16 @@  see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 
 #include "time_1.h"
 
-#ifdef HAVE_CLOCK_GETTIME
+
 /* POSIX states that CLOCK_REALTIME must be present if clock_gettime
    is available, others are optional.  */
+#if defined(HAVE_CLOCK_GETTIME) || defined(HAVE_CLOCK_GETTIME_LIBRT)
 #ifdef CLOCK_MONOTONIC
 #define GF_CLOCK_MONOTONIC CLOCK_MONOTONIC
 #else
 #define GF_CLOCK_MONOTONIC CLOCK_REALTIME
 #endif
+#endif
 
 /* Weakref trickery for clock_gettime().  On Glibc, clock_gettime()
    requires us to link in librt, which also pulls in libpthread.  In
@@ -50,15 +52,9 @@  see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 #define GTHREAD_USE_WEAK 1
 #endif
 
-#if SUPPORTS_WEAK && GTHREAD_USE_WEAK
+#if SUPPORTS_WEAK && GTHREAD_USE_WEAK && defined(HAVE_CLOCK_GETTIME_LIBRT)
 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
 
 
@@ -84,6 +80,13 @@  gf_gettime_mono (time_t * secs, long * nanosecs)
 {
   int err;
 #ifdef HAVE_CLOCK_GETTIME
+  struct timespec ts;
+  err = clock_gettime (GF_CLOCK_MONOTONIC, &ts);
+  *secs = ts.tv_sec;
+  *nanosecs = ts.tv_nsec;
+  return err;
+#else
+#if defined(HAVE_CLOCK_GETTIME_LIBRT) && SUPPORTS_WEAK && GTHREAD_USE_WEAK
   if (weak_gettime)
     {
       struct timespec ts;
@@ -96,6 +99,7 @@  gf_gettime_mono (time_t * secs, long * nanosecs)
   err = gf_gettime (secs, nanosecs);
   *nanosecs *= 1000;
   return err;
+#endif
 }
 
 extern void system_clock_4 (GFC_INTEGER_4 *, GFC_INTEGER_4 *, GFC_INTEGER_4 *);