blob: 19fccbddc26bd0e6501fea9d5649c456cf37d965 [file] [log] [blame]
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001//===- Win32/Memory.cpp - Win32 Memory Implementation -----------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner081ce942007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Dan Gohmanf17a25c2007-07-18 16:29:46 +00007//
8//===----------------------------------------------------------------------===//
9//
10// This file provides the Win32 specific implementation of various Memory
11// management utilities
12//
13//===----------------------------------------------------------------------===//
14
15#include "Win32.h"
Chandler Carruth1ec7df12009-10-26 01:35:46 +000016#include "llvm/System/DataTypes.h"
Dan Gohmanf17a25c2007-07-18 16:29:46 +000017#include "llvm/System/Process.h"
18
19namespace llvm {
20using namespace sys;
21
22//===----------------------------------------------------------------------===//
23//=== WARNING: Implementation here must contain only Win32 specific code
24//=== and must not be UNIX code
25//===----------------------------------------------------------------------===//
26
Reid Klecknercc492292009-07-23 21:46:56 +000027MemoryBlock Memory::AllocateRWX(size_t NumBytes,
Dan Gohmanf17a25c2007-07-18 16:29:46 +000028 const MemoryBlock *NearBlock,
29 std::string *ErrMsg) {
30 if (NumBytes == 0) return MemoryBlock();
31
Reid Klecknercc492292009-07-23 21:46:56 +000032 static const size_t pageSize = Process::GetPageSize();
33 size_t NumPages = (NumBytes+pageSize-1)/pageSize;
Dan Gohmanf17a25c2007-07-18 16:29:46 +000034
35 //FIXME: support NearBlock if ever needed on Win64.
36
37 void *pa = VirtualAlloc(NULL, NumPages*pageSize, MEM_COMMIT,
38 PAGE_EXECUTE_READWRITE);
39 if (pa == NULL) {
40 MakeErrMsg(ErrMsg, "Can't allocate RWX Memory: ");
41 return MemoryBlock();
42 }
43
44 MemoryBlock result;
45 result.Address = pa;
46 result.Size = NumPages*pageSize;
47 return result;
48}
49
Dan Gohmanf17a25c2007-07-18 16:29:46 +000050bool Memory::ReleaseRWX(MemoryBlock &M, std::string *ErrMsg) {
51 if (M.Address == 0 || M.Size == 0) return false;
52 if (!VirtualFree(M.Address, 0, MEM_RELEASE))
53 return MakeErrMsg(ErrMsg, "Can't release RWX Memory: ");
54 return false;
55}
56
Jim Grosbachc599a352008-10-20 21:39:23 +000057bool Memory::setWritable(MemoryBlock &M, std::string *ErrMsg) {
Argiris Kirtzidisdd3f6c12008-10-04 08:15:32 +000058 return true;
59}
60
Jim Grosbachc599a352008-10-20 21:39:23 +000061bool Memory::setExecutable(MemoryBlock &M, std::string *ErrMsg) {
62 return false;
63}
64
65bool Memory::setRangeWritable(const void *Addr, size_t Size) {
66 return true;
67}
68
69bool Memory::setRangeExecutable(const void *Addr, size_t Size) {
Argiris Kirtzidisdd3f6c12008-10-04 08:15:32 +000070 return false;
71}
72
Dan Gohmanf17a25c2007-07-18 16:29:46 +000073}