This adds support for the new __ieee128 long double format on powerpc64le targets. Most of the complexity comes from wanting a single libstdc++.so library that contains the symbols needed by code compiled with both -mabi=ibmlongdouble and -mabi=ieeelongdouble (and not forgetting -mlong-double-64 as well!) In a few places this just requires an extra overload, for example std::from_chars has to be overloaded for both forms of long double. That can be done in a single translation unit that defines overloads for 'long double' and also '__ieee128', so that user code including <charconv> will be able to link to a definition for either type of long double. Those are the easy cases. The difficult parts are (as for the std::string ABI transition) the I/O and locale facets. In order to be able to write either form of long double to an ostream such as std::cout we need the locale to contain a std::num_put facet that can handle both forms. The same approach is taken as was already done for supporting 64-bit long double and 128-bit long double: adding extra overloads of do_put to the facet class. On targets where the new long double code is enabled, the facets that are registered in the locale at program startup have additional overloads so that they can work with any long double type. Where this fails to work is if user code installs its own facet, which will probably not have the additional overloads and so will only be able to output one or the other type. In practice the number of users expecting to be able to use their own locale facets in code using a mix of -mabi=ibmlongdouble and -mabi=ieeelongdouble is probably close to zero. libstdc++-v3/ChangeLog: * Makefile.in: Regenerate. * config.h.in: Regenerate. * config/abi/pre/gnu.ver: Make patterns less greedy. * config/os/gnu-linux/ldbl-ieee128-extra.ver: New file with patterns for IEEE128 long double symbols. * configure: Regenerate. * configure.ac: Enable alternative 128-bit long double format on powerpc64*-*-linux*. * doc/Makefile.in: Regenerate. * fragment.am: Regenerate. * include/Makefile.am: Set _GLIBCXX_LONG_DOUBLE_ALT128_COMPAT. * include/Makefile.in: Regenerate. * include/bits/c++config: Define inline namespace for new long double symbols. Don't define _GLIBCXX_USE_FLOAT128 when it's the same type as long double. * include/bits/locale_classes.h [_GLIBCXX_LONG_DOUBLE_ALT128_COMPAT] (locale::_Impl::_M_init_extra_ldbl128): Declare new member function. * include/bits/locale_facets.h (_GLIBCXX_NUM_FACETS): Simplify by only counting narrow character facets. (_GLIBCXX_NUM_CXX11_FACETS): Likewise. (_GLIBCXX_NUM_LBDL_ALT128_FACETS): New. [_GLIBCXX_LONG_DOUBLE_ALT128_COMPAT] (num_get::__do_get): Define vtable placeholder for __ibm128 long double type. [_GLIBCXX_LONG_DOUBLE_ALT128_COMPAT && __LONG_DOUBLE_IEEE128__] (num_get::__do_get): Declare vtable placeholder for __ibm128 long double type. [_GLIBCXX_LONG_DOUBLE_ALT128_COMPAT && __LONG_DOUBLE_IEEE128__] (num_put::__do_put): Likewise. * include/bits/locale_facets.tcc [_GLIBCXX_LONG_DOUBLE_ALT128_COMPAT && __LONG_DOUBLE_IEEE128__] (num_get::__do_get, num_put::__do_put): Define. * include/bits/locale_facets_nonio.h [_GLIBCXX_LONG_DOUBLE_ALT128_COMPAT && __LONG_DOUBLE_IEEE128__] (money_get::__do_get): Declare vtable placeholder for __ibm128 long double type. [_GLIBCXX_LONG_DOUBLE_ALT128_COMPAT && __LONG_DOUBLE_IEEE128__] (money_put::__do_put): Likewise. * include/bits/locale_facets_nonio.tcc [_GLIBCXX_LONG_DOUBLE_ALT128_COMPAT && __LONG_DOUBLE_IEEE128__] (money_get::__do_get, money_put::__do_put): Define. * include/ext/numeric_traits.h [_GLIBCXX_LONG_DOUBLE_ALT128_COMPAT] (__numeric_traits<__ibm128>, __numeric_traits<__ieee128>): Define. * libsupc++/Makefile.in: Regenerate. * po/Makefile.in: Regenerate. * python/Makefile.in: Regenerate. * src/Makefile.am: Add compatibility-ldbl-alt128.cc and compatibility-ldbl-alt128-cxx11.cc sources and recipes for objects. * src/Makefile.in: Regenerate. * src/c++11/Makefile.in: Regenerate. * src/c++11/compatibility-ldbl-alt128-cxx11.cc: New file defining symbols using the old 128-bit long double format, for the cxx11 ABI. * src/c++11/compatibility-ldbl-alt128.cc: Likewise, for the gcc4-compatible ABI. * src/c++11/compatibility-ldbl-facets-aliases.h: New header for long double compat aliases. * src/c++11/cow-locale_init.cc: Add comment. * src/c++11/cxx11-locale-inst.cc: Define C and C_is_char unconditionally. * src/c++11/cxx11-wlocale-inst.cc: Add sanity check. Include locale-inst.cc directly, not via cxx11-locale-inst.cc. * src/c++11/locale-inst-monetary.h: New header for monetary category instantiations. * src/c++11/locale-inst-numeric.h: New header for numeric category instantiations. * src/c++11/locale-inst.cc: Include new headers for monetary, numeric, and long double definitions. * src/c++11/wlocale-inst.cc: Remove long double compat aliases that are defined in new header now. * src/c++17/Makefile.am: Use -mabi=ibmlongdouble for floating_from_chars.cc. * src/c++17/Makefile.in: Regenerate. * src/c++17/floating_from_chars.cc (from_chars_impl): Add if-constexpr branch for __ieee128. (from_chars): Overload for __ieee128. * src/c++20/Makefile.in: Regenerate. * src/c++98/Makefile.in: Regenerate. * src/c++98/locale_init.cc (num_facets): Adjust calculation. (locale::_Impl::_Impl(size_t)): Call _M_init_extra_ldbl128. * src/c++98/localename.cc (num_facets): Adjust calculation. (locale::_Impl::_Impl(const char*, size_t)): Call _M_init_extra_ldbl128. * src/filesystem/Makefile.in: Regenerate. * testsuite/Makefile.in: Regenerate. * testsuite/util/testsuite_abi.cc: Add new symbol versions. Allow new symbols to be added to GLIBCXX_IEEE128_3.4.29 and CXXABI_IEEE128_1.3.13 too. * testsuite/26_numerics/complex/abi_tag.cc: Add u9__ieee128 to regex matching expected symbols.
769 lines
23 KiB
C++
769 lines
23 KiB
C++
// Predefined symbols and macros -*- C++ -*-
|
|
|
|
// Copyright (C) 1997-2020 Free Software Foundation, Inc.
|
|
//
|
|
// This file is part of the GNU ISO C++ Library. This library is free
|
|
// software; you can redistribute it and/or modify it under the
|
|
// terms of the GNU General Public License as published by the
|
|
// Free Software Foundation; either version 3, or (at your option)
|
|
// any later version.
|
|
|
|
// This 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 General Public License for more details.
|
|
|
|
// Under Section 7 of GPL version 3, you are granted additional
|
|
// permissions described in the GCC Runtime Library Exception, version
|
|
// 3.1, as published by the Free Software Foundation.
|
|
|
|
// You should have received a copy of the GNU General Public License and
|
|
// a copy of the GCC Runtime Library Exception along with this program;
|
|
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
|
// <http://www.gnu.org/licenses/>.
|
|
|
|
/** @file bits/c++config.h
|
|
* This is an internal header file, included by other library headers.
|
|
* Do not attempt to use it directly. @headername{version}
|
|
*/
|
|
|
|
#ifndef _GLIBCXX_CXX_CONFIG_H
|
|
#define _GLIBCXX_CXX_CONFIG_H 1
|
|
|
|
// The major release number for the GCC release the C++ library belongs to.
|
|
#define _GLIBCXX_RELEASE
|
|
|
|
// The datestamp of the C++ library in compressed ISO date format.
|
|
#define __GLIBCXX__
|
|
|
|
// Macros for various attributes.
|
|
// _GLIBCXX_PURE
|
|
// _GLIBCXX_CONST
|
|
// _GLIBCXX_NORETURN
|
|
// _GLIBCXX_NOTHROW
|
|
// _GLIBCXX_VISIBILITY
|
|
#ifndef _GLIBCXX_PURE
|
|
# define _GLIBCXX_PURE __attribute__ ((__pure__))
|
|
#endif
|
|
|
|
#ifndef _GLIBCXX_CONST
|
|
# define _GLIBCXX_CONST __attribute__ ((__const__))
|
|
#endif
|
|
|
|
#ifndef _GLIBCXX_NORETURN
|
|
# define _GLIBCXX_NORETURN __attribute__ ((__noreturn__))
|
|
#endif
|
|
|
|
// See below for C++
|
|
#ifndef _GLIBCXX_NOTHROW
|
|
# ifndef __cplusplus
|
|
# define _GLIBCXX_NOTHROW __attribute__((__nothrow__))
|
|
# endif
|
|
#endif
|
|
|
|
// Macros for visibility attributes.
|
|
// _GLIBCXX_HAVE_ATTRIBUTE_VISIBILITY
|
|
// _GLIBCXX_VISIBILITY
|
|
#define _GLIBCXX_HAVE_ATTRIBUTE_VISIBILITY
|
|
|
|
#if _GLIBCXX_HAVE_ATTRIBUTE_VISIBILITY
|
|
# define _GLIBCXX_VISIBILITY(V) __attribute__ ((__visibility__ (#V)))
|
|
#else
|
|
// If this is not supplied by the OS-specific or CPU-specific
|
|
// headers included below, it will be defined to an empty default.
|
|
# define _GLIBCXX_VISIBILITY(V) _GLIBCXX_PSEUDO_VISIBILITY(V)
|
|
#endif
|
|
|
|
// Macros for deprecated attributes.
|
|
// _GLIBCXX_USE_DEPRECATED
|
|
// _GLIBCXX_DEPRECATED
|
|
// _GLIBCXX_DEPRECATED_SUGGEST( string-literal )
|
|
// _GLIBCXX11_DEPRECATED
|
|
// _GLIBCXX11_DEPRECATED_SUGGEST( string-literal )
|
|
// _GLIBCXX17_DEPRECATED
|
|
// _GLIBCXX17_DEPRECATED_SUGGEST( string-literal )
|
|
// _GLIBCXX20_DEPRECATED( string-literal )
|
|
// _GLIBCXX20_DEPRECATED_SUGGEST( string-literal )
|
|
#ifndef _GLIBCXX_USE_DEPRECATED
|
|
# define _GLIBCXX_USE_DEPRECATED 1
|
|
#endif
|
|
|
|
#if defined(__DEPRECATED)
|
|
# define _GLIBCXX_DEPRECATED __attribute__ ((__deprecated__))
|
|
# define _GLIBCXX_DEPRECATED_SUGGEST(ALT) \
|
|
__attribute__ ((__deprecated__ ("use '" ALT "' instead")))
|
|
#else
|
|
# define _GLIBCXX_DEPRECATED
|
|
# define _GLIBCXX_DEPRECATED_SUGGEST(ALT)
|
|
#endif
|
|
|
|
#if defined(__DEPRECATED) && (__cplusplus >= 201103L)
|
|
# define _GLIBCXX11_DEPRECATED _GLIBCXX_DEPRECATED
|
|
# define _GLIBCXX11_DEPRECATED_SUGGEST(ALT) _GLIBCXX_DEPRECATED_SUGGEST(ALT)
|
|
#else
|
|
# define _GLIBCXX11_DEPRECATED
|
|
# define _GLIBCXX11_DEPRECATED_SUGGEST(ALT)
|
|
#endif
|
|
|
|
#if defined(__DEPRECATED) && (__cplusplus >= 201703L)
|
|
# define _GLIBCXX17_DEPRECATED [[__deprecated__]]
|
|
# define _GLIBCXX17_DEPRECATED_SUGGEST(ALT) _GLIBCXX_DEPRECATED_SUGGEST(ALT)
|
|
#else
|
|
# define _GLIBCXX17_DEPRECATED
|
|
# define _GLIBCXX17_DEPRECATED_SUGGEST(ALT)
|
|
#endif
|
|
|
|
#if defined(__DEPRECATED) && (__cplusplus > 201703L)
|
|
# define _GLIBCXX20_DEPRECATED(MSG) [[deprecated(MSG)]]
|
|
# define _GLIBCXX20_DEPRECATED_SUGGEST(ALT) _GLIBCXX_DEPRECATED_SUGGEST(ALT)
|
|
#else
|
|
# define _GLIBCXX20_DEPRECATED(MSG)
|
|
# define _GLIBCXX20_DEPRECATED_SUGGEST(ALT)
|
|
#endif
|
|
|
|
// Macros for ABI tag attributes.
|
|
#ifndef _GLIBCXX_ABI_TAG_CXX11
|
|
# define _GLIBCXX_ABI_TAG_CXX11 __attribute ((__abi_tag__ ("cxx11")))
|
|
#endif
|
|
|
|
// Macro to warn about unused results.
|
|
#if __cplusplus >= 201703L
|
|
# define _GLIBCXX_NODISCARD [[__nodiscard__]]
|
|
#else
|
|
# define _GLIBCXX_NODISCARD
|
|
#endif
|
|
|
|
|
|
|
|
#if __cplusplus
|
|
|
|
// Macro for constexpr, to support in mixed 03/0x mode.
|
|
#ifndef _GLIBCXX_CONSTEXPR
|
|
# if __cplusplus >= 201103L
|
|
# define _GLIBCXX_CONSTEXPR constexpr
|
|
# define _GLIBCXX_USE_CONSTEXPR constexpr
|
|
# else
|
|
# define _GLIBCXX_CONSTEXPR
|
|
# define _GLIBCXX_USE_CONSTEXPR const
|
|
# endif
|
|
#endif
|
|
|
|
#ifndef _GLIBCXX14_CONSTEXPR
|
|
# if __cplusplus >= 201402L
|
|
# define _GLIBCXX14_CONSTEXPR constexpr
|
|
# else
|
|
# define _GLIBCXX14_CONSTEXPR
|
|
# endif
|
|
#endif
|
|
|
|
#ifndef _GLIBCXX17_CONSTEXPR
|
|
# if __cplusplus >= 201703L
|
|
# define _GLIBCXX17_CONSTEXPR constexpr
|
|
# else
|
|
# define _GLIBCXX17_CONSTEXPR
|
|
# endif
|
|
#endif
|
|
|
|
#ifndef _GLIBCXX20_CONSTEXPR
|
|
# if __cplusplus > 201703L
|
|
# define _GLIBCXX20_CONSTEXPR constexpr
|
|
# else
|
|
# define _GLIBCXX20_CONSTEXPR
|
|
# endif
|
|
#endif
|
|
|
|
#ifndef _GLIBCXX17_INLINE
|
|
# if __cplusplus >= 201703L
|
|
# define _GLIBCXX17_INLINE inline
|
|
# else
|
|
# define _GLIBCXX17_INLINE
|
|
# endif
|
|
#endif
|
|
|
|
// Macro for noexcept, to support in mixed 03/0x mode.
|
|
#ifndef _GLIBCXX_NOEXCEPT
|
|
# if __cplusplus >= 201103L
|
|
# define _GLIBCXX_NOEXCEPT noexcept
|
|
# define _GLIBCXX_NOEXCEPT_IF(...) noexcept(__VA_ARGS__)
|
|
# define _GLIBCXX_USE_NOEXCEPT noexcept
|
|
# define _GLIBCXX_THROW(_EXC)
|
|
# else
|
|
# define _GLIBCXX_NOEXCEPT
|
|
# define _GLIBCXX_NOEXCEPT_IF(...)
|
|
# define _GLIBCXX_USE_NOEXCEPT throw()
|
|
# define _GLIBCXX_THROW(_EXC) throw(_EXC)
|
|
# endif
|
|
#endif
|
|
|
|
#ifndef _GLIBCXX_NOTHROW
|
|
# define _GLIBCXX_NOTHROW _GLIBCXX_USE_NOEXCEPT
|
|
#endif
|
|
|
|
#ifndef _GLIBCXX_THROW_OR_ABORT
|
|
# if __cpp_exceptions
|
|
# define _GLIBCXX_THROW_OR_ABORT(_EXC) (throw (_EXC))
|
|
# else
|
|
# define _GLIBCXX_THROW_OR_ABORT(_EXC) (__builtin_abort())
|
|
# endif
|
|
#endif
|
|
|
|
#if __cpp_noexcept_function_type
|
|
#define _GLIBCXX_NOEXCEPT_PARM , bool _NE
|
|
#define _GLIBCXX_NOEXCEPT_QUAL noexcept (_NE)
|
|
#else
|
|
#define _GLIBCXX_NOEXCEPT_PARM
|
|
#define _GLIBCXX_NOEXCEPT_QUAL
|
|
#endif
|
|
|
|
// Macro for extern template, ie controlling template linkage via use
|
|
// of extern keyword on template declaration. As documented in the g++
|
|
// manual, it inhibits all implicit instantiations and is used
|
|
// throughout the library to avoid multiple weak definitions for
|
|
// required types that are already explicitly instantiated in the
|
|
// library binary. This substantially reduces the binary size of
|
|
// resulting executables.
|
|
// Special case: _GLIBCXX_EXTERN_TEMPLATE == -1 disallows extern
|
|
// templates only in basic_string, thus activating its debug-mode
|
|
// checks even at -O0.
|
|
#define _GLIBCXX_EXTERN_TEMPLATE
|
|
|
|
/*
|
|
Outline of libstdc++ namespaces.
|
|
|
|
namespace std
|
|
{
|
|
namespace __debug { }
|
|
namespace __parallel { }
|
|
namespace __cxx1998 { }
|
|
|
|
namespace __detail {
|
|
namespace __variant { } // C++17
|
|
}
|
|
|
|
namespace rel_ops { }
|
|
|
|
namespace tr1
|
|
{
|
|
namespace placeholders { }
|
|
namespace regex_constants { }
|
|
namespace __detail { }
|
|
}
|
|
|
|
namespace tr2 { }
|
|
|
|
namespace decimal { }
|
|
|
|
namespace chrono { } // C++11
|
|
namespace placeholders { } // C++11
|
|
namespace regex_constants { } // C++11
|
|
namespace this_thread { } // C++11
|
|
inline namespace literals { // C++14
|
|
inline namespace chrono_literals { } // C++14
|
|
inline namespace complex_literals { } // C++14
|
|
inline namespace string_literals { } // C++14
|
|
inline namespace string_view_literals { } // C++17
|
|
}
|
|
}
|
|
|
|
namespace abi { }
|
|
|
|
namespace __gnu_cxx
|
|
{
|
|
namespace __detail { }
|
|
}
|
|
|
|
For full details see:
|
|
http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/namespaces.html
|
|
*/
|
|
namespace std
|
|
{
|
|
typedef __SIZE_TYPE__ size_t;
|
|
typedef __PTRDIFF_TYPE__ ptrdiff_t;
|
|
|
|
#if __cplusplus >= 201103L
|
|
typedef decltype(nullptr) nullptr_t;
|
|
#endif
|
|
}
|
|
|
|
#define _GLIBCXX_USE_DUAL_ABI
|
|
|
|
#if ! _GLIBCXX_USE_DUAL_ABI
|
|
// Ignore any pre-defined value of _GLIBCXX_USE_CXX11_ABI
|
|
# undef _GLIBCXX_USE_CXX11_ABI
|
|
#endif
|
|
|
|
#ifndef _GLIBCXX_USE_CXX11_ABI
|
|
#define _GLIBCXX_USE_CXX11_ABI
|
|
#endif
|
|
|
|
#if _GLIBCXX_USE_CXX11_ABI
|
|
namespace std
|
|
{
|
|
inline namespace __cxx11 __attribute__((__abi_tag__ ("cxx11"))) { }
|
|
}
|
|
namespace __gnu_cxx
|
|
{
|
|
inline namespace __cxx11 __attribute__((__abi_tag__ ("cxx11"))) { }
|
|
}
|
|
# define _GLIBCXX_NAMESPACE_CXX11 __cxx11::
|
|
# define _GLIBCXX_BEGIN_NAMESPACE_CXX11 namespace __cxx11 {
|
|
# define _GLIBCXX_END_NAMESPACE_CXX11 }
|
|
# define _GLIBCXX_DEFAULT_ABI_TAG _GLIBCXX_ABI_TAG_CXX11
|
|
#else
|
|
# define _GLIBCXX_NAMESPACE_CXX11
|
|
# define _GLIBCXX_BEGIN_NAMESPACE_CXX11
|
|
# define _GLIBCXX_END_NAMESPACE_CXX11
|
|
# define _GLIBCXX_DEFAULT_ABI_TAG
|
|
#endif
|
|
|
|
// Defined if inline namespaces are used for versioning.
|
|
#define _GLIBCXX_INLINE_VERSION
|
|
|
|
// Inline namespace for symbol versioning.
|
|
#if _GLIBCXX_INLINE_VERSION
|
|
# define _GLIBCXX_BEGIN_NAMESPACE_VERSION namespace __8 {
|
|
# define _GLIBCXX_END_NAMESPACE_VERSION }
|
|
|
|
namespace std
|
|
{
|
|
inline _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|
#if __cplusplus >= 201402L
|
|
inline namespace literals {
|
|
inline namespace chrono_literals { }
|
|
inline namespace complex_literals { }
|
|
inline namespace string_literals { }
|
|
#if __cplusplus > 201402L
|
|
inline namespace string_view_literals { }
|
|
#endif // C++17
|
|
}
|
|
#endif // C++14
|
|
_GLIBCXX_END_NAMESPACE_VERSION
|
|
}
|
|
|
|
namespace __gnu_cxx
|
|
{
|
|
inline _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|
_GLIBCXX_END_NAMESPACE_VERSION
|
|
}
|
|
|
|
#else
|
|
# define _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|
# define _GLIBCXX_END_NAMESPACE_VERSION
|
|
#endif
|
|
|
|
// Inline namespaces for special modes: debug, parallel.
|
|
#if defined(_GLIBCXX_DEBUG) || defined(_GLIBCXX_PARALLEL)
|
|
namespace std
|
|
{
|
|
_GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|
|
|
// Non-inline namespace for components replaced by alternates in active mode.
|
|
namespace __cxx1998
|
|
{
|
|
# if _GLIBCXX_USE_CXX11_ABI
|
|
inline namespace __cxx11 __attribute__((__abi_tag__ ("cxx11"))) { }
|
|
# endif
|
|
}
|
|
|
|
_GLIBCXX_END_NAMESPACE_VERSION
|
|
|
|
// Inline namespace for debug mode.
|
|
# ifdef _GLIBCXX_DEBUG
|
|
inline namespace __debug { }
|
|
# endif
|
|
|
|
// Inline namespaces for parallel mode.
|
|
# ifdef _GLIBCXX_PARALLEL
|
|
inline namespace __parallel { }
|
|
# endif
|
|
}
|
|
|
|
// Check for invalid usage and unsupported mixed-mode use.
|
|
# if defined(_GLIBCXX_DEBUG) && defined(_GLIBCXX_PARALLEL)
|
|
# error illegal use of multiple inlined namespaces
|
|
# endif
|
|
|
|
// Check for invalid use due to lack for weak symbols.
|
|
# if __NO_INLINE__ && !__GXX_WEAK__
|
|
# warning currently using inlined namespace mode which may fail \
|
|
without inlining due to lack of weak symbols
|
|
# endif
|
|
#endif
|
|
|
|
// Macros for namespace scope. Either namespace std:: or the name
|
|
// of some nested namespace within it corresponding to the active mode.
|
|
// _GLIBCXX_STD_A
|
|
// _GLIBCXX_STD_C
|
|
//
|
|
// Macros for opening/closing conditional namespaces.
|
|
// _GLIBCXX_BEGIN_NAMESPACE_ALGO
|
|
// _GLIBCXX_END_NAMESPACE_ALGO
|
|
// _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
|
|
// _GLIBCXX_END_NAMESPACE_CONTAINER
|
|
#if defined(_GLIBCXX_DEBUG)
|
|
# define _GLIBCXX_STD_C __cxx1998
|
|
# define _GLIBCXX_BEGIN_NAMESPACE_CONTAINER \
|
|
namespace _GLIBCXX_STD_C {
|
|
# define _GLIBCXX_END_NAMESPACE_CONTAINER }
|
|
#else
|
|
# define _GLIBCXX_STD_C std
|
|
# define _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
|
|
# define _GLIBCXX_END_NAMESPACE_CONTAINER
|
|
#endif
|
|
|
|
#ifdef _GLIBCXX_PARALLEL
|
|
# define _GLIBCXX_STD_A __cxx1998
|
|
# define _GLIBCXX_BEGIN_NAMESPACE_ALGO \
|
|
namespace _GLIBCXX_STD_A {
|
|
# define _GLIBCXX_END_NAMESPACE_ALGO }
|
|
#else
|
|
# define _GLIBCXX_STD_A std
|
|
# define _GLIBCXX_BEGIN_NAMESPACE_ALGO
|
|
# define _GLIBCXX_END_NAMESPACE_ALGO
|
|
#endif
|
|
|
|
// GLIBCXX_ABI Deprecated
|
|
// Define if compatibility should be provided for -mlong-double-64.
|
|
#undef _GLIBCXX_LONG_DOUBLE_COMPAT
|
|
// Define if compatibility should be provided for alternative 128-bit long
|
|
// double formats.
|
|
#undef _GLIBCXX_LONG_DOUBLE_ALT128_COMPAT
|
|
|
|
// Inline namespaces for long double 128 modes.
|
|
#if defined _GLIBCXX_LONG_DOUBLE_ALT128_COMPAT \
|
|
&& defined __LONG_DOUBLE_IEEE128__
|
|
namespace std
|
|
{
|
|
// Namespaces for 128-bit IEEE long double format on 64-bit POWER LE.
|
|
inline namespace __gnu_cxx_ieee128 { }
|
|
inline namespace __gnu_cxx11_ieee128 { }
|
|
}
|
|
# define _GLIBCXX_NAMESPACE_LDBL __gnu_cxx_ieee128::
|
|
# define _GLIBCXX_BEGIN_NAMESPACE_LDBL namespace __gnu_cxx_ieee128 {
|
|
# define _GLIBCXX_END_NAMESPACE_LDBL }
|
|
# define _GLIBCXX_NAMESPACE_LDBL_OR_CXX11 __gnu_cxx11_ieee128::
|
|
# define _GLIBCXX_BEGIN_NAMESPACE_LDBL_OR_CXX11 namespace __gnu_cxx11_ieee128 {
|
|
# define _GLIBCXX_END_NAMESPACE_LDBL_OR_CXX11 }
|
|
|
|
#else // _GLIBCXX_LONG_DOUBLE_ALT128_COMPAT && IEEE128
|
|
|
|
#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
|
|
namespace std
|
|
{
|
|
inline namespace __gnu_cxx_ldbl128 { }
|
|
}
|
|
# define _GLIBCXX_NAMESPACE_LDBL __gnu_cxx_ldbl128::
|
|
# define _GLIBCXX_BEGIN_NAMESPACE_LDBL namespace __gnu_cxx_ldbl128 {
|
|
# define _GLIBCXX_END_NAMESPACE_LDBL }
|
|
#else
|
|
# define _GLIBCXX_NAMESPACE_LDBL
|
|
# define _GLIBCXX_BEGIN_NAMESPACE_LDBL
|
|
# define _GLIBCXX_END_NAMESPACE_LDBL
|
|
#endif
|
|
|
|
#if _GLIBCXX_USE_CXX11_ABI
|
|
# define _GLIBCXX_NAMESPACE_LDBL_OR_CXX11 _GLIBCXX_NAMESPACE_CXX11
|
|
# define _GLIBCXX_BEGIN_NAMESPACE_LDBL_OR_CXX11 _GLIBCXX_BEGIN_NAMESPACE_CXX11
|
|
# define _GLIBCXX_END_NAMESPACE_LDBL_OR_CXX11 _GLIBCXX_END_NAMESPACE_CXX11
|
|
#else
|
|
# define _GLIBCXX_NAMESPACE_LDBL_OR_CXX11 _GLIBCXX_NAMESPACE_LDBL
|
|
# define _GLIBCXX_BEGIN_NAMESPACE_LDBL_OR_CXX11 _GLIBCXX_BEGIN_NAMESPACE_LDBL
|
|
# define _GLIBCXX_END_NAMESPACE_LDBL_OR_CXX11 _GLIBCXX_END_NAMESPACE_LDBL
|
|
#endif
|
|
|
|
#endif // _GLIBCXX_LONG_DOUBLE_ALT128_COMPAT && IEEE128
|
|
|
|
// Debug Mode implies checking assertions.
|
|
#if defined(_GLIBCXX_DEBUG) && !defined(_GLIBCXX_ASSERTIONS)
|
|
# define _GLIBCXX_ASSERTIONS 1
|
|
#endif
|
|
|
|
// Disable std::string explicit instantiation declarations in order to assert.
|
|
#ifdef _GLIBCXX_ASSERTIONS
|
|
# undef _GLIBCXX_EXTERN_TEMPLATE
|
|
# define _GLIBCXX_EXTERN_TEMPLATE -1
|
|
#endif
|
|
|
|
// Assert.
|
|
#if defined(_GLIBCXX_ASSERTIONS) \
|
|
|| defined(_GLIBCXX_PARALLEL) || defined(_GLIBCXX_PARALLEL_ASSERTIONS)
|
|
namespace std
|
|
{
|
|
// Avoid the use of assert, because we're trying to keep the <cassert>
|
|
// include out of the mix.
|
|
extern "C++" _GLIBCXX_NORETURN
|
|
inline void
|
|
__replacement_assert(const char* __file, int __line,
|
|
const char* __function, const char* __condition)
|
|
{
|
|
__builtin_printf("%s:%d: %s: Assertion '%s' failed.\n", __file, __line,
|
|
__function, __condition);
|
|
__builtin_abort();
|
|
}
|
|
}
|
|
#define __glibcxx_assert_impl(_Condition) \
|
|
if (__builtin_expect(!bool(_Condition), false)) \
|
|
std::__replacement_assert(__FILE__, __LINE__, __PRETTY_FUNCTION__, \
|
|
#_Condition)
|
|
#endif
|
|
|
|
#if defined(_GLIBCXX_ASSERTIONS)
|
|
# define __glibcxx_assert_2(_Condition) __glibcxx_assert_impl(_Condition)
|
|
#else
|
|
# define __glibcxx_assert_2(_Condition)
|
|
#endif
|
|
|
|
// Macros for race detectors.
|
|
// _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(A) and
|
|
// _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(A) should be used to explain
|
|
// atomic (lock-free) synchronization to race detectors:
|
|
// the race detector will infer a happens-before arc from the former to the
|
|
// latter when they share the same argument pointer.
|
|
//
|
|
// The most frequent use case for these macros (and the only case in the
|
|
// current implementation of the library) is atomic reference counting:
|
|
// void _M_remove_reference()
|
|
// {
|
|
// _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(&this->_M_refcount);
|
|
// if (__gnu_cxx::__exchange_and_add_dispatch(&this->_M_refcount, -1) <= 0)
|
|
// {
|
|
// _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(&this->_M_refcount);
|
|
// _M_destroy(__a);
|
|
// }
|
|
// }
|
|
// The annotations in this example tell the race detector that all memory
|
|
// accesses occurred when the refcount was positive do not race with
|
|
// memory accesses which occurred after the refcount became zero.
|
|
#ifndef _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE
|
|
# define _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(A)
|
|
#endif
|
|
#ifndef _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER
|
|
# define _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(A)
|
|
#endif
|
|
|
|
// Macros for C linkage: define extern "C" linkage only when using C++.
|
|
# define _GLIBCXX_BEGIN_EXTERN_C extern "C" {
|
|
# define _GLIBCXX_END_EXTERN_C }
|
|
|
|
#define _GLIBCXX_USE_ALLOCATOR_NEW
|
|
|
|
#ifdef __SIZEOF_INT128__
|
|
#if ! defined __GLIBCXX_TYPE_INT_N_0 && ! defined __STRICT_ANSI__
|
|
// If __int128 is supported, we expect __GLIBCXX_TYPE_INT_N_0 to be defined
|
|
// unless the compiler is in strict mode. If it's not defined and the strict
|
|
// macro is not defined, something is wrong.
|
|
#warning "__STRICT_ANSI__ seems to have been undefined; this is not supported"
|
|
#endif
|
|
#endif
|
|
|
|
#else // !__cplusplus
|
|
# define _GLIBCXX_BEGIN_EXTERN_C
|
|
# define _GLIBCXX_END_EXTERN_C
|
|
#endif
|
|
|
|
|
|
// First includes.
|
|
|
|
// Pick up any OS-specific definitions.
|
|
#include <bits/os_defines.h>
|
|
|
|
// Pick up any CPU-specific definitions.
|
|
#include <bits/cpu_defines.h>
|
|
|
|
// If platform uses neither visibility nor psuedo-visibility,
|
|
// specify empty default for namespace annotation macros.
|
|
#ifndef _GLIBCXX_PSEUDO_VISIBILITY
|
|
# define _GLIBCXX_PSEUDO_VISIBILITY(V)
|
|
#endif
|
|
|
|
// Certain function definitions that are meant to be overridable from
|
|
// user code are decorated with this macro. For some targets, this
|
|
// macro causes these definitions to be weak.
|
|
#ifndef _GLIBCXX_WEAK_DEFINITION
|
|
# define _GLIBCXX_WEAK_DEFINITION
|
|
#endif
|
|
|
|
// By default, we assume that __GXX_WEAK__ also means that there is support
|
|
// for declaring functions as weak while not defining such functions. This
|
|
// allows for referring to functions provided by other libraries (e.g.,
|
|
// libitm) without depending on them if the respective features are not used.
|
|
#ifndef _GLIBCXX_USE_WEAK_REF
|
|
# define _GLIBCXX_USE_WEAK_REF __GXX_WEAK__
|
|
#endif
|
|
|
|
// Conditionally enable annotations for the Transactional Memory TS on C++11.
|
|
// Most of the following conditions are due to limitations in the current
|
|
// implementation.
|
|
#if __cplusplus >= 201103L && _GLIBCXX_USE_CXX11_ABI \
|
|
&& _GLIBCXX_USE_DUAL_ABI && __cpp_transactional_memory >= 201500L \
|
|
&& !_GLIBCXX_FULLY_DYNAMIC_STRING && _GLIBCXX_USE_WEAK_REF \
|
|
&& _GLIBCXX_USE_ALLOCATOR_NEW
|
|
#define _GLIBCXX_TXN_SAFE transaction_safe
|
|
#define _GLIBCXX_TXN_SAFE_DYN transaction_safe_dynamic
|
|
#else
|
|
#define _GLIBCXX_TXN_SAFE
|
|
#define _GLIBCXX_TXN_SAFE_DYN
|
|
#endif
|
|
|
|
#if __cplusplus > 201402L
|
|
// In C++17 mathematical special functions are in namespace std.
|
|
# define _GLIBCXX_USE_STD_SPEC_FUNCS 1
|
|
#elif __cplusplus >= 201103L && __STDCPP_WANT_MATH_SPEC_FUNCS__ != 0
|
|
// For C++11 and C++14 they are in namespace std when requested.
|
|
# define _GLIBCXX_USE_STD_SPEC_FUNCS 1
|
|
#endif
|
|
|
|
// The remainder of the prewritten config is automatic; all the
|
|
// user hooks are listed above.
|
|
|
|
// Create a boolean flag to be used to determine if --fast-math is set.
|
|
#ifdef __FAST_MATH__
|
|
# define _GLIBCXX_FAST_MATH 1
|
|
#else
|
|
# define _GLIBCXX_FAST_MATH 0
|
|
#endif
|
|
|
|
// This marks string literals in header files to be extracted for eventual
|
|
// translation. It is primarily used for messages in thrown exceptions; see
|
|
// src/functexcept.cc. We use __N because the more traditional _N is used
|
|
// for something else under certain OSes (see BADNAMES).
|
|
#define __N(msgid) (msgid)
|
|
|
|
// For example, <windows.h> is known to #define min and max as macros...
|
|
#undef min
|
|
#undef max
|
|
|
|
// N.B. these _GLIBCXX_USE_C99_XXX macros are defined unconditionally
|
|
// so they should be tested with #if not with #ifdef.
|
|
#if __cplusplus >= 201103L
|
|
# ifndef _GLIBCXX_USE_C99_MATH
|
|
# define _GLIBCXX_USE_C99_MATH _GLIBCXX11_USE_C99_MATH
|
|
# endif
|
|
# ifndef _GLIBCXX_USE_C99_COMPLEX
|
|
# define _GLIBCXX_USE_C99_COMPLEX _GLIBCXX11_USE_C99_COMPLEX
|
|
# endif
|
|
# ifndef _GLIBCXX_USE_C99_STDIO
|
|
# define _GLIBCXX_USE_C99_STDIO _GLIBCXX11_USE_C99_STDIO
|
|
# endif
|
|
# ifndef _GLIBCXX_USE_C99_STDLIB
|
|
# define _GLIBCXX_USE_C99_STDLIB _GLIBCXX11_USE_C99_STDLIB
|
|
# endif
|
|
# ifndef _GLIBCXX_USE_C99_WCHAR
|
|
# define _GLIBCXX_USE_C99_WCHAR _GLIBCXX11_USE_C99_WCHAR
|
|
# endif
|
|
#else
|
|
# ifndef _GLIBCXX_USE_C99_MATH
|
|
# define _GLIBCXX_USE_C99_MATH _GLIBCXX98_USE_C99_MATH
|
|
# endif
|
|
# ifndef _GLIBCXX_USE_C99_COMPLEX
|
|
# define _GLIBCXX_USE_C99_COMPLEX _GLIBCXX98_USE_C99_COMPLEX
|
|
# endif
|
|
# ifndef _GLIBCXX_USE_C99_STDIO
|
|
# define _GLIBCXX_USE_C99_STDIO _GLIBCXX98_USE_C99_STDIO
|
|
# endif
|
|
# ifndef _GLIBCXX_USE_C99_STDLIB
|
|
# define _GLIBCXX_USE_C99_STDLIB _GLIBCXX98_USE_C99_STDLIB
|
|
# endif
|
|
# ifndef _GLIBCXX_USE_C99_WCHAR
|
|
# define _GLIBCXX_USE_C99_WCHAR _GLIBCXX98_USE_C99_WCHAR
|
|
# endif
|
|
#endif
|
|
|
|
// Unless explicitly specified, enable char8_t extensions only if the core
|
|
// language char8_t feature macro is defined.
|
|
#ifndef _GLIBCXX_USE_CHAR8_T
|
|
# ifdef __cpp_char8_t
|
|
# define _GLIBCXX_USE_CHAR8_T 1
|
|
# endif
|
|
#endif
|
|
#ifdef _GLIBCXX_USE_CHAR8_T
|
|
# define __cpp_lib_char8_t 201907L
|
|
#endif
|
|
|
|
/* Define if __float128 is supported on this host. */
|
|
#if defined(__FLOAT128__) || defined(__SIZEOF_FLOAT128__)
|
|
/* For powerpc64 don't use __float128 when it's the same type as long double. */
|
|
# if !(defined(_GLIBCXX_LONG_DOUBLE_ALT128_COMPAT) && defined(__LONG_DOUBLE_IEEE128__))
|
|
# define _GLIBCXX_USE_FLOAT128
|
|
# endif
|
|
#endif
|
|
|
|
#ifdef __has_builtin
|
|
# ifdef __is_identifier
|
|
// Intel and older Clang require !__is_identifier for some built-ins:
|
|
# define _GLIBCXX_HAS_BUILTIN(B) __has_builtin(B) || ! __is_identifier(B)
|
|
# else
|
|
# define _GLIBCXX_HAS_BUILTIN(B) __has_builtin(B)
|
|
# endif
|
|
#endif
|
|
|
|
#if _GLIBCXX_HAS_BUILTIN(__has_unique_object_representations)
|
|
# define _GLIBCXX_HAVE_BUILTIN_HAS_UNIQ_OBJ_REP 1
|
|
#endif
|
|
|
|
#if _GLIBCXX_HAS_BUILTIN(__is_aggregate)
|
|
# define _GLIBCXX_HAVE_BUILTIN_IS_AGGREGATE 1
|
|
#endif
|
|
|
|
#if _GLIBCXX_HAS_BUILTIN(__builtin_is_constant_evaluated)
|
|
# define _GLIBCXX_HAVE_BUILTIN_IS_CONSTANT_EVALUATED 1
|
|
#endif
|
|
|
|
#if _GLIBCXX_HAS_BUILTIN(__is_same)
|
|
# define _GLIBCXX_HAVE_BUILTIN_IS_SAME 1
|
|
#endif
|
|
|
|
#if _GLIBCXX_HAS_BUILTIN(__builtin_launder)
|
|
# define _GLIBCXX_HAVE_BUILTIN_LAUNDER 1
|
|
#endif
|
|
|
|
#undef _GLIBCXX_HAS_BUILTIN
|
|
|
|
#if _GLIBCXX_HAVE_BUILTIN_IS_CONSTANT_EVALUATED && __cplusplus >= 201402L
|
|
# define __glibcxx_assert_1(_Condition) \
|
|
if (__builtin_is_constant_evaluated()) \
|
|
{ \
|
|
void __failed_assertion(); \
|
|
if (!bool(_Condition)) \
|
|
__failed_assertion(); \
|
|
} \
|
|
else
|
|
#else
|
|
# define __glibcxx_assert_1(_Condition)
|
|
#endif
|
|
|
|
# define __glibcxx_assert(_Condition) \
|
|
do { \
|
|
__glibcxx_assert_1(_Condition) \
|
|
{ __glibcxx_assert_2(_Condition); } \
|
|
} while (false)
|
|
|
|
|
|
// PSTL configuration
|
|
|
|
#if __cplusplus >= 201703L
|
|
// This header is not installed for freestanding:
|
|
#if __has_include(<pstl/pstl_config.h>)
|
|
// Preserved here so we have some idea which version of upstream we've pulled in
|
|
// #define PSTL_VERSION 9000
|
|
|
|
// For now this defaults to being based on the presence of Thread Building Blocks
|
|
# ifndef _GLIBCXX_USE_TBB_PAR_BACKEND
|
|
# define _GLIBCXX_USE_TBB_PAR_BACKEND __has_include(<tbb/tbb.h>)
|
|
# endif
|
|
// This section will need some rework when a new (default) backend type is added
|
|
# if _GLIBCXX_USE_TBB_PAR_BACKEND
|
|
# define _PSTL_PAR_BACKEND_TBB
|
|
# else
|
|
# define _PSTL_PAR_BACKEND_SERIAL
|
|
# endif
|
|
|
|
# define _PSTL_ASSERT(_Condition) __glibcxx_assert(_Condition)
|
|
# define _PSTL_ASSERT_MSG(_Condition, _Message) __glibcxx_assert(_Condition)
|
|
|
|
#include <pstl/pstl_config.h>
|
|
#endif // __has_include
|
|
#endif // C++17
|
|
|
|
// End of prewritten config; the settings discovered at configure time follow.
|