diff mbox series

[power-ieee128] libquadmath: Use -mno-gnu-attribute in libquadmath

Message ID 20220103152450.GK2664@tucnak
State New
Headers show
Series [power-ieee128] libquadmath: Use -mno-gnu-attribute in libquadmath | expand

Commit Message

Jakub Jelinek Jan. 3, 2022, 3:24 p.m. UTC
Hi!

Testing found that we also need libquadmath to be built with
-mno-gnu-attribute, otherwise -mabi=ieeelongdouble programs don't link.

Ok for power-ieee128?

2022-01-03  Jakub Jelinek  <jakub@redhat.com>

	* configure.ac: Set XCFLAGS to -mno-gnu-attribute on
	powerpc64le*-linux*.
	* configure: Regenerated.


	Jakub

Comments

Thomas Koenig Jan. 3, 2022, 3:58 p.m. UTC | #1
On 03.01.22 16:24, Jakub Jelinek via Fortran wrote:
> Ok for power-ieee128?

OK.

Thanks!

Best regards

	Thomas
Michael Meissner Jan. 5, 2022, 10:31 p.m. UTC | #2
On Mon, Jan 03, 2022 at 04:24:50PM +0100, Jakub Jelinek wrote:
> Hi!
> 
> Testing found that we also need libquadmath to be built with
> -mno-gnu-attribute, otherwise -mabi=ieeelongdouble programs don't link.
> 
> Ok for power-ieee128?
> 
> 2022-01-03  Jakub Jelinek  <jakub@redhat.com>
> 
> 	* configure.ac: Set XCFLAGS to -mno-gnu-attribute on
> 	powerpc64le*-linux*.
> 	* configure: Regenerated.

I'm wondering whether we want to change things so that Fortran never uses long
double on PowerPC, but instead it explicitly uses __float128 and __ibm128.  But
this breaks down in using printf/scanf, which don't have format options for
those types.

Unfortunately this won't work with the current code, since passing any of the
128-bit floating point types causes the flag 'rs6000_passes_long_double' to be
set (and then the gnu attribute #4 is set).  In theory, that should be set only
if an explicit long double type is used.  But the problem is when those things
are set, you tend to only have modes and not types.

To do it 'right', you probably need a GIMPLE pass that looks at the actual
types used, not the modes.
diff mbox series

Patch

--- libquadmath/configure.ac
+++ libquadmath/configure.ac
@@ -352,6 +352,19 @@  fi
 # Add CET specific flags if CET is enabled
 GCC_CET_FLAGS(CET_FLAGS)
 XCFLAGS="$XCFLAGS $CET_FLAGS"
+
+case x$target in
+  xpowerpc64le*-linux*)
+    AC_PREPROC_IFELSE(
+      [AC_LANG_PROGRAM([[#if __SIZEOF_LONG_DOUBLE__ != 16
+                         #error long double is double
+                         #endif]],
+                       [[(void) 0;]])],
+      [XCFLAGS="$XCFLAGS -mno-gnu-attribute"])
+    ;;
+  *)
+    ;;
+esac
 AC_SUBST(XCFLAGS)
 
 AC_CACHE_SAVE
--- libquadmath/configure
+++ libquadmath/configure
@@ -13096,6 +13096,30 @@  fi
 
 XCFLAGS="$XCFLAGS $CET_FLAGS"
 
+case x$target in
+  xpowerpc64le*-linux*)
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#if __SIZEOF_LONG_DOUBLE__ != 16
+                         #error long double is double
+                         #endif
+int
+main ()
+{
+(void) 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  XCFLAGS="$XCFLAGS -mno-gnu-attribute"
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+    ;;
+  *)
+    ;;
+esac
+
 
 cat >confcache <<\_ACEOF
 # This file is a shell script that caches the results of configure