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:
Nicholas Wilson 2022-01-21 16:09:52 +08:00 committed by GitHub
parent 51cd4c11e2
commit 7d1f4440f8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 61 additions and 59 deletions

View file

@ -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

View file

@ -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
View 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.

View file

@ -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

View file

@ -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)

View file

@ -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())
{

View file

@ -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");
}

View file

@ -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 = &params;
@ -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");

View file

@ -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

View file

@ -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() {}