100db7afdSDavid E. O'Brien// Predefined symbols and macros -*- C++ -*- 200db7afdSDavid E. O'Brien 3*f8a1b7d9SAlexander Kabaev// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 4*f8a1b7d9SAlexander Kabaev// 2006, 2007 51b86b14eSAlexander Kabaev// Free Software Foundation, Inc. 600db7afdSDavid E. O'Brien// 700db7afdSDavid E. O'Brien// This file is part of the GNU ISO C++ Library. This library is free 800db7afdSDavid E. O'Brien// software; you can redistribute it and/or modify it under the 900db7afdSDavid E. O'Brien// terms of the GNU General Public License as published by the 1000db7afdSDavid E. O'Brien// Free Software Foundation; either version 2, or (at your option) 1100db7afdSDavid E. O'Brien// any later version. 1200db7afdSDavid E. O'Brien 1300db7afdSDavid E. O'Brien// This library is distributed in the hope that it will be useful, 1400db7afdSDavid E. O'Brien// but WITHOUT ANY WARRANTY; without even the implied warranty of 1500db7afdSDavid E. O'Brien// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1600db7afdSDavid E. O'Brien// GNU General Public License for more details. 1700db7afdSDavid E. O'Brien 1800db7afdSDavid E. O'Brien// You should have received a copy of the GNU General Public License along 1900db7afdSDavid E. O'Brien// with this library; see the file COPYING. If not, write to the Free 20*f8a1b7d9SAlexander Kabaev// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 2100db7afdSDavid E. O'Brien// USA. 2200db7afdSDavid E. O'Brien 2300db7afdSDavid E. O'Brien// As a special exception, you may use this file as part of a free software 2400db7afdSDavid E. O'Brien// library without restriction. Specifically, if other files instantiate 2500db7afdSDavid E. O'Brien// templates or use macros or inline functions from this file, or you compile 2600db7afdSDavid E. O'Brien// this file and link it with other files to produce an executable, this 2700db7afdSDavid E. O'Brien// file does not by itself cause the resulting executable to be covered by 2800db7afdSDavid E. O'Brien// the GNU General Public License. This exception does not however 2900db7afdSDavid E. O'Brien// invalidate any other reasons why the executable file might be covered by 3000db7afdSDavid E. O'Brien// the GNU General Public License. 3100db7afdSDavid E. O'Brien 32*f8a1b7d9SAlexander Kabaev/** @file c++config.h 33*f8a1b7d9SAlexander Kabaev * This is an internal header file, included by other library headers. 34*f8a1b7d9SAlexander Kabaev * You should not attempt to use it directly. 35*f8a1b7d9SAlexander Kabaev */ 36*f8a1b7d9SAlexander Kabaev 37ffeaf689SAlexander Kabaev#ifndef _CXXCONFIG 38ffeaf689SAlexander Kabaev#define _CXXCONFIG 1 3900db7afdSDavid E. O'Brien 4000db7afdSDavid E. O'Brien// Pick up any OS-specific definitions. 4100db7afdSDavid E. O'Brien#include <bits/os_defines.h> 4200db7afdSDavid E. O'Brien 43*f8a1b7d9SAlexander Kabaev// Pick up any CPU-specific definitions. 44*f8a1b7d9SAlexander Kabaev#include <bits/cpu_defines.h> 45*f8a1b7d9SAlexander Kabaev 4600db7afdSDavid E. O'Brien// The current version of the C++ library in compressed ISO date format. 47*f8a1b7d9SAlexander Kabaev#define __GLIBCXX__ 48*f8a1b7d9SAlexander Kabaev 49*f8a1b7d9SAlexander Kabaev// Macros for visibility. 50*f8a1b7d9SAlexander Kabaev#define _GLIBCXX_HAVE_ATTRIBUTE_VISIBILITY 51*f8a1b7d9SAlexander Kabaev 52*f8a1b7d9SAlexander Kabaev#if _GLIBCXX_HAVE_ATTRIBUTE_VISIBILITY 53*f8a1b7d9SAlexander Kabaev#define _GLIBCXX_VISIBILITY(V) __attribute__ ((__visibility__ (#V))) 54*f8a1b7d9SAlexander Kabaev#else 55*f8a1b7d9SAlexander Kabaev#define _GLIBCXX_VISIBILITY(V) 56*f8a1b7d9SAlexander Kabaev#endif 57*f8a1b7d9SAlexander Kabaev 58*f8a1b7d9SAlexander Kabaev// Macros for controlling various namespace association schemes and modes. 59*f8a1b7d9SAlexander Kabaev#ifdef _GLIBCXX_DEBUG 60*f8a1b7d9SAlexander Kabaev# define _GLIBCXX_NAMESPACE_ASSOCIATION_DEBUG 1 61*f8a1b7d9SAlexander Kabaev#endif 62*f8a1b7d9SAlexander Kabaev 63*f8a1b7d9SAlexander Kabaev#define _GLIBCXX_NAMESPACE_ASSOCIATION_VERSION 64*f8a1b7d9SAlexander Kabaev 65*f8a1b7d9SAlexander Kabaev// Macros for namespace scope. 66*f8a1b7d9SAlexander Kabaev// _GLIBCXX_BEGIN_NAMESPACE 67*f8a1b7d9SAlexander Kabaev// _GLIBCXX_END_NAMESPACE 68*f8a1b7d9SAlexander Kabaev// _GLIBCXX_BEGIN_NESTED_NAMESPACE 69*f8a1b7d9SAlexander Kabaev// _GLIBCXX_END_NESTED_NAMESPACE 70*f8a1b7d9SAlexander Kabaev#if _GLIBCXX_NAMESPACE_ASSOCIATION_VERSION 71*f8a1b7d9SAlexander Kabaev# define _GLIBCXX_BEGIN_NESTED_NAMESPACE(X, Y) namespace X { namespace Y _GLIBCXX_VISIBILITY(default) { 72*f8a1b7d9SAlexander Kabaev# define _GLIBCXX_END_NESTED_NAMESPACE } } 73*f8a1b7d9SAlexander Kabaev# define _GLIBCXX_BEGIN_NAMESPACE(X) _GLIBCXX_BEGIN_NESTED_NAMESPACE(X, _6) 74*f8a1b7d9SAlexander Kabaev# define _GLIBCXX_END_NAMESPACE _GLIBCXX_END_NESTED_NAMESPACE 75*f8a1b7d9SAlexander Kabaev#else 76*f8a1b7d9SAlexander Kabaev# define _GLIBCXX_BEGIN_NAMESPACE(X) namespace X _GLIBCXX_VISIBILITY(default) { 77*f8a1b7d9SAlexander Kabaev# define _GLIBCXX_END_NAMESPACE } 78*f8a1b7d9SAlexander Kabaev# if _GLIBCXX_NAMESPACE_ASSOCIATION_DEBUG 79*f8a1b7d9SAlexander Kabaev# define _GLIBCXX_BEGIN_NESTED_NAMESPACE(X, Y) namespace X { namespace Y _GLIBCXX_VISIBILITY(default) { 80*f8a1b7d9SAlexander Kabaev# define _GLIBCXX_END_NESTED_NAMESPACE } } 81*f8a1b7d9SAlexander Kabaev# else 82*f8a1b7d9SAlexander Kabaev# define _GLIBCXX_BEGIN_NESTED_NAMESPACE(X, Y) _GLIBCXX_BEGIN_NAMESPACE(X) 83*f8a1b7d9SAlexander Kabaev# define _GLIBCXX_END_NESTED_NAMESPACE _GLIBCXX_END_NAMESPACE 84*f8a1b7d9SAlexander Kabaev# endif 85*f8a1b7d9SAlexander Kabaev#endif 86*f8a1b7d9SAlexander Kabaev 87*f8a1b7d9SAlexander Kabaev// Namespace associations for versioning mode. 88*f8a1b7d9SAlexander Kabaev#if _GLIBCXX_NAMESPACE_ASSOCIATION_VERSION 89*f8a1b7d9SAlexander Kabaevnamespace std 90*f8a1b7d9SAlexander Kabaev{ 91*f8a1b7d9SAlexander Kabaev namespace _6 { } 92*f8a1b7d9SAlexander Kabaev using namespace _6 __attribute__ ((strong)); 93*f8a1b7d9SAlexander Kabaev} 94*f8a1b7d9SAlexander Kabaev 95*f8a1b7d9SAlexander Kabaev// In addition, other supported namespace configurations. 96*f8a1b7d9SAlexander Kabaevnamespace __gnu_cxx 97*f8a1b7d9SAlexander Kabaev{ 98*f8a1b7d9SAlexander Kabaev namespace _6 { } 99*f8a1b7d9SAlexander Kabaev using namespace _6 __attribute__ ((strong)); 100*f8a1b7d9SAlexander Kabaev} 101*f8a1b7d9SAlexander Kabaev 102*f8a1b7d9SAlexander Kabaevnamespace std 103*f8a1b7d9SAlexander Kabaev{ 104*f8a1b7d9SAlexander Kabaev namespace tr1 105*f8a1b7d9SAlexander Kabaev { 106*f8a1b7d9SAlexander Kabaev namespace _6 { } 107*f8a1b7d9SAlexander Kabaev using namespace _6 __attribute__ ((strong)); 108*f8a1b7d9SAlexander Kabaev } 109*f8a1b7d9SAlexander Kabaev} 110*f8a1b7d9SAlexander Kabaev#endif 111*f8a1b7d9SAlexander Kabaev 112*f8a1b7d9SAlexander Kabaev// Namespace associations for debug mode. 113*f8a1b7d9SAlexander Kabaev#if _GLIBCXX_NAMESPACE_ASSOCIATION_DEBUG 114*f8a1b7d9SAlexander Kabaevnamespace std 115*f8a1b7d9SAlexander Kabaev{ 116*f8a1b7d9SAlexander Kabaev namespace __norm { } 117*f8a1b7d9SAlexander Kabaev namespace __debug { } 118*f8a1b7d9SAlexander Kabaev using namespace __debug __attribute__ ((strong)); 119*f8a1b7d9SAlexander Kabaev} 120*f8a1b7d9SAlexander Kabaev 121*f8a1b7d9SAlexander Kabaevnamespace __gnu_cxx 122*f8a1b7d9SAlexander Kabaev{ 123*f8a1b7d9SAlexander Kabaev namespace __norm { } 124*f8a1b7d9SAlexander Kabaev namespace __debug { } 125*f8a1b7d9SAlexander Kabaev using namespace __debug __attribute__ ((strong)); 126*f8a1b7d9SAlexander Kabaev} 127*f8a1b7d9SAlexander Kabaev 128*f8a1b7d9SAlexander Kabaev# define _GLIBCXX_STD __norm 129*f8a1b7d9SAlexander Kabaev# define _GLIBCXX_EXT __norm 130*f8a1b7d9SAlexander Kabaev# define _GLIBCXX_EXTERN_TEMPLATE 0 131*f8a1b7d9SAlexander Kabaev# if __NO_INLINE__ && !__GXX_WEAK__ 132*f8a1b7d9SAlexander Kabaev# warning debug mode without inlining may fail due to lack of weak symbols 133*f8a1b7d9SAlexander Kabaev# endif 134*f8a1b7d9SAlexander Kabaev#else 135*f8a1b7d9SAlexander Kabaev#if _GLIBCXX_NAMESPACE_ASSOCIATION_VERSION 136*f8a1b7d9SAlexander Kabaev# define _GLIBCXX_STD _6 137*f8a1b7d9SAlexander Kabaev# define _GLIBCXX_EXT _6 138*f8a1b7d9SAlexander Kabaev#else 139*f8a1b7d9SAlexander Kabaev# define _GLIBCXX_STD std 140*f8a1b7d9SAlexander Kabaev# define _GLIBCXX_EXT __gnu_cxx 141*f8a1b7d9SAlexander Kabaev#endif 142*f8a1b7d9SAlexander Kabaev#endif 143*f8a1b7d9SAlexander Kabaev 144*f8a1b7d9SAlexander Kabaev/* Define if compatibility should be provided for -mlong-double-64. */ 145*f8a1b7d9SAlexander Kabaev#undef _GLIBCXX_LONG_DOUBLE_COMPAT 146*f8a1b7d9SAlexander Kabaev 147*f8a1b7d9SAlexander Kabaev// XXX GLIBCXX_ABI Deprecated 148*f8a1b7d9SAlexander Kabaev// Namespace associations for long double 128 mode. 149*f8a1b7d9SAlexander Kabaev_GLIBCXX_BEGIN_NAMESPACE(std) 150*f8a1b7d9SAlexander Kabaev#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__ 151*f8a1b7d9SAlexander Kabaev# define _GLIBCXX_LDBL_NAMESPACE __gnu_cxx_ldbl128:: 152*f8a1b7d9SAlexander Kabaev# define _GLIBCXX_BEGIN_LDBL_NAMESPACE namespace __gnu_cxx_ldbl128 { 153*f8a1b7d9SAlexander Kabaev# define _GLIBCXX_END_LDBL_NAMESPACE } 154*f8a1b7d9SAlexander Kabaev namespace __gnu_cxx_ldbl128 { } 155*f8a1b7d9SAlexander Kabaev using namespace __gnu_cxx_ldbl128 __attribute__((__strong__)); 156*f8a1b7d9SAlexander Kabaev#else 157*f8a1b7d9SAlexander Kabaev# define _GLIBCXX_LDBL_NAMESPACE 158*f8a1b7d9SAlexander Kabaev# define _GLIBCXX_BEGIN_LDBL_NAMESPACE 159*f8a1b7d9SAlexander Kabaev# define _GLIBCXX_END_LDBL_NAMESPACE 160*f8a1b7d9SAlexander Kabaev#endif 161*f8a1b7d9SAlexander Kabaev_GLIBCXX_END_NAMESPACE 162*f8a1b7d9SAlexander Kabaev 16300db7afdSDavid E. O'Brien 164ffeaf689SAlexander Kabaev// Allow use of "export template." This is currently not a feature 165ffeaf689SAlexander Kabaev// that g++ supports. 166ffeaf689SAlexander Kabaev// #define _GLIBCXX_EXPORT_TEMPLATE 1 16700db7afdSDavid E. O'Brien 1681b86b14eSAlexander Kabaev// Allow use of the GNU syntax extension, "extern template." This 1691b86b14eSAlexander Kabaev// extension is fully documented in the g++ manual, but in a nutshell, 1701b86b14eSAlexander Kabaev// it inhibits all implicit instantiations and is used throughout the 1711b86b14eSAlexander Kabaev// library to avoid multiple weak definitions for required types that 1721b86b14eSAlexander Kabaev// are already explicitly instantiated in the library binary. This 1731b86b14eSAlexander Kabaev// substantially reduces the binary size of resulting executables. 174ffeaf689SAlexander Kabaev#ifndef _GLIBCXX_EXTERN_TEMPLATE 175ffeaf689SAlexander Kabaev# define _GLIBCXX_EXTERN_TEMPLATE 1 1761b86b14eSAlexander Kabaev#endif 1771b86b14eSAlexander Kabaev 17800db7afdSDavid E. O'Brien 179*f8a1b7d9SAlexander Kabaev// Certain function definitions that are meant to be overridable from 180*f8a1b7d9SAlexander Kabaev// user code are decorated with this macro. For some targets, this 181*f8a1b7d9SAlexander Kabaev// macro causes these definitions to be weak. 182*f8a1b7d9SAlexander Kabaev#ifndef _GLIBCXX_WEAK_DEFINITION 183*f8a1b7d9SAlexander Kabaev# define _GLIBCXX_WEAK_DEFINITION 184ca6500fcSAlexander Kabaev#endif 18500db7afdSDavid E. O'Brien 186ffeaf689SAlexander Kabaev// The remainder of the prewritten config is automatic; all the 187ffeaf689SAlexander Kabaev// user hooks are listed above. 188ffeaf689SAlexander Kabaev 1891b86b14eSAlexander Kabaev// Create a boolean flag to be used to determine if --fast-math is set. 1901b86b14eSAlexander Kabaev#ifdef __FAST_MATH__ 191ffeaf689SAlexander Kabaev# define _GLIBCXX_FAST_MATH 1 1921b86b14eSAlexander Kabaev#else 193ffeaf689SAlexander Kabaev# define _GLIBCXX_FAST_MATH 0 1941b86b14eSAlexander Kabaev#endif 1951b86b14eSAlexander Kabaev 196ffeaf689SAlexander Kabaev// This marks string literals in header files to be extracted for eventual 197ffeaf689SAlexander Kabaev// translation. It is primarily used for messages in thrown exceptions; see 198ffeaf689SAlexander Kabaev// src/functexcept.cc. We use __N because the more traditional _N is used 199ffeaf689SAlexander Kabaev// for something else under certain OSes (see BADNAMES). 200ffeaf689SAlexander Kabaev#define __N(msgid) (msgid) 20100db7afdSDavid E. O'Brien 202*f8a1b7d9SAlexander Kabaev// For example, <windows.h> is known to #define min and max as macros... 203*f8a1b7d9SAlexander Kabaev#undef min 204*f8a1b7d9SAlexander Kabaev#undef max 205*f8a1b7d9SAlexander Kabaev 20600db7afdSDavid E. O'Brien// End of prewritten config; the discovered settings follow. 207