[gcc(refs/users/meissner/heads/work177-libs)] Do not build IEEE 128-bit libstdc++ support if VSX is not available.
Michael Meissner
meissner@gcc.gnu.org
Wed Sep 4 15:40:59 GMT 2024
https://gcc.gnu.org/g:61b479aadbe46f39409f8f3996e3192adf60b66d
commit 61b479aadbe46f39409f8f3996e3192adf60b66d
Author: Michael Meissner <meissner@linux.ibm.com>
Date: Wed Sep 4 11:30:57 2024 -0400
Do not build IEEE 128-bit libstdc++ support if VSX is not available.
If you build a little endian compiler and select a default CPU of power5
(i.e. --with-cpu=power5), GCC cannot be built. The reason is that both the
libgfortran and libstdc++-v3 libraries assume that all little endian powerpc
builds support IEEE 128-bit floating point.
However, if the default cpu does not support the VSX instruction set, then we
cannot build the IEEE 128-bit libraries. This patch fixes the libstdc++-v3
library so if the GCC compiler does not support IEEE 128-bit floating point, the
IEEE 128-bit floating point libraries are not built. A companion patch will fix
the libgfortran library.
I have built these patches on a little endian system, doing both normal builds,
and making a build with a power5 default. There was no regression in the normal
builds. I have also built a big endian GCC compiler and there was no regression
there. Can I check this patch into the trunk?
2024-09-04 Michael Meissner <meissner@linux.ibm.com>
libstdc++-v3/
PR target/115800
* configure.ac (powerpc*-*-linux*): Don't enable IEEE 128-bit on PowerPC
systems without VSX.
* configure: Regenerate.
* numeric_traits.h: Don't enable IEEE 128-bit on PowerPC systems without
VSX.
Diff:
---
libstdc++-v3/configure | 68 ++++++++++++++++++++++---------
libstdc++-v3/configure.ac | 58 ++++++++++++++++----------
libstdc++-v3/include/ext/numeric_traits.h | 2 +-
3 files changed, 86 insertions(+), 42 deletions(-)
diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure
index 005c4a29fd0..ae7944beb78 100755
--- a/libstdc++-v3/configure
+++ b/libstdc++-v3/configure
@@ -51379,8 +51379,31 @@ $as_echo "#define _GLIBCXX_LONG_DOUBLE_COMPAT 1" >>confdefs.h
case "$target" in
powerpc*-*-linux*)
LONG_DOUBLE_COMPAT_FLAGS="$LONG_DOUBLE_COMPAT_FLAGS -mno-gnu-attribute"
- # Check for IEEE128 support in libm:
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __frexpieee128 in -lm" >&5
+ # Eliminate little endian systems without VSX
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ #ifndef __VSX__
+ #error "IEEE 128-bit needs VSX"
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_ieee128_possible=yes
+else
+ ac_ieee128_possible=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ if test $ac_ieee128_possible = yes; then
+ # Check for IEEE128 support in libm:
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __frexpieee128 in -lm" >&5
$as_echo_n "checking for __frexpieee128 in -lm... " >&6; }
if ${ac_cv_lib_m___frexpieee128+:} false; then :
$as_echo_n "(cached) " >&6
@@ -51425,18 +51448,18 @@ else
ac_ldbl_ieee128_in_libc=no
fi
- if test $ac_ldbl_ieee128_in_libc = yes; then
- # Determine which long double format is the compiler's default:
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ if test $ac_ldbl_ieee128_in_libc = yes; then
+ # Determine which long double format is the compiler's default:
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
main ()
{
- #ifndef __LONG_DOUBLE_IEEE128__
- #error compiler defaults to ibm128
- #endif
+ #ifndef __LONG_DOUBLE_IEEE128__
+ #error compiler defaults to ibm128
+ #endif
;
return 0;
@@ -51448,21 +51471,28 @@ else
ac_ldbl_ieee128_default=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- # Library objects should use default long double format.
- if test "$ac_ldbl_ieee128_default" = yes; then
- LONG_DOUBLE_128_FLAGS="-mno-gnu-attribute"
- # Except for the ones that explicitly use these flags:
- LONG_DOUBLE_ALT128_COMPAT_FLAGS="-mabi=ibmlongdouble -mno-gnu-attribute -Wno-psabi"
- else
- LONG_DOUBLE_128_FLAGS="-mno-gnu-attribute"
- LONG_DOUBLE_ALT128_COMPAT_FLAGS="-mabi=ieeelongdouble -mno-gnu-attribute -Wno-psabi"
- fi
+ # Library objects should use default long double format.
+ if test "$ac_ldbl_ieee128_default" = yes; then
+ LONG_DOUBLE_128_FLAGS="-mno-gnu-attribute"
+ # Except for the ones that explicitly use these flags:
+ LONG_DOUBLE_ALT128_COMPAT_FLAGS="-mabi=ibmlongdouble -mno-gnu-attribute -Wno-psabi"
+ else
+ LONG_DOUBLE_128_FLAGS="-mno-gnu-attribute"
+ LONG_DOUBLE_ALT128_COMPAT_FLAGS="-mabi=ieeelongdouble -mno-gnu-attribute -Wno-psabi"
+ fi
$as_echo "#define _GLIBCXX_LONG_DOUBLE_ALT128_COMPAT 1" >>confdefs.h
- port_specific_symbol_files="$port_specific_symbol_files \$(top_srcdir)/config/os/gnu-linux/ldbl-ieee128-extra.ver"
- ac_ldbl_alt128_compat=yes
+ port_specific_symbol_files="$port_specific_symbol_files \$(top_srcdir)/config/os/gnu-linux/ldbl-ieee128-extra.ver"
+ ac_ldbl_alt128_compat=yes
+ else
+ ac_ldbl_alt128_compat=no
+ fi
+
+ # IEEE 128-bit not possible
else
+ acl_ldbl_ieee128_in_libc=no
+ acl_ldbl_ieee128_default=no
ac_ldbl_alt128_compat=no
fi
;;
diff --git a/libstdc++-v3/configure.ac b/libstdc++-v3/configure.ac
index a3b257fe652..0a6fa44f8f4 100644
--- a/libstdc++-v3/configure.ac
+++ b/libstdc++-v3/configure.ac
@@ -487,31 +487,45 @@ case "$target" in
case "$target" in
powerpc*-*-linux*)
LONG_DOUBLE_COMPAT_FLAGS="$LONG_DOUBLE_COMPAT_FLAGS -mno-gnu-attribute"
- # Check for IEEE128 support in libm:
- AC_CHECK_LIB(m, __frexpieee128,
- [ac_ldbl_ieee128_in_libc=yes],
- [ac_ldbl_ieee128_in_libc=no])
- if test $ac_ldbl_ieee128_in_libc = yes; then
- # Determine which long double format is the compiler's default:
- AC_TRY_COMPILE(, [
- #ifndef __LONG_DOUBLE_IEEE128__
- #error compiler defaults to ibm128
- #endif
- ], [ac_ldbl_ieee128_default=yes], [ac_ldbl_ieee128_default=no])
- # Library objects should use default long double format.
- if test "$ac_ldbl_ieee128_default" = yes; then
- LONG_DOUBLE_128_FLAGS="-mno-gnu-attribute"
- # Except for the ones that explicitly use these flags:
- LONG_DOUBLE_ALT128_COMPAT_FLAGS="-mabi=ibmlongdouble -mno-gnu-attribute -Wno-psabi"
+ # Eliminate little endian systems without VSX
+ AC_TRY_COMPILE(, [
+ #ifndef __VSX__
+ #error "IEEE 128-bit needs VSX"
+ #endif
+ ], [ac_ieee128_possible=yes], [ac_ieee128_possible=no])
+ if test $ac_ieee128_possible = yes; then
+ # Check for IEEE128 support in libm:
+ AC_CHECK_LIB(m, __frexpieee128,
+ [ac_ldbl_ieee128_in_libc=yes],
+ [ac_ldbl_ieee128_in_libc=no])
+ if test $ac_ldbl_ieee128_in_libc = yes; then
+ # Determine which long double format is the compiler's default:
+ AC_TRY_COMPILE(, [
+ #ifndef __LONG_DOUBLE_IEEE128__
+ #error compiler defaults to ibm128
+ #endif
+ ], [ac_ldbl_ieee128_default=yes], [ac_ldbl_ieee128_default=no])
+ # Library objects should use default long double format.
+ if test "$ac_ldbl_ieee128_default" = yes; then
+ LONG_DOUBLE_128_FLAGS="-mno-gnu-attribute"
+ # Except for the ones that explicitly use these flags:
+ LONG_DOUBLE_ALT128_COMPAT_FLAGS="-mabi=ibmlongdouble -mno-gnu-attribute -Wno-psabi"
+ else
+ LONG_DOUBLE_128_FLAGS="-mno-gnu-attribute"
+ LONG_DOUBLE_ALT128_COMPAT_FLAGS="-mabi=ieeelongdouble -mno-gnu-attribute -Wno-psabi"
+ fi
+ AC_DEFINE([_GLIBCXX_LONG_DOUBLE_ALT128_COMPAT],1,
+ [Define if compatibility should be provided for alternative 128-bit long double formats.])
+ port_specific_symbol_files="$port_specific_symbol_files \$(top_srcdir)/config/os/gnu-linux/ldbl-ieee128-extra.ver"
+ ac_ldbl_alt128_compat=yes
else
- LONG_DOUBLE_128_FLAGS="-mno-gnu-attribute"
- LONG_DOUBLE_ALT128_COMPAT_FLAGS="-mabi=ieeelongdouble -mno-gnu-attribute -Wno-psabi"
+ ac_ldbl_alt128_compat=no
fi
- AC_DEFINE([_GLIBCXX_LONG_DOUBLE_ALT128_COMPAT],1,
- [Define if compatibility should be provided for alternative 128-bit long double formats.])
- port_specific_symbol_files="$port_specific_symbol_files \$(top_srcdir)/config/os/gnu-linux/ldbl-ieee128-extra.ver"
- ac_ldbl_alt128_compat=yes
+
+ # IEEE 128-bit not possible
else
+ acl_ldbl_ieee128_in_libc=no
+ acl_ldbl_ieee128_default=no
ac_ldbl_alt128_compat=no
fi
;;
diff --git a/libstdc++-v3/include/ext/numeric_traits.h b/libstdc++-v3/include/ext/numeric_traits.h
index b2723bfabfa..0f00abb3db6 100644
--- a/libstdc++-v3/include/ext/numeric_traits.h
+++ b/libstdc++-v3/include/ext/numeric_traits.h
@@ -218,7 +218,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
struct __numeric_traits<__ibm128>
: public __numeric_traits_floating<__ibm128>
{ };
-# elif defined __LONG_DOUBLE_IBM128__
+# elif defined __LONG_DOUBLE_IBM128__ && defined __VSX__
// long double is __ibm128, define traits for __ieee128
template<>
struct __numeric_traits_floating<__ieee128>
More information about the Gcc-cvs
mailing list