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