summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Gamari <ben@smart-cactus.org>2020-11-23 15:06:11 -0500
committerMarge Bot <ben+marge-bot@smart-cactus.org>2020-12-01 19:58:18 -0500
commitd8872af08d205c3067371d56200e68cf2f0c1ffc (patch)
treedcbd9c33c859953b72c3c8556f233fcd157d0e96
parent97d71646ddf3814de62573100ed0b224d1588cbc (diff)
downloadhaskell-d8872af08d205c3067371d56200e68cf2f0c1ffc.tar.gz
rts/Linker: Introduce Windows implementations for mmapForLinker, et al.
-rw-r--r--rts/Linker.c33
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.
//