[llvm-commits] CVS: llvm/lib/ExecutionEngine/JIT/Emitter.cpp

Misha Brukman brukman at cs.uiuc.edu
Mon Nov 17 14:41:01 PST 2003


Changes in directory llvm/lib/ExecutionEngine/JIT:

Emitter.cpp updated: 1.32 -> 1.33

---
Log message:

Emit the MachineConstantPool constants in one contiguous memory `pool'.


---
Diffs of the changes:  (+20 -5)

Index: llvm/lib/ExecutionEngine/JIT/Emitter.cpp
diff -u llvm/lib/ExecutionEngine/JIT/Emitter.cpp:1.32 llvm/lib/ExecutionEngine/JIT/Emitter.cpp:1.33
--- llvm/lib/ExecutionEngine/JIT/Emitter.cpp:1.32	Tue Nov 11 16:41:33 2003
+++ llvm/lib/ExecutionEngine/JIT/Emitter.cpp	Mon Nov 17 14:40:07 2003
@@ -187,13 +187,28 @@
 
 void Emitter::emitConstantPool(MachineConstantPool *MCP) {
   const std::vector<Constant*> &Constants = MCP->getConstants();
+  if (Constants.size() == 0) return;
+
+  std::vector<unsigned> ConstantSizes;
+  unsigned TotalSize = 0;
+  // Calculate how much space we will need for all the constants
   for (unsigned i = 0, e = Constants.size(); i != e; ++i) {
-    // For now we just allocate some memory on the heap, this can be
-    // dramatically improved.
     const Type *Ty = ((Value*)Constants[i])->getType();
-    void *Addr = malloc(TheVM->getTargetData().getTypeSize(Ty));
-    TheVM->InitializeMemory(Constants[i], Addr);
-    ConstantPoolAddresses.push_back(Addr);
+    unsigned TySize = TheVM->getTargetData().getTypeSize(Ty);
+    ConstantSizes.push_back(TySize);
+    TotalSize += TySize;
+  }
+  // Allocate a 'pool' of memory just once
+  void *ConstPool = malloc(TotalSize);
+  if (!ConstPool) {
+    perror("malloc");
+    abort();
+  }
+  // Initialize each slot in the 'pool' appropriately
+  for (unsigned i = 0, e = Constants.size(); i != e; ++i) {
+    TheVM->InitializeMemory(Constants[i], ConstPool);
+    ConstantPoolAddresses.push_back(ConstPool);
+    ConstPool = (void*) ((intptr_t)ConstPool + ConstantSizes[i]);
   }
 }
 





More information about the llvm-commits mailing list