Add support for getting executable memory on Windows. This is actually
authorChris Lattner <sabre@nondot.org>
Fri, 28 May 2004 01:20:58 +0000 (01:20 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 28 May 2004 01:20:58 +0000 (01:20 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@13871 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Support/SystemUtils.cpp

index 240044516eb61bb045ad18accf6e55d6f7ee8c2b..c0fb7720ca8ea2bce191045ac4faa42b389d33e3 100644 (file)
@@ -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 @@ bool llvm::isStandardOutAConsole() {
 /// 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 @@ int llvm::ExecWait(const char * const old_argv[],
 ///
 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 @@ void *llvm::AllocateRWXMemory(unsigned NumBytes) {
 #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;