[llvm-commits] CVS: llvm/lib/Support/SystemUtils.cpp

Chris Lattner lattner at cs.uiuc.edu
Thu May 27 20:24:02 PDT 2004


Changes in directory llvm/lib/Support:

SystemUtils.cpp updated: 1.26 -> 1.27

---
Log message:

Add support for getting executable memory on Windows.  This is actually 
much easier than on unix.  :)  The only evil thing is that windows.h defines
a macro named FindExecutable, which collides with one of our names.

The JIT now runs on windows, but it cannot resolve external functions 
(like printf) yet.



---
Diffs of the changes:  (+14 -2)

Index: llvm/lib/Support/SystemUtils.cpp
diff -u llvm/lib/Support/SystemUtils.cpp:1.26 llvm/lib/Support/SystemUtils.cpp:1.27
--- llvm/lib/Support/SystemUtils.cpp:1.26	Thu May 27 19:59:40 2004
+++ llvm/lib/Support/SystemUtils.cpp	Thu May 27 20:20:58 2004
@@ -25,6 +25,7 @@
 #include <iostream>
 #include <cstdlib>
 #include <cerrno>
+#include "Config/windows.h"
 using namespace llvm;
 
 /// isExecutableFile - This function returns true if the filename specified
@@ -63,6 +64,7 @@
 /// directory, nor in the PATH.  If the executable cannot be found, return an
 /// empty string.
 /// 
+#undef FindExecutable   // needed on windows :(
 std::string llvm::FindExecutable(const std::string &ExeName,
                                  const std::string &ProgramPath) {
   // First check the directory that bugpoint is in.  We can do this if
@@ -277,6 +279,17 @@
 ///
 void *llvm::AllocateRWXMemory(unsigned NumBytes) {
   if (NumBytes == 0) return 0;
+
+#if defined(HAVE_WINDOWS_H)
+  // On windows we use VirtualAlloc.
+  void *P = VirtualAlloc(0, NumBytes, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
+  if (P == 0) {
+    std::cerr << "Error allocating executable memory!\n";
+    abort();
+  }
+  return P;
+
+#elif defined(HAVE_MMAP)
   static const long pageSize = sysconf(_SC_PAGESIZE);
   unsigned NumPages = (NumBytes+pageSize-1)/pageSize;
 
@@ -289,12 +302,11 @@
 #elif defined(sparc) || defined(__sparc__) || defined(__sparcv9)
 /* nothing */
 #else
-  std::cerr << "This architecture is not supported by the JIT!\n";
+  std::cerr << "This architecture has an unknown MMAP implementation!\n";
   abort();
   return 0;
 #endif
 
-#ifdef HAVE_MMAP
   int fd = -1;
 #if defined(__linux__)
   fd = 0;





More information about the llvm-commits mailing list