Author: lattner Date: Fri Jan 25 10:41:09 2008 New Revision: 46354 URL: http://llvm.org/viewvc/llvm-project?rev=46354&view=rev Log: JITEmitter.cpp was trying to sync the icache for function stubs, but was actually passing a completely incorrect size to sys_icache_invalidate. Instead of having the JITEmitter do this (which doesn't have the correct size), just make the target sync its own stubs.
Modified: llvm/trunk/lib/ExecutionEngine/JIT/JITEmitter.cpp llvm/trunk/lib/Target/PowerPC/PPCJITInfo.cpp Modified: llvm/trunk/lib/ExecutionEngine/JIT/JITEmitter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/JIT/JITEmitter.cpp?rev=46354&r1=46353&r2=46354&view=diff ============================================================================== --- llvm/trunk/lib/ExecutionEngine/JIT/JITEmitter.cpp (original) +++ llvm/trunk/lib/ExecutionEngine/JIT/JITEmitter.cpp Fri Jan 25 10:41:09 2008 @@ -182,10 +182,6 @@ TheJIT->updateGlobalMapping(F, Stub); } - // Invalidate the icache if necessary. - synchronizeICache(Stub, TheJIT->getCodeEmitter()->getCurrentPCValue() - - (intptr_t)Stub); - DOUT << "JIT: Stub emitted at [" << Stub << "] for function '" << F->getName() << "'\n"; @@ -224,10 +220,6 @@ Stub = TheJIT->getJITInfo().emitFunctionStub(FnAddr, *TheJIT->getCodeEmitter()); - // Invalidate the icache if necessary. - synchronizeICache(Stub, TheJIT->getCodeEmitter()->getCurrentPCValue() - - (intptr_t)Stub); - DOUT << "JIT: Stub emitted at [" << Stub << "] for external function at '" << FnAddr << "'\n"; return Stub; Modified: llvm/trunk/lib/Target/PowerPC/PPCJITInfo.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCJITInfo.cpp?rev=46354&r1=46353&r2=46354&view=diff ============================================================================== --- llvm/trunk/lib/Target/PowerPC/PPCJITInfo.cpp (original) +++ llvm/trunk/lib/Target/PowerPC/PPCJITInfo.cpp Fri Jan 25 10:41:09 2008 @@ -324,6 +324,20 @@ return is64Bit ? PPC64CompilationCallback : PPC32CompilationCallback; } +#if (defined(__POWERPC__) || defined (__ppc__) || defined(_POWER)) && \ +defined(__APPLE__) +extern "C" void sys_icache_invalidate(const void *Addr, size_t len); +#endif + +/// SyncICache - On PPC, the JIT emitted code must be explicitly refetched to +/// ensure correct execution. +static void SyncICache(const void *Addr, size_t len) { +#if (defined(__POWERPC__) || defined (__ppc__) || defined(_POWER)) && \ +defined(__APPLE__) + sys_icache_invalidate(Addr, len); +#endif +} + void *PPCJITInfo::emitFunctionStub(void *Fn, MachineCodeEmitter &MCE) { // If this is just a call to an external function, emit a branch instead of a // call. The code is the same except for one bit of the last instruction. @@ -339,10 +353,12 @@ MCE.emitWordBE(0); MCE.emitWordBE(0); EmitBranchToAt(Addr, (intptr_t)Fn, false, is64Bit); + SyncICache((void*)Addr, 7*4); return MCE.finishFunctionStub(0); } MCE.startFunctionStub(10*4); + intptr_t Addr = (intptr_t)MCE.getCurrentPCValue(); if (is64Bit) { MCE.emitWordBE(0xf821ffb1); // stdu r1,-80(r1) MCE.emitWordBE(0x7d6802a6); // mflr r11 @@ -356,7 +372,7 @@ MCE.emitWordBE(0x7d6802a6); // mflr r11 MCE.emitWordBE(0x91610024); // stw r11, 36(r1) } - intptr_t Addr = (intptr_t)MCE.getCurrentPCValue(); + intptr_t BranchAddr = (intptr_t)MCE.getCurrentPCValue(); MCE.emitWordBE(0); MCE.emitWordBE(0); MCE.emitWordBE(0); @@ -364,7 +380,8 @@ MCE.emitWordBE(0); MCE.emitWordBE(0); MCE.emitWordBE(0); - EmitBranchToAt(Addr, (intptr_t)Fn, true, is64Bit); + EmitBranchToAt(BranchAddr, (intptr_t)Fn, true, is64Bit); + SyncICache((void*)Addr, 10*4); return MCE.finishFunctionStub(0); } _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits