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)19version (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)105version (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)124else 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)138else 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)170version (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)182else 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)210else 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)220version (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