ExecutableMemory: Use VirtualAlloc() instead of `new` on windows
VirtualAlloc() allocates pages. Use this instead of over-allocating and aligning to pages with `new`.
This is more efficient with memory, and avoids a nasty ASAN issue where pages can have their executable bit removed.
Bug: chromium:1466124
Change-Id: Ic31a9a84a837363b6f38b5ba0db3c833375b3e32
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/71988
Reviewed-by: Antonio Maiorano <amaiorano@google.com>
Tested-by: Ben Clayton <bclayton@google.com>
Presubmit-Ready: Ben Clayton <bclayton@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
Kokoro-Result: Ben Clayton <bclayton@google.com>
diff --git a/src/Reactor/ExecutableMemory.cpp b/src/Reactor/ExecutableMemory.cpp
index d35f3d5..db5145b 100644
--- a/src/Reactor/ExecutableMemory.cpp
+++ b/src/Reactor/ExecutableMemory.cpp
@@ -276,7 +276,10 @@
size_t length = roundUp(bytes, pageSize);
void *mapping = nullptr;
-#if defined(__linux__) && defined(REACTOR_ANONYMOUS_MMAP_NAME)
+#if defined(_WIN32)
+ return VirtualAlloc(nullptr, length, MEM_COMMIT | MEM_RESERVE,
+ permissionsToProtectMode(permissions));
+#elif defined(__linux__) && defined(REACTOR_ANONYMOUS_MMAP_NAME)
int flags = MAP_PRIVATE;
// Try to name the memory region for the executable code,
@@ -392,10 +395,11 @@
{
#if defined(_WIN32)
unsigned long oldProtection;
- BOOL result =
- VirtualProtect(memory, bytes, PAGE_READWRITE, &oldProtection);
+ BOOL result;
+ result = VirtualProtect(memory, bytes, PAGE_READWRITE, &oldProtection);
ASSERT(result);
- deallocate(memory);
+ result = VirtualFree(memory, 0, MEM_RELEASE);
+ ASSERT(result);
#elif defined(__APPLE__) || (defined(__linux__) && defined(REACTOR_ANONYMOUS_MMAP_NAME))
size_t pageSize = memoryPageSize();
size_t length = (bytes + pageSize - 1) & ~(pageSize - 1);