Support Android ARM64 cacheflush in JIT. Patch by Tavian Barnes.

This commit is contained in:
Zoltán Herczeg 2016-04-06 07:18:42 +00:00
parent c332eaf4f2
commit 992322039d
3 changed files with 24 additions and 0 deletions

View File

@ -279,6 +279,15 @@
/* Instruction cache flush. */ /* Instruction cache flush. */
/****************************/ /****************************/
#if (!defined SLJIT_CACHE_FLUSH && defined __has_builtin)
#if __has_builtin(__builtin___clear_cache)
#define SLJIT_CACHE_FLUSH(from, to) \
__builtin___clear_cache((char*)from, (char*)to)
#endif /* __has_builtin(__builtin___clear_cache) */
#endif /* (!defined SLJIT_CACHE_FLUSH && defined __has_builtin) */
#ifndef SLJIT_CACHE_FLUSH #ifndef SLJIT_CACHE_FLUSH
#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) #if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
@ -295,6 +304,11 @@
#define SLJIT_CACHE_FLUSH(from, to) \ #define SLJIT_CACHE_FLUSH(from, to) \
sys_icache_invalidate((char*)(from), (char*)(to) - (char*)(from)) sys_icache_invalidate((char*)(from), (char*)(to) - (char*)(from))
#elif (defined(__GNUC__) && (__GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)))
#define SLJIT_CACHE_FLUSH(from, to) \
__builtin___clear_cache((char*)from, (char*)to)
#elif defined __ANDROID__ #elif defined __ANDROID__
/* Android lacks __clear_cache; instead, cacheflush should be used. */ /* Android lacks __clear_cache; instead, cacheflush should be used. */
@ -307,12 +321,14 @@
/* The __clear_cache() implementation of GCC is a dummy function on PowerPC. */ /* The __clear_cache() implementation of GCC is a dummy function on PowerPC. */
#define SLJIT_CACHE_FLUSH(from, to) \ #define SLJIT_CACHE_FLUSH(from, to) \
ppc_cache_flush((from), (to)) ppc_cache_flush((from), (to))
#define SLJIT_CACHE_FLUSH_OWN_IMPL 1
#elif (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) #elif (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)
/* The __clear_cache() implementation of GCC is a dummy function on Sparc. */ /* The __clear_cache() implementation of GCC is a dummy function on Sparc. */
#define SLJIT_CACHE_FLUSH(from, to) \ #define SLJIT_CACHE_FLUSH(from, to) \
sparc_cache_flush((from), (to)) sparc_cache_flush((from), (to))
#define SLJIT_CACHE_FLUSH_OWN_IMPL 1
#else #else

View File

@ -46,6 +46,8 @@ typedef sljit_u32 sljit_ins;
#define SLJIT_PASS_ENTRY_ADDR_TO_CALL 1 #define SLJIT_PASS_ENTRY_ADDR_TO_CALL 1
#endif #endif
#if (defined SLJIT_CACHE_FLUSH_OWN_IMPL && SLJIT_CACHE_FLUSH_OWN_IMPL)
static void ppc_cache_flush(sljit_ins *from, sljit_ins *to) static void ppc_cache_flush(sljit_ins *from, sljit_ins *to)
{ {
#ifdef _AIX #ifdef _AIX
@ -87,6 +89,8 @@ static void ppc_cache_flush(sljit_ins *from, sljit_ins *to)
#endif /* _AIX */ #endif /* _AIX */
} }
#endif /* (defined SLJIT_CACHE_FLUSH_OWN_IMPL && SLJIT_CACHE_FLUSH_OWN_IMPL) */
#define TMP_REG1 (SLJIT_NUMBER_OF_REGISTERS + 2) #define TMP_REG1 (SLJIT_NUMBER_OF_REGISTERS + 2)
#define TMP_REG2 (SLJIT_NUMBER_OF_REGISTERS + 3) #define TMP_REG2 (SLJIT_NUMBER_OF_REGISTERS + 3)
#define TMP_REG3 (SLJIT_NUMBER_OF_REGISTERS + 4) #define TMP_REG3 (SLJIT_NUMBER_OF_REGISTERS + 4)

View File

@ -33,6 +33,8 @@ SLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void)
Both for sparc-32 and sparc-64 */ Both for sparc-32 and sparc-64 */
typedef sljit_u32 sljit_ins; typedef sljit_u32 sljit_ins;
#if (defined SLJIT_CACHE_FLUSH_OWN_IMPL && SLJIT_CACHE_FLUSH_OWN_IMPL)
static void sparc_cache_flush(sljit_ins *from, sljit_ins *to) static void sparc_cache_flush(sljit_ins *from, sljit_ins *to)
{ {
#if defined(__SUNPRO_C) && __SUNPRO_C < 0x590 #if defined(__SUNPRO_C) && __SUNPRO_C < 0x590
@ -82,6 +84,8 @@ static void sparc_cache_flush(sljit_ins *from, sljit_ins *to)
#endif #endif
} }
#endif /* (defined SLJIT_CACHE_FLUSH_OWN_IMPL && SLJIT_CACHE_FLUSH_OWN_IMPL) */
/* TMP_REG2 is not used by getput_arg */ /* TMP_REG2 is not used by getput_arg */
#define TMP_REG1 (SLJIT_NUMBER_OF_REGISTERS + 2) #define TMP_REG1 (SLJIT_NUMBER_OF_REGISTERS + 2)
#define TMP_REG2 (SLJIT_NUMBER_OF_REGISTERS + 3) #define TMP_REG2 (SLJIT_NUMBER_OF_REGISTERS + 3)