blob: 44bb7077b59540e047dcd8673e6a36b13692abf9 [file] [log] [blame]
/***
* D compatible types that correspond to various basic types in associated
* C and C++ compilers.
*
* Copyright: Copyright Sean Kelly 2005 - 2009.
* License: Distributed under the
* $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0).
* (See accompanying file LICENSE)
* Authors: Sean Kelly
* Source: $(DRUNTIMESRC core/stdc/_config.d)
* Standards: ISO/IEC 9899:1999 (E)
*/
/* NOTE: This file has been patched from the original DMD distribution to
* work with the GDC compiler.
*/
module core.stdc.config;
version (StdDdoc)
{
private
{
version (Posix)
enum isPosix = true;
else
enum isPosix = false;
static if (isPosix && (void*).sizeof > int.sizeof)
{
alias ddoc_long = long;
alias ddoc_ulong = ulong;
}
else
{
alias ddoc_long = int;
alias ddoc_ulong = uint;
}
struct ddoc_complex(T) { T re; T im; };
}
/***
* Used for a signed integer type that corresponds in size to the associated
* C compiler's `long` type.
*/
alias c_long = ddoc_long;
/***
* Used for an unsigned integer type that corresponds in size to the associated
* C compiler's `unsigned long` type.
*/
alias c_ulong = ddoc_ulong;
/***
* Used for a signed integer type that corresponds in size and mangling to the associated
* C++ compiler's `long` type.
*/
alias cpp_long = c_long;
/***
* Used for an unsigned integer type that corresponds in size and mangling to the associated
* C++ compiler's `unsigned long` type.
*/
alias cpp_ulong = c_ulong;
/***
* Used for a signed integer type that corresponds in size and mangling to the associated
* C++ compiler's `long long` type.
*/
alias cpp_longlong = long;
/***
* Used for an unsigned integer type that corresponds in size and mangling to the associated
* C++ compiler's `unsigned long long` type.
*/
alias cpp_ulonglong = ulong;
/***
* Used for a floating point type that corresponds in size and mangling to the associated
* C++ compiler's `long double` type.
*/
alias c_long_double = real;
/***
* Used for an unsigned integer type that corresponds in size and mangling to the associated
* C++ compiler's `size_t` type.
*/
alias cpp_size_t = size_t;
/***
* Used for a signed integer type that corresponds in size and mangling to the associated
* C++ compiler's `ptrdiff_t` type.
*/
alias cpp_ptrdiff_t = ptrdiff_t;
/***
* Used for a complex floating point type that corresponds in size and ABI to the associated
* C compiler's `_Complex float` type.
*/
alias c_complex_float = ddoc_complex!float;
/***
* Used for a complex floating point type that corresponds in size and ABI to the associated
* C compiler's `_Complex double` type.
*/
alias c_complex_double = ddoc_complex!double;
/***
* Used for a complex floating point type that corresponds in size and ABI to the associated
* C compiler's `_Complex long double` type.
*/
alias c_complex_real = ddoc_complex!real;
}
else
{
version (OSX)
version = Darwin;
else version (iOS)
version = Darwin;
else version (TVOS)
version = Darwin;
else version (WatchOS)
version = Darwin;
version (GNU)
{
import gcc.builtins;
alias __builtin_clong c_long;
alias __builtin_culong c_ulong;
enum __c_long : __builtin_clong;
enum __c_ulong : __builtin_culong;
alias __c_long cpp_long;
alias __c_ulong cpp_ulong;
enum __c_longlong : __builtin_clonglong;
enum __c_ulonglong : __builtin_culonglong;
alias __c_longlong cpp_longlong;
alias __c_ulonglong cpp_ulonglong;
}
else version (Windows)
{
enum __c_long : int;
enum __c_ulong : uint;
alias int c_long;
alias uint c_ulong;
alias __c_long cpp_long;
alias __c_ulong cpp_ulong;
alias long cpp_longlong;
alias ulong cpp_ulonglong;
}
else version (Posix)
{
static if ( (void*).sizeof > int.sizeof )
{
enum __c_longlong : long;
enum __c_ulonglong : ulong;
alias long c_long;
alias ulong c_ulong;
alias long cpp_long;
alias ulong cpp_ulong;
alias __c_longlong cpp_longlong;
alias __c_ulonglong cpp_ulonglong;
}
else
{
enum __c_long : int;
enum __c_ulong : uint;
alias int c_long;
alias uint c_ulong;
alias __c_long cpp_long;
alias __c_ulong cpp_ulong;
alias long cpp_longlong;
alias ulong cpp_ulonglong;
}
}
version (GNU)
alias c_long_double = real;
else version (LDC)
alias c_long_double = real; // 64-bit real for MSVC targets
else version (SDC)
{
version (X86)
alias c_long_double = real;
else version (X86_64)
alias c_long_double = real;
}
else version (CRuntime_Microsoft)
{
/* long double is 64 bits, not 80 bits, but is mangled differently
* than double. To distinguish double from long double, create a wrapper to represent
* long double, then recognize that wrapper specially in the compiler
* to generate the correct name mangling and correct function call/return
* ABI conformance.
*/
enum __c_long_double : double;
alias __c_long_double c_long_double;
}
else version (DigitalMars)
{
version (X86)
{
alias real c_long_double;
}
else version (X86_64)
{
version (linux)
alias real c_long_double;
else version (FreeBSD)
alias real c_long_double;
else version (OpenBSD)
alias real c_long_double;
else version (NetBSD)
alias real c_long_double;
else version (DragonFlyBSD)
alias real c_long_double;
else version (Solaris)
alias real c_long_double;
else version (Darwin)
alias real c_long_double;
}
}
static assert(is(c_long_double), "c_long_double needs to be declared for this platform/architecture.");
version (Darwin)
{
alias cpp_size_t = cpp_ulong;
version (D_LP64)
alias cpp_ptrdiff_t = cpp_long;
else
alias cpp_ptrdiff_t = ptrdiff_t;
}
else
{
alias cpp_size_t = size_t;
alias cpp_ptrdiff_t = ptrdiff_t;
}
// ABI layout of native complex types.
private struct _Complex(T)
{
T re;
T im;
}
enum __c_complex_float : _Complex!float;
enum __c_complex_double : _Complex!double;
enum __c_complex_real : _Complex!c_long_double;
alias c_complex_float = __c_complex_float;
alias c_complex_double = __c_complex_double;
alias c_complex_real = __c_complex_real;
}