Commit bd65da95 by Nicolas Capens

Implement executable memory allocation for Subzero on Unix.

Change-Id: I82b6a3f5336ca64dea30a8d9541fcf43c7ead81a Reviewed-on: https://swiftshader-review.googlesource.com/8373Tested-by: 's avatarNicolas Capens <capn@google.com> Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com>
parent 19321ea6
...@@ -30,9 +30,13 @@ ...@@ -30,9 +30,13 @@
#include "llvm/Support/FileSystem.h" #include "llvm/Support/FileSystem.h"
#include "llvm/Support/raw_os_ostream.h" #include "llvm/Support/raw_os_ostream.h"
#if defined(_WIN32)
#define WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN
#define NOMINMAX #define NOMINMAX
#include <Windows.h> #include <Windows.h>
#else
#include <sys/mman.h>
#endif
#include <mutex> #include <mutex>
#include <limits> #include <limits>
...@@ -292,12 +296,20 @@ namespace sw ...@@ -292,12 +296,20 @@ namespace sw
T *allocate(size_type n) T *allocate(size_type n)
{ {
#if defined(_WIN32)
return (T*)VirtualAlloc(NULL, sizeof(T) * n, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); return (T*)VirtualAlloc(NULL, sizeof(T) * n, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
#else
return (T*)mmap(nullptr, sizeof(T) * n, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
#endif
} }
void deallocate(T *p, size_type n) void deallocate(T *p, size_type n)
{ {
#if defined(_WIN32)
VirtualFree(p, 0, MEM_RELEASE); VirtualFree(p, 0, MEM_RELEASE);
#else
munmap(p, sizeof(T) * n);
#endif
} }
}; };
...@@ -315,11 +327,13 @@ namespace sw ...@@ -315,11 +327,13 @@ namespace sw
virtual ~ELFMemoryStreamer() virtual ~ELFMemoryStreamer()
{ {
#if defined(_WIN32)
if(buffer.size() != 0) if(buffer.size() != 0)
{ {
DWORD exeProtection; DWORD exeProtection;
VirtualProtect(&buffer[0], buffer.size(), oldProtection, &exeProtection); VirtualProtect(&buffer[0], buffer.size(), oldProtection, &exeProtection);
} }
#endif
} }
void write8(uint8_t Value) override void write8(uint8_t Value) override
...@@ -353,7 +367,12 @@ namespace sw ...@@ -353,7 +367,12 @@ namespace sw
{ {
if(!entry) if(!entry)
{ {
#if defined(_WIN32)
VirtualProtect(&buffer[0], buffer.size(), PAGE_EXECUTE_READWRITE, &oldProtection); VirtualProtect(&buffer[0], buffer.size(), PAGE_EXECUTE_READWRITE, &oldProtection);
#else
mprotect(&buffer[0], buffer.size(), PROT_READ | PROT_WRITE | PROT_EXEC);
#endif
position = std::numeric_limits<std::size_t>::max(); // Can't stream more data after this position = std::numeric_limits<std::size_t>::max(); // Can't stream more data after this
entry = loadImage(&buffer[0]); entry = loadImage(&buffer[0]);
...@@ -366,7 +385,10 @@ namespace sw ...@@ -366,7 +385,10 @@ namespace sw
void *entry; void *entry;
std::vector<uint8_t, ExecutableAllocator<uint8_t>> buffer; std::vector<uint8_t, ExecutableAllocator<uint8_t>> buffer;
std::size_t position; std::size_t position;
#if defined(_WIN32)
DWORD oldProtection; DWORD oldProtection;
#endif
}; };
Nucleus::Nucleus() Nucleus::Nucleus()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment