#else
-#if defined(TARGET_OSX) || defined(TARGET_WIN32)
+#if defined(TARGET_OSX) || defined(TARGET_WIN32) || defined(TARGET_ANDROID)
#define EMIT_TLS_ACCESS_NEXT_ADDR(mb) do { \
mono_mb_emit_byte ((mb), MONO_CUSTOM_PREFIX); \
mono_mb_emit_byte ((mb), CEE_MONO_TLS); \
#ifndef HAVE_KW_THREAD
mono_native_tls_alloc (&thread_info_key, NULL);
-#if defined(TARGET_OSX) || defined(TARGET_WIN32)
+#if defined(TARGET_OSX) || defined(TARGET_WIN32) || defined(TARGET_ANDROID)
/*
* CEE_MONO_TLS requires the tls offset, not the key, so the code below only works on darwin,
* where the two are the same.
.global mono_fast_get_tls_key
mono_fast_get_tls_key :
#endif
-#if defined(HAVE_KW_THREAD) && defined(__linux__)
+#if defined(__linux__)
mrc p15, 0, r1, c13, c0, 3
+#if defined(HAVE_KW_THREAD)
ldr r0, [r1, r0]
+#elif defined(TARGET_ANDROID)
+ ldr r0, [r1, r0, lsl #2]
+#endif
bx lr
#else
nop
.global mono_fallback_get_tls_key
mono_fallback_get_tls_key :
#endif
-#if defined(HAVE_KW_THREAD) && defined(__linux__)
+#if defined(__linux__)
mov r1, r0
mvn r0, #0xf000
sub r0, r0, #31
push {lr}
blx r0
+#if defined(HAVE_KW_THREAD)
ldr r0, [r0, r1]
+#elif defined(TARGET_ANDROID)
+ ldr r0, [r0, r1, lsl #2]
+#endif
pop {pc}
#else
nop
.global mono_fast_set_tls_key
mono_fast_set_tls_key :
#endif
-#if defined(HAVE_KW_THREAD) && defined(__linux__)
+#if defined(__linux__)
mrc p15, 0, r2, c13, c0, 3
+#if defined(HAVE_KW_THREAD)
str r1, [r2, r0]
+#elif defined(TARGET_ANDROID)
+ str r1, [r2, r0, lsl #2]
+#endif
bx lr
#else
nop
.global mono_fallback_set_tls_key
mono_fallback_set_tls_key :
#endif
-#if defined(HAVE_KW_THREAD) && defined(__linux__)
+#if defined(__linux__)
mov r2, r0
mvn r0, #0xf000
sub r0, r0, #31
push {lr}
blx r0
+#if defined(HAVE_KW_THREAD)
str r1, [r0, r2]
+#elif defined(TARGET_ANDROID)
+ str r1, [r0, r2, lsl #2]
+#endif
pop {pc}
#else
nop
#include "mini-gc.h"
#include "mono/arch/arm/arm-vfp-codegen.h"
-#if defined(HAVE_KW_THREAD) && defined(__linux__)
+#if defined(HAVE_KW_THREAD) && defined(__linux__) \
+ || defined(TARGET_ANDROID)
#define HAVE_FAST_TLS
#endif
static gboolean
mono_arm_have_fast_tls (void)
{
-#if defined(HAVE_KW_THREAD) && defined(__linux__)
+#if (defined(HAVE_KW_THREAD) && defined(__linux__)) \
+ || defined(TARGET_ANDROID)
guint32* kuser_get_tls = (void*)0xffff0fe0;
guint32 expected [] = {0xee1d0f70, 0xe12fff1e};
pthread_key_t _y; \
(void) (&_x == &_y); \
y = (gint32) x; })
+
+#elif defined(TARGET_ANDROID) && defined(TARGET_ARM)
+
+#define MONO_HAVE_FAST_TLS
+#define MONO_FAST_TLS_SET(x,y) pthread_setspecific(x, y)
+#define MONO_FAST_TLS_GET(x) pthread_getspecific(x)
+#define MONO_FAST_TLS_INIT(x) pthread_key_create(&x, NULL)
+#define MONO_FAST_TLS_DECLARE(x) static pthread_key_t x;
+
+#define MONO_THREAD_VAR_OFFSET(var, offset) do { offset = (int)var; } while (0)
+
#else /* no HAVE_KW_THREAD */
#define MONO_THREAD_VAR_OFFSET(var,offset) (offset) = -1