diff options
author | Ben Gamari <ben@smart-cactus.org> | 2020-11-23 15:06:11 -0500 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2020-12-01 19:58:18 -0500 |
commit | d8872af08d205c3067371d56200e68cf2f0c1ffc (patch) | |
tree | dcbd9c33c859953b72c3c8556f233fcd157d0e96 /rts | |
parent | 97d71646ddf3814de62573100ed0b224d1588cbc (diff) | |
download | haskell-d8872af08d205c3067371d56200e68cf2f0c1ffc.tar.gz |
rts/Linker: Introduce Windows implementations for mmapForLinker, et al.
Diffstat (limited to 'rts')
-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 eebde2a799..c84cfe27ba 100644 --- a/rts/Linker.c +++ b/rts/Linker.c @@ -1021,7 +1021,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 // // Returns NULL on failure. // |