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