summaryrefslogtreecommitdiff
path: root/deps/v8/src/base/platform/platform-win32.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/base/platform/platform-win32.cc')
-rw-r--r--deps/v8/src/base/platform/platform-win32.cc49
1 files changed, 17 insertions, 32 deletions
diff --git a/deps/v8/src/base/platform/platform-win32.cc b/deps/v8/src/base/platform/platform-win32.cc
index 7b7ff99d20..61a1ab9ab3 100644
--- a/deps/v8/src/base/platform/platform-win32.cc
+++ b/deps/v8/src/base/platform/platform-win32.cc
@@ -37,7 +37,7 @@
#define _TRUNCATE 0
#define STRUNCATE 80
-inline void MemoryBarrier() {
+inline void MemoryFence() {
int barrier = 0;
__asm__ __volatile__("xchgl %%eax,%0 ":"=r" (barrier));
}
@@ -737,8 +737,8 @@ void* OS::GetRandomMmapAddr() {
return reinterpret_cast<void *>(address);
}
-
-static void* RandomizedVirtualAlloc(size_t size, int action, int protection) {
+static void* RandomizedVirtualAlloc(size_t size, int action, int protection,
+ void* hint) {
LPVOID base = NULL;
static BOOL use_aslr = -1;
#ifdef V8_HOST_ARCH_32_BIT
@@ -753,9 +753,7 @@ static void* RandomizedVirtualAlloc(size_t size, int action, int protection) {
if (use_aslr &&
(protection == PAGE_EXECUTE_READWRITE || protection == PAGE_NOACCESS)) {
// For executable pages try and randomize the allocation address
- for (size_t attempts = 0; base == NULL && attempts < 3; ++attempts) {
- base = VirtualAlloc(OS::GetRandomMmapAddr(), size, action, protection);
- }
+ base = VirtualAlloc(hint, size, action, protection);
}
// After three attempts give up and let the OS find an address to use.
@@ -765,14 +763,15 @@ static void* RandomizedVirtualAlloc(size_t size, int action, int protection) {
}
void* OS::Allocate(const size_t requested, size_t* allocated,
- bool is_executable) {
+ bool is_executable, void* hint) {
return OS::Allocate(requested, allocated,
is_executable ? OS::MemoryPermission::kReadWriteExecute
- : OS::MemoryPermission::kReadWrite);
+ : OS::MemoryPermission::kReadWrite,
+ hint);
}
void* OS::Allocate(const size_t requested, size_t* allocated,
- OS::MemoryPermission access) {
+ OS::MemoryPermission access, void* hint) {
// VirtualAlloc rounds allocated size to page size automatically.
size_t msize = RoundUp(requested, static_cast<int>(GetPageSize()));
@@ -793,9 +792,8 @@ void* OS::Allocate(const size_t requested, size_t* allocated,
}
}
- LPVOID mbase = RandomizedVirtualAlloc(msize,
- MEM_COMMIT | MEM_RESERVE,
- prot);
+ LPVOID mbase =
+ RandomizedVirtualAlloc(msize, MEM_COMMIT | MEM_RESERVE, prot, hint);
if (mbase == NULL) return NULL;
@@ -805,10 +803,6 @@ void* OS::Allocate(const size_t requested, size_t* allocated,
return mbase;
}
-void* OS::AllocateGuarded(const size_t requested) {
- return VirtualAlloc(nullptr, requested, MEM_RESERVE, PAGE_NOACCESS);
-}
-
void OS::Free(void* address, const size_t size) {
// TODO(1240712): VirtualFree has a return value which is ignored here.
VirtualFree(address, 0, MEM_RELEASE);
@@ -1214,17 +1208,15 @@ int OS::ActivationFrameAlignment() {
VirtualMemory::VirtualMemory() : address_(NULL), size_(0) { }
+VirtualMemory::VirtualMemory(size_t size, void* hint)
+ : address_(ReserveRegion(size, hint)), size_(size) {}
-VirtualMemory::VirtualMemory(size_t size)
- : address_(ReserveRegion(size)), size_(size) { }
-
-
-VirtualMemory::VirtualMemory(size_t size, size_t alignment)
+VirtualMemory::VirtualMemory(size_t size, size_t alignment, void* hint)
: address_(NULL), size_(0) {
DCHECK((alignment % OS::AllocateAlignment()) == 0);
size_t request_size = RoundUp(size + alignment,
static_cast<intptr_t>(OS::AllocateAlignment()));
- void* address = ReserveRegion(request_size);
+ void* address = ReserveRegion(request_size, hint);
if (address == NULL) return;
uint8_t* base = RoundUp(static_cast<uint8_t*>(address), alignment);
// Try reducing the size by freeing and then reallocating a specific area.
@@ -1237,7 +1229,7 @@ VirtualMemory::VirtualMemory(size_t size, size_t alignment)
DCHECK(base == static_cast<uint8_t*>(address));
} else {
// Resizing failed, just go with a bigger area.
- address = ReserveRegion(request_size);
+ address = ReserveRegion(request_size, hint);
if (address == NULL) return;
}
address_ = address;
@@ -1253,12 +1245,6 @@ VirtualMemory::~VirtualMemory() {
}
}
-
-bool VirtualMemory::IsReserved() {
- return address_ != NULL;
-}
-
-
void VirtualMemory::Reset() {
address_ = NULL;
size_ = 0;
@@ -1286,9 +1272,8 @@ bool VirtualMemory::Guard(void* address) {
return true;
}
-
-void* VirtualMemory::ReserveRegion(size_t size) {
- return RandomizedVirtualAlloc(size, MEM_RESERVE, PAGE_NOACCESS);
+void* VirtualMemory::ReserveRegion(size_t size, void* hint) {
+ return RandomizedVirtualAlloc(size, MEM_RESERVE, PAGE_NOACCESS, hint);
}