Message ID | Zo7D92dTJi5MgvVy@cowardly-lion.the-meissners.org |
---|---|
State | New |
Headers | show |
Series | [1/2] PR 115800: Fix libgfortran build using --with-cpu=power5 | expand |
Hi Mike, I guess you should CC fortran@gcc.gnu.org as well. on 2024/7/11 01:25, Michael Meissner wrote: > 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 libgfortran > 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 libstdc++-v3 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-07-10 Michael Meissner <meissner@linux.ibm.com> > > libgfortran/ > > PR target/115800 > * configure.ac (powerpc64le*-linux*): Check to see that the compiler > uses VSX before enabling IEEE 128-bit support. > * configure: Regenerate. > * kinds-override.h (GFC_REAL_17): Add check for __VSX__. > * libgfortran.h (POWER_IEEE128): Likewise. > > --- > libgfortran/configure | 7 +++++-- > libgfortran/configure.ac | 3 +++ > libgfortran/kinds-override.h | 2 +- > libgfortran/libgfortran.h | 2 +- > 4 files changed, 10 insertions(+), 4 deletions(-) > > diff --git a/libgfortran/configure b/libgfortran/configure > index 11a1bc5f070..2708e5c7eca 100755 > --- a/libgfortran/configure > +++ b/libgfortran/configure > @@ -5981,6 +5981,9 @@ if test "x$GCC" = "xyes"; then > #if __SIZEOF_LONG_DOUBLE__ != 16 > #error long double is double > #endif > + #if !defined(__VSX__) > + #error VSX is not available > + #endif All the touched code cares about type _Float128 which is available only if TARGET_FLOAT128_TYPE is set (TARGET_FLOAT128_TYPE depends on VSX). I think we should check for macro __FLOAT128_TYPE__ instead (we define this macro when TARGET_FLOAT128_TYPE is set), IMHO it looks more meaningful, this is similar for libstdc++ sub-patch. BR, Kewen > int > main () > { > @@ -12847,7 +12850,7 @@ else > lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 > lt_status=$lt_dlunknown > cat > conftest.$ac_ext <<_LT_EOF > -#line 12850 "configure" > +#line 12853 "configure" > #include "confdefs.h" > > #if HAVE_DLFCN_H > @@ -12953,7 +12956,7 @@ else > lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 > lt_status=$lt_dlunknown > cat > conftest.$ac_ext <<_LT_EOF > -#line 12956 "configure" > +#line 12959 "configure" > #include "confdefs.h" > > #if HAVE_DLFCN_H > diff --git a/libgfortran/configure.ac b/libgfortran/configure.ac > index cca1ea0ea97..cfaeb9717ab 100644 > --- a/libgfortran/configure.ac > +++ b/libgfortran/configure.ac > @@ -148,6 +148,9 @@ if test "x$GCC" = "xyes"; then > AC_PREPROC_IFELSE( > [AC_LANG_PROGRAM([[#if __SIZEOF_LONG_DOUBLE__ != 16 > #error long double is double > + #endif > + #if !defined(__VSX__) > + #error VSX is not available > #endif]], > [[(void) 0;]])], > [AM_FCFLAGS="$AM_FCFLAGS -mabi=ibmlongdouble -mno-gnu-attribute"; > diff --git a/libgfortran/kinds-override.h b/libgfortran/kinds-override.h > index f6b4956c5ca..51f440e5323 100644 > --- a/libgfortran/kinds-override.h > +++ b/libgfortran/kinds-override.h > @@ -30,7 +30,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see > #endif > > /* Keep these conditions on one line so grep can filter it out. */ > -#if defined(__powerpc64__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ && __SIZEOF_LONG_DOUBLE__ == 16 > +#if defined(__powerpc64__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ && __SIZEOF_LONG_DOUBLE__ == 16 && defined(__VSX__) > typedef _Float128 GFC_REAL_17; > typedef _Complex _Float128 GFC_COMPLEX_17; > #define HAVE_GFC_REAL_17 > diff --git a/libgfortran/libgfortran.h b/libgfortran/libgfortran.h > index 5c59ec26e16..23660335243 100644 > --- a/libgfortran/libgfortran.h > +++ b/libgfortran/libgfortran.h > @@ -104,7 +104,7 @@ typedef off_t gfc_offset; > #endif > > #if defined(__powerpc64__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ \ > - && defined __GLIBC_PREREQ > + && defined __GLIBC_PREREQ && defined(__VSX__) > #if __GLIBC_PREREQ (2, 32) > #define POWER_IEEE128 1 > #endif
diff --git a/libgfortran/configure b/libgfortran/configure index 11a1bc5f070..2708e5c7eca 100755 --- a/libgfortran/configure +++ b/libgfortran/configure @@ -5981,6 +5981,9 @@ if test "x$GCC" = "xyes"; then #if __SIZEOF_LONG_DOUBLE__ != 16 #error long double is double #endif + #if !defined(__VSX__) + #error VSX is not available + #endif int main () { @@ -12847,7 +12850,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 12850 "configure" +#line 12853 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -12953,7 +12956,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 12956 "configure" +#line 12959 "configure" #include "confdefs.h" #if HAVE_DLFCN_H diff --git a/libgfortran/configure.ac b/libgfortran/configure.ac index cca1ea0ea97..cfaeb9717ab 100644 --- a/libgfortran/configure.ac +++ b/libgfortran/configure.ac @@ -148,6 +148,9 @@ if test "x$GCC" = "xyes"; then AC_PREPROC_IFELSE( [AC_LANG_PROGRAM([[#if __SIZEOF_LONG_DOUBLE__ != 16 #error long double is double + #endif + #if !defined(__VSX__) + #error VSX is not available #endif]], [[(void) 0;]])], [AM_FCFLAGS="$AM_FCFLAGS -mabi=ibmlongdouble -mno-gnu-attribute"; diff --git a/libgfortran/kinds-override.h b/libgfortran/kinds-override.h index f6b4956c5ca..51f440e5323 100644 --- a/libgfortran/kinds-override.h +++ b/libgfortran/kinds-override.h @@ -30,7 +30,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #endif /* Keep these conditions on one line so grep can filter it out. */ -#if defined(__powerpc64__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ && __SIZEOF_LONG_DOUBLE__ == 16 +#if defined(__powerpc64__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ && __SIZEOF_LONG_DOUBLE__ == 16 && defined(__VSX__) typedef _Float128 GFC_REAL_17; typedef _Complex _Float128 GFC_COMPLEX_17; #define HAVE_GFC_REAL_17 diff --git a/libgfortran/libgfortran.h b/libgfortran/libgfortran.h index 5c59ec26e16..23660335243 100644 --- a/libgfortran/libgfortran.h +++ b/libgfortran/libgfortran.h @@ -104,7 +104,7 @@ typedef off_t gfc_offset; #endif #if defined(__powerpc64__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ \ - && defined __GLIBC_PREREQ + && defined __GLIBC_PREREQ && defined(__VSX__) #if __GLIBC_PREREQ (2, 32) #define POWER_IEEE128 1 #endif