Commit 4260badc37705d3618e774dfe61184ac709881c1

Zachary Waldowski 2013-11-30T02:08:14

Darwin/aarch64: Use Clang cache invalidation builtin

diff --git a/src/aarch64/ffi.c b/src/aarch64/ffi.c
index 3534fba..1a3e8c2 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