summaryrefslogtreecommitdiff
path: root/lib/clear_cache.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/clear_cache.c')
-rw-r--r--lib/clear_cache.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/lib/clear_cache.c b/lib/clear_cache.c
new file mode 100644
index 000000000..8176c24e6
--- /dev/null
+++ b/lib/clear_cache.c
@@ -0,0 +1,38 @@
+//===-- clear_cache.c - Implement __clear_cache ---------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include <stdlib.h>
+
+#if __APPLE__
+ #include <libkern/OSCacheControl.h>
+#endif
+
+//
+// The compiler generates calls to __clear_cache() when creating
+// trampoline functions on the stack for use with nested functions.
+// It is expected to invalidate the instruction cache for the
+// specified range.
+//
+void __clear_cache(void* start, void* end)
+{
+#if __i386__ || __x86_64__
+//
+// Intel processors have a unified instruction and data cache
+// so there is nothing to do
+//
+#else
+ #if __APPLE__
+ // On Darwin, sys_icache_invalidate() provides this functionality
+ sys_icache_invalidate(start, end-start);
+ #else
+ abort();
+ #endif
+#endif
+}
+