MonoLMF *
mono_get_lmf (void)
{
-#if defined(MONO_ARCH_ENABLE_MONO_LMF_VAR)
+#if defined(MONO_ARCH_ENABLE_MONO_LMF_VAR) && defined(HAVE_GET_TLS_ADDR)
return (MonoLMF *)mono_tls_get_lmf ();
#else
MonoJitTlsData *jit_tls;
void
mono_set_lmf (MonoLMF *lmf)
{
-#if defined(MONO_ARCH_ENABLE_MONO_LMF_VAR)
+#if defined(MONO_ARCH_ENABLE_MONO_LMF_VAR) && defined(HAVE_GET_TLS_ADDR)
mono_tls_set_lmf (lmf);
-#endif
-
+#else
(*mono_get_lmf_addr ()) = lmf;
+#endif
}
MonoJitTlsData*
jit_tls->first_lmf = lmf;
-#if defined(MONO_ARCH_ENABLE_MONO_LMF_VAR)
+ /*
+ * We can have 2 configurations for accessing lmf.
+ * We can use only the tls_lmf_addr variable, which will store the address of
+ * jit_tls->lmf, or, if we have MONO_ARCH_ENABLE_MONO_LMF_VAR enabled, we can
+ * use both tls_lmf_addr and tls_lmf variables (in this case we need to have
+ * means of getting the address of a tls variable; this can be done always
+ * when using __thread or, on osx, even when using pthread)
+ */
+#if defined(MONO_ARCH_ENABLE_MONO_LMF_VAR) && defined(HAVE_GET_TLS_ADDR)
/* jit_tls->lmf is unused */
mono_tls_set_lmf (lmf);
mono_set_lmf_addr (mono_tls_get_tls_addr (TLS_KEY_LMF));
* Copyright 2013 Xamarin, Inc (http://www.xamarin.com)
*/
-#include <config.h>
#include <mono/utils/mach-support.h>
#include "mono-tls.h"
* wrappers and managed allocators, both of which are not aot-ed by default.
* So far, we never supported inlined fast tls on full-aot systems.
*/
-#ifdef HAVE_KW_THREAD
-#define USE_KW_THREAD
-#endif
#ifdef USE_KW_THREAD
gpointer
mono_tls_get_tls_addr (MonoTlsKey key)
{
+#ifdef HAVE_GET_TLS_ADDR
if (key == TLS_KEY_LMF) {
#if defined(USE_KW_THREAD)
return &mono_tls_lmf;
return mono_mach_get_tls_address_from_thread (pthread_self (), mono_tls_key_lmf);
#endif
}
+#endif
/* Implement if we ever need for other targets/keys */
g_assert_not_reached ();
return NULL;
#ifndef __MONO_TLS_H__
#define __MONO_TLS_H__
+#include <config.h>
#include <glib.h>
/* TLS entries used by the runtime */
TLS_KEY_NUM = 6
} MonoTlsKey;
+#ifdef HAVE_KW_THREAD
+#define USE_KW_THREAD
+#endif
+
+#if defined(USE_KW_THREAD)
+#define HAVE_GET_TLS_ADDR
+#elif defined(TARGET_MACH) && (defined(TARGET_X86) || defined(TARGET_AMD64))
+/* mono_mach_get_tls_address_from_thread is untested for arm/arm64 */
+#define HAVE_GET_TLS_ADDR
+#endif
+
#ifdef HOST_WIN32
#include <windows.h>