1210006Srdivacky/* ===-- clear_cache.c - Implement __clear_cache ---------------------------===
2210006Srdivacky *
3210006Srdivacky *                     The LLVM Compiler Infrastructure
4210006Srdivacky *
5210006Srdivacky * This file is dual licensed under the MIT and the University of Illinois Open
6210006Srdivacky * Source Licenses. See LICENSE.TXT for details.
7210006Srdivacky *
8210006Srdivacky * ===----------------------------------------------------------------------===
9210006Srdivacky */
10210006Srdivacky
11210006Srdivacky#include "int_lib.h"
12210006Srdivacky
13210006Srdivacky#if __APPLE__
14210006Srdivacky  #include <libkern/OSCacheControl.h>
15210006Srdivacky#endif
16210006Srdivacky
17210006Srdivacky/*
18210006Srdivacky * The compiler generates calls to __clear_cache() when creating
19210006Srdivacky * trampoline functions on the stack for use with nested functions.
20210006Srdivacky * It is expected to invalidate the instruction cache for the
21212904Sdim * specified range.
22212904Sdim */
23212904Sdim
24210006Srdivackyvoid __clear_cache(void* start, void* end)
25210006Srdivacky{
26223017Sdim#if __i386__ || __x86_64__
27226633Sdim/*
28212904Sdim * Intel processors have a unified instruction and data cache
29210006Srdivacky * so there is nothing to do
30210006Srdivacky */
31210006Srdivacky#else
32226633Sdim    #if __APPLE__
33210006Srdivacky        /* On Darwin, sys_icache_invalidate() provides this functionality */
34234353Sdim        sys_icache_invalidate(start, end-start);
35210006Srdivacky    #else
36210006Srdivacky        compilerrt_abort();
37210006Srdivacky    #endif
38210006Srdivacky#endif
39210006Srdivacky}
40212904Sdim
41212904Sdim