From 7e0e4b5a70e117ad7ed3e45ac6270f60b28448f7 Mon Sep 17 00:00:00 2001 From: Ben Gamari Date: Mon, 23 Nov 2020 15:06:11 -0500 Subject: rts/Linker: Introduce Windows implementations for mmapForLinker, et al. (cherry picked from commit d8872af08d205c3067371d56200e68cf2f0c1ffc) --- rts/Linker.c | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/rts/Linker.c b/rts/Linker.c index c7ecd797e5..81a638ea6b 100644 --- a/rts/Linker.c +++ b/rts/Linker.c @@ -1018,7 +1018,38 @@ resolveSymbolAddr (pathchar* buffer, int size, #endif /* OBJFORMAT_PEi386 */ } -#if RTS_LINKER_USE_MMAP +#if defined(mingw32_HOST_OS) + +// +// Returns NULL on failure. +// +void * +mmapAnonForLinker (size_t bytes) +{ + return VirtualAlloc(NULL, bytes, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); +} + +void +munmapForLinker (void *addr, size_t bytes, const char *caller) +{ + if (VirtualFree(addr, 0, MEM_RELEASE) == 0) { + sysErrorBelch("munmapForLinker: %s: Failed to unmap %zd bytes at %p", + caller, bytes, addr); + } +} + +void +mmapForLinkerMarkExecutable(void *start, size_t len) +{ + DWORD old; + if (VirtualProtect(start, len, PAGE_EXECUTE_READ, &old) == 0) { + sysErrorBelch("mmapForLinkerMarkExecutable: failed to protect %zd bytes at %p", + len, start); + ASSERT(false); + } +} + +#elif RTS_LINKER_USE_MMAP /* ----------------------------------------------------------------------------- Occationally we depend on mmap'd region being close to already mmap'd regions. -- cgit v1.2.1