From 4260badc37705d3618e774dfe61184ac709881c1 Mon Sep 17 00:00:00 2001 From: Zachary Waldowski Date: Sat, 30 Nov 2013 02:08:14 -0500 Subject: [PATCH] Darwin/aarch64: Use Clang cache invalidation builtin --- src/aarch64/ffi.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/aarch64/ffi.c b/src/aarch64/ffi.c index 3534fba5..1a3e8c22 100644 --- a/src/aarch64/ffi.c +++ b/src/aarch64/ffi.c @@ -49,6 +49,21 @@ struct call_context } v [AARCH64_N_VREG]; }; +#if defined(__clang__) && defined(__APPLE__) +void sys_icache_invalidate(void *start, size_t len); +#endif + +static inline void ffi_clear_cache(void *start, void *end) +{ +#if defined(__clang__) && defined(__APPLE__) + sys_icache_invalidate(start, (char *)end-(char *)start); +#elif defined(__GNUC__) + __builtin___clear_cache(start, end); +#else +#error "Missing builtin to flush instruction cache" +#endif +} + static void * get_x_addr (struct call_context *context, unsigned n) { @@ -840,7 +855,7 @@ static unsigned char trampoline [] = memcpy (__tramp + 12, &__fun, sizeof (__fun)); \ memcpy (__tramp + 20, &__ctx, sizeof (__ctx)); \ memcpy (__tramp + 28, &__flags, sizeof (__flags)); \ - __clear_cache(__tramp, __tramp + FFI_TRAMPOLINE_SIZE); \ + ffi_clear_cache(__tramp, __tramp + FFI_TRAMPOLINE_SIZE); \ }) ffi_status