diff options
author | Ben Gamari <ben@smart-cactus.org> | 2020-11-23 15:06:11 -0500 |
---|---|---|
committer | Zubin <zubin.duggal@gmail.com> | 2021-10-11 15:39:42 +0000 |
commit | 7e0e4b5a70e117ad7ed3e45ac6270f60b28448f7 (patch) | |
tree | f0a5ce0d4a3df04a86cab6a10ca3a58cd76d246b | |
parent | 66024b3bd65b8a90fd519f389e8f43da5fa5ebe5 (diff) | |
download | haskell-wip/libffi-9.0.tar.gz |
rts/Linker: Introduce Windows implementations for mmapForLinker, et al.wip/libffi-9.0
(cherry picked from commit d8872af08d205c3067371d56200e68cf2f0c1ffc)
-rw-r--r-- | rts/Linker.c | 33 |
1 files changed, 32 insertions, 1 deletions
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. |