diff options
Diffstat (limited to 'lib/System/Win32/Memory.cpp')
-rw-r--r-- | lib/System/Win32/Memory.cpp | 35 |
1 files changed, 22 insertions, 13 deletions
diff --git a/lib/System/Win32/Memory.cpp b/lib/System/Win32/Memory.cpp index 946e50c..ab3bb51 100644 --- a/lib/System/Win32/Memory.cpp +++ b/lib/System/Win32/Memory.cpp @@ -2,7 +2,7 @@ // // The LLVM Compiler Infrastructure // -// This file was developed by Reid Spencer and is distributed under the +// This file was developed by Jeff Cohen and is distributed under the // University of Illinois Open Source License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// @@ -12,34 +12,43 @@ // //===----------------------------------------------------------------------===// -#include <llvm/System/Process.h> -#include "windows.h" +#include "Win32.h" +#include "llvm/System/Memory.h" +#include "llvm/System/Process.h" namespace llvm { using namespace sys; //===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only Win32 specific code. +//=== WARNING: Implementation here must contain only Win32 specific code +//=== and must not be UNIX code //===----------------------------------------------------------------------===// MemoryBlock Memory::AllocateRWX(unsigned NumBytes) { if (NumBytes == 0) return MemoryBlock(); - unsigned pageSize = Process::GetPageSize(); + static const long pageSize = Process::GetPageSize(); unsigned NumPages = (NumBytes+pageSize-1)/pageSize; - void *P = VirtualAlloc(0, NumPages*pageSize, MEM_COMMIT, - PAGE_EXECUTE_READWRITE); - if (P == 0) { - throw std::string("Couldn't allocate ") + utostr(NumBytes) + - " bytes of executable memory!"; + + void *pa = VirtualAlloc(NULL, NumPages*pageSize, MEM_COMMIT, + PAGE_EXECUTE_READWRITE); + if (pa == NULL) { + ThrowError("Can't allocate RWX Memory: "); } + MemoryBlock result; - result.Address = P; - result.Size = NumBytes; + result.Address = pa; + result.Size = NumPages*pageSize; return result; } void Memory::ReleaseRWX(MemoryBlock& M) { if (M.Address == 0 || M.Size == 0) return; - VirtualFree(M.Address, M.Size, MEM_DECOMMIT, PAGE_NOACCESS); + if (!VirtualFree(M.Address, 0, MEM_RELEASE)) { + ThrowError("Can't release RWX Memory: "); + } } + +} + +// vim: sw=2 smartindent smarttab tw=80 autoindent expandtab |