diff options
author | Evan Cheng <evan.cheng@apple.com> | 2006-11-16 20:04:54 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2006-11-16 20:04:54 +0000 |
commit | 9a1e9b91407f4752ff3de392d60a6cf3f1dcc37d (patch) | |
tree | 231f7490bf4c906a611a4cd2495b124b0aed6e60 /lib | |
parent | ce9a576f298b2159c5f9f39275214870e38ffbef (diff) | |
download | llvm-9a1e9b91407f4752ff3de392d60a6cf3f1dcc37d.tar.gz llvm-9a1e9b91407f4752ff3de392d60a6cf3f1dcc37d.tar.bz2 llvm-9a1e9b91407f4752ff3de392d60a6cf3f1dcc37d.tar.xz |
Allow target to specify alignment for function stub.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@31788 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/ExecutionEngine/JIT/JITEmitter.cpp | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/lib/ExecutionEngine/JIT/JITEmitter.cpp b/lib/ExecutionEngine/JIT/JITEmitter.cpp index 1c2d5d3185..e9b630b1b7 100644 --- a/lib/ExecutionEngine/JIT/JITEmitter.cpp +++ b/lib/ExecutionEngine/JIT/JITEmitter.cpp @@ -275,7 +275,7 @@ namespace { JITMemoryManager(bool useGOT); ~JITMemoryManager(); - inline unsigned char *allocateStub(unsigned StubSize); + inline unsigned char *allocateStub(unsigned StubSize, unsigned Alignment); /// startFunctionBody - When a function starts, allocate a block of free /// executable memory, returning a pointer to it and its actual size. @@ -403,8 +403,11 @@ JITMemoryManager::~JITMemoryManager() { Blocks.clear(); } -unsigned char *JITMemoryManager::allocateStub(unsigned StubSize) { +unsigned char *JITMemoryManager::allocateStub(unsigned StubSize, + unsigned Alignment) { CurStubPtr -= StubSize; + CurStubPtr = (unsigned char*)(((intptr_t)CurStubPtr) & + ~(intptr_t)(Alignment-1)); if (CurStubPtr < StubBase) { // FIXME: allocate a new block std::cerr << "JIT ran out of memory for function stubs!\n"; @@ -700,7 +703,7 @@ public: void initJumpTableInfo(MachineJumpTableInfo *MJTI); void emitJumpTableInfo(MachineJumpTableInfo *MJTI); - virtual void startFunctionStub(unsigned StubSize); + virtual void startFunctionStub(unsigned StubSize, unsigned Alignment = 1); virtual void* finishFunctionStub(const Function *F); virtual void addRelocation(const MachineRelocation &MR) { @@ -769,6 +772,9 @@ void JITEmitter::startFunction(MachineFunction &F) { BufferBegin = CurBufferPtr = MemMgr.startFunctionBody(ActualSize); BufferEnd = BufferBegin+ActualSize; + // Ensure the constant pool/jump table info is at least 4-byte aligned. + emitAlignment(16); + emitConstantPool(F.getConstantPool()); initJumpTableInfo(F.getJumpTableInfo()); @@ -928,12 +934,12 @@ void JITEmitter::emitJumpTableInfo(MachineJumpTableInfo *MJTI) { } } -void JITEmitter::startFunctionStub(unsigned StubSize) { +void JITEmitter::startFunctionStub(unsigned StubSize, unsigned Alignment) { SavedBufferBegin = BufferBegin; SavedBufferEnd = BufferEnd; SavedCurBufferPtr = CurBufferPtr; - BufferBegin = CurBufferPtr = MemMgr.allocateStub(StubSize); + BufferBegin = CurBufferPtr = MemMgr.allocateStub(StubSize, Alignment); BufferEnd = BufferBegin+StubSize+1; } |