summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Gamari <ben@smart-cactus.org>2020-11-23 15:06:11 -0500
committerZubin <zubin.duggal@gmail.com>2021-10-11 15:39:42 +0000
commit7e0e4b5a70e117ad7ed3e45ac6270f60b28448f7 (patch)
treef0a5ce0d4a3df04a86cab6a10ca3a58cd76d246b
parent66024b3bd65b8a90fd519f389e8f43da5fa5ebe5 (diff)
downloadhaskell-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.c33
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.