1// Predefined symbols and macros -*- C++ -*- 2 3// Copyright (C) 1997-2014 Free Software Foundation, Inc. 4// 5// This file is part of the GNU ISO C++ Library. This library is free 6// software; you can redistribute it and/or modify it under the 7// terms of the GNU General Public License as published by the 8// Free Software Foundation; either version 3, or (at your option) 9// any later version. 10 11// This library is distributed in the hope that it will be useful, 12// but WITHOUT ANY WARRANTY; without even the implied warranty of 13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14// GNU General Public License for more details. 15 16// Under Section 7 of GPL version 3, you are granted additional 17// permissions described in the GCC Runtime Library Exception, version 18// 3.1, as published by the Free Software Foundation. 19 20// You should have received a copy of the GNU General Public License and 21// a copy of the GCC Runtime Library Exception along with this program; 22// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 23// <http://www.gnu.org/licenses/>. 24 25/** @file bits/c++config.h 26 * This is an internal header file, included by other library headers. 27 * Do not attempt to use it directly. @headername{iosfwd} 28 */ 29 30#ifndef _GLIBCXX_CXX_CONFIG_H 31#define _GLIBCXX_CXX_CONFIG_H 1 32 33// The current version of the C++ library in compressed ISO date format. 34#define __GLIBCXX__ 35 36// Macros for various attributes. 37// _GLIBCXX_PURE 38// _GLIBCXX_CONST 39// _GLIBCXX_NORETURN 40// _GLIBCXX_NOTHROW 41// _GLIBCXX_VISIBILITY 42#ifndef _GLIBCXX_PURE 43# define _GLIBCXX_PURE __attribute__ ((__pure__)) 44#endif 45 46#ifndef _GLIBCXX_CONST 47# define _GLIBCXX_CONST __attribute__ ((__const__)) 48#endif 49 50#ifndef _GLIBCXX_NORETURN 51# define _GLIBCXX_NORETURN __attribute__ ((__noreturn__)) 52#endif 53 54// See below for C++ 55#ifndef _GLIBCXX_NOTHROW 56# ifndef __cplusplus 57# define _GLIBCXX_NOTHROW __attribute__((__nothrow__)) 58# endif 59#endif 60 61// Macros for visibility attributes. 62// _GLIBCXX_HAVE_ATTRIBUTE_VISIBILITY 63// _GLIBCXX_VISIBILITY 64#define _GLIBCXX_HAVE_ATTRIBUTE_VISIBILITY 65 66#if _GLIBCXX_HAVE_ATTRIBUTE_VISIBILITY 67# define _GLIBCXX_VISIBILITY(V) __attribute__ ((__visibility__ (#V))) 68#else 69// If this is not supplied by the OS-specific or CPU-specific 70// headers included below, it will be defined to an empty default. 71# define _GLIBCXX_VISIBILITY(V) _GLIBCXX_PSEUDO_VISIBILITY(V) 72#endif 73 74// Macros for deprecated attributes. 75// _GLIBCXX_USE_DEPRECATED 76// _GLIBCXX_DEPRECATED 77#ifndef _GLIBCXX_USE_DEPRECATED 78# define _GLIBCXX_USE_DEPRECATED 1 79#endif 80 81#if defined(__DEPRECATED) && (__cplusplus >= 201103L) 82# define _GLIBCXX_DEPRECATED __attribute__ ((__deprecated__)) 83#else 84# define _GLIBCXX_DEPRECATED 85#endif 86 87// Macros for ABI tag attributes. 88#ifndef _GLIBCXX_ABI_TAG_CXX11 89# define _GLIBCXX_ABI_TAG_CXX11 __attribute ((__abi_tag__ ("cxx11"))) 90#endif 91 92 93#if __cplusplus 94 95// Macro for constexpr, to support in mixed 03/0x mode. 96#ifndef _GLIBCXX_CONSTEXPR 97# if __cplusplus >= 201103L 98# define _GLIBCXX_CONSTEXPR constexpr 99# define _GLIBCXX_USE_CONSTEXPR constexpr 100# else 101# define _GLIBCXX_CONSTEXPR 102# define _GLIBCXX_USE_CONSTEXPR const 103# endif 104#endif 105 106// Macro for noexcept, to support in mixed 03/0x mode. 107#ifndef _GLIBCXX_NOEXCEPT 108# if __cplusplus >= 201103L 109# define _GLIBCXX_NOEXCEPT noexcept 110# define _GLIBCXX_USE_NOEXCEPT noexcept 111# define _GLIBCXX_THROW(_EXC) 112# else 113# define _GLIBCXX_NOEXCEPT 114# define _GLIBCXX_USE_NOEXCEPT throw() 115# define _GLIBCXX_THROW(_EXC) throw(_EXC) 116# endif 117#endif 118 119#ifndef _GLIBCXX_NOTHROW 120# define _GLIBCXX_NOTHROW _GLIBCXX_USE_NOEXCEPT 121#endif 122 123#ifndef _GLIBCXX_THROW_OR_ABORT 124# if __EXCEPTIONS 125# define _GLIBCXX_THROW_OR_ABORT(_EXC) (throw (_EXC)) 126# else 127# define _GLIBCXX_THROW_OR_ABORT(_EXC) (__builtin_abort()) 128# endif 129#endif 130 131// Macro for extern template, ie controling template linkage via use 132// of extern keyword on template declaration. As documented in the g++ 133// manual, it inhibits all implicit instantiations and is used 134// throughout the library to avoid multiple weak definitions for 135// required types that are already explicitly instantiated in the 136// library binary. This substantially reduces the binary size of 137// resulting executables. 138// Special case: _GLIBCXX_EXTERN_TEMPLATE == -1 disallows extern 139// templates only in basic_string, thus activating its debug-mode 140// checks even at -O0. 141#define _GLIBCXX_EXTERN_TEMPLATE 142 143/* 144 Outline of libstdc++ namespaces. 145 146 namespace std 147 { 148 namespace __debug { } 149 namespace __parallel { } 150 namespace __profile { } 151 namespace __cxx1998 { } 152 153 namespace __detail { } 154 155 namespace rel_ops { } 156 157 namespace tr1 158 { 159 namespace placeholders { } 160 namespace regex_constants { } 161 namespace __detail { } 162 } 163 164 namespace tr2 { } 165 166 namespace decimal { } 167 168 namespace chrono { } 169 namespace placeholders { } 170 namespace regex_constants { } 171 namespace this_thread { } 172 173 namespace experimental { } 174 } 175 176 namespace abi { } 177 178 namespace __gnu_cxx 179 { 180 namespace __detail { } 181 } 182 183 For full details see: 184 http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/namespaces.html 185*/ 186namespace std 187{ 188 typedef __SIZE_TYPE__ size_t; 189 typedef __PTRDIFF_TYPE__ ptrdiff_t; 190 191#if __cplusplus >= 201103L 192 typedef decltype(nullptr) nullptr_t; 193#endif 194} 195 196 197// Defined if inline namespaces are used for versioning. 198#define _GLIBCXX_INLINE_VERSION 199 200// Inline namespace for symbol versioning. 201#if _GLIBCXX_INLINE_VERSION 202 203namespace std 204{ 205 inline namespace __7 { } 206 207 namespace rel_ops { inline namespace __7 { } } 208 209 namespace tr1 210 { 211 inline namespace __7 { } 212 namespace placeholders { inline namespace __7 { } } 213 namespace regex_constants { inline namespace __7 { } } 214 namespace __detail { inline namespace __7 { } } 215 } 216 217 namespace tr2 218 { inline namespace __7 { } } 219 220 namespace decimal { inline namespace __7 { } } 221 222 namespace chrono { inline namespace __7 { } } 223 namespace placeholders { inline namespace __7 { } } 224 namespace regex_constants { inline namespace __7 { } } 225 namespace this_thread { inline namespace __7 { } } 226 227 namespace experimental { inline namespace __7 { } } 228 229 namespace __detail { inline namespace __7 { } } 230} 231 232namespace __gnu_cxx 233{ 234 inline namespace __7 { } 235 namespace __detail { inline namespace __7 { } } 236} 237# define _GLIBCXX_BEGIN_NAMESPACE_VERSION namespace __7 { 238# define _GLIBCXX_END_NAMESPACE_VERSION } 239#else 240# define _GLIBCXX_BEGIN_NAMESPACE_VERSION 241# define _GLIBCXX_END_NAMESPACE_VERSION 242#endif 243 244 245// Inline namespaces for special modes: debug, parallel, profile. 246#if defined(_GLIBCXX_DEBUG) || defined(_GLIBCXX_PARALLEL) \ 247 || defined(_GLIBCXX_PROFILE) 248namespace std 249{ 250 // Non-inline namespace for components replaced by alternates in active mode. 251 namespace __cxx1998 252 { 253#if _GLIBCXX_INLINE_VERSION 254 inline namespace __7 { } 255#endif 256 } 257 258 // Inline namespace for debug mode. 259# ifdef _GLIBCXX_DEBUG 260 inline namespace __debug { } 261# endif 262 263 // Inline namespaces for parallel mode. 264# ifdef _GLIBCXX_PARALLEL 265 inline namespace __parallel { } 266# endif 267 268 // Inline namespaces for profile mode 269# ifdef _GLIBCXX_PROFILE 270 inline namespace __profile { } 271# endif 272} 273 274// Check for invalid usage and unsupported mixed-mode use. 275# if defined(_GLIBCXX_DEBUG) && defined(_GLIBCXX_PARALLEL) 276# error illegal use of multiple inlined namespaces 277# endif 278# if defined(_GLIBCXX_PROFILE) && defined(_GLIBCXX_DEBUG) 279# error illegal use of multiple inlined namespaces 280# endif 281# if defined(_GLIBCXX_PROFILE) && defined(_GLIBCXX_PARALLEL) 282# error illegal use of multiple inlined namespaces 283# endif 284 285// Check for invalid use due to lack for weak symbols. 286# if __NO_INLINE__ && !__GXX_WEAK__ 287# warning currently using inlined namespace mode which may fail \ 288 without inlining due to lack of weak symbols 289# endif 290#endif 291 292// Macros for namespace scope. Either namespace std:: or the name 293// of some nested namespace within it corresponding to the active mode. 294// _GLIBCXX_STD_A 295// _GLIBCXX_STD_C 296// 297// Macros for opening/closing conditional namespaces. 298// _GLIBCXX_BEGIN_NAMESPACE_ALGO 299// _GLIBCXX_END_NAMESPACE_ALGO 300// _GLIBCXX_BEGIN_NAMESPACE_CONTAINER 301// _GLIBCXX_END_NAMESPACE_CONTAINER 302#if defined(_GLIBCXX_DEBUG) || defined(_GLIBCXX_PROFILE) 303# define _GLIBCXX_STD_C __cxx1998 304# define _GLIBCXX_BEGIN_NAMESPACE_CONTAINER \ 305 namespace _GLIBCXX_STD_C { _GLIBCXX_BEGIN_NAMESPACE_VERSION 306# define _GLIBCXX_END_NAMESPACE_CONTAINER \ 307 _GLIBCXX_END_NAMESPACE_VERSION } 308# undef _GLIBCXX_EXTERN_TEMPLATE 309# define _GLIBCXX_EXTERN_TEMPLATE -1 310#endif 311 312#ifdef _GLIBCXX_PARALLEL 313# define _GLIBCXX_STD_A __cxx1998 314# define _GLIBCXX_BEGIN_NAMESPACE_ALGO \ 315 namespace _GLIBCXX_STD_A { _GLIBCXX_BEGIN_NAMESPACE_VERSION 316# define _GLIBCXX_END_NAMESPACE_ALGO \ 317 _GLIBCXX_END_NAMESPACE_VERSION } 318#endif 319 320#ifndef _GLIBCXX_STD_A 321# define _GLIBCXX_STD_A std 322#endif 323 324#ifndef _GLIBCXX_STD_C 325# define _GLIBCXX_STD_C std 326#endif 327 328#ifndef _GLIBCXX_BEGIN_NAMESPACE_ALGO 329# define _GLIBCXX_BEGIN_NAMESPACE_ALGO 330#endif 331 332#ifndef _GLIBCXX_END_NAMESPACE_ALGO 333# define _GLIBCXX_END_NAMESPACE_ALGO 334#endif 335 336#ifndef _GLIBCXX_BEGIN_NAMESPACE_CONTAINER 337# define _GLIBCXX_BEGIN_NAMESPACE_CONTAINER 338#endif 339 340#ifndef _GLIBCXX_END_NAMESPACE_CONTAINER 341# define _GLIBCXX_END_NAMESPACE_CONTAINER 342#endif 343 344// GLIBCXX_ABI Deprecated 345// Define if compatibility should be provided for -mlong-double-64. 346#undef _GLIBCXX_LONG_DOUBLE_COMPAT 347 348// Inline namespace for long double 128 mode. 349#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__ 350namespace std 351{ 352 inline namespace __gnu_cxx_ldbl128 { } 353} 354# define _GLIBCXX_NAMESPACE_LDBL __gnu_cxx_ldbl128:: 355# define _GLIBCXX_BEGIN_NAMESPACE_LDBL namespace __gnu_cxx_ldbl128 { 356# define _GLIBCXX_END_NAMESPACE_LDBL } 357#else 358# define _GLIBCXX_NAMESPACE_LDBL 359# define _GLIBCXX_BEGIN_NAMESPACE_LDBL 360# define _GLIBCXX_END_NAMESPACE_LDBL 361#endif 362 363// Assert. 364#if !defined(_GLIBCXX_DEBUG) && !defined(_GLIBCXX_PARALLEL) 365# define __glibcxx_assert(_Condition) 366#else 367namespace std 368{ 369 // Avoid the use of assert, because we're trying to keep the <cassert> 370 // include out of the mix. 371 inline void 372 __replacement_assert(const char* __file, int __line, 373 const char* __function, const char* __condition) 374 { 375 __builtin_printf("%s:%d: %s: Assertion '%s' failed.\n", __file, __line, 376 __function, __condition); 377 __builtin_abort(); 378 } 379} 380#define __glibcxx_assert(_Condition) \ 381 do \ 382 { \ 383 if (! (_Condition)) \ 384 std::__replacement_assert(__FILE__, __LINE__, __PRETTY_FUNCTION__, \ 385 #_Condition); \ 386 } while (false) 387#endif 388 389// Macros for race detectors. 390// _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(A) and 391// _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(A) should be used to explain 392// atomic (lock-free) synchronization to race detectors: 393// the race detector will infer a happens-before arc from the former to the 394// latter when they share the same argument pointer. 395// 396// The most frequent use case for these macros (and the only case in the 397// current implementation of the library) is atomic reference counting: 398// void _M_remove_reference() 399// { 400// _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(&this->_M_refcount); 401// if (__gnu_cxx::__exchange_and_add_dispatch(&this->_M_refcount, -1) <= 0) 402// { 403// _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(&this->_M_refcount); 404// _M_destroy(__a); 405// } 406// } 407// The annotations in this example tell the race detector that all memory 408// accesses occurred when the refcount was positive do not race with 409// memory accesses which occurred after the refcount became zero. 410#ifndef _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE 411# define _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(A) 412#endif 413#ifndef _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER 414# define _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(A) 415#endif 416 417// Macros for C linkage: define extern "C" linkage only when using C++. 418# define _GLIBCXX_BEGIN_EXTERN_C extern "C" { 419# define _GLIBCXX_END_EXTERN_C } 420 421#else // !__cplusplus 422# define _GLIBCXX_BEGIN_EXTERN_C 423# define _GLIBCXX_END_EXTERN_C 424#endif 425 426 427// First includes. 428 429// Pick up any OS-specific definitions. 430#include <bits/os_defines.h> 431 432// Pick up any CPU-specific definitions. 433#include <bits/cpu_defines.h> 434 435// If platform uses neither visibility nor psuedo-visibility, 436// specify empty default for namespace annotation macros. 437#ifndef _GLIBCXX_PSEUDO_VISIBILITY 438# define _GLIBCXX_PSEUDO_VISIBILITY(V) 439#endif 440 441// Certain function definitions that are meant to be overridable from 442// user code are decorated with this macro. For some targets, this 443// macro causes these definitions to be weak. 444#ifndef _GLIBCXX_WEAK_DEFINITION 445# define _GLIBCXX_WEAK_DEFINITION 446#endif 447 448 449// The remainder of the prewritten config is automatic; all the 450// user hooks are listed above. 451 452// Create a boolean flag to be used to determine if --fast-math is set. 453#ifdef __FAST_MATH__ 454# define _GLIBCXX_FAST_MATH 1 455#else 456# define _GLIBCXX_FAST_MATH 0 457#endif 458 459// This marks string literals in header files to be extracted for eventual 460// translation. It is primarily used for messages in thrown exceptions; see 461// src/functexcept.cc. We use __N because the more traditional _N is used 462// for something else under certain OSes (see BADNAMES). 463#define __N(msgid) (msgid) 464 465// For example, <windows.h> is known to #define min and max as macros... 466#undef min 467#undef max 468 469// End of prewritten config; the settings discovered at configure time follow. 470