From: Zachary Waldowski Date: Thu, 9 Jan 2014 18:55:21 +0000 (-0500) Subject: Darwin/aarch64: Use Clang cache invalidation builtin X-Git-Tag: v3.1~57^2~9 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1b8a8e20e344f3c55495ab6eb46bd14e843d4b3e;p=platform%2Fupstream%2Flibffi.git Darwin/aarch64: Use Clang cache invalidation builtin --- diff --git a/src/aarch64/ffi.c b/src/aarch64/ffi.c index 580ead0..deb5767 100644 --- a/src/aarch64/ffi.c +++ b/src/aarch64/ffi.c @@ -49,6 +49,23 @@ struct call_context } v [AARCH64_N_VREG]; }; +#if defined (__clang__) && defined (__APPLE__) +extern 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 +857,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