138fd1498Szrj// Predefined symbols and macros -*- C++ -*- 238fd1498Szrj 338fd1498Szrj// Copyright (C) 1997-2018 Free Software Foundation, Inc. 438fd1498Szrj// 538fd1498Szrj// This file is part of the GNU ISO C++ Library. This library is free 638fd1498Szrj// software; you can redistribute it and/or modify it under the 738fd1498Szrj// terms of the GNU General Public License as published by the 838fd1498Szrj// Free Software Foundation; either version 3, or (at your option) 938fd1498Szrj// any later version. 1038fd1498Szrj 1138fd1498Szrj// This library is distributed in the hope that it will be useful, 1238fd1498Szrj// but WITHOUT ANY WARRANTY; without even the implied warranty of 1338fd1498Szrj// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1438fd1498Szrj// GNU General Public License for more details. 1538fd1498Szrj 1638fd1498Szrj// Under Section 7 of GPL version 3, you are granted additional 1738fd1498Szrj// permissions described in the GCC Runtime Library Exception, version 1838fd1498Szrj// 3.1, as published by the Free Software Foundation. 1938fd1498Szrj 2038fd1498Szrj// You should have received a copy of the GNU General Public License and 2138fd1498Szrj// a copy of the GCC Runtime Library Exception along with this program; 2238fd1498Szrj// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 2338fd1498Szrj// <http://www.gnu.org/licenses/>. 2438fd1498Szrj 2538fd1498Szrj/** @file bits/c++config.h 2638fd1498Szrj * This is an internal header file, included by other library headers. 2738fd1498Szrj * Do not attempt to use it directly. @headername{iosfwd} 2838fd1498Szrj */ 2938fd1498Szrj 3038fd1498Szrj#ifndef _GLIBCXX_CXX_CONFIG_H 3138fd1498Szrj#define _GLIBCXX_CXX_CONFIG_H 1 3238fd1498Szrj 3338fd1498Szrj// The major release number for the GCC release the C++ library belongs to. 3438fd1498Szrj#define _GLIBCXX_RELEASE 3538fd1498Szrj 3638fd1498Szrj// The datestamp of the C++ library in compressed ISO date format. 3738fd1498Szrj#define __GLIBCXX__ 3838fd1498Szrj 3938fd1498Szrj// Macros for various attributes. 4038fd1498Szrj// _GLIBCXX_PURE 4138fd1498Szrj// _GLIBCXX_CONST 4238fd1498Szrj// _GLIBCXX_NORETURN 4338fd1498Szrj// _GLIBCXX_NOTHROW 4438fd1498Szrj// _GLIBCXX_VISIBILITY 4538fd1498Szrj#ifndef _GLIBCXX_PURE 4638fd1498Szrj# define _GLIBCXX_PURE __attribute__ ((__pure__)) 4738fd1498Szrj#endif 4838fd1498Szrj 4938fd1498Szrj#ifndef _GLIBCXX_CONST 5038fd1498Szrj# define _GLIBCXX_CONST __attribute__ ((__const__)) 5138fd1498Szrj#endif 5238fd1498Szrj 5338fd1498Szrj#ifndef _GLIBCXX_NORETURN 5438fd1498Szrj# define _GLIBCXX_NORETURN __attribute__ ((__noreturn__)) 5538fd1498Szrj#endif 5638fd1498Szrj 5738fd1498Szrj// See below for C++ 5838fd1498Szrj#ifndef _GLIBCXX_NOTHROW 5938fd1498Szrj# ifndef __cplusplus 6038fd1498Szrj# define _GLIBCXX_NOTHROW __attribute__((__nothrow__)) 6138fd1498Szrj# endif 6238fd1498Szrj#endif 6338fd1498Szrj 6438fd1498Szrj// Macros for visibility attributes. 6538fd1498Szrj// _GLIBCXX_HAVE_ATTRIBUTE_VISIBILITY 6638fd1498Szrj// _GLIBCXX_VISIBILITY 6738fd1498Szrj#define _GLIBCXX_HAVE_ATTRIBUTE_VISIBILITY 6838fd1498Szrj 6938fd1498Szrj#if _GLIBCXX_HAVE_ATTRIBUTE_VISIBILITY 7038fd1498Szrj# define _GLIBCXX_VISIBILITY(V) __attribute__ ((__visibility__ (#V))) 7138fd1498Szrj#else 7238fd1498Szrj// If this is not supplied by the OS-specific or CPU-specific 7338fd1498Szrj// headers included below, it will be defined to an empty default. 7438fd1498Szrj# define _GLIBCXX_VISIBILITY(V) _GLIBCXX_PSEUDO_VISIBILITY(V) 7538fd1498Szrj#endif 7638fd1498Szrj 7738fd1498Szrj// Macros for deprecated attributes. 7838fd1498Szrj// _GLIBCXX_USE_DEPRECATED 7938fd1498Szrj// _GLIBCXX_DEPRECATED 8038fd1498Szrj// _GLIBCXX17_DEPRECATED 8138fd1498Szrj#ifndef _GLIBCXX_USE_DEPRECATED 8238fd1498Szrj# define _GLIBCXX_USE_DEPRECATED 1 8338fd1498Szrj#endif 8438fd1498Szrj 8538fd1498Szrj#if defined(__DEPRECATED) && (__cplusplus >= 201103L) 8638fd1498Szrj# define _GLIBCXX_DEPRECATED __attribute__ ((__deprecated__)) 8738fd1498Szrj#else 8838fd1498Szrj# define _GLIBCXX_DEPRECATED 8938fd1498Szrj#endif 9038fd1498Szrj 9138fd1498Szrj#if defined(__DEPRECATED) && (__cplusplus >= 201703L) 9238fd1498Szrj# define _GLIBCXX17_DEPRECATED [[__deprecated__]] 9338fd1498Szrj#else 9438fd1498Szrj# define _GLIBCXX17_DEPRECATED 9538fd1498Szrj#endif 9638fd1498Szrj 9738fd1498Szrj// Macros for ABI tag attributes. 9838fd1498Szrj#ifndef _GLIBCXX_ABI_TAG_CXX11 9938fd1498Szrj# define _GLIBCXX_ABI_TAG_CXX11 __attribute ((__abi_tag__ ("cxx11"))) 10038fd1498Szrj#endif 10138fd1498Szrj 10238fd1498Szrj 10338fd1498Szrj#if __cplusplus 10438fd1498Szrj 10538fd1498Szrj// Macro for constexpr, to support in mixed 03/0x mode. 10638fd1498Szrj#ifndef _GLIBCXX_CONSTEXPR 10738fd1498Szrj# if __cplusplus >= 201103L 10838fd1498Szrj# define _GLIBCXX_CONSTEXPR constexpr 10938fd1498Szrj# define _GLIBCXX_USE_CONSTEXPR constexpr 11038fd1498Szrj# else 11138fd1498Szrj# define _GLIBCXX_CONSTEXPR 11238fd1498Szrj# define _GLIBCXX_USE_CONSTEXPR const 11338fd1498Szrj# endif 11438fd1498Szrj#endif 11538fd1498Szrj 11638fd1498Szrj#ifndef _GLIBCXX14_CONSTEXPR 11738fd1498Szrj# if __cplusplus >= 201402L 11838fd1498Szrj# define _GLIBCXX14_CONSTEXPR constexpr 11938fd1498Szrj# else 12038fd1498Szrj# define _GLIBCXX14_CONSTEXPR 12138fd1498Szrj# endif 12238fd1498Szrj#endif 12338fd1498Szrj 12438fd1498Szrj#ifndef _GLIBCXX17_CONSTEXPR 12538fd1498Szrj# if __cplusplus > 201402L 12638fd1498Szrj# define _GLIBCXX17_CONSTEXPR constexpr 12738fd1498Szrj# else 12838fd1498Szrj# define _GLIBCXX17_CONSTEXPR 12938fd1498Szrj# endif 13038fd1498Szrj#endif 13138fd1498Szrj 13238fd1498Szrj#ifndef _GLIBCXX17_INLINE 13338fd1498Szrj# if __cplusplus > 201402L 13438fd1498Szrj# define _GLIBCXX17_INLINE inline 13538fd1498Szrj# else 13638fd1498Szrj# define _GLIBCXX17_INLINE 13738fd1498Szrj# endif 13838fd1498Szrj#endif 13938fd1498Szrj 14038fd1498Szrj// Macro for noexcept, to support in mixed 03/0x mode. 14138fd1498Szrj#ifndef _GLIBCXX_NOEXCEPT 14238fd1498Szrj# if __cplusplus >= 201103L 14338fd1498Szrj# define _GLIBCXX_NOEXCEPT noexcept 14438fd1498Szrj# define _GLIBCXX_NOEXCEPT_IF(_COND) noexcept(_COND) 14538fd1498Szrj# define _GLIBCXX_USE_NOEXCEPT noexcept 14638fd1498Szrj# define _GLIBCXX_THROW(_EXC) 14738fd1498Szrj# else 14838fd1498Szrj# define _GLIBCXX_NOEXCEPT 14938fd1498Szrj# define _GLIBCXX_NOEXCEPT_IF(_COND) 15038fd1498Szrj# define _GLIBCXX_USE_NOEXCEPT throw() 15138fd1498Szrj# define _GLIBCXX_THROW(_EXC) throw(_EXC) 15238fd1498Szrj# endif 15338fd1498Szrj#endif 15438fd1498Szrj 15538fd1498Szrj#ifndef _GLIBCXX_NOTHROW 15638fd1498Szrj# define _GLIBCXX_NOTHROW _GLIBCXX_USE_NOEXCEPT 15738fd1498Szrj#endif 15838fd1498Szrj 15938fd1498Szrj#ifndef _GLIBCXX_THROW_OR_ABORT 16038fd1498Szrj# if __cpp_exceptions 16138fd1498Szrj# define _GLIBCXX_THROW_OR_ABORT(_EXC) (throw (_EXC)) 16238fd1498Szrj# else 16338fd1498Szrj# define _GLIBCXX_THROW_OR_ABORT(_EXC) (__builtin_abort()) 16438fd1498Szrj# endif 16538fd1498Szrj#endif 16638fd1498Szrj 16738fd1498Szrj#if __cpp_noexcept_function_type 16838fd1498Szrj#define _GLIBCXX_NOEXCEPT_PARM , bool _NE 16938fd1498Szrj#define _GLIBCXX_NOEXCEPT_QUAL noexcept (_NE) 17038fd1498Szrj#else 17138fd1498Szrj#define _GLIBCXX_NOEXCEPT_PARM 17238fd1498Szrj#define _GLIBCXX_NOEXCEPT_QUAL 17338fd1498Szrj#endif 17438fd1498Szrj 17538fd1498Szrj// Macro for extern template, ie controlling template linkage via use 17638fd1498Szrj// of extern keyword on template declaration. As documented in the g++ 17738fd1498Szrj// manual, it inhibits all implicit instantiations and is used 17838fd1498Szrj// throughout the library to avoid multiple weak definitions for 17938fd1498Szrj// required types that are already explicitly instantiated in the 18038fd1498Szrj// library binary. This substantially reduces the binary size of 18138fd1498Szrj// resulting executables. 18238fd1498Szrj// Special case: _GLIBCXX_EXTERN_TEMPLATE == -1 disallows extern 18338fd1498Szrj// templates only in basic_string, thus activating its debug-mode 18438fd1498Szrj// checks even at -O0. 18538fd1498Szrj#define _GLIBCXX_EXTERN_TEMPLATE 18638fd1498Szrj 18738fd1498Szrj/* 18838fd1498Szrj Outline of libstdc++ namespaces. 18938fd1498Szrj 19038fd1498Szrj namespace std 19138fd1498Szrj { 19238fd1498Szrj namespace __debug { } 19338fd1498Szrj namespace __parallel { } 19438fd1498Szrj namespace __profile { } 19538fd1498Szrj namespace __cxx1998 { } 19638fd1498Szrj 19738fd1498Szrj namespace __detail { 19838fd1498Szrj namespace __variant { } // C++17 19938fd1498Szrj } 20038fd1498Szrj 20138fd1498Szrj namespace rel_ops { } 20238fd1498Szrj 20338fd1498Szrj namespace tr1 20438fd1498Szrj { 20538fd1498Szrj namespace placeholders { } 20638fd1498Szrj namespace regex_constants { } 20738fd1498Szrj namespace __detail { } 20838fd1498Szrj } 20938fd1498Szrj 21038fd1498Szrj namespace tr2 { } 21138fd1498Szrj 21238fd1498Szrj namespace decimal { } 21338fd1498Szrj 21438fd1498Szrj namespace chrono { } // C++11 21538fd1498Szrj namespace placeholders { } // C++11 21638fd1498Szrj namespace regex_constants { } // C++11 21738fd1498Szrj namespace this_thread { } // C++11 21838fd1498Szrj inline namespace literals { // C++14 21938fd1498Szrj inline namespace chrono_literals { } // C++14 22038fd1498Szrj inline namespace complex_literals { } // C++14 22138fd1498Szrj inline namespace string_literals { } // C++14 22238fd1498Szrj inline namespace string_view_literals { } // C++17 22338fd1498Szrj } 22438fd1498Szrj } 22538fd1498Szrj 22638fd1498Szrj namespace abi { } 22738fd1498Szrj 22838fd1498Szrj namespace __gnu_cxx 22938fd1498Szrj { 23038fd1498Szrj namespace __detail { } 23138fd1498Szrj } 23238fd1498Szrj 23338fd1498Szrj For full details see: 23438fd1498Szrj http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/namespaces.html 23538fd1498Szrj*/ 23638fd1498Szrjnamespace std 23738fd1498Szrj{ 23838fd1498Szrj typedef __SIZE_TYPE__ size_t; 23938fd1498Szrj typedef __PTRDIFF_TYPE__ ptrdiff_t; 24038fd1498Szrj 24138fd1498Szrj#if __cplusplus >= 201103L 24238fd1498Szrj typedef decltype(nullptr) nullptr_t; 24338fd1498Szrj#endif 24438fd1498Szrj} 24538fd1498Szrj 24638fd1498Szrj#define _GLIBCXX_USE_DUAL_ABI 24738fd1498Szrj 24838fd1498Szrj#if ! _GLIBCXX_USE_DUAL_ABI 24938fd1498Szrj// Ignore any pre-defined value of _GLIBCXX_USE_CXX11_ABI 25038fd1498Szrj# undef _GLIBCXX_USE_CXX11_ABI 25138fd1498Szrj#endif 25238fd1498Szrj 25338fd1498Szrj#ifndef _GLIBCXX_USE_CXX11_ABI 25438fd1498Szrj#define _GLIBCXX_USE_CXX11_ABI 25538fd1498Szrj#endif 25638fd1498Szrj 25738fd1498Szrj#if _GLIBCXX_USE_CXX11_ABI 25838fd1498Szrjnamespace std 25938fd1498Szrj{ 26038fd1498Szrj inline namespace __cxx11 __attribute__((__abi_tag__ ("cxx11"))) { } 26138fd1498Szrj} 26238fd1498Szrjnamespace __gnu_cxx 26338fd1498Szrj{ 26438fd1498Szrj inline namespace __cxx11 __attribute__((__abi_tag__ ("cxx11"))) { } 26538fd1498Szrj} 26638fd1498Szrj# define _GLIBCXX_NAMESPACE_CXX11 __cxx11:: 26738fd1498Szrj# define _GLIBCXX_BEGIN_NAMESPACE_CXX11 namespace __cxx11 { 26838fd1498Szrj# define _GLIBCXX_END_NAMESPACE_CXX11 } 26938fd1498Szrj# define _GLIBCXX_DEFAULT_ABI_TAG _GLIBCXX_ABI_TAG_CXX11 27038fd1498Szrj#else 27138fd1498Szrj# define _GLIBCXX_NAMESPACE_CXX11 27238fd1498Szrj# define _GLIBCXX_BEGIN_NAMESPACE_CXX11 27338fd1498Szrj# define _GLIBCXX_END_NAMESPACE_CXX11 27438fd1498Szrj# define _GLIBCXX_DEFAULT_ABI_TAG 27538fd1498Szrj#endif 27638fd1498Szrj 27738fd1498Szrj// Defined if inline namespaces are used for versioning. 27838fd1498Szrj#define _GLIBCXX_INLINE_VERSION 27938fd1498Szrj 28038fd1498Szrj// Inline namespace for symbol versioning. 28138fd1498Szrj#if _GLIBCXX_INLINE_VERSION 28238fd1498Szrj# define _GLIBCXX_BEGIN_NAMESPACE_VERSION namespace __8 { 28338fd1498Szrj# define _GLIBCXX_END_NAMESPACE_VERSION } 28438fd1498Szrj 28538fd1498Szrjnamespace std 28638fd1498Szrj{ 28738fd1498Szrjinline _GLIBCXX_BEGIN_NAMESPACE_VERSION 28838fd1498Szrj#if __cplusplus >= 201402L 28938fd1498Szrj inline namespace literals { 29038fd1498Szrj inline namespace chrono_literals { } 29138fd1498Szrj inline namespace complex_literals { } 29238fd1498Szrj inline namespace string_literals { } 29338fd1498Szrj#if __cplusplus > 201402L 29438fd1498Szrj inline namespace string_view_literals { } 29538fd1498Szrj#endif // C++17 29638fd1498Szrj } 29738fd1498Szrj#endif // C++14 29838fd1498Szrj_GLIBCXX_END_NAMESPACE_VERSION 29938fd1498Szrj} 30038fd1498Szrj 30138fd1498Szrjnamespace __gnu_cxx 30238fd1498Szrj{ 30338fd1498Szrjinline _GLIBCXX_BEGIN_NAMESPACE_VERSION 30438fd1498Szrj_GLIBCXX_END_NAMESPACE_VERSION 30538fd1498Szrj} 30638fd1498Szrj 30738fd1498Szrj#else 30838fd1498Szrj# define _GLIBCXX_BEGIN_NAMESPACE_VERSION 30938fd1498Szrj# define _GLIBCXX_END_NAMESPACE_VERSION 31038fd1498Szrj#endif 31138fd1498Szrj 31238fd1498Szrj// Inline namespaces for special modes: debug, parallel, profile. 31338fd1498Szrj#if defined(_GLIBCXX_DEBUG) || defined(_GLIBCXX_PARALLEL) \ 31438fd1498Szrj || defined(_GLIBCXX_PROFILE) 31538fd1498Szrjnamespace std 31638fd1498Szrj{ 31738fd1498Szrj_GLIBCXX_BEGIN_NAMESPACE_VERSION 31838fd1498Szrj 31938fd1498Szrj // Non-inline namespace for components replaced by alternates in active mode. 32038fd1498Szrj namespace __cxx1998 32138fd1498Szrj { 32238fd1498Szrj# if _GLIBCXX_USE_CXX11_ABI 32338fd1498Szrj inline namespace __cxx11 __attribute__((__abi_tag__ ("cxx11"))) { } 32438fd1498Szrj# endif 32538fd1498Szrj } 32638fd1498Szrj 32738fd1498Szrj_GLIBCXX_END_NAMESPACE_VERSION 32838fd1498Szrj 32938fd1498Szrj // Inline namespace for debug mode. 33038fd1498Szrj# ifdef _GLIBCXX_DEBUG 33138fd1498Szrj inline namespace __debug { } 33238fd1498Szrj# endif 33338fd1498Szrj 33438fd1498Szrj // Inline namespaces for parallel mode. 33538fd1498Szrj# ifdef _GLIBCXX_PARALLEL 33638fd1498Szrj inline namespace __parallel { } 33738fd1498Szrj# endif 33838fd1498Szrj 33938fd1498Szrj // Inline namespaces for profile mode 34038fd1498Szrj# ifdef _GLIBCXX_PROFILE 34138fd1498Szrj inline namespace __profile { } 34238fd1498Szrj# endif 34338fd1498Szrj} 34438fd1498Szrj 34538fd1498Szrj// Check for invalid usage and unsupported mixed-mode use. 34638fd1498Szrj# if defined(_GLIBCXX_DEBUG) && defined(_GLIBCXX_PARALLEL) 34738fd1498Szrj# error illegal use of multiple inlined namespaces 34838fd1498Szrj# endif 34938fd1498Szrj# if defined(_GLIBCXX_PROFILE) && defined(_GLIBCXX_DEBUG) 35038fd1498Szrj# error illegal use of multiple inlined namespaces 35138fd1498Szrj# endif 35238fd1498Szrj# if defined(_GLIBCXX_PROFILE) && defined(_GLIBCXX_PARALLEL) 35338fd1498Szrj# error illegal use of multiple inlined namespaces 35438fd1498Szrj# endif 35538fd1498Szrj 35638fd1498Szrj// Check for invalid use due to lack for weak symbols. 35738fd1498Szrj# if __NO_INLINE__ && !__GXX_WEAK__ 35838fd1498Szrj# warning currently using inlined namespace mode which may fail \ 35938fd1498Szrj without inlining due to lack of weak symbols 36038fd1498Szrj# endif 36138fd1498Szrj#endif 36238fd1498Szrj 36338fd1498Szrj// Macros for namespace scope. Either namespace std:: or the name 36438fd1498Szrj// of some nested namespace within it corresponding to the active mode. 36538fd1498Szrj// _GLIBCXX_STD_A 36638fd1498Szrj// _GLIBCXX_STD_C 36738fd1498Szrj// 36838fd1498Szrj// Macros for opening/closing conditional namespaces. 36938fd1498Szrj// _GLIBCXX_BEGIN_NAMESPACE_ALGO 37038fd1498Szrj// _GLIBCXX_END_NAMESPACE_ALGO 37138fd1498Szrj// _GLIBCXX_BEGIN_NAMESPACE_CONTAINER 37238fd1498Szrj// _GLIBCXX_END_NAMESPACE_CONTAINER 37338fd1498Szrj#if defined(_GLIBCXX_DEBUG) || defined(_GLIBCXX_PROFILE) 37438fd1498Szrj# define _GLIBCXX_STD_C __cxx1998 37538fd1498Szrj# define _GLIBCXX_BEGIN_NAMESPACE_CONTAINER \ 37638fd1498Szrj namespace _GLIBCXX_STD_C { 37738fd1498Szrj# define _GLIBCXX_END_NAMESPACE_CONTAINER } 37838fd1498Szrj#else 37938fd1498Szrj# define _GLIBCXX_STD_C std 38038fd1498Szrj# define _GLIBCXX_BEGIN_NAMESPACE_CONTAINER 38138fd1498Szrj# define _GLIBCXX_END_NAMESPACE_CONTAINER 38238fd1498Szrj#endif 38338fd1498Szrj 38438fd1498Szrj#ifdef _GLIBCXX_PARALLEL 38538fd1498Szrj# define _GLIBCXX_STD_A __cxx1998 38638fd1498Szrj# define _GLIBCXX_BEGIN_NAMESPACE_ALGO \ 38738fd1498Szrj namespace _GLIBCXX_STD_A { 38838fd1498Szrj# define _GLIBCXX_END_NAMESPACE_ALGO } 38938fd1498Szrj#else 39038fd1498Szrj# define _GLIBCXX_STD_A std 39138fd1498Szrj# define _GLIBCXX_BEGIN_NAMESPACE_ALGO 39238fd1498Szrj# define _GLIBCXX_END_NAMESPACE_ALGO 39338fd1498Szrj#endif 39438fd1498Szrj 39538fd1498Szrj// GLIBCXX_ABI Deprecated 39638fd1498Szrj// Define if compatibility should be provided for -mlong-double-64. 39738fd1498Szrj#undef _GLIBCXX_LONG_DOUBLE_COMPAT 39838fd1498Szrj 39938fd1498Szrj// Inline namespace for long double 128 mode. 40038fd1498Szrj#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__ 40138fd1498Szrjnamespace std 40238fd1498Szrj{ 40338fd1498Szrj inline namespace __gnu_cxx_ldbl128 { } 40438fd1498Szrj} 40538fd1498Szrj# define _GLIBCXX_NAMESPACE_LDBL __gnu_cxx_ldbl128:: 40638fd1498Szrj# define _GLIBCXX_BEGIN_NAMESPACE_LDBL namespace __gnu_cxx_ldbl128 { 40738fd1498Szrj# define _GLIBCXX_END_NAMESPACE_LDBL } 40838fd1498Szrj#else 40938fd1498Szrj# define _GLIBCXX_NAMESPACE_LDBL 41038fd1498Szrj# define _GLIBCXX_BEGIN_NAMESPACE_LDBL 41138fd1498Szrj# define _GLIBCXX_END_NAMESPACE_LDBL 41238fd1498Szrj#endif 41338fd1498Szrj#if _GLIBCXX_USE_CXX11_ABI 41438fd1498Szrj# define _GLIBCXX_NAMESPACE_LDBL_OR_CXX11 _GLIBCXX_NAMESPACE_CXX11 41538fd1498Szrj# define _GLIBCXX_BEGIN_NAMESPACE_LDBL_OR_CXX11 _GLIBCXX_BEGIN_NAMESPACE_CXX11 41638fd1498Szrj# define _GLIBCXX_END_NAMESPACE_LDBL_OR_CXX11 _GLIBCXX_END_NAMESPACE_CXX11 41738fd1498Szrj#else 41838fd1498Szrj# define _GLIBCXX_NAMESPACE_LDBL_OR_CXX11 _GLIBCXX_NAMESPACE_LDBL 41938fd1498Szrj# define _GLIBCXX_BEGIN_NAMESPACE_LDBL_OR_CXX11 _GLIBCXX_BEGIN_NAMESPACE_LDBL 42038fd1498Szrj# define _GLIBCXX_END_NAMESPACE_LDBL_OR_CXX11 _GLIBCXX_END_NAMESPACE_LDBL 42138fd1498Szrj#endif 42238fd1498Szrj 42338fd1498Szrj// Debug Mode implies checking assertions. 42438fd1498Szrj#if defined(_GLIBCXX_DEBUG) && !defined(_GLIBCXX_ASSERTIONS) 42538fd1498Szrj# define _GLIBCXX_ASSERTIONS 1 42638fd1498Szrj#endif 42738fd1498Szrj 42838fd1498Szrj// Disable std::string explicit instantiation declarations in order to assert. 42938fd1498Szrj#ifdef _GLIBCXX_ASSERTIONS 43038fd1498Szrj# undef _GLIBCXX_EXTERN_TEMPLATE 43138fd1498Szrj# define _GLIBCXX_EXTERN_TEMPLATE -1 43238fd1498Szrj#endif 43338fd1498Szrj 43438fd1498Szrj// Assert. 43538fd1498Szrj#if defined(_GLIBCXX_ASSERTIONS) \ 43638fd1498Szrj || defined(_GLIBCXX_PARALLEL) || defined(_GLIBCXX_PARALLEL_ASSERTIONS) 43738fd1498Szrjnamespace std 43838fd1498Szrj{ 43938fd1498Szrj // Avoid the use of assert, because we're trying to keep the <cassert> 44038fd1498Szrj // include out of the mix. 44138fd1498Szrj inline void 44238fd1498Szrj __replacement_assert(const char* __file, int __line, 44338fd1498Szrj const char* __function, const char* __condition) 44438fd1498Szrj { 44538fd1498Szrj __builtin_printf("%s:%d: %s: Assertion '%s' failed.\n", __file, __line, 44638fd1498Szrj __function, __condition); 44738fd1498Szrj __builtin_abort(); 44838fd1498Szrj } 44938fd1498Szrj} 45038fd1498Szrj#define __glibcxx_assert_impl(_Condition) \ 45138fd1498Szrj do \ 45238fd1498Szrj { \ 45338fd1498Szrj if (! (_Condition)) \ 45438fd1498Szrj std::__replacement_assert(__FILE__, __LINE__, __PRETTY_FUNCTION__, \ 45538fd1498Szrj #_Condition); \ 45638fd1498Szrj } while (false) 45738fd1498Szrj#endif 45838fd1498Szrj 45938fd1498Szrj#if defined(_GLIBCXX_ASSERTIONS) 46038fd1498Szrj# define __glibcxx_assert(_Condition) __glibcxx_assert_impl(_Condition) 46138fd1498Szrj#else 46238fd1498Szrj# define __glibcxx_assert(_Condition) 46338fd1498Szrj#endif 46438fd1498Szrj 46538fd1498Szrj// Macros for race detectors. 46638fd1498Szrj// _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(A) and 46738fd1498Szrj// _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(A) should be used to explain 46838fd1498Szrj// atomic (lock-free) synchronization to race detectors: 46938fd1498Szrj// the race detector will infer a happens-before arc from the former to the 47038fd1498Szrj// latter when they share the same argument pointer. 47138fd1498Szrj// 47238fd1498Szrj// The most frequent use case for these macros (and the only case in the 47338fd1498Szrj// current implementation of the library) is atomic reference counting: 47438fd1498Szrj// void _M_remove_reference() 47538fd1498Szrj// { 47638fd1498Szrj// _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(&this->_M_refcount); 47738fd1498Szrj// if (__gnu_cxx::__exchange_and_add_dispatch(&this->_M_refcount, -1) <= 0) 47838fd1498Szrj// { 47938fd1498Szrj// _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(&this->_M_refcount); 48038fd1498Szrj// _M_destroy(__a); 48138fd1498Szrj// } 48238fd1498Szrj// } 48338fd1498Szrj// The annotations in this example tell the race detector that all memory 48438fd1498Szrj// accesses occurred when the refcount was positive do not race with 48538fd1498Szrj// memory accesses which occurred after the refcount became zero. 48638fd1498Szrj#ifndef _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE 48738fd1498Szrj# define _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(A) 48838fd1498Szrj#endif 48938fd1498Szrj#ifndef _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER 49038fd1498Szrj# define _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(A) 49138fd1498Szrj#endif 49238fd1498Szrj 49338fd1498Szrj// Macros for C linkage: define extern "C" linkage only when using C++. 49438fd1498Szrj# define _GLIBCXX_BEGIN_EXTERN_C extern "C" { 49538fd1498Szrj# define _GLIBCXX_END_EXTERN_C } 49638fd1498Szrj 49738fd1498Szrj#define _GLIBCXX_USE_ALLOCATOR_NEW 49838fd1498Szrj 49938fd1498Szrj#else // !__cplusplus 50038fd1498Szrj# define _GLIBCXX_BEGIN_EXTERN_C 50138fd1498Szrj# define _GLIBCXX_END_EXTERN_C 50238fd1498Szrj#endif 50338fd1498Szrj 50438fd1498Szrj 50538fd1498Szrj// First includes. 50638fd1498Szrj 50738fd1498Szrj// Pick up any OS-specific definitions. 50838fd1498Szrj#include <bits/os_defines.h> 50938fd1498Szrj 51038fd1498Szrj// Pick up any CPU-specific definitions. 51138fd1498Szrj#include <bits/cpu_defines.h> 51238fd1498Szrj 51338fd1498Szrj// If platform uses neither visibility nor psuedo-visibility, 51438fd1498Szrj// specify empty default for namespace annotation macros. 51538fd1498Szrj#ifndef _GLIBCXX_PSEUDO_VISIBILITY 51638fd1498Szrj# define _GLIBCXX_PSEUDO_VISIBILITY(V) 51738fd1498Szrj#endif 51838fd1498Szrj 51938fd1498Szrj// Certain function definitions that are meant to be overridable from 52038fd1498Szrj// user code are decorated with this macro. For some targets, this 52138fd1498Szrj// macro causes these definitions to be weak. 52238fd1498Szrj#ifndef _GLIBCXX_WEAK_DEFINITION 52338fd1498Szrj# define _GLIBCXX_WEAK_DEFINITION 52438fd1498Szrj#endif 52538fd1498Szrj 52638fd1498Szrj// By default, we assume that __GXX_WEAK__ also means that there is support 52738fd1498Szrj// for declaring functions as weak while not defining such functions. This 52838fd1498Szrj// allows for referring to functions provided by other libraries (e.g., 52938fd1498Szrj// libitm) without depending on them if the respective features are not used. 53038fd1498Szrj#ifndef _GLIBCXX_USE_WEAK_REF 53138fd1498Szrj# define _GLIBCXX_USE_WEAK_REF __GXX_WEAK__ 53238fd1498Szrj#endif 53338fd1498Szrj 53438fd1498Szrj// Conditionally enable annotations for the Transactional Memory TS on C++11. 53538fd1498Szrj// Most of the following conditions are due to limitations in the current 53638fd1498Szrj// implementation. 53738fd1498Szrj#if __cplusplus >= 201103L && _GLIBCXX_USE_CXX11_ABI \ 53838fd1498Szrj && _GLIBCXX_USE_DUAL_ABI && __cpp_transactional_memory >= 201505L \ 53938fd1498Szrj && !_GLIBCXX_FULLY_DYNAMIC_STRING && _GLIBCXX_USE_WEAK_REF \ 54038fd1498Szrj && _GLIBCXX_USE_ALLOCATOR_NEW 54138fd1498Szrj#define _GLIBCXX_TXN_SAFE transaction_safe 54238fd1498Szrj#define _GLIBCXX_TXN_SAFE_DYN transaction_safe_dynamic 54338fd1498Szrj#else 54438fd1498Szrj#define _GLIBCXX_TXN_SAFE 54538fd1498Szrj#define _GLIBCXX_TXN_SAFE_DYN 54638fd1498Szrj#endif 54738fd1498Szrj 54838fd1498Szrj#if __cplusplus > 201402L 54938fd1498Szrj// In C++17 mathematical special functions are in namespace std. 55038fd1498Szrj# define _GLIBCXX_USE_STD_SPEC_FUNCS 1 55138fd1498Szrj#elif __cplusplus >= 201103L && __STDCPP_WANT_MATH_SPEC_FUNCS__ != 0 55238fd1498Szrj// For C++11 and C++14 they are in namespace std when requested. 55338fd1498Szrj# define _GLIBCXX_USE_STD_SPEC_FUNCS 1 55438fd1498Szrj#endif 55538fd1498Szrj 55638fd1498Szrj// The remainder of the prewritten config is automatic; all the 55738fd1498Szrj// user hooks are listed above. 55838fd1498Szrj 55938fd1498Szrj// Create a boolean flag to be used to determine if --fast-math is set. 56038fd1498Szrj#ifdef __FAST_MATH__ 56138fd1498Szrj# define _GLIBCXX_FAST_MATH 1 56238fd1498Szrj#else 56338fd1498Szrj# define _GLIBCXX_FAST_MATH 0 56438fd1498Szrj#endif 56538fd1498Szrj 56638fd1498Szrj// This marks string literals in header files to be extracted for eventual 56738fd1498Szrj// translation. It is primarily used for messages in thrown exceptions; see 56838fd1498Szrj// src/functexcept.cc. We use __N because the more traditional _N is used 56938fd1498Szrj// for something else under certain OSes (see BADNAMES). 57038fd1498Szrj#define __N(msgid) (msgid) 57138fd1498Szrj 57238fd1498Szrj// For example, <windows.h> is known to #define min and max as macros... 57338fd1498Szrj#undef min 57438fd1498Szrj#undef max 57538fd1498Szrj 57638fd1498Szrj// N.B. these _GLIBCXX_USE_C99_XXX macros are defined unconditionally 57738fd1498Szrj// so they should be tested with #if not with #ifdef. 57838fd1498Szrj#if __cplusplus >= 201103L 57938fd1498Szrj# ifndef _GLIBCXX_USE_C99_MATH 58038fd1498Szrj# define _GLIBCXX_USE_C99_MATH _GLIBCXX11_USE_C99_MATH 58138fd1498Szrj# endif 58238fd1498Szrj# ifndef _GLIBCXX_USE_C99_COMPLEX 58338fd1498Szrj# define _GLIBCXX_USE_C99_COMPLEX _GLIBCXX11_USE_C99_COMPLEX 58438fd1498Szrj# endif 58538fd1498Szrj# ifndef _GLIBCXX_USE_C99_STDIO 58638fd1498Szrj# define _GLIBCXX_USE_C99_STDIO _GLIBCXX11_USE_C99_STDIO 58738fd1498Szrj# endif 58838fd1498Szrj# ifndef _GLIBCXX_USE_C99_STDLIB 58938fd1498Szrj# define _GLIBCXX_USE_C99_STDLIB _GLIBCXX11_USE_C99_STDLIB 59038fd1498Szrj# endif 59138fd1498Szrj# ifndef _GLIBCXX_USE_C99_WCHAR 59238fd1498Szrj# define _GLIBCXX_USE_C99_WCHAR _GLIBCXX11_USE_C99_WCHAR 59338fd1498Szrj# endif 59438fd1498Szrj#else 59538fd1498Szrj# ifndef _GLIBCXX_USE_C99_MATH 59638fd1498Szrj# define _GLIBCXX_USE_C99_MATH _GLIBCXX98_USE_C99_MATH 59738fd1498Szrj# endif 59838fd1498Szrj# ifndef _GLIBCXX_USE_C99_COMPLEX 59938fd1498Szrj# define _GLIBCXX_USE_C99_COMPLEX _GLIBCXX98_USE_C99_COMPLEX 60038fd1498Szrj# endif 60138fd1498Szrj# ifndef _GLIBCXX_USE_C99_STDIO 60238fd1498Szrj# define _GLIBCXX_USE_C99_STDIO _GLIBCXX98_USE_C99_STDIO 60338fd1498Szrj# endif 60438fd1498Szrj# ifndef _GLIBCXX_USE_C99_STDLIB 60538fd1498Szrj# define _GLIBCXX_USE_C99_STDLIB _GLIBCXX98_USE_C99_STDLIB 60638fd1498Szrj# endif 60738fd1498Szrj# ifndef _GLIBCXX_USE_C99_WCHAR 60838fd1498Szrj# define _GLIBCXX_USE_C99_WCHAR _GLIBCXX98_USE_C99_WCHAR 60938fd1498Szrj# endif 61038fd1498Szrj#endif 61138fd1498Szrj 612*58e805e6Szrj/* Define if __float128 is supported on this host. */ 613*58e805e6Szrj#if defined(__FLOAT128__) || defined(__SIZEOF_FLOAT128__) 614*58e805e6Szrj#define _GLIBCXX_USE_FLOAT128 615*58e805e6Szrj#endif 616*58e805e6Szrj 61738fd1498Szrj// End of prewritten config; the settings discovered at configure time follow. 618