From decf416aee9198e989a90ed9e3900c460449d722 Mon Sep 17 00:00:00 2001 From: Connor McLaughlin Date: Fri, 20 Dec 2019 21:23:52 +1000 Subject: [PATCH] JitCodeBuffer: Expose FlushInstructionCache() to callers --- src/common/jit_code_buffer.cpp | 25 +++++++++++++------------ src/common/jit_code_buffer.h | 3 +++ 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/common/jit_code_buffer.cpp b/src/common/jit_code_buffer.cpp index 59114b7a4..fac148e69 100644 --- a/src/common/jit_code_buffer.cpp +++ b/src/common/jit_code_buffer.cpp @@ -7,16 +7,6 @@ #include #endif -static void DoCacheFlush(u8* address, u32 len) -{ -#if defined(Y_PLATFORM_WINDOWS) - FlushInstructionCache(GetCurrentProcess(), address, len); -#elif defined(Y_COMPILER_GCC) || defined(Y_COMPILER_CLANG) - __builtin___clear_cache(reinterpret_cast(address), reinterpret_cast(address + len)); -#else -#error Unknown platform. -#endif -} JitCodeBuffer::JitCodeBuffer(u32 size /* = 64 * 1024 * 1024 */, u32 far_code_size /* = 0 */) { @@ -85,11 +75,11 @@ void JitCodeBuffer::CommitFarCode(u32 length) void JitCodeBuffer::Reset() { std::memset(m_code_ptr, 0, m_code_size); - DoCacheFlush(m_code_ptr, m_code_size); + FlushInstructionCache(m_code_ptr, m_code_size); if (m_far_code_size > 0) { std::memset(m_far_code_ptr, 0, m_far_code_size); - DoCacheFlush(m_far_code_ptr, m_far_code_size); + FlushInstructionCache(m_far_code_ptr, m_far_code_size); } m_free_code_ptr = m_code_ptr; m_code_used = 0; @@ -109,3 +99,14 @@ void JitCodeBuffer::Align(u32 alignment, u8 padding_value) m_free_code_ptr += num_padding_bytes; m_code_used += num_padding_bytes; } + +void JitCodeBuffer::FlushInstructionCache(void* address, u32 size) +{ +#if defined(Y_PLATFORM_WINDOWS) + ::FlushInstructionCache(GetCurrentProcess(), address, size); +#elif defined(Y_COMPILER_GCC) || defined(Y_COMPILER_CLANG) + __builtin___clear_cache(reinterpret_cast(address), reinterpret_cast(address + size)); +#else +#error Unknown platform. +#endif +} \ No newline at end of file diff --git a/src/common/jit_code_buffer.h b/src/common/jit_code_buffer.h index 7c3b8cfe3..eaf2f28bb 100644 --- a/src/common/jit_code_buffer.h +++ b/src/common/jit_code_buffer.h @@ -21,6 +21,9 @@ public: /// Assumes alignment is a power-of-two. void Align(u32 alignment, u8 padding_value); + /// Flushes the instruction cache on the host for the specified range. + static void FlushInstructionCache(void* address, u32 size); + private: u8* m_code_ptr; u8* m_free_code_ptr;