Darwin/aarch64: Use Clang cache invalidation builtin
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
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