forked from OSchip/llvm-project
For some targets, it's not possible to place GVs in the same memory buffer as the MachineCodeEmitter allocated memory. Code and data has different read / write / execution privilege requirements.
This is a short term workaround. The current solution is for the JIT memory manager to manage code and data memory separately. llvm-svn: 58688
This commit is contained in:
parent
a6dee4e28f
commit
9340be4641
|
@ -110,6 +110,11 @@ namespace llvm {
|
|||
/// hasCustomConstantPool - Allows a target to specify that constant
|
||||
/// pool address resolution is handled by the target.
|
||||
virtual bool hasCustomConstantPool() const { return false; }
|
||||
|
||||
/// allocateSeparateGVMemory - If true, globals should be placed in
|
||||
/// separately allocated heap memory rather than in the same
|
||||
/// code memory allocated by MachineCodeEmitter.
|
||||
virtual bool allocateSeparateGVMemory() const { return false; }
|
||||
protected:
|
||||
bool useGOT;
|
||||
};
|
||||
|
|
|
@ -565,6 +565,16 @@ void *JIT::getOrEmitGlobalVariable(const GlobalVariable *GV) {
|
|||
if (GV->isThreadLocal()) {
|
||||
MutexGuard locked(lock);
|
||||
Ptr = TJI.allocateThreadLocalMemory(S);
|
||||
} else if (TJI.allocateSeparateGVMemory()) {
|
||||
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));
|
||||
Ptr = (char*)Ptr + (MisAligned ? (A-MisAligned) : 0);
|
||||
}
|
||||
} else {
|
||||
Ptr = MCE->allocateSpace(S, A);
|
||||
}
|
||||
|
|
|
@ -65,6 +65,17 @@ namespace llvm {
|
|||
/// pool address resolution is handled by the target.
|
||||
virtual bool hasCustomConstantPool() const { return true; }
|
||||
|
||||
/// allocateSeparateGVMemory - If true, globals should be placed in
|
||||
/// separately allocated heap memory rather than in the same
|
||||
/// code memory allocated by MachineCodeEmitter.
|
||||
virtual bool allocateSeparateGVMemory() const {
|
||||
#ifdef __APPLE__
|
||||
return true;
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
/// Initialize - Initialize internal stage. Get the list of constant pool
|
||||
/// Resize constant pool ids to CONSTPOOL_ENTRY addresses map.
|
||||
void Initialize(const std::vector<MachineConstantPoolEntry> *mcpes) {
|
||||
|
|
Loading…
Reference in New Issue