From 232d51225f6127973ee5ba8a2b00d7bed2a6c028 Mon Sep 17 00:00:00 2001 From: Jeremi Kurdek Date: Tue, 14 May 2024 11:35:15 +0200 Subject: [PATCH 01/12] [Mono] added arm64 SwiftError support to interpreter --- src/mono/mono/mini/interp/interp-internals.h | 1 + src/mono/mono/mini/interp/interp.c | 27 +++++++++++++- src/mono/mono/mini/interp/transform.c | 37 ++++++++++++++++++++ src/mono/mono/mini/mini-arm64.c | 14 ++++++++ src/mono/mono/mini/tramp-arm64.c | 13 +++++++ src/tests/issues.targets | 3 -- 6 files changed, 91 insertions(+), 4 deletions(-) diff --git a/src/mono/mono/mini/interp/interp-internals.h b/src/mono/mono/mini/interp/interp-internals.h index 43534b51e07fba..5fe04bf314c8c7 100644 --- a/src/mono/mono/mini/interp/interp-internals.h +++ b/src/mono/mono/mini/interp/interp-internals.h @@ -155,6 +155,7 @@ struct InterpMethod { MonoProfilerCallInstrumentationFlags prof_flags; InterpMethodCodeType code_type; int ref_slot_offset; // GC visible pointer slot + int swift_error_offset; // swift error struct MonoBitSet *ref_slots; #ifdef ENABLE_EXPERIMENT_TIERED MiniTieredCounter tiered_counter; diff --git a/src/mono/mono/mini/interp/interp.c b/src/mono/mono/mini/interp/interp.c index 3e25c7acc29665..536e9c345e8469 100644 --- a/src/mono/mono/mini/interp/interp.c +++ b/src/mono/mono/mini/interp/interp.c @@ -3176,6 +3176,20 @@ interp_entry_from_trampoline (gpointer ccontext_untyped, gpointer rmethod_untype /* Copy the args saved in the trampoline to the frame stack */ gpointer retp = mono_arch_get_native_call_context_args (ccontext, &frame, sig, call_info); +#ifdef MONO_ARCH_HAVE_SWIFTCALL + int swift_error_arg_index = -1; + gpointer swift_error_data; + gpointer* swift_error_pointer; + if (mono_method_signature_has_ext_callconv (sig, MONO_EXT_CALLCONV_SWIFTCALL)) { + swift_error_data = mono_arch_get_swift_error (ccontext, sig, &swift_error_arg_index); + + int swift_error_offset = frame.imethod->swift_error_offset; + if (swift_error_offset >= 0) { + swift_error_pointer = (gpointer*)((guchar*)frame.stack + swift_error_offset); + } + } +#endif + /* Allocate storage for value types */ stackval *newsp = sp; /* FIXME we should reuse computation on imethod for this */ @@ -3195,6 +3209,11 @@ interp_entry_from_trampoline (gpointer ccontext_untyped, gpointer rmethod_untype } else { size = MINT_STACK_SLOT_SIZE; } +#ifdef MONO_ARCH_HAVE_SWIFTCALL + if (swift_error_arg_index >= 0 && swift_error_arg_index == i) { + newsp->data.p = swift_error_pointer; + } +#endif newsp = STACK_ADD_BYTES (newsp, size); } newsp = (stackval*)ALIGN_TO (newsp, MINT_STACK_ALIGNMENT); @@ -3205,6 +3224,12 @@ interp_entry_from_trampoline (gpointer ccontext_untyped, gpointer rmethod_untype mono_interp_exec_method (&frame, context, NULL); MONO_EXIT_GC_UNSAFE; +#ifdef MONO_ARCH_HAVE_SWIFTCALL + if (swift_error_arg_index >= 0) { + *(gpointer*)swift_error_data = *(gpointer*)swift_error_pointer; + } +#endif + context->stack_pointer = (guchar*)sp; g_assert (!context->has_resume_state); @@ -3459,7 +3484,7 @@ interp_create_method_pointer (MonoMethod *method, gboolean compile, MonoError *e return (gpointer)no_llvmonly_interp_method_pointer; } -#ifndef MONO_ARCH_HAVE_FTNPTR_ARG_TRAMPOLINE +#if !defined(MONO_ARCH_HAVE_FTNPTR_ARG_TRAMPOLINE) && !defined(MONO_ARCH_HAVE_SWIFTCALL) /* * Interp in wrappers get the argument in the rgctx register. If * MONO_ARCH_HAVE_FTNPTR_ARG_TRAMPOLINE is defined it means that diff --git a/src/mono/mono/mini/interp/transform.c b/src/mono/mono/mini/interp/transform.c index d540cec6a9780f..ef5eabe7e48a98 100644 --- a/src/mono/mono/mini/interp/transform.c +++ b/src/mono/mono/mini/interp/transform.c @@ -4417,6 +4417,43 @@ interp_method_compute_offsets (TransformData *td, InterpMethod *imethod, MonoMet td->il_locals_size = offset - td->il_locals_offset; td->total_locals_size = offset; +#ifdef MONO_ARCH_HAVE_SWIFTCALL + // Allocate SwiftError + if (mono_method_signature_has_ext_callconv (sig, MONO_EXT_CALLCONV_SWIFTCALL)) { + imethod->swift_error_offset = -1; + + MonoClass *swift_error = mono_class_try_get_swift_error_class (); + MonoClass *swift_error_ptr = mono_class_create_ptr (m_class_get_this_arg (swift_error)); + + int swift_error_index = -1; + for (int i = 0; i < sig->param_count; i++) { + MonoClass *klass = mono_class_from_mono_type_internal (sig->params [i]); + if (klass == swift_error_ptr) { + swift_error_index = i; + break; + } + } + + if (swift_error_index >= 0) + { + MonoType* type = mono_method_signature_internal (td->method)->params [swift_error_index - sig->hasthis]; + int index = num_args + num_il_locals; + int mt = mono_mint_type (type); + + td->vars [index].type = type; + td->vars [index].global = TRUE; + td->vars [index].offset = offset; + size = mono_interp_type_size (type, mt, &align); + td->vars [index].size = size; + interp_mark_ref_slots_for_var (td, index); + + offset += size; + offset = ALIGN_TO (offset, MINT_STACK_ALIGNMENT); + imethod->swift_error_offset = td->vars [index].offset; + } + } +#endif + imethod->clause_data_offsets = (guint32*)g_malloc (header->num_clauses * sizeof (guint32)); td->clause_vars = (int*)mono_mempool_alloc (td->mempool, sizeof (int) * header->num_clauses); for (guint i = 0; i < header->num_clauses; i++) { diff --git a/src/mono/mono/mini/mini-arm64.c b/src/mono/mono/mini/mini-arm64.c index 0af0da4b8030ca..d20897e5fac503 100644 --- a/src/mono/mono/mini/mini-arm64.c +++ b/src/mono/mono/mini/mini-arm64.c @@ -2081,10 +2081,24 @@ mono_arch_set_native_call_context_ret (CallContext *ccontext, gpointer frame, Mo storage = alloca (temp_size); else storage = arg_get_storage (ccontext, ainfo); + +#ifdef MONO_ARCH_HAVE_SWIFTCALL + int swift_error_preserved_val = 0; + if (ccontext->gregs [PARAM_REGS + 2]) { + swift_error_preserved_val = ccontext->gregs [PARAM_REGS + 2]; + } +#endif + memset (ccontext, 0, sizeof (CallContext)); // FIXME interp_cb->frame_arg_to_data ((MonoInterpFrameHandle)frame, sig, -1, storage); if (temp_size) arg_set_val (ccontext, ainfo, storage); + +#ifdef MONO_ARCH_HAVE_SWIFTCALL + if (swift_error_preserved_val > 0) { + ccontext->gregs [PARAM_REGS + 2] = swift_error_preserved_val; + } +#endif } } diff --git a/src/mono/mono/mini/tramp-arm64.c b/src/mono/mono/mini/tramp-arm64.c index 7e8483409610cd..ac34bde82c693b 100644 --- a/src/mono/mono/mini/tramp-arm64.c +++ b/src/mono/mono/mini/tramp-arm64.c @@ -846,6 +846,13 @@ mono_arch_get_native_to_interp_trampoline (MonoTrampInfo **info) for (i = 0; i < FP_PARAM_REGS; i++) arm_strfpx (code, i, ARMREG_FP, ccontext_offset + MONO_STRUCT_OFFSET (CallContext, fregs) + i * sizeof (double)); +#ifdef MONO_ARCH_HAVE_SWIFTCALL + /* set context registers to CallContext */ + for (i = 0; i < CTX_REGS; i++) { + arm_strx (code, i + CTX_REGS_OFFSET, ARMREG_FP, ccontext_offset + MONO_STRUCT_OFFSET (CallContext, gregs) + (i + PARAM_REGS + 1) * sizeof (host_mgreg_t)); + } +#endif + /* set the stack pointer to the value at call site */ arm_addx_imm (code, ARMREG_R0, ARMREG_FP, framesize); arm_strp (code, ARMREG_R0, ARMREG_FP, ccontext_offset + MONO_STRUCT_OFFSET (CallContext, stack)); @@ -863,6 +870,12 @@ mono_arch_get_native_to_interp_trampoline (MonoTrampInfo **info) for (i = 0; i < FP_PARAM_REGS; i++) arm_ldrfpx (code, i, ARMREG_FP, ccontext_offset + MONO_STRUCT_OFFSET (CallContext, fregs) + i * sizeof (double)); +#ifdef MONO_ARCH_HAVE_SWIFTCALL + /* set the context registers from CallContext */ + for (i = 0; i < CTX_REGS; i++) { + arm_ldrx (code, i + CTX_REGS_OFFSET, ARMREG_FP, ccontext_offset + MONO_STRUCT_OFFSET (CallContext, gregs) + (i + PARAM_REGS + 1) * sizeof (host_mgreg_t)); + } +#endif /* reset stack and return */ arm_ldpx (code, ARMREG_FP, ARMREG_LR, ARMREG_SP, 0); arm_addx_imm (code, ARMREG_SP, ARMREG_SP, framesize); diff --git a/src/tests/issues.targets b/src/tests/issues.targets index a27fbb6ac4ef8b..a8b94f6576cf22 100644 --- a/src/tests/issues.targets +++ b/src/tests/issues.targets @@ -2145,9 +2145,6 @@ https://github.com/dotnet/runtime/issues/71656 - - Reverse P/Invokes not supported yet - From 5721f11a97409bfd7854380fe9530c7fa414e2ec Mon Sep 17 00:00:00 2001 From: Jeremi Kurdek Date: Wed, 15 May 2024 18:51:17 +0200 Subject: [PATCH 02/12] removed memset from mono_arch_set_native_call_context_ret --- src/mono/mono/mini/mini-arm64.c | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/mono/mono/mini/mini-arm64.c b/src/mono/mono/mini/mini-arm64.c index d20897e5fac503..05ea6500381acb 100644 --- a/src/mono/mono/mini/mini-arm64.c +++ b/src/mono/mono/mini/mini-arm64.c @@ -2082,23 +2082,9 @@ mono_arch_set_native_call_context_ret (CallContext *ccontext, gpointer frame, Mo else storage = arg_get_storage (ccontext, ainfo); -#ifdef MONO_ARCH_HAVE_SWIFTCALL - int swift_error_preserved_val = 0; - if (ccontext->gregs [PARAM_REGS + 2]) { - swift_error_preserved_val = ccontext->gregs [PARAM_REGS + 2]; - } -#endif - - memset (ccontext, 0, sizeof (CallContext)); // FIXME interp_cb->frame_arg_to_data ((MonoInterpFrameHandle)frame, sig, -1, storage); if (temp_size) arg_set_val (ccontext, ainfo, storage); - -#ifdef MONO_ARCH_HAVE_SWIFTCALL - if (swift_error_preserved_val > 0) { - ccontext->gregs [PARAM_REGS + 2] = swift_error_preserved_val; - } -#endif } } From b8ac762c550d82224423d7aa40bbdb979bddde30 Mon Sep 17 00:00:00 2001 From: Jeremi Kurdek Date: Thu, 16 May 2024 11:57:01 +0200 Subject: [PATCH 03/12] applied review comments --- src/mono/mono/mini/interp/interp.c | 16 ++++++-- src/mono/mono/mini/interp/transform.c | 56 +++++++++++---------------- 2 files changed, 36 insertions(+), 36 deletions(-) diff --git a/src/mono/mono/mini/interp/interp.c b/src/mono/mono/mini/interp/interp.c index 536e9c345e8469..60c3bcbde51514 100644 --- a/src/mono/mono/mini/interp/interp.c +++ b/src/mono/mono/mini/interp/interp.c @@ -3186,6 +3186,7 @@ interp_entry_from_trampoline (gpointer ccontext_untyped, gpointer rmethod_untype int swift_error_offset = frame.imethod->swift_error_offset; if (swift_error_offset >= 0) { swift_error_pointer = (gpointer*)((guchar*)frame.stack + swift_error_offset); + *swift_error_pointer = *(gpointer*)swift_error_data; } } #endif @@ -3484,7 +3485,7 @@ interp_create_method_pointer (MonoMethod *method, gboolean compile, MonoError *e return (gpointer)no_llvmonly_interp_method_pointer; } -#if !defined(MONO_ARCH_HAVE_FTNPTR_ARG_TRAMPOLINE) && !defined(MONO_ARCH_HAVE_SWIFTCALL) +#ifndef MONO_ARCH_HAVE_FTNPTR_ARG_TRAMPOLINE /* * Interp in wrappers get the argument in the rgctx register. If * MONO_ARCH_HAVE_FTNPTR_ARG_TRAMPOLINE is defined it means that @@ -3492,9 +3493,18 @@ interp_create_method_pointer (MonoMethod *method, gboolean compile, MonoError *e * separate temp register. We should update the wrappers for this * if we really care about those architectures (arm). */ - MonoMethod *wrapper = mini_get_interp_in_wrapper (sig); - entry_wrapper = mono_jit_compile_method_jit_only (wrapper, error); + bool skipWrapper = false; +#ifdef MONO_ARCH_HAVE_SWIFTCALL + if (mono_method_signature_has_ext_callconv (sig, MONO_EXT_CALLCONV_SWIFTCALL)) + /* Methods with Swift cconv should go to trampoline */ + skipWrapper = true; +#endif + + if (!skipWrapper) { + MonoMethod *wrapper = mini_get_interp_in_wrapper (sig); + entry_wrapper = mono_jit_compile_method_jit_only (wrapper, error); + } #endif if (!entry_wrapper) { #ifndef MONO_ARCH_HAVE_INTERP_ENTRY_TRAMPOLINE diff --git a/src/mono/mono/mini/interp/transform.c b/src/mono/mono/mini/interp/transform.c index ef5eabe7e48a98..19e87fbc896ee9 100644 --- a/src/mono/mono/mini/interp/transform.c +++ b/src/mono/mono/mini/interp/transform.c @@ -4360,6 +4360,13 @@ interp_method_compute_offsets (TransformData *td, InterpMethod *imethod, MonoMet td->renamable_vars_capacity = target_vars_capacity; offset = 0; +#ifdef MONO_ARCH_HAVE_SWIFTCALL + int swift_error_index = -1; + imethod->swift_error_offset = -1; + MonoClass *swift_error = mono_class_try_get_swift_error_class (); + MonoClass *swift_error_ptr = mono_class_create_ptr (m_class_get_this_arg (swift_error)); +#endif + /* * We will load arguments as if they are locals. Unlike normal locals, every argument * is stored in a stackval sized slot and valuetypes have special semantics since we @@ -4384,6 +4391,16 @@ interp_method_compute_offsets (TransformData *td, InterpMethod *imethod, MonoMet td->vars [i].offset = offset; interp_mark_ref_slots_for_var (td, i); offset += size; + +#ifdef MONO_ARCH_HAVE_SWIFTCALL + if (swift_error_index < 0 && mono_method_signature_has_ext_callconv (sig, MONO_EXT_CALLCONV_SWIFTCALL)) { + MonoClass *klass = mono_class_from_mono_type_internal (type); + if (klass == swift_error_ptr) { + swift_error_index = i; + } + } +#endif + } offset = ALIGN_TO (offset, MINT_STACK_ALIGNMENT); @@ -4418,39 +4435,12 @@ interp_method_compute_offsets (TransformData *td, InterpMethod *imethod, MonoMet td->total_locals_size = offset; #ifdef MONO_ARCH_HAVE_SWIFTCALL - // Allocate SwiftError - if (mono_method_signature_has_ext_callconv (sig, MONO_EXT_CALLCONV_SWIFTCALL)) { - imethod->swift_error_offset = -1; - - MonoClass *swift_error = mono_class_try_get_swift_error_class (); - MonoClass *swift_error_ptr = mono_class_create_ptr (m_class_get_this_arg (swift_error)); - - int swift_error_index = -1; - for (int i = 0; i < sig->param_count; i++) { - MonoClass *klass = mono_class_from_mono_type_internal (sig->params [i]); - if (klass == swift_error_ptr) { - swift_error_index = i; - break; - } - } - - if (swift_error_index >= 0) - { - MonoType* type = mono_method_signature_internal (td->method)->params [swift_error_index - sig->hasthis]; - int index = num_args + num_il_locals; - int mt = mono_mint_type (type); - - td->vars [index].type = type; - td->vars [index].global = TRUE; - td->vars [index].offset = offset; - size = mono_interp_type_size (type, mt, &align); - td->vars [index].size = size; - interp_mark_ref_slots_for_var (td, index); - - offset += size; - offset = ALIGN_TO (offset, MINT_STACK_ALIGNMENT); - imethod->swift_error_offset = td->vars [index].offset; - } + if (mono_method_signature_has_ext_callconv (sig, MONO_EXT_CALLCONV_SWIFTCALL) && swift_error_index >= 0) { + MonoType* type = mono_method_signature_internal (td->method)->params [swift_error_index - sig->hasthis]; + int var = interp_create_var_explicit(td, type, sizeof(gpointer)); + td->vars [var].global = TRUE; + interp_alloc_global_var_offset (td, var); + imethod->swift_error_offset = td->vars [var].offset; } #endif From eef332ea516ae51fcfc37162c51c5c3587570a3c Mon Sep 17 00:00:00 2001 From: Jeremi Kurdek Date: Thu, 16 May 2024 12:26:00 +0200 Subject: [PATCH 04/12] added amd64 support --- src/mono/mono/mini/mini-amd64.c | 2 +- src/mono/mono/mini/tramp-amd64.c | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/mono/mono/mini/mini-amd64.c b/src/mono/mono/mini/mini-amd64.c index 1bc469b1aac7d5..aeabd56a1ed5ba 100644 --- a/src/mono/mono/mini/mini-amd64.c +++ b/src/mono/mono/mini/mini-amd64.c @@ -1324,7 +1324,7 @@ mono_arch_set_native_call_context_ret (CallContext *ccontext, gpointer frame, Mo storage = alloca (temp_size); else storage = arg_get_storage (ccontext, ainfo); - memset (ccontext, 0, sizeof (CallContext)); // FIXME + interp_cb->frame_arg_to_data ((MonoInterpFrameHandle)frame, sig, -1, storage); if (temp_size) arg_set_val (ccontext, ainfo, storage); diff --git a/src/mono/mono/mini/tramp-amd64.c b/src/mono/mono/mini/tramp-amd64.c index 4f0e48c61918ad..0756f621335a3a 100644 --- a/src/mono/mono/mini/tramp-amd64.c +++ b/src/mono/mono/mini/tramp-amd64.c @@ -1263,6 +1263,13 @@ mono_arch_get_native_to_interp_trampoline (MonoTrampInfo **info) for (i = 0; i < FLOAT_PARAM_REGS; i++) amd64_sse_movsd_membase_reg (code, AMD64_RSP, ctx_offset + MONO_STRUCT_OFFSET (CallContext, fregs) + i * sizeof (double), i); +#ifdef MONO_ARCH_HAVE_SWIFTCALL + /* set context registers to CallContext */ + for (i = 0; i < CTX_REGS; i++) { + amd64_mov_membase_reg (code, AMD64_RSP, ctx_offset + MONO_STRUCT_OFFSET (CallContext, gregs) + (i + CTX_REGS_OFFSET) * sizeof (target_mgreg_t), i + CTX_REGS_OFFSET, sizeof (target_mgreg_t)); + } +#endif + /* set the stack pointer to the value at call site */ amd64_mov_reg_reg (code, AMD64_R11, AMD64_RBP, sizeof (target_mgreg_t)); amd64_alu_reg_imm (code, X86_ADD, AMD64_R11, 2 * sizeof (target_mgreg_t)); @@ -1283,6 +1290,13 @@ mono_arch_get_native_to_interp_trampoline (MonoTrampInfo **info) for (i = 0; i < FLOAT_RETURN_REGS; i++) amd64_sse_movsd_reg_membase (code, i, AMD64_RSP, ctx_offset + MONO_STRUCT_OFFSET (CallContext, fregs) + i * sizeof (double)); +#ifdef MONO_ARCH_HAVE_SWIFTCALL + /* set the context registers from CallContext */ + for (i = 0; i < CTX_REGS; i++) { + amd64_mov_reg_membase (code, i + CTX_REGS_OFFSET, AMD64_RSP, ctx_offset + MONO_STRUCT_OFFSET (CallContext, gregs) + (i + CTX_REGS_OFFSET) * sizeof (target_mgreg_t), sizeof (target_mgreg_t)); + } +#endif + /* reset stack and return */ #if TARGET_WIN32 amd64_lea_membase (code, AMD64_RSP, AMD64_RBP, 0); From a6f188aa56490da6fd8b4635c7f69a19a079e1dc Mon Sep 17 00:00:00 2001 From: Jeremi Kurdek Date: Thu, 16 May 2024 12:46:15 +0200 Subject: [PATCH 05/12] fixed undefined wrapper --- src/mono/mono/mini/interp/interp.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/mono/mono/mini/interp/interp.c b/src/mono/mono/mini/interp/interp.c index 60c3bcbde51514..ca3e847ec200b9 100644 --- a/src/mono/mono/mini/interp/interp.c +++ b/src/mono/mono/mini/interp/interp.c @@ -3501,8 +3501,9 @@ interp_create_method_pointer (MonoMethod *method, gboolean compile, MonoError *e skipWrapper = true; #endif + MonoMethod *wrapper; if (!skipWrapper) { - MonoMethod *wrapper = mini_get_interp_in_wrapper (sig); + wrapper = mini_get_interp_in_wrapper (sig); entry_wrapper = mono_jit_compile_method_jit_only (wrapper, error); } #endif From 804240c831c01cb656c798a978daa7c28700d238 Mon Sep 17 00:00:00 2001 From: Jeremi Kurdek Date: Thu, 16 May 2024 14:36:17 +0200 Subject: [PATCH 06/12] fix unitialized pointer errors --- src/mono/mono/mini/interp/interp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mono/mono/mini/interp/interp.c b/src/mono/mono/mini/interp/interp.c index ca3e847ec200b9..7b7b00a4c5d4c9 100644 --- a/src/mono/mono/mini/interp/interp.c +++ b/src/mono/mono/mini/interp/interp.c @@ -3501,7 +3501,7 @@ interp_create_method_pointer (MonoMethod *method, gboolean compile, MonoError *e skipWrapper = true; #endif - MonoMethod *wrapper; + MonoMethod *wrapper = NULL; if (!skipWrapper) { wrapper = mini_get_interp_in_wrapper (sig); entry_wrapper = mono_jit_compile_method_jit_only (wrapper, error); From 4e01e1929431d822be802eb53f928f8ec36ac640 Mon Sep 17 00:00:00 2001 From: Jeremi Kurdek Date: Fri, 17 May 2024 09:36:17 +0200 Subject: [PATCH 07/12] fixed variable naming --- src/mono/mono/mini/interp/interp.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mono/mono/mini/interp/interp.c b/src/mono/mono/mini/interp/interp.c index 7b7b00a4c5d4c9..db77c3367cb63f 100644 --- a/src/mono/mono/mini/interp/interp.c +++ b/src/mono/mono/mini/interp/interp.c @@ -3494,15 +3494,15 @@ interp_create_method_pointer (MonoMethod *method, gboolean compile, MonoError *e * if we really care about those architectures (arm). */ - bool skipWrapper = false; + bool skip_wrapper = false; #ifdef MONO_ARCH_HAVE_SWIFTCALL if (mono_method_signature_has_ext_callconv (sig, MONO_EXT_CALLCONV_SWIFTCALL)) /* Methods with Swift cconv should go to trampoline */ - skipWrapper = true; + skip_wrapper = true; #endif MonoMethod *wrapper = NULL; - if (!skipWrapper) { + if (!skip_wrapper) { wrapper = mini_get_interp_in_wrapper (sig); entry_wrapper = mono_jit_compile_method_jit_only (wrapper, error); } From b1d01e0269e43c1fe7a802ffa3823063b9958008 Mon Sep 17 00:00:00 2001 From: Jeremi Kurdek Date: Fri, 17 May 2024 11:52:26 +0200 Subject: [PATCH 08/12] fixed style --- src/mono/mono/mini/interp/transform.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/mono/mono/mini/interp/transform.c b/src/mono/mono/mini/interp/transform.c index 19e87fbc896ee9..4c0a7244c503be 100644 --- a/src/mono/mono/mini/interp/transform.c +++ b/src/mono/mono/mini/interp/transform.c @@ -4395,9 +4395,8 @@ interp_method_compute_offsets (TransformData *td, InterpMethod *imethod, MonoMet #ifdef MONO_ARCH_HAVE_SWIFTCALL if (swift_error_index < 0 && mono_method_signature_has_ext_callconv (sig, MONO_EXT_CALLCONV_SWIFTCALL)) { MonoClass *klass = mono_class_from_mono_type_internal (type); - if (klass == swift_error_ptr) { + if (klass == swift_error_ptr) swift_error_index = i; - } } #endif From 84355aee409d339501587d9e446789c5c660ad3e Mon Sep 17 00:00:00 2001 From: Jeremi Kurdek Date: Fri, 17 May 2024 12:08:02 +0200 Subject: [PATCH 09/12] simplified ext callconv check in interp_create_method_pointer --- src/mono/mono/mini/interp/interp.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/mono/mono/mini/interp/interp.c b/src/mono/mono/mini/interp/interp.c index db77c3367cb63f..1c3361166cf534 100644 --- a/src/mono/mono/mini/interp/interp.c +++ b/src/mono/mono/mini/interp/interp.c @@ -3494,15 +3494,12 @@ interp_create_method_pointer (MonoMethod *method, gboolean compile, MonoError *e * if we really care about those architectures (arm). */ - bool skip_wrapper = false; + MonoMethod *wrapper = NULL; #ifdef MONO_ARCH_HAVE_SWIFTCALL - if (mono_method_signature_has_ext_callconv (sig, MONO_EXT_CALLCONV_SWIFTCALL)) - /* Methods with Swift cconv should go to trampoline */ - skip_wrapper = true; + /* Methods with Swift cconv should go to trampoline */ + if (!mono_method_signature_has_ext_callconv (sig, MONO_EXT_CALLCONV_SWIFTCALL)) #endif - - MonoMethod *wrapper = NULL; - if (!skip_wrapper) { + { wrapper = mini_get_interp_in_wrapper (sig); entry_wrapper = mono_jit_compile_method_jit_only (wrapper, error); } From 56863031141e30fdc6c69b024561bd9eba6f2765 Mon Sep 17 00:00:00 2001 From: Jeremi Kurdek Date: Fri, 17 May 2024 12:14:19 +0200 Subject: [PATCH 10/12] more style fixes --- src/mono/mono/mini/interp/interp.c | 8 +++----- src/mono/mono/mini/tramp-amd64.c | 6 ++---- src/mono/mono/mini/tramp-arm64.c | 6 ++---- 3 files changed, 7 insertions(+), 13 deletions(-) diff --git a/src/mono/mono/mini/interp/interp.c b/src/mono/mono/mini/interp/interp.c index 1c3361166cf534..08023c81a4890a 100644 --- a/src/mono/mono/mini/interp/interp.c +++ b/src/mono/mono/mini/interp/interp.c @@ -3211,9 +3211,8 @@ interp_entry_from_trampoline (gpointer ccontext_untyped, gpointer rmethod_untype size = MINT_STACK_SLOT_SIZE; } #ifdef MONO_ARCH_HAVE_SWIFTCALL - if (swift_error_arg_index >= 0 && swift_error_arg_index == i) { - newsp->data.p = swift_error_pointer; - } + if (swift_error_arg_index >= 0 && swift_error_arg_index == i) + newsp->data.p = swift_error_pointer; #endif newsp = STACK_ADD_BYTES (newsp, size); } @@ -3226,9 +3225,8 @@ interp_entry_from_trampoline (gpointer ccontext_untyped, gpointer rmethod_untype MONO_EXIT_GC_UNSAFE; #ifdef MONO_ARCH_HAVE_SWIFTCALL - if (swift_error_arg_index >= 0) { + if (swift_error_arg_index >= 0) *(gpointer*)swift_error_data = *(gpointer*)swift_error_pointer; - } #endif context->stack_pointer = (guchar*)sp; diff --git a/src/mono/mono/mini/tramp-amd64.c b/src/mono/mono/mini/tramp-amd64.c index 0756f621335a3a..8cb668a1e4578a 100644 --- a/src/mono/mono/mini/tramp-amd64.c +++ b/src/mono/mono/mini/tramp-amd64.c @@ -1265,9 +1265,8 @@ mono_arch_get_native_to_interp_trampoline (MonoTrampInfo **info) #ifdef MONO_ARCH_HAVE_SWIFTCALL /* set context registers to CallContext */ - for (i = 0; i < CTX_REGS; i++) { + for (i = 0; i < CTX_REGS; i++) amd64_mov_membase_reg (code, AMD64_RSP, ctx_offset + MONO_STRUCT_OFFSET (CallContext, gregs) + (i + CTX_REGS_OFFSET) * sizeof (target_mgreg_t), i + CTX_REGS_OFFSET, sizeof (target_mgreg_t)); - } #endif /* set the stack pointer to the value at call site */ @@ -1292,9 +1291,8 @@ mono_arch_get_native_to_interp_trampoline (MonoTrampInfo **info) #ifdef MONO_ARCH_HAVE_SWIFTCALL /* set the context registers from CallContext */ - for (i = 0; i < CTX_REGS; i++) { + for (i = 0; i < CTX_REGS; i++) amd64_mov_reg_membase (code, i + CTX_REGS_OFFSET, AMD64_RSP, ctx_offset + MONO_STRUCT_OFFSET (CallContext, gregs) + (i + CTX_REGS_OFFSET) * sizeof (target_mgreg_t), sizeof (target_mgreg_t)); - } #endif /* reset stack and return */ diff --git a/src/mono/mono/mini/tramp-arm64.c b/src/mono/mono/mini/tramp-arm64.c index ac34bde82c693b..ed1549d3f2eb46 100644 --- a/src/mono/mono/mini/tramp-arm64.c +++ b/src/mono/mono/mini/tramp-arm64.c @@ -848,9 +848,8 @@ mono_arch_get_native_to_interp_trampoline (MonoTrampInfo **info) #ifdef MONO_ARCH_HAVE_SWIFTCALL /* set context registers to CallContext */ - for (i = 0; i < CTX_REGS; i++) { + for (i = 0; i < CTX_REGS; i++) arm_strx (code, i + CTX_REGS_OFFSET, ARMREG_FP, ccontext_offset + MONO_STRUCT_OFFSET (CallContext, gregs) + (i + PARAM_REGS + 1) * sizeof (host_mgreg_t)); - } #endif /* set the stack pointer to the value at call site */ @@ -872,9 +871,8 @@ mono_arch_get_native_to_interp_trampoline (MonoTrampInfo **info) #ifdef MONO_ARCH_HAVE_SWIFTCALL /* set the context registers from CallContext */ - for (i = 0; i < CTX_REGS; i++) { + for (i = 0; i < CTX_REGS; i++) arm_ldrx (code, i + CTX_REGS_OFFSET, ARMREG_FP, ccontext_offset + MONO_STRUCT_OFFSET (CallContext, gregs) + (i + PARAM_REGS + 1) * sizeof (host_mgreg_t)); - } #endif /* reset stack and return */ arm_ldpx (code, ARMREG_FP, ARMREG_LR, ARMREG_SP, 0); From 2b8c72a3f9197cad909276ea587186bea76ee344 Mon Sep 17 00:00:00 2001 From: Jeremi Kurdek Date: Fri, 17 May 2024 12:17:05 +0200 Subject: [PATCH 11/12] added missing whitespace --- src/mono/mono/mini/interp/transform.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mono/mono/mini/interp/transform.c b/src/mono/mono/mini/interp/transform.c index 4c0a7244c503be..4b4b057e7477ac 100644 --- a/src/mono/mono/mini/interp/transform.c +++ b/src/mono/mono/mini/interp/transform.c @@ -4436,7 +4436,7 @@ interp_method_compute_offsets (TransformData *td, InterpMethod *imethod, MonoMet #ifdef MONO_ARCH_HAVE_SWIFTCALL if (mono_method_signature_has_ext_callconv (sig, MONO_EXT_CALLCONV_SWIFTCALL) && swift_error_index >= 0) { MonoType* type = mono_method_signature_internal (td->method)->params [swift_error_index - sig->hasthis]; - int var = interp_create_var_explicit(td, type, sizeof(gpointer)); + int var = interp_create_var_explicit (td, type, sizeof(gpointer)); td->vars [var].global = TRUE; interp_alloc_global_var_offset (td, var); imethod->swift_error_offset = td->vars [var].offset; From a1175dcd7d3d0c348ed7c5dfffaf390ea25aa528 Mon Sep 17 00:00:00 2001 From: Jeremi Kurdek Date: Fri, 17 May 2024 12:19:11 +0200 Subject: [PATCH 12/12] add missing newline --- src/mono/mono/mini/tramp-arm64.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mono/mono/mini/tramp-arm64.c b/src/mono/mono/mini/tramp-arm64.c index ed1549d3f2eb46..f4869988e87b6e 100644 --- a/src/mono/mono/mini/tramp-arm64.c +++ b/src/mono/mono/mini/tramp-arm64.c @@ -874,6 +874,7 @@ mono_arch_get_native_to_interp_trampoline (MonoTrampInfo **info) for (i = 0; i < CTX_REGS; i++) arm_ldrx (code, i + CTX_REGS_OFFSET, ARMREG_FP, ccontext_offset + MONO_STRUCT_OFFSET (CallContext, gregs) + (i + PARAM_REGS + 1) * sizeof (host_mgreg_t)); #endif + /* reset stack and return */ arm_ldpx (code, ARMREG_FP, ARMREG_LR, ARMREG_SP, 0); arm_addx_imm (code, ARMREG_SP, ARMREG_SP, framesize);