summaryrefslogtreecommitdiff
path: root/lib/ExecutionEngine
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2006-05-02 21:57:51 +0000
committerChris Lattner <sabre@nondot.org>2006-05-02 21:57:51 +0000
commitf5d438c1f0e0c0ed44475ab69f03d86a3c818c60 (patch)
treea8021c4814c092296c84e22700f88bbf5388cd8e /lib/ExecutionEngine
parenta726c7f1fd3c3b75bbb3df8faa7676ef09cb15c8 (diff)
downloadllvm-f5d438c1f0e0c0ed44475ab69f03d86a3c818c60.tar.gz
llvm-f5d438c1f0e0c0ed44475ab69f03d86a3c818c60.tar.bz2
llvm-f5d438c1f0e0c0ed44475ab69f03d86a3c818c60.tar.xz
Do not make the JIT memory manager manage the memory for globals. Instead
just have the JIT malloc them. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@28062 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/ExecutionEngine')
-rw-r--r--lib/ExecutionEngine/JIT/JIT.cpp20
-rw-r--r--lib/ExecutionEngine/JIT/JITEmitter.cpp38
2 files changed, 19 insertions, 39 deletions
diff --git a/lib/ExecutionEngine/JIT/JIT.cpp b/lib/ExecutionEngine/JIT/JIT.cpp
index 5f426b877e..4d3b5a349f 100644
--- a/lib/ExecutionEngine/JIT/JIT.cpp
+++ b/lib/ExecutionEngine/JIT/JIT.cpp
@@ -301,10 +301,22 @@ void *JIT::getOrEmitGlobalVariable(const GlobalVariable *GV) {
// If the global hasn't been emitted to memory yet, allocate space. We will
// actually initialize the global after current function has finished
// compilation.
- uint64_t S = getTargetData().getTypeSize(GV->getType()->getElementType());
- unsigned char A =
- getTargetData().getTypeAlignment(GV->getType()->getElementType());
- Ptr = MCE->allocateGlobal(S, A);
+ const Type *GlobalType = GV->getType()->getElementType();
+ size_t S = getTargetData().getTypeSize(GlobalType);
+ size_t A = getTargetData().getTypeAlignment(GlobalType);
+ if (A <= 8) {
+ Ptr = malloc(S);
+ } else {
+ // Allocate S+A bytes of memory, then use an aligned pointer within that
+ // space.
+ Ptr = malloc(S+A);
+ unsigned MisAligned = ((intptr_t)Ptr & (A-1));
+ unsigned Offset = MisAligned ? (A-MisAligned) : 0;
+
+ // Trim the tail off the memory block.
+ realloc(Ptr, S+Offset);
+ Ptr = (char*)Ptr + Offset;
+ }
state.getPendingGlobals(locked).push_back(GV);
}
addGlobalMapping(GV, Ptr);
diff --git a/lib/ExecutionEngine/JIT/JITEmitter.cpp b/lib/ExecutionEngine/JIT/JITEmitter.cpp
index f4abd28a6c..47b45a0daf 100644
--- a/lib/ExecutionEngine/JIT/JITEmitter.cpp
+++ b/lib/ExecutionEngine/JIT/JITEmitter.cpp
@@ -54,9 +54,8 @@ namespace {
class JITMemoryManager {
std::list<sys::MemoryBlock> Blocks; // List of blocks allocated by the JIT
unsigned char *FunctionBase; // Start of the function body area
- unsigned char *GlobalBase; // Start of the Global area
unsigned char *ConstantBase; // Memory allocated for constant pools
- unsigned char *CurStubPtr, *CurFunctionPtr, *CurConstantPtr, *CurGlobalPtr;
+ unsigned char *CurStubPtr, *CurFunctionPtr, *CurConstantPtr;
unsigned char *GOTBase; // Target Specific reserved memory
// centralize memory block allocation
@@ -68,8 +67,6 @@ namespace {
inline unsigned char *allocateStub(unsigned StubSize);
inline unsigned char *allocateConstant(unsigned ConstantSize,
unsigned Alignment);
- inline unsigned char* allocateGlobal(unsigned Size,
- unsigned Alignment);
inline unsigned char *startFunctionBody();
inline void endFunctionBody(unsigned char *FunctionEnd);
@@ -87,28 +84,22 @@ JITMemoryManager::JITMemoryManager(bool useGOT) {
sys::MemoryBlock FunBlock = getNewMemoryBlock(16 << 20);
// Allocate a 1M block of memory for Constants
sys::MemoryBlock ConstBlock = getNewMemoryBlock(1 << 20);
- // Allocate a 1M Block of memory for Globals
- sys::MemoryBlock GVBlock = getNewMemoryBlock(1 << 20);
Blocks.push_front(FunBlock);
Blocks.push_front(ConstBlock);
- Blocks.push_front(GVBlock);
FunctionBase = reinterpret_cast<unsigned char*>(FunBlock.base());
ConstantBase = reinterpret_cast<unsigned char*>(ConstBlock.base());
- GlobalBase = reinterpret_cast<unsigned char*>(GVBlock.base());
// Allocate stubs backwards from the base, allocate functions forward
// from the base.
CurStubPtr = CurFunctionPtr = FunctionBase + 512*1024;// Use 512k for stubs
CurConstantPtr = ConstantBase + ConstBlock.size();
- CurGlobalPtr = GlobalBase + GVBlock.size();
- //Allocate the GOT just like a global array
+ // Allocate the GOT.
GOTBase = NULL;
- if (useGOT)
- GOTBase = allocateGlobal(sizeof(void*) * 8192, 8);
+ if (useGOT) GOTBase = (unsigned char*)malloc(sizeof(void*) * 8192);
}
JITMemoryManager::~JITMemoryManager() {
@@ -145,23 +136,6 @@ unsigned char *JITMemoryManager::allocateConstant(unsigned ConstantSize,
return CurConstantPtr;
}
-unsigned char *JITMemoryManager::allocateGlobal(unsigned Size,
- unsigned Alignment) {
- // Reserve space and align pointer.
- CurGlobalPtr -= Size;
- CurGlobalPtr =
- (unsigned char *)((intptr_t)CurGlobalPtr & ~((intptr_t)Alignment - 1));
-
- if (CurGlobalPtr < GlobalBase) {
- //Either allocate another MB or 2xSize
- sys::MemoryBlock GVBlock = getNewMemoryBlock(2 * Size);
- GlobalBase = reinterpret_cast<unsigned char*>(GVBlock.base());
- CurGlobalPtr = GlobalBase + GVBlock.size();
- return allocateGlobal(Size, Alignment);
- }
- return CurGlobalPtr;
-}
-
unsigned char *JITMemoryManager::startFunctionBody() {
// Round up to an even multiple of 8 bytes, this should eventually be target
// specific.
@@ -453,7 +427,6 @@ public:
virtual uint64_t getConstantPoolEntryAddress(unsigned Entry);
virtual uint64_t getJumpTableEntryAddress(unsigned Entry);
- virtual unsigned char* allocateGlobal(unsigned size, unsigned alignment);
private:
void *getPointerToGlobal(GlobalValue *GV, void *Reference, bool NoNeedStub);
@@ -681,11 +654,6 @@ uint64_t JITEmitter::getJumpTableEntryAddress(unsigned Index) {
return (intptr_t)((char *)JumpTableBase + Offset);
}
-unsigned char* JITEmitter::allocateGlobal(unsigned size, unsigned alignment)
-{
- return MemMgr.allocateGlobal(size, alignment);
-}
-
// getPointerToNamedFunction - This function is used as a global wrapper to
// JIT::getPointerToNamedFunction for the purpose of resolving symbols when
// bugpoint is debugging the JIT. In that scenario, we are loading an .so and