From d24ca5a000cb56dea9223d8254fd5ec8148dacac Mon Sep 17 00:00:00 2001 From: Jay Krell Date: Mon, 17 Jun 2019 01:24:00 -0700 Subject: [PATCH] Replace MONO_PATCH_INFO_GET_TLS_TRAMP with MONO_PATCH_INFO_JIT_ICALL_ADDR_NOCALL. Commit migrated from https://github.com/mono/mono/commit/8d6feabf0de4258bff8fffcb4d13ee3ff04a700f --- src/mono/mono/metadata/jit-icall-reg.h | 8 ++++---- src/mono/mono/mini/aot-compiler.c | 8 +++----- src/mono/mono/mini/aot-runtime.c | 1 - src/mono/mono/mini/aot-runtime.h | 2 +- src/mono/mono/mini/interp/transform.c | 4 ++-- src/mono/mono/mini/method-to-ir.c | 7 ++++--- src/mono/mono/mini/mini-runtime.c | 4 ---- src/mono/mono/mini/patch-info.h | 1 - src/mono/mono/utils/mono-tls.h | 30 +++++++++++++++++------------- 9 files changed, 31 insertions(+), 34 deletions(-) diff --git a/src/mono/mono/metadata/jit-icall-reg.h b/src/mono/mono/metadata/jit-icall-reg.h index a5f9e96..8fb016e 100644 --- a/src/mono/mono/metadata/jit-icall-reg.h +++ b/src/mono/mono/metadata/jit-icall-reg.h @@ -47,12 +47,12 @@ MONO_JIT_ICALL (generic_trampoline_delegate) \ MONO_JIT_ICALL (generic_trampoline_generic_virtual_remoting) \ MONO_JIT_ICALL (generic_trampoline_vcall) \ \ -/* These must be ordered like MonoTlsKey. */ \ -MONO_JIT_ICALL (mono_tls_get_thread) \ -MONO_JIT_ICALL (mono_tls_get_jit_tls) \ +/* These must be ordered like MonoTlsKey (alphabetical). */ \ MONO_JIT_ICALL (mono_tls_get_domain) \ -MONO_JIT_ICALL (mono_tls_get_sgen_thread_info) \ +MONO_JIT_ICALL (mono_tls_get_jit_tls) \ MONO_JIT_ICALL (mono_tls_get_lmf_addr) \ +MONO_JIT_ICALL (mono_tls_get_sgen_thread_info) \ +MONO_JIT_ICALL (mono_tls_get_thread) \ \ MONO_JIT_ICALL (__emul_fadd) \ MONO_JIT_ICALL (__emul_fcmp_ceq) \ diff --git a/src/mono/mono/mini/aot-compiler.c b/src/mono/mono/mini/aot-compiler.c index 931e54d..ea24d6d 100644 --- a/src/mono/mono/mini/aot-compiler.c +++ b/src/mono/mono/mini/aot-compiler.c @@ -6481,7 +6481,6 @@ encode_patch (MonoAotCompile *acfg, MonoJumpInfo *patch_info, guint8 *buf, guint encode_method_ref (acfg, patch_info->data.method, p, &p); break; case MONO_PATCH_INFO_AOT_JIT_INFO: - case MONO_PATCH_INFO_GET_TLS_TRAMP: case MONO_PATCH_INFO_CASTCLASS_CACHE: encode_value (patch_info->data.index, p, &p); break; @@ -6625,8 +6624,7 @@ encode_patch (MonoAotCompile *acfg, MonoJumpInfo *patch_info, guint8 *buf, guint case MONO_PATCH_INFO_GC_SAFE_POINT_FLAG: break; default: - g_warning ("unable to handle jump info %d", patch_info->type); - g_assert_not_reached (); + g_error ("unable to handle jump info %d", patch_info->type); } *endbuf = p; @@ -12898,8 +12896,8 @@ add_preinit_got_slots (MonoAotCompile *acfg) if (!acfg->aot_opts.llvm_only) { for (i = 0; i < TLS_KEY_NUM; i++) { ji = (MonoJumpInfo *)mono_mempool_alloc0 (acfg->mempool, sizeof (MonoJumpInfo)); - ji->type = MONO_PATCH_INFO_GET_TLS_TRAMP; - ji->data.index = i; + ji->type = MONO_PATCH_INFO_JIT_ICALL_ADDR_NOCALL; + ji->data.jit_icall_id = mono_get_tls_key_to_jit_icall_id (i); add_preinit_slot (acfg, ji); } } diff --git a/src/mono/mono/mini/aot-runtime.c b/src/mono/mono/mini/aot-runtime.c index 8f35ea4..589635f 100644 --- a/src/mono/mono/mini/aot-runtime.c +++ b/src/mono/mono/mini/aot-runtime.c @@ -3992,7 +3992,6 @@ decode_patch (MonoAotModule *aot_module, MonoMemPool *mp, MonoJumpInfo *ji, guin } case MONO_PATCH_INFO_GC_SAFE_POINT_FLAG: break; - case MONO_PATCH_INFO_GET_TLS_TRAMP: case MONO_PATCH_INFO_AOT_JIT_INFO: ji->data.index = decode_value (p, &p); break; diff --git a/src/mono/mono/mini/aot-runtime.h b/src/mono/mono/mini/aot-runtime.h index a5a3e80..2dea4b2 100644 --- a/src/mono/mono/mini/aot-runtime.h +++ b/src/mono/mono/mini/aot-runtime.h @@ -11,7 +11,7 @@ #include "mini.h" /* Version number of the AOT file format */ -#define MONO_AOT_FILE_VERSION 165 +#define MONO_AOT_FILE_VERSION 166 #define MONO_AOT_TRAMP_PAGE_SIZE 16384 diff --git a/src/mono/mono/mini/interp/transform.c b/src/mono/mono/mini/interp/transform.c index 4c8c8e1..e342106 100644 --- a/src/mono/mono/mini/interp/transform.c +++ b/src/mono/mono/mini/interp/transform.c @@ -5283,13 +5283,13 @@ generate_code (TransformData *td, MonoMethod *method, MonoMethodHeader *header, td->ip += 5; CHECK_STACK (td, info->sig->param_count); - if (!strcmp (info->name, "mono_threads_attach_coop")) { + if (jit_icall_id == MONO_JIT_ICALL_mono_threads_attach_coop) { rtm->needs_thread_attach = 1; /* attach needs two arguments, and has one return value: leave one element on the stack */ interp_add_ins (td, MINT_POP); td->last_ins->data [0] = 0; - } else if (!strcmp (info->name, "mono_threads_detach_coop")) { + } else if (jit_icall_id == MONO_JIT_ICALL_mono_threads_detach_coop) { g_assert (rtm->needs_thread_attach); /* detach consumes two arguments, and no return value: drop both of them */ diff --git a/src/mono/mono/mini/method-to-ir.c b/src/mono/mono/mini/method-to-ir.c index 5102734..6c9adac 100644 --- a/src/mono/mono/mini/method-to-ir.c +++ b/src/mono/mono/mini/method-to-ir.c @@ -1700,18 +1700,19 @@ mono_create_tls_get (MonoCompile *cfg, MonoTlsKey key) return fast_tls; } + const MonoJitICallId jit_icall_id = mono_get_tls_key_to_jit_icall_id (key); + if (cfg->compile_aot) { MonoInst *addr; /* * tls getters are critical pieces of code and we don't want to resolve them * through the standard plt/tramp mechanism since we might expose ourselves * to crashes and infinite recursions. + * Therefore the NOCALL part of MONO_PATCH_INFO_JIT_ICALL_ADDR_NOCALL, FALSE in is_plt_patch. */ - EMIT_NEW_AOTCONST (cfg, addr, MONO_PATCH_INFO_GET_TLS_TRAMP, GUINT_TO_POINTER(key)); + EMIT_NEW_AOTCONST (cfg, addr, MONO_PATCH_INFO_JIT_ICALL_ADDR_NOCALL, GUINT_TO_POINTER (jit_icall_id)); return mini_emit_calli (cfg, mono_icall_sig_ptr, NULL, addr, NULL, NULL); } else { - g_static_assert (TLS_KEY_THREAD == 0); - const MonoJitICallId jit_icall_id = (MonoJitICallId)(MONO_JIT_ICALL_mono_tls_get_thread + key); return mono_emit_jit_icall_id (cfg, jit_icall_id, NULL); } } diff --git a/src/mono/mono/mini/mini-runtime.c b/src/mono/mono/mini/mini-runtime.c index c9db271..beb3206 100644 --- a/src/mono/mono/mini/mini-runtime.c +++ b/src/mono/mono/mini/mini-runtime.c @@ -1218,7 +1218,6 @@ mono_patch_info_hash (gconstpointer data) case MONO_PATCH_INFO_SIGNATURE: case MONO_PATCH_INFO_METHOD_CODE_SLOT: case MONO_PATCH_INFO_AOT_JIT_INFO: - case MONO_PATCH_INFO_GET_TLS_TRAMP: return hash | (gssize)ji->data.target; case MONO_PATCH_INFO_GSHAREDVT_CALL: return hash | (gssize)ji->data.gsharedvt->method; @@ -1643,9 +1642,6 @@ mono_resolve_patch_target (MonoMethod *method, MonoDomain *domain, guint8 *code, case MONO_PATCH_INFO_GSHAREDVT_IN_WRAPPER: target = mini_get_gsharedvt_wrapper (TRUE, NULL, patch_info->data.sig, NULL, -1, FALSE); break; - case MONO_PATCH_INFO_GET_TLS_TRAMP: // FIXME replace with MONO_PATCH_INFO_JIT_ICALL? - target = (gpointer)mono_tls_get_tls_getter ((MonoTlsKey)patch_info->data.index); - break; case MONO_PATCH_INFO_PROFILER_ALLOCATION_COUNT: { target = (gpointer) &mono_profiler_state.gc_allocation_count; break; diff --git a/src/mono/mono/mini/patch-info.h b/src/mono/mono/mini/patch-info.h index 0a4e6de..f5a1770 100644 --- a/src/mono/mono/mini/patch-info.h +++ b/src/mono/mono/mini/patch-info.h @@ -54,7 +54,6 @@ PATCH_INFO(AOT_JIT_INFO, "aot_jit_info") PATCH_INFO(GC_NURSERY_BITS, "gc_nursery_bits") PATCH_INFO(GSHAREDVT_IN_WRAPPER, "gsharedvt_in_wrapper") PATCH_INFO(ICALL_ADDR_CALL, "icall_addr_call") -PATCH_INFO(GET_TLS_TRAMP, "get_tls_tramp") /* * The address of a C function implementing a JIT icall. * Same as JIT_ICALL_ADDR, but not treated as a call. diff --git a/src/mono/mono/utils/mono-tls.h b/src/mono/mono/utils/mono-tls.h index 1af9472..bdd6179 100644 --- a/src/mono/mono/utils/mono-tls.h +++ b/src/mono/mono/utils/mono-tls.h @@ -18,18 +18,22 @@ #include /* TLS entries used by the runtime */ -// This ordering is mimiced in MONO_JIT_ICALLS and will be in mono_create_tls_get. +// This ordering is mimiced in MONO_JIT_ICALLS (alphabetical). typedef enum { - /* mono_thread_internal_current () */ - TLS_KEY_THREAD = 0, - TLS_KEY_JIT_TLS = 1, - /* mono_domain_get () */ - TLS_KEY_DOMAIN = 2, + TLS_KEY_DOMAIN = 0, // mono_domain_get () + TLS_KEY_JIT_TLS = 1, + TLS_KEY_LMF_ADDR = 2, TLS_KEY_SGEN_THREAD_INFO = 3, - TLS_KEY_LMF_ADDR = 4, - TLS_KEY_NUM = 5 + TLS_KEY_THREAD = 4, // mono_thread_internal_current () + TLS_KEY_NUM = 5 } MonoTlsKey; +#if __cplusplus +g_static_assert (TLS_KEY_DOMAIN == 0); +#endif +// There are only JIT icalls to get TLS, not set TLS. +#define mono_get_tls_key_to_jit_icall_id(a) ((MonoJitICallId)((a) + MONO_JIT_ICALL_mono_tls_get_domain)) + #ifdef HOST_WIN32 #include @@ -95,10 +99,10 @@ G_EXTERN_C MonoDomain *mono_tls_get_domain (void); G_EXTERN_C SgenThreadInfo *mono_tls_get_sgen_thread_info (void); G_EXTERN_C MonoLMF **mono_tls_get_lmf_addr (void); -G_EXTERN_C void mono_tls_set_thread (MonoInternalThread *value); -G_EXTERN_C void mono_tls_set_jit_tls (MonoJitTlsData *value); -G_EXTERN_C void mono_tls_set_domain (MonoDomain *value); -G_EXTERN_C void mono_tls_set_sgen_thread_info (SgenThreadInfo *value); -G_EXTERN_C void mono_tls_set_lmf_addr (MonoLMF **value); +void mono_tls_set_thread (MonoInternalThread *value); +void mono_tls_set_jit_tls (MonoJitTlsData *value); +void mono_tls_set_domain (MonoDomain *value); +void mono_tls_set_sgen_thread_info (SgenThreadInfo *value); +void mono_tls_set_lmf_addr (MonoLMF **value); #endif /* __MONO_TLS_H__ */ -- 2.7.4