diff --git a/CMakeLists.txt b/CMakeLists.txt index ebbdff2..8e7ef86 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -56,6 +56,17 @@ src/virtual_machine.cpp src/vm_compiled_light.cpp src/blake2/blake2b.c) +if (NOT WIN32) + check_symbol_exists("__builtin___clear_cache" "stdlib.h" HAVE_BUILTIN_CLEAR_CACHE) + if (HAVE_BUILTIN_CLEAR_CACHE) + add_definitions(-DHAVE_BUILTIN_CLEAR_CACHE) + endif() +endif() + +if (CMAKE_CXX_COMPILER_ID MATCHES GNU) + add_definitions(-D_GNU_SOURCE -DHAVE_BUILTIN_CLEAR_CACHE) +endif() + if(NOT ARCH_ID) # allow cross compiling if(CMAKE_SYSTEM_PROCESSOR STREQUAL "") diff --git a/src/jit_compiler_a64.cpp b/src/jit_compiler_a64.cpp index 5be8f6e..b1fd54f 100644 --- a/src/jit_compiler_a64.cpp +++ b/src/jit_compiler_a64.cpp @@ -32,6 +32,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "program.hpp" #include "reciprocal.h" #include "virtual_memory.h" +#if !defined(HAVE_BUILTIN_CLEAR_CACHE) && defined(__APPLE__) +#include +#endif namespace ARMV8A { @@ -98,8 +101,10 @@ JitCompilerA64::JitCompilerA64() memset(reg_changed_offset, 0, sizeof(reg_changed_offset)); memcpy(code, (void*) randomx_program_aarch64, CodeSize); -#ifdef __GNUC__ - __builtin___clear_cache(reinterpret_cast(code), reinterpret_cast(code + CodeSize)); +#if defined(HAVE_BUILTIN_CLEAR_CACHE) && !defined(__APPLE__) + __builtin___clear_cache(reinterpret_cast(code), reinterpret_cast(code + CodeSize)); +#else + sys_icache_invalidate(code, CodeSize); #endif } @@ -169,8 +174,10 @@ void JitCompilerA64::generateProgram(Program& program, ProgramConfiguration& con codePos = ((uint8_t*)randomx_program_aarch64_update_spMix1) - ((uint8_t*)randomx_program_aarch64); emit32(ARMV8A::EOR | 10 | (IntRegMap[config.readReg0] << 5) | (IntRegMap[config.readReg1] << 16), code, codePos); -#ifdef __GNUC__ - __builtin___clear_cache(reinterpret_cast(code + MainLoopBegin), reinterpret_cast(code + codePos)); +#if defined(HAVE_BUILTIN_CLEAR_CACHE) && !defined(__APPLE__) + __builtin___clear_cache(reinterpret_cast(code), reinterpret_cast(code + CodeSize)); +#else + sys_icache_invalidate(code, CodeSize); #endif } @@ -226,8 +233,10 @@ void JitCompilerA64::generateProgramLight(Program& program, ProgramConfiguration emit32(ARMV8A::ADD_IMM_LO | 2 | (2 << 5) | (imm_lo << 10), code, codePos); emit32(ARMV8A::ADD_IMM_HI | 2 | (2 << 5) | (imm_hi << 10), code, codePos); -#ifdef __GNUC__ - __builtin___clear_cache(reinterpret_cast(code + MainLoopBegin), reinterpret_cast(code + codePos)); +#if defined(HAVE_BUILTIN_CLEAR_CACHE) && !defined(__APPLE__) + __builtin___clear_cache(reinterpret_cast(code), reinterpret_cast(code + CodeSize)); +#else + sys_icache_invalidate(code, CodeSize); #endif } @@ -344,8 +353,10 @@ void JitCompilerA64::generateSuperscalarHash(SuperscalarProgram(&programs)[N], s memcpy(code + codePos, p1, p2 - p1); codePos += p2 - p1; -#ifdef __GNUC__ - __builtin___clear_cache(reinterpret_cast(code + CodeSize), reinterpret_cast(code + codePos)); +#if defined(HAVE_BUILTIN_CLEAR_CACHE) && !defined(__APPLE__) + __builtin___clear_cache(reinterpret_cast(code), reinterpret_cast(code + CodeSize)); +#else + sys_icache_invalidate(code, CodeSize); #endif }