1// Predefined symbols and macros -*- C++ -*- 2 3// Copyright (C) 1997-2013 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 174 namespace abi { } 175 176 namespace __gnu_cxx 177 { 178 namespace __detail { } 179 } 180 181 For full details see: 182 http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/namespaces.html 183*/ 184namespace std 185{ 186 typedef __SIZE_TYPE__ size_t; 187 typedef __PTRDIFF_TYPE__ ptrdiff_t; 188 189#if __cplusplus >= 201103L 190 typedef decltype(nullptr) nullptr_t; 191#endif 192} 193 194 195// Defined if inline namespaces are used for versioning. 196#define _GLIBCXX_INLINE_VERSION 197 198// Inline namespace for symbol versioning. 199#if _GLIBCXX_INLINE_VERSION 200 201namespace std 202{ 203 inline namespace __7 { } 204 205 namespace rel_ops { inline namespace __7 { } } 206 207 namespace tr1 208 { 209 inline namespace __7 { } 210 namespace placeholders { inline namespace __7 { } } 211 namespace regex_constants { inline namespace __7 { } } 212 namespace __detail { inline namespace __7 { } } 213 } 214 215 namespace tr2 216 { inline namespace __7 { } } 217 218 namespace decimal { inline namespace __7 { } } 219 220 namespace chrono { inline namespace __7 { } } 221 namespace placeholders { inline namespace __7 { } } 222 namespace regex_constants { inline namespace __7 { } } 223 namespace this_thread { inline namespace __7 { } } 224 225 namespace __detail { inline namespace __7 { } } 226} 227 228namespace __gnu_cxx 229{ 230 inline namespace __7 { } 231 namespace __detail { inline namespace __7 { } } 232} 233# define _GLIBCXX_BEGIN_NAMESPACE_VERSION namespace __7 { 234# define _GLIBCXX_END_NAMESPACE_VERSION } 235#else 236# define _GLIBCXX_BEGIN_NAMESPACE_VERSION 237# define _GLIBCXX_END_NAMESPACE_VERSION 238#endif 239 240 241// Inline namespaces for special modes: debug, parallel, profile. 242#if defined(_GLIBCXX_DEBUG) || defined(_GLIBCXX_PARALLEL) \ 243 || defined(_GLIBCXX_PROFILE) 244namespace std 245{ 246 // Non-inline namespace for components replaced by alternates in active mode. 247 namespace __cxx1998 248 { 249#if _GLIBCXX_INLINE_VERSION 250 inline namespace __7 { } 251#endif 252 } 253 254 // Inline namespace for debug mode. 255# ifdef _GLIBCXX_DEBUG 256 inline namespace __debug { } 257# endif 258 259 // Inline namespaces for parallel mode. 260# ifdef _GLIBCXX_PARALLEL 261 inline namespace __parallel { } 262# endif 263 264 // Inline namespaces for profile mode 265# ifdef _GLIBCXX_PROFILE 266 inline namespace __profile { } 267# endif 268} 269 270// Check for invalid usage and unsupported mixed-mode use. 271# if defined(_GLIBCXX_DEBUG) && defined(_GLIBCXX_PARALLEL) 272# error illegal use of multiple inlined namespaces 273# endif 274# if defined(_GLIBCXX_PROFILE) && defined(_GLIBCXX_DEBUG) 275# error illegal use of multiple inlined namespaces 276# endif 277# if defined(_GLIBCXX_PROFILE) && defined(_GLIBCXX_PARALLEL) 278# error illegal use of multiple inlined namespaces 279# endif 280 281// Check for invalid use due to lack for weak symbols. 282# if __NO_INLINE__ && !__GXX_WEAK__ 283# warning currently using inlined namespace mode which may fail \ 284 without inlining due to lack of weak symbols 285# endif 286#endif 287 288// Macros for namespace scope. Either namespace std:: or the name 289// of some nested namespace within it corresponding to the active mode. 290// _GLIBCXX_STD_A 291// _GLIBCXX_STD_C 292// 293// Macros for opening/closing conditional namespaces. 294// _GLIBCXX_BEGIN_NAMESPACE_ALGO 295// _GLIBCXX_END_NAMESPACE_ALGO 296// _GLIBCXX_BEGIN_NAMESPACE_CONTAINER 297// _GLIBCXX_END_NAMESPACE_CONTAINER 298#if defined(_GLIBCXX_DEBUG) || defined(_GLIBCXX_PROFILE) 299# define _GLIBCXX_STD_C __cxx1998 300# define _GLIBCXX_BEGIN_NAMESPACE_CONTAINER \ 301 namespace _GLIBCXX_STD_C { _GLIBCXX_BEGIN_NAMESPACE_VERSION 302# define _GLIBCXX_END_NAMESPACE_CONTAINER \ 303 _GLIBCXX_END_NAMESPACE_VERSION } 304# undef _GLIBCXX_EXTERN_TEMPLATE 305# define _GLIBCXX_EXTERN_TEMPLATE -1 306#endif 307 308#ifdef _GLIBCXX_PARALLEL 309# define _GLIBCXX_STD_A __cxx1998 310# define _GLIBCXX_BEGIN_NAMESPACE_ALGO \ 311 namespace _GLIBCXX_STD_A { _GLIBCXX_BEGIN_NAMESPACE_VERSION 312# define _GLIBCXX_END_NAMESPACE_ALGO \ 313 _GLIBCXX_END_NAMESPACE_VERSION } 314#endif 315 316#ifndef _GLIBCXX_STD_A 317# define _GLIBCXX_STD_A std 318#endif 319 320#ifndef _GLIBCXX_STD_C 321# define _GLIBCXX_STD_C std 322#endif 323 324#ifndef _GLIBCXX_BEGIN_NAMESPACE_ALGO 325# define _GLIBCXX_BEGIN_NAMESPACE_ALGO 326#endif 327 328#ifndef _GLIBCXX_END_NAMESPACE_ALGO 329# define _GLIBCXX_END_NAMESPACE_ALGO 330#endif 331 332#ifndef _GLIBCXX_BEGIN_NAMESPACE_CONTAINER 333# define _GLIBCXX_BEGIN_NAMESPACE_CONTAINER 334#endif 335 336#ifndef _GLIBCXX_END_NAMESPACE_CONTAINER 337# define _GLIBCXX_END_NAMESPACE_CONTAINER 338#endif 339 340// GLIBCXX_ABI Deprecated 341// Define if compatibility should be provided for -mlong-double-64. 342#undef _GLIBCXX_LONG_DOUBLE_COMPAT 343 344// Inline namespace for long double 128 mode. 345#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__ 346namespace std 347{ 348 inline namespace __gnu_cxx_ldbl128 { } 349} 350# define _GLIBCXX_NAMESPACE_LDBL __gnu_cxx_ldbl128:: 351# define _GLIBCXX_BEGIN_NAMESPACE_LDBL namespace __gnu_cxx_ldbl128 { 352# define _GLIBCXX_END_NAMESPACE_LDBL } 353#else 354# define _GLIBCXX_NAMESPACE_LDBL 355# define _GLIBCXX_BEGIN_NAMESPACE_LDBL 356# define _GLIBCXX_END_NAMESPACE_LDBL 357#endif 358 359// Assert. 360#if !defined(_GLIBCXX_DEBUG) && !defined(_GLIBCXX_PARALLEL) 361# define __glibcxx_assert(_Condition) 362#else 363namespace std 364{ 365 // Avoid the use of assert, because we're trying to keep the <cassert> 366 // include out of the mix. 367 inline void 368 __replacement_assert(const char* __file, int __line, 369 const char* __function, const char* __condition) 370 { 371 __builtin_printf("%s:%d: %s: Assertion '%s' failed.\n", __file, __line, 372 __function, __condition); 373 __builtin_abort(); 374 } 375} 376#define __glibcxx_assert(_Condition) \ 377 do \ 378 { \ 379 if (! (_Condition)) \ 380 std::__replacement_assert(__FILE__, __LINE__, __PRETTY_FUNCTION__, \ 381 #_Condition); \ 382 } while (false) 383#endif 384 385// Macros for race detectors. 386// _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(A) and 387// _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(A) should be used to explain 388// atomic (lock-free) synchronization to race detectors: 389// the race detector will infer a happens-before arc from the former to the 390// latter when they share the same argument pointer. 391// 392// The most frequent use case for these macros (and the only case in the 393// current implementation of the library) is atomic reference counting: 394// void _M_remove_reference() 395// { 396// _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(&this->_M_refcount); 397// if (__gnu_cxx::__exchange_and_add_dispatch(&this->_M_refcount, -1) <= 0) 398// { 399// _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(&this->_M_refcount); 400// _M_destroy(__a); 401// } 402// } 403// The annotations in this example tell the race detector that all memory 404// accesses occurred when the refcount was positive do not race with 405// memory accesses which occurred after the refcount became zero. 406#ifndef _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE 407# define _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(A) 408#endif 409#ifndef _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER 410# define _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(A) 411#endif 412 413// Macros for C linkage: define extern "C" linkage only when using C++. 414# define _GLIBCXX_BEGIN_EXTERN_C extern "C" { 415# define _GLIBCXX_END_EXTERN_C } 416 417#else // !__cplusplus 418# define _GLIBCXX_BEGIN_EXTERN_C 419# define _GLIBCXX_END_EXTERN_C 420#endif 421 422 423// First includes. 424 425// Pick up any OS-specific definitions. 426#include <bits/os_defines.h> 427 428// Pick up any CPU-specific definitions. 429#include <bits/cpu_defines.h> 430 431// If platform uses neither visibility nor psuedo-visibility, 432// specify empty default for namespace annotation macros. 433#ifndef _GLIBCXX_PSEUDO_VISIBILITY 434# define _GLIBCXX_PSEUDO_VISIBILITY(V) 435#endif 436 437// Certain function definitions that are meant to be overridable from 438// user code are decorated with this macro. For some targets, this 439// macro causes these definitions to be weak. 440#ifndef _GLIBCXX_WEAK_DEFINITION 441# define _GLIBCXX_WEAK_DEFINITION 442#endif 443 444 445// The remainder of the prewritten config is automatic; all the 446// user hooks are listed above. 447 448// Create a boolean flag to be used to determine if --fast-math is set. 449#ifdef __FAST_MATH__ 450# define _GLIBCXX_FAST_MATH 1 451#else 452# define _GLIBCXX_FAST_MATH 0 453#endif 454 455// This marks string literals in header files to be extracted for eventual 456// translation. It is primarily used for messages in thrown exceptions; see 457// src/functexcept.cc. We use __N because the more traditional _N is used 458// for something else under certain OSes (see BADNAMES). 459#define __N(msgid) (msgid) 460 461// For example, <windows.h> is known to #define min and max as macros... 462#undef min 463#undef max 464 465// End of prewritten config; the settings discovered at configure time follow. 466