powerpc64le: raise GCC requirement to 7.4 for long double transition

Add compiler feature tests to ensure we can build ieee128 long double.
These test for -mabi=ieeelongdouble, -mno-gnu-attribute, and -Wno-psabi.

Likewise, verify some compiler bugs have been addressed.  These aren't
helpful for building glibc, but may cause test failures when testing
the new long double.  See notes below from Raji.

On powerpc64le, some older compiler versions give error for the function
signbit() for 128-bit floating point types.  This is fixed by PR83862
in gcc 8.0 and backported to gcc6 and gcc7.  This patch adds a test
to check compiler version to avoid compiler errors during make check.

Likewise, test for -mno-gnu-attribute support which was

On powerpc64le, a few files are built on IEEE long double mode
(-mabi=ieeelongdouble), whereas most are built on IBM long double mode
(-mabi=ibmlongdouble, the default for -mlong-double-128).  Since binutils
2.31, linking object files with different long double modes causes
errors similar to:

  ld: libc_pic.a(s_isinfl.os) uses IBM long double,
      libc_pic.a(ieee128-qefgcvt.os) uses IEEE long double.
  collect2: error: ld returned 1 exit status
  make[2]: *** [../Makerules:649: libc_pic.os] Error 1

The warnings are fair and correct, but in order for glibc to have
support for both long double modes on powerpc64le, they have to be
ignored.  This can be accomplished with the use of -mno-gnu-attribute
option when building the few files that require IEEE long double mode.

However, -mno-gnu-attribute is not available in GCC 6, the minimum
version required to build glibc, so this patch adds a test for this
feature in powerpc64le builds, and fails early if it's not available.

Co-Authored-By: Rajalakshmi Srinivasaraghavan  <raji@linux.vnet.ibm.com>
Co-Authored-By: Gabriel F. T. Gomes <gabrielftg@linux.ibm.com>
Reviewed-by: Tulio Magno Quites Machado Filho <tuliom@linux.ibm.com>
This commit is contained in:
Paul E. Murphy 2020-02-07 14:08:23 -06:00
parent e2239af353
commit 50545f5aa0
5 changed files with 107 additions and 1 deletions

View File

@ -467,6 +467,12 @@ build the GNU C Library:
better code. As of release time, GCC 9.2.1 is the newest compiler better code. As of release time, GCC 9.2.1 is the newest compiler
verified to work to build the GNU C Library. verified to work to 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.
For multi-arch support it is recommended to use a GCC which has For multi-arch support it is recommended to use a GCC which has
been built with support for GNU indirect functions. This ensures been built with support for GNU indirect functions. This ensures
that correct debugging information is generated for functions that correct debugging information is generated for functions

3
NEWS
View File

@ -32,7 +32,8 @@ Deprecated and removed features, and other changes affecting compatibility:
Changes to build and runtime requirements: Changes to build and runtime requirements:
[Add changes to build and runtime requirements here] * powerpc64le requires GCC 7.4 or newer. This is required for supporting
long double redirects.
Security related changes: Security related changes:

View File

@ -507,6 +507,11 @@ the newest version of the compiler that is known to work for building
release time, GCC 9.2.1 is the newest compiler verified to work to build release time, GCC 9.2.1 is the newest compiler verified to work to build
@theglibc{}. @theglibc{}.
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.
For multi-arch support it is recommended to use a GCC which has been built with 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 support for GNU indirect functions. This ensures that correct debugging
information is generated for functions selected by IFUNC resolvers. This information is generated for functions selected by IFUNC resolvers. This

View File

@ -32,4 +32,63 @@ if test "$libc_cv_target_power8_ok" != "yes"; then :
fi fi
CFLAGS="$OLD_CFLAGS" CFLAGS="$OLD_CFLAGS"
OLD_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -mno-gnu-attribute"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the compiler supports -mno-gnu-attribute" >&5
$as_echo_n "checking if the compiler supports -mno-gnu-attribute... " >&6; }
if ${libc_cv_no_gnu_attr_ok+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
libc_cv_no_gnu_attr_ok=yes
else
libc_cv_no_gnu_attr_ok=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_no_gnu_attr_ok" >&5
$as_echo "$libc_cv_no_gnu_attr_ok" >&6; }
if test "$libc_cv_no_gnu_attr_ok" != "yes"; then :
critic_missing="$critic_missing A compiler with -mno-gnu-attribute is required on powerpc64le."
fi
CFLAGS="$OLD_CFLAGS"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC compiles signbit with 128-bit floating point type" >&5
$as_echo_n "checking if $CC compiles signbit with 128-bit floating point type... " >&6; }
if ${libc_cv_compiler_powerpc64le_ice+:} false; then :
$as_echo_n "(cached) " >&6
else
save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -mabi=ieeelongdouble -Wno-psabi"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int sbr (long double a) { return __builtin_signbit (a); }
int sbm (long double *a) { return __builtin_signbit (*a); }
int sbo (long double *a) { return __builtin_signbit (a[4]); }
int sbi (long double *a, unsigned long n) { return __builtin_signbit (a[n]); }
void sbs (int *p, long double a) { *p = __builtin_signbit (a); }
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
libc_cv_compiler_powerpc64le_ice=yes
else
libc_cv_compiler_powerpc64le_ice=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_ice" >&5
$as_echo "$libc_cv_compiler_powerpc64le_ice" >&6; }
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
test -n "$critic_missing" && as_fn_error $? "*** $critic_missing" "$LINENO" 5 test -n "$critic_missing" && as_fn_error $? "*** $critic_missing" "$LINENO" 5

View File

@ -17,4 +17,39 @@ AS_IF([test "$libc_cv_target_power8_ok" != "yes"],
[critic_missing="$critic_missing POWER8 or newer is required on powerpc64le."]) [critic_missing="$critic_missing POWER8 or newer is required on powerpc64le."])
CFLAGS="$OLD_CFLAGS" CFLAGS="$OLD_CFLAGS"
dnl Require support for -mno-gnu-attribute
OLD_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -mno-gnu-attribute"
AC_CACHE_CHECK([if the compiler supports -mno-gnu-attribute],
libc_cv_no_gnu_attr_ok, [
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
]])],
[libc_cv_no_gnu_attr_ok=yes],
[libc_cv_no_gnu_attr_ok=no])])
AS_IF([test "$libc_cv_no_gnu_attr_ok" != "yes"],
[critic_missing="$critic_missing A compiler with -mno-gnu-attribute is required on powerpc64le."])
CFLAGS="$OLD_CFLAGS"
dnl Some old compiler versions give error for the function signbit() for
dnl 128-bit floating point types. This is fixed by PR83862 and backported
dnl to gcc6 and gcc7. This test is to check if we are using the compiler
dnl that has this bug (fixed in GCC 8.0, backported to 7.4).
AC_CACHE_CHECK([if $CC compiles signbit with 128-bit floating point type],
libc_cv_compiler_powerpc64le_ice, [dnl
save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -mabi=ieeelongdouble -Wno-psabi"
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
int sbr (long double a) { return __builtin_signbit (a); }
int sbm (long double *a) { return __builtin_signbit (*a); }
int sbo (long double *a) { return __builtin_signbit (a[4]); }
int sbi (long double *a, unsigned long n) { return __builtin_signbit (a[n]); }
void sbs (int *p, long double a) { *p = __builtin_signbit (a); }
]])],
[libc_cv_compiler_powerpc64le_ice=yes],
[libc_cv_compiler_powerpc64le_ice=no])
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)."])
test -n "$critic_missing" && AC_MSG_ERROR([*** $critic_missing]) test -n "$critic_missing" && AC_MSG_ERROR([*** $critic_missing])