From ba7e2f11ecc0f90e688984e0e05ef8b6b618db43 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Tue, 25 Aug 2015 16:43:56 -0600 Subject: [PATCH] repair MinGW32 builds Also, change floating-point handling to be like the MSVC build by default, where the process is left in double-precision mode and the mode is changed for exfl operations. Includes repairs for integer-size mismatches in uses of Windows threads. --- racket/src/README | 7 -- racket/src/foreign/foreign.c | 8 +-- racket/src/foreign/foreign.rktc | 8 +-- racket/src/racket/Makefile.in | 7 ++ racket/src/racket/cmdline.inc | 2 +- racket/src/racket/gc2/Makefile.in | 8 ++- racket/src/racket/include/scheme.h | 2 +- racket/src/racket/sconfig.h | 16 +++-- racket/src/racket/src/longdouble/longdouble.c | 2 +- racket/src/racket/src/longdouble/longdouble.h | 10 ++- racket/src/racket/src/mzrt.c | 31 ++++++--- racket/src/racket/src/mzrt.h | 9 ++- racket/src/racket/src/mzsj86g.S | 67 +++++++++++++++++-- racket/src/racket/src/network.c | 12 +++- racket/src/racket/src/setjmpup.c | 22 ++++++ racket/src/worksp/gracket/gracket.rc | 9 +++ racket/src/worksp/racket/racket.rc | 9 +++ 17 files changed, 180 insertions(+), 49 deletions(-) diff --git a/racket/src/README b/racket/src/README index 93323f5d56..7b3d953b0e 100644 --- a/racket/src/README +++ b/racket/src/README @@ -36,13 +36,6 @@ result is a Unix-style build, not a Windows-style build (e.g., Racket's `system-type' procedure returns 'unix, not 'windows, and `racket/gui' uses Gtk instead of Win32). -Beware that MinGW/Cygwin builds different from the MSVC build when -SSE-based floating-point math is enabled in the C compiler. In that -case, Racket includes sets the floating-point mode to extended -precision to support extflonums, and changing precision may affect -other libraries. To avoid the floating-point mode change, disable -extflonum support with `--disable-extflonum'. - ======================================================================== Compiling for Mac OS X ======================================================================== diff --git a/racket/src/foreign/foreign.c b/racket/src/foreign/foreign.c index 1bf1c897dd..28657f947a 100644 --- a/racket/src/foreign/foreign.c +++ b/racket/src/foreign/foreign.c @@ -3877,7 +3877,7 @@ typedef struct Queued_Callback { typedef struct FFI_Sync_Queue { Queued_Callback *callbacks; /* malloc()ed list */ mzrt_mutex *lock; - mzrt_thread_id orig_thread; + mzrt_os_thread_id orig_thread; void *sig_hand; } FFI_Sync_Queue; @@ -3987,7 +3987,7 @@ static void ffi_queue_callback(ffi_cif* cif, void* resultp, void** args, void *u queue = (FFI_Sync_Queue *)(data)[1]; userdata = (data)[0]; - if (queue->orig_thread != mz_proc_thread_self()) { + if (queue->orig_thread != mz_proc_os_thread_self()) { if (data[2]) { /* constant result */ memcpy(resultp, data[2], (intptr_t)data[3]); @@ -4141,11 +4141,11 @@ static Scheme_Object *foreign_ffi_callback(int argc, Scheme_Object *argv[]) if (((argc > 5) && SCHEME_TRUEP(argv[5]))) { # ifdef MZ_USE_MZRT if (!ffi_sync_queue) { - mzrt_thread_id tid; + mzrt_os_thread_id tid; void *sig_hand; ffi_sync_queue = (FFI_Sync_Queue *)malloc(sizeof(FFI_Sync_Queue)); - tid = mz_proc_thread_self(); + tid = mz_proc_os_thread_self(); ffi_sync_queue->orig_thread = tid; mzrt_mutex_create(&ffi_sync_queue->lock); sig_hand = scheme_get_signal_handle(); diff --git a/racket/src/foreign/foreign.rktc b/racket/src/foreign/foreign.rktc index 22a871fccc..d54571a928 100755 --- a/racket/src/foreign/foreign.rktc +++ b/racket/src/foreign/foreign.rktc @@ -3039,7 +3039,7 @@ typedef struct Queued_Callback { typedef struct FFI_Sync_Queue { Queued_Callback *callbacks; /* malloc()ed list */ mzrt_mutex *lock; - mzrt_thread_id orig_thread; + mzrt_os_thread_id orig_thread; void *sig_hand; } FFI_Sync_Queue; @@ -3149,7 +3149,7 @@ static void ffi_queue_callback(ffi_cif* cif, void* resultp, void** args, void *u queue = (FFI_Sync_Queue *)(data)[1]; userdata = (data)[0]; - if (queue->orig_thread != mz_proc_thread_self()) { + if (queue->orig_thread != mz_proc_os_thread_self()) { if (data[2]) { /* constant result */ memcpy(resultp, data[2], (intptr_t)data[3]); @@ -3301,11 +3301,11 @@ static void free_cl_cif_queue_args(void *ignored, void *p) if (((argc > 5) && SCHEME_TRUEP(argv[5]))) { @@IFDEF{MZ_USE_MZRT}{ if (!ffi_sync_queue) { - mzrt_thread_id tid; + mzrt_os_thread_id tid; void *sig_hand; ffi_sync_queue = (FFI_Sync_Queue *)malloc(sizeof(FFI_Sync_Queue)); - tid = mz_proc_thread_self(); + tid = mz_proc_os_thread_self(); ffi_sync_queue->orig_thread = tid; mzrt_mutex_create(&ffi_sync_queue->lock); sig_hand = scheme_get_signal_handle(); diff --git a/racket/src/racket/Makefile.in b/racket/src/racket/Makefile.in index 7e1ad7ad1f..d5c7edcca6 100644 --- a/racket/src/racket/Makefile.in +++ b/racket/src/racket/Makefile.in @@ -401,11 +401,16 @@ mingw-install: cd ..; rm -f "$(DESTDIR)@MZINSTALLBINDIR@/racket@MMM_INSTALLED@" cd ..; cp racket/starter@EXE_SUFFIX@ "$(DESTDIR)$(libpltdir)/MzStart@EXE_SUFFIX@" cd ..; cp racket/mrstarter@EXE_SUFFIX@ "$(DESTDIR)$(libpltdir)/MrStart@EXE_SUFFIX@" + cd ..; $(STRIP_DEBUG) "$(DESTDIR)$(libpltdir)/MzStart@EXE_SUFFIX@" + cd ..; $(STRIP_DEBUG) "$(DESTDIR)$(libpltdir)/MrStart@EXE_SUFFIX@" mingw-install-cgc: cd ..; $(ICP) racket/lib/libmzgcxxxxxxx.dll "$(DESTDIR)$(libdir)/libmzgcxxxxxxx.dll" cd ..; $(ICP) racket/lib/libracketxxxxxxx.dll "$(DESTDIR)$(libdir)/libracketxxxxxxx.dll" cd ..; $(ICP) racket/racket@CGC@ "$(DESTDIR)@MZINSTALLBINDIR@/Racket@CGC_INSTALLED@@EXE_SUFFIX@" + cd ..; $(STRIP_DEBUG) "$(DESTDIR)$(libdir)/libmzgcxxxxxxx.dll" + cd ..; $(STRIP_DEBUG) "$(DESTDIR)$(libdir)/libracketxxxxxxx.dll" + cd ..; $(STRIP_DEBUG) "$(DESTDIR)@MZINSTALLBINDIR@/Racket@CGC_INSTALLED@@EXE_SUFFIX@" @RUN_RACKET_CGC@ -cu "$(srcdir)/collects-path.rkt" @DIRCVTPRE@"$(DESTDIR)@MZINSTALLBINDIR@/Racket@CGC_INSTALLED@@EXE_SUFFIX@"@DIRCVTPOST@ $(DESTDIR)@COLLECTS_PATH@ $(DESTDIR)@CONFIG_PATH@ mingw-install-cgc-final: @@ -414,6 +419,8 @@ mingw-install-cgc-final: mingw-install-3m: cd ..; $(ICP) racket/racket@MMM@ "$(DESTDIR)@MZINSTALLBINDIR@/Racket@MMM_INSTALLED@@EXE_SUFFIX@" cd ..; $(ICP) racket/lib/libracket3mxxxxxxx.dll "$(DESTDIR)$(libdir)/libracket3mxxxxxxx.dll" + cd ..; $(STRIP_DEBUG) "$(DESTDIR)@MZINSTALLBINDIR@/Racket@MMM_INSTALLED@@EXE_SUFFIX@" + cd ..; $(STRIP_DEBUG) "$(DESTDIR)$(libdir)/libracket3mxxxxxxx.dll" @RUN_RACKET_MMM@ -cu "$(srcdir)/collects-path.rkt" @DIRCVTPRE@"$(DESTDIR)@MZINSTALLBINDIR@/Racket@MMM_INSTALLED@@EXE_SUFFIX@"@DIRCVTPOST@ $(DESTDIR)@COLLECTS_PATH@ $(DESTDIR)@CONFIG_PATH@ mingw-install-3m-final: diff --git a/racket/src/racket/cmdline.inc b/racket/src/racket/cmdline.inc index 520b641102..ddee9ad5c3 100644 --- a/racket/src/racket/cmdline.inc +++ b/racket/src/racket/cmdline.inc @@ -159,7 +159,7 @@ wchar_t *get_self_executable_path() static DWORD find_by_id(HANDLE fd, DWORD rsrcs, DWORD pos, int id) { DWORD got, val; - WORD name_count, id_count, i; + WORD name_count, id_count; SetFilePointer(fd, pos + 12, 0, FILE_BEGIN); ReadFile(fd, &name_count, 2, &got, NULL); diff --git a/racket/src/racket/gc2/Makefile.in b/racket/src/racket/gc2/Makefile.in index ebb58455a1..e2051fd08a 100644 --- a/racket/src/racket/gc2/Makefile.in +++ b/racket/src/racket/gc2/Makefile.in @@ -181,7 +181,11 @@ xsrc: xobjects: $(OBJS) main.@LTO@ -XFORMDEP_NOPRE = $(srcdir)/xform.rkt $(srcdir)/xform-mod.rkt +# These headers have only preprocessor definitions, so they're not +# picked up in ".sdep": +QUIET_DEPS = $(srcdir)/../src/schvers.h $(srcdir)/../sconfig.h ../mzconfig.h + +XFORMDEP_NOPRE = $(srcdir)/xform.rkt $(srcdir)/xform-mod.rkt $(QUIET_DEPS) XFORMDEP = $(XFORMDEP_NOPRE) $(XSRCDIR)/precomp.h MZRTDEP = $(srcdir)/../src/schpriv.h $(srcdir)/../include/scheme.h \ @@ -193,7 +197,7 @@ MZRTDEP = $(srcdir)/../src/schpriv.h $(srcdir)/../include/scheme.h \ check-sdep : @RUN_RACKET_CGC@ $(SELF_RACKET_FLAGS) -cqu $(srcdir)/check-sdep.rkt -$(XSRCDIR)/precomp.h : $(XFORMDEP_NOPRE) $(srcdir)/../src/schvers.h +$(XSRCDIR)/precomp.h : $(XFORMDEP_NOPRE) env XFORM_PRECOMP=yes $(XFORM_NOPRECOMP) $(XSRCDIR)/precomp.h $(srcdir)/precomp.c $(XSRCDIR)/salloc.c: $(XFORMDEP) diff --git a/racket/src/racket/include/scheme.h b/racket/src/racket/include/scheme.h index 91a5d30b88..71f7620a31 100644 --- a/racket/src/racket/include/scheme.h +++ b/racket/src/racket/include/scheme.h @@ -84,7 +84,7 @@ #endif #ifdef MZ_LONG_DOUBLE -# if defined(_MSC_VER) +# ifdef MZ_LONG_DOUBLE_API_IS_EXTERNAL # define BYTES_RESERVED_FOR_LONG_DOUBLE 16 typedef struct { char bytes[BYTES_RESERVED_FOR_LONG_DOUBLE]; diff --git a/racket/src/racket/sconfig.h b/racket/src/racket/sconfig.h index bc26e02c9a..f308a5aa76 100644 --- a/racket/src/racket/sconfig.h +++ b/racket/src/racket/sconfig.h @@ -660,7 +660,7 @@ # define DO_STACK_CHECK # define WINDOWS_FIND_STACK_BOUNDS -# if !defined(_WIN64) || (_MSC_VER >= 1600) +# if !defined(_WIN64) || (_MSC_VER >= 1600) || defined(__MINGW32__) # define USE_MZ_SETJMP # endif @@ -729,14 +729,18 @@ # define IGNORE_BY_BORLAND_CONTROL_87 #endif -#if defined(_MSC_VER) +#if defined(__MINGW32__) && defined(USE_DIRECT_LONG_DOUBLE) +/* Beware: different from the MSVC build when SSE-based floating-point + math is enabled in the C compiler. Sets the floating-point mode to + extended precision to support extflonums, and changing precision + may affect other libraries. */ +# define MZ_TRY_EXTFLONUMS +# define ASM_DBLPREC_CONTROL_87 +#else # define MZ_LONG_DOUBLE # define IGNORE_BY_MS_CONTROL_87 # define MZ_NEED_SET_EXTFL_MODE -#endif -#if defined(__MINGW32__) -# define MZ_TRY_EXTFLONUMS -# define ASM_DBLPREC_CONTROL_87 +# define MZ_LONG_DOUBLE_API_IS_EXTERNAL #endif # define REGISTER_POOR_MACHINE diff --git a/racket/src/racket/src/longdouble/longdouble.c b/racket/src/racket/src/longdouble/longdouble.c index 99dac4e9a6..7460bc7e13 100644 --- a/racket/src/racket/src/longdouble/longdouble.c +++ b/racket/src/racket/src/longdouble/longdouble.c @@ -740,7 +740,7 @@ void set_long_double(long_double a, long_double b) { _imp_set_long_double(a, b); long_double long_double_from_int(int a) { return _imp_long_double_from_int(a); } long_double long_double_from_float(float a) { return _imp_long_double_from_float(a); } long_double long_double_from_double(double a) { return _imp_long_double_from_double(a); } -long_double long_double_from_intptr(uintptr_t a) { return _imp_long_double_from_intptr(a); } +long_double long_double_from_intptr(intptr_t a) { return _imp_long_double_from_intptr(a); } long_double long_double_from_uintptr(uintptr_t a) { return _imp_long_double_from_uintptr(a); } double double_from_long_double(long_double a) { return _imp_double_from_long_double(a); } diff --git a/racket/src/racket/src/longdouble/longdouble.h b/racket/src/racket/src/longdouble/longdouble.h index f9eca1c3e2..71318f6310 100644 --- a/racket/src/racket/src/longdouble/longdouble.h +++ b/racket/src/racket/src/longdouble/longdouble.h @@ -1,12 +1,10 @@ #ifndef MZ_LONGDOUBLE_H #define MZ_LONGDOUBLE_H -#if defined(_MSC_VER) -# define MZ_LONG_DOUBLE_API_IS_EXTERNAL -#endif - -#if defined(__MINGW32__) && defined(MZ_LONG_DOUBLE) -# define LONG_DOUBLE_STRING_OP_API_IS_EXTERNAL +#ifndef MZ_LONG_DOUBLE_API_IS_EXTERNAL +# if defined(__MINGW32__) && defined(MZ_LONG_DOUBLE) +# define LONG_DOUBLE_STRING_OP_API_IS_EXTERNAL +# endif #endif #if defined(MZ_LONG_DOUBLE_API_IS_EXTERNAL) \ diff --git a/racket/src/racket/src/mzrt.c b/racket/src/racket/src/mzrt.c index 0765aa89d6..f5a5823a8c 100644 --- a/racket/src/racket/src/mzrt.c +++ b/racket/src/racket/src/mzrt.c @@ -153,6 +153,9 @@ typedef struct mzrt_thread_stub_data { mz_proc_thread_start start_proc; void *data; mz_proc_thread *thread; +#ifdef WIN32 + void *res; +#endif } mzrt_thread_stub_data; void *mzrt_thread_stub(void *data){ @@ -169,6 +172,10 @@ void *mzrt_thread_stub(void *data){ res = start_proc(start_proc_data); +#ifdef WIN32 + proc_thread_self->res = res; +#endif + if (!--proc_thread_self->refcount) free(proc_thread_self); @@ -178,15 +185,18 @@ void *mzrt_thread_stub(void *data){ } #ifdef WIN32 -DWORD WINAPI mzrt_win_thread_stub(void *data) +unsigned int WINAPI mzrt_win_thread_stub(void *data) { - return (DWORD)mzrt_thread_stub(data); + (void)mzrt_thread_stub(data); + return 0; } #endif -mzrt_thread_id mz_proc_thread_self() { +mzrt_os_thread_id mz_proc_os_thread_self() { #ifdef WIN32 + /* For Windows, this result is not compatible with mz_proc_thread_id(), + so don't mix them up! */ return GetCurrentThreadId(); #else return pthread_self(); @@ -201,7 +211,14 @@ mzrt_thread_id mz_proc_thread_id(mz_proc_thread* thread) { mz_proc_thread* mzrt_proc_first_thread_init() { /* initialize mz_proc_thread struct for first thread that wasn't created with mz_proc_thread_create */ mz_proc_thread *thread = (mz_proc_thread*)malloc(sizeof(mz_proc_thread)); +#ifdef WIN32 + /* This pseudo-handle is not valid as a reference from any other thread, + but it will be distinct from all other IDs: */ + thread->threadid = GetCurrentThread(); +#else thread->threadid = mz_proc_thread_self(); +#endif + proc_thread_self = thread; thread->refcount = 1; return thread; @@ -234,7 +251,7 @@ mz_proc_thread* mz_proc_thread_create_w_stacksize(mz_proc_thread_start start_pro stub_data->thread = thread; # ifdef WIN32 thread->threadid = (HANDLE)_beginthreadex(NULL, stacksize, mzrt_win_thread_stub, stub_data, 0, NULL); - ok = (thread->threadid != -1L); + ok = (thread->threadid != (HANDLE)-1L); # else # ifdef NEED_GC_THREAD_OPS ok = !GC_pthread_create(&thread->threadid, attr, mzrt_thread_stub, stub_data); @@ -277,10 +294,8 @@ mz_proc_thread* mz_proc_thread_create(mz_proc_thread_start start_proc, void* dat void * mz_proc_thread_wait(mz_proc_thread *thread) { void *rc; #ifdef WIN32 - DWORD rcw; WaitForSingleObject(thread->threadid,INFINITE); - GetExitCodeThread(thread->threadid, &rcw); - rc = (void *)rcw; + rc = proc_thread_self->res; CloseHandle(thread->threadid); #else # ifdef NEED_GC_THREAD_OPS @@ -613,7 +628,7 @@ int mzrt_sema_destroy(mzrt_sema *s) #ifdef WIN32 -typedef struct mzrt_rwlock { +struct mzrt_rwlock { HANDLE readEvent; HANDLE writeMutex; LONG readers; diff --git a/racket/src/racket/src/mzrt.h b/racket/src/racket/src/mzrt.h index 1a1684cf5d..2eee24a79a 100644 --- a/racket/src/racket/src/mzrt.h +++ b/racket/src/racket/src/mzrt.h @@ -21,16 +21,21 @@ void mzrt_set_user_break_handler(void (*user_break_handler)(int)); #if (defined(__WIN32__) || defined(WIN32) || defined(_WIN32)) # include -typedef DWORD mzrt_thread_id; +typedef HANDLE mzrt_thread_id; +typedef DWORD mzrt_os_thread_id; #else #include typedef pthread_t mzrt_thread_id; +typedef pthread_t mzrt_os_thread_id; #endif typedef struct mz_proc_thread { mzrt_thread_id threadid; int refcount; +#if (defined(__WIN32__) || defined(WIN32) || defined(_WIN32)) + void *res; +#endif } mz_proc_thread; @@ -45,7 +50,7 @@ void mz_proc_thread_exit(void *rc); void mzrt_sleep(int seconds); -mzrt_thread_id mz_proc_thread_self(); +mzrt_os_thread_id mz_proc_os_thread_self(); mzrt_thread_id mz_proc_thread_id(mz_proc_thread* thread); /****************** THREAD RWLOCK ******************************************/ diff --git a/racket/src/racket/src/mzsj86g.S b/racket/src/racket/src/mzsj86g.S index 9d3da068dd..30ca6dffea 100644 --- a/racket/src/racket/src/mzsj86g.S +++ b/racket/src/racket/src/mzsj86g.S @@ -1,8 +1,65 @@ -#ifndef _WIN64 +#ifdef _WIN64 .globl _scheme_mz_setjmp _scheme_mz_setjmp: - push %EBP + + mov %RBX, (%RCX) + mov %RBP, 0x08(%RCX) + mov %RDI, 0x10(%RCX) + mov %RSI, 0x18(%RCX) + mov %RSP, 0x20(%RCX) + mov %R12, 0x28(%RCX) + mov %R13, 0x30(%RCX) + mov %R14, 0x38(%RCX) + mov %R15, 0x40(%RCX) + stmxcsr 0x48(%RCX) + movdqu %XMM6, 0x50(%RCX) + movdqu %XMM7, 0x60(%RCX) + movdqu %XMM8, 0x70(%RCX) + movdqu %XMM9, 0x80(%RCX) + movdqu %XMM10, 0x90(%RCX) + movdqu %XMM11, 0x0A0(%RCX) + movdqu %XMM12, 0x0B0(%RCX) + movdqu %XMM13, 0x0C0(%RCX) + movdqu %XMM14, 0x0D0(%RCX) + movdqu %XMM15, 0x0E0(%RCX) + mov (%RSP), %RAX + mov %RAX, 0x0F0(%RCX) + mov $0, %RAX + ret + +.globl _scheme_mz_longjmp +_scheme_mz_longjmp: + mov (%RCX), %RBX + mov 0x08(%RCX), %RBP + mov 0x10(%RCX), %RDI + mov 0x18(%RCX), %RSI + mov 0x20(%RCX), %RSP + mov 0x28(%RCX), %R12 + mov 0x30(%RCX), %R13 + mov 0x38(%RCX), %R14 + mov 0x40(%RCX), %R15 + ldmxcsr 0x48(%RCX) + movdqu 0x50(%RCX), %XMM6 + movdqu 0x60(%RCX), %XMM7 + movdqu 0x70(%RCX), %XMM8 + movdqu 0x80(%RCX), %XMM9 + movdqu 0x90(%RCX), %XMM10 + movdqu 0x0A0(%RCX), %XMM11 + movdqu 0x0B0(%RCX), %XMM12 + movdqu 0x0C0(%RCX), %XMM13 + movdqu 0x0D0(%RCX), %XMM14 + movdqu 0x0E0(%RCX), %XMM15 + mov 0x0F0(%RCX), %RAX + mov %RAX, (%RSP) + mov %RDX, %RAX + ret + +#else + +.globl _scheme_mz_setjmp +_scheme_mz_setjmp: + push %EBP mov %ESP, %EBP mov 4(%EBP), %ECX # return address mov 8(%EBP), %EAX # jmp_buf ptr @@ -34,10 +91,10 @@ _scheme_mz_longjmp: mov %ECX, 4(%EBP) pop %EBP ret - + +#endif + .section .drectve,"r" .ascii " -export:scheme_mz_setjmp" .section .drectve,"r" .ascii " -export:scheme_mz_longjmp" - -#endif diff --git a/racket/src/racket/src/network.c b/racket/src/racket/src/network.c index 565d7292d7..77b29894ad 100644 --- a/racket/src/racket/src/network.c +++ b/racket/src/racket/src/network.c @@ -597,6 +597,14 @@ static intptr_t getaddrinfo_in_thread(void *_data) return 1; } +#ifdef USE_WINSOCK_TCP +static unsigned int WINAPI win_getaddrinfo_in_thread(void *_data) + XFORM_SKIP_PROC +{ + return (unsigned int)getaddrinfo_in_thread(_data); +} +#endif + static void release_ghbn_lock(GHBN_Rec *rec) { ghbn_thread_data->ghbn_lock = 0; @@ -701,13 +709,13 @@ static int MZ_GETADDRINFO(const char *name, const char *svc, struct mz_addrinfo # ifdef USE_WINSOCK_TCP { HANDLE ready_sema; - DWORD id; + unsigned int id; intptr_t th; ready_sema = CreateSemaphore(NULL, 0, 1, NULL); ghbn_thread_data->ready_sema = ready_sema; th = _beginthreadex(NULL, 5000, - (MZ_LPTHREAD_START_ROUTINE)getaddrinfo_in_thread, + win_getaddrinfo_in_thread, ghbn_thread_data, 0, &id); WaitForSingleObject(ghbn_thread_data->ready_sema, INFINITE); CloseHandle(ghbn_thread_data->ready_sema); diff --git a/racket/src/racket/src/setjmpup.c b/racket/src/racket/src/setjmpup.c index e5e29aa4c6..8c18c5d660 100644 --- a/racket/src/racket/src/setjmpup.c +++ b/racket/src/racket/src/setjmpup.c @@ -739,3 +739,25 @@ Scheme_Setjmp_Proc scheme_get_mz_setjmp(void) return NULL; } #endif + +#if defined(USE_MZ_SETJMP_INDIRECT) && defined(__MINGW32__) +extern int _scheme_mz_setjmp(mz_pre_jmp_buf b); +extern void _scheme_mz_longjmp(mz_pre_jmp_buf b, int v); + +Scheme_Setjmp_Proc scheme_get_mz_setjmp(void) +{ + return _scheme_mz_setjmp; +} + +void scheme_mz_longjmp(mz_pre_jmp_buf b, int v) +{ + _scheme_mz_longjmp(b, v); +} + +int scheme_mz_setjmp(mz_pre_jmp_buf b) +{ + scheme_log_abort("internal error: setjmp wasn't indirect"); + abort(); + return 0; +} +#endif diff --git a/racket/src/worksp/gracket/gracket.rc b/racket/src/worksp/gracket/gracket.rc index bf333838e4..25b8eda60d 100644 --- a/racket/src/worksp/gracket/gracket.rc +++ b/racket/src/worksp/gracket/gracket.rc @@ -8,6 +8,15 @@ APPLICATION ICON DISCARDABLE "gracket.ico" +///////////////////////////////////////////////////////////////////////////// +// +// Manifest (for MinGW) +// + +#ifdef __MINGW32__ +1 RT_MANIFEST "gracket.manifest" +#endif + ///////////////////////////////////////////////////////////////////////////// // // Version diff --git a/racket/src/worksp/racket/racket.rc b/racket/src/worksp/racket/racket.rc index 9ec9edb06f..8daf0caf81 100644 --- a/racket/src/worksp/racket/racket.rc +++ b/racket/src/worksp/racket/racket.rc @@ -8,6 +8,15 @@ APPLICATION ICON DISCARDABLE "racket.ico" +///////////////////////////////////////////////////////////////////////////// +// +// Manifest (for MinGW) +// + +#ifdef __MINGW32__ +1 RT_MANIFEST "racket.manifest" +#endif + ///////////////////////////////////////////////////////////////////////////// // // Version