]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
powerpc64le: blacklist broken GCC compilers (e.g GCC 7.5.0)
authorPaul E. Murphy <murphyp@linux.vnet.ibm.com>
Tue, 17 Mar 2020 13:38:54 +0000 (08:38 -0500)
committerPaul E. Murphy <murphyp@linux.vnet.ibm.com>
Thu, 30 Apr 2020 13:52:08 +0000 (08:52 -0500)
GCC 7.5.0 (PR94200) will refuse to compile if both -mabi=% and
-mlong-double-128 are passed on the command line.  Surprisingly,
it will work happily if the latter is not.  For the sake of
maintaining status quo, test for and blacklist such compilers.

Tested with a GCC 8.3.1 and GCC 7.5.0 compiler for ppc64le.

Reviewed-by: Tulio Magno Quites Machado Filho <tuliom@linux.ibm.com>
INSTALL
manual/install.texi
sysdeps/ieee754/ldbl-128ibm-compat/Makefile
sysdeps/powerpc/powerpc64/le/configure
sysdeps/powerpc/powerpc64/le/configure.ac

diff --git a/INSTALL b/INSTALL
index 4bf4bd09084057c837a52c0de8b42b3f865f0ebf..b7676d1c9f868e7b98bc4558349056d062182661 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -469,9 +469,11 @@ build the GNU C Library:
 
      For PowerPC 64-bits little-endian (powerpc64le), a GCC version with
      support for '-mno-gnu-attribute', '-mabi=ieeelongdouble', and
-     '-mabi=ibmlondouble' is required.  These additional features are
-     required for building the GNU C Library with support for IEEE long
-     double.
+     '-mabi=ibmlondouble' is required.  Likewise, the compiler must also
+     support passing '-mlong-double-128' with the preceding options.  As
+     of release, this implies GCC 7.4 and newer (excepting GCC 7.5.0,
+     see GCC PR94200).  These additional features are required for
+     building the GNU C Library with support for IEEE long double.
 
      For multi-arch support it is recommended to use a GCC which has
      been built with support for GNU indirect functions.  This ensures
index e801abd8beb5996addcf77a84df444eddbacd151..f6d9d9231723a564352a003a7d8b8a18804bb19a 100644 (file)
@@ -509,8 +509,14 @@ release time, GCC 9.2.1 is the newest compiler verified to work to build
 
 For PowerPC 64-bits little-endian (powerpc64le), a GCC version with support
 for @option{-mno-gnu-attribute}, @option{-mabi=ieeelongdouble}, and
-@option{-mabi=ibmlondouble} is required.  These additional features are
-required for building the GNU C Library with support for IEEE long double.
+@option{-mabi=ibmlondouble} is required.  Likewise, the compiler must also
+support passing @option{-mlong-double-128} with the preceding options.  As
+of release, this implies GCC 7.4 and newer (excepting GCC 7.5.0, see GCC
+PR94200).  These additional features are required for building the GNU C
+Library with support for IEEE long double.
+
+@c powerpc64le performs an autoconf test to verify the compiler compiles with
+@c commands like "$CC -c foo.c -mabi=ibmlongdouble -mlong-double-128".
 
 For multi-arch support it is recommended to use a GCC which has been built with
 support for GNU indirect functions.  This ensures that correct debugging
index 0ac52a53bcde95d9c21a57d4c39acd8132a2c4be..7b42746c34e73804e59657e870782dbb9fdab124 100644 (file)
@@ -249,13 +249,6 @@ ldbl-extra-routines += err \
 CFLAGS-ieee128-qefgcvt.c += -mabi=ieeelongdouble -Wno-psabi -mno-gnu-attribute
 CFLAGS-ieee128-qefgcvt_r.c += -mabi=ieeelongdouble -Wno-psabi -mno-gnu-attribute
 
-# Remove -mlong-double-128 because it does not work correctly with
-# -mabi=ibmlongdoule in some GCC versions, e.g. GCC 7.
-$(foreach o,$(all-object-suffixes),$(objpfx)ieee128-qefgcvt$(o)): \
-  sysdep-CFLAGS := $(filter-out -mlong-double-128, $(sysdep-CFLAGS))
-$(foreach o,$(all-object-suffixes),$(objpfx)ieee128-qefgcvt_r$(o)): \
-  sysdep-CFLAGS := $(filter-out -mlong-double-128, $(sysdep-CFLAGS))
-
 tests-internal += tst-ibm128-warn tst-ieee128-warn
 tests-internal += tst-ibm128-error tst-ieee128-error
 tests-internal += tst-ibm128-efgcvt tst-ieee128-efgcvt
@@ -348,11 +341,6 @@ ldbl-ibm128-files := $(objpfx)test-%-ibm128^ \
                     $(foreach r,$(ldbl-extra-routines),$(objpfx)$(r)-internal^)
 obj-suf-foreach = $(foreach suf,$(all-object-suffixes),$(subst ^,$(suf),$(1)))
 
-# Remove -mlong-double-128 because it does not work correctly with
-# -mabi=ibmlongdoule in some GCC versions, e.g. GCC 7.
-$(call obj-suf-foreach,$(ldbl-ibm128-files)): \
-  sysdep-CFLAGS := $(filter-out -mlong-double-128, $(sysdep-CFLAGS))
-
 # Explicitly add -mabi=ibm-long-double to required files.
 $(call obj-suf-foreach,$(ldbl-ibm128-files)): \
   sysdep-CFLAGS += -mabi=ibmlongdouble
index bd7b8e77d069ab2f16e2d1d943f22b2085d3a9ab..98a488994594c277112ca65c2e69d6fd3332f22b 100644 (file)
@@ -90,6 +90,33 @@ if test "$libc_cv_compiler_powerpc64le_ice" != "yes"; then :
   critic_missing="$critic_missing __builtin_signbit is broken.  GCC 7.4 or newer is required to resolve (PR83862)."
 fi
 
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC compiles with -mabi=ieeelongdouble and -mlong-double-128" >&5
+$as_echo_n "checking if $CC compiles with -mabi=ieeelongdouble and -mlong-double-128... " >&6; }
+if ${libc_cv_compiler_powerpc64le_ldbl128_mabi+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  save_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS -mabi=ieeelongdouble -mlong-double-128"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+long double x;
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  libc_cv_compiler_powerpc64le_ldbl128_mabi=yes
+else
+  libc_cv_compiler_powerpc64le_ldbl128_mabi=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+CFLAGS="$save_CFLAGS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_compiler_powerpc64le_ldbl128_mabi" >&5
+$as_echo "$libc_cv_compiler_powerpc64le_ldbl128_mabi" >&6; }
+if test "$libc_cv_compiler_powerpc64le_ldbl128_mabi" == "no"; then :
+  critic_missing="$critic_missing The compiler must support -mabi=ieeelongdouble and -mlongdouble simultaneously."
+fi
+
 for ac_prog in $OBJCOPY
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
index 405933e7103148a1163ec23d849f7d221bcc07d0..769c06709e27e89d98e68f6aa86248587a6c1868 100644 (file)
@@ -51,6 +51,21 @@ CFLAGS="$save_CFLAGS"])
 AS_IF([test "$libc_cv_compiler_powerpc64le_ice" != "yes"],
       [critic_missing="$critic_missing __builtin_signbit is broken.  GCC 7.4 or newer is required to resolve (PR83862)."])
 
+dnl Some old compiler versions give out error messages when combining
+dnl -mabi=% and -mlong-double-128.  i.e GCC 7.5.0 (PR94200)
+AC_CACHE_CHECK([if $CC compiles with -mabi=ieeelongdouble and -mlong-double-128],
+              libc_cv_compiler_powerpc64le_ldbl128_mabi, [dnl
+save_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS -mabi=ieeelongdouble -mlong-double-128"
+AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+long double x;
+]])],
+                 [libc_cv_compiler_powerpc64le_ldbl128_mabi=yes],
+                 [libc_cv_compiler_powerpc64le_ldbl128_mabi=no])
+CFLAGS="$save_CFLAGS"])
+AS_IF([test "$libc_cv_compiler_powerpc64le_ldbl128_mabi" == "no"],
+      [critic_missing="$critic_missing The compiler must support -mabi=ieeelongdouble and -mlongdouble simultaneously."])
+
 dnl objcopy (binutils) 2.26 or newer required to support the --update-section
 dnl feature for fixing up .gnu.attribute section with IEEE ldbl.
 AC_CHECK_PROG_VER(OBJCOPY, $OBJCOPY, --version,