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