1 /***
2  * D compatible types that correspond to various basic types in associated
3  * C and C++ compilers.
4  *
5  * Copyright: Copyright Sean Kelly 2005 - 2009.
6  * License: Distributed under the
7  *      $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0).
8  *    (See accompanying file LICENSE)
9  * Authors:   Sean Kelly
10  * Source:    $(DRUNTIMESRC core/stdc/_config.d)
11  * Standards: ISO/IEC 9899:1999 (E)
12  */
13 
14 /* NOTE: This file has been patched from the original DMD distribution to
15  * work with the GDC compiler.
16  */
17 module core.stdc.config;
18 
version(StdDdoc)19 version (StdDdoc)
20 {
21     private
22     {
23         version (Posix)
24             enum isPosix = true;
25         else
26             enum isPosix = false;
27         static if (isPosix && (void*).sizeof > int.sizeof)
28         {
29             alias ddoc_long = long;
30             alias ddoc_ulong = ulong;
31         }
32         else
33         {
34             alias ddoc_long = int;
35             alias ddoc_ulong = uint;
36         }
37     }
38 
39     /***
40      * Used for a signed integer type that corresponds in size to the associated
41      * C compiler's `long` type.
42      */
43     alias c_long = ddoc_long;
44 
45     /***
46      * Used for an unsigned integer type that corresponds in size to the associated
47      * C compiler's `unsigned long` type.
48      */
49     alias c_ulong = ddoc_ulong;
50 
51     /***
52      * Used for a signed integer type that corresponds in size and mangling to the associated
53      * C++ compiler's `long` type.
54      */
55     alias cpp_long = c_long;
56 
57     /***
58      * Used for an unsigned integer type that corresponds in size and mangling to the associated
59      * C++ compiler's `unsigned long` type.
60      */
61     alias cpp_ulong = c_ulong;
62 
63     /***
64      * Used for a signed integer type that corresponds in size and mangling to the associated
65      * C++ compiler's `long long` type.
66      */
67     alias cpp_longlong = long;
68 
69     /***
70      * Used for an unsigned integer type that corresponds in size and mangling to the associated
71      * C++ compiler's `unsigned long long` type.
72      */
73     alias cpp_ulonglong = ulong;
74 
75     /***
76      * Used for a floating point type that corresponds in size and mangling to the associated
77      * C++ compiler's `long double` type.
78      */
79     alias c_long_double = real;
80 
81     /***
82      * Used for an unsigned integer type that corresponds in size and mangling to the associated
83      * C++ compiler's `size_t` type.
84      */
85     alias cpp_size_t = size_t;
86 
87     /***
88      * Used for a signed integer type that corresponds in size and mangling to the associated
89      * C++ compiler's `ptrdiff_t` type.
90      */
91     alias cpp_ptrdiff_t = ptrdiff_t;
92 }
93 else
94 {
95 
96 version (OSX)
97     version = Darwin;
98 else version (iOS)
99     version = Darwin;
100 else version (TVOS)
101     version = Darwin;
102 else version (WatchOS)
103     version = Darwin;
104 
version(GNU)105 version (GNU)
106 {
107     import gcc.builtins;
108 
109     alias __builtin_clong  c_long;
110     alias __builtin_culong c_ulong;
111 
112     enum __c_long  : __builtin_clong;
113     enum __c_ulong : __builtin_culong;
114 
115     alias __c_long  cpp_long;
116     alias __c_ulong cpp_ulong;
117 
118     enum __c_longlong  : __builtin_clonglong;
119     enum __c_ulonglong : __builtin_culonglong;
120 
121     alias __c_longlong  cpp_longlong;
122     alias __c_ulonglong cpp_ulonglong;
123 }
version(Windows)124 else version (Windows)
125 {
126     enum __c_long  : int;
127     enum __c_ulong : uint;
128 
129     alias int   c_long;
130     alias uint  c_ulong;
131 
132     alias __c_long   cpp_long;
133     alias __c_ulong  cpp_ulong;
134 
135     alias long  cpp_longlong;
136     alias ulong cpp_ulonglong;
137 }
version(Posix)138 else version (Posix)
139 {
140   static if ( (void*).sizeof > int.sizeof )
141   {
142     enum __c_longlong  : long;
143     enum __c_ulonglong : ulong;
144 
145     alias long  c_long;
146     alias ulong c_ulong;
147 
148     alias long   cpp_long;
149     alias ulong  cpp_ulong;
150 
151     alias __c_longlong  cpp_longlong;
152     alias __c_ulonglong cpp_ulonglong;
153   }
154   else
155   {
156     enum __c_long  : int;
157     enum __c_ulong : uint;
158 
159     alias int   c_long;
160     alias uint  c_ulong;
161 
162     alias __c_long   cpp_long;
163     alias __c_ulong  cpp_ulong;
164 
165     alias long  cpp_longlong;
166     alias ulong cpp_ulonglong;
167   }
168 }
169 
version(CRuntime_Microsoft)170 version (CRuntime_Microsoft)
171 {
172     /* long double is 64 bits, not 80 bits, but is mangled differently
173      * than double. To distinguish double from long double, create a wrapper to represent
174      * long double, then recognize that wrapper specially in the compiler
175      * to generate the correct name mangling and correct function call/return
176      * ABI conformance.
177      */
178     enum __c_long_double : double;
179 
180     alias __c_long_double c_long_double;
181 }
version(DigitalMars)182 else version (DigitalMars)
183 {
184     version (X86)
185     {
186         alias real c_long_double;
187     }
188     else version (X86_64)
189     {
190         version (linux)
191             alias real c_long_double;
192         else version (FreeBSD)
193             alias real c_long_double;
194         else version (OpenBSD)
195             alias real c_long_double;
196         else version (NetBSD)
197             alias real c_long_double;
198         else version (DragonFlyBSD)
199             alias real c_long_double;
200         else version (Solaris)
201             alias real c_long_double;
202         else version (Darwin)
203             alias real c_long_double;
204     }
205 }
206 else version (GNU)
207     alias real c_long_double;
208 else version (LDC)
209     alias real c_long_double;
version(SDC)210 else version (SDC)
211 {
212     version (X86)
213         alias real c_long_double;
214     else version (X86_64)
215         alias real c_long_double;
216 }
217 
218 static assert(is(c_long_double), "c_long_double needs to be declared for this platform/architecture.");
219 
version(Darwin)220 version (Darwin)
221 {
222     alias cpp_size_t = cpp_ulong;
223     version (D_LP64)
224         alias cpp_ptrdiff_t = cpp_long;
225     else
226         alias cpp_ptrdiff_t = ptrdiff_t;
227 }
228 else
229 {
230     alias cpp_size_t = size_t;
231     alias cpp_ptrdiff_t = ptrdiff_t;
232 }
233 }
234