Patchwork [Fortran+Build] Use more complicated quad-math config check

login
register
mail settings
Submitter Tobias Burnus
Date Feb. 15, 2011, 3:16 p.m.
Message ID <4D5A98E9.8090606@net-b.de>
Download mbox | patch
Permalink /patch/83263/
State New
Headers show

Comments

Tobias Burnus - Feb. 15, 2011, 3:16 p.m.
On some targets, __float128 exists but the support is insufficient to 
build libquadmath because some functionality is not provided by libc (or 
should it be by libgcc?). Thus, the configure test for libquadmath 
failed - and libquadmath is not build. (That's OK.)

In libgfortran, there is a similar check, but seemingly it uses fewer 
features and thus does not fail on some targets, which cannot build 
libquadmath. Result: The build fails as libquadmath is not available.

The solution is to use the same check as for libquadmath. (Additionally, 
one should, e.g., provide the missing bits in libgcc to enable a working 
quadmath support. But that's a separate issue.)

There are two related PRs to this issue:
a) PR 47716 for NetBSD 5.1 (x86-64); there the patch has been confirmed 
to work; unfortunately, there seem to be more issues on that platform. 
(Lots of test suite failures, cf. PR.)
b) PR 47648 for FreeBSD on ia64. (FreeBSD on x86-64 is OK.)

Build and regtested on x86-64 linux (and build on NetBSD, cf. PR).
OK for the trunk?

Tobias

PS: The result of the configure check is as if libgfortran were build 
with --disable-libquadmath-support. The front end will still believe 
that __float128 [or rather: REAL(16)] is available.
Ralf Wildenhues - Feb. 15, 2011, 8:21 p.m.
* Tobias Burnus wrote on Tue, Feb 15, 2011 at 04:16:57PM CET:
> The solution is to use the same check as for libquadmath. (Additionally, one
> should, e.g., provide the missing bits in libgcc to enable a working
> quadmath support. But that's a separate issue.)
[...]
> Build and regtested on x86-64 linux (and build on NetBSD, cf. PR).
> OK for the trunk?

The patch is OK.

When you have tests that should be the same across several configure
scripts, the right way is to factor them into an appropriate macro and
put them in a toplevel config/*.m4 file.  But IMVHO such a cleanup is
more appropriate for Stage 1.

Thanks,
Ralf

> PS: The result of the configure check is as if libgfortran were build with
> --disable-libquadmath-support. The front end will still believe that
> __float128 [or rather: REAL(16)] is available.

> 2011-02-15  Tobias Burnus  <burnus@net-b.de>
> 
>         PR fortran/47716
>         PR fortran/47648
> 	* acinclude.m4 (LIBGFOR_CHECK_FLOAT128): Use check from
> 	libquadmath, which uses more features.
> 	* configure: Regenerate.

> --- a/libgfortran/acinclude.m4
> +++ b/libgfortran/acinclude.m4
> @@ -284,24 +284,33 @@ AC_DEFUN([LIBGFOR_CHECK_FLOAT128], [
>  
>    AC_CACHE_CHECK([whether we have a usable __float128 type],
>                   libgfor_cv_have_float128, [
> -    AC_TRY_LINK([
> -/* no header */
> -],[
> -  typedef _Complex float __attribute__((mode(TC))) __complex128;
> -
> -  __float128 x;
> -  x = __builtin_huge_valq() - 2.e1000Q;
> -
> -  __complex128 z1, z2;
> -  z1 = x;
> -  z2 = 2.Q;
> -
> -  z1 /= z2;
> -  z1 /= 7.Q;
> -],
> -    libgfor_cv_have_float128=yes,
> -    libgfor_cv_have_float128=no)
> -  ])
> +   GCC_TRY_COMPILE_OR_LINK([
> +    typedef _Complex float __attribute__((mode(TC))) __complex128;
> +
> +    __float128 foo (__float128 x)
> +    {
> +
> +     __complex128 z1, z2;
> +
> +     z1 = x;
> +     z2 = x / 7.Q;
> +     z2 /= z1;
> +
> +     return (__float128) z2;
> +    }
> +
> +    __float128 bar (__float128 x)
> +    {
> +      return x * __builtin_huge_valq ();
> +    }
> +  ],[
> +    foo (1.2Q);
> +    bar (1.2Q);
> +  ],[
> +    libgfor_cv_have_float128=yes
> +  ],[
> +    libgfor_cv_have_float128=no
> +])])
>  
>    if test "x$libgfor_cv_have_float128" = xyes; then
>      AC_DEFINE(HAVE_FLOAT128, 1, [Define if have a usable __float128 type.])

Patch

2011-02-15  Tobias Burnus  <burnus@net-b.de>

        PR fortran/47716
        PR fortran/47648
	* acinclude.m4 (LIBGFOR_CHECK_FLOAT128): Use check from
	libquadmath, which uses more features.
	* configure: Regenerate.

diff --git a/libgfortran/acinclude.m4 b/libgfortran/acinclude.m4
index 9873d9f..1bc1c7b 100644
--- a/libgfortran/acinclude.m4
+++ b/libgfortran/acinclude.m4
@@ -284,24 +284,33 @@  AC_DEFUN([LIBGFOR_CHECK_FLOAT128], [
 
   AC_CACHE_CHECK([whether we have a usable __float128 type],
                  libgfor_cv_have_float128, [
-    AC_TRY_LINK([
-/* no header */
-],[
-  typedef _Complex float __attribute__((mode(TC))) __complex128;
-
-  __float128 x;
-  x = __builtin_huge_valq() - 2.e1000Q;
-
-  __complex128 z1, z2;
-  z1 = x;
-  z2 = 2.Q;
-
-  z1 /= z2;
-  z1 /= 7.Q;
-],
-    libgfor_cv_have_float128=yes,
-    libgfor_cv_have_float128=no)
-  ])
+   GCC_TRY_COMPILE_OR_LINK([
+    typedef _Complex float __attribute__((mode(TC))) __complex128;
+
+    __float128 foo (__float128 x)
+    {
+
+     __complex128 z1, z2;
+
+     z1 = x;
+     z2 = x / 7.Q;
+     z2 /= z1;
+
+     return (__float128) z2;
+    }
+
+    __float128 bar (__float128 x)
+    {
+      return x * __builtin_huge_valq ();
+    }
+  ],[
+    foo (1.2Q);
+    bar (1.2Q);
+  ],[
+    libgfor_cv_have_float128=yes
+  ],[
+    libgfor_cv_have_float128=no
+])])
 
   if test "x$libgfor_cv_have_float128" = xyes; then
     AC_DEFINE(HAVE_FLOAT128, 1, [Define if have a usable __float128 type.])
diff --git a/libgfortran/configure b/libgfortran/configure
index 42f72b5..9d3c891 100755
--- a/libgfortran/configure
+++ b/libgfortran/configure
@@ -25075,42 +25075,99 @@  if test "${libgfor_cv_have_float128+set}" = set; then :
   $as_echo_n "(cached) " >&6
 else
 
-    if test x$gcc_no_link = xyes; then
-  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
-fi
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+   if test x$gcc_no_link = xyes; then
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
-/* no header */
+    typedef _Complex float __attribute__((mode(TC))) __complex128;
+
+    __float128 foo (__float128 x)
+    {
+
+     __complex128 z1, z2;
+
+     z1 = x;
+     z2 = x / 7.Q;
+     z2 /= z1;
+
+     return (__float128) z2;
+    }
+
+    __float128 bar (__float128 x)
+    {
+      return x * __builtin_huge_valq ();
+    }
 
 int
 main ()
 {
 
-  typedef _Complex float __attribute__((mode(TC))) __complex128;
+    foo (1.2Q);
+    bar (1.2Q);
 
-  __float128 x;
-  x = __builtin_huge_valq() - 2.e1000Q;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
 
-  __complex128 z1, z2;
-  z1 = x;
-  z2 = 2.Q;
+    libgfor_cv_have_float128=yes
 
-  z1 /= z2;
-  z1 /= 7.Q;
+else
+
+    libgfor_cv_have_float128=no
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+  if test x$gcc_no_link = xyes; then
+  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
+fi
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+    typedef _Complex float __attribute__((mode(TC))) __complex128;
+
+    __float128 foo (__float128 x)
+    {
+
+     __complex128 z1, z2;
+
+     z1 = x;
+     z2 = x / 7.Q;
+     z2 /= z1;
+
+     return (__float128) z2;
+    }
+
+    __float128 bar (__float128 x)
+    {
+      return x * __builtin_huge_valq ();
+    }
+
+int
+main ()
+{
+
+    foo (1.2Q);
+    bar (1.2Q);
 
   ;
   return 0;
 }
 _ACEOF
 if ac_fn_c_try_link "$LINENO"; then :
-  libgfor_cv_have_float128=yes
+
+    libgfor_cv_have_float128=yes
+
 else
-  libgfor_cv_have_float128=no
+
+    libgfor_cv_have_float128=no
+
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
-
+fi
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $libgfor_cv_have_float128" >&5
 $as_echo "$libgfor_cv_have_float128" >&6; }