[llvm-commits] CVS: llvm/tools/lli/JIT/Emitter.cpp

Misha Brukman brukman at cs.uiuc.edu
Wed Jun 4 14:46:00 PDT 2003


Changes in directory llvm/tools/lli/JIT:

Emitter.cpp updated: 1.10 -> 1.11

---
Log message:

* Institute a hack for the Sparc call to mmap() to get our generated code to be
  laid out closer to the VM so that calls to library functions (e.g. puts()) and
  callback (e.g.  JITResolver::CompilationCallback) fit into 30 bits of the call
  instruction.
* Abort if architecture is not yet supported (not X86 or Sparc) because it
  likely requires a different set of parameters to mmap() .
* Stop using hard-coded values for page size; use sysconf(_SC_PAGESIZE) instead.


---
Diffs of the changes:

Index: llvm/tools/lli/JIT/Emitter.cpp
diff -u llvm/tools/lli/JIT/Emitter.cpp:1.10 llvm/tools/lli/JIT/Emitter.cpp:1.11
--- llvm/tools/lli/JIT/Emitter.cpp:1.10	Sun Jun  1 22:23:16 2003
+++ llvm/tools/lli/JIT/Emitter.cpp	Wed Jun  4 14:45:25 2003
@@ -67,20 +67,25 @@
 // FIXME: This should be rewritten to support a real memory manager for
 // executable memory pages!
 static void *getMemory(unsigned NumPages) {
+  void *pa;
+  if (NumPages == 0) return 0;
+  static const long pageSize = sysconf(_SC_PAGESIZE);
+
 #if defined(i386) || defined(__i386__) || defined(__x86__)
-  static const int fd = 0;
+  pa = mmap(0, pageSize*NumPages, PROT_READ|PROT_WRITE|PROT_EXEC,
+            MAP_PRIVATE|MAP_ANONYMOUS, 0, 0);  /* fd = 0  */
 #elif defined(sparc) || defined(__sparc__) || defined(__sparcv9)
-  static const int fd = -1;
+  static unsigned long Counter = 0;
+  pa = mmap((void*)(0x140000000UL+Counter), pageSize*NumPages,
+            PROT_READ|PROT_WRITE|PROT_EXEC,
+            MAP_PRIVATE|MAP_ANON|MAP_FIXED, -1, 0); /* fd = -1 */
+  Counter += pageSize*NumPages;
+  std::cerr << "getMemory() returning " << pa << "\n";
 #else
-  // This is an unsupported architecture.
-  static const int fd = 0;
+  std::cerr << "This architecture is not supported by the JIT\n";
+  abort();
 #endif
 
-  void *pa;
-  if (NumPages == 0) return 0;
-  static const long pageSize = sysconf (_SC_PAGESIZE);
-  pa = mmap(0, pageSize*NumPages, PROT_READ|PROT_WRITE|PROT_EXEC,
-            MAP_PRIVATE|MAP_ANONYMOUS, fd, 0);
   if (pa == MAP_FAILED) {
     perror("mmap");
     abort();
@@ -118,9 +123,10 @@
 }
 
 void Emitter::startFunctionStub(const Function &F, unsigned StubSize) {
+  static const long pageSize = sysconf(_SC_PAGESIZE);
   SavedCurBlock = CurBlock;  SavedCurByte = CurByte;
   // FIXME: this is a huge waste of memory.
-  CurBlock = (unsigned char *)getMemory((StubSize+4095)/4096);
+  CurBlock = (unsigned char *)getMemory((StubSize+pageSize-1)/pageSize);
   CurByte = CurBlock;  // Start writing at the beginning of the fn.
 }
 





More information about the llvm-commits mailing list