Add an option to allocate JITed global data separately from code. By

default, this option is not enabled to support clients who rely on
this behavior.

Fixes http://llvm.org/PR4483

A patch to allocate additional memory for globals after we run out is
forthcoming.

Patch by Reid Kleckner!


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@75059 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Jeffrey Yasskin
2009-07-08 21:59:57 +00:00
parent e41dec60fa
commit 489393d7b9
12 changed files with 291 additions and 72 deletions

View File

@@ -267,6 +267,11 @@ public:
return Result;
}
/// allocateGlobal - Allocate memory for a global. Unlike allocateSpace,
/// this method does not allocate memory in the current output buffer,
/// because a global may live longer than the current function.
virtual void *allocateGlobal(uintptr_t Size, unsigned Alignment) = 0;
/// StartMachineBasicBlock - This should be called by the target when a new
/// basic block is about to be emitted. This way the MCE knows where the
/// start of the block is, and can implement getMachineBasicBlockAddress.

View File

@@ -87,7 +87,8 @@ protected:
// libraries, the JIT and Interpreter set these functions to ctor pointers
// at startup time if they are linked in.
typedef ExecutionEngine *(*EECtorFn)(ModuleProvider*, std::string*,
CodeGenOpt::Level OptLevel);
CodeGenOpt::Level OptLevel,
bool GVsWithCode);
static EECtorFn JITCtor, InterpCtor;
/// LazyFunctionCreator - If an unknown function is needed, this function
@@ -118,8 +119,18 @@ public:
bool ForceInterpreter = false,
std::string *ErrorStr = 0,
CodeGenOpt::Level OptLevel =
CodeGenOpt::Default);
CodeGenOpt::Default,
// Allocating globals with code breaks
// freeMachineCodeForFunction and is probably
// unsafe and bad for performance. However,
// we have clients who depend on this
// behavior, so we must support it.
// Eventually, when we're willing to break
// some backwards compatability, this flag
// should be flipped to false, so that by
// default freeMachineCodeForFunction works.
bool GVsWithCode = true);
/// create - This is the factory method for creating an execution engine which
/// is appropriate for the current machine. This takes ownership of the
/// module.
@@ -132,7 +143,8 @@ public:
std::string *ErrorStr = 0,
JITMemoryManager *JMM = 0,
CodeGenOpt::Level OptLevel =
CodeGenOpt::Default);
CodeGenOpt::Default,
bool GVsWithCode = true);
/// addModuleProvider - Add a ModuleProvider to the list of modules that we
/// can JIT from. Note that this takes ownership of the ModuleProvider: when

View File

@@ -28,6 +28,7 @@ protected:
bool HasGOT;
bool SizeRequired;
public:
JITMemoryManager() : HasGOT(false), SizeRequired(false) {}
virtual ~JITMemoryManager();
@@ -43,6 +44,11 @@ public:
/// start execution, the code pages may need permissions changed.
virtual void setMemoryExecutable(void) = 0;
/// setPoisonMemory - Setting this flag to true makes the memory manager
/// garbage values over freed memory. This is useful for testing and
/// debugging, and is be turned on by default in debug mode.
virtual void setPoisonMemory(bool poison) = 0;
//===--------------------------------------------------------------------===//
// Global Offset Table Management
//===--------------------------------------------------------------------===//
@@ -114,7 +120,10 @@ public:
/// allocateSpace - Allocate a memory block of the given size.
virtual uint8_t *allocateSpace(intptr_t Size, unsigned Alignment) = 0;
/// allocateGlobal - Allocate memory for a global.
virtual uint8_t *allocateGlobal(uintptr_t Size, unsigned Alignment) = 0;
/// deallocateMemForFunction - Free JIT memory for the specified function.
/// This is never called when the JIT is currently emitting a function.
virtual void deallocateMemForFunction(const Function *F) = 0;