From 04d872f4b5fc175c87bebfc693805417843e5423 Mon Sep 17 00:00:00 2001 From: Walter Bright Date: Wed, 29 May 2024 21:22:01 -0700 Subject: [PATCH] make X86 a positive affirmation --- compiler/src/dmd/dmdparams.d | 2 ++ compiler/src/dmd/frontend.d | 1 + compiler/src/dmd/frontend.h | 5 ++++- compiler/src/dmd/mars.d | 6 ++++++ compiler/src/dmd/target.d | 15 +++++++++++++-- compiler/src/dmd/target.h | 1 + 6 files changed, 27 insertions(+), 3 deletions(-) diff --git a/compiler/src/dmd/dmdparams.d b/compiler/src/dmd/dmdparams.d index d85954253a87..28fe22ad271a 100644 --- a/compiler/src/dmd/dmdparams.d +++ b/compiler/src/dmd/dmdparams.d @@ -322,12 +322,14 @@ void setTargetBuildDefaults(ref Target target) target.osMajor = defaultTargetOSMajor(); target.cpu = CPU.baseline; target.isX86_64 = (size_t.sizeof == 8); + target.isX86 = !target.isX86_64; } void setTriple(ref Target target, const ref Triple triple) @safe { target.cpu = triple.cpu; target.isX86_64 = triple.isX86_64; + target.isX86 = !target.isX86_64; target.isLP64 = triple.isLP64; target.os = triple.os; target.osMajor = triple.osMajor; diff --git a/compiler/src/dmd/frontend.d b/compiler/src/dmd/frontend.d index 9636cb06dbf2..a181a6628916 100644 --- a/compiler/src/dmd/frontend.d +++ b/compiler/src/dmd/frontend.d @@ -145,6 +145,7 @@ void initDMD( target.os = defaultTargetOS(); target.isX86_64 = (size_t.sizeof == 8); + target.isX86 = !target.isX86_64; target._init(global.params); Type._init(); Id.initialize(); diff --git a/compiler/src/dmd/frontend.h b/compiler/src/dmd/frontend.h index 19b28fa0a114..18c0a3c6a87e 100644 --- a/compiler/src/dmd/frontend.h +++ b/compiler/src/dmd/frontend.h @@ -7542,6 +7542,7 @@ struct Target final _d_dynamicArray< const char > architectureName; CPU cpu; bool isX86_64; + bool isX86; bool isLP64; _d_dynamicArray< const char > obj_ext; _d_dynamicArray< const char > lib_ext; @@ -7613,6 +7614,7 @@ struct Target final objc(), architectureName(), isX86_64(), + isX86(), isLP64(), obj_ext(), lib_ext(), @@ -7625,7 +7627,7 @@ struct Target final params() { } - Target(OS os, uint8_t osMajor = 0u, uint8_t ptrsize = 0u, uint8_t realsize = 0u, uint8_t realpad = 0u, uint8_t realalignsize = 0u, uint8_t classinfosize = 0u, uint64_t maxStaticDataSize = 0LLU, TargetC c = TargetC(), TargetCPP cpp = TargetCPP(), TargetObjC objc = TargetObjC(), _d_dynamicArray< const char > architectureName = {}, CPU cpu = (CPU)0u, bool isX86_64 = false, bool isLP64 = false, _d_dynamicArray< const char > obj_ext = {}, _d_dynamicArray< const char > lib_ext = {}, _d_dynamicArray< const char > dll_ext = {}, bool run_noext = false, FPTypeProperties FloatProperties = FPTypeProperties(), FPTypeProperties DoubleProperties = FPTypeProperties(), FPTypeProperties<_d_real > RealProperties = FPTypeProperties<_d_real >(), Type* tvalist = nullptr, const Param* params = nullptr) : + Target(OS os, uint8_t osMajor = 0u, uint8_t ptrsize = 0u, uint8_t realsize = 0u, uint8_t realpad = 0u, uint8_t realalignsize = 0u, uint8_t classinfosize = 0u, uint64_t maxStaticDataSize = 0LLU, TargetC c = TargetC(), TargetCPP cpp = TargetCPP(), TargetObjC objc = TargetObjC(), _d_dynamicArray< const char > architectureName = {}, CPU cpu = (CPU)0u, bool isX86_64 = false, bool isX86 = false, bool isLP64 = false, _d_dynamicArray< const char > obj_ext = {}, _d_dynamicArray< const char > lib_ext = {}, _d_dynamicArray< const char > dll_ext = {}, bool run_noext = false, FPTypeProperties FloatProperties = FPTypeProperties(), FPTypeProperties DoubleProperties = FPTypeProperties(), FPTypeProperties<_d_real > RealProperties = FPTypeProperties<_d_real >(), Type* tvalist = nullptr, const Param* params = nullptr) : os(os), osMajor(osMajor), ptrsize(ptrsize), @@ -7640,6 +7642,7 @@ struct Target final architectureName(architectureName), cpu(cpu), isX86_64(isX86_64), + isX86(isX86), isLP64(isLP64), obj_ext(obj_ext), lib_ext(lib_ext), diff --git a/compiler/src/dmd/mars.d b/compiler/src/dmd/mars.d index 7fd80c36d114..272230e2f210 100644 --- a/compiler/src/dmd/mars.d +++ b/compiler/src/dmd/mars.d @@ -589,6 +589,9 @@ bool parseCommandLine(const ref Strings arguments, const size_t argc, ref Param files.reserve(arguments.length - 1); + // default + target.isX86 = true; + for (size_t i = 1; i < arguments.length; i++) { const(char)* p = arguments[i]; @@ -883,14 +886,17 @@ bool parseCommandLine(const ref Strings arguments, const size_t argc, ref Param } else if (arg == "-m32") // https://dlang.org/dmd.html#switch-m32 { + target.isX86 = true; target.isX86_64 = false; } else if (arg == "-m64") // https://dlang.org/dmd.html#switch-m64 { + target.isX86 = false; target.isX86_64 = true; } else if (arg == "-m32mscoff") // https://dlang.org/dmd.html#switch-m32mscoff { + target.isX86 = true; target.isX86_64 = false; } else if (startsWith(p + 1, "mscrtlib=")) diff --git a/compiler/src/dmd/target.d b/compiler/src/dmd/target.d index 811341a4c9ae..cfaa4d92b6d0 100644 --- a/compiler/src/dmd/target.d +++ b/compiler/src/dmd/target.d @@ -25,6 +25,8 @@ module dmd.target; +import core.stdc.stdio; + import dmd.astenums : CHECKENABLE; import dmd.globals : Param; @@ -348,6 +350,7 @@ extern (C++) struct Target const(char)[] architectureName; CPU cpu; // CPU instruction set to target bool isX86_64; // generate 64 bit code for x86_64; true by default for 64 bit dmd + bool isX86 = true; // generate 32 bit Intel x86 code bool isLP64; // pointers are 64 bits // Environmental @@ -403,6 +406,8 @@ extern (C++) struct Target extern (C++) void _init(ref const Param params) { // isX86_64 and cpu are initialized in parseCommandLine +printf("X: %d %d\n", isX86, isX86_64); + assert(isX86 != isX86_64); this.params = ¶ms; @@ -1329,7 +1334,13 @@ extern (C++) struct Target */ extern (D) uint stackAlign() @safe { - return isXmmSupported() ? 16 : (isX86_64 ? 8 : 4); + assert(isX86_64 != isX86); + uint sz = isXmmSupported() ? 16 : + isX86_64 ? 8 : + isX86 ? 4 : 0; + assert(sz); + return sz; +// return isXmmSupported() ? 16 : (isX86_64 ? 8 : 4); } } @@ -1482,7 +1493,7 @@ struct TargetCPP else assert(0); // C++ and D ABI incompatible on all (?) x86 32-bit platforms - wrapDtorInExternD = !target.isX86_64; + wrapDtorInExternD = target.isX86; } /** diff --git a/compiler/src/dmd/target.h b/compiler/src/dmd/target.h index 37408e2a8cae..a5caa74c80e8 100644 --- a/compiler/src/dmd/target.h +++ b/compiler/src/dmd/target.h @@ -154,6 +154,7 @@ struct Target DString architectureName; // name of the platform architecture (e.g. X86_64) CPU cpu; // CPU instruction set to target d_bool isX86_64; // generate 64 bit code for x86_64; true by default for 64 bit dmd + d_bool isX86; // generate 32 bit Intel x86 code d_bool isLP64; // pointers are 64 bits // Environmental