Emit the MachineConstantPool constants in one contiguous memory `pool'.
authorMisha Brukman <brukman+llvm@gmail.com>
Mon, 17 Nov 2003 20:40:07 +0000 (20:40 +0000)
committerMisha Brukman <brukman+llvm@gmail.com>
Mon, 17 Nov 2003 20:40:07 +0000 (20:40 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@10060 91177308-0d34-0410-b5e6-96231b3b80d8

lib/ExecutionEngine/JIT/JITEmitter.cpp

index 32d0651f22675c111711e54e4b29439cf3c7b871..be60b239a3ec035575e57f25ac3f418b70ae0cbb 100644 (file)
@@ -187,13 +187,28 @@ void Emitter::finishFunction(MachineFunction &F) {
 
 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]);
   }
 }