https://gcc.gnu.org/g:61b479aadbe46f39409f8f3996e3192adf60b66d
commit 61b479aadbe46f39409f8f3996e3192adf60b66d Author: Michael Meissner <meiss...@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 <meiss...@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>