From cceda78374d94645f2083503371ca43b32b3b10e Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Fri, 31 Oct 2014 07:46:35 -0600 Subject: [PATCH] restore Cygwin support Fix various configuration problems, and make the build work with 3m (probably for the first time). The repairs include corrections for the manual link table, but also switch Cygwin to relying on normal DLL exports, instead, to work properly with the FFI. The `--enable-shared` comfiguration option is no longer required for Cygwin. When it is used, the `gracket` launcher does not work right, because the Cygwin DLL is in the "bin" directory and "gracket.exe" is in the "lib" directory. Along similar lines, stand-alone executables won't work with `--enable-shared`. The change to `ffi/winapi` makes it match the documentation. --- .../gui-lib/mred/private/wx/gtk/pixbuf.rkt | 4 +- .../gui-lib/mred/private/wx/gtk/win32.rkt | 5 +- racket/collects/compiler/private/xform.rkt | 2 +- racket/collects/ffi/winapi.rkt | 5 +- racket/src/README | 9 +-- racket/src/configure | 1 - racket/src/foreign/foreign.c | 3 + racket/src/foreign/foreign.rktc | 1 + racket/src/racket/configure.ac | 1 - racket/src/racket/gc2/gc2_obj.h | 2 +- racket/src/racket/gc2/page_range.c | 2 +- racket/src/racket/gc2/sighand.c | 5 +- racket/src/racket/gc2/vm.c | 72 ++++++++++-------- racket/src/racket/gc2/vm_osk.c | 4 +- racket/src/racket/gc2/vm_win.c | 76 +------------------ racket/src/racket/gc2/xform-mod.rkt | 2 +- racket/src/racket/include/mzwin.def | 3 - racket/src/racket/include/mzwin3m.def | 3 - racket/src/racket/include/racket.exp | 3 - racket/src/racket/include/racket3m.exp | 3 - racket/src/racket/include/scheme.h | 4 +- racket/src/racket/include/schthread.h | 8 +- racket/src/racket/main.c | 4 +- racket/src/racket/sconfig.h | 7 -- racket/src/racket/sgc/Makefile.in | 6 +- racket/src/racket/sgc/sgc.h | 4 +- racket/src/racket/src/eval.c | 2 +- racket/src/racket/src/list.c | 14 ++-- racket/src/racket/src/port.c | 2 +- racket/src/racket/src/salloc.c | 8 +- racket/src/racket/src/schemef.h | 10 +-- racket/src/racket/src/schemex.h | 9 +-- racket/src/racket/src/schemex.inc | 3 - racket/src/racket/src/schemexm.h | 3 - racket/src/racket/src/setjmpup.c | 21 ++--- racket/src/racket/src/symbol.c | 2 +- 36 files changed, 118 insertions(+), 195 deletions(-) diff --git a/pkgs/gui-pkgs/gui-lib/mred/private/wx/gtk/pixbuf.rkt b/pkgs/gui-pkgs/gui-lib/mred/private/wx/gtk/pixbuf.rkt index d5c2733c22..c875a4feee 100644 --- a/pkgs/gui-pkgs/gui-lib/mred/private/wx/gtk/pixbuf.rkt +++ b/pkgs/gui-pkgs/gui-lib/mred/private/wx/gtk/pixbuf.rkt @@ -37,8 +37,8 @@ #:wrap (allocator release-pixbuf)) (define-gdk gdk_cairo_set_source_pixbuf (_fun _cairo_t _GdkPixbuf _double* _double* -> _void)) -(define-gdk gdk_pixbuf_get_width (_fun _GdkPixbuf -> _int)) -(define-gdk gdk_pixbuf_get_height (_fun _GdkPixbuf -> _int)) +(define-gdk_pixbuf gdk_pixbuf_get_width (_fun _GdkPixbuf -> _int)) +(define-gdk_pixbuf gdk_pixbuf_get_height (_fun _GdkPixbuf -> _int)) (define free-it (ffi-callback free (list _pointer) diff --git a/pkgs/gui-pkgs/gui-lib/mred/private/wx/gtk/win32.rkt b/pkgs/gui-pkgs/gui-lib/mred/private/wx/gtk/win32.rkt index a741489994..2ca6e23d77 100644 --- a/pkgs/gui-pkgs/gui-lib/mred/private/wx/gtk/win32.rkt +++ b/pkgs/gui-pkgs/gui-lib/mred/private/wx/gtk/win32.rkt @@ -1,6 +1,7 @@ #lang racket/base (require ffi/unsafe ffi/unsafe/define + ffi/winapi "utils.rkt") (provide gdk_win32_drawable_get_handle @@ -20,7 +21,7 @@ (define-gdk gdk_win32_drawable_get_handle (_fun _GdkDrawable -> _pointer) #:make-fail make-not-available) -(define-user32 GetDC (_fun #:abi 'stdcall _pointer -> _pointer) +(define-user32 GetDC (_fun #:abi winapi _pointer -> _pointer) #:make-fail make-not-available) -(define-user32 ReleaseDC (_fun #:abi 'stdcall _pointer -> _void) +(define-user32 ReleaseDC (_fun #:abi winapi _pointer -> _void) #:make-fail make-not-available) diff --git a/racket/collects/compiler/private/xform.rkt b/racket/collects/compiler/private/xform.rkt index f609110066..ff36e83354 100644 --- a/racket/collects/compiler/private/xform.rkt +++ b/racket/collects/compiler/private/xform.rkt @@ -886,8 +886,8 @@ ;; they either take one argument or no pointer arguments. ;; So we can ignore them: - __get_errno_ptr ; QNX preprocesses errno to __get_errno_ptr + __getreent ; Cygwin strlen cos cosl sin sinl exp expl pow powl log logl sqrt sqrtl atan2 atan2l isnan isinf fpclass _fpclass __fpclassify __fpclassifyf __fpclassifyl diff --git a/racket/collects/ffi/winapi.rkt b/racket/collects/ffi/winapi.rkt index c1d3de4076..f0a0987ac2 100644 --- a/racket/collects/ffi/winapi.rkt +++ b/racket/collects/ffi/winapi.rkt @@ -6,4 +6,7 @@ (and (eq? 'windows (system-type)) (equal? "win32\\x86_64" (path->string (system-library-subpath #f))))) -(define winapi (if win64? 'default 'stdcall)) +(define winapi (if (or win64? + (not (eq? 'windows (system-type)))) + 'default + 'stdcall)) diff --git a/racket/src/README b/racket/src/README index ebe1d2e2fd..0a3fc3e3b7 100644 --- a/racket/src/README +++ b/racket/src/README @@ -31,11 +31,10 @@ The result is a Windows-style build, but without MzCOM. If you are using a variant of MinGW without "libdelayimp.a", get the implementation of "delayimp.c" from MinGW-w64 and compile it to "libdelayimp.a". -To compile with Cygwin tools, follow the Unix instructions below, and be -sure to configure with `--enable-shared'. The 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). +To compile with Cygwin tools, follow the Unix instructions below. The +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 diff --git a/racket/src/configure b/racket/src/configure index 0d91837c8b..48fa5f90a6 100755 --- a/racket/src/configure +++ b/racket/src/configure @@ -4584,7 +4584,6 @@ $as_echo "#define HAVE_STDINT_H 1" >>confdefs.h esac ;; cygwin*) - enable_cgcdefault="yes" MZINSTALLTARGET=unix-cygwin-install if test "${enable_shared}" = "yes" ; then ar_libtool_no_undefined=" -no-undefined" diff --git a/racket/src/foreign/foreign.c b/racket/src/foreign/foreign.c index b5be78debf..5babfa216a 100644 --- a/racket/src/foreign/foreign.c +++ b/racket/src/foreign/foreign.c @@ -267,6 +267,9 @@ static Scheme_Object *foreign_ffi_lib(int argc, Scheme_Object *argv[]) # ifdef __ANDROID__ if (!name) handle = RTLD_DEFAULT; else # endif /* __ANDROID__ */ +# ifdef __CYGWIN32__ + if (!name) { handle = RTLD_DEFAULT; null_ok = 1; } else +# endif /* __CYGWIN32__ */ handle = dlopen(name, RTLD_NOW | (as_global ? RTLD_GLOBAL : RTLD_LOCAL)); # endif /* WINDOWS_DYNAMIC_LOAD */ if (handle == NULL && !null_ok) { diff --git a/racket/src/foreign/foreign.rktc b/racket/src/foreign/foreign.rktc index f1ded27583..e67332c168 100755 --- a/racket/src/foreign/foreign.rktc +++ b/racket/src/foreign/foreign.rktc @@ -235,6 +235,7 @@ THREAD_LOCAL_DECL(static Scheme_Hash_Table *opened_libs); handle = LoadLibraryW(WIDE_PATH(name)); }{ @@IFDEF{__ANDROID__}{if (!name) handle = RTLD_DEFAULT; else} + @@IFDEF{__CYGWIN32__}{if (!name) { handle = RTLD_DEFAULT; null_ok = 1; } else} handle = dlopen(name, RTLD_NOW | (as_global ? RTLD_GLOBAL : RTLD_LOCAL)); } if (handle == NULL && !null_ok) { diff --git a/racket/src/racket/configure.ac b/racket/src/racket/configure.ac index 71884cdd86..2895aa1f38 100644 --- a/racket/src/racket/configure.ac +++ b/racket/src/racket/configure.ac @@ -718,7 +718,6 @@ case "$host_os" in esac ;; cygwin*) - enable_cgcdefault="yes" MZINSTALLTARGET=unix-cygwin-install if test "${enable_shared}" = "yes" ; then ar_libtool_no_undefined=" -no-undefined" diff --git a/racket/src/racket/gc2/gc2_obj.h b/racket/src/racket/gc2/gc2_obj.h index 5261cbe327..6061e8ab50 100644 --- a/racket/src/racket/gc2/gc2_obj.h +++ b/racket/src/racket/gc2/gc2_obj.h @@ -3,7 +3,7 @@ #if defined(MZ_PRECISE_GC) && !defined(USE_COMPACT_3M_GC) -#if defined(_WIN32) || defined(MZ_USE_LARGE_PAGE_SIZE) +#if defined(_WIN32) || defined(__CYGWIN32__) || defined(MZ_USE_LARGE_PAGE_SIZE) # define LOG_APAGE_SIZE 16 #else # define LOG_APAGE_SIZE 14 diff --git a/racket/src/racket/gc2/page_range.c b/racket/src/racket/gc2/page_range.c index 218fb7c2a4..a4e71c7d58 100644 --- a/racket/src/racket/gc2/page_range.c +++ b/racket/src/racket/gc2/page_range.c @@ -7,7 +7,7 @@ os_protect_pages */ -#ifdef _WIN32 +#if defined(_WIN32) || defined(__CYGWIN32__) /* VirtualProtect can be used only on pages allocated at the same time, so we can't collapse ranges. */ diff --git a/racket/src/racket/gc2/sighand.c b/racket/src/racket/gc2/sighand.c index dff2fd510f..6c46acda45 100644 --- a/racket/src/racket/gc2/sighand.c +++ b/racket/src/racket/gc2/sighand.c @@ -162,7 +162,10 @@ void fault_handler(int sn, struct siginfo *si, void *ctx) #endif /* ========== Windows signal handler ========== */ -#if defined(_WIN32) +#if defined(_WIN32) || defined(__CYGWIN32__) +# if defined(__CYGWIN32__) +# include +# endif LONG WINAPI fault_handler(LPEXCEPTION_POINTERS e) { if ((e->ExceptionRecord->ExceptionCode == EXCEPTION_ACCESS_VIOLATION) diff --git a/racket/src/racket/gc2/vm.c b/racket/src/racket/gc2/vm.c index 84d46bf10f..55d36b3e90 100644 --- a/racket/src/racket/gc2/vm.c +++ b/racket/src/racket/gc2/vm.c @@ -16,8 +16,18 @@ enum { MMU_WRITABLE = 1, }; -#if (defined(MZ_USE_PLACES) && !defined(_WIN32)) || defined(PREFER_MMAP_LARGE_BLOCKS) +#if defined(_WIN32) || defined(__CYGWIN32__) +/* No block cache or alloc cache */ +#elif defined(OSKIT) +# define OS_ALLOCATOR_NEEDS_ALIGNMENT +#elif defined(MZ_USE_PLACES) && defined(PREFER_MMAP_LARGE_BLOCKS) # define USE_BLOCK_CACHE +#else +# define USE_ALLOC_CACHE +#endif + +#ifdef USE_BLOCK_CACHE +# define USE_ALLOC_CACHE #endif struct AllocCacheBlock; @@ -25,7 +35,7 @@ struct BlockCache; typedef struct MMU { #ifdef USE_BLOCK_CACHE struct BlockCache *block_cache; -#elif !( defined(_WIN32) || defined(OSKIT) ) +#elif defined(USE_ALLOC_CACHE) struct AllocCacheBlock *alloc_caches[2]; Page_Range *page_range; #endif @@ -34,16 +44,13 @@ typedef struct MMU { NewGC *gc; } MMU; -#if !( defined(_WIN32) || defined(OSKIT) ) +#ifdef OS_ALLOCATOR_NEEDS_ALIGNMENT +static void *os_alloc_aligned_pages(size_t len, size_t alignment, int dirty_ok) +#else static void *os_alloc_pages(size_t len); +#endif static void os_free_pages(void *p, size_t len); static void os_protect_pages(void *p, size_t len, int writable); -#else -static void *os_alloc_pages(MMU *mmu, size_t len, size_t alignment, int dirty); -static void os_free_pages(MMU *mmu, void *p, size_t len); -static void os_protect_pages(void *p, size_t len, int writable); -static void os_flush_freed_pages(MMU *mmu); -#endif /* provides */ static inline size_t mmu_get_os_page_size(MMU *mmu) { return mmu->os_pagesize; } @@ -77,32 +84,29 @@ static inline void mmu_assert_os_page_aligned(MMU *mmu, size_t p) { } #ifdef USE_BLOCK_CACHE -#include "block_cache.c" -#include "alloc_cache.c" -#include "page_range.c" -#include -#elif !( defined(_WIN32) || defined(OSKIT) ) -#include "alloc_cache.c" -#include "page_range.c" -#include +# include "block_cache.c" +#endif +#ifdef USE_ALLOC_CACHE +# include "alloc_cache.c" +# include "page_range.c" +# include #endif - static MMU *mmu_create(NewGC *gc) { MMU *mmu = ofm_malloc_zero(sizeof(MMU)); mmu->gc = gc; -#if !( defined(_WIN32) || defined(OSKIT) ) -#ifdef USE_BLOCK_CACHE +#ifdef USE_ALLOC_CACHE +# ifdef USE_BLOCK_CACHE mmu->block_cache = block_cache_create(mmu); -#else +# else /* initialization of page_range */ mmu->page_range = page_range_create(); /* initialization of alloc_cache */ mmu->alloc_caches[0] = alloc_cache_create(); mmu->alloc_caches[1] = alloc_cache_create(); -#endif +# endif mmu->os_pagesize = getpagesize(); #else @@ -116,7 +120,7 @@ static void mmu_free(MMU *mmu) { /* printf("MMU ALLOCATED PRE %li\n", mmu->memory_allocated); */ #ifdef USE_BLOCK_CACHE mmu->memory_allocated += block_cache_free(mmu->block_cache); -#elif !( defined(_WIN32) || defined(OSKIT) ) +#elif defined(USE_ALLOC_CACHE) page_range_free(mmu->page_range); mmu->memory_allocated += alloc_cache_free(mmu->alloc_caches[0]); mmu->memory_allocated += alloc_cache_free(mmu->alloc_caches[1]); @@ -129,7 +133,7 @@ static void *mmu_alloc_page(MMU* mmu, size_t len, size_t alignment, int dirty, i mmu_assert_os_page_aligned(mmu, len); #ifdef USE_BLOCK_CACHE return block_cache_alloc_page(mmu->block_cache, len, alignment, dirty, type, expect_mprotect, src_block, &mmu->memory_allocated); -#elif !( defined(_WIN32) || defined(OSKIT) ) +#elif defined(USE_ALLOC_CACHE) /* len = mmu_round_up_to_os_page_size(mmu, len); */ { AllocCacheBlock *alloc_cache = mmu->alloc_caches[!!expect_mprotect]; @@ -137,7 +141,11 @@ static void *mmu_alloc_page(MMU* mmu, size_t len, size_t alignment, int dirty, i } #else mmu->memory_allocated += len; - return os_alloc_pages(mmu, len, alignment, dirty); +# ifdef OS_ALLOCATOR_NEEDS_ALIGNMENT + return os_alloc_aligned_pages(len, alignment, dirty); +#else + return os_alloc_pages(len); +# endif #endif } @@ -148,7 +156,7 @@ static void mmu_free_page(MMU* mmu, void *p, size_t len, int type, int expect_mp #ifdef USE_BLOCK_CACHE mmu->memory_allocated += block_cache_free_page(mmu->block_cache, p, len, type, expect_mprotect, src_block, originated_here); -#elif !( defined(_WIN32) || defined(OSKIT) ) +#elif defined(USE_ALLOC_CACHE) /* len = mmu_round_up_to_os_page_size(mmu, len); */ { AllocCacheBlock *alloc_cache = mmu->alloc_caches[!!expect_mprotect]; @@ -156,18 +164,16 @@ static void mmu_free_page(MMU* mmu, void *p, size_t len, int type, int expect_mp } #else if (originated_here) mmu->memory_allocated -= len; - os_free_pages(mmu, p, len); + os_free_pages(p, len); #endif } static void mmu_flush_freed_pages(MMU *mmu) { #ifdef USE_BLOCK_CACHE mmu->memory_allocated += block_cache_flush_freed_pages(mmu->block_cache); -#elif !( defined(_WIN32) || defined(OSKIT) ) +#elif defined(USE_ALLOC_CACHE) mmu->memory_allocated += alloc_cache_flush_freed_pages(mmu->alloc_caches[0]); mmu->memory_allocated += alloc_cache_flush_freed_pages(mmu->alloc_caches[1]); -#elif defined(_WIN32) - os_flush_freed_pages(mmu); #endif } @@ -195,7 +201,7 @@ static void mmu_queue_protect_range(MMU *mmu, void *p, size_t len, int type, int mmu_assert_os_page_aligned(mmu, len); #ifdef USE_BLOCK_CACHE block_cache_queue_protect_range(mmu->block_cache, p, len, type, writeable, src_block); -#elif !( defined(_WIN32) || defined(OSKIT) ) +#elif defined(USE_ALLOC_CACHE) page_range_add(mmu->page_range, p, len, writeable); #else os_protect_pages(p, len, writeable); @@ -213,7 +219,7 @@ static void mmu_queue_write_unprotect_range(MMU *mmu, void *p, size_t len, int t static void mmu_flush_write_protect_ranges(MMU *mmu) { #ifdef USE_BLOCK_CACHE block_cache_flush_protect_ranges(mmu->block_cache, MMU_WRITE_PROTECTED); -#elif !( defined(_WIN32) || defined(OSKIT) ) +#elif defined(USE_ALLOC_CACHE) page_range_flush(mmu->page_range, MMU_WRITE_PROTECTED); #endif } @@ -221,7 +227,7 @@ static void mmu_flush_write_protect_ranges(MMU *mmu) { static void mmu_flush_write_unprotect_ranges(MMU *mmu) { #ifdef USE_BLOCK_CACHE block_cache_flush_protect_ranges(mmu->block_cache, MMU_WRITABLE); -#elif !( defined(_WIN32) || defined(OSKIT) ) +#elif defined(USE_ALLOC_CACHE) page_range_flush(mmu->page_range, MMU_WRITABLE); #endif } diff --git a/racket/src/racket/gc2/vm_osk.c b/racket/src/racket/gc2/vm_osk.c index e05cf81b85..2bf9476d56 100644 --- a/racket/src/racket/gc2/vm_osk.c +++ b/racket/src/racket/gc2/vm_osk.c @@ -9,14 +9,14 @@ #include -inline static void *os_malloc_pages(MMU *mmu, size_t len, size_t alignment, int dirty_ok) +inline static void *os_alloc_aligned_pages(size_t len, size_t alignment, int dirty_ok) { void *p; p = smemalign(alignment, len); if (!dirty_ok) - memset(p, 0, len); + memset(p, 0, len); return p; } diff --git a/racket/src/racket/gc2/vm_win.c b/racket/src/racket/gc2/vm_win.c index 778f2ffe12..dbef62f0a4 100644 --- a/racket/src/racket/gc2/vm_win.c +++ b/racket/src/racket/gc2/vm_win.c @@ -7,91 +7,19 @@ DONT_NEED_MAX_HEAP_SIZE --- to disable a provide */ -/* Cache doesn't seem to help in Windows: */ -#define CACHE_SLOTS 0 - -#if CACHE_SLOTS -typedef struct { - size_t len; - void *page; -} alloc_cache_entry; - -/* First dimension is age: */ -static alloc_cache_entry cache[2][CACHE_SLOTS]; -#endif - -static void *os_alloc_pages(MMU *mmu, size_t len, size_t alignment, int dirty_ok) +static void *os_alloc_pages(size_t len) { -#if CACHE_SLOTS - { - int i, j; - - for (j = 0; j < 2; j++) { - for (i = 0; i < CACHE_SLOTS; i++) { - if (cache[j][i].len == len) { - if (cache[j][i].page) { - void *result = cache[j][i].page; - cache[j][i].page = *(void **)result; - memset(result, 0, len); - return result; - } - break; - } - } - } - } -#endif - /* VirtualAlloc MEM_COMMIT always zeros memory */ return (void *)VirtualAlloc(NULL, len, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); } -static void os_free_pages(MMU *mmu, void *p, size_t len) +static void os_free_pages(void *p, size_t len) { - -#if CACHE_SLOTS - { - int i; - - for (i = 0; i < CACHE_SLOTS; i++) { - if (!cache[0][i].len) - cache[0][i].len = len; - if (cache[0][i].len == len) { - *(void **)p = cache[0][i].page; - cache[0][i].page = p; - return; - } - } - } -#endif - VirtualFree(p, 0, MEM_RELEASE); } -static void os_flush_freed_pages(MMU *mmu) -{ -#if CACHE_SLOTS - int i; - void *p, *next; - - for (i = 0; i < CACHE_SLOTS; i++) { - if (cache[1][i].len) { - for (p = cache[1][i].page; p; p = next) { - next = *(void **)p; - mmu_memory_allocated_dec(mmu, cache[i].len); - VirtualFree(p, 0, MEM_RELEASE); - } - } - cache[1][i].len = cache[0][i].len; - cache[1][i].page = cache[0][i].page; - cache[0][i].len = 0; - cache[0][i].page = NULL; - } -#endif -} - static void os_protect_pages(void *p, size_t len, int writeable) { DWORD old; diff --git a/racket/src/racket/gc2/xform-mod.rkt b/racket/src/racket/gc2/xform-mod.rkt index 310451f383..1aa2691128 100644 --- a/racket/src/racket/gc2/xform-mod.rkt +++ b/racket/src/racket/gc2/xform-mod.rkt @@ -65,7 +65,7 @@ (call-with-output-file fn (lambda (out) (fprintf out "#define ~a ~a\n" (cadr m) (caddr m))) - 'truncate/replace) + #:exists 'truncate/replace) (set! cpp (string-append cpp (format " -include ~a" fn)))] [else (set! cpp (string-append cpp " -D" diff --git a/racket/src/racket/include/mzwin.def b/racket/src/racket/include/mzwin.def index 793ff308dd..da4a740a0f 100644 --- a/racket/src/racket/include/mzwin.def +++ b/racket/src/racket/include/mzwin.def @@ -96,9 +96,6 @@ EXPORTS scheme_set_can_break scheme_push_break_enable scheme_pop_break_enable - scheme_with_stack_freeze - scheme_frozen_run_some - scheme_is_in_frozen_stack scheme_abort_continuation_no_dws scheme_call_with_composable_no_dws scheme_set_on_atomic_timeout diff --git a/racket/src/racket/include/mzwin3m.def b/racket/src/racket/include/mzwin3m.def index eec3094382..7f679de91d 100644 --- a/racket/src/racket/include/mzwin3m.def +++ b/racket/src/racket/include/mzwin3m.def @@ -96,9 +96,6 @@ EXPORTS scheme_set_can_break scheme_push_break_enable scheme_pop_break_enable - scheme_with_stack_freeze - scheme_frozen_run_some - scheme_is_in_frozen_stack scheme_abort_continuation_no_dws scheme_call_with_composable_no_dws scheme_set_on_atomic_timeout diff --git a/racket/src/racket/include/racket.exp b/racket/src/racket/include/racket.exp index 737fc804b0..88d46c806f 100644 --- a/racket/src/racket/include/racket.exp +++ b/racket/src/racket/include/racket.exp @@ -93,9 +93,6 @@ scheme_pop_kill_action scheme_set_can_break scheme_push_break_enable scheme_pop_break_enable -scheme_with_stack_freeze -scheme_frozen_run_some -scheme_is_in_frozen_stack scheme_abort_continuation_no_dws scheme_call_with_composable_no_dws scheme_set_on_atomic_timeout diff --git a/racket/src/racket/include/racket3m.exp b/racket/src/racket/include/racket3m.exp index 1905f9ad9f..79f600736c 100644 --- a/racket/src/racket/include/racket3m.exp +++ b/racket/src/racket/include/racket3m.exp @@ -93,9 +93,6 @@ scheme_pop_kill_action scheme_set_can_break scheme_push_break_enable scheme_pop_break_enable -scheme_with_stack_freeze -scheme_frozen_run_some -scheme_is_in_frozen_stack scheme_abort_continuation_no_dws scheme_call_with_composable_no_dws scheme_set_on_atomic_timeout diff --git a/racket/src/racket/include/scheme.h b/racket/src/racket/include/scheme.h index 3bf595de04..6de06b078e 100644 --- a/racket/src/racket/include/scheme.h +++ b/racket/src/racket/include/scheme.h @@ -2128,8 +2128,8 @@ extern Scheme_Extension_Table *scheme_extension_table; # define MZ_FD_CLR(n, p) scheme_fdclr(p, n) # define MZ_FD_ISSET(n, p) scheme_fdisset(p, n) #else -# define MZ_GET_FDSET(p, n) ((void *)(((fd_set *)p) + n)) -# define MZ_FD_ZERO(p) FD_ZERO((fd_set *)(p)) +# define MZ_GET_FDSET(p, n) ((void *)(((fd_set *)p) XFORM_OK_PLUS n)) +# define MZ_FD_ZERO(p) XFORM_HIDE_EXPR(FD_ZERO((fd_set *)(p))) # define MZ_FD_SET(n, p) FD_SET(n, (fd_set *)(p)) # define MZ_FD_CLR(n, p) FD_CLR(n, (fd_set *)(p)) # define MZ_FD_ISSET(n, p) FD_ISSET(n, (fd_set *)(p)) diff --git a/racket/src/racket/include/schthread.h b/racket/src/racket/include/schthread.h index 54f1cdc1af..a8df7b7f10 100644 --- a/racket/src/racket/include/schthread.h +++ b/racket/src/racket/include/schthread.h @@ -49,7 +49,7 @@ extern "C" { #endif /* Set up MZ_EXTERN for DLL build */ -#if (defined(__WIN32__) || defined(WIN32) || defined(_WIN32)) \ +#if (defined(__WIN32__) || defined(WIN32) || defined(_WIN32) || defined(__CYGWIN32__)) \ && !defined(LINK_EXTENSIONS_BY_TABLE) \ && !defined(SCHEME_EMBEDDED_NO_DLL) # define MZ_DLLIMPORT __declspec(dllimport) @@ -59,10 +59,16 @@ extern "C" { # else # define MZ_DLLSPEC __declspec(dllimport) # endif +# if (defined(__CYGWIN32__) && !defined(MZ_USES_SHARED_LIB)) || defined(MZ_PRECISE_GC) +# define MZGC_DLLIMPORT +# else +# define MZGC_DLLIMPORT MZ_DLLIMPORT +# endif #else # define MZ_DLLSPEC # define MZ_DLLIMPORT # define MZ_DLLEXPORT +# define MZGC_DLLIMPORT #endif #define MZ_EXTERN extern MZ_DLLSPEC diff --git a/racket/src/racket/main.c b/racket/src/racket/main.c index bf75f44f31..9330e204d3 100644 --- a/racket/src/racket/main.c +++ b/racket/src/racket/main.c @@ -31,7 +31,9 @@ (except for the garbage collector, which is in `gc', `sgc', or `gc2', depending on which one you're using). */ -#define __MINGW32_DELAY_LOAD__ 1 +#ifdef __MINGW32__ +# define __MINGW32_DELAY_LOAD__ 1 +#endif #include "scheme.h" /*========================================================================*/ diff --git a/racket/src/racket/sconfig.h b/racket/src/racket/sconfig.h index 0aa3fff6bf..fdab893c98 100644 --- a/racket/src/racket/sconfig.h +++ b/racket/src/racket/sconfig.h @@ -589,9 +589,6 @@ # define DO_STACK_CHECK # define WINDOWS_FIND_STACK_BOUNDS -/* Default stack size is 1MB, but we try to read - the actual size from the executable on startup: */ -# define WINDOWS_DEFAULT_STACK_SIZE 1048576 # if !defined(_WIN64) || (_MSC_VER >= 1600) # define USE_MZ_SETJMP @@ -731,10 +728,6 @@ # define REGISTER_POOR_MACHINE -# ifndef AS_MSVC_EXTENSION -# define LINK_EXTENSIONS_BY_TABLE -# endif - # define MZ_USE_JIT_I386 # define FLAGS_ALREADY_SET diff --git a/racket/src/racket/sgc/Makefile.in b/racket/src/racket/sgc/Makefile.in index dd1e45fad6..969c8229fa 100644 --- a/racket/src/racket/sgc/Makefile.in +++ b/racket/src/racket/sgc/Makefile.in @@ -7,6 +7,10 @@ prefix = @prefix@ exec_prefix = @exec_prefix@ libdir = @libdir@ +# for version.mak: +mainsrcdir = @srcdir@/../.. +@INCLUDEDEP@ @srcdir@/../version.mak + CC = @CC@ CXX = @CXX@ RANLIB = @RANLIB@ @@ -32,7 +36,7 @@ test: $(OBJS) test.@LTO@ gcobjects: $(OBJS) sgc.@LTO@: $(srcdir)/sgc.c $(srcdir)/autostat.inc $(srcdir)/collect.inc $(srcdir)/../utils/splay.c - $(CC) $(CFLAGS) $(CPPFLAGS) @OPTIONS@ -I.. -c $(srcdir)/sgc.c -o sgc.@LTO@ + $(CC) $(CFLAGS) $(CPPFLAGS) @OPTIONS@ -DSGC_EXPORTS -I.. -c $(srcdir)/sgc.c -o sgc.@LTO@ test.@LTO@: $(srcdir)/test.c $(CC) $(CFLAGS) $(CPPFLAGS) @OPTIONS@ -c $(srcdir)/test.c -o test.@LTO@ diff --git a/racket/src/racket/sgc/sgc.h b/racket/src/racket/sgc/sgc.h index 0dae616728..64c65d6a4a 100644 --- a/racket/src/racket/sgc/sgc.h +++ b/racket/src/racket/sgc/sgc.h @@ -7,8 +7,8 @@ extern "C" { #define GC_PTR void* -#ifdef WIN32 -# ifdef SGC_EXPORTS +#if defined(WIN32) || defined(__CYGWIN32__) +# if defined(SGC_EXPORTS) || (defined(__CYGWIN32__) && !defined(MZ_USES_SHARED_LIB)) # define SGC_EXTERN __declspec(dllexport) # else # define SGC_EXTERN __declspec(dllimport) diff --git a/racket/src/racket/src/eval.c b/racket/src/racket/src/eval.c index bf698d4783..d7bb626f9d 100644 --- a/racket/src/racket/src/eval.c +++ b/racket/src/racket/src/eval.c @@ -543,6 +543,7 @@ static uintptr_t adjust_stack_base(uintptr_t bnd) { #ifdef WINDOWS_FIND_STACK_BOUNDS intptr_t find_exe_stack_size() { +# define WINDOWS_DEFAULT_STACK_SIZE 1048576 intptr_t sz = WINDOWS_DEFAULT_STACK_SIZE; wchar_t *fn; DWORD len = 1024; @@ -580,7 +581,6 @@ intptr_t find_exe_stack_size() /* Skip to PE32[+] header's stack reservation value: */ if (SetFilePointer(fd, pos + 20 + 4 + 72, NULL, FILE_BEGIN) != INVALID_SET_FILE_POINTER) { - mzlonglong lsz; if (kind == 0x10b) { /* PE32: 32-bit stack size: */ int ssz; diff --git a/racket/src/racket/src/list.c b/racket/src/racket/src/list.c index 9edce7da65..4018d18b62 100644 --- a/racket/src/racket/src/list.c +++ b/racket/src/racket/src/list.c @@ -3494,13 +3494,13 @@ extern void *GC_base(void *d); # define GC_did_mark_stack_overflow() 0 # define GC_mark_overflow_recover(ptr) /**/ #else -extern MZ_DLLIMPORT void *GC_base(void *); -extern MZ_DLLIMPORT int GC_is_marked(void *); -extern MZ_DLLIMPORT int GC_did_mark_stack_overflow(void); -extern MZ_DLLIMPORT void GC_mark_overflow_recover(void *p); +extern MZGC_DLLIMPORT void *GC_base(void *); +extern MZGC_DLLIMPORT int GC_is_marked(void *); +extern MZGC_DLLIMPORT int GC_did_mark_stack_overflow(void); +extern MZGC_DLLIMPORT void GC_mark_overflow_recover(void *p); #endif -extern MZ_DLLIMPORT void GC_push_all_stack(void *, void *); -extern MZ_DLLIMPORT void GC_flush_mark_stack(void); +extern MZGC_DLLIMPORT void GC_push_all_stack(void *, void *); +extern MZGC_DLLIMPORT void GC_flush_mark_stack(void); #endif @@ -3674,7 +3674,7 @@ void scheme_clear_ephemerons() done_ephemerons = NULL; } -extern MZ_DLLIMPORT void (*GC_custom_finalize)(); +extern MZGC_DLLIMPORT void (*GC_custom_finalize)(); void scheme_init_ephemerons(void) { diff --git a/racket/src/racket/src/port.c b/racket/src/racket/src/port.c index 4229ef703e..7f357783f3 100644 --- a/racket/src/racket/src/port.c +++ b/racket/src/racket/src/port.c @@ -1212,7 +1212,7 @@ void scheme_fdzero(void *fd) scheme_init_fdset_array(fd, 1); # else # if defined(FILES_HAVE_FDS) || defined(USE_TCP) - FD_ZERO((fd_set *)fd); + XFORM_HIDE_EXPR(FD_ZERO((fd_set *)fd)); # endif # endif } diff --git a/racket/src/racket/src/salloc.c b/racket/src/racket/src/salloc.c index 8e0fd64d1f..804639ca1d 100644 --- a/racket/src/racket/src/salloc.c +++ b/racket/src/racket/src/salloc.c @@ -91,8 +91,8 @@ void **GC_variable_stack; #endif #ifndef MZ_PRECISE_GC -extern MZ_DLLIMPORT void GC_register_late_disappearing_link(void **link, void *obj); -extern MZ_DLLIMPORT void GC_register_indirect_disappearing_link(void **link, void *obj); +extern MZGC_DLLIMPORT void GC_register_late_disappearing_link(void **link, void *obj); +extern MZGC_DLLIMPORT void GC_register_indirect_disappearing_link(void **link, void *obj); #endif SHARED_OK static int use_registered_statics; @@ -102,7 +102,7 @@ SHARED_OK static int use_registered_statics; /************************************************************************/ #if !defined(MZ_PRECISE_GC) && !defined(USE_SENORA_GC) -extern MZ_DLLIMPORT void GC_init(); +extern MZGC_DLLIMPORT void GC_init(); #endif void scheme_set_stack_base(void *base, int no_auto_statics) XFORM_SKIP_PROC @@ -1688,7 +1688,7 @@ void scheme_unused_intptr(intptr_t i) { } extern "C" { # endif - extern MZ_DLLIMPORT void GC_dump(void); + extern MZGC_DLLIMPORT void GC_dump(void); # ifdef __cplusplus }; # endif diff --git a/racket/src/racket/src/schemef.h b/racket/src/racket/src/schemef.h index 0a5e3ed026..75a03665ca 100644 --- a/racket/src/racket/src/schemef.h +++ b/racket/src/racket/src/schemef.h @@ -201,12 +201,8 @@ MZ_EXTERN void scheme_set_can_break(int on); MZ_EXTERN void scheme_push_break_enable(Scheme_Cont_Frame_Data *cframe, int on, int pre_check); MZ_EXTERN void scheme_pop_break_enable(Scheme_Cont_Frame_Data *cframe, int post_check); -MZ_EXTERN int scheme_with_stack_freeze(Scheme_Frozen_Stack_Proc wha_f, void *wha_data); -MZ_EXTERN int scheme_frozen_run_some(Scheme_Frozen_Stack_Proc do_f, void *do_data, int run_msecs); -MZ_EXTERN int scheme_is_in_frozen_stack(); - -MZ_EXTERN Scheme_Object *scheme_abort_continuation_no_dws (Scheme_Object *pt, Scheme_Object *v); -MZ_EXTERN Scheme_Object *scheme_call_with_composable_no_dws (Scheme_Object *proc, Scheme_Object *pt); +MZ_EXTERN Scheme_Object *scheme_abort_continuation_no_dws(Scheme_Object *pt, Scheme_Object *v); +MZ_EXTERN Scheme_Object *scheme_call_with_composable_no_dws(Scheme_Object *proc, Scheme_Object *pt); MZ_EXTERN Scheme_On_Atomic_Timeout_Proc scheme_set_on_atomic_timeout(Scheme_On_Atomic_Timeout_Proc p); @@ -1229,5 +1225,5 @@ MZ_EXTERN void *scheme_register_process_global(const char *key, void *val); MZ_EXTERN Scheme_Object *scheme_malloc_key(void); MZ_EXTERN void scheme_free_key(Scheme_Object *k); -MZ_EXTERN void* scheme_jit_find_code_end(void *p); +MZ_EXTERN void *scheme_jit_find_code_end(void *p); MZ_EXTERN void scheme_jit_now(Scheme_Object *f); diff --git a/racket/src/racket/src/schemex.h b/racket/src/racket/src/schemex.h index e82bd9189a..97dcfd9b4e 100644 --- a/racket/src/racket/src/schemex.h +++ b/racket/src/racket/src/schemex.h @@ -145,11 +145,8 @@ void (*scheme_pop_kill_action)(); void (*scheme_set_can_break)(int on); void (*scheme_push_break_enable)(Scheme_Cont_Frame_Data *cframe, int on, int pre_check); void (*scheme_pop_break_enable)(Scheme_Cont_Frame_Data *cframe, int post_check); -int (*scheme_with_stack_freeze)(Scheme_Frozen_Stack_Proc wha_f, void *wha_data); -int (*scheme_frozen_run_some)(Scheme_Frozen_Stack_Proc do_f, void *do_data, int run_msecs); -int (*scheme_is_in_frozen_stack)(); -Scheme_Object *scheme_abort_continuation_no_dws; -Scheme_Object *scheme_call_with_composable_no_dws; +Scheme_Object *(*scheme_abort_continuation_no_dws)(Scheme_Object *pt, Scheme_Object *v); +Scheme_Object *(*scheme_call_with_composable_no_dws)(Scheme_Object *proc, Scheme_Object *pt); Scheme_On_Atomic_Timeout_Proc (*scheme_set_on_atomic_timeout)(Scheme_On_Atomic_Timeout_Proc p); /*========================================================================*/ /* error handling */ @@ -1001,7 +998,7 @@ Scheme_Hash_Table *(*scheme_get_place_table)(void); void *(*scheme_register_process_global)(const char *key, void *val); Scheme_Object *(*scheme_malloc_key)(void); void (*scheme_free_key)(Scheme_Object *k); - (*scheme_jit_find_code_end)(void *p); +void *(*scheme_jit_find_code_end)(void *p); void (*scheme_jit_now)(Scheme_Object *f); #ifndef SCHEME_EX_INLINE } Scheme_Extension_Table; diff --git a/racket/src/racket/src/schemex.inc b/racket/src/racket/src/schemex.inc index 8f4850d639..3ef9946405 100644 --- a/racket/src/racket/src/schemex.inc +++ b/racket/src/racket/src/schemex.inc @@ -102,9 +102,6 @@ scheme_extension_table->scheme_set_can_break = scheme_set_can_break; scheme_extension_table->scheme_push_break_enable = scheme_push_break_enable; scheme_extension_table->scheme_pop_break_enable = scheme_pop_break_enable; - scheme_extension_table->scheme_with_stack_freeze = scheme_with_stack_freeze; - scheme_extension_table->scheme_frozen_run_some = scheme_frozen_run_some; - scheme_extension_table->scheme_is_in_frozen_stack = scheme_is_in_frozen_stack; scheme_extension_table->scheme_abort_continuation_no_dws = scheme_abort_continuation_no_dws; scheme_extension_table->scheme_call_with_composable_no_dws = scheme_call_with_composable_no_dws; scheme_extension_table->scheme_set_on_atomic_timeout = scheme_set_on_atomic_timeout; diff --git a/racket/src/racket/src/schemexm.h b/racket/src/racket/src/schemexm.h index 362c47c556..aaf2ede556 100644 --- a/racket/src/racket/src/schemexm.h +++ b/racket/src/racket/src/schemexm.h @@ -102,9 +102,6 @@ #define scheme_set_can_break (scheme_extension_table->scheme_set_can_break) #define scheme_push_break_enable (scheme_extension_table->scheme_push_break_enable) #define scheme_pop_break_enable (scheme_extension_table->scheme_pop_break_enable) -#define scheme_with_stack_freeze (scheme_extension_table->scheme_with_stack_freeze) -#define scheme_frozen_run_some (scheme_extension_table->scheme_frozen_run_some) -#define scheme_is_in_frozen_stack (scheme_extension_table->scheme_is_in_frozen_stack) #define scheme_abort_continuation_no_dws (scheme_extension_table->scheme_abort_continuation_no_dws) #define scheme_call_with_composable_no_dws (scheme_extension_table->scheme_call_with_composable_no_dws) #define scheme_set_on_atomic_timeout (scheme_extension_table->scheme_set_on_atomic_timeout) diff --git a/racket/src/racket/src/setjmpup.c b/racket/src/racket/src/setjmpup.c index 7f59fe0089..e5e29aa4c6 100644 --- a/racket/src/racket/src/setjmpup.c +++ b/racket/src/racket/src/setjmpup.c @@ -47,10 +47,10 @@ HOOK_SHARED_OK void (*scheme_set_external_stack_val)(void *); stack copy to account for pointers to the interior of collectable objects. */ -extern MZ_DLLIMPORT void GC_push_all_stack(void *, void *); -extern MZ_DLLIMPORT void GC_flush_mark_stack(void); -extern MZ_DLLIMPORT void (*GC_push_last_roots)(void); -extern MZ_DLLIMPORT void (*GC_push_last_roots_again)(void); +extern MZGC_DLLIMPORT void GC_push_all_stack(void *, void *); +extern MZGC_DLLIMPORT void GC_flush_mark_stack(void); +extern MZGC_DLLIMPORT void (*GC_push_last_roots)(void); +extern MZGC_DLLIMPORT void (*GC_push_last_roots_again)(void); /* GC_push_last_roots_again is called after marking eager finalizations (once at each stage). We rely on the fact that no copied stack will be referenced by (or affected the ordering of) @@ -60,8 +60,8 @@ extern MZ_DLLIMPORT void (*GC_push_last_roots_again)(void); # define GC_is_marked(p) GC_base(p) # define GC_did_mark_stack_overflow() 0 #else -extern MZ_DLLIMPORT int GC_is_marked(void *); -extern MZ_DLLIMPORT int GC_did_mark_stack_overflow(void); +extern MZGC_DLLIMPORT int GC_is_marked(void *); +extern MZGC_DLLIMPORT int GC_did_mark_stack_overflow(void); #endif #define get_copy(s_c) (((CopiedStack *)s_c)->_stack_copy) @@ -673,12 +673,13 @@ void scheme_reset_jmpup_buf(Scheme_Jumpup_Buf *b) is fragile, because it's not well defined whether the compiler will generate frame-pointer setup; use mzsj86g.S, instead. */ -#ifdef __MINGW32__ -# if __OPTIMIZE__ > 0 -# define NEED_STACK_FRAME_SETUP -# endif +#if (__OPTIMIZE__ > 0) || defined(MZ_XFORM) +# define NEED_STACK_FRAME_SETUP #endif +MZ_DO_NOT_INLINE(int scheme_mz_setjmp(mz_pre_jmp_buf b)); +MZ_DO_NOT_INLINE(void scheme_mz_longjmp(mz_pre_jmp_buf b, int v)); + int scheme_mz_setjmp(mz_pre_jmp_buf b) { #ifdef NEED_STACK_FRAME_SETUP diff --git a/racket/src/racket/src/symbol.c b/racket/src/racket/src/symbol.c index 9068fdd366..d53b927fdd 100644 --- a/racket/src/racket/src/symbol.c +++ b/racket/src/racket/src/symbol.c @@ -41,7 +41,7 @@ #endif #ifndef MZ_PRECISE_GC -extern MZ_DLLIMPORT void (*GC_custom_finalize)(void); +extern MZGC_DLLIMPORT void (*GC_custom_finalize)(void); #endif #ifndef USE_SENORA_GC extern int GC_is_marked(void *);