diff --git a/druntime/src/core/stdc/config.d b/druntime/src/core/stdc/config.d index 3ab41f834da8..b7396fa13e93 100644 --- a/druntime/src/core/stdc/config.d +++ b/druntime/src/core/stdc/config.d @@ -118,82 +118,25 @@ else version (TVOS) else version (WatchOS) version = Darwin; -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; +import core.stdc.datamodel; - alias long cpp_longlong; - alias ulong cpp_ulonglong; -} -else version (Posix) +static if (dataModel == "ILP32" || dataModel == "LLP64") { - 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; - } + alias c_long = int; + alias c_ulong = uint; } -else version (WASI) +else static if (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 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; - } + alias c_long = long; + alias c_ulong = ulong; } +else + static assert(false, "Unsupported C data model: "~dataModel); + +alias cpp_long = c_long; +alias cpp_ulong = c_long; +alias cpp_longlong = long; +alias cpp_ulonglong = ulong; version (GNU) alias c_long_double = real; diff --git a/druntime/src/core/stdc/datamodel.d b/druntime/src/core/stdc/datamodel.d new file mode 100644 index 000000000000..3399eafa3f7d --- /dev/null +++ b/druntime/src/core/stdc/datamodel.d @@ -0,0 +1,29 @@ +/** + * Defines C data model + * + * Copyright: Copyright Denis Feklushkin 2024. + * License: Distributed under the + * $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0). + * (See accompanying file LICENSE) + * Authors: Denis Feklushkin + * Source: $(DRUNTIMESRC core/stdc/datamodel.d) + * Standards: ISO/IEC 9899:1999 (E) + */ + +module core.stdc.datamodel; + +version (D_LP64) +{ + version (Cygwin) + enum dataModel = "LP64"; + else version (Windows) + enum dataModel = "LLP64"; + else + enum dataModel = "LP64"; +} +else // 32-bit pointers +{ + enum dataModel = "ILP32"; +} + +static assert(__traits(compiles, dataModel !is null));