mirror of
https://github.com/dlang/dmd.git
synced 2025-04-26 05:00:16 +03:00
Produce MS Coff by default when targetting windows (#13110)
* Produce MS Coff by default when targetting windows This rebases #12825 but doesn't attempt to rename phobos libraries and doesn't change the build infra where possible(and doesn't have a large diff in `link.d`). See if this fixes the CI issues. * remove OMF piplines * Update glue.d * Update target.d * Update target.d * Update frontend.h
This commit is contained in:
parent
51cd4c11e2
commit
7d1f4440f8
10 changed files with 61 additions and 59 deletions
|
@ -73,8 +73,11 @@ fi
|
|||
################################################################################
|
||||
# Build DMD (incl. building and running the unittests)
|
||||
################################################################################
|
||||
|
||||
DMD_BIN_PATH="$DMD_DIR/generated/windows/release/$MODEL/dmd"
|
||||
if [ "$MODEL" == "32omf" ] ; then
|
||||
DMD_BIN_PATH="$DMD_DIR/generated/windows/release/32/dmd"
|
||||
else
|
||||
DMD_BIN_PATH="$DMD_DIR/generated/windows/release/$MODEL/dmd"
|
||||
fi
|
||||
|
||||
cd "$DMD_DIR/src"
|
||||
"$DM_MAKE" -f "$MAKE_FILE" MAKE="$DM_MAKE" BUILD=debug unittest
|
||||
|
|
|
@ -16,10 +16,6 @@ jobs:
|
|||
OS: Win_64
|
||||
MODEL: 64
|
||||
ARCH: x64
|
||||
x86-OMF:
|
||||
OS: Win_32
|
||||
MODEL: 32
|
||||
ARCH: x86
|
||||
steps:
|
||||
- template: .azure-pipelines/windows.yml
|
||||
|
||||
|
@ -36,10 +32,6 @@ jobs:
|
|||
OS: Win_64
|
||||
MODEL: 64
|
||||
ARCH: x64
|
||||
x86-OMF:
|
||||
OS: Win_32
|
||||
MODEL: 32
|
||||
ARCH: x86
|
||||
steps:
|
||||
- template: .azure-pipelines/windows.yml
|
||||
- template: .azure-pipelines/windows-artifact.yml
|
||||
|
@ -63,7 +55,7 @@ jobs:
|
|||
# x64 only because 32bit causes weird linker errors for several tests???
|
||||
# x86-OMF:
|
||||
# OS: Win_32
|
||||
# MODEL: 32
|
||||
# MODEL: 32omf
|
||||
# ARCH: x86
|
||||
steps:
|
||||
- template: .azure-pipelines/windows.yml
|
||||
|
|
5
changelog/fix18964.dd
Normal file
5
changelog/fix18964.dd
Normal file
|
@ -0,0 +1,5 @@
|
|||
`-m32` now produces MS Coff objects when targeting windows
|
||||
|
||||
The `-m32mscoff` switch is deprecated and `-m32` should be used in its place.
|
||||
A new switch `-m32omf` has been added to produce code for OMF. Use of this switch
|
||||
is discouraged because OMF will soon be unsupported.
|
|
@ -488,14 +488,17 @@ dmd -cov -unittest myprog.d
|
|||
),
|
||||
Option("m32",
|
||||
"generate 32 bit code",
|
||||
`$(UNIX Compile a 32 bit executable. This is the default for the 32 bit dmd.)
|
||||
$(WINDOWS Compile a 32 bit executable. This is the default.
|
||||
The generated object code is in OMF and is meant to be used with the
|
||||
$(LINK2 https://www.digitalmars.com/download/freecompiler.html, Digital Mars C/C++ compiler)).`,
|
||||
`$(UNIX Compile a 32 bit executable. This is the default for the 32 bit dmd.)`,
|
||||
cast(TargetOS) (TargetOS.all & ~cast(uint)TargetOS.DragonFlyBSD) // available on all OS'es except DragonFly, which does not support 32-bit binaries
|
||||
),
|
||||
Option("m32mscoff",
|
||||
"generate 32 bit code and write MS-COFF object files",
|
||||
"generate 32 bit code and write MS-COFF object files (deprecated use -m32)",
|
||||
TargetOS.Windows
|
||||
),
|
||||
Option("m32omf",
|
||||
"(deprecated) generate 32 bit code and write OMF object files",
|
||||
`$(WINDOWS Compile a 32 bit executable. The generated object code is in OMF and is meant to be used with the
|
||||
$(LINK2 http://www.digitalmars.com/download/freecompiler.html, Digital Mars C/C++ compiler)).`,
|
||||
TargetOS.Windows
|
||||
),
|
||||
Option("m64",
|
||||
|
@ -569,7 +572,7 @@ dmd -cov -unittest myprog.d
|
|||
),
|
||||
Option("mscrtlib=<libname>",
|
||||
"MS C runtime library to reference from main/WinMain/DllMain",
|
||||
"If building MS-COFF object files with -m64 or -m32mscoff, embed a reference to
|
||||
"If building MS-COFF object files when targeting Windows, embed a reference to
|
||||
the given C runtime library $(I libname) into the object file containing `main`,
|
||||
`DllMain` or `WinMain` for automatic linking. The default is $(TT libcmt)
|
||||
(release version with static linkage), the other usual alternatives are
|
||||
|
|
|
@ -7729,7 +7729,7 @@ struct Target final
|
|||
_d_dynamicArray< const char > lib_ext;
|
||||
_d_dynamicArray< const char > dll_ext;
|
||||
bool run_noext;
|
||||
bool mscoff;
|
||||
bool omfobj;
|
||||
template <typename T>
|
||||
struct FPTypeProperties final
|
||||
{
|
||||
|
@ -7815,13 +7815,13 @@ public:
|
|||
lib_ext(),
|
||||
dll_ext(),
|
||||
run_noext(),
|
||||
mscoff(false),
|
||||
omfobj(false),
|
||||
FloatProperties(),
|
||||
DoubleProperties(),
|
||||
RealProperties()
|
||||
{
|
||||
}
|
||||
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(true, 0u, 0u, 0u, (TargetC::Runtime)0u, (TargetC::BitFieldStyle)0u), TargetCPP cpp = TargetCPP(false, false, false, false, false, (TargetCPP::Runtime)0u), TargetObjC objc = TargetObjC(false), _d_dynamicArray< const char > architectureName = {}, CPU cpu = (CPU)11u, bool is64bit = true, 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, bool mscoff = false, FPTypeProperties<float > FloatProperties = FPTypeProperties<float >(NAN, NAN, NAN, NAN, NAN, 0LL, 0LL, 0LL, 0LL, 0LL, 0LL), FPTypeProperties<double > DoubleProperties = FPTypeProperties<double >(NAN, NAN, NAN, NAN, NAN, 0LL, 0LL, 0LL, 0LL, 0LL, 0LL), FPTypeProperties<_d_real > RealProperties = FPTypeProperties<_d_real >(NAN, NAN, NAN, NAN, NAN, 0LL, 0LL, 0LL, 0LL, 0LL, 0LL)) :
|
||||
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(true, 0u, 0u, 0u, (TargetC::Runtime)0u, (TargetC::BitFieldStyle)0u), TargetCPP cpp = TargetCPP(false, false, false, false, false, (TargetCPP::Runtime)0u), TargetObjC objc = TargetObjC(false), _d_dynamicArray< const char > architectureName = {}, CPU cpu = (CPU)11u, bool is64bit = true, 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, bool omfobj = false, FPTypeProperties<float > FloatProperties = FPTypeProperties<float >(NAN, NAN, NAN, NAN, NAN, 0LL, 0LL, 0LL, 0LL, 0LL, 0LL), FPTypeProperties<double > DoubleProperties = FPTypeProperties<double >(NAN, NAN, NAN, NAN, NAN, 0LL, 0LL, 0LL, 0LL, 0LL, 0LL), FPTypeProperties<_d_real > RealProperties = FPTypeProperties<_d_real >(NAN, NAN, NAN, NAN, NAN, 0LL, 0LL, 0LL, 0LL, 0LL, 0LL)) :
|
||||
os(os),
|
||||
osMajor(osMajor),
|
||||
ptrsize(ptrsize),
|
||||
|
@ -7841,7 +7841,7 @@ public:
|
|||
lib_ext(lib_ext),
|
||||
dll_ext(dll_ext),
|
||||
run_noext(run_noext),
|
||||
mscoff(mscoff),
|
||||
omfobj(omfobj),
|
||||
FloatProperties(FloatProperties),
|
||||
DoubleProperties(DoubleProperties),
|
||||
RealProperties(RealProperties)
|
||||
|
|
|
@ -340,7 +340,7 @@ private void obj_start(ref OutBuffer objbuf, const(char)* srcfile)
|
|||
|
||||
version (Windows)
|
||||
{
|
||||
// Produce Ms COFF files for 64 bit code, OMF for 32 bit code
|
||||
// Produce Ms COFF files by default, OMF for -m32omf
|
||||
assert(objbuf.length() == 0);
|
||||
switch (target.objectFormat())
|
||||
{
|
||||
|
|
|
@ -710,7 +710,7 @@ bool parseCommandlineAndConfig(size_t argc, const(char)** argv, ref Param params
|
|||
bool is64bit = arch[0] == '6';
|
||||
|
||||
version(Windows) // delete LIB entry in [Environment] (necessary for optlink) to allow inheriting environment for MS-COFF
|
||||
if (is64bit || arch == "32mscoff")
|
||||
if (arch != "32omf")
|
||||
environment.update("LIB", 3).value = null;
|
||||
|
||||
// read from DFLAGS in [Environment{arch}] section
|
||||
|
@ -1089,7 +1089,7 @@ void getenv_setargv(const(char)* envvalue, Strings* args)
|
|||
}
|
||||
|
||||
/**
|
||||
* Parse command line arguments for the last instance of -m32, -m64 or -m32mscoff
|
||||
* Parse command line arguments for the last instance of -m32, -m64, -m32mscoff or -m32omfobj
|
||||
* to detect the desired architecture.
|
||||
*
|
||||
* Params:
|
||||
|
@ -1098,7 +1098,7 @@ void getenv_setargv(const(char)* envvalue, Strings* args)
|
|||
* Should be "32" or "64"
|
||||
*
|
||||
* Returns:
|
||||
* "32", "64" or "32mscoff" if the "-m32", "-m64", "-m32mscoff" flags were passed,
|
||||
* "32", "64" or "32omf" if the "-m32", "-m64", "-m32omf" flags were passed,
|
||||
* respectively. If they weren't, return `arch`.
|
||||
*/
|
||||
const(char)[] parse_arch_arg(Strings* args, const(char)[] arch)
|
||||
|
@ -1109,8 +1109,10 @@ const(char)[] parse_arch_arg(Strings* args, const(char)[] arch)
|
|||
|
||||
if (arg.length && arg[0] == '-')
|
||||
{
|
||||
if (arg[1 .. $] == "m32" || arg[1 .. $] == "m32mscoff" || arg[1 .. $] == "m64")
|
||||
if (arg[1 .. $] == "m32" || arg[1 .. $] == "m32omf" || arg[1 .. $] == "m64")
|
||||
arch = arg[2 .. $];
|
||||
else if (arg[1 .. $] == "m32mscoff")
|
||||
arch = "32";
|
||||
else if (arg[1 .. $] == "run")
|
||||
break;
|
||||
}
|
||||
|
@ -1163,7 +1165,7 @@ private void setDefaultLibrary(ref Param params, const ref Target target)
|
|||
{
|
||||
if (target.is64bit)
|
||||
params.defaultlibname = "phobos64";
|
||||
else if (target.mscoff)
|
||||
else if (!target.omfobj)
|
||||
params.defaultlibname = "phobos32mscoff";
|
||||
else
|
||||
params.defaultlibname = "phobos";
|
||||
|
@ -1818,7 +1820,6 @@ bool parseCommandLine(const ref Strings arguments, const size_t argc, ref Param
|
|||
else if (arg == "-m32") // https://dlang.org/dmd.html#switch-m32
|
||||
{
|
||||
target.is64bit = false;
|
||||
target.mscoff = false;
|
||||
}
|
||||
else if (arg == "-m64") // https://dlang.org/dmd.html#switch-m64
|
||||
{
|
||||
|
@ -1827,7 +1828,11 @@ bool parseCommandLine(const ref Strings arguments, const size_t argc, ref Param
|
|||
else if (arg == "-m32mscoff") // https://dlang.org/dmd.html#switch-m32mscoff
|
||||
{
|
||||
target.is64bit = false;
|
||||
target.mscoff = true;
|
||||
}
|
||||
else if (arg == "-m32omf") // https://dlang.org/dmd.html#switch-m32omfobj
|
||||
{
|
||||
target.is64bit = false;
|
||||
target.omfobj = true;
|
||||
}
|
||||
else if (startsWith(p + 1, "mscrtlib="))
|
||||
{
|
||||
|
@ -2600,8 +2605,6 @@ private void reconcileCommands(ref Param params, ref Target target)
|
|||
error(Loc.initial, "`-fPIC` and `-fPIE` cannot be used when targetting windows");
|
||||
if (dmdParams.dwarf)
|
||||
error(Loc.initial, "`-gdwarf` cannot be used when targetting windows");
|
||||
if (target.is64bit)
|
||||
target.mscoff = true;
|
||||
}
|
||||
else if (target.os == Target.OS.DragonFlyBSD)
|
||||
{
|
||||
|
@ -2626,7 +2629,7 @@ private void reconcileCommands(ref Param params, ref Target target)
|
|||
}
|
||||
}
|
||||
|
||||
if (target.mscoff && !params.mscrtlib)
|
||||
if (!params.mscrtlib)
|
||||
{
|
||||
version (Windows)
|
||||
{
|
||||
|
@ -2640,8 +2643,8 @@ private void reconcileCommands(ref Param params, ref Target target)
|
|||
}
|
||||
else
|
||||
{
|
||||
if (!target.is64bit && target.mscoff)
|
||||
error(Loc.initial, "`-m32mscoff` can only be used when targetting windows");
|
||||
if (target.omfobj)
|
||||
error(Loc.initial, "`-m32omf` can only be used when targetting windows");
|
||||
if (params.mscrtlib)
|
||||
error(Loc.initial, "`-mscrtlib` can only be used when targetting windows");
|
||||
}
|
||||
|
|
|
@ -146,7 +146,7 @@ extern (C++) struct Target
|
|||
const(char)[] lib_ext; /// extension for static library files
|
||||
const(char)[] dll_ext; /// extension for dynamic library files
|
||||
bool run_noext; /// allow -run sources without extensions
|
||||
bool mscoff = false; // for Win32: write MsCoff object files instead of OMF
|
||||
bool omfobj = false; // for Win32: write OMF object files instead of MsCoff
|
||||
/**
|
||||
* Values representing all properties for floating point types
|
||||
*/
|
||||
|
@ -194,7 +194,7 @@ extern (C++) struct Target
|
|||
*/
|
||||
extern (C++) void _init(ref const Param params)
|
||||
{
|
||||
// is64bit, mscoff and cpu are initialized in parseCommandLine
|
||||
// is64bit, omfobj and cpu are initialized in parseCommandLine
|
||||
|
||||
this.params = ¶ms;
|
||||
|
||||
|
@ -257,10 +257,6 @@ extern (C++) struct Target
|
|||
realpad = 6;
|
||||
realalignsize = 16;
|
||||
}
|
||||
else if (os == OS.Windows)
|
||||
{
|
||||
mscoff = true;
|
||||
}
|
||||
}
|
||||
|
||||
c.initialize(params, this);
|
||||
|
@ -303,7 +299,7 @@ extern (C++) struct Target
|
|||
else if (os & Target.OS.Posix)
|
||||
return Target.ObjectFormat.elf;
|
||||
else if (os == Target.OS.Windows)
|
||||
return mscoff ? Target.ObjectFormat.coff : Target.ObjectFormat.omf;
|
||||
return omfobj ? Target.ObjectFormat.omf : Target.ObjectFormat.coff;
|
||||
else
|
||||
assert(0, "unkown object format");
|
||||
}
|
||||
|
@ -789,7 +785,7 @@ extern (C++) struct Target
|
|||
return false;
|
||||
return true;
|
||||
}
|
||||
else if (os == Target.OS.Windows && mscoff)
|
||||
else if (os == Target.OS.Windows)
|
||||
{
|
||||
Type tb = tns.baseElemOf();
|
||||
if (tb.ty == TY.Tstruct)
|
||||
|
@ -1029,7 +1025,7 @@ extern (C++) struct Target
|
|||
{
|
||||
case objectFormat.stringof:
|
||||
if (os == Target.OS.Windows)
|
||||
return stringExp(mscoff ? "coff" : "omf");
|
||||
return stringExp(omfobj ? "omf" : "coff" );
|
||||
else if (os == Target.OS.OSX)
|
||||
return stringExp("macho");
|
||||
else
|
||||
|
@ -1039,9 +1035,9 @@ extern (C++) struct Target
|
|||
case cppRuntimeLibrary.stringof:
|
||||
if (os == Target.OS.Windows)
|
||||
{
|
||||
if (mscoff)
|
||||
return stringExp(params.mscrtlib);
|
||||
return stringExp("snn");
|
||||
if (omfobj)
|
||||
return stringExp("snn");
|
||||
return stringExp(params.mscrtlib);
|
||||
}
|
||||
return stringExp("");
|
||||
case cppStd.stringof:
|
||||
|
@ -1094,7 +1090,7 @@ extern (C++) struct Target
|
|||
*/
|
||||
extern (C++) bool supportsLinkerDirective() const
|
||||
{
|
||||
return mscoff;
|
||||
return os == Target.OS.Windows && !omfobj;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -1186,7 +1182,7 @@ struct TargetC
|
|||
wchar_tsize = 4;
|
||||
|
||||
if (os == Target.OS.Windows)
|
||||
runtime = target.mscoff ? Runtime.Microsoft : Runtime.DigitalMars;
|
||||
runtime = target.omfobj ? Runtime.DigitalMars : Runtime.Microsoft;
|
||||
else if (os == Target.OS.linux)
|
||||
{
|
||||
// Note: This is overridden later by `-target=<triple>` if supplied.
|
||||
|
@ -1198,7 +1194,7 @@ struct TargetC
|
|||
}
|
||||
|
||||
if (os == Target.OS.Windows)
|
||||
bitFieldStyle = target.mscoff ? BitFieldStyle.MS : BitFieldStyle.DM;
|
||||
bitFieldStyle = target.omfobj ? BitFieldStyle.DM : BitFieldStyle.MS;
|
||||
else if (os & (Target.OS.linux | Target.OS.FreeBSD | Target.OS.OSX |
|
||||
Target.OS.OpenBSD | Target.OS.DragonFlyBSD | Target.OS.Solaris))
|
||||
bitFieldStyle = BitFieldStyle.Gcc_Clang;
|
||||
|
@ -1251,13 +1247,13 @@ struct TargetCPP
|
|||
else if (os == Target.OS.Windows)
|
||||
{
|
||||
reverseOverloads = true;
|
||||
splitVBasetable = target.mscoff;
|
||||
splitVBasetable = !target.omfobj;
|
||||
}
|
||||
else
|
||||
assert(0);
|
||||
exceptions = (os & Target.OS.Posix) != 0;
|
||||
if (os == Target.OS.Windows)
|
||||
runtime = target.mscoff ? Runtime.Microsoft : Runtime.DigitalMars;
|
||||
runtime = target.omfobj ? Runtime.DigitalMars : Runtime.Microsoft;
|
||||
else if (os & (Target.OS.linux | Target.OS.DragonFlyBSD))
|
||||
runtime = Runtime.Gcc;
|
||||
else if (os & (Target.OS.OSX | Target.OS.FreeBSD | Target.OS.OpenBSD))
|
||||
|
@ -1286,10 +1282,10 @@ struct TargetCPP
|
|||
return toCppMangleItanium(s);
|
||||
if (target.os == Target.OS.Windows)
|
||||
{
|
||||
if (target.mscoff)
|
||||
return toCppMangleMSVC(s);
|
||||
else
|
||||
if (target.omfobj)
|
||||
return toCppMangleDMC(s);
|
||||
else
|
||||
return toCppMangleMSVC(s);
|
||||
}
|
||||
else
|
||||
assert(0, "fix this");
|
||||
|
@ -1311,10 +1307,10 @@ struct TargetCPP
|
|||
return cppTypeInfoMangleItanium(cd);
|
||||
if (target.os == Target.OS.Windows)
|
||||
{
|
||||
if (target.mscoff)
|
||||
return cppTypeInfoMangleMSVC(cd);
|
||||
else
|
||||
if (target.omfobj)
|
||||
return cppTypeInfoMangleDMC(cd);
|
||||
else
|
||||
return cppTypeInfoMangleMSVC(cd);
|
||||
}
|
||||
else
|
||||
assert(0, "fix this");
|
||||
|
|
|
@ -160,7 +160,7 @@ struct Target
|
|||
DString lib_ext; /// extension for static library files
|
||||
DString dll_ext; /// extension for dynamic library files
|
||||
bool run_noext; /// allow -run sources without extensions
|
||||
bool mscoff; /// for Win32: write COFF object files instead of OMF
|
||||
bool omfobj; /// for Win32: write OMF object files instead of COFF
|
||||
|
||||
template <typename T>
|
||||
struct FPTypeProperties
|
||||
|
|
|
@ -9,7 +9,7 @@ Use a regex because the path is really strange on Azure (OMF_32, 64):
|
|||
|
||||
TEST_OUTPUT:
|
||||
----
|
||||
$r:.*$: Error: corrupt $?:windows=OMF|osx=Mach|ELF$ object module $?:windows=fail_compilation\extra-files\fake.lib|fail_compilation/extra-files/fake.a$ $n$
|
||||
$r:.*$: Error: corrupt $?:windows=MS Coff|osx=Mach|ELF$ object module $?:windows=fail_compilation\extra-files\fake.lib|fail_compilation/extra-files/fake.a$ $n$
|
||||
----
|
||||
*/
|
||||
void main() {}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue