mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-22 21:10:07 +00:00
858045ad1c
ISO C2X has made some changes to the handling of feature test macros related to features from the floating-point TSes, and to exactly what such features are present in what headers, that require corresponding changes in glibc. * For the few features that were controlled by __STDC_WANT_IEC_60559_BFP_EXT__ (and the corresponding DFP macro) in C2X, there is now instead a new feature test macro __STDC_WANT_IEC_60559_EXT__ covering both binary and decimal FP. This controls CR_DECIMAL_DIG in <float.h> (provided by GCC; I implemented support for the new feature test macro for GCC 11) and the totalorder and payload functions in <math.h>. C2X no longer says anything about __STDC_WANT_IEC_60559_BFP_EXT__ (so it's appropriate for that macro to continue to enable exactly the features from TS 18661-1). * The SNAN macros for each floating-point type have moved to <float.h> (and been renamed in the process). Thus, the copies in <math.h> should only be defined for __STDC_WANT_IEC_60559_BFP_EXT__, not for C2X. * The fmaxmag and fminmag functions have been removed (replaced by new functions for the new min/max operations in IEEE 754-2019). Thus those should also only be declared for __STDC_WANT_IEC_60559_BFP_EXT__. * The _FloatN / _FloatNx handling for the last two points in glibc is trickier, since __STDC_WANT_IEC_60559_TYPES_EXT__ is still in C2X (the integration of TS 18661-3 as an Annex, that is, which hasn't yet been merged into the C standard git repository but has been accepted by WG14), so C2X with that macro should not declare some things that are declared for older standards with that macro. The approach taken here is to provide the declarations (when __STDC_WANT_IEC_60559_TYPES_EXT__ is enabled) only when (defined __USE_GNU || !__GLIBC_USE (ISOC2X)), so if C2X features are enabled then those declarations (that are only in TS 18661-3 and not in C2X) will only be provided if _GNU_SOURCE is defined as well. Thus _GNU_SOURCE remains a superset of the TS features as well as of C2X. Some other somewhat related changes in C2X are not addressed here. There's an open proposal not to include the fmin and fmax functions for the _FloatN / _FloatNx types, given the new min/max operations, which could be handled like the previous point if adopted. And the fromfp functions have been changed to return a result in floating type rather than intmax_t / uintmax_t; my inclination there is to treat that like that change of totalorder type (new symbol versions etc. for the ABI change; old versions become compat symbols and are no longer supported as an API). Tested for x86_64 and x86.
111 lines
4.2 KiB
C
111 lines
4.2 KiB
C
/* Handle feature test macros at the start of a header.
|
|
Copyright (C) 2016-2021 Free Software Foundation, Inc.
|
|
This file is part of the GNU C Library.
|
|
|
|
The GNU C Library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Lesser General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2.1 of the License, or (at your option) any later version.
|
|
|
|
The GNU C Library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with the GNU C Library; if not, see
|
|
<https://www.gnu.org/licenses/>. */
|
|
|
|
/* This header is internal to glibc and should not be included outside
|
|
of glibc headers. Headers including it must define
|
|
__GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION first. This header
|
|
cannot have multiple include guards because ISO C feature test
|
|
macros depend on the definition of the macro when an affected
|
|
header is included, not when the first system header is
|
|
included. */
|
|
|
|
#ifndef __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION
|
|
# error "Never include <bits/libc-header-start.h> directly."
|
|
#endif
|
|
|
|
#undef __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION
|
|
|
|
#include <features.h>
|
|
|
|
/* ISO/IEC TR 24731-2:2010 defines the __STDC_WANT_LIB_EXT2__
|
|
macro. */
|
|
#undef __GLIBC_USE_LIB_EXT2
|
|
#if (defined __USE_GNU \
|
|
|| (defined __STDC_WANT_LIB_EXT2__ && __STDC_WANT_LIB_EXT2__ > 0))
|
|
# define __GLIBC_USE_LIB_EXT2 1
|
|
#else
|
|
# define __GLIBC_USE_LIB_EXT2 0
|
|
#endif
|
|
|
|
/* ISO/IEC TS 18661-1:2014 defines the __STDC_WANT_IEC_60559_BFP_EXT__
|
|
macro. Most but not all symbols enabled by that macro in TS
|
|
18661-1 are enabled unconditionally in C2X. In C2X, the symbols in
|
|
Annex F still require a new feature test macro
|
|
__STDC_WANT_IEC_60559_EXT__ instead (C2X does not define
|
|
__STDC_WANT_IEC_60559_BFP_EXT__), while a few features from TS
|
|
18661-1 are not included in C2X (and thus should depend on
|
|
__STDC_WANT_IEC_60559_BFP_EXT__ even when C2X features are
|
|
enabled).
|
|
|
|
__GLIBC_USE (IEC_60559_BFP_EXT) controls those features from TS
|
|
18661-1 not included in C2X.
|
|
|
|
__GLIBC_USE (IEC_60559_BFP_EXT_C2X) controls those features from TS
|
|
18661-1 that are also included in C2X (with no feature test macro
|
|
required in C2X).
|
|
|
|
__GLIBC_USE (IEC_60559_EXT) controls those features from TS 18661-1
|
|
that are included in C2X but conditional on
|
|
__STDC_WANT_IEC_60559_EXT__. (There are currently no features
|
|
conditional on __STDC_WANT_IEC_60559_EXT__ that are not in TS
|
|
18661-1.) */
|
|
#undef __GLIBC_USE_IEC_60559_BFP_EXT
|
|
#if defined __USE_GNU || defined __STDC_WANT_IEC_60559_BFP_EXT__
|
|
# define __GLIBC_USE_IEC_60559_BFP_EXT 1
|
|
#else
|
|
# define __GLIBC_USE_IEC_60559_BFP_EXT 0
|
|
#endif
|
|
#undef __GLIBC_USE_IEC_60559_BFP_EXT_C2X
|
|
#if __GLIBC_USE (IEC_60559_BFP_EXT) || __GLIBC_USE (ISOC2X)
|
|
# define __GLIBC_USE_IEC_60559_BFP_EXT_C2X 1
|
|
#else
|
|
# define __GLIBC_USE_IEC_60559_BFP_EXT_C2X 0
|
|
#endif
|
|
#undef __GLIBC_USE_IEC_60559_EXT
|
|
#if __GLIBC_USE (IEC_60559_BFP_EXT) || defined __STDC_WANT_IEC_60559_EXT__
|
|
# define __GLIBC_USE_IEC_60559_EXT 1
|
|
#else
|
|
# define __GLIBC_USE_IEC_60559_EXT 0
|
|
#endif
|
|
|
|
/* ISO/IEC TS 18661-4:2015 defines the
|
|
__STDC_WANT_IEC_60559_FUNCS_EXT__ macro. Other than the reduction
|
|
functions, the symbols from this TS are enabled unconditionally in
|
|
C2X. */
|
|
#undef __GLIBC_USE_IEC_60559_FUNCS_EXT
|
|
#if defined __USE_GNU || defined __STDC_WANT_IEC_60559_FUNCS_EXT__
|
|
# define __GLIBC_USE_IEC_60559_FUNCS_EXT 1
|
|
#else
|
|
# define __GLIBC_USE_IEC_60559_FUNCS_EXT 0
|
|
#endif
|
|
#undef __GLIBC_USE_IEC_60559_FUNCS_EXT_C2X
|
|
#if __GLIBC_USE (IEC_60559_FUNCS_EXT) || __GLIBC_USE (ISOC2X)
|
|
# define __GLIBC_USE_IEC_60559_FUNCS_EXT_C2X 1
|
|
#else
|
|
# define __GLIBC_USE_IEC_60559_FUNCS_EXT_C2X 0
|
|
#endif
|
|
|
|
/* ISO/IEC TS 18661-3:2015 defines the
|
|
__STDC_WANT_IEC_60559_TYPES_EXT__ macro. */
|
|
#undef __GLIBC_USE_IEC_60559_TYPES_EXT
|
|
#if defined __USE_GNU || defined __STDC_WANT_IEC_60559_TYPES_EXT__
|
|
# define __GLIBC_USE_IEC_60559_TYPES_EXT 1
|
|
#else
|
|
# define __GLIBC_USE_IEC_60559_TYPES_EXT 0
|
|
#endif
|