Skip to content

Commit

Permalink
Do not make the JIT memory manager manage the memory for globals. Ins…
Browse files Browse the repository at this point in the history
…tead

just have the JIT malloc them.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@28062 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
lattner committed May 2, 2006
1 parent a726c7f commit f5d438c
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 46 deletions.
3 changes: 0 additions & 3 deletions include/llvm/CodeGen/MachineCodeEmitter.h
Original file line number Diff line number Diff line change
Expand Up @@ -166,9 +166,6 @@ class MachineCodeEmitter {
/// 'Index' in the function that last called initJumpTableInfo.
///
virtual uint64_t getJumpTableEntryAddress(unsigned Index) = 0;

// allocateGlobal - Allocate some space for a global variable.
virtual unsigned char* allocateGlobal(unsigned size, unsigned alignment) = 0;
};

} // End llvm namespace
Expand Down
4 changes: 0 additions & 4 deletions lib/CodeGen/ELFWriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -73,10 +73,6 @@ namespace llvm {
assert(0 && "JT not implementated yet!");
return 0;
}
virtual unsigned char* allocateGlobal(unsigned size, unsigned alignment) {
assert(0 && "Globals not implemented yet!");
return 0;
}

/// JIT SPECIFIC FUNCTIONS - DO NOT IMPLEMENT THESE HERE!
void startFunctionStub(unsigned StubSize) {
Expand Down
20 changes: 16 additions & 4 deletions lib/ExecutionEngine/JIT/JIT.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
38 changes: 3 additions & 35 deletions lib/ExecutionEngine/JIT/JITEmitter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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);

Expand All @@ -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() {
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -453,7 +427,6 @@ namespace {

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);
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit f5d438c

Please sign in to comment.