forked from OSchip/llvm-project
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. llvm-svn: 46354
This commit is contained in:
parent
d145ac0b34
commit
919ad97c01
|
@ -182,10 +182,6 @@ void *JITResolver::getFunctionStub(Function *F) {
|
|||
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 @@ void *JITResolver::getExternalFunctionStub(void *FnAddr) {
|
|||
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;
|
||||
|
|
|
@ -324,6 +324,20 @@ PPCJITInfo::getLazyResolverFunction(JITCompilerFn Fn) {
|
|||
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 @@ void *PPCJITInfo::emitFunctionStub(void *Fn, MachineCodeEmitter &MCE) {
|
|||
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 @@ void *PPCJITInfo::emitFunctionStub(void *Fn, MachineCodeEmitter &MCE) {
|
|||
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 @@ void *PPCJITInfo::emitFunctionStub(void *Fn, MachineCodeEmitter &MCE) {
|
|||
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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue