[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