diff options
author | Nuno Lopes <nunoplopes@sapo.pt> | 2008-10-21 11:42:16 +0000 |
---|---|---|
committer | Nuno Lopes <nunoplopes@sapo.pt> | 2008-10-21 11:42:16 +0000 |
commit | cef7527a85d026aeb17a4dacca73c70c0ab5da40 (patch) | |
tree | 0a85fcdb02a052b1f08c226af631021cab95fc2c /lib/ExecutionEngine/JIT/JITEmitter.cpp | |
parent | e06e91122fefcadd252ddd2f2591e181683fc2f1 (diff) |
fix a tricky bug in the JIT global variable emitter, that was triggered when JITing a variable independently of a function. This lead to sharing memory memory between functions and GVs thus changing the value of a GV could change the code in execution. more details on the ML.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@57900 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/ExecutionEngine/JIT/JITEmitter.cpp')
-rw-r--r-- | lib/ExecutionEngine/JIT/JITEmitter.cpp | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/lib/ExecutionEngine/JIT/JITEmitter.cpp b/lib/ExecutionEngine/JIT/JITEmitter.cpp index a90a6a52fa..688d4984c2 100644 --- a/lib/ExecutionEngine/JIT/JITEmitter.cpp +++ b/lib/ExecutionEngine/JIT/JITEmitter.cpp @@ -518,6 +518,10 @@ namespace { unsigned Alignment = 1); virtual void* finishFunctionStub(const GlobalValue *F); + /// allocateSpace - Reserves space in the current block if any, or + /// allocate a new one of the given size. + virtual void *allocateSpace(intptr_t Size, unsigned Alignment); + virtual void addRelocation(const MachineRelocation &MR) { Relocations.push_back(MR); } @@ -915,11 +919,6 @@ bool JITEmitter::finishFunction(MachineFunction &F) { Relocations.size(), MemMgr->getGOTBase()); } - unsigned char *FnEnd = CurBufferPtr; - - MemMgr->endFunctionBody(F.getFunction(), BufferBegin, FnEnd); - NumBytes += FnEnd-FnStart; - // Update the GOT entry for F to point to the new code. if (MemMgr->isManagingGOT()) { unsigned idx = Resolver.getGOTIndexForAddr((void*)BufferBegin); @@ -930,6 +929,12 @@ bool JITEmitter::finishFunction(MachineFunction &F) { } } + unsigned char *FnEnd = CurBufferPtr; + + MemMgr->endFunctionBody(F.getFunction(), BufferBegin, FnEnd); + BufferBegin = CurBufferPtr = 0; + NumBytes += FnEnd-FnStart; + // Invalidate the icache if necessary. sys::Memory::InvalidateInstructionCache(FnStart, FnEnd-FnStart); @@ -993,6 +998,18 @@ bool JITEmitter::finishFunction(MachineFunction &F) { return false; } +void* JITEmitter::allocateSpace(intptr_t Size, unsigned Alignment) { + if (BufferBegin) + return MachineCodeEmitter::allocateSpace(Size, Alignment); + + // create a new memory block if there is no active one. + // care must be taken so that BufferBegin is invalidated when a + // block is trimmed + BufferBegin = CurBufferPtr = MemMgr->allocateSpace(Size, Alignment); + BufferEnd = BufferBegin+Size; + return CurBufferPtr; +} + void JITEmitter::emitConstantPool(MachineConstantPool *MCP) { const std::vector<MachineConstantPoolEntry> &Constants = MCP->getConstants(); if (Constants.empty()) return; |