Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Reduces core.stdc.stdint dependendencies #16649

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
123 changes: 53 additions & 70 deletions druntime/src/core/stdc/config.d
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,35 @@

module core.stdc.config;

/**
* The choices made by each C implementation about the sizes of the
* fundamental types are known as "data model".
*
* See_Also: https://en.cppreference.com/w/c/language/arithmetic_types
*/
enum DataModel
{
ILP32, /// or 4/4/4 (int, long, and pointer are 32-bit)
LP64, /// or 4/8/8 (int is 32-bit, long and pointer are 64-bit)
LLP64, /// or 4/4/8 (int and long are 32-bit, pointer is 64-bit)
}

version (D_LP64)
{
version (Cygwin)
enum dataModel = DataModel.LP64; ///
else version (Windows)
enum dataModel = DataModel.LLP64; ///
else
enum dataModel = DataModel.LP64; ///
}
else // 32-bit pointers
{
enum dataModel = DataModel.ILP32; ///
}

static assert(__traits(compiles, typeof(dataModel)));

version (StdDdoc)
{
private
Expand Down Expand Up @@ -109,91 +138,45 @@ version (StdDdoc)
else
{

version (OSX)
version = Darwin;
else version (iOS)
version = Darwin;
else version (TVOS)
version = Darwin;
else version (WatchOS)
version = Darwin;

version (Windows)
static if (dataModel == DataModel.ILP32 || dataModel == DataModel.LLP64)
{
enum __c_long : int;
enum __c_ulong : uint;

alias int c_long;
alias uint c_ulong;
alias c_long = int;
alias c_ulong = uint;

alias __c_long cpp_long;
alias __c_ulong cpp_ulong;
alias cpp_long = __c_long;
alias cpp_ulong = __c_ulong;

alias long cpp_longlong;
alias ulong cpp_ulonglong;
alias cpp_longlong = long;
alias cpp_ulonglong = ulong;
}
else version (Posix)
else static if (dataModel == DataModel.LP64)
{
static if ( (void*).sizeof > int.sizeof )
{
enum __c_longlong : long;
enum __c_ulonglong : ulong;

alias long c_long;
alias ulong c_ulong;
alias c_long = long;
alias c_ulong = ulong;

alias long cpp_long;
alias ulong cpp_ulong;
alias cpp_long = long;
alias cpp_ulong = 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;
}
alias cpp_longlong = __c_longlong;
alias cpp_ulonglong = __c_ulonglong;
}
else version (WASI)
{
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;
else
static assert(false, "Unsupported C data model");

alias long cpp_longlong;
alias ulong cpp_ulonglong;
}
}
version (OSX)
version = Darwin;
else version (iOS)
version = Darwin;
else version (TVOS)
version = Darwin;
else version (WatchOS)
version = Darwin;

version (GNU)
alias c_long_double = real;
Expand Down
8 changes: 5 additions & 3 deletions druntime/src/core/stdc/stdint.d
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,7 @@
module core.stdc.stdint;

import core.stdc.config;
import core.stdc.stddef; // for wchar_t
import core.stdc.signal; // for sig_atomic_t
import core.stdc.wchar_; // for wint_t

version (OSX)
version = Darwin;
Expand Down Expand Up @@ -406,10 +404,14 @@ else version (WASI)
}
else
{
static assert(false, "Unsupported architecture.");
version = UnsupportedByStdint;
}

version (UnsupportedByStdint) {}
else:

import core.stdc.stddef : wchar_t;
import core.stdc.wchar_ : wint_t;

///
enum int8_t INT8_MIN = int8_t.min;
Expand Down
Loading