You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
382 lines
15 KiB
382 lines
15 KiB
commit 3e5760fcb48528d48deeb60cb885a97bb731160c |
|
Author: Joseph Myers <joseph@codesourcery.com> |
|
Date: Wed Sep 28 20:09:34 2022 +0000 |
|
|
|
Update _FloatN header support for C++ in GCC 13 |
|
|
|
GCC 13 adds support for _FloatN and _FloatNx types in C++, so breaking |
|
the installed glibc headers that assume such support is not present. |
|
GCC mostly works around this with fixincludes, but that doesn't help |
|
for building glibc and its tests (glibc doesn't itself contain C++ |
|
code, but there's C++ code built for tests). Update glibc's |
|
bits/floatn-common.h and bits/floatn.h headers to handle the GCC 13 |
|
support directly. |
|
|
|
In general the changes match those made by fixincludes, though I think |
|
the ones in sysdeps/powerpc/bits/floatn.h, where the header tests |
|
__LDBL_MANT_DIG__ == 113 or uses #elif, wouldn't match the existing |
|
fixincludes patterns. |
|
|
|
Some places involving special C++ handling in relation to _FloatN |
|
support are not changed. There's no need to change the |
|
__HAVE_FLOATN_NOT_TYPEDEF definition (also in a form that wouldn't be |
|
matched by the fixincludes fixes) because it's only used in relation |
|
to macro definitions using features not supported for C++ |
|
(__builtin_types_compatible_p and _Generic). And there's no need to |
|
change the inline function overloads for issignaling, iszero and |
|
iscanonical in C++ because cases where types have the same format but |
|
are no longer compatible types are handled automatically by the C++ |
|
overload resolution rules. |
|
|
|
This patch also does not change the overload handling for iseqsig, and |
|
there I think changes *are* needed, beyond those in this patch or made |
|
by fixincludes. The way that overload is defined, via a template |
|
parameter to a structure type, requires overloads whenever the types |
|
are incompatible, even if they have the same format. So I think we |
|
need to add overloads with GCC 13 for every supported _FloatN and |
|
_FloatNx type, rather than just having one for _Float128 when it has a |
|
different ABI to long double as at present (but for older GCC, such |
|
overloads must not be defined for types that end up defined as |
|
typedefs for another type). |
|
|
|
Tested with build-many-glibcs.py: compilers build for |
|
aarch64-linux-gnu ia64-linux-gnu mips64-linux-gnu powerpc-linux-gnu |
|
powerpc64le-linux-gnu x86_64-linux-gnu; glibcs build for |
|
aarch64-linux-gnu ia64-linux-gnu i686-linux-gnu mips-linux-gnu |
|
mips64-linux-gnu-n32 powerpc-linux-gnu powerpc64le-linux-gnu |
|
x86_64-linux-gnu. |
|
|
|
diff --git a/bits/floatn-common.h b/bits/floatn-common.h |
|
index b43c9532d8b01cca..45d4555f48483fff 100644 |
|
--- a/bits/floatn-common.h |
|
+++ b/bits/floatn-common.h |
|
@@ -78,7 +78,7 @@ |
|
or _FloatNx types, if __HAVE_<type> is 1. The corresponding |
|
literal suffixes exist since GCC 7, for C only. */ |
|
# if __HAVE_FLOAT16 |
|
-# if !__GNUC_PREREQ (7, 0) || defined __cplusplus |
|
+# if !__GNUC_PREREQ (7, 0) || (defined __cplusplus && !__GNUC_PREREQ (13, 0)) |
|
/* No corresponding suffix available for this type. */ |
|
# define __f16(x) ((_Float16) x##f) |
|
# else |
|
@@ -87,7 +87,7 @@ |
|
# endif |
|
|
|
# if __HAVE_FLOAT32 |
|
-# if !__GNUC_PREREQ (7, 0) || defined __cplusplus |
|
+# if !__GNUC_PREREQ (7, 0) || (defined __cplusplus && !__GNUC_PREREQ (13, 0)) |
|
# define __f32(x) x##f |
|
# else |
|
# define __f32(x) x##f32 |
|
@@ -95,7 +95,7 @@ |
|
# endif |
|
|
|
# if __HAVE_FLOAT64 |
|
-# if !__GNUC_PREREQ (7, 0) || defined __cplusplus |
|
+# if !__GNUC_PREREQ (7, 0) || (defined __cplusplus && !__GNUC_PREREQ (13, 0)) |
|
# ifdef __NO_LONG_DOUBLE_MATH |
|
# define __f64(x) x##l |
|
# else |
|
@@ -107,7 +107,7 @@ |
|
# endif |
|
|
|
# if __HAVE_FLOAT32X |
|
-# if !__GNUC_PREREQ (7, 0) || defined __cplusplus |
|
+# if !__GNUC_PREREQ (7, 0) || (defined __cplusplus && !__GNUC_PREREQ (13, 0)) |
|
# define __f32x(x) x |
|
# else |
|
# define __f32x(x) x##f32x |
|
@@ -115,7 +115,7 @@ |
|
# endif |
|
|
|
# if __HAVE_FLOAT64X |
|
-# if !__GNUC_PREREQ (7, 0) || defined __cplusplus |
|
+# if !__GNUC_PREREQ (7, 0) || (defined __cplusplus && !__GNUC_PREREQ (13, 0)) |
|
# if __HAVE_FLOAT64X_LONG_DOUBLE |
|
# define __f64x(x) x##l |
|
# else |
|
@@ -127,7 +127,7 @@ |
|
# endif |
|
|
|
# if __HAVE_FLOAT128X |
|
-# if !__GNUC_PREREQ (7, 0) || defined __cplusplus |
|
+# if !__GNUC_PREREQ (7, 0) || (defined __cplusplus && !__GNUC_PREREQ (13, 0)) |
|
# error "_Float128X supported but no constant suffix" |
|
# else |
|
# define __f128x(x) x##f128x |
|
@@ -136,7 +136,7 @@ |
|
|
|
/* Defined to a complex type if __HAVE_<type> is 1. */ |
|
# if __HAVE_FLOAT16 |
|
-# if !__GNUC_PREREQ (7, 0) || defined __cplusplus |
|
+# if !__GNUC_PREREQ (7, 0) || (defined __cplusplus && !__GNUC_PREREQ (13, 0)) |
|
typedef _Complex float __cfloat16 __attribute__ ((__mode__ (__HC__))); |
|
# define __CFLOAT16 __cfloat16 |
|
# else |
|
@@ -145,7 +145,7 @@ typedef _Complex float __cfloat16 __attribute__ ((__mode__ (__HC__))); |
|
# endif |
|
|
|
# if __HAVE_FLOAT32 |
|
-# if !__GNUC_PREREQ (7, 0) || defined __cplusplus |
|
+# if !__GNUC_PREREQ (7, 0) || (defined __cplusplus && !__GNUC_PREREQ (13, 0)) |
|
# define __CFLOAT32 _Complex float |
|
# else |
|
# define __CFLOAT32 _Complex _Float32 |
|
@@ -153,7 +153,7 @@ typedef _Complex float __cfloat16 __attribute__ ((__mode__ (__HC__))); |
|
# endif |
|
|
|
# if __HAVE_FLOAT64 |
|
-# if !__GNUC_PREREQ (7, 0) || defined __cplusplus |
|
+# if !__GNUC_PREREQ (7, 0) || (defined __cplusplus && !__GNUC_PREREQ (13, 0)) |
|
# ifdef __NO_LONG_DOUBLE_MATH |
|
# define __CFLOAT64 _Complex long double |
|
# else |
|
@@ -165,7 +165,7 @@ typedef _Complex float __cfloat16 __attribute__ ((__mode__ (__HC__))); |
|
# endif |
|
|
|
# if __HAVE_FLOAT32X |
|
-# if !__GNUC_PREREQ (7, 0) || defined __cplusplus |
|
+# if !__GNUC_PREREQ (7, 0) || (defined __cplusplus && !__GNUC_PREREQ (13, 0)) |
|
# define __CFLOAT32X _Complex double |
|
# else |
|
# define __CFLOAT32X _Complex _Float32x |
|
@@ -173,7 +173,7 @@ typedef _Complex float __cfloat16 __attribute__ ((__mode__ (__HC__))); |
|
# endif |
|
|
|
# if __HAVE_FLOAT64X |
|
-# if !__GNUC_PREREQ (7, 0) || defined __cplusplus |
|
+# if !__GNUC_PREREQ (7, 0) || (defined __cplusplus && !__GNUC_PREREQ (13, 0)) |
|
# if __HAVE_FLOAT64X_LONG_DOUBLE |
|
# define __CFLOAT64X _Complex long double |
|
# else |
|
@@ -185,7 +185,7 @@ typedef _Complex float __cfloat16 __attribute__ ((__mode__ (__HC__))); |
|
# endif |
|
|
|
# if __HAVE_FLOAT128X |
|
-# if !__GNUC_PREREQ (7, 0) || defined __cplusplus |
|
+# if !__GNUC_PREREQ (7, 0) || (defined __cplusplus && !__GNUC_PREREQ (13, 0)) |
|
# error "_Float128X supported but no complex type" |
|
# else |
|
# define __CFLOAT128X _Complex _Float128x |
|
@@ -195,7 +195,7 @@ typedef _Complex float __cfloat16 __attribute__ ((__mode__ (__HC__))); |
|
/* The remaining of this file provides support for older compilers. */ |
|
# if __HAVE_FLOAT16 |
|
|
|
-# if !__GNUC_PREREQ (7, 0) || defined __cplusplus |
|
+# if !__GNUC_PREREQ (7, 0) || (defined __cplusplus && !__GNUC_PREREQ (13, 0)) |
|
typedef float _Float16 __attribute__ ((__mode__ (__HF__))); |
|
# endif |
|
|
|
@@ -210,7 +210,7 @@ typedef float _Float16 __attribute__ ((__mode__ (__HF__))); |
|
|
|
# if __HAVE_FLOAT32 |
|
|
|
-# if !__GNUC_PREREQ (7, 0) || defined __cplusplus |
|
+# if !__GNUC_PREREQ (7, 0) || (defined __cplusplus && !__GNUC_PREREQ (13, 0)) |
|
typedef float _Float32; |
|
# endif |
|
|
|
@@ -234,7 +234,7 @@ typedef float _Float32; |
|
|
|
# ifdef __NO_LONG_DOUBLE_MATH |
|
|
|
-# if !__GNUC_PREREQ (7, 0) || defined __cplusplus |
|
+# if !__GNUC_PREREQ (7, 0) || (defined __cplusplus && !__GNUC_PREREQ (13, 0)) |
|
typedef long double _Float64; |
|
# endif |
|
|
|
@@ -247,7 +247,7 @@ typedef long double _Float64; |
|
|
|
# else |
|
|
|
-# if !__GNUC_PREREQ (7, 0) || defined __cplusplus |
|
+# if !__GNUC_PREREQ (7, 0) || (defined __cplusplus && !__GNUC_PREREQ (13, 0)) |
|
typedef double _Float64; |
|
# endif |
|
|
|
@@ -264,7 +264,7 @@ typedef double _Float64; |
|
|
|
# if __HAVE_FLOAT32X |
|
|
|
-# if !__GNUC_PREREQ (7, 0) || defined __cplusplus |
|
+# if !__GNUC_PREREQ (7, 0) || (defined __cplusplus && !__GNUC_PREREQ (13, 0)) |
|
typedef double _Float32x; |
|
# endif |
|
|
|
@@ -281,7 +281,7 @@ typedef double _Float32x; |
|
|
|
# if __HAVE_FLOAT64X_LONG_DOUBLE |
|
|
|
-# if !__GNUC_PREREQ (7, 0) || defined __cplusplus |
|
+# if !__GNUC_PREREQ (7, 0) || (defined __cplusplus && !__GNUC_PREREQ (13, 0)) |
|
typedef long double _Float64x; |
|
# endif |
|
|
|
@@ -294,7 +294,7 @@ typedef long double _Float64x; |
|
|
|
# else |
|
|
|
-# if !__GNUC_PREREQ (7, 0) || defined __cplusplus |
|
+# if !__GNUC_PREREQ (7, 0) || (defined __cplusplus && !__GNUC_PREREQ (13, 0)) |
|
typedef _Float128 _Float64x; |
|
# endif |
|
|
|
@@ -311,7 +311,7 @@ typedef _Float128 _Float64x; |
|
|
|
# if __HAVE_FLOAT128X |
|
|
|
-# if !__GNUC_PREREQ (7, 0) || defined __cplusplus |
|
+# if !__GNUC_PREREQ (7, 0) || (defined __cplusplus && !__GNUC_PREREQ (13, 0)) |
|
# error "_Float128x supported but no type" |
|
# endif |
|
|
|
diff --git a/sysdeps/ia64/bits/floatn.h b/sysdeps/ia64/bits/floatn.h |
|
index 60c5a130e12d88a1..3d493909aeebf81e 100644 |
|
--- a/sysdeps/ia64/bits/floatn.h |
|
+++ b/sysdeps/ia64/bits/floatn.h |
|
@@ -56,7 +56,7 @@ |
|
/* Defined to concatenate the literal suffix to be used with _Float128 |
|
types, if __HAVE_FLOAT128 is 1. */ |
|
# if __HAVE_FLOAT128 |
|
-# if !__GNUC_PREREQ (7, 0) || defined __cplusplus |
|
+# if !__GNUC_PREREQ (7, 0) || (defined __cplusplus && !__GNUC_PREREQ (13, 0)) |
|
/* The literal suffix f128 exists only since GCC 7.0. */ |
|
# define __f128(x) x##q |
|
# else |
|
@@ -66,7 +66,7 @@ |
|
|
|
/* Defined to a complex binary128 type if __HAVE_FLOAT128 is 1. */ |
|
# if __HAVE_FLOAT128 |
|
-# if !__GNUC_PREREQ (7, 0) || defined __cplusplus |
|
+# if !__GNUC_PREREQ (7, 0) || (defined __cplusplus && !__GNUC_PREREQ (13, 0)) |
|
/* Add a typedef for older GCC compilers which don't natively support |
|
_Complex _Float128. */ |
|
typedef _Complex float __cfloat128 __attribute__ ((__mode__ (__TC__))); |
|
@@ -80,7 +80,7 @@ typedef _Complex float __cfloat128 __attribute__ ((__mode__ (__TC__))); |
|
# if __HAVE_FLOAT128 |
|
|
|
/* The type _Float128 exists only since GCC 7.0. */ |
|
-# if !__GNUC_PREREQ (7, 0) || defined __cplusplus |
|
+# if !__GNUC_PREREQ (7, 0) || (defined __cplusplus && !__GNUC_PREREQ (13, 0)) |
|
typedef __float128 _Float128; |
|
# endif |
|
|
|
diff --git a/sysdeps/ieee754/ldbl-128/bits/floatn.h b/sysdeps/ieee754/ldbl-128/bits/floatn.h |
|
index da50ae796f681c60..d75a3d12e890c0be 100644 |
|
--- a/sysdeps/ieee754/ldbl-128/bits/floatn.h |
|
+++ b/sysdeps/ieee754/ldbl-128/bits/floatn.h |
|
@@ -55,7 +55,7 @@ |
|
/* Defined to concatenate the literal suffix to be used with _Float128 |
|
types, if __HAVE_FLOAT128 is 1. */ |
|
# if __HAVE_FLOAT128 |
|
-# if !__GNUC_PREREQ (7, 0) || defined __cplusplus |
|
+# if !__GNUC_PREREQ (7, 0) || (defined __cplusplus && !__GNUC_PREREQ (13, 0)) |
|
/* The literal suffix f128 exists only since GCC 7.0. */ |
|
# define __f128(x) x##l |
|
# else |
|
@@ -65,7 +65,7 @@ |
|
|
|
/* Defined to a complex binary128 type if __HAVE_FLOAT128 is 1. */ |
|
# if __HAVE_FLOAT128 |
|
-# if !__GNUC_PREREQ (7, 0) || defined __cplusplus |
|
+# if !__GNUC_PREREQ (7, 0) || (defined __cplusplus && !__GNUC_PREREQ (13, 0)) |
|
# define __CFLOAT128 _Complex long double |
|
# else |
|
# define __CFLOAT128 _Complex _Float128 |
|
@@ -76,7 +76,7 @@ |
|
# if __HAVE_FLOAT128 |
|
|
|
/* The type _Float128 exists only since GCC 7.0. */ |
|
-# if !__GNUC_PREREQ (7, 0) || defined __cplusplus |
|
+# if !__GNUC_PREREQ (7, 0) || (defined __cplusplus && !__GNUC_PREREQ (13, 0)) |
|
typedef long double _Float128; |
|
# endif |
|
|
|
diff --git a/sysdeps/mips/ieee754/bits/floatn.h b/sysdeps/mips/ieee754/bits/floatn.h |
|
index b7720a2889e59e8f..fe7be983592e1e0e 100644 |
|
--- a/sysdeps/mips/ieee754/bits/floatn.h |
|
+++ b/sysdeps/mips/ieee754/bits/floatn.h |
|
@@ -55,7 +55,7 @@ |
|
/* Defined to concatenate the literal suffix to be used with _Float128 |
|
types, if __HAVE_FLOAT128 is 1. */ |
|
# if __HAVE_FLOAT128 |
|
-# if !__GNUC_PREREQ (7, 0) || defined __cplusplus |
|
+# if !__GNUC_PREREQ (7, 0) || (defined __cplusplus && !__GNUC_PREREQ (13, 0)) |
|
/* The literal suffix f128 exists only since GCC 7.0. */ |
|
# define __f128(x) x##l |
|
# else |
|
@@ -65,7 +65,7 @@ |
|
|
|
/* Defined to a complex binary128 type if __HAVE_FLOAT128 is 1. */ |
|
# if __HAVE_FLOAT128 |
|
-# if !__GNUC_PREREQ (7, 0) || defined __cplusplus |
|
+# if !__GNUC_PREREQ (7, 0) || (defined __cplusplus && !__GNUC_PREREQ (13, 0)) |
|
# define __CFLOAT128 _Complex long double |
|
# else |
|
# define __CFLOAT128 _Complex _Float128 |
|
@@ -76,7 +76,7 @@ |
|
# if __HAVE_FLOAT128 |
|
|
|
/* The type _Float128 exists only since GCC 7.0. */ |
|
-# if !__GNUC_PREREQ (7, 0) || defined __cplusplus |
|
+# if !__GNUC_PREREQ (7, 0) || (defined __cplusplus && !__GNUC_PREREQ (13, 0)) |
|
typedef long double _Float128; |
|
# endif |
|
|
|
diff --git a/sysdeps/powerpc/bits/floatn.h b/sysdeps/powerpc/bits/floatn.h |
|
index fab164e0a2907668..a5a572f646dac2bf 100644 |
|
--- a/sysdeps/powerpc/bits/floatn.h |
|
+++ b/sysdeps/powerpc/bits/floatn.h |
|
@@ -57,7 +57,7 @@ |
|
/* Defined to concatenate the literal suffix to be used with _Float128 |
|
types, if __HAVE_FLOAT128 is 1. */ |
|
# if __HAVE_FLOAT128 |
|
-# if !__GNUC_PREREQ (7, 0) || defined __cplusplus |
|
+# if !__GNUC_PREREQ (7, 0) || (defined __cplusplus && !__GNUC_PREREQ (13, 0)) |
|
/* The literal suffix (f128) exist for powerpc only since GCC 7.0. */ |
|
# if __LDBL_MANT_DIG__ == 113 |
|
# define __f128(x) x##l |
|
@@ -71,10 +71,10 @@ |
|
|
|
/* Defined to a complex binary128 type if __HAVE_FLOAT128 is 1. */ |
|
# if __HAVE_FLOAT128 |
|
-# if __LDBL_MANT_DIG__ == 113 && defined __cplusplus |
|
+# if __LDBL_MANT_DIG__ == 113 && defined __cplusplus && !__GNUC_PREREQ (13, 0) |
|
typedef long double _Float128; |
|
# define __CFLOAT128 _Complex long double |
|
-# elif !__GNUC_PREREQ (7, 0) || defined __cplusplus |
|
+# elif !__GNUC_PREREQ (7, 0) || (defined __cplusplus && !__GNUC_PREREQ (13, 0)) |
|
/* The type _Float128 exist for powerpc only since GCC 7.0. */ |
|
typedef __float128 _Float128; |
|
/* Add a typedef for older GCC and C++ compilers which don't natively support |
|
diff --git a/sysdeps/x86/bits/floatn.h b/sysdeps/x86/bits/floatn.h |
|
index f0c51716a99c1886..8674273f46b87069 100644 |
|
--- a/sysdeps/x86/bits/floatn.h |
|
+++ b/sysdeps/x86/bits/floatn.h |
|
@@ -58,7 +58,7 @@ |
|
/* Defined to concatenate the literal suffix to be used with _Float128 |
|
types, if __HAVE_FLOAT128 is 1. */ |
|
# if __HAVE_FLOAT128 |
|
-# if !__GNUC_PREREQ (7, 0) || defined __cplusplus |
|
+# if !__GNUC_PREREQ (7, 0) || (defined __cplusplus && !__GNUC_PREREQ (13, 0)) |
|
/* The literal suffix f128 exists only since GCC 7.0. */ |
|
# define __f128(x) x##q |
|
# else |
|
@@ -68,7 +68,7 @@ |
|
|
|
/* Defined to a complex binary128 type if __HAVE_FLOAT128 is 1. */ |
|
# if __HAVE_FLOAT128 |
|
-# if !__GNUC_PREREQ (7, 0) || defined __cplusplus |
|
+# if !__GNUC_PREREQ (7, 0) || (defined __cplusplus && !__GNUC_PREREQ (13, 0)) |
|
/* Add a typedef for older GCC compilers which don't natively support |
|
_Complex _Float128. */ |
|
typedef _Complex float __cfloat128 __attribute__ ((__mode__ (__TC__))); |
|
@@ -82,7 +82,7 @@ typedef _Complex float __cfloat128 __attribute__ ((__mode__ (__TC__))); |
|
# if __HAVE_FLOAT128 |
|
|
|
/* The type _Float128 exists only since GCC 7.0. */ |
|
-# if !__GNUC_PREREQ (7, 0) || defined __cplusplus |
|
+# if !__GNUC_PREREQ (7, 0) || (defined __cplusplus && !__GNUC_PREREQ (13, 0)) |
|
typedef __float128 _Float128; |
|
# endif |
|
|
|
|