1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-04-30 02:02:38 -07:00

Support the MinGW build of MPS and tests, part 1

* mps/code/w3i6gc.gmk:
* mps/code/w3i3gc.gmk:
* mps/code/mingw.gmk: New files, for the MinGW build.

* mps/code/ss.c (StackHot) [__MINGW32__ && __GNUC__ >= 12]: Ignore
dangling-pointer warnings.

* mps/code/global.c (ArenaFinalize): Avoid compiler warnings.

* mps/code/thw3.c (ThreadScan): Avoid compilation errors due to
prototype mismatch.

* mps/code/testlib.h (alloca): Don't redefine for MinGW.
(setenv): Don't redefine for mingw.org's MinGW.
(ulongest_t, longest_t): Separate definitions for MinGW64.

* mps/code/testlib.c (sizelog2) [__MINGW32__]: Fix comparison.
(rnd_align): Avoid name clashes with 'min' and 'max'.

* mps/code/spw3i3.c (StackProbe) [__GNUC__]: Implementation for
MinGW.

* mps/code/protw3.c: Avoid compiler warning.

* mps/code/mpstd.h: Define MinGW (_X86_) and MinGW64 (__X86_64)
configurations.

* mps/code/mpsiw3.c (mps_SEH_filter, mps_SEH_handler): Add
prototypes.

* mps/code/mps.c [MPS_PF_W3I3GC]: Define 32-bit MinGW stuff.
[MPS_PF_W3I6GC]: Define 64-bit MinGW64 stuff.

* mps/code/lockw3.c (RTL_RUN_ONCE, PRTL_RUN_ONCE_INIT_FN)
(RTL_RUN_ONCE_INIT, INIT_ONCE_STATIC_INIT, RTL_RUN_ONCE INIT_ONCE)
(PRTL_RUN_ONCE PINIT_ONCE, PINIT_ONCE_FN, InitOnceExecuteOnce):
Define for mingw.org's MinGW.

* mps/code/comm.gmk (EVENT_TARGETS, EXTRA_TARGETS, TEST_TARGETS)
(UNBUILDABLE_TARGETS): Add $(EXEEXT) to program names.
(TESTTHR): Define correct test for MS-Windows.
Don't fail the build if the *.d dependency files don't exist.
This commit is contained in:
Eli Zaretskii 2025-09-24 13:02:30 +03:00
parent c6a6db0abb
commit e722ec9cfe
15 changed files with 410 additions and 123 deletions

View file

@ -75,7 +75,7 @@ endif
# TELEMETRY TARGETS
EVENT_TARGETS = mpseventcnv mpseventpy mpseventsql mpseventtxt
EVENT_TARGETS = mpseventcnv$(EXEEXT) mpseventpy$(EXEEXT) mpseventsql$(EXEEXT) mpseventtxt$(EXEEXT)
# EXTRA TARGETS
@ -83,7 +83,7 @@ EVENT_TARGETS = mpseventcnv mpseventpy mpseventsql mpseventtxt
# Don't build mpseventsql by default (might not have sqlite3 installed),
# but do build the other event target.
EXTRA_TARGETS ?= $(filter-out mpseventsql,$(EVENT_TARGETS))
EXTRA_TARGETS ?= $(filter-out mpseventsql$(EXEEXT),$(EVENT_TARGETS))
#
@ -164,7 +164,15 @@ POOLN = pooln.c
MV2 = poolmv2.c
MVFF = poolmvff.c
TESTLIB = testlib.c
# Windows and Posix need different multithreaded tests, so here we must
# deviate from the "no variation between platforms" rule.
ifeq ($(PFM),w3i3gc)
TESTTHR = testthrw3.c
else ifeq ($(PFM),w3i6gc)
TESTTHR = testthrw3.c
else
TESTTHR = testthrix.c
endif
FMTDY = fmtdy.c fmtno.c
FMTDYTST = fmtdy.c fmtno.c fmtdytst.c
FMTHETST = fmthe.c fmtdy.c fmtno.c fmtdytst.c
@ -256,57 +264,63 @@ LIB_TARGETS=mps.a mpsplan.a
# Test executables go in TEST_TARGETS.
TEST_TARGETS=\
abqtest \
addrobj \
airtest \
amcss \
amcsshe \
amcssth \
amsss \
amssshe \
apss \
arenacv \
awlut \
awluthe \
awlutth \
btcv \
bttest \
djbench \
extcon \
finalcv \
finaltest \
forktest \
fotest \
gcbench \
landtest \
locbwcss \
lockcov \
lockut \
locusss \
locv \
messtest \
mpmss \
mpsicv \
mv2test \
nailboardtest \
poolncv \
qs \
sacss \
segsmss \
sncss \
steptest \
tagtest \
teletest \
walkt0 \
zcoll \
zmess \
ztfm
abqtest$(EXEEXT) \
addrobj$(EXEEXT) \
airtest$(EXEEXT) \
amcss$(EXEEXT) \
amcsshe$(EXEEXT) \
amcssth$(EXEEXT) \
amsss$(EXEEXT) \
amssshe$(EXEEXT) \
apss$(EXEEXT) \
arenacv$(EXEEXT) \
awlut$(EXEEXT) \
awluthe$(EXEEXT) \
awlutth$(EXEEXT) \
btcv$(EXEEXT) \
bttest$(EXEEXT) \
djbench$(EXEEXT) \
extcon$(EXEEXT) \
finalcv$(EXEEXT) \
finaltest$(EXEEXT) \
fotest$(EXEEXT) \
gcbench$(EXEEXT) \
landtest$(EXEEXT) \
locbwcss$(EXEEXT) \
lockcov$(EXEEXT) \
lockut$(EXEEXT) \
locusss$(EXEEXT) \
locv$(EXEEXT) \
messtest$(EXEEXT) \
mpmss$(EXEEXT) \
mpsicv$(EXEEXT) \
mv2test$(EXEEXT) \
nailboardtest$(EXEEXT) \
poolncv$(EXEEXT) \
qs$(EXEEXT) \
sacss$(EXEEXT) \
segsmss$(EXEEXT) \
sncss$(EXEEXT) \
steptest$(EXEEXT) \
tagtest$(EXEEXT) \
teletest$(EXEEXT) \
walkt0$(EXEEXT) \
zcoll$(EXEEXT) \
zmess$(EXEEXT) \
ztfm$(EXEEXT)
# Another deviation: MS-Windows doesn't have 'fork'.
ifneq ($(PFM),w3i3gc)
ifneq ($(PFM),w3i6gc)
TEST_TARGETS += forktest$(EXEEXT)
endif
endif
# This target records programs that we were once able to build but
# can't at the moment:
UNBUILDABLE_TARGETS=\
replay # depends on the EPVM pool
replay$(EXEEXT) # depends on the EPVM pool
ALL_TARGETS=$(LIB_TARGETS) $(TEST_TARGETS) $(EXTRA_TARGETS)
@ -454,154 +468,154 @@ $(PFM)/cool/mps.a: $(MPMOBJ)
ifdef VARIETY
$(PFM)/$(VARIETY)/abqtest: $(PFM)/$(VARIETY)/abqtest.o \
$(PFM)/$(VARIETY)/abqtest$(EXEEXT): $(PFM)/$(VARIETY)/abqtest.o \
$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/addrobj: $(PFM)/$(VARIETY)/addrobj.o \
$(PFM)/$(VARIETY)/addrobj$(EXEEXT): $(PFM)/$(VARIETY)/addrobj.o \
$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/airtest: $(PFM)/$(VARIETY)/airtest.o \
$(PFM)/$(VARIETY)/airtest$(EXEEXT): $(PFM)/$(VARIETY)/airtest.o \
$(FMTSCMOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/amcss: $(PFM)/$(VARIETY)/amcss.o \
$(PFM)/$(VARIETY)/amcss$(EXEEXT): $(PFM)/$(VARIETY)/amcss.o \
$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/amcsshe: $(PFM)/$(VARIETY)/amcsshe.o \
$(PFM)/$(VARIETY)/amcsshe$(EXEEXT): $(PFM)/$(VARIETY)/amcsshe.o \
$(FMTHETSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/amcssth: $(PFM)/$(VARIETY)/amcssth.o \
$(PFM)/$(VARIETY)/amcssth$(EXEEXT): $(PFM)/$(VARIETY)/amcssth.o \
$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(TESTTHROBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/amsss: $(PFM)/$(VARIETY)/amsss.o \
$(PFM)/$(VARIETY)/amsss$(EXEEXT): $(PFM)/$(VARIETY)/amsss.o \
$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/amssshe: $(PFM)/$(VARIETY)/amssshe.o \
$(PFM)/$(VARIETY)/amssshe$(EXEEXT): $(PFM)/$(VARIETY)/amssshe.o \
$(FMTHETSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/apss: $(PFM)/$(VARIETY)/apss.o \
$(PFM)/$(VARIETY)/apss$(EXEEXT): $(PFM)/$(VARIETY)/apss.o \
$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/arenacv: $(PFM)/$(VARIETY)/arenacv.o \
$(PFM)/$(VARIETY)/arenacv$(EXEEXT): $(PFM)/$(VARIETY)/arenacv.o \
$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/awlut: $(PFM)/$(VARIETY)/awlut.o \
$(PFM)/$(VARIETY)/awlut$(EXEEXT): $(PFM)/$(VARIETY)/awlut.o \
$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(TESTTHROBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/awluthe: $(PFM)/$(VARIETY)/awluthe.o \
$(PFM)/$(VARIETY)/awluthe$(EXEEXT): $(PFM)/$(VARIETY)/awluthe.o \
$(FMTHETSTOBJ) $(TESTLIBOBJ) $(TESTTHROBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/awlutth: $(PFM)/$(VARIETY)/awlutth.o \
$(PFM)/$(VARIETY)/awlutth$(EXEEXT): $(PFM)/$(VARIETY)/awlutth.o \
$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(TESTTHROBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/btcv: $(PFM)/$(VARIETY)/btcv.o \
$(PFM)/$(VARIETY)/btcv$(EXEEXT): $(PFM)/$(VARIETY)/btcv.o \
$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/bttest: $(PFM)/$(VARIETY)/bttest.o \
$(PFM)/$(VARIETY)/bttest$(EXEEXT): $(PFM)/$(VARIETY)/bttest.o \
$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/djbench: $(PFM)/$(VARIETY)/djbench.o \
$(PFM)/$(VARIETY)/djbench$(EXEEXT): $(PFM)/$(VARIETY)/djbench.o \
$(TESTLIBOBJ) $(TESTTHROBJ)
$(PFM)/$(VARIETY)/extcon: $(PFM)/$(VARIETY)/extcon.o \
$(PFM)/$(VARIETY)/extcon$(EXEEXT): $(PFM)/$(VARIETY)/extcon.o \
$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/finalcv: $(PFM)/$(VARIETY)/finalcv.o \
$(PFM)/$(VARIETY)/finalcv$(EXEEXT): $(PFM)/$(VARIETY)/finalcv.o \
$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/finaltest: $(PFM)/$(VARIETY)/finaltest.o \
$(PFM)/$(VARIETY)/finaltest$(EXEEXT): $(PFM)/$(VARIETY)/finaltest.o \
$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/forktest: $(PFM)/$(VARIETY)/forktest.o \
$(PFM)/$(VARIETY)/forktest$(EXEEXT): $(PFM)/$(VARIETY)/forktest.o \
$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/fotest: $(PFM)/$(VARIETY)/fotest.o \
$(PFM)/$(VARIETY)/fotest$(EXEEXT): $(PFM)/$(VARIETY)/fotest.o \
$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/gcbench: $(PFM)/$(VARIETY)/gcbench.o \
$(PFM)/$(VARIETY)/gcbench$(EXEEXT): $(PFM)/$(VARIETY)/gcbench.o \
$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(TESTTHROBJ)
$(PFM)/$(VARIETY)/landtest: $(PFM)/$(VARIETY)/landtest.o \
$(PFM)/$(VARIETY)/landtest$(EXEEXT): $(PFM)/$(VARIETY)/landtest.o \
$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/locbwcss: $(PFM)/$(VARIETY)/locbwcss.o \
$(PFM)/$(VARIETY)/locbwcss$(EXEEXT): $(PFM)/$(VARIETY)/locbwcss.o \
$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/lockcov: $(PFM)/$(VARIETY)/lockcov.o \
$(PFM)/$(VARIETY)/lockcov$(EXEEXT): $(PFM)/$(VARIETY)/lockcov.o \
$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/lockut: $(PFM)/$(VARIETY)/lockut.o \
$(PFM)/$(VARIETY)/lockut$(EXEEXT): $(PFM)/$(VARIETY)/lockut.o \
$(TESTLIBOBJ) $(TESTTHROBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/locusss: $(PFM)/$(VARIETY)/locusss.o \
$(PFM)/$(VARIETY)/locusss$(EXEEXT): $(PFM)/$(VARIETY)/locusss.o \
$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/locv: $(PFM)/$(VARIETY)/locv.o \
$(PFM)/$(VARIETY)/locv$(EXEEXT): $(PFM)/$(VARIETY)/locv.o \
$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/messtest: $(PFM)/$(VARIETY)/messtest.o \
$(PFM)/$(VARIETY)/messtest$(EXEEXT): $(PFM)/$(VARIETY)/messtest.o \
$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/mpmss: $(PFM)/$(VARIETY)/mpmss.o \
$(PFM)/$(VARIETY)/mpmss$(EXEEXT): $(PFM)/$(VARIETY)/mpmss.o \
$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/mpsicv: $(PFM)/$(VARIETY)/mpsicv.o \
$(PFM)/$(VARIETY)/mpsicv$(EXEEXT): $(PFM)/$(VARIETY)/mpsicv.o \
$(FMTDYTSTOBJ) $(FMTHETSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/mv2test: $(PFM)/$(VARIETY)/mv2test.o \
$(PFM)/$(VARIETY)/mv2test$(EXEEXT): $(PFM)/$(VARIETY)/mv2test.o \
$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/nailboardtest: $(PFM)/$(VARIETY)/nailboardtest.o \
$(PFM)/$(VARIETY)/nailboardtest$(EXEEXT): $(PFM)/$(VARIETY)/nailboardtest.o \
$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/poolncv: $(PFM)/$(VARIETY)/poolncv.o \
$(PFM)/$(VARIETY)/poolncv$(EXEEXT): $(PFM)/$(VARIETY)/poolncv.o \
$(POOLNOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/qs: $(PFM)/$(VARIETY)/qs.o \
$(PFM)/$(VARIETY)/qs$(EXEEXT): $(PFM)/$(VARIETY)/qs.o \
$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/sacss: $(PFM)/$(VARIETY)/sacss.o \
$(PFM)/$(VARIETY)/sacss$(EXEEXT): $(PFM)/$(VARIETY)/sacss.o \
$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/segsmss: $(PFM)/$(VARIETY)/segsmss.o \
$(PFM)/$(VARIETY)/segsmss$(EXEEXT): $(PFM)/$(VARIETY)/segsmss.o \
$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/sncss: $(PFM)/$(VARIETY)/sncss.o \
$(PFM)/$(VARIETY)/sncss$(EXEEXT): $(PFM)/$(VARIETY)/sncss.o \
$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/steptest: $(PFM)/$(VARIETY)/steptest.o \
$(PFM)/$(VARIETY)/steptest$(EXEEXT): $(PFM)/$(VARIETY)/steptest.o \
$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/tagtest: $(PFM)/$(VARIETY)/tagtest.o \
$(PFM)/$(VARIETY)/tagtest$(EXEEXT): $(PFM)/$(VARIETY)/tagtest.o \
$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/teletest: $(PFM)/$(VARIETY)/teletest.o \
$(PFM)/$(VARIETY)/teletest$(EXEEXT): $(PFM)/$(VARIETY)/teletest.o \
$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/walkt0: $(PFM)/$(VARIETY)/walkt0.o \
$(PFM)/$(VARIETY)/walkt0$(EXEEXT): $(PFM)/$(VARIETY)/walkt0.o \
$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/zcoll: $(PFM)/$(VARIETY)/zcoll.o \
$(PFM)/$(VARIETY)/zcoll$(EXEEXT): $(PFM)/$(VARIETY)/zcoll.o \
$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/zmess: $(PFM)/$(VARIETY)/zmess.o \
$(PFM)/$(VARIETY)/zmess$(EXEEXT): $(PFM)/$(VARIETY)/zmess.o \
$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/ztfm: $(PFM)/$(VARIETY)/ztfm.o \
$(PFM)/$(VARIETY)/ztfm$(EXEEXT): $(PFM)/$(VARIETY)/ztfm.o \
$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/mpseventcnv: $(PFM)/$(VARIETY)/eventcnv.o \
$(PFM)/$(VARIETY)/mpseventcnv$(EXEEXT): $(PFM)/$(VARIETY)/eventcnv.o \
$(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/mpseventpy: $(PFM)/$(VARIETY)/eventpy.o \
$(PFM)/$(VARIETY)/mpseventpy$(EXEEXT): $(PFM)/$(VARIETY)/eventpy.o \
$(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/mpseventtxt: $(PFM)/$(VARIETY)/eventtxt.o \
$(PFM)/$(VARIETY)/mpseventtxt$(EXEEXT): $(PFM)/$(VARIETY)/eventtxt.o \
$(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/mpseventsql: $(PFM)/$(VARIETY)/eventsql.o \
$(PFM)/$(VARIETY)/mpseventsql$(EXEEXT): $(PFM)/$(VARIETY)/eventsql.o \
$(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/replay: $(PFM)/$(VARIETY)/replay.o \
$(PFM)/$(VARIETY)/replay$(EXEEXT): $(PFM)/$(VARIETY)/replay.o \
$(PFM)/$(VARIETY)/eventrep.o \
$(PFM)/$(VARIETY)/table.o \
$(PFM)/$(VARIETY)/mps.a
@ -662,18 +676,18 @@ ifdef TARGET
# %%VARIETY: When adding a new variety, add the dependencies files for it
# here.
ifeq ($(VARIETY),rash)
include $(PFM)/$(VARIETY)/mps.d
-include $(PFM)/$(VARIETY)/mps.d
else
ifeq ($(VARIETY),hot)
include $(PFM)/$(VARIETY)/mps.d
-include $(PFM)/$(VARIETY)/mps.d
else
include $(MPM:%.c=$(PFM)/$(VARIETY)/%.d)
-include $(MPM:%.c=$(PFM)/$(VARIETY)/%.d)
endif # VARIETY != hot
endif # VARIETY != rash
# %%PART: When adding a new part, add the dependencies file for the
# new part here.
include \
-include \
$(FMTDY:%.c=$(PFM)/$(VARIETY)/%.d) \
$(FMTDYTST:%.c=$(PFM)/$(VARIETY)/%.d) \
$(FMTHETST:%.c=$(PFM)/$(VARIETY)/%.d) \
@ -704,11 +718,11 @@ $(PFM)/$(VARIETY)/%.a:
# Executable
$(PFM)/$(VARIETY)/%:
$(PFM)/$(VARIETY)/%$(EXEEXT):
$(ECHO) "$(PFM): $@"
$(CC) $(CFLAGSSTRICT) $(LINKFLAGS) -o $@ $^ $(LIBS)
$(PFM)/$(VARIETY)/mpseventsql:
$(PFM)/$(VARIETY)/mpseventsql$(EXEEXT):
$(ECHO) "$(PFM): $@"
$(CC) $(CFLAGSLAX) $(LINKFLAGS) -o $@ $^ $(LIBS) -lsqlite3

View file

@ -826,7 +826,7 @@ Bool ArenaStep(Globals globals, double interval, double multiplier)
Res ArenaFinalize(Arena arena, Ref obj)
{
Res res;
Pool refpool;
Pool refpool = NULL;
AVERT(Arena, arena);
AVER(PoolOfAddr(&refpool, arena, (Addr)obj));

View file

@ -33,6 +33,25 @@ SRCID(lockw3, "$Id$");
#if defined(LOCK)
#ifdef __MINGW32__
# if defined __MINGW32_VERSION && __MINGW32_VERSION >= 5000000L
/* mingw.org's MinGW doesn't have this stuff in its headers. */
typedef struct _RTL_RUN_ONCE { PVOID Ptr; } RTL_RUN_ONCE, *PRTL_RUN_ONCE;
typedef DWORD (WINAPI *PRTL_RUN_ONCE_INIT_FN)(PRTL_RUN_ONCE, PVOID, PVOID *);
# define RTL_RUN_ONCE_INIT {0}
# define INIT_ONCE_STATIC_INIT RTL_RUN_ONCE_INIT
typedef RTL_RUN_ONCE INIT_ONCE;
typedef PRTL_RUN_ONCE PINIT_ONCE;
typedef WINBOOL (WINAPI *PINIT_ONCE_FN) (PINIT_ONCE InitOnce, PVOID Parameter, PVOID *Context);
WINBASEAPI WINBOOL WINAPI InitOnceExecuteOnce (PINIT_ONCE InitOnce, PINIT_ONCE_FN InitFn, PVOID Parameter, LPVOID *Context);
# endif /* __MINGW32_VERSION >= 5000000L */
#endif /* __MINGW32__ */
/* .lock.win32: Win32 lock structure; uses CRITICAL_SECTION */
typedef struct LockStruct {
Sig sig; /* design.mps.sig.field */

79
mps/code/mingw.gmk Normal file
View file

@ -0,0 +1,79 @@
# -*- makefile -*-
#
# mingw.gmk: GNUMAKEFILE FRAGMENT FOR MinGW GCC
#
# $Id$
# Copyright (c) 2001-2020 Ravenbrook Limited. See end of file for license.
#
# This file is included by platform makefiles that use the GNU CC
# compiler. It defines the compiler-specific variables that the
# common makefile fragment (<code/comm.gmk>) requires.
CC = gcc
CFLAGSDEBUG = -Og -g3
CFLAGSOPT = -O2 -g3
EXEEXT = .exe
# Warnings that might be enabled by clients <design/config/#.warning.impl>.
CFLAGSCOMPILER := \
-Waggregate-return \
-Wall \
-Wcast-qual \
-Werror \
-Wextra \
-Winline \
-Wmissing-prototypes \
-Wnested-externs \
-Wpointer-arith \
-Wshadow \
-Wstrict-aliasing=2 \
-Wstrict-prototypes \
-Wswitch-default \
-Wwrite-strings
CFLAGSCOMPILERSTRICT := -std=gnu89 -pedantic
# A different set of compiler flags for less strict compilation, for
# instance when we need to #include a third-party header file that
# won't fly with -ansi -pedantic. Use sparingly!
CFLAGSCOMPILERLAX :=
# gcc -MM generates a dependency line of the form:
# thing.o : thing.c ...
# The sed line converts this into:
# <pfm>/<variety>/thing.o <pfm>/<variety>/thing.d : thing.c ...
# If interrupted, this is liable to leave a zero-length file behind.
define gendep
$(SHELL) -ec "$(CC) $(CFLAGSSTRICT) -MM $< | \
sed '/:/s!$*.o!$(@D)/& $(@D)/$*.d!' > $@"
[ -s $@ ] || rm -f $@
endef
# C. COPYRIGHT AND LICENSE
#
# Copyright (C) 2001-2020 Ravenbrook Limited <https://www.ravenbrook.com/>.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the
# distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View file

@ -228,9 +228,9 @@
#include "prmclii6.c" /* x86-64 for Linux mutator context */
#include "span.c" /* generic stack probe */
/* Windows on IA-32 with Microsoft Visual Studio or Pelles C */
/* Windows on IA-32 with Microsoft Visual Studio or Pelles C or GCC */
#elif defined(MPS_PF_W3I3MV) || defined(MPS_PF_W3I3PC)
#elif defined(MPS_PF_W3I3MV) || defined(MPS_PF_W3I3PC) || defined(MPS_PF_W3I3GC)
#include "lockw3.c" /* Windows locks */
#include "thw3.c" /* Windows threading */
@ -242,9 +242,9 @@
#include "spw3i3.c" /* Windows on IA-32 stack probe */
#include "mpsiw3.c" /* Windows interface layer extras */
/* Windows on x86-64 with Microsoft Visual Studio or Pelles C */
/* Windows on x86-64 with Microsoft Visual Studio or Pelles C or GCC */
#elif defined(MPS_PF_W3I6MV) || defined(MPS_PF_W3I6PC)
#elif defined(MPS_PF_W3I6MV) || defined(MPS_PF_W3I6PC) || defined(MPS_PF_W3I6GC)
#include "lockw3.c" /* Windows locks */
#include "thw3.c" /* Windows threading */

View file

@ -20,6 +20,11 @@ SRCID(mpsiw3, "$Id$");
/* This is defined in protw3.c */
extern LONG WINAPI ProtSEHfilter(LPEXCEPTION_POINTERS info);
/* These seem to be unused, but MinGW GCC complains about lack of
previous prototype. */
LONG mps_SEH_filter(LPEXCEPTION_POINTERS, void **, size_t *);
void mps_SEH_handler(void *, size_t);
LONG mps_SEH_filter(LPEXCEPTION_POINTERS info,
void **hp_o, size_t *hs_o)
{

View file

@ -392,6 +392,38 @@
#define MPS_PF_ALIGN 8
#elif defined(__MINGW32__) && defined(_X86_) && defined(__GNUC__)
#if defined(CONFIG_PF_STRING) && ! defined(CONFIG_PF_W3I3GC)
#error "specified CONFIG_PF_... inconsistent with detected w3i3gc"
#endif
#define MPS_PF_W3I3GC
#define MPS_PF_STRING "w3i3gc"
#define MPS_OS_W3
#define MPS_ARCH_I3
#define MPS_BUILD_GC
#define MPS_T_WORD unsigned long
#define MPS_T_ULONGEST unsigned long
#define MPS_WORD_WIDTH 32
#define MPS_WORD_SHIFT 5
#define MPS_PF_ALIGN 4
#elif defined(__MINGW64__) && defined(__x86_64) && defined(__GNUC__)
# if defined(CONFIG_PF_STRING) && ! defined(CONFIG_PF_W3I6GC)
# error "specified CONFIG_PF_... inconsistent with detected w3i6gc"
# endif
#define MPS_PF_W3I6GC
#define MPS_PF_STRING "w3i6gc"
#define MPS_OS_W3
#define MPS_ARCH_I6
#define MPS_BUILD_GC
#define MPS_T_WORD unsigned __int64
#define MPS_T_ULONGEST unsigned __int64
#define MPS_WORD_WIDTH 64
#define MPS_WORD_SHIFT 6
#define MPS_PF_ALIGN 16
#else
#error "The MPS Kit does not have a configuration for this platform out of the box; see manual/build.txt"
#endif

View file

@ -36,6 +36,7 @@ void ProtSet(Addr base, Addr limit, AccessSet mode)
NOTREACHED;
}
LONG WINAPI ProtSEHfilter(LPEXCEPTION_POINTERS);
LONG WINAPI ProtSEHfilter(LPEXCEPTION_POINTERS info)
{

View file

@ -27,11 +27,20 @@
void StackProbe(Size depth)
{
#ifdef __GNUC__
__asm__ volatile ("mov %0, %%eax\n\t"
"neg %%eax\n\t"
"mov (%%esp,%%eax,4), %%eax" /* do the actual probe */
: /* no outputs */
: "r" (depth)
: "eax");
#else /* MSVC */
__asm {
mov eax, depth
neg eax
mov eax, [esp+eax*4] /* do the actual probe */
}
#endif
}

View file

@ -23,7 +23,6 @@
SRCID(ss, "$Id$");
/* StackHot -- capture a hot stack pointer
*
* On all supported platforms, the arguments are pushed on to the
@ -32,12 +31,23 @@ SRCID(ss, "$Id$");
* is a hot stack pointer. <design/ss#.sol.stack.hot>.
*/
#ifdef __MINGW32__
#pragma GCC diagnostic push
#if defined(MPS_BUILD_GC) && (__GNUC__ >= 12)
#pragma GCC diagnostic ignored "-Wdangling-pointer"
#endif
#endif
ATTRIBUTE_NOINLINE
void StackHot(void **stackOut)
{
*stackOut = &stackOut;
}
#ifdef __MINGW32__
#pragma GCC diagnostic pop
#endif
/* StackScan -- scan the mutator's stack and registers */

View file

@ -221,7 +221,14 @@ double rnd_double(void)
static unsigned sizelog2(size_t size)
{
#ifdef __MINGW32__
/* For some reason, MinGW sometimes produces a value slightly
smaller than the expected one, so we round up to the next FP
value. */
return (unsigned)(log((double)size) / log(2.0) * (1.0 + __DBL_EPSILON__));
#else
return (unsigned)(log((double)size) / log(2.0));
#endif
}
size_t rnd_grain(size_t arena_size)
@ -232,17 +239,17 @@ size_t rnd_grain(size_t arena_size)
return rnd_align(sizeof(void *), (size_t)1 << sizelog2(arena_size >> MPS_WORD_SHIFT));
}
size_t rnd_align(size_t min, size_t max)
size_t rnd_align(size_t minv, size_t maxv)
{
unsigned log2min = sizelog2(min);
unsigned log2max = sizelog2(max);
Insist(min <= max);
Insist((size_t)1 << log2min == min);
Insist((size_t)1 << log2max == max);
unsigned log2min = sizelog2(minv);
unsigned log2max = sizelog2(maxv);
Insist(minv <= maxv);
Insist((size_t)1 << log2min == minv);
Insist((size_t)1 << log2max == maxv);
if (log2min < log2max)
return min << (rnd() % (log2max - log2min + 1));
return minv << (rnd() % (log2max - log2min + 1));
else
return min;
return minv;
}
double rnd_pause_time(void)

View file

@ -67,11 +67,11 @@
/* alloca -- memory allocator
*
* Windows calls this function _alloca() instead of alloca().
* Windows (but not MinGW) calls this function _alloca() instead of alloca().
* <https://docs.microsoft.com/en-gb/cpp/c-runtime-library/reference/alloca>
*/
#if defined(MPS_OS_W3)
#if defined(MPS_OS_W3) && !defined(__GNUC__)
#define alloca _alloca
@ -82,11 +82,12 @@
*
* Windows lacks setenv(), but _putenv_s() has similar functionality.
* <https://docs.microsoft.com/en-gb/cpp/c-runtime-library/reference/putenv-s-wputenv-s>
* mingw.org's MinGW does have setenv, but MinGW64 doesn't.
*
* This macro version may evaluate the name argument twice.
*/
#if defined(MPS_OS_W3)
#if defined(MPS_OS_W3) && !defined(MPS_PF_W3I3GC)
#define setenv(name, value, overwrite) \
(((overwrite) || !getenv(name)) ? _putenv_s(name, value) : 0)
@ -118,8 +119,13 @@
#define SCNuLONGEST "llu"
#define SCNXLONGEST "llX"
#define PRIXLONGEST "llX"
#ifdef __GNUC__
typedef unsigned __int64 ulongest_t;
typedef __int64 longest_t;
#else
typedef unsigned long long ulongest_t;
typedef long long longest_t;
#endif
#define MPS_WORD_CONST(n) (n##ull)
#else
#define PRIuLONGEST "lu"

View file

@ -259,7 +259,7 @@ Res ThreadDescribe(Thread thread, mps_lib_FILE *stream, Count depth)
}
Res ThreadScan(ScanState ss, Thread thread, Word *stackCold,
Res ThreadScan(ScanState ss, Thread thread, void *stackCold,
mps_area_scan_t scan_area, void *closure)
{
DWORD id;
@ -285,7 +285,7 @@ Res ThreadScan(ScanState ss, Thread thread, Word *stackCold,
stackPtr = MutatorContextSP(&context);
/* .stack.align */
stackBase = (Word *)AddrAlignUp(stackPtr, sizeof(Word));
stackLimit = stackCold;
stackLimit = (Word *)stackCold;
if (stackBase >= stackLimit)
return ResOK; /* .stack.below-bottom */

50
mps/code/w3i3gc.gmk Normal file
View file

@ -0,0 +1,50 @@
# -*- makefile -*-
#
# w3i3gc.gmk: BUILD FOR Windows/x86/MinGW PLATFORM
#
# $Id$
# Copyright (c) 2001-2020 Ravenbrook Limited. See end of file for license.
PFM = w3i3gc
MPMPF = \
lockw3.c \
mpsiw3.c \
prmci3.c \
prmcw3.c \
prmcw3i3.c \
protw3.c \
spw3i3.c \
thw3.c \
vmw3.c
include mingw.gmk
include comm.gmk
# C. COPYRIGHT AND LICENSE
#
# Copyright (C) 2001-2020 Ravenbrook Limited <https://www.ravenbrook.com/>.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the
# distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

55
mps/code/w3i6gc.gmk Normal file
View file

@ -0,0 +1,55 @@
# -*- makefile -*-
#
# w3i6gc.gmk: BUILD FOR Windows/x86_64/MinGW PLATFORM
#
# $Id$
# Copyright (c) 2001-2020 Ravenbrook Limited. See end of file for license.
PFM = w3i6gc
MPMPF = \
lockw3.c \
mpsiw3.c \
prmci6.c \
prmcw3.c \
prmcw3i6.c \
protw3.c \
spw3i6.c \
thw3.c \
vmw3.c
# Must be before including comm.gmk, since it uses CFLAGS
CFLAGS = -Wno-pointer-to-int-cast -Wno-int-to-pointer-cast
include mingw.gmk
include comm.gmk
CFLAGSCOMPILERSTRICT := -std=gnu99 -pedantic
# C. COPYRIGHT AND LICENSE
#
# Copyright (C) 2001-2020 Ravenbrook Limited <https://www.ravenbrook.com/>.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the
# distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.