mirror of
https://github.com/dlang/dmd.git
synced 2025-04-26 13:10:12 +03:00
Revise remaining 32{omf,mscoff} usages
This commit is contained in:
parent
d715bdc972
commit
920678a820
24 changed files with 33 additions and 682 deletions
|
@ -6,20 +6,8 @@ version=7.51 Build 020
|
|||
[Environment]
|
||||
DFLAGS="-I%@P%\..\..\src\phobos" "-I%@P%\..\..\src\druntime\import"
|
||||
|
||||
; optlink only reads from the Environment section so we need this redundancy
|
||||
; from the Environment32omf section (bugzilla 11302)
|
||||
LIB="%@P%\..\lib"
|
||||
|
||||
[Environment32]
|
||||
LIB=%@P%\..\lib32mscoff
|
||||
|
||||
[Environment32omf]
|
||||
LIB="%@P%\..\lib"
|
||||
LINKCMD=%@P%\optlink.exe
|
||||
|
||||
[Environment64]
|
||||
LIB=%@P%\..\lib64
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
[Environment32mscoff]
|
||||
LIB=%@P%\..\lib32mscoff
|
||||
|
|
|
@ -1,8 +0,0 @@
|
|||
LIBRARY dserver
|
||||
EXETYPE NT
|
||||
SUBSYSTEM WINDOWS
|
||||
EXPORTS
|
||||
DllGetClassObject = _DllGetClassObject@12
|
||||
DllCanUnloadNow = _DllCanUnloadNow@0
|
||||
DllRegisterServer = _DllRegisterServer@0
|
||||
DllUnregisterServer = _DllUnregisterServer@0
|
|
@ -3,7 +3,7 @@ DMD=..\..\windows\bin\dmd
|
|||
DFLAGS=-m$(MODEL)
|
||||
|
||||
EXAMPLES = hello d2html dhry pi sieve wc wc2 \
|
||||
winsamp dserver$(MODEL) mydll$(MODEL) htmlget listener
|
||||
winsamp dserver mydll htmlget listener
|
||||
|
||||
all: $(EXAMPLES)
|
||||
echo done
|
||||
|
@ -50,22 +50,12 @@ winsamp:
|
|||
|
||||
# COM client/server example
|
||||
# dclient will fail unless run with administrator rights
|
||||
dserver32:
|
||||
$(DMD) dserver.d chello.d $(DFLAGS) dserver.def advapi32.lib ole32.lib user32.lib
|
||||
$(DMD) dclient $(DFLAGS) ole32.lib uuid.lib
|
||||
.\dclient.exe
|
||||
|
||||
dserver64 dserver32mscoff:
|
||||
dserver:
|
||||
$(DMD) dserver.d chello.d $(DFLAGS) -L/DLL dserver64.def advapi32.lib ole32.lib user32.lib
|
||||
$(DMD) dclient $(DFLAGS) ole32.lib uuid.lib
|
||||
.\dclient.exe
|
||||
|
||||
mydll32:
|
||||
$(DMD) $(DFLAGS) -ofmydll.dll -L/IMPLIB mydll\mydll.d mydll\dll.d mydll\mydll.def
|
||||
$(DMD) $(DFLAGS) -ofdlltest.exe mydll\test.d mydll\mydll.di mydll.lib
|
||||
.\dlltest.exe
|
||||
|
||||
mydll64 mydll32mscoff:
|
||||
mydll:
|
||||
$(DMD) $(DFLAGS) -ofmydll.dll mydll\mydll.d mydll\dll.d -L/DLL
|
||||
$(DMD) $(DFLAGS) -ofdlltest.exe mydll\test.d mydll\mydll.di mydll.lib
|
||||
.\dlltest.exe
|
||||
|
|
|
@ -299,9 +299,6 @@ DFLAGS=%DFLAGS% -L/OPT:NOICF
|
|||
|
||||
[Environment64]
|
||||
DFLAGS=%DFLAGS% -L/OPT:NOICF
|
||||
|
||||
[Environment32mscoff]
|
||||
DFLAGS=%DFLAGS% -L/OPT:NOICF
|
||||
`;
|
||||
}
|
||||
else
|
||||
|
|
|
@ -389,15 +389,7 @@ private void obj_start(ref OutBuffer objbuf, const(char)* srcfile)
|
|||
version (Windows)
|
||||
{
|
||||
import dmd.backend.mscoffobj;
|
||||
import dmd.backend.cgobj;
|
||||
|
||||
// Produce Ms COFF files by default, OMF for -m32omf
|
||||
assert(objbuf.length() == 0);
|
||||
switch (target.objectFormat())
|
||||
{
|
||||
case Target.ObjectFormat.coff: objmod = MsCoffObj_init(&objbuf, srcfile, null); break;
|
||||
default: assert(0);
|
||||
}
|
||||
objmod = MsCoffObj_init(&objbuf, srcfile, null);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -812,7 +812,6 @@ bool parseCommandlineAndConfig(size_t argc, const(char)** argv, ref Param params
|
|||
bool isX86_64 = arch[0] == '6';
|
||||
|
||||
version(Windows) // delete LIB entry in [Environment] (necessary for optlink) to allow inheriting environment for MS-COFF
|
||||
if (arch != "32omf")
|
||||
environment.update("LIB", 3).value = null;
|
||||
|
||||
// read from DFLAGS in [Environment{arch}] section
|
||||
|
|
|
@ -191,7 +191,7 @@ void main(string[] args)
|
|||
Test parameters can be restricted to certain targets by adding a brace-enclosed
|
||||
condition after the name, i.e. `REQUIRED_ARGS(<condition>): ...`. The `<condition>`
|
||||
consists of the target operating system followed by an optional model suffix,
|
||||
e.g. `linux`, `win32mscoff`, `freebsd64`.
|
||||
e.g. `linux`, `win32`, `freebsd64`.
|
||||
|
||||
Valid platforms:
|
||||
- win
|
||||
|
@ -203,8 +203,6 @@ Valid platforms:
|
|||
|
||||
Valid models:
|
||||
- 32
|
||||
- 32mscoff (windows only)
|
||||
- 32omf (windows only)
|
||||
- 64
|
||||
|
||||
Note that test parameters *MUST* be followed by a colon (intermediate whitespace is allowed).
|
||||
|
@ -430,7 +428,7 @@ depend on the current platform and target:
|
|||
|
||||
Supported conditions:
|
||||
- OS: posix, windows, ...
|
||||
- Model: 64, 32mscoff, 32omf and 32 (also matches 32mscoff + 32omf)
|
||||
- Model: 64, 32
|
||||
|
||||
$r:<regex>$ any text matching <regex> (using $ inside of <regex> is not
|
||||
supported, use multiple regexes instead)
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
// REQUIRED_ARGS: -identifiers-importc=UAX31
|
||||
|
||||
// sppn doesn't support anything newer than c99
|
||||
// DISABLED: win32omf
|
||||
|
||||
// verify that the UAX31 identifier set is applied.
|
||||
|
||||
int \u00F8ide\u00F9nt;
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
// REQUIRED_ARGS: -identifiers-importc=all
|
||||
|
||||
// sppn doesn't support anything newer than c99
|
||||
// DISABLED: win32omf
|
||||
|
||||
// verify that the All identifier set is applied.
|
||||
|
||||
int \u00F8ide\u00F9nt;
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
// REQUIRED_ARGS: -identifiers-importc=c11
|
||||
|
||||
// sppn doesn't support anything newer than c99
|
||||
// DISABLED: win32omf
|
||||
|
||||
// verify that the C11 identifier set is applied.
|
||||
|
||||
int \u00A8ide\u00AFnt;
|
||||
|
|
|
@ -49,13 +49,6 @@ void testConfigurations()
|
|||
"-conf=" ~ configPath
|
||||
];
|
||||
|
||||
version (Windows) if (MODEL == "32omf")
|
||||
{
|
||||
// 32-OMF tries to use `optlink.exe` located next to `sc.ini`
|
||||
// and also doesn't like the LIB setup, so skip it for now
|
||||
extraFlags = [""];
|
||||
}
|
||||
|
||||
foreach (const target; targets)
|
||||
{
|
||||
foreach (const flags; extraFlags)
|
||||
|
|
|
@ -2,9 +2,6 @@ import dshell;
|
|||
|
||||
int main()
|
||||
{
|
||||
version (Windows) if (Vars.MODEL == "32omf") // Avoid optlink
|
||||
return DISABLED;
|
||||
|
||||
version (DigitalMars)
|
||||
{
|
||||
// Disable DM Dlls for now, need to redesign it
|
||||
|
|
|
@ -25,19 +25,10 @@ int main()
|
|||
version (Windows)
|
||||
{
|
||||
Vars.set(`DLL_LIB`, `$OUTPUT_BASE${SEP}mydll.lib`);
|
||||
if (Vars.MODEL == "32omf")
|
||||
{
|
||||
// CXX should be dmc for win32omf.
|
||||
dllCmd ~= [`-mn`, `-L/implib:` ~ Vars.DLL_LIB, `-WD`, `-o` ~ Vars.DLL, `kernel32.lib`, `user32.lib`];
|
||||
mainExtra = `$DLL_LIB`;
|
||||
}
|
||||
else
|
||||
{
|
||||
// CXX should be cl for win32mscoff.
|
||||
// CXX should be cl
|
||||
dllCmd ~= [`/LD`, `/nologo`, `/Fe` ~ Vars.DLL];
|
||||
mainExtra = `$DLL_LIB`;
|
||||
}
|
||||
}
|
||||
else version(OSX)
|
||||
{
|
||||
dllCmd ~= [`-dynamiclib`, `-fPIC`, `-o`, Vars.DLL, `-lstdc++`];
|
||||
|
|
|
@ -2,15 +2,6 @@ import dshell;
|
|||
|
||||
int main()
|
||||
{
|
||||
version (DigitalMars)
|
||||
{
|
||||
if (OS == "windows" && MODEL == "32omf")
|
||||
{
|
||||
writeln("Skipping test when using Optlink.");
|
||||
return DISABLED;
|
||||
}
|
||||
}
|
||||
|
||||
Vars.set("lib", "$OUTPUT_BASE/dir with spaces/b$LIBEXT");
|
||||
|
||||
run("$DMD -m$MODEL -of$lib -lib $EXTRA_FILES/linker_flag_with_spaces_b.d");
|
||||
|
|
|
@ -307,12 +307,9 @@ void ensureToolsExists(const string[string] env, const TestTool[] tools ...)
|
|||
}
|
||||
else
|
||||
{
|
||||
string model = env["MODEL"];
|
||||
if (model == "32omf") model = "32";
|
||||
|
||||
buildCommand = [
|
||||
hostDMD,
|
||||
"-m"~model,
|
||||
"-m"~env["MODEL"],
|
||||
"-of"~targetBin,
|
||||
sourceFile
|
||||
] ~ getPicFlags(env) ~ tool.extraArgs;
|
||||
|
|
|
@ -1,206 +0,0 @@
|
|||
/* test bitfields for Digital Mars C
|
||||
* Note that this test is for win32 only
|
||||
*
|
||||
* REQUIRED_ARGS:
|
||||
* DISABLED: win32mscoff win64 linux freebsd osx
|
||||
* RUN_OUTPUT:
|
||||
---
|
||||
DM | MS | P32 | P64
|
||||
T0 = 1 1 || 1 1 | 1 1 | 1 1 | 1 1
|
||||
T1 = 2 2 || 2 2 | 2 2 | 2 2 | 2 2
|
||||
T2 = 4 4 || 4 4 | 4 4 | 4 4 | 4 4
|
||||
T3 = 16 8 || 16 8 | 16 8 | 8 4 | 8 8
|
||||
T4 = 16 8 || 16 8 | 16 8 | 12 4 | 16 8
|
||||
T5 = 16 8 || 16 8 | 16 8 | 8 4 | 8 8
|
||||
S1 = 8 8 || 8 8 | 8 8 | 4 4 | 8 8
|
||||
S2 = 4 4 || 4 4 | 4 4 | 4 4 | 4 4
|
||||
S3 = 8 4 || 8 4 | 8 4 | 4 4 | 4 4
|
||||
S4 = 8 4 || 8 4 | 8 4 | 4 4 | 4 4
|
||||
S5 = 8 4 || 8 4 | 8 4 | 4 4 | 4 4
|
||||
S6 = 2 2 || 2 2 | 2 2 | 2 2 | 2 2
|
||||
S7 = 16 8 || 16 8 | 16 8 | 4 4 | 8 8
|
||||
S8 = 4 2 || 4 2 | 4 2 | 2 2 | 2 2
|
||||
S8A = 4 2 || 4 2 | 4 2 | 2 2 | 2 2
|
||||
S8B = 6 2 || 6 2 | 6 2 | 2 2 | 2 2
|
||||
S8C = 8 4 || 8 4 | 8 4 | 4 4 | 4 4
|
||||
S9 = 4 2 || 4 2 | 4 2 | 4 2 | 4 2
|
||||
S10 = 0 0 || 0 0 | * * | 0 1 | 0 1
|
||||
S11 = 0 0 || 0 0 | 4 1 | 0 1 | 0 1
|
||||
S12 = 4 4 || 4 4 | 4 4 | 4 4 | 4 4
|
||||
S13 = 8 4 || 8 4 | 8 4 | 8 4 | 8 4
|
||||
S14 = 8 4 || 8 4 | 8 4 | 8 4 | 8 4
|
||||
S15 = 8 4 || 8 4 | 8 4 | 4 4 | 4 4
|
||||
S16 = 0 0 || 0 0 | 4 4 | 4 1 | 4 1
|
||||
S17 = 4 4 || 4 4 | 4 4 | 4 4 | 4 4
|
||||
S18 = 2 1 || 2 1 | 2 1 | 5 1 | 9 1
|
||||
A0 = 16 8 || 16 8 | 16 8 | 12 4 | 16 8
|
||||
A1 = 12 4 || 12 4 | 12 4 | 12 4 | 12 4
|
||||
A2 = 12 4 || 12 4 | 12 4 | 12 4 | 12 4
|
||||
A3 = 16 4 || 16 4 | 16 4 | 16 4 | 16 4
|
||||
A4 = 12 4 || 12 4 | 12 4 | 8 4 | 8 4
|
||||
A5 = 2 1 || 2 1 | 2 1 | 2 1 | 2 1
|
||||
A6 = 4 2 || 4 2 | 4 2 | 2 2 | 2 2
|
||||
A7 = 16 4 || 16 4 | 16 4 | 12 4 | 16 8
|
||||
A8 = 12 4 || 12 4 | 12 4 | 8 4 | 8 8
|
||||
A9 = 32 8 || 32 8 | 32 8 | 16 4 | 16 8
|
||||
A10 = 4 2 || 4 2 | 4 2 | 2 2 | 2 2
|
||||
A11 = 16 4 || 16 4 | 16 4 | 12 4 | 12 4
|
||||
S9 = x30200
|
||||
S14 = x300000201
|
||||
S15 = x201
|
||||
S18 = 1 should be 4
|
||||
A0 = x1
|
||||
---
|
||||
*/
|
||||
|
||||
int printf(const char *fmt, ...);
|
||||
void exit(int);
|
||||
|
||||
void assert(int n, int b)
|
||||
{
|
||||
if (!b)
|
||||
{
|
||||
printf("assert fail %d\n", n);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
int is64bit() { return sizeof(long) == 8; } // otherwise assume 32 bit
|
||||
|
||||
/*************************************************************/
|
||||
|
||||
struct T0 { char x:1; }; //
|
||||
struct T1 { short x:1; }; //
|
||||
struct T2 { int x:1; }; //
|
||||
struct T3 { char a,b,c,d; long long x:1; }; //
|
||||
struct T4 { char a,b,c,d,e,f,g,h; long long x:1; }; //
|
||||
struct T5 { char a,b,c,d,e,f,g; long long x:1; }; //
|
||||
struct S1 { long long int f:1; }; //
|
||||
struct S2 { int x:1; int y:1; }; //
|
||||
struct S3 { short c; int x:1; unsigned y:1; }; //
|
||||
struct S4 { int x:1; short y:1; }; //
|
||||
struct S5 { short x:1; int y:1; }; //
|
||||
struct S6 { short x:1; short y:1; }; //
|
||||
struct S7 { short x:1; int y:1; long long z:1; }; //
|
||||
struct S8 { char a; char b:1; short c:2; }; //
|
||||
struct S8A { char b:1; short c:2; }; //
|
||||
struct S8B { char a; short b:1; char c:2; }; //
|
||||
struct S8C { char a; int b:1; }; //
|
||||
struct S9 { char a; char b:2; short c:9; }; //
|
||||
struct S10 { }; //
|
||||
struct S11 { int :0; }; //
|
||||
struct S12 { int :0; int x; }; //
|
||||
struct S13 { unsigned x:12; unsigned x1:1; unsigned x2:1; unsigned x3:1; unsigned x4:1; int w; }; //
|
||||
struct S14 { char a; char b:4; int c:30; }; //
|
||||
struct S15 { char a; char b:2; int c:9; }; //
|
||||
struct S16 { int :32; }; //
|
||||
struct S17 { int a:32; }; //
|
||||
struct S18 { char a; long long :0; char b; }; //
|
||||
struct A0 { int a; long long b:34, c:4; }; //
|
||||
struct A1 { int a; unsigned b:11; int c; }; //
|
||||
struct A2 { int a; unsigned b:11, c:5, d:16; //
|
||||
int e; };
|
||||
struct A3 { int a; unsigned b:11, c:5, :0, d:16; //
|
||||
int e; };
|
||||
struct A4 { int a:8; short b:7; //
|
||||
unsigned int c:29; };
|
||||
struct A5 { char a:7, b:2; }; //
|
||||
struct A6 { char a:7; short b:2; }; //
|
||||
struct A7 { short a:8; long b:16; int c; //
|
||||
char d:7; };
|
||||
struct A8 { short a:8; long b:16; int :0; //
|
||||
char c:7; };
|
||||
struct A9 { unsigned short a:8; long b:16; //
|
||||
unsigned long c:29; long long d:9;
|
||||
unsigned long e:2, f:31; };
|
||||
struct A10 { unsigned short a:8; char b; }; //
|
||||
struct A11 { char a; int b:5, c:11, :0, d:8; //
|
||||
struct { int ee:8; } e; };
|
||||
|
||||
int main()
|
||||
{
|
||||
/* MS produces identical results for 32 and 64 bit compiles,
|
||||
* DM is 32 bit only
|
||||
*/
|
||||
printf(" DM | MS | P32 | P64\n");
|
||||
printf("T0 = %2d %d || 1 1 | 1 1 | 1 1 | 1 1\n", (int)sizeof(struct T0), (int)_Alignof(struct T0));
|
||||
printf("T1 = %2d %d || 2 2 | 2 2 | 2 2 | 2 2\n", (int)sizeof(struct T1), (int)_Alignof(struct T1));
|
||||
printf("T2 = %2d %d || 4 4 | 4 4 | 4 4 | 4 4\n", (int)sizeof(struct T2), (int)_Alignof(struct T2));
|
||||
printf("T3 = %2d %d || 16 8 | 16 8 | 8 4 | 8 8\n", (int)sizeof(struct T3), (int)_Alignof(struct T3));
|
||||
printf("T4 = %2d %d || 16 8 | 16 8 | 12 4 | 16 8\n", (int)sizeof(struct T4), (int)_Alignof(struct T4));
|
||||
printf("T5 = %2d %d || 16 8 | 16 8 | 8 4 | 8 8\n", (int)sizeof(struct T5), (int)_Alignof(struct T5));
|
||||
printf("S1 = %2d %d || 8 8 | 8 8 | 4 4 | 8 8\n", (int)sizeof(struct S1), (int)_Alignof(struct S1));
|
||||
printf("S2 = %2d %d || 4 4 | 4 4 | 4 4 | 4 4\n", (int)sizeof(struct S2), (int)_Alignof(struct S2));
|
||||
printf("S3 = %2d %d || 8 4 | 8 4 | 4 4 | 4 4\n", (int)sizeof(struct S3), (int)_Alignof(struct S3));
|
||||
printf("S4 = %2d %d || 8 4 | 8 4 | 4 4 | 4 4\n", (int)sizeof(struct S4), (int)_Alignof(struct S4));
|
||||
printf("S5 = %2d %d || 8 4 | 8 4 | 4 4 | 4 4\n", (int)sizeof(struct S5), (int)_Alignof(struct S5));
|
||||
printf("S6 = %2d %d || 2 2 | 2 2 | 2 2 | 2 2\n", (int)sizeof(struct S6), (int)_Alignof(struct S6));
|
||||
printf("S7 = %2d %d || 16 8 | 16 8 | 4 4 | 8 8\n", (int)sizeof(struct S7), (int)_Alignof(struct S7));
|
||||
printf("S8 = %2d %d || 4 2 | 4 2 | 2 2 | 2 2\n", (int)sizeof(struct S8), (int)_Alignof(struct S8));
|
||||
printf("S8A = %2d %d || 4 2 | 4 2 | 2 2 | 2 2\n", (int)sizeof(struct S8A), (int)_Alignof(struct S8A));
|
||||
printf("S8B = %2d %d || 6 2 | 6 2 | 2 2 | 2 2\n", (int)sizeof(struct S8B), (int)_Alignof(struct S8B));
|
||||
printf("S8C = %2d %d || 8 4 | 8 4 | 4 4 | 4 4\n", (int)sizeof(struct S8C), (int)_Alignof(struct S8C));
|
||||
printf("S9 = %2d %d || 4 2 | 4 2 | 4 2 | 4 2\n", (int)sizeof(struct S9), (int)_Alignof(struct S9));
|
||||
printf("S10 = %2d %d || 0 0 | * * | 0 1 | 0 1\n", (int)sizeof(struct S10), (int)_Alignof(struct S10)); // MS doesn't compile
|
||||
printf("S11 = %2d %d || 0 0 | 4 1 | 0 1 | 0 1\n", (int)sizeof(struct S11), (int)_Alignof(struct S11));
|
||||
printf("S12 = %2d %d || 4 4 | 4 4 | 4 4 | 4 4\n", (int)sizeof(struct S12), (int)_Alignof(struct S12));
|
||||
printf("S13 = %2d %d || 8 4 | 8 4 | 8 4 | 8 4\n", (int)sizeof(struct S13), (int)_Alignof(struct S13));
|
||||
printf("S14 = %2d %d || 8 4 | 8 4 | 8 4 | 8 4\n", (int)sizeof(struct S14), (int)_Alignof(struct S14));
|
||||
printf("S15 = %2d %d || 8 4 | 8 4 | 4 4 | 4 4\n", (int)sizeof(struct S15), (int)_Alignof(struct S15));
|
||||
printf("S16 = %2d %d || 0 0 | 4 4 | 4 1 | 4 1\n", (int)sizeof(struct S16), (int)_Alignof(struct S16));
|
||||
printf("S17 = %2d %d || 4 4 | 4 4 | 4 4 | 4 4\n", (int)sizeof(struct S17), (int)_Alignof(struct S17));
|
||||
printf("S18 = %2d %d || 2 1 | 2 1 | 5 1 | 9 1\n", (int)sizeof(struct S18), (int)_Alignof(struct S18));
|
||||
printf("A0 = %2d %d || 16 8 | 16 8 | 12 4 | 16 8\n", (int)sizeof(struct A0), (int)_Alignof(struct A0));
|
||||
printf("A1 = %2d %d || 12 4 | 12 4 | 12 4 | 12 4\n", (int)sizeof(struct A1), (int)_Alignof(struct A1));
|
||||
printf("A2 = %2d %d || 12 4 | 12 4 | 12 4 | 12 4\n", (int)sizeof(struct A2), (int)_Alignof(struct A2));
|
||||
printf("A3 = %2d %d || 16 4 | 16 4 | 16 4 | 16 4\n", (int)sizeof(struct A3), (int)_Alignof(struct A3));
|
||||
printf("A4 = %2d %d || 12 4 | 12 4 | 8 4 | 8 4\n", (int)sizeof(struct A4), (int)_Alignof(struct A4));
|
||||
printf("A5 = %2d %d || 2 1 | 2 1 | 2 1 | 2 1\n", (int)sizeof(struct A5), (int)_Alignof(struct A5));
|
||||
printf("A6 = %2d %d || 4 2 | 4 2 | 2 2 | 2 2\n", (int)sizeof(struct A6), (int)_Alignof(struct A6));
|
||||
printf("A7 = %2d %d || 16 4 | 16 4 | 12 4 | 16 8\n", (int)sizeof(struct A7), (int)_Alignof(struct A7));
|
||||
printf("A8 = %2d %d || 12 4 | 12 4 | 8 4 | 8 8\n", (int)sizeof(struct A8), (int)_Alignof(struct A8));
|
||||
printf("A9 = %2d %d || 32 8 | 32 8 | 16 4 | 16 8\n", (int)sizeof(struct A9), (int)_Alignof(struct A9));
|
||||
printf("A10 = %2d %d || 4 2 | 4 2 | 2 2 | 2 2\n", (int)sizeof(struct A10), (int)_Alignof(struct A10));
|
||||
printf("A11 = %2d %d || 16 4 | 16 4 | 12 4 | 12 4\n", (int)sizeof(struct A11), (int)_Alignof(struct A11));
|
||||
|
||||
{
|
||||
struct S9 s;
|
||||
unsigned x;
|
||||
*(unsigned *)&s = 0;
|
||||
s.b = 2; s.c = 3;
|
||||
x = *(unsigned *)&s;
|
||||
printf("S9 = x%x\n", x);
|
||||
}
|
||||
{
|
||||
struct S14 s = { 1, 2, 3 };
|
||||
unsigned long long v;
|
||||
*(long long *)&s = 0;
|
||||
s.a = 1;
|
||||
s.b = 2;
|
||||
s.c = 3;
|
||||
v = *(unsigned long long *)&s;
|
||||
printf("S14 = x%llx\n", v);
|
||||
}
|
||||
{
|
||||
struct S15 s = { 1,2,3 };
|
||||
unsigned x;
|
||||
*(unsigned *)&s = 0;
|
||||
s.a = 1; s.b = 2; s.c = 3;
|
||||
x = *(unsigned *)&s;
|
||||
printf("S15 = x%x\n", x);
|
||||
}
|
||||
{
|
||||
struct S18 s;
|
||||
printf("S18 = %d should be %d\n", (int)(&s.b - &s.a), is64bit() ? 8 : 4);
|
||||
}
|
||||
{
|
||||
struct A0 s;
|
||||
long long x;
|
||||
*(long long *)&s = 0;
|
||||
s.a = 1; s.b = 15;
|
||||
x = *(long long *)&s;
|
||||
printf("A0 = x%llx\n", x);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -1,196 +0,0 @@
|
|||
/* test bitfields for Digital Mars
|
||||
* Note that this test is for win32 only
|
||||
*
|
||||
* REQUIRED_ARGS: -preview=bitfields
|
||||
* DISABLED: win32mscoff win64 linux freebsd osx
|
||||
* RUN_OUTPUT:
|
||||
---
|
||||
DM | MS | P32 | P64
|
||||
T0 = 1 1 || 1 1 | 1 1 | 1 1 | 1 1
|
||||
T1 = 2 2 || 2 2 | 2 2 | 2 2 | 2 2
|
||||
T2 = 4 4 || 4 4 | 4 4 | 4 4 | 4 4
|
||||
T3 = 16 8 || 16 8 | 16 8 | 8 4 | 8 8
|
||||
T4 = 16 8 || 16 8 | 16 8 | 12 4 | 16 8
|
||||
T5 = 16 8 || 16 8 | 16 8 | 8 4 | 8 8
|
||||
S1 = 8 8 || 8 8 | 8 8 | 4 4 | 8 8
|
||||
S2 = 4 4 || 4 4 | 4 4 | 4 4 | 4 4
|
||||
S3 = 8 4 || 8 4 | 8 4 | 4 4 | 4 4
|
||||
S4 = 8 4 || 8 4 | 8 4 | 4 4 | 4 4
|
||||
S5 = 8 4 || 8 4 | 8 4 | 4 4 | 4 4
|
||||
S6 = 2 2 || 2 2 | 2 2 | 2 2 | 2 2
|
||||
S7 = 16 8 || 16 8 | 16 8 | 4 4 | 8 8
|
||||
S8 = 4 2 || 4 2 | 4 2 | 2 2 | 2 2
|
||||
S8A = 4 2 || 4 2 | 4 2 | 2 2 | 2 2
|
||||
S8B = 6 2 || 6 2 | 6 2 | 2 2 | 2 2
|
||||
S8C = 8 4 || 8 4 | 8 4 | 4 4 | 4 4
|
||||
S9 = 4 2 || 4 2 | 4 2 | 4 2 | 4 2
|
||||
S10 = 1 1 || 0 0 | * * | 0 1 | 0 1
|
||||
S11 = 1 1 || 0 0 | 4 1 | 0 1 | 0 1
|
||||
S12 = 4 4 || 4 4 | 4 4 | 4 4 | 4 4
|
||||
S13 = 8 4 || 8 4 | 8 4 | 8 4 | 8 4
|
||||
S14 = 8 4 || 8 4 | 8 4 | 8 4 | 8 4
|
||||
S15 = 8 4 || 8 4 | 8 4 | 4 4 | 4 4
|
||||
S16 = 1 1 || 0 0 | 4 4 | 4 1 | 4 1
|
||||
S17 = 4 4 || 4 4 | 4 4 | 4 4 | 4 4
|
||||
S18 = 2 1 || 2 1 | 2 1 | 5 1 | 9 1
|
||||
A0 = 16 8 || 16 8 | 16 8 | 12 4 | 16 8
|
||||
A1 = 12 4 || 12 4 | 12 4 | 12 4 | 12 4
|
||||
A2 = 12 4 || 12 4 | 12 4 | 12 4 | 12 4
|
||||
A3 = 16 4 || 16 4 | 16 4 | 16 4 | 16 4
|
||||
A4 = 12 4 || 12 4 | 12 4 | 8 4 | 8 4
|
||||
A5 = 2 1 || 2 1 | 2 1 | 2 1 | 2 1
|
||||
A6 = 4 2 || 4 2 | 4 2 | 2 2 | 2 2
|
||||
A7 = 16 4 || 16 4 | 16 4 | 12 4 | 16 8
|
||||
A8 = 12 4 || 12 4 | 12 4 | 8 4 | 8 8
|
||||
A9 = 32 8 || 32 8 | 32 8 | 16 4 | 16 8
|
||||
A10 = 4 2 || 4 2 | 4 2 | 2 2 | 2 2
|
||||
A11 = 16 4 || 16 4 | 16 4 | 12 4 | 12 4
|
||||
S9 = x30200
|
||||
S14 = x300000201
|
||||
S15 = x201
|
||||
S18 = 1 should be 4
|
||||
A0 = x1
|
||||
---
|
||||
*/
|
||||
|
||||
import core.stdc.stdio;
|
||||
|
||||
int is64bit() { return size_t.sizeof == 8; } // otherwise assume 32 bit
|
||||
|
||||
/*************************************************************/
|
||||
|
||||
struct T0 { ubyte x:1; }; //
|
||||
struct T1 { short x:1; }; //
|
||||
struct T2 { int x:1; }; //
|
||||
struct T3 { ubyte a,b,c,d; long x:1; }; //
|
||||
struct T4 { ubyte a,b,c,d,e,f,g,h; long x:1; }; //
|
||||
struct T5 { ubyte a,b,c,d,e,f,g; long x:1; }; //
|
||||
struct S1 { long f:1; }; //
|
||||
struct S2 { int x:1; int y:1; }; //
|
||||
struct S3 { short c; int x:1; uint y:1; }; //
|
||||
struct S4 { int x:1; short y:1; }; //
|
||||
struct S5 { short x:1; int y:1; }; //
|
||||
struct S6 { short x:1; short y:1; }; //
|
||||
struct S7 { short x:1; int y:1; long z:1; }; //
|
||||
struct S8 { ubyte a; ubyte b:1; short c:2; }; //
|
||||
struct S8A { ubyte b:1; short c:2; }; //
|
||||
struct S8B { ubyte a; short b:1; ubyte c:2; }; //
|
||||
struct S8C { ubyte a; int b:1; }; //
|
||||
struct S9 { ubyte a; ubyte b:2; short c:9; }; //
|
||||
struct S10 { }; // sizeof differs from C treatment
|
||||
struct S11 { int :0; }; // sizeof differs from C treatment
|
||||
struct S12 { int :0; int x; }; //
|
||||
struct S13 { uint x:12; uint x1:1; uint x2:1; uint x3:1; uint x4:1; int w; }; //
|
||||
struct S14 { ubyte a; ubyte b:4; int c:30; }; //
|
||||
struct S15 { ubyte a; ubyte b:2; int c:9; }; //
|
||||
struct S16 { int :32; }; // sizeof differs from C treatment
|
||||
struct S17 { int a:32; }; //
|
||||
struct S18 { ubyte a; long :0; ubyte b; }; //
|
||||
struct A0 { int a; long b:34, c:4; }; //
|
||||
struct A1 { int a; uint b:11; int c; }; //
|
||||
struct A2 { int a; uint b:11, c:5, d:16; //
|
||||
int e; };
|
||||
struct A3 { int a; uint b:11, c:5, :0, d:16; //
|
||||
int e; };
|
||||
struct A4 { int a:8; short b:7; //
|
||||
uint c:29; };
|
||||
struct A5 { ubyte a:7, b:2; }; //
|
||||
struct A6 { ubyte a:7; short b:2; }; //
|
||||
struct A7 { short a:8; int b:16; int c; //
|
||||
ubyte d:7; };
|
||||
struct A8 { short a:8; int b:16; int :0; //
|
||||
ubyte c:7; };
|
||||
struct A9 { ushort a:8; int b:16; //
|
||||
uint c:29; long d:9;
|
||||
uint e:2, f:31; };
|
||||
struct A10 { ushort a:8; ubyte b; }; //
|
||||
struct A11 { ubyte a; int b:5, c:11, :0, d:8; //
|
||||
struct { int ee:8; } };
|
||||
|
||||
int main()
|
||||
{
|
||||
/* MS produces identical results for 32 and 64 bit compiles,
|
||||
* DM is 32 bit only
|
||||
*/
|
||||
printf(" DM | MS | P32 | P64\n");
|
||||
printf("T0 = %2d %d || 1 1 | 1 1 | 1 1 | 1 1\n", cast(int)T0.sizeof, cast(int)T0.alignof);
|
||||
printf("T1 = %2d %d || 2 2 | 2 2 | 2 2 | 2 2\n", cast(int)T1.sizeof, cast(int)T1.alignof);
|
||||
printf("T2 = %2d %d || 4 4 | 4 4 | 4 4 | 4 4\n", cast(int)T2.sizeof, cast(int)T2.alignof);
|
||||
printf("T3 = %2d %d || 16 8 | 16 8 | 8 4 | 8 8\n", cast(int)T3.sizeof, cast(int)T3.alignof);
|
||||
printf("T4 = %2d %d || 16 8 | 16 8 | 12 4 | 16 8\n", cast(int)T4.sizeof, cast(int)T4.alignof);
|
||||
printf("T5 = %2d %d || 16 8 | 16 8 | 8 4 | 8 8\n", cast(int)T5.sizeof, cast(int)T5.alignof);
|
||||
printf("S1 = %2d %d || 8 8 | 8 8 | 4 4 | 8 8\n", cast(int)S1.sizeof, cast(int)S1.alignof);
|
||||
printf("S2 = %2d %d || 4 4 | 4 4 | 4 4 | 4 4\n", cast(int)S2.sizeof, cast(int)S2.alignof);
|
||||
printf("S3 = %2d %d || 8 4 | 8 4 | 4 4 | 4 4\n", cast(int)S3.sizeof, cast(int)S3.alignof);
|
||||
printf("S4 = %2d %d || 8 4 | 8 4 | 4 4 | 4 4\n", cast(int)S4.sizeof, cast(int)S4.alignof);
|
||||
printf("S5 = %2d %d || 8 4 | 8 4 | 4 4 | 4 4\n", cast(int)S5.sizeof, cast(int)S5.alignof);
|
||||
printf("S6 = %2d %d || 2 2 | 2 2 | 2 2 | 2 2\n", cast(int)S6.sizeof, cast(int)S6.alignof);
|
||||
printf("S7 = %2d %d || 16 8 | 16 8 | 4 4 | 8 8\n", cast(int)S7.sizeof, cast(int)S7.alignof);
|
||||
printf("S8 = %2d %d || 4 2 | 4 2 | 2 2 | 2 2\n", cast(int)S8.sizeof, cast(int)S8.alignof);
|
||||
printf("S8A = %2d %d || 4 2 | 4 2 | 2 2 | 2 2\n", cast(int)S8A.sizeof, cast(int)S8A.alignof);
|
||||
printf("S8B = %2d %d || 6 2 | 6 2 | 2 2 | 2 2\n", cast(int)S8B.sizeof, cast(int)S8B.alignof);
|
||||
printf("S8C = %2d %d || 8 4 | 8 4 | 4 4 | 4 4\n", cast(int)S8C.sizeof, cast(int)S8C.alignof);
|
||||
printf("S9 = %2d %d || 4 2 | 4 2 | 4 2 | 4 2\n", cast(int)S9.sizeof, cast(int)S9.alignof);
|
||||
printf("S10 = %2d %d || 0 0 | * * | 0 1 | 0 1\n", cast(int)S10.sizeof, cast(int)S10.alignof); // MS doesn't compile
|
||||
printf("S11 = %2d %d || 0 0 | 4 1 | 0 1 | 0 1\n", cast(int)S11.sizeof, cast(int)S11.alignof);
|
||||
printf("S12 = %2d %d || 4 4 | 4 4 | 4 4 | 4 4\n", cast(int)S12.sizeof, cast(int)S12.alignof);
|
||||
printf("S13 = %2d %d || 8 4 | 8 4 | 8 4 | 8 4\n", cast(int)S13.sizeof, cast(int)S13.alignof);
|
||||
printf("S14 = %2d %d || 8 4 | 8 4 | 8 4 | 8 4\n", cast(int)S14.sizeof, cast(int)S14.alignof);
|
||||
printf("S15 = %2d %d || 8 4 | 8 4 | 4 4 | 4 4\n", cast(int)S15.sizeof, cast(int)S15.alignof);
|
||||
printf("S16 = %2d %d || 0 0 | 4 4 | 4 1 | 4 1\n", cast(int)S16.sizeof, cast(int)S16.alignof);
|
||||
printf("S17 = %2d %d || 4 4 | 4 4 | 4 4 | 4 4\n", cast(int)S17.sizeof, cast(int)S17.alignof);
|
||||
printf("S18 = %2d %d || 2 1 | 2 1 | 5 1 | 9 1\n", cast(int)S18.sizeof, cast(int)S18.alignof);
|
||||
printf("A0 = %2d %d || 16 8 | 16 8 | 12 4 | 16 8\n", cast(int)A0.sizeof, cast(int)A0.alignof);
|
||||
printf("A1 = %2d %d || 12 4 | 12 4 | 12 4 | 12 4\n", cast(int)A1.sizeof, cast(int)A1.alignof);
|
||||
printf("A2 = %2d %d || 12 4 | 12 4 | 12 4 | 12 4\n", cast(int)A2.sizeof, cast(int)A2.alignof);
|
||||
printf("A3 = %2d %d || 16 4 | 16 4 | 16 4 | 16 4\n", cast(int)A3.sizeof, cast(int)A3.alignof);
|
||||
printf("A4 = %2d %d || 12 4 | 12 4 | 8 4 | 8 4\n", cast(int)A4.sizeof, cast(int)A4.alignof);
|
||||
printf("A5 = %2d %d || 2 1 | 2 1 | 2 1 | 2 1\n", cast(int)A5.sizeof, cast(int)A5.alignof);
|
||||
printf("A6 = %2d %d || 4 2 | 4 2 | 2 2 | 2 2\n", cast(int)A6.sizeof, cast(int)A6.alignof);
|
||||
printf("A7 = %2d %d || 16 4 | 16 4 | 12 4 | 16 8\n", cast(int)A7.sizeof, cast(int)A7.alignof);
|
||||
printf("A8 = %2d %d || 12 4 | 12 4 | 8 4 | 8 8\n", cast(int)A8.sizeof, cast(int)A8.alignof);
|
||||
printf("A9 = %2d %d || 32 8 | 32 8 | 16 4 | 16 8\n", cast(int)A9.sizeof, cast(int)A9.alignof);
|
||||
printf("A10 = %2d %d || 4 2 | 4 2 | 2 2 | 2 2\n", cast(int)A10.sizeof, cast(int)A10.alignof);
|
||||
printf("A11 = %2d %d || 16 4 | 16 4 | 12 4 | 12 4\n", cast(int)A11.sizeof, cast(int)A11.alignof);
|
||||
|
||||
{
|
||||
S9 s;
|
||||
uint x;
|
||||
*cast(uint *)&s = 0;
|
||||
s.b = 2; s.c = 3;
|
||||
x = *cast(uint *)&s;
|
||||
printf("S9 = x%x\n", x);
|
||||
}
|
||||
{
|
||||
S14 s = { 1, 2, 3 };
|
||||
ulong v;
|
||||
*cast(long *)&s = 0;
|
||||
s.a = 1;
|
||||
s.b = 2;
|
||||
s.c = 3;
|
||||
v = *cast(ulong *)&s;
|
||||
printf("S14 = x%llx\n", v);
|
||||
}
|
||||
{
|
||||
S15 s = { 1,2,3 };
|
||||
uint x;
|
||||
*cast(uint *)&s = 0;
|
||||
s.a = 1; s.b = 2; s.c = 3;
|
||||
x = *cast(uint *)&s;
|
||||
printf("S15 = x%x\n", x);
|
||||
}
|
||||
{
|
||||
S18 s;
|
||||
printf("S18 = %d should be %d\n", cast(int)(&s.b - &s.a), is64bit() ? 8 : 4);
|
||||
}
|
||||
{
|
||||
A0 s;
|
||||
long x;
|
||||
*cast(long *)&s = 0;
|
||||
s.a = 1; s.b = 15;
|
||||
x = *cast(long *)&s;
|
||||
printf("A0 = x%llx\n", x);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -5,10 +5,10 @@ PERMUTE_ARGS:
|
|||
ARG_SETS: -version=Single
|
||||
ARG_SETS: -version=Double
|
||||
|
||||
ARG_SETS(win32mscoff windows64): -version=Extended ../src/dmd/root/longdouble.d
|
||||
ARG_SETS(win32mscoff windows64): -version=ExtendedSoft ../src/dmd/root/longdouble.d
|
||||
ARG_SETS(windows): -version=Extended ../src/dmd/root/longdouble.d
|
||||
ARG_SETS(windows): -version=ExtendedSoft ../src/dmd/root/longdouble.d
|
||||
|
||||
ARG_SETS(linux osx win32): -version=Extended
|
||||
ARG_SETS(linux osx): -version=Extended
|
||||
*/
|
||||
|
||||
module test.runnable.paranoia;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
// DISABLED: win32mscoff win64 freebsd
|
||||
// DISABLED: win freebsd
|
||||
|
||||
// https://issues.dlang.org/show_bug.cgi?id=23886
|
||||
|
||||
|
|
|
@ -8,9 +8,6 @@
|
|||
|
||||
// N.B MSVC doesn't have a C++11 switch, but it defaults to the latest fully-supported standard
|
||||
|
||||
// Broken for unknown reasons since the OMF => MsCOFF switch
|
||||
// DISABLED: win32omf
|
||||
|
||||
import core.stdc.stdio;
|
||||
import core.stdc.stdarg;
|
||||
import core.stdc.config;
|
||||
|
|
|
@ -175,15 +175,6 @@ immutable(EnvData) processEnvironment()
|
|||
envData.ccompiler = environment.get("CC");
|
||||
envData.cxxcompiler = environment.get("CXX");
|
||||
envData.model = envGetRequired("MODEL");
|
||||
if (envData.os == "windows" && envData.model == "32")
|
||||
{
|
||||
// FIXME: we need to translate the default 32-bit model (COFF) on Windows to legacy `32mscoff`.
|
||||
// Reason: OMF-specific tests are currently specified like this:
|
||||
// DISABLED: win32mscoff win64 …
|
||||
// and `DISABLED: win32` would disable it for `win32omf` too.
|
||||
// So we'd need something like an `ENABLED: win32omf` parameter to restrict tests to specific platforms.
|
||||
envData.model = "32mscoff";
|
||||
}
|
||||
envData.required_args = environment.get("REQUIRED_ARGS");
|
||||
envData.dobjc = environment.get("D_OBJC") == "1";
|
||||
envData.coverage_build = environment.get("DMD_TEST_COVERAGE") == "1";
|
||||
|
@ -196,35 +187,17 @@ immutable(EnvData) processEnvironment()
|
|||
|
||||
if (envData.ccompiler.empty)
|
||||
{
|
||||
if (envData.os != "windows")
|
||||
envData.ccompiler = "cc";
|
||||
else if (envData.model == "32omf")
|
||||
envData.ccompiler = "dmc";
|
||||
else if (envData.model == "64")
|
||||
envData.ccompiler = "cl";
|
||||
else if (envData.model == "32mscoff")
|
||||
if (envData.os == "windows")
|
||||
envData.ccompiler = "cl";
|
||||
else
|
||||
{
|
||||
writeln("Can't determine C compiler (CC). Unknown $OS$MODEL combination: ", envData.os, envData.model);
|
||||
throw new SilentQuit();
|
||||
}
|
||||
envData.ccompiler = "cc";
|
||||
}
|
||||
if (envData.cxxcompiler.empty)
|
||||
{
|
||||
if (envData.os != "windows")
|
||||
envData.cxxcompiler = "c++";
|
||||
else if (envData.model == "32omf")
|
||||
envData.cxxcompiler = "dmc";
|
||||
else if (envData.model == "64")
|
||||
envData.cxxcompiler = "cl";
|
||||
else if (envData.model == "32mscoff")
|
||||
if (envData.os == "windows")
|
||||
envData.cxxcompiler = "cl";
|
||||
else
|
||||
{
|
||||
writeln("Can't determine C++ compiler (CXX). Unknown $OS$MODEL combination: ", envData.os, envData.model);
|
||||
throw new SilentQuit();
|
||||
}
|
||||
envData.cxxcompiler = "c++";
|
||||
}
|
||||
|
||||
version (Windows) {} else
|
||||
|
@ -547,9 +520,7 @@ private bool consumeNextToken(ref string file, const string token, ref const Env
|
|||
file = file.stripLeft!(ch => ch == ' '); // Don't read line breaks
|
||||
|
||||
// Check if the current environment matches an entry in oss, which can either
|
||||
// be an OS (e.g. "linux") or a combination of OS + MODEL (e.g. "windows32omf").
|
||||
// The latter is important on windows because m32omf might require other
|
||||
// parameters than m32mscoff/m64.
|
||||
// be an OS (e.g. "linux") or a combination of OS + MODEL (e.g. "windows32").
|
||||
if (!oss.canFind!(o => o.skipOver(envData.os) && (o.empty || o == envData.model)))
|
||||
continue; // Parameter was skipped
|
||||
}
|
||||
|
@ -646,8 +617,7 @@ string getDisabledReason(string[] disabledPlatforms, const ref EnvData envData)
|
|||
|
||||
unittest
|
||||
{
|
||||
immutable EnvData win32omf = { os: "windows", model: "32omf" };
|
||||
immutable EnvData win32mscoff = { os: "windows", model: "32mscoff" };
|
||||
immutable EnvData win32 = { os: "windows", model: "32" };
|
||||
immutable EnvData win64 = { os: "windows", model: "64" };
|
||||
|
||||
assert(getDisabledReason(null, win64) is null);
|
||||
|
@ -658,11 +628,8 @@ unittest
|
|||
assert(getDisabledReason([ "linux", "win64" ], win64) == "on win64");
|
||||
assert(getDisabledReason([ "linux", "win32" ], win64) is null);
|
||||
|
||||
assert(getDisabledReason([ "win32mscoff" ], win32mscoff) == "on win32mscoff");
|
||||
assert(getDisabledReason([ "win32mscoff" ], win32omf) is null);
|
||||
|
||||
assert(getDisabledReason([ "win32" ], win32mscoff) == "on win32");
|
||||
assert(getDisabledReason([ "win32" ], win32omf) == "on win32");
|
||||
assert(getDisabledReason([ "win32" ], win32) == "on win32");
|
||||
assert(getDisabledReason([ "win32" ], win64) is null);
|
||||
}
|
||||
/**
|
||||
* Reads the test configuration from the source code (using `findTestParameter` and
|
||||
|
@ -1126,11 +1093,7 @@ bool collectExtraSources (in string input_dir, in string output_dir, in string[]
|
|||
auto curObj = output_dir ~ envData.sep ~ cur ~ envData.obj;
|
||||
bool is_cpp_file = cur.extension() == ".cpp";
|
||||
string command = quoteSpaces(is_cpp_file ? cxxcompiler : ccompiler);
|
||||
if (envData.model == "32omf") // dmc.exe
|
||||
{
|
||||
command ~= " -c "~curSrc~" -o"~curObj;
|
||||
}
|
||||
else if (envData.os == "windows") // cl.exe
|
||||
if (envData.os == "windows") // cl.exe
|
||||
{
|
||||
command ~= ` /c /nologo `~curSrc~` /Fo`~curObj;
|
||||
}
|
||||
|
@ -1413,8 +1376,8 @@ bool compareOutput(string output, string refoutput, const ref EnvData envData)
|
|||
toSkip = chunk;
|
||||
break;
|
||||
}
|
||||
// Match against OS or model (accepts "32mscoff" as "32")
|
||||
else if (searchResult[0].splitter('+').all!(c => c.among(envData.os, envData.model, envData.model[0 .. min(2, $)])))
|
||||
// Match against OS or model
|
||||
else if (searchResult[0].splitter('+').all!(c => c.among(envData.os, envData.model)))
|
||||
{
|
||||
toSkip = searchResult[2];
|
||||
break;
|
||||
|
@ -1487,7 +1450,7 @@ unittest
|
|||
const emptyFmt = "On <$?:windows=abc|$> use <$?:posix=$>!";
|
||||
assert(compareOutput("On <> use <>!", emptyFmt, ed));
|
||||
|
||||
ed.model = "32mscoff";
|
||||
ed.model = "32";
|
||||
assert(compareOutput("size_t is uint!", "size_t is $?:32=uint|64=ulong$!", ed));
|
||||
|
||||
assert(compareOutput("no", "$?:posix+64=yes|no$", ed));
|
||||
|
@ -1872,7 +1835,6 @@ int tryMain(string[] args)
|
|||
{
|
||||
toCleanup ~= test_app_dmd;
|
||||
version(Windows)
|
||||
if (envData.model != "32omf")
|
||||
{
|
||||
toCleanup ~= test_app_dmd_base ~ to!string(permuteIndex) ~ ".ilk";
|
||||
toCleanup ~= test_app_dmd_base ~ to!string(permuteIndex) ~ ".pdb";
|
||||
|
|
|
@ -375,10 +375,7 @@ $(abspath ../generated/$(OS)/$(BUILD)/$(MODEL)/dmd$(DOTEXE)): ../generated/$(OS)
|
|||
################### C/ASM Targets ############################
|
||||
|
||||
OBJS:=$(ROOT)/errno_c$(DOTOBJ)
|
||||
ifeq (32omf,$(MODEL))
|
||||
# minit.asm is only used for -m32omf on Windows; there's a pre-built minit.obj
|
||||
OBJS+=src/rt/minit$(DOTOBJ)
|
||||
else ifneq (windows,$(OS))
|
||||
ifneq (windows,$(OS))
|
||||
OBJS+=$(ROOT)/threadasm$(DOTOBJ) $(ROOT)/valgrind$(DOTOBJ)
|
||||
endif
|
||||
|
||||
|
@ -434,12 +431,7 @@ endif
|
|||
|
||||
.PHONY : unittest
|
||||
ifeq (1,$(BUILD_WAS_SPECIFIED))
|
||||
ifeq (32omf,$(MODEL))
|
||||
unittest :
|
||||
@echo "Skipping druntime unittests because they cannot be linked on Win32 + OMF due to OPTLINK issues."
|
||||
else
|
||||
unittest : $(UT_MODULES) $(addsuffix /.run,$(ADDITIONAL_TESTS))
|
||||
endif
|
||||
else
|
||||
unittest : unittest-debug unittest-release
|
||||
unittest-%: target
|
||||
|
@ -519,7 +511,7 @@ benchmark-compile-only: $(ROOT)/benchmark$(DOTEXE) $(DMD)
|
|||
MANIFEST = $(shell git ls-tree --name-only -r HEAD)
|
||||
|
||||
CWS_MAKEFILES = $(filter mak/% %.mak %/Makefile,$(MANIFEST))
|
||||
NOT_MAKEFILES = $(filter-out $(CWS_MAKEFILES) src/rt/minit.obj test/%.exp,$(MANIFEST))
|
||||
NOT_MAKEFILES = $(filter-out $(CWS_MAKEFILES) test/%.exp,$(MANIFEST))
|
||||
GREP = grep
|
||||
|
||||
checkwhitespace:
|
||||
|
|
|
@ -1,114 +0,0 @@
|
|||
;_ minit.asm
|
||||
; Module initialization support.
|
||||
;
|
||||
; Copyright: Copyright Digital Mars 2000 - 2010.
|
||||
; License: $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
|
||||
; Authors: Walter Bright
|
||||
;
|
||||
; Copyright Digital Mars 2000 - 2010.
|
||||
; Distributed under the Boost Software License, Version 1.0.
|
||||
; (See accompanying file LICENSE or copy at
|
||||
; http://www.boost.org/LICENSE_1_0.txt)
|
||||
;
|
||||
; With VC installed, build with:
|
||||
; ml /omf minit.asm
|
||||
|
||||
.model FLAT
|
||||
|
||||
ifdef _WIN32
|
||||
DATAGRP EQU FLAT
|
||||
else
|
||||
DATAGRP EQU DGROUP
|
||||
endif
|
||||
|
||||
; Provide a default resolution for weak extern records, no way in C
|
||||
; to define an omf symbol with a specific value
|
||||
public __nullext
|
||||
__nullext equ 0
|
||||
|
||||
extrn __moduleinfo_array:near
|
||||
|
||||
; This bit of assembler is needed because, from C or D, one cannot
|
||||
; specify the names of data segments. Why does this matter?
|
||||
; All the ModuleInfo pointers are placed into a segment named 'FM'.
|
||||
; The order in which they are placed in 'FM' is arbitrarily up to the linker.
|
||||
; In order to walk all the pointers, we need to be able to find the
|
||||
; beginning and the end of the 'FM' segment.
|
||||
; This is done by bracketing the 'FM' segment with two other, empty,
|
||||
; segments named 'FMB' and 'FME'. Since this module is the only one that
|
||||
; ever refers to 'FMB' and 'FME', we get to control the order in which
|
||||
; these segments appear relative to 'FM' by using a GROUP statement.
|
||||
; So, we have in memory:
|
||||
; FMB empty segment
|
||||
; FM contains all the pointers
|
||||
; FME empty segment
|
||||
; and finding the limits of FM is as easy as taking the address of FMB
|
||||
; and the address of FME.
|
||||
|
||||
; These segments bracket FM, which contains the list of ModuleInfo pointers
|
||||
FMB segment dword use32 public 'DATA'
|
||||
FMB ends
|
||||
FM segment dword use32 public 'DATA'
|
||||
FM ends
|
||||
FME segment dword use32 public 'DATA'
|
||||
FME ends
|
||||
|
||||
; This leaves room in the _fatexit() list for _moduleDtor()
|
||||
XOB segment dword use32 public 'BSS'
|
||||
XOB ends
|
||||
XO segment dword use32 public 'BSS'
|
||||
dd ?
|
||||
XO ends
|
||||
XOE segment dword use32 public 'BSS'
|
||||
XOE ends
|
||||
|
||||
DGROUP group FMB,FM,FME
|
||||
|
||||
; These segments bracket DP, which contains the _DATA pointer references
|
||||
public __DPbegin, __DPend
|
||||
DPB segment dword use32 public 'CODE'
|
||||
__DPbegin:
|
||||
DPB ends
|
||||
DP segment dword use32 public 'CODE'
|
||||
DP ends
|
||||
DPE segment dword use32 public 'CODE'
|
||||
__DPend:
|
||||
DPE ends
|
||||
|
||||
CGROUP group DPB,DP,DPE
|
||||
|
||||
; These segments bracket TP, which contains the TLS pointer references
|
||||
public __TPbegin, __TPend
|
||||
TPB segment dword use32 public 'CODE'
|
||||
__TPbegin:
|
||||
TPB ends
|
||||
TP segment dword use32 public 'CODE'
|
||||
TP ends
|
||||
TPE segment dword use32 public 'CODE'
|
||||
__TPend:
|
||||
TPE ends
|
||||
|
||||
CGROUP group TPB,TP,TPE
|
||||
|
||||
_TEXT segment para use32 public 'CODE'
|
||||
assume CS:_TEXT
|
||||
|
||||
; extern (C) void _minit();
|
||||
; Converts array of ModuleInfo pointers to a D dynamic array of them,
|
||||
; so they can be accessed via D.
|
||||
; Result is written to:
|
||||
; extern (C) ModuleInfo[] _moduleinfo_array;
|
||||
|
||||
public __minit
|
||||
__minit:
|
||||
mov EDX,offset DATAGRP:FMB
|
||||
mov EAX,offset DATAGRP:FME
|
||||
mov dword ptr __moduleinfo_array+4,EDX
|
||||
sub EAX,EDX ; size in bytes of FM segment
|
||||
shr EAX,2 ; convert to array length
|
||||
mov dword ptr __moduleinfo_array,EAX
|
||||
ret
|
||||
|
||||
_TEXT ends
|
||||
|
||||
end
|
Binary file not shown.
Loading…
Add table
Add a link
Reference in a new issue