mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-14 17:34:41 +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!");
|
||||
}
|
||||
|
||||
/// 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
|
||||
// JIT to manage a GOT for it.
|
||||
bool needsGOT() const { return useGOT; }
|
||||
|
@ -32,6 +32,7 @@
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/MutexGuard.h"
|
||||
#include "llvm/System/Disassembler.h"
|
||||
#include "llvm/System/Memory.h"
|
||||
#include "llvm/Target/TargetInstrInfo.h"
|
||||
#include "llvm/ADT/Statistic.h"
|
||||
#include <algorithm>
|
||||
@ -742,7 +743,7 @@ bool JITEmitter::finishFunction(MachineFunction &F) {
|
||||
}
|
||||
|
||||
// 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.
|
||||
AddFunctionToSymbolTable(F.getFunction()->getNameStart(),
|
||||
|
@ -17,7 +17,7 @@
|
||||
#include "PPCTargetMachine.h"
|
||||
#include "llvm/Function.h"
|
||||
#include "llvm/CodeGen/MachineCodeEmitter.h"
|
||||
#include "llvm/Config/alloca.h"
|
||||
#include "llvm/System/Memory.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include <set>
|
||||
using namespace llvm;
|
||||
@ -330,29 +330,6 @@ defined(__APPLE__)
|
||||
extern "C" void sys_icache_invalidate(const void *Addr, size_t len);
|
||||
#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,
|
||||
MachineCodeEmitter &MCE) {
|
||||
// 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);
|
||||
EmitBranchToAt(Addr, (intptr_t)Fn, false, is64Bit);
|
||||
InvalidateInstructionCache((void*)Addr, 7*4);
|
||||
sys::Memory::InvalidateInstructionCache((void*)Addr, 7*4);
|
||||
return MCE.finishFunctionStub(F);
|
||||
}
|
||||
|
||||
@ -397,7 +374,7 @@ void *PPCJITInfo::emitFunctionStub(const Function* F, void *Fn,
|
||||
MCE.emitWordBE(0);
|
||||
MCE.emitWordBE(0);
|
||||
EmitBranchToAt(BranchAddr, (intptr_t)Fn, true, is64Bit);
|
||||
InvalidateInstructionCache((void*)Addr, 10*4);
|
||||
sys::Memory::InvalidateInstructionCache((void*)Addr, 10*4);
|
||||
return MCE.finishFunctionStub(F);
|
||||
}
|
||||
|
||||
|
@ -41,11 +41,6 @@ namespace llvm {
|
||||
/// code.
|
||||
///
|
||||
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