aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2005-01-10 18:23:22 +0000
committerChris Lattner <sabre@nondot.org>2005-01-10 18:23:22 +0000
commit281a601198f55be89914e64dca0801ba94f925ef (patch)
treec01d74ae1cded898c734ee1985b8a4b188d24191
parentecc1cef8bfd07575ba4026780adf7054c771e12e (diff)
Rework constant pool handling so that function constant pools are no longer
leaked to the system. Now they are destroyed with the JITMemoryManager is destroyed. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@19434 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/ExecutionEngine/JIT/JITEmitter.cpp45
1 files changed, 24 insertions, 21 deletions
diff --git a/lib/ExecutionEngine/JIT/JITEmitter.cpp b/lib/ExecutionEngine/JIT/JITEmitter.cpp
index bd00c964cc..7f6a89ed48 100644
--- a/lib/ExecutionEngine/JIT/JITEmitter.cpp
+++ b/lib/ExecutionEngine/JIT/JITEmitter.cpp
@@ -48,14 +48,17 @@ namespace {
sys::MemoryBlock MemBlock; // Virtual memory block allocated RWX
unsigned char *MemBase; // Base of block of memory, start of stub mem
unsigned char *FunctionBase; // Start of the function body area
- unsigned char *CurStubPtr, *CurFunctionPtr;
+ unsigned char *ConstantPool; // Memory allocated for constant pools
+ unsigned char *CurStubPtr, *CurFunctionPtr, *CurConstantPtr;
public:
JITMemoryManager();
~JITMemoryManager();
inline unsigned char *allocateStub(unsigned StubSize);
+ inline unsigned char *allocateConstant(unsigned ConstantSize,
+ unsigned Alignment);
inline unsigned char *startFunctionBody();
- inline void endFunctionBody(unsigned char *FunctionEnd);
+ inline void endFunctionBody(unsigned char *FunctionEnd);
};
}
@@ -68,10 +71,14 @@ JITMemoryManager::JITMemoryManager() {
// Allocate stubs backwards from the function base, allocate functions forward
// from the function base.
CurStubPtr = CurFunctionPtr = FunctionBase;
+
+ ConstantPool = new unsigned char [512*1024]; // Use 512k for constant pools
+ CurConstantPtr = ConstantPool + 512*1024;
}
JITMemoryManager::~JITMemoryManager() {
sys::Memory::ReleaseRWX(MemBlock);
+ delete[] ConstantPool;
}
unsigned char *JITMemoryManager::allocateStub(unsigned StubSize) {
@@ -83,6 +90,20 @@ unsigned char *JITMemoryManager::allocateStub(unsigned StubSize) {
return CurStubPtr;
}
+unsigned char *JITMemoryManager::allocateConstant(unsigned ConstantSize,
+ unsigned Alignment) {
+ // Reserve space and align pointer.
+ CurConstantPtr -= ConstantSize;
+ CurConstantPtr =
+ (unsigned char *)((intptr_t)CurConstantPtr & ~((intptr_t)Alignment - 1));
+
+ if (CurConstantPtr < ConstantPool) {
+ std::cerr << "JIT ran out of memory for constant pools!\n";
+ abort();
+ }
+ return CurConstantPtr;
+}
+
unsigned char *JITMemoryManager::startFunctionBody() {
// Round up to an even multiple of 8 bytes, this should eventually be target
// specific.
@@ -352,30 +373,12 @@ void JITEmitter::emitConstantPool(MachineConstantPool *MCP) {
const std::vector<Constant*> &Constants = MCP->getConstants();
if (Constants.empty()) return;
- std::vector<unsigned> ConstantOffset;
- ConstantOffset.reserve(Constants.size());
-
- // Calculate how much space we will need for all the constants, and the offset
- // each one will live in.
- unsigned TotalSize = 0;
for (unsigned i = 0, e = Constants.size(); i != e; ++i) {
const Type *Ty = Constants[i]->getType();
unsigned Size = (unsigned)TheJIT->getTargetData().getTypeSize(Ty);
unsigned Alignment = TheJIT->getTargetData().getTypeAlignment(Ty);
- // Make sure to take into account the alignment requirements of the type.
- TotalSize = (TotalSize + Alignment-1) & ~(Alignment-1);
-
- // Remember the offset this element lives at.
- ConstantOffset.push_back(TotalSize);
- TotalSize += Size; // Reserve space for the constant.
- }
- // Now that we know how much memory to allocate, do so.
- char *Pool = new char[TotalSize];
-
- // Actually output all of the constants, and remember their addresses.
- for (unsigned i = 0, e = Constants.size(); i != e; ++i) {
- void *Addr = Pool + ConstantOffset[i];
+ void *Addr = MemMgr.allocateConstant(Size, Alignment);
TheJIT->InitializeMemory(Constants[i], Addr);
ConstantPoolAddresses.push_back(Addr);
}