diff options
author | Chris Lattner <sabre@nondot.org> | 2008-06-25 17:14:10 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2008-06-25 17:14:10 +0000 |
commit | 93bb4aa0ce43bea18401e2444bf6d34af19c6084 (patch) | |
tree | bcbb6a1436a2a0843e2787c73ab4a4036052a53a /lib/System | |
parent | c4ab7acc0b87dda1eb4209ca25cf862aa77ca34d (diff) | |
download | external_llvm-93bb4aa0ce43bea18401e2444bf6d34af19c6084.zip external_llvm-93bb4aa0ce43bea18401e2444bf6d34af19c6084.tar.gz external_llvm-93bb4aa0ce43bea18401e2444bf6d34af19c6084.tar.bz2 |
Add a new InvalidateInstructionCache method to sys::Memory.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@52731 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/System')
-rw-r--r-- | lib/System/Memory.cpp | 37 |
1 files changed, 31 insertions, 6 deletions
diff --git a/lib/System/Memory.cpp b/lib/System/Memory.cpp index 054cc96..bbb7917 100644 --- a/lib/System/Memory.cpp +++ b/lib/System/Memory.cpp @@ -17,12 +17,6 @@ namespace llvm { using namespace sys; - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only TRULY operating system -//=== independent code. -//===----------------------------------------------------------------------===// - } // Include the platform-specific parts of this class. @@ -32,3 +26,34 @@ using namespace sys; #ifdef LLVM_ON_WIN32 #include "Win32/Memory.inc" #endif + +/// InvalidateInstructionCache - Before the JIT can run a block of code +/// that has been emitted it must invalidate the instruction cache on some +/// platforms. +void llvm::sys::Memory::InvalidateInstructionCache(const void *Addr, + size_t Len) { + +// icache invalidation for PPC. +#if (defined(__POWERPC__) || defined (__ppc__) || \ + defined(_POWER) || defined(_ARCH_PPC)) + #if defined(__APPLE__) + extern "C" void sys_icache_invalidate(const void *Addr, size_t len); + 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 // end PPC + +}
\ No newline at end of file |