[llvm-commits] CVS: llvm/lib/System/Unix/Memory.cpp

Reid Spencer reid at x10sys.com
Sun Dec 26 22:17:14 PST 2004



Changes in directory llvm/lib/System/Unix:

Memory.cpp updated: 1.1 -> 1.2
---
Log message:

For PR351: http://llvm.cs.uiuc.edu/PR351 :
* Ensure #includes are wrapped with appropriate HAVE_ guards
* Consolidate implementation from operating system specific directory.


---
Diffs of the changes:  (+50 -0)

Index: llvm/lib/System/Unix/Memory.cpp
diff -u llvm/lib/System/Unix/Memory.cpp:1.1 llvm/lib/System/Unix/Memory.cpp:1.2
--- llvm/lib/System/Unix/Memory.cpp:1.1	Fri Sep 10 23:57:25 2004
+++ llvm/lib/System/Unix/Memory.cpp	Mon Dec 27 00:17:03 2004
@@ -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






More information about the llvm-commits mailing list