1234370Sjasone/***
2234370Sjasone * D compatible types that correspond to various basic types in associated
3234370Sjasone * C and C++ compilers.
4234370Sjasone *
5234370Sjasone * Copyright: Copyright Sean Kelly 2005 - 2009.
6242844Sjasone * License: Distributed under the
7242844Sjasone *      $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0).
8242844Sjasone *    (See accompanying file LICENSE)
9242844Sjasone * Authors:   Sean Kelly
10242844Sjasone * Source:    $(DRUNTIMESRC core/stdc/_config.d)
11242844Sjasone * Standards: ISO/IEC 9899:1999 (E)
12242844Sjasone */
13242844Sjasone
14242844Sjasone/* NOTE: This file has been patched from the original DMD distribution to
15242844Sjasone * work with the GDC compiler.
16234370Sjasone */
17234370Sjasonemodule core.stdc.config;
18234370Sjasone
19234370Sjasoneversion (StdDdoc)
20234370Sjasone{
21234370Sjasone    private
22234370Sjasone    {
23234370Sjasone        version (Posix)
24234370Sjasone            enum isPosix = true;
25234370Sjasone        else
26234370Sjasone            enum isPosix = false;
27234370Sjasone        static if (isPosix && (void*).sizeof > int.sizeof)
28234370Sjasone        {
29234370Sjasone            alias ddoc_long = long;
30234370Sjasone            alias ddoc_ulong = ulong;
31234370Sjasone        }
32234370Sjasone        else
33234370Sjasone        {
34234370Sjasone            alias ddoc_long = int;
35234370Sjasone            alias ddoc_ulong = uint;
36234370Sjasone        }
37234370Sjasone        struct ddoc_complex(T) { T re; T im; }
38234370Sjasone    }
39234370Sjasone
40234370Sjasone    /***
41234370Sjasone     * Used for a signed integer type that corresponds in size to the associated
42242844Sjasone     * C compiler's `long` type.
43242844Sjasone     */
44242844Sjasone    alias c_long = ddoc_long;
45242844Sjasone
46242844Sjasone    /***
47242844Sjasone     * Used for an unsigned integer type that corresponds in size to the associated
48242844Sjasone     * C compiler's `unsigned long` type.
49242844Sjasone     */
50242844Sjasone    alias c_ulong = ddoc_ulong;
51242844Sjasone
52242844Sjasone    /***
53242844Sjasone     * Used for a signed integer type that corresponds in size and mangling to the associated
54242844Sjasone     * C++ compiler's `long` type.
55242844Sjasone     */
56242844Sjasone    alias cpp_long = c_long;
57242844Sjasone
58242844Sjasone    /***
59242844Sjasone     * Used for an unsigned integer type that corresponds in size and mangling to the associated
60242844Sjasone     * C++ compiler's `unsigned long` type.
61242844Sjasone     */
62242844Sjasone    alias cpp_ulong = c_ulong;
63242844Sjasone
64242844Sjasone    /***
65242844Sjasone     * Used for a signed integer type that corresponds in size and mangling to the associated
66242844Sjasone     * C++ compiler's `long long` type.
67234370Sjasone     */
68234370Sjasone    alias cpp_longlong = long;
69234370Sjasone
70234370Sjasone    /***
71234370Sjasone     * Used for an unsigned integer type that corresponds in size and mangling to the associated
72234370Sjasone     * C++ compiler's `unsigned long long` type.
73234370Sjasone     */
74234370Sjasone    alias cpp_ulonglong = ulong;
75234370Sjasone
76234370Sjasone    /***
77234370Sjasone     * Used for a floating point type that corresponds in size and mangling to the associated
78234370Sjasone     * C++ compiler's `long double` type.
79234370Sjasone     */
80234370Sjasone    alias c_long_double = real;
81234370Sjasone
82234370Sjasone    /***
83234370Sjasone     * Used for an unsigned integer type that corresponds in size and mangling to the associated
84234370Sjasone     * C++ compiler's `size_t` type.
85234370Sjasone     */
86234370Sjasone    alias cpp_size_t = size_t;
87234370Sjasone
88234370Sjasone    /***
89234370Sjasone     * Used for a signed integer type that corresponds in size and mangling to the associated
90234370Sjasone     * C++ compiler's `ptrdiff_t` type.
91234370Sjasone     */
92234370Sjasone    alias cpp_ptrdiff_t = ptrdiff_t;
93234370Sjasone
94234370Sjasone    /***
95234370Sjasone     * Used for a complex floating point type that corresponds in size and ABI to the associated
96234370Sjasone     * C compiler's `_Complex float` type.
97234370Sjasone     */
98234370Sjasone    alias c_complex_float = ddoc_complex!float;
99234370Sjasone
100234370Sjasone    /***
101234370Sjasone     * Used for a complex floating point type that corresponds in size and ABI to the associated
102234370Sjasone     * C compiler's `_Complex double` type.
103234370Sjasone     */
104234370Sjasone    alias c_complex_double = ddoc_complex!double;
105234370Sjasone
106234370Sjasone    /***
107234370Sjasone     * Used for a complex floating point type that corresponds in size and ABI to the associated
108234370Sjasone     * C compiler's `_Complex long double` type.
109234370Sjasone     */
110234370Sjasone    alias c_complex_real = ddoc_complex!real;
111234370Sjasone}
112234370Sjasoneelse
113234370Sjasone{
114234370Sjasone
115234370Sjasoneversion (OSX)
116234370Sjasone    version = Darwin;
117234370Sjasoneelse version (iOS)
118234370Sjasone    version = Darwin;
119234370Sjasoneelse version (TVOS)
120234370Sjasone    version = Darwin;
121234370Sjasoneelse version (WatchOS)
122234370Sjasone    version = Darwin;
123234370Sjasone
124234370Sjasoneversion (GNU)
125234370Sjasone{
126242844Sjasone    import gcc.builtins;
127234569Sjasone
128234569Sjasone    alias __builtin_clong  c_long;
129234569Sjasone    alias __builtin_culong c_ulong;
130234569Sjasone
131234370Sjasone    enum __c_long  : __builtin_clong;
132234370Sjasone    enum __c_ulong : __builtin_culong;
133234370Sjasone
134234370Sjasone    alias __c_long  cpp_long;
135234370Sjasone    alias __c_ulong cpp_ulong;
136234370Sjasone
137234370Sjasone    enum __c_longlong  : __builtin_clonglong;
138234370Sjasone    enum __c_ulonglong : __builtin_culonglong;
139234370Sjasone
140234370Sjasone    alias __c_longlong  cpp_longlong;
141234370Sjasone    alias __c_ulonglong cpp_ulonglong;
142234370Sjasone}
143234370Sjasoneelse version (Windows)
144234370Sjasone{
145234370Sjasone    enum __c_long  : int;
146234370Sjasone    enum __c_ulong : uint;
147234370Sjasone
148234370Sjasone    alias int   c_long;
149234370Sjasone    alias uint  c_ulong;
150234370Sjasone
151234370Sjasone    alias __c_long   cpp_long;
152234370Sjasone    alias __c_ulong  cpp_ulong;
153234370Sjasone
154234370Sjasone    alias long  cpp_longlong;
155234370Sjasone    alias ulong cpp_ulonglong;
156234370Sjasone}
157234370Sjasoneelse version (Posix)
158234370Sjasone{
159234370Sjasone  static if ( (void*).sizeof > int.sizeof )
160234370Sjasone  {
161234370Sjasone    enum __c_longlong  : long;
162234370Sjasone    enum __c_ulonglong : ulong;
163234370Sjasone
164234370Sjasone    alias long  c_long;
165234370Sjasone    alias ulong c_ulong;
166234370Sjasone
167234370Sjasone    alias long   cpp_long;
168234370Sjasone    alias ulong  cpp_ulong;
169234370Sjasone
170234370Sjasone    alias __c_longlong  cpp_longlong;
171234370Sjasone    alias __c_ulonglong cpp_ulonglong;
172234370Sjasone  }
173234370Sjasone  else
174234370Sjasone  {
175234370Sjasone    enum __c_long  : int;
176234370Sjasone    enum __c_ulong : uint;
177234370Sjasone
178234370Sjasone    alias int   c_long;
179234370Sjasone    alias uint  c_ulong;
180234370Sjasone
181234370Sjasone    alias __c_long   cpp_long;
182234370Sjasone    alias __c_ulong  cpp_ulong;
183234370Sjasone
184234370Sjasone    alias long  cpp_longlong;
185234370Sjasone    alias ulong cpp_ulonglong;
186234370Sjasone  }
187234370Sjasone}
188234370Sjasone
189234370Sjasoneversion (GNU)
190234370Sjasone    alias c_long_double = real;
191234370Sjasoneelse version (LDC)
192234370Sjasone    alias c_long_double = real; // 64-bit real for MSVC targets
193234370Sjasoneelse version (SDC)
194234370Sjasone{
195234370Sjasone    version (X86)
196234370Sjasone        alias c_long_double = real;
197234370Sjasone    else version (X86_64)
198        alias c_long_double = real;
199}
200else version (CRuntime_Microsoft)
201{
202    /* long double is 64 bits, not 80 bits, but is mangled differently
203     * than double. To distinguish double from long double, create a wrapper to represent
204     * long double, then recognize that wrapper specially in the compiler
205     * to generate the correct name mangling and correct function call/return
206     * ABI conformance.
207     */
208    enum __c_long_double : double;
209
210    alias __c_long_double c_long_double;
211}
212else version (DigitalMars)
213{
214    version (X86)
215    {
216        alias real c_long_double;
217    }
218    else version (X86_64)
219    {
220        version (linux)
221            alias real c_long_double;
222        else version (FreeBSD)
223            alias real c_long_double;
224        else version (OpenBSD)
225            alias real c_long_double;
226        else version (NetBSD)
227            alias real c_long_double;
228        else version (DragonFlyBSD)
229            alias real c_long_double;
230        else version (Solaris)
231            alias real c_long_double;
232        else version (Darwin)
233            alias real c_long_double;
234    }
235}
236
237static assert(is(c_long_double), "c_long_double needs to be declared for this platform/architecture.");
238
239version (Darwin)
240{
241    alias cpp_size_t = cpp_ulong;
242    version (D_LP64)
243        alias cpp_ptrdiff_t = cpp_long;
244    else
245        alias cpp_ptrdiff_t = ptrdiff_t;
246}
247else
248{
249    alias cpp_size_t = size_t;
250    alias cpp_ptrdiff_t = ptrdiff_t;
251}
252
253// ABI layout of native complex types.
254private struct _Complex(T)
255{
256    T re;
257    T im;
258}
259
260enum __c_complex_float  : _Complex!float;
261enum __c_complex_double : _Complex!double;
262enum __c_complex_real   : _Complex!c_long_double;
263
264alias c_complex_float = __c_complex_float;
265alias c_complex_double = __c_complex_double;
266alias c_complex_real = __c_complex_real;
267}
268