mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-19 06:31:18 +00:00
Switch the PPC backend and target-independent JIT to use the libsystem
InvalidateInstructionCache method instead of calling through a hook on the JIT. This is a host feature, not a target feature. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@52734 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
95f39009aa
commit
bc52cada09
@ -94,11 +94,6 @@ namespace llvm {
|
|||||||
assert(NumRelocs == 0 && "This target does not have relocations!");
|
assert(NumRelocs == 0 && "This target does not have relocations!");
|
||||||
}
|
}
|
||||||
|
|
||||||
/// InvalidateInstructionCache - Before the JIT can run a block of code
|
|
||||||
// that has been emitted it must invalidate the instruction cache on some
|
|
||||||
// platforms.
|
|
||||||
virtual void InvalidateInstructionCache(const void *Addr, unsigned len) {}
|
|
||||||
|
|
||||||
/// needsGOT - Allows a target to specify that it would like the
|
/// needsGOT - Allows a target to specify that it would like the
|
||||||
// JIT to manage a GOT for it.
|
// JIT to manage a GOT for it.
|
||||||
bool needsGOT() const { return useGOT; }
|
bool needsGOT() const { return useGOT; }
|
||||||
|
@ -32,6 +32,7 @@
|
|||||||
#include "llvm/Support/Debug.h"
|
#include "llvm/Support/Debug.h"
|
||||||
#include "llvm/Support/MutexGuard.h"
|
#include "llvm/Support/MutexGuard.h"
|
||||||
#include "llvm/System/Disassembler.h"
|
#include "llvm/System/Disassembler.h"
|
||||||
|
#include "llvm/System/Memory.h"
|
||||||
#include "llvm/Target/TargetInstrInfo.h"
|
#include "llvm/Target/TargetInstrInfo.h"
|
||||||
#include "llvm/ADT/Statistic.h"
|
#include "llvm/ADT/Statistic.h"
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
@ -742,7 +743,7 @@ bool JITEmitter::finishFunction(MachineFunction &F) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Invalidate the icache if necessary.
|
// Invalidate the icache if necessary.
|
||||||
TheJIT->getJITInfo().InvalidateInstructionCache(FnStart, FnEnd-FnStart);
|
sys::Memory::InvalidateInstructionCache(FnStart, FnEnd-FnStart);
|
||||||
|
|
||||||
// Add it to the JIT symbol table if the host wants it.
|
// Add it to the JIT symbol table if the host wants it.
|
||||||
AddFunctionToSymbolTable(F.getFunction()->getNameStart(),
|
AddFunctionToSymbolTable(F.getFunction()->getNameStart(),
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
#include "PPCTargetMachine.h"
|
#include "PPCTargetMachine.h"
|
||||||
#include "llvm/Function.h"
|
#include "llvm/Function.h"
|
||||||
#include "llvm/CodeGen/MachineCodeEmitter.h"
|
#include "llvm/CodeGen/MachineCodeEmitter.h"
|
||||||
#include "llvm/Config/alloca.h"
|
#include "llvm/System/Memory.h"
|
||||||
#include "llvm/Support/Debug.h"
|
#include "llvm/Support/Debug.h"
|
||||||
#include <set>
|
#include <set>
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
@ -330,29 +330,6 @@ defined(__APPLE__)
|
|||||||
extern "C" void sys_icache_invalidate(const void *Addr, size_t len);
|
extern "C" void sys_icache_invalidate(const void *Addr, size_t len);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void PPCJITInfo::InvalidateInstructionCache(const void *Addr, unsigned len) {
|
|
||||||
#if (defined(__POWERPC__) || defined (__ppc__) || \
|
|
||||||
defined(_POWER) || defined(_ARCH_PPC))
|
|
||||||
# if defined(__APPLE__)
|
|
||||||
sys_icache_invalidate(Addr, len);
|
|
||||||
# elif defined(__GNUC__)
|
|
||||||
const size_t LineSize = 32;
|
|
||||||
|
|
||||||
const intptr_t Mask = ~(LineSize - 1);
|
|
||||||
const intptr_t StartLine = ((intptr_t) Addr) & Mask;
|
|
||||||
const intptr_t EndLine = ((intptr_t) Addr + len + LineSize - 1) & Mask;
|
|
||||||
|
|
||||||
for (intptr_t Line = StartLine; Line < EndLine; Line += LineSize)
|
|
||||||
asm volatile("dcbf 0, %0" : : "r"(Line));
|
|
||||||
asm volatile("sync");
|
|
||||||
|
|
||||||
for (intptr_t Line = StartLine; Line < EndLine; Line += LineSize)
|
|
||||||
asm volatile("icbi 0, %0" : : "r"(Line));
|
|
||||||
asm volatile("isync");
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void *PPCJITInfo::emitFunctionStub(const Function* F, void *Fn,
|
void *PPCJITInfo::emitFunctionStub(const Function* F, void *Fn,
|
||||||
MachineCodeEmitter &MCE) {
|
MachineCodeEmitter &MCE) {
|
||||||
// If this is just a call to an external function, emit a branch instead of a
|
// If this is just a call to an external function, emit a branch instead of a
|
||||||
@ -369,7 +346,7 @@ void *PPCJITInfo::emitFunctionStub(const Function* F, void *Fn,
|
|||||||
MCE.emitWordBE(0);
|
MCE.emitWordBE(0);
|
||||||
MCE.emitWordBE(0);
|
MCE.emitWordBE(0);
|
||||||
EmitBranchToAt(Addr, (intptr_t)Fn, false, is64Bit);
|
EmitBranchToAt(Addr, (intptr_t)Fn, false, is64Bit);
|
||||||
InvalidateInstructionCache((void*)Addr, 7*4);
|
sys::Memory::InvalidateInstructionCache((void*)Addr, 7*4);
|
||||||
return MCE.finishFunctionStub(F);
|
return MCE.finishFunctionStub(F);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -397,7 +374,7 @@ void *PPCJITInfo::emitFunctionStub(const Function* F, void *Fn,
|
|||||||
MCE.emitWordBE(0);
|
MCE.emitWordBE(0);
|
||||||
MCE.emitWordBE(0);
|
MCE.emitWordBE(0);
|
||||||
EmitBranchToAt(BranchAddr, (intptr_t)Fn, true, is64Bit);
|
EmitBranchToAt(BranchAddr, (intptr_t)Fn, true, is64Bit);
|
||||||
InvalidateInstructionCache((void*)Addr, 10*4);
|
sys::Memory::InvalidateInstructionCache((void*)Addr, 10*4);
|
||||||
return MCE.finishFunctionStub(F);
|
return MCE.finishFunctionStub(F);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,11 +41,6 @@ namespace llvm {
|
|||||||
/// code.
|
/// code.
|
||||||
///
|
///
|
||||||
virtual void replaceMachineCodeForFunction(void *Old, void *New);
|
virtual void replaceMachineCodeForFunction(void *Old, void *New);
|
||||||
|
|
||||||
/// InvalidateInstructionCache - Before the JIT can run a block of code
|
|
||||||
// that has been emitted it must invalidate the instruction cache on some
|
|
||||||
// platforms.
|
|
||||||
virtual void InvalidateInstructionCache(const void *Addr, unsigned len);
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user