forked from OSchip/llvm-project
For PR351:
* Ensure #includes are wrapped with appropriate HAVE_ guards * Consolidate implementation from operating system specific directory. llvm-svn: 19157
This commit is contained in:
parent
d554bbcefd
commit
47cd653411
|
@ -12,9 +12,59 @@
|
|||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "Unix.h"
|
||||
#include "llvm/System/Process.h"
|
||||
|
||||
#ifdef HAVE_SYS_MMAN_H
|
||||
#include <sys/mman.h>
|
||||
#endif
|
||||
|
||||
namespace llvm {
|
||||
|
||||
/// AllocateRWXMemory - Allocate a slab of memory with read/write/execute
|
||||
/// permissions. This is typically used for JIT applications where we want
|
||||
/// to emit code to the memory then jump to it. Getting this type of memory
|
||||
/// is very OS specific.
|
||||
///
|
||||
MemoryBlock Memory::AllocateRWX(unsigned NumBytes) {
|
||||
if (NumBytes == 0) return MemoryBlock();
|
||||
|
||||
long pageSize = Process::GetPageSize();
|
||||
unsigned NumPages = (NumBytes+pageSize-1)/pageSize;
|
||||
|
||||
int fd = -1;
|
||||
#ifdef NEED_DEV_ZERO_FOR_MMAP
|
||||
static int zero_fd = open("/dev/zero", O_RDWR);
|
||||
if (zero_fd == -1) {
|
||||
ThrowErrno("Can't open /dev/zero device");
|
||||
}
|
||||
fd = zero_fd;
|
||||
#endif
|
||||
|
||||
int flags = MAP_PRIVATE |
|
||||
#ifdef HAVE_MMAP_ANONYMOUS
|
||||
MAP_ANONYMOUS
|
||||
#else
|
||||
MAP_ANON
|
||||
#endif
|
||||
;
|
||||
void *pa = ::mmap(0, pageSize*NumPages, PROT_READ|PROT_WRITE|PROT_EXEC,
|
||||
flags, fd, 0);
|
||||
if (pa == MAP_FAILED) {
|
||||
ThrowErrno("Can't allocate RWX Memory");
|
||||
}
|
||||
MemoryBlock result;
|
||||
result.Address = pa;
|
||||
result.Size = NumPages*pageSize;
|
||||
return result;
|
||||
}
|
||||
|
||||
void Memory::ReleaseRWX(MemoryBlock& M) {
|
||||
if (M.Address == 0 || M.Size == 0) return;
|
||||
if (0 != ::munmap(M.Address, M.Size)) {
|
||||
ThrowErrno("Can't release RWX Memory");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// vim: sw=2 smartindent smarttab tw=80 autoindent expandtab
|
||||
|
|
Loading…
Reference in New Issue