From f4a08add4245e56b793d947d531b9f4ac2a5afb7 Mon Sep 17 00:00:00 2001 From: Jeremi Kurdek Date: Thu, 4 Jul 2024 15:14:18 +0200 Subject: [PATCH 01/17] Add support for reverse pinvoke argument lowering --- src/mono/mono/metadata/marshal-lightweight.c | 80 +++++++++++++++++-- src/mono/mono/metadata/marshal.c | 55 ++++++++++++- src/mono/mono/metadata/metadata-internals.h | 2 +- src/mono/mono/metadata/metadata.c | 5 +- src/mono/mono/mini/interp/transform.c | 2 +- src/mono/mono/mini/method-to-ir.c | 2 +- .../SwiftCallbackAbiStress.cs | 57 +++++++++++++ src/tests/issues.targets | 3 - 8 files changed, 189 insertions(+), 17 deletions(-) diff --git a/src/mono/mono/metadata/marshal-lightweight.c b/src/mono/mono/metadata/marshal-lightweight.c index 24aaeebc33ba47..a1ed803472cabd 100644 --- a/src/mono/mono/metadata/marshal-lightweight.c +++ b/src/mono/mono/metadata/marshal-lightweight.c @@ -2719,7 +2719,8 @@ static void emit_managed_wrapper_ilgen (MonoMethodBuilder *mb, MonoMethodSignature *invoke_sig, MonoMarshalSpec **mspecs, EmitMarshalContext* m, MonoMethod *method, MonoGCHandle target_handle, gboolean runtime_init_callback, MonoError *error) { MonoMethodSignature *sig, *csig; - int i, *tmp_locals; + SwiftPhysicalLowering *swift_lowering; + int i, *tmp_locals, *arg_is_lowered_struct; gboolean closed = FALSE; GCUnsafeTransitionBuilder gc_unsafe_builder = {0,}; @@ -2754,6 +2755,7 @@ emit_managed_wrapper_ilgen (MonoMethodBuilder *mb, MonoMethodSignature *invoke_s mono_mb_add_local (mb, int_type); /* allocate local 2 (boolean) delete_old */ mono_mb_add_local (mb, boolean_type); + int struct_locals_start = 100; if (!MONO_TYPE_IS_VOID(sig->ret)) { /* allocate local 3 to store the return value */ @@ -2793,6 +2795,38 @@ emit_managed_wrapper_ilgen (MonoMethodBuilder *mb, MonoMethodSignature *invoke_s gc_unsafe_transition_builder_emit_enter(&gc_unsafe_builder); + if (mono_method_signature_has_ext_callconv (csig, MONO_EXT_CALLCONV_SWIFTCALL)) { + MonoClass *swift_self = mono_class_try_get_swift_self_class (); + MonoClass *swift_error = mono_class_try_get_swift_error_class (); + swift_lowering = g_newa (SwiftPhysicalLowering, sig->param_count); + arg_is_lowered_struct = g_newa (int, sig->param_count); + int lowered_struct_count = 0; + + for (int i =0; i < sig->param_count; i++) { + MonoType *ptype = sig->params [i]; + MonoClass *klass = mono_class_from_mono_type_internal (ptype); + arg_is_lowered_struct [i] = FALSE; + if (mono_type_is_struct (ptype) && !(klass == swift_self || klass == swift_error)) + { + SwiftPhysicalLowering lowered_swift_struct = mono_marshal_get_swift_physical_lowering (ptype, FALSE); + if (!lowered_swift_struct.by_reference) + { + int xdd = mono_mb_add_local (mb, sig->params [i]); + struct_locals_start = MIN(xdd, struct_locals_start); + swift_lowering [i] = lowered_swift_struct; + arg_is_lowered_struct [i] = 1; + lowered_struct_count++; + } + else + { + int xdd = mono_mb_add_local (mb, sig->params [i]); + struct_locals_start = MIN(xdd, struct_locals_start); + arg_is_lowered_struct [i] = 2; + } + } + } + } + /* we first do all conversions */ tmp_locals = g_newa (int, sig->param_count); for (i = 0; i < sig->param_count; i ++) { @@ -2800,17 +2834,22 @@ emit_managed_wrapper_ilgen (MonoMethodBuilder *mb, MonoMethodSignature *invoke_s MonoMarshalSpec *spec = mspecs [i + 1]; if (spec && spec->native == MONO_NATIVE_CUSTOM) { - tmp_locals [i] = mono_emit_marshal (m, i, t, mspecs [i + 1], 0, &csig->params [i], MARSHAL_ACTION_MANAGED_CONV_IN); + tmp_locals [i] = mono_emit_marshal (m, i, t, mspecs [i + 1], 0, &sig->params [i], MARSHAL_ACTION_MANAGED_CONV_IN); } else { switch (t->type) { + case MONO_TYPE_VALUETYPE: + if (mono_method_signature_has_ext_callconv (csig, MONO_EXT_CALLCONV_SWIFTCALL)) + { + tmp_locals [i] = 0; + break; + } case MONO_TYPE_OBJECT: case MONO_TYPE_CLASS: - case MONO_TYPE_VALUETYPE: case MONO_TYPE_ARRAY: case MONO_TYPE_SZARRAY: case MONO_TYPE_STRING: case MONO_TYPE_BOOLEAN: - tmp_locals [i] = mono_emit_marshal (m, i, t, mspecs [i + 1], 0, &csig->params [i], MARSHAL_ACTION_MANAGED_CONV_IN); + tmp_locals [i] = mono_emit_marshal (m, i, t, mspecs [i + 1], 0, &sig->params [i], MARSHAL_ACTION_MANAGED_CONV_IN); break; default: tmp_locals [i] = 0; @@ -2834,15 +2873,42 @@ emit_managed_wrapper_ilgen (MonoMethodBuilder *mb, MonoMethodSignature *invoke_s mono_mb_emit_icall (mb, mono_gchandle_get_target_internal); } - for (i = 0; i < sig->param_count; i++) { - MonoType *t = sig->params [i]; + int arg_shift = 0; + int lowered_struct_so_far = 0; + for (i = 0; i < csig->param_count; i++) { + MonoType *t = csig->params [i]; - if (tmp_locals [i]) { + if (!mono_method_signature_has_ext_callconv (csig, MONO_EXT_CALLCONV_SWIFTCALL) && tmp_locals [i]) { if (m_type_is_byref (t)) mono_mb_emit_ldloc_addr (mb, tmp_locals [i]); else mono_mb_emit_ldloc (mb, tmp_locals [i]); } + else if(mono_method_signature_has_ext_callconv (csig, MONO_EXT_CALLCONV_SWIFTCALL) && arg_is_lowered_struct[i-arg_shift] == 1){ + int j = 0; + guint8 stind_op; + int offset = 0; + for (;j < swift_lowering[i-arg_shift].num_lowered_elements; j++) { + offset = swift_lowering[i-arg_shift].offsets[j]; + mono_mb_emit_ldloc_addr (mb, struct_locals_start + lowered_struct_so_far); + mono_mb_emit_icon (mb, offset); + mono_mb_emit_byte (mb, CEE_ADD); + + mono_mb_emit_ldarg (mb, i + j); + stind_op = mono_type_to_stind (csig->params[i+j]); + mono_mb_emit_byte (mb, stind_op); + } + + i+=j - 1; + arg_shift += j - 1; + mono_mb_emit_ldloc(mb, struct_locals_start + lowered_struct_so_far); + lowered_struct_so_far++; + } + else if(mono_method_signature_has_ext_callconv (csig, MONO_EXT_CALLCONV_SWIFTCALL) && arg_is_lowered_struct[i-arg_shift] == 2) + { + mono_mb_emit_ldarg (mb, i); + lowered_struct_so_far++; + } else mono_mb_emit_ldarg (mb, i); } diff --git a/src/mono/mono/metadata/marshal.c b/src/mono/mono/metadata/marshal.c index 90076ba1994ef2..8b94d03f05ecfa 100644 --- a/src/mono/mono/metadata/marshal.c +++ b/src/mono/mono/metadata/marshal.c @@ -4090,6 +4090,8 @@ method_signature_is_usable_when_marshalling_disabled (MonoMethodSignature *sig) static MonoMethod * marshal_get_managed_wrapper (MonoMethod *method, MonoClass *delegate_klass, MonoGCHandle target_handle, gboolean runtime_init_callback, MonoError *error) { + SwiftPhysicalLowering *swift_lowering; + int **tmp_struct_locals; MonoMethodSignature *sig, *csig, *invoke_sig; MonoMethodBuilder *mb; MonoMethod *res, *invoke; @@ -4179,6 +4181,55 @@ marshal_get_managed_wrapper (MonoMethod *method, MonoClass *delegate_klass, Mono csig->hasthis = 0; csig->pinvoke = 1; + if (invoke) + mono_marshal_set_callconv_from_modopt (invoke, csig, TRUE); + else + mono_marshal_set_callconv_from_unmanaged_callers_only_attribute(method, csig); + + if (mono_method_signature_has_ext_callconv (csig, MONO_EXT_CALLCONV_SWIFTCALL)) { + MonoClass *swift_self = mono_class_try_get_swift_self_class (); + MonoClass *swift_error = mono_class_try_get_swift_error_class (); + swift_lowering = g_newa (SwiftPhysicalLowering, sig->param_count); + tmp_struct_locals = g_newa (int*, sig->param_count); + GArray *new_params = g_array_sized_new (FALSE, FALSE, sizeof (MonoType*), csig->param_count); + uint32_t new_param_count = 0; + + + + for (int i =0; i < csig->param_count; i++) { + MonoType *ptype = csig->params [i]; + MonoClass *klass = mono_class_from_mono_type_internal (ptype); + tmp_struct_locals [i] = NULL; + + if (mono_type_is_struct (ptype) && !(klass == swift_self || klass == swift_error)) + { + SwiftPhysicalLowering lowered_swift_struct = mono_marshal_get_swift_physical_lowering (ptype, FALSE); + if (!lowered_swift_struct.by_reference) + { + swift_lowering [i] = lowered_swift_struct; + tmp_struct_locals [i] = g_newa (int, lowered_swift_struct.num_lowered_elements); + + for (uint32_t idx_lowered = 0; idx_lowered < lowered_swift_struct.num_lowered_elements; ++idx_lowered) { + g_array_append_val (new_params, lowered_swift_struct.lowered_elements [idx_lowered]); + new_param_count++; + } + } + else + { + g_array_append_val (new_params, ptype); + new_param_count++; + } + } + else + { + g_array_append_val (new_params, ptype); + new_param_count++; + } + } + + csig = mono_metadata_signature_dup_new_params (NULL, NULL, get_method_image (method), csig, new_param_count, (MonoType**)new_params->data); + } + if (!marshalling_enabled) csig->marshalling_disabled = 1; @@ -4270,10 +4321,10 @@ marshal_get_managed_wrapper (MonoMethod *method, MonoClass *delegate_klass, Mono info->d.native_to_managed.klass = delegate_klass; res = mono_mb_create_and_cache_full (cache, method, - mb, csig, sig->param_count + 16, + mb, csig, csig->param_count + 16, info, NULL); } else { - res = mono_mb_create (mb, csig, sig->param_count + 16, NULL); + res = mono_mb_create (mb, csig, csig->param_count + 16, NULL); } } diff --git a/src/mono/mono/metadata/metadata-internals.h b/src/mono/mono/metadata/metadata-internals.h index 54d85997d7af4a..ecab39249fc548 100644 --- a/src/mono/mono/metadata/metadata-internals.h +++ b/src/mono/mono/metadata/metadata-internals.h @@ -1011,7 +1011,7 @@ MonoMethodSignature *mono_metadata_signature_dup_mem_manager (MonoMemoryManager MonoMethodSignature *mono_metadata_signature_dup_add_this (MonoImage *image, MonoMethodSignature *sig, MonoClass *klass); MonoMethodSignature *mono_metadata_signature_dup_delegate_invoke_to_target (MonoMethodSignature *sig); MonoMethodSignature *mono_metadata_signature_allocate_internal (MonoImage *image, MonoMemPool *mp, MonoMemoryManager *mem_manager, size_t sig_size); -MonoMethodSignature *mono_metadata_signature_dup_new_params (MonoMemPool *mp, MonoMemoryManager *mem_manager, MonoMethodSignature *sig, uint32_t num_params, MonoType **new_params); +MonoMethodSignature *mono_metadata_signature_dup_new_params (MonoMemPool *mp, MonoMemoryManager *mem_manager, MonoImage* image, MonoMethodSignature *sig, uint32_t num_params, MonoType **new_params); MonoGenericInst * mono_get_shared_generic_inst (MonoGenericContainer *container); diff --git a/src/mono/mono/metadata/metadata.c b/src/mono/mono/metadata/metadata.c index 36d9acb814c276..81423f22a1fdbf 100644 --- a/src/mono/mono/metadata/metadata.c +++ b/src/mono/mono/metadata/metadata.c @@ -2565,6 +2565,7 @@ mono_metadata_signature_dup_delegate_invoke_to_target (MonoMethodSignature *sig) * mono_metadata_signature_dup_new_params: * @param mp The mempool to allocate the new signature from. * @param mem_manager The memory manager to allocate the new signature from. + * @param image The image to allocate the new signature from. * @param sig The original method signature. * @param num_params The number parameters in the new signature. * @param new_params An array of MonoType pointers representing the new parameters. @@ -2575,13 +2576,13 @@ mono_metadata_signature_dup_delegate_invoke_to_target (MonoMethodSignature *sig) * @return the new \c MonoMethodSignature structure. */ MonoMethodSignature* -mono_metadata_signature_dup_new_params (MonoMemPool *mp, MonoMemoryManager *mem_manager, MonoMethodSignature *sig, uint32_t num_params, MonoType **new_params) +mono_metadata_signature_dup_new_params (MonoMemPool *mp, MonoMemoryManager *mem_manager, MonoImage *image, MonoMethodSignature *sig, uint32_t num_params, MonoType **new_params) { size_t new_sig_size = MONO_SIZEOF_METHOD_SIGNATURE + num_params * sizeof (MonoType*); if (sig->ret) new_sig_size += mono_sizeof_type (sig->ret); - MonoMethodSignature *res = mono_metadata_signature_allocate_internal (NULL, mp, mem_manager, new_sig_size); + MonoMethodSignature *res = mono_metadata_signature_allocate_internal (image, mp, mem_manager, new_sig_size); memcpy (res, sig, MONO_SIZEOF_METHOD_SIGNATURE); res->param_count = GUINT32_TO_UINT16 (num_params); diff --git a/src/mono/mono/mini/interp/transform.c b/src/mono/mono/mini/interp/transform.c index c8d579bb9310c3..c95f86ac66b231 100644 --- a/src/mono/mono/mini/interp/transform.c +++ b/src/mono/mono/mini/interp/transform.c @@ -3401,7 +3401,7 @@ interp_emit_swiftcall_struct_lowering (TransformData *td, MonoMethodSignature *c ++td->sp; // Create a new dummy signature with the lowered arguments - new_csignature = mono_metadata_signature_dup_new_params (NULL, td->mem_manager, csignature, new_param_count, (MonoType**)new_params->data); + new_csignature = mono_metadata_signature_dup_new_params (NULL, td->mem_manager, NULL, csignature, new_param_count, (MonoType**)new_params->data); // Deallocate temp array g_array_free (new_params, TRUE); diff --git a/src/mono/mono/mini/method-to-ir.c b/src/mono/mono/mini/method-to-ir.c index 498061dab9fa27..394184c10b78ef 100644 --- a/src/mono/mono/mini/method-to-ir.c +++ b/src/mono/mono/mini/method-to-ir.c @@ -7585,7 +7585,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b } // Create a new dummy signature with the lowered arguments - fsig = mono_metadata_signature_dup_new_params (cfg->mempool, NULL, fsig, new_param_count, (MonoType**)new_params->data); + fsig = mono_metadata_signature_dup_new_params (cfg->mempool, NULL, NULL, fsig, new_param_count, (MonoType**)new_params->data); // Deallocate temp array g_array_free (new_params, TRUE); diff --git a/src/tests/Interop/Swift/SwiftCallbackAbiStress/SwiftCallbackAbiStress.cs b/src/tests/Interop/Swift/SwiftCallbackAbiStress/SwiftCallbackAbiStress.cs index cd00caec4667f4..e94c5c37570c4f 100644 --- a/src/tests/Interop/Swift/SwiftCallbackAbiStress/SwiftCallbackAbiStress.cs +++ b/src/tests/Interop/Swift/SwiftCallbackAbiStress/SwiftCallbackAbiStress.cs @@ -375,6 +375,7 @@ private static F3_Ret SwiftCallbackFunc3Callback(F3_S0 a0, float a1, ushort a2, } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc3() { Console.Write("Running SwiftCallbackFunc3: "); @@ -460,6 +461,7 @@ private static F4_Ret SwiftCallbackFunc4Callback(double a0, F4_S0 a1, byte a2, i } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc4() { Console.Write("Running SwiftCallbackFunc4: "); @@ -588,6 +590,7 @@ private static F5_Ret SwiftCallbackFunc5Callback(byte a0, short a1, ulong a2, nu } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc5() { Console.Write("Running SwiftCallbackFunc5: "); @@ -712,6 +715,7 @@ private static F6_Ret SwiftCallbackFunc6Callback(float a0, F6_S0 a1, long a2, sb } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc6() { Console.Write("Running SwiftCallbackFunc6: "); @@ -866,6 +870,7 @@ private static F8_Ret SwiftCallbackFunc8Callback(F8_S0 a0, F8_S1 a1, SwiftSelf s } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc8() { Console.Write("Running SwiftCallbackFunc8: "); @@ -1061,6 +1066,7 @@ private static F10_Ret SwiftCallbackFunc10Callback(short a0, SwiftSelf self) } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc10() { Console.Write("Running SwiftCallbackFunc10: "); @@ -1169,6 +1175,7 @@ private static F11_Ret SwiftCallbackFunc11Callback(uint a0, nuint a1, ulong a2, } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc11() { Console.Write("Running SwiftCallbackFunc11: "); @@ -1251,6 +1258,7 @@ private static F12_Ret SwiftCallbackFunc12Callback(F12_S0 a0, short a1, ulong a2 } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc12() { Console.Write("Running SwiftCallbackFunc12: "); @@ -1742,6 +1750,7 @@ private static F18_Ret SwiftCallbackFunc18Callback(F18_S0 a0, F18_S1 a1, F18_S2 } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc18() { Console.Write("Running SwiftCallbackFunc18: "); @@ -1855,6 +1864,7 @@ private static F19_Ret SwiftCallbackFunc19Callback(long a0, byte a1, F19_S0 a2, } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc19() { Console.Write("Running SwiftCallbackFunc19: "); @@ -1960,6 +1970,7 @@ private static F20_Ret SwiftCallbackFunc20Callback(F20_S0 a0, F20_S1 a1, float a } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc20() { Console.Write("Running SwiftCallbackFunc20: "); @@ -2034,6 +2045,7 @@ private static F21_Ret SwiftCallbackFunc21Callback(int a0, short a1, F21_S0 a2, } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc21() { Console.Write("Running SwiftCallbackFunc21: "); @@ -2157,6 +2169,7 @@ private static F22_Ret SwiftCallbackFunc22Callback(int a0, F22_S0 a1, F22_S1 a2, } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc22() { Console.Write("Running SwiftCallbackFunc22: "); @@ -2415,6 +2428,7 @@ private static F25_Ret SwiftCallbackFunc25Callback(F25_S0 a0, ushort a1, nuint a } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc25() { Console.Write("Running SwiftCallbackFunc25: "); @@ -2511,6 +2525,7 @@ private static F26_Ret SwiftCallbackFunc26Callback(sbyte a0, byte a1, uint a2, F } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc26() { Console.Write("Running SwiftCallbackFunc26: "); @@ -2701,6 +2716,7 @@ private static F28_Ret SwiftCallbackFunc28Callback(uint a0, ushort a1, sbyte a2, } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc28() { Console.Write("Running SwiftCallbackFunc28: "); @@ -2828,6 +2844,7 @@ private static F29_Ret SwiftCallbackFunc29Callback(F29_S0 a0, nint a1, ulong a2, } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc29() { Console.Write("Running SwiftCallbackFunc29: "); @@ -2981,6 +2998,7 @@ private static F31_Ret SwiftCallbackFunc31Callback(F31_S0 a0, double a1, SwiftSe } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc31() { Console.Write("Running SwiftCallbackFunc31: "); @@ -3034,6 +3052,7 @@ private static F32_Ret SwiftCallbackFunc32Callback(ushort a0, short a1, SwiftSel } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc32() { Console.Write("Running SwiftCallbackFunc32: "); @@ -3413,6 +3432,7 @@ private static F37_Ret SwiftCallbackFunc37Callback(ulong a0, F37_S0 a1, double a } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc37() { Console.Write("Running SwiftCallbackFunc37: "); @@ -3730,6 +3750,7 @@ private static F41_Ret SwiftCallbackFunc41Callback(F41_S0 a0, SwiftSelf self) } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc41() { Console.Write("Running SwiftCallbackFunc41: "); @@ -3848,6 +3869,7 @@ private static F43_Ret SwiftCallbackFunc43Callback(F43_S0 a0, F43_S1 a1, SwiftSe } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc43() { Console.Write("Running SwiftCallbackFunc43: "); @@ -3952,6 +3974,7 @@ private static F44_Ret SwiftCallbackFunc44Callback(double a0, F44_S0 a1, F44_S1 } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc44() { Console.Write("Running SwiftCallbackFunc44: "); @@ -4036,6 +4059,7 @@ private static F45_Ret SwiftCallbackFunc45Callback(F45_S0 a0, F45_S1 a1, byte a2 } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc45() { Console.Write("Running SwiftCallbackFunc45: "); @@ -4095,6 +4119,7 @@ private static F46_Ret SwiftCallbackFunc46Callback(nint a0, nuint a1, ushort a2, } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc46() { Console.Write("Running SwiftCallbackFunc46: "); @@ -4211,6 +4236,7 @@ private static F47_Ret SwiftCallbackFunc47Callback(nint a0, float a1, uint a2, F } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc47() { Console.Write("Running SwiftCallbackFunc47: "); @@ -4354,6 +4380,7 @@ private static F49_Ret SwiftCallbackFunc49Callback(F49_S0 a0, long a1, SwiftSelf } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc49() { Console.Write("Running SwiftCallbackFunc49: "); @@ -4531,6 +4558,7 @@ private static F51_Ret SwiftCallbackFunc51Callback(short a0, nuint a1, F51_S0 a2 } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc51() { Console.Write("Running SwiftCallbackFunc51: "); @@ -4604,6 +4632,7 @@ private static F52_Ret SwiftCallbackFunc52Callback(nint a0, F52_S0 a1, short a2, } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc52() { Console.Write("Running SwiftCallbackFunc52: "); @@ -4763,6 +4792,7 @@ private static F53_Ret SwiftCallbackFunc53Callback(F53_S0 a0, byte a1, long a2, } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc53() { Console.Write("Running SwiftCallbackFunc53: "); @@ -4882,6 +4912,7 @@ private static F54_Ret SwiftCallbackFunc54Callback(ushort a0, F54_S0 a1, float a } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc54() { Console.Write("Running SwiftCallbackFunc54: "); @@ -4980,6 +5011,7 @@ private static F55_Ret SwiftCallbackFunc55Callback(F55_S0 a0, long a1, F55_S1 a2 } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc55() { Console.Write("Running SwiftCallbackFunc55: "); @@ -5114,6 +5146,7 @@ private static F57_Ret SwiftCallbackFunc57Callback(sbyte a0, nuint a1, uint a2, } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc57() { Console.Write("Running SwiftCallbackFunc57: "); @@ -5434,6 +5467,7 @@ private static F62_Ret SwiftCallbackFunc62Callback(F62_S0 a0, SwiftSelf self) } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc62() { Console.Write("Running SwiftCallbackFunc62: "); @@ -5560,6 +5594,7 @@ private static F64_Ret SwiftCallbackFunc64Callback(sbyte a0, F64_S0 a1, F64_S1 a } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc64() { Console.Write("Running SwiftCallbackFunc64: "); @@ -5659,6 +5694,7 @@ private static F65_Ret SwiftCallbackFunc65Callback(F65_S0 a0, short a1, double a } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc65() { Console.Write("Running SwiftCallbackFunc65: "); @@ -5726,6 +5762,7 @@ private static F66_Ret SwiftCallbackFunc66Callback(long a0, SwiftSelf self) } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc66() { Console.Write("Running SwiftCallbackFunc66: "); @@ -5933,6 +5970,7 @@ private static F68_Ret SwiftCallbackFunc68Callback(byte a0, float a1, int a2, ni } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc68() { Console.Write("Running SwiftCallbackFunc68: "); @@ -6032,6 +6070,7 @@ private static F69_Ret SwiftCallbackFunc69Callback(F69_S0 a0, nint a1, int a2, F } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc69() { Console.Write("Running SwiftCallbackFunc69: "); @@ -6148,6 +6187,7 @@ private static F70_Ret SwiftCallbackFunc70Callback(short a0, byte a1, nint a2, u } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc70() { Console.Write("Running SwiftCallbackFunc70: "); @@ -6260,6 +6300,7 @@ private static F72_Ret SwiftCallbackFunc72Callback(F72_S0 a0, long a1, sbyte a2, } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc72() { Console.Write("Running SwiftCallbackFunc72: "); @@ -6511,6 +6552,7 @@ private static F75_Ret SwiftCallbackFunc75Callback(sbyte a0, sbyte a1, sbyte a2, } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc75() { Console.Write("Running SwiftCallbackFunc75: "); @@ -6709,6 +6751,7 @@ private static F77_Ret SwiftCallbackFunc77Callback(double a0, F77_S0 a1, F77_S1 } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc77() { Console.Write("Running SwiftCallbackFunc77: "); @@ -6867,6 +6910,7 @@ private static F79_Ret SwiftCallbackFunc79Callback(F79_S0 a0, float a1, SwiftSel } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc79() { Console.Write("Running SwiftCallbackFunc79: "); @@ -7007,6 +7051,7 @@ private static F81_Ret SwiftCallbackFunc81Callback(byte a0, uint a1, byte a2, F8 } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc81() { Console.Write("Running SwiftCallbackFunc81: "); @@ -7156,6 +7201,7 @@ private static F83_Ret SwiftCallbackFunc83Callback(sbyte a0, F83_S0 a1, short a2 } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc83() { Console.Write("Running SwiftCallbackFunc83: "); @@ -7382,6 +7428,7 @@ private static F85_Ret SwiftCallbackFunc85Callback(F85_S0 a0, F85_S1 a1, uint a2 } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc85() { Console.Write("Running SwiftCallbackFunc85: "); @@ -7486,6 +7533,7 @@ private static F86_Ret SwiftCallbackFunc86Callback(float a0, short a1, nint a2, } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc86() { Console.Write("Running SwiftCallbackFunc86: "); @@ -7634,6 +7682,7 @@ private static F88_Ret SwiftCallbackFunc88Callback(F88_S0 a0, F88_S1 a1, float a } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc88() { Console.Write("Running SwiftCallbackFunc88: "); @@ -7703,6 +7752,7 @@ private static F89_Ret SwiftCallbackFunc89Callback(F89_S0 a0, SwiftSelf self) } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc89() { Console.Write("Running SwiftCallbackFunc89: "); @@ -7811,6 +7861,7 @@ private static F90_Ret SwiftCallbackFunc90Callback(long a0, float a1, F90_S0 a2, } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc90() { Console.Write("Running SwiftCallbackFunc90: "); @@ -7931,6 +7982,7 @@ private static F91_Ret SwiftCallbackFunc91Callback(F91_S0 a0, short a1, uint a2, } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc91() { Console.Write("Running SwiftCallbackFunc91: "); @@ -8024,6 +8076,7 @@ private static F92_Ret SwiftCallbackFunc92Callback(uint a0, long a1, F92_S0 a2, } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc92() { Console.Write("Running SwiftCallbackFunc92: "); @@ -8087,6 +8140,7 @@ private static F93_Ret SwiftCallbackFunc93Callback(nuint a0, ushort a1, double a } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc93() { Console.Write("Running SwiftCallbackFunc93: "); @@ -8196,6 +8250,7 @@ private static F94_Ret SwiftCallbackFunc94Callback(F94_S0 a0, short a1, F94_S1 a } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc94() { Console.Write("Running SwiftCallbackFunc94: "); @@ -8285,6 +8340,7 @@ private static F95_Ret SwiftCallbackFunc95Callback(F95_S0 a0, nuint a1, F95_S1 a } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc95() { Console.Write("Running SwiftCallbackFunc95: "); @@ -8448,6 +8504,7 @@ private static F97_Ret SwiftCallbackFunc97Callback(F97_S0 a0, F97_S1 a1, F97_S2 } [Fact] + [SkipOnMono("Struct lowering for reverse pinvokes returns not supported on Mono")] public static void TestSwiftCallbackFunc97() { Console.Write("Running SwiftCallbackFunc97: "); diff --git a/src/tests/issues.targets b/src/tests/issues.targets index d781f23977fb84..3740e5cf42f76c 100644 --- a/src/tests/issues.targets +++ b/src/tests/issues.targets @@ -1885,9 +1885,6 @@ https://github.com/dotnet/runtime/issues/93631: Swift frozen struct support is not implemented on Mono yet - - https://github.com/dotnet/runtime/issues/93631: Swift reverse pinvokes are not implemented on Mono yet - From f113643309d4ec829f40157873a5cba50afac8ea Mon Sep 17 00:00:00 2001 From: Jeremi Kurdek Date: Fri, 5 Jul 2024 11:27:24 +0200 Subject: [PATCH 02/17] Fix ILGeneration tests errors --- src/mono/mono/metadata/marshal-lightweight.c | 9 ++++++--- src/mono/mono/metadata/marshal.c | 10 +++------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/mono/mono/metadata/marshal-lightweight.c b/src/mono/mono/metadata/marshal-lightweight.c index a1ed803472cabd..0ca3469b6c86d6 100644 --- a/src/mono/mono/metadata/marshal-lightweight.c +++ b/src/mono/mono/metadata/marshal-lightweight.c @@ -2829,18 +2829,21 @@ emit_managed_wrapper_ilgen (MonoMethodBuilder *mb, MonoMethodSignature *invoke_s /* we first do all conversions */ tmp_locals = g_newa (int, sig->param_count); + int arg_shift = 0; // used to skip arguments when we have lowered structs for (i = 0; i < sig->param_count; i ++) { MonoType *t = sig->params [i]; MonoMarshalSpec *spec = mspecs [i + 1]; if (spec && spec->native == MONO_NATIVE_CUSTOM) { - tmp_locals [i] = mono_emit_marshal (m, i, t, mspecs [i + 1], 0, &sig->params [i], MARSHAL_ACTION_MANAGED_CONV_IN); + tmp_locals [i] = mono_emit_marshal (m, i, t, mspecs [i + 1], 0, &csig->params [i + arg_shift], MARSHAL_ACTION_MANAGED_CONV_IN); } else { switch (t->type) { case MONO_TYPE_VALUETYPE: if (mono_method_signature_has_ext_callconv (csig, MONO_EXT_CALLCONV_SWIFTCALL)) { tmp_locals [i] = 0; + if(!swift_lowering[i].by_reference) + arg_shift+=swift_lowering[i].num_lowered_elements - 1; break; } case MONO_TYPE_OBJECT: @@ -2849,7 +2852,7 @@ emit_managed_wrapper_ilgen (MonoMethodBuilder *mb, MonoMethodSignature *invoke_s case MONO_TYPE_SZARRAY: case MONO_TYPE_STRING: case MONO_TYPE_BOOLEAN: - tmp_locals [i] = mono_emit_marshal (m, i, t, mspecs [i + 1], 0, &sig->params [i], MARSHAL_ACTION_MANAGED_CONV_IN); + tmp_locals [i] = mono_emit_marshal (m, i, t, mspecs [i + 1], 0, &csig->params [i + arg_shift], MARSHAL_ACTION_MANAGED_CONV_IN); break; default: tmp_locals [i] = 0; @@ -2873,7 +2876,7 @@ emit_managed_wrapper_ilgen (MonoMethodBuilder *mb, MonoMethodSignature *invoke_s mono_mb_emit_icall (mb, mono_gchandle_get_target_internal); } - int arg_shift = 0; + arg_shift = 0; int lowered_struct_so_far = 0; for (i = 0; i < csig->param_count; i++) { MonoType *t = csig->params [i]; diff --git a/src/mono/mono/metadata/marshal.c b/src/mono/mono/metadata/marshal.c index 8b94d03f05ecfa..540173bb82f98c 100644 --- a/src/mono/mono/metadata/marshal.c +++ b/src/mono/mono/metadata/marshal.c @@ -4091,7 +4091,6 @@ static MonoMethod * marshal_get_managed_wrapper (MonoMethod *method, MonoClass *delegate_klass, MonoGCHandle target_handle, gboolean runtime_init_callback, MonoError *error) { SwiftPhysicalLowering *swift_lowering; - int **tmp_struct_locals; MonoMethodSignature *sig, *csig, *invoke_sig; MonoMethodBuilder *mb; MonoMethod *res, *invoke; @@ -4190,24 +4189,21 @@ marshal_get_managed_wrapper (MonoMethod *method, MonoClass *delegate_klass, Mono MonoClass *swift_self = mono_class_try_get_swift_self_class (); MonoClass *swift_error = mono_class_try_get_swift_error_class (); swift_lowering = g_newa (SwiftPhysicalLowering, sig->param_count); - tmp_struct_locals = g_newa (int*, sig->param_count); GArray *new_params = g_array_sized_new (FALSE, FALSE, sizeof (MonoType*), csig->param_count); uint32_t new_param_count = 0; - for (int i =0; i < csig->param_count; i++) { - MonoType *ptype = csig->params [i]; + for (int j =0; j < csig->param_count; j++) { + MonoType *ptype = csig->params [j]; MonoClass *klass = mono_class_from_mono_type_internal (ptype); - tmp_struct_locals [i] = NULL; if (mono_type_is_struct (ptype) && !(klass == swift_self || klass == swift_error)) { SwiftPhysicalLowering lowered_swift_struct = mono_marshal_get_swift_physical_lowering (ptype, FALSE); if (!lowered_swift_struct.by_reference) { - swift_lowering [i] = lowered_swift_struct; - tmp_struct_locals [i] = g_newa (int, lowered_swift_struct.num_lowered_elements); + swift_lowering [j] = lowered_swift_struct; for (uint32_t idx_lowered = 0; idx_lowered < lowered_swift_struct.num_lowered_elements; ++idx_lowered) { g_array_append_val (new_params, lowered_swift_struct.lowered_elements [idx_lowered]); From ad59f6d872533fac3b58f8319d210d9c97869849 Mon Sep 17 00:00:00 2001 From: Jeremi Kurdek Date: Fri, 5 Jul 2024 13:34:21 +0200 Subject: [PATCH 03/17] Fix build errors --- src/mono/mono/metadata/marshal-lightweight.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mono/mono/metadata/marshal-lightweight.c b/src/mono/mono/metadata/marshal-lightweight.c index 0ca3469b6c86d6..33352ee655ce41 100644 --- a/src/mono/mono/metadata/marshal-lightweight.c +++ b/src/mono/mono/metadata/marshal-lightweight.c @@ -2802,7 +2802,7 @@ emit_managed_wrapper_ilgen (MonoMethodBuilder *mb, MonoMethodSignature *invoke_s arg_is_lowered_struct = g_newa (int, sig->param_count); int lowered_struct_count = 0; - for (int i =0; i < sig->param_count; i++) { + for (i =0; i < sig->param_count; i++) { MonoType *ptype = sig->params [i]; MonoClass *klass = mono_class_from_mono_type_internal (ptype); arg_is_lowered_struct [i] = FALSE; @@ -2888,7 +2888,7 @@ emit_managed_wrapper_ilgen (MonoMethodBuilder *mb, MonoMethodSignature *invoke_s mono_mb_emit_ldloc (mb, tmp_locals [i]); } else if(mono_method_signature_has_ext_callconv (csig, MONO_EXT_CALLCONV_SWIFTCALL) && arg_is_lowered_struct[i-arg_shift] == 1){ - int j = 0; + uint32_t j = 0; guint8 stind_op; int offset = 0; for (;j < swift_lowering[i-arg_shift].num_lowered_elements; j++) { From d703585f2c9def2cb7b7f4a8b898bf77232fefde Mon Sep 17 00:00:00 2001 From: Jeremi Kurdek Date: Fri, 5 Jul 2024 14:45:43 +0200 Subject: [PATCH 04/17] Reworked structure reassemble algorithm to work on sig --- src/mono/mono/metadata/marshal-lightweight.c | 37 ++++++++++---------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/src/mono/mono/metadata/marshal-lightweight.c b/src/mono/mono/metadata/marshal-lightweight.c index 33352ee655ce41..336ae68f57ad30 100644 --- a/src/mono/mono/metadata/marshal-lightweight.c +++ b/src/mono/mono/metadata/marshal-lightweight.c @@ -2878,42 +2878,43 @@ emit_managed_wrapper_ilgen (MonoMethodBuilder *mb, MonoMethodSignature *invoke_s arg_shift = 0; int lowered_struct_so_far = 0; - for (i = 0; i < csig->param_count; i++) { - MonoType *t = csig->params [i]; + for (i = 0; i < sig->param_count; i++) { + MonoType *t = sig->params [i]; - if (!mono_method_signature_has_ext_callconv (csig, MONO_EXT_CALLCONV_SWIFTCALL) && tmp_locals [i]) { - if (m_type_is_byref (t)) - mono_mb_emit_ldloc_addr (mb, tmp_locals [i]); - else - mono_mb_emit_ldloc (mb, tmp_locals [i]); - } - else if(mono_method_signature_has_ext_callconv (csig, MONO_EXT_CALLCONV_SWIFTCALL) && arg_is_lowered_struct[i-arg_shift] == 1){ + if (mono_method_signature_has_ext_callconv (csig, MONO_EXT_CALLCONV_SWIFTCALL) && arg_is_lowered_struct[i] == 1) + { uint32_t j = 0; guint8 stind_op; int offset = 0; - for (;j < swift_lowering[i-arg_shift].num_lowered_elements; j++) { - offset = swift_lowering[i-arg_shift].offsets[j]; + + for (;j < swift_lowering[i].num_lowered_elements; j++) { + offset = swift_lowering[i].offsets[j]; mono_mb_emit_ldloc_addr (mb, struct_locals_start + lowered_struct_so_far); mono_mb_emit_icon (mb, offset); mono_mb_emit_byte (mb, CEE_ADD); - mono_mb_emit_ldarg (mb, i + j); - stind_op = mono_type_to_stind (csig->params[i+j]); + mono_mb_emit_ldarg (mb, i + j + arg_shift); + stind_op = mono_type_to_stind (csig->params[i+j + arg_shift]); mono_mb_emit_byte (mb, stind_op); } - i+=j - 1; - arg_shift += j - 1; + arg_shift+=swift_lowering[i].num_lowered_elements - 1; mono_mb_emit_ldloc(mb, struct_locals_start + lowered_struct_so_far); lowered_struct_so_far++; } - else if(mono_method_signature_has_ext_callconv (csig, MONO_EXT_CALLCONV_SWIFTCALL) && arg_is_lowered_struct[i-arg_shift] == 2) + else if (tmp_locals [i]) { + if (m_type_is_byref (t)) + mono_mb_emit_ldloc_addr (mb, tmp_locals [i]); + else + mono_mb_emit_ldloc (mb, tmp_locals [i]); + } + else if(mono_method_signature_has_ext_callconv (csig, MONO_EXT_CALLCONV_SWIFTCALL) && arg_is_lowered_struct[i] == 2) { - mono_mb_emit_ldarg (mb, i); + mono_mb_emit_ldarg (mb, i + arg_shift); lowered_struct_so_far++; } else - mono_mb_emit_ldarg (mb, i); + mono_mb_emit_ldarg (mb, i + arg_shift); } /* ret = method (...) */ From 4af9745d12803b52321800122655a674ac52f10d Mon Sep 17 00:00:00 2001 From: Jeremi Kurdek Date: Fri, 5 Jul 2024 18:11:46 +0200 Subject: [PATCH 05/17] Fix x64 test errors --- src/mono/mono/metadata/marshal-lightweight.c | 10 +++++----- src/mono/mono/metadata/marshal.c | 5 ++--- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/mono/mono/metadata/marshal-lightweight.c b/src/mono/mono/metadata/marshal-lightweight.c index 336ae68f57ad30..a97bd7b10249c1 100644 --- a/src/mono/mono/metadata/marshal-lightweight.c +++ b/src/mono/mono/metadata/marshal-lightweight.c @@ -2719,8 +2719,8 @@ static void emit_managed_wrapper_ilgen (MonoMethodBuilder *mb, MonoMethodSignature *invoke_sig, MonoMarshalSpec **mspecs, EmitMarshalContext* m, MonoMethod *method, MonoGCHandle target_handle, gboolean runtime_init_callback, MonoError *error) { MonoMethodSignature *sig, *csig; - SwiftPhysicalLowering *swift_lowering; - int i, *tmp_locals, *arg_is_lowered_struct; + SwiftPhysicalLowering *swift_lowering = NULL; + int i, *tmp_locals, *arg_is_lowered_struct = NULL; gboolean closed = FALSE; GCUnsafeTransitionBuilder gc_unsafe_builder = {0,}; @@ -2800,7 +2800,6 @@ emit_managed_wrapper_ilgen (MonoMethodBuilder *mb, MonoMethodSignature *invoke_s MonoClass *swift_error = mono_class_try_get_swift_error_class (); swift_lowering = g_newa (SwiftPhysicalLowering, sig->param_count); arg_is_lowered_struct = g_newa (int, sig->param_count); - int lowered_struct_count = 0; for (i =0; i < sig->param_count; i++) { MonoType *ptype = sig->params [i]; @@ -2815,7 +2814,6 @@ emit_managed_wrapper_ilgen (MonoMethodBuilder *mb, MonoMethodSignature *invoke_s struct_locals_start = MIN(xdd, struct_locals_start); swift_lowering [i] = lowered_swift_struct; arg_is_lowered_struct [i] = 1; - lowered_struct_count++; } else { @@ -2910,7 +2908,9 @@ emit_managed_wrapper_ilgen (MonoMethodBuilder *mb, MonoMethodSignature *invoke_s } else if(mono_method_signature_has_ext_callconv (csig, MONO_EXT_CALLCONV_SWIFTCALL) && arg_is_lowered_struct[i] == 2) { - mono_mb_emit_ldarg (mb, i + arg_shift); + mono_mb_emit_ldarg (mb, i + arg_shift); + MonoClass* klass = mono_class_from_mono_type_internal (sig->params [i]); + mono_mb_emit_op (mb, CEE_LDOBJ, klass); lowered_struct_so_far++; } else diff --git a/src/mono/mono/metadata/marshal.c b/src/mono/mono/metadata/marshal.c index 540173bb82f98c..1460d759b8e54c 100644 --- a/src/mono/mono/metadata/marshal.c +++ b/src/mono/mono/metadata/marshal.c @@ -4090,7 +4090,6 @@ method_signature_is_usable_when_marshalling_disabled (MonoMethodSignature *sig) static MonoMethod * marshal_get_managed_wrapper (MonoMethod *method, MonoClass *delegate_klass, MonoGCHandle target_handle, gboolean runtime_init_callback, MonoError *error) { - SwiftPhysicalLowering *swift_lowering; MonoMethodSignature *sig, *csig, *invoke_sig; MonoMethodBuilder *mb; MonoMethod *res, *invoke; @@ -4188,7 +4187,6 @@ marshal_get_managed_wrapper (MonoMethod *method, MonoClass *delegate_klass, Mono if (mono_method_signature_has_ext_callconv (csig, MONO_EXT_CALLCONV_SWIFTCALL)) { MonoClass *swift_self = mono_class_try_get_swift_self_class (); MonoClass *swift_error = mono_class_try_get_swift_error_class (); - swift_lowering = g_newa (SwiftPhysicalLowering, sig->param_count); GArray *new_params = g_array_sized_new (FALSE, FALSE, sizeof (MonoType*), csig->param_count); uint32_t new_param_count = 0; @@ -4203,7 +4201,6 @@ marshal_get_managed_wrapper (MonoMethod *method, MonoClass *delegate_klass, Mono SwiftPhysicalLowering lowered_swift_struct = mono_marshal_get_swift_physical_lowering (ptype, FALSE); if (!lowered_swift_struct.by_reference) { - swift_lowering [j] = lowered_swift_struct; for (uint32_t idx_lowered = 0; idx_lowered < lowered_swift_struct.num_lowered_elements; ++idx_lowered) { g_array_append_val (new_params, lowered_swift_struct.lowered_elements [idx_lowered]); @@ -4212,6 +4209,8 @@ marshal_get_managed_wrapper (MonoMethod *method, MonoClass *delegate_klass, Mono } else { + MonoClass* klass2 = mono_class_from_mono_type_internal (ptype); + ptype = mono_class_get_byref_type (klass2); g_array_append_val (new_params, ptype); new_param_count++; } From b40a63345561413e6d09b123ea48d990acada2bc Mon Sep 17 00:00:00 2001 From: Jeremi Kurdek Date: Mon, 8 Jul 2024 12:39:14 +0200 Subject: [PATCH 06/17] Add support for SwiftIndirectResult --- src/mono/mono/metadata/marshal-lightweight.c | 3 ++- src/mono/mono/metadata/marshal.c | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/mono/mono/metadata/marshal-lightweight.c b/src/mono/mono/metadata/marshal-lightweight.c index a97bd7b10249c1..d10b145f814fae 100644 --- a/src/mono/mono/metadata/marshal-lightweight.c +++ b/src/mono/mono/metadata/marshal-lightweight.c @@ -2798,6 +2798,7 @@ emit_managed_wrapper_ilgen (MonoMethodBuilder *mb, MonoMethodSignature *invoke_s if (mono_method_signature_has_ext_callconv (csig, MONO_EXT_CALLCONV_SWIFTCALL)) { MonoClass *swift_self = mono_class_try_get_swift_self_class (); MonoClass *swift_error = mono_class_try_get_swift_error_class (); + MonoClass *swift_indirect_result = mono_class_try_get_swift_indirect_result_class (); swift_lowering = g_newa (SwiftPhysicalLowering, sig->param_count); arg_is_lowered_struct = g_newa (int, sig->param_count); @@ -2805,7 +2806,7 @@ emit_managed_wrapper_ilgen (MonoMethodBuilder *mb, MonoMethodSignature *invoke_s MonoType *ptype = sig->params [i]; MonoClass *klass = mono_class_from_mono_type_internal (ptype); arg_is_lowered_struct [i] = FALSE; - if (mono_type_is_struct (ptype) && !(klass == swift_self || klass == swift_error)) + if (mono_type_is_struct (ptype) && !(klass == swift_self || klass == swift_error || klass == swift_indirect_result)) { SwiftPhysicalLowering lowered_swift_struct = mono_marshal_get_swift_physical_lowering (ptype, FALSE); if (!lowered_swift_struct.by_reference) diff --git a/src/mono/mono/metadata/marshal.c b/src/mono/mono/metadata/marshal.c index c53eb528d9158c..200dd1204fb50a 100644 --- a/src/mono/mono/metadata/marshal.c +++ b/src/mono/mono/metadata/marshal.c @@ -4191,6 +4191,7 @@ marshal_get_managed_wrapper (MonoMethod *method, MonoClass *delegate_klass, Mono if (mono_method_signature_has_ext_callconv (csig, MONO_EXT_CALLCONV_SWIFTCALL)) { MonoClass *swift_self = mono_class_try_get_swift_self_class (); MonoClass *swift_error = mono_class_try_get_swift_error_class (); + MonoClass *swift_indirect_result = mono_class_try_get_swift_indirect_result_class (); GArray *new_params = g_array_sized_new (FALSE, FALSE, sizeof (MonoType*), csig->param_count); uint32_t new_param_count = 0; @@ -4200,7 +4201,7 @@ marshal_get_managed_wrapper (MonoMethod *method, MonoClass *delegate_klass, Mono MonoType *ptype = csig->params [j]; MonoClass *klass = mono_class_from_mono_type_internal (ptype); - if (mono_type_is_struct (ptype) && !(klass == swift_self || klass == swift_error)) + if (mono_type_is_struct (ptype) && !(klass == swift_self || klass == swift_error || klass == swift_indirect_result)) { SwiftPhysicalLowering lowered_swift_struct = mono_marshal_get_swift_physical_lowering (ptype, FALSE); if (!lowered_swift_struct.by_reference) From 6ebc9bdae8733bded88fc8f2462fbcbac84ffded Mon Sep 17 00:00:00 2001 From: Jeremi Kurdek Date: Mon, 8 Jul 2024 17:56:09 +0200 Subject: [PATCH 07/17] Remove duplicate call to lowering algorithm --- src/mono/mono/metadata/marshal-lightweight.c | 55 ++++---------------- src/mono/mono/metadata/marshal.c | 21 ++++---- src/mono/mono/metadata/marshal.h | 21 ++++---- 3 files changed, 31 insertions(+), 66 deletions(-) diff --git a/src/mono/mono/metadata/marshal-lightweight.c b/src/mono/mono/metadata/marshal-lightweight.c index d10b145f814fae..c4a681dcc1a3a6 100644 --- a/src/mono/mono/metadata/marshal-lightweight.c +++ b/src/mono/mono/metadata/marshal-lightweight.c @@ -2719,10 +2719,10 @@ static void emit_managed_wrapper_ilgen (MonoMethodBuilder *mb, MonoMethodSignature *invoke_sig, MonoMarshalSpec **mspecs, EmitMarshalContext* m, MonoMethod *method, MonoGCHandle target_handle, gboolean runtime_init_callback, MonoError *error) { MonoMethodSignature *sig, *csig; - SwiftPhysicalLowering *swift_lowering = NULL; int i, *tmp_locals, *arg_is_lowered_struct = NULL; gboolean closed = FALSE; GCUnsafeTransitionBuilder gc_unsafe_builder = {0,}; + SwiftPhysicalLowering *swift_lowering = m->swift_lowering; sig = m->sig; csig = m->csig; @@ -2755,7 +2755,6 @@ emit_managed_wrapper_ilgen (MonoMethodBuilder *mb, MonoMethodSignature *invoke_s mono_mb_add_local (mb, int_type); /* allocate local 2 (boolean) delete_old */ mono_mb_add_local (mb, boolean_type); - int struct_locals_start = 100; if (!MONO_TYPE_IS_VOID(sig->ret)) { /* allocate local 3 to store the return value */ @@ -2795,36 +2794,6 @@ emit_managed_wrapper_ilgen (MonoMethodBuilder *mb, MonoMethodSignature *invoke_s gc_unsafe_transition_builder_emit_enter(&gc_unsafe_builder); - if (mono_method_signature_has_ext_callconv (csig, MONO_EXT_CALLCONV_SWIFTCALL)) { - MonoClass *swift_self = mono_class_try_get_swift_self_class (); - MonoClass *swift_error = mono_class_try_get_swift_error_class (); - MonoClass *swift_indirect_result = mono_class_try_get_swift_indirect_result_class (); - swift_lowering = g_newa (SwiftPhysicalLowering, sig->param_count); - arg_is_lowered_struct = g_newa (int, sig->param_count); - - for (i =0; i < sig->param_count; i++) { - MonoType *ptype = sig->params [i]; - MonoClass *klass = mono_class_from_mono_type_internal (ptype); - arg_is_lowered_struct [i] = FALSE; - if (mono_type_is_struct (ptype) && !(klass == swift_self || klass == swift_error || klass == swift_indirect_result)) - { - SwiftPhysicalLowering lowered_swift_struct = mono_marshal_get_swift_physical_lowering (ptype, FALSE); - if (!lowered_swift_struct.by_reference) - { - int xdd = mono_mb_add_local (mb, sig->params [i]); - struct_locals_start = MIN(xdd, struct_locals_start); - swift_lowering [i] = lowered_swift_struct; - arg_is_lowered_struct [i] = 1; - } - else - { - int xdd = mono_mb_add_local (mb, sig->params [i]); - struct_locals_start = MIN(xdd, struct_locals_start); - arg_is_lowered_struct [i] = 2; - } - } - } - } /* we first do all conversions */ tmp_locals = g_newa (int, sig->param_count); @@ -2840,7 +2809,7 @@ emit_managed_wrapper_ilgen (MonoMethodBuilder *mb, MonoMethodSignature *invoke_s case MONO_TYPE_VALUETYPE: if (mono_method_signature_has_ext_callconv (csig, MONO_EXT_CALLCONV_SWIFTCALL)) { - tmp_locals [i] = 0; + tmp_locals [i] = mono_mb_add_local (mb, sig->params [i]); if(!swift_lowering[i].by_reference) arg_shift+=swift_lowering[i].num_lowered_elements - 1; break; @@ -2880,7 +2849,7 @@ emit_managed_wrapper_ilgen (MonoMethodBuilder *mb, MonoMethodSignature *invoke_s for (i = 0; i < sig->param_count; i++) { MonoType *t = sig->params [i]; - if (mono_method_signature_has_ext_callconv (csig, MONO_EXT_CALLCONV_SWIFTCALL) && arg_is_lowered_struct[i] == 1) + if (mono_method_signature_has_ext_callconv (csig, MONO_EXT_CALLCONV_SWIFTCALL) && swift_lowering [i].num_lowered_elements > 0) { uint32_t j = 0; guint8 stind_op; @@ -2888,7 +2857,7 @@ emit_managed_wrapper_ilgen (MonoMethodBuilder *mb, MonoMethodSignature *invoke_s for (;j < swift_lowering[i].num_lowered_elements; j++) { offset = swift_lowering[i].offsets[j]; - mono_mb_emit_ldloc_addr (mb, struct_locals_start + lowered_struct_so_far); + mono_mb_emit_ldloc_addr (mb, tmp_locals [i]); mono_mb_emit_icon (mb, offset); mono_mb_emit_byte (mb, CEE_ADD); @@ -2898,8 +2867,13 @@ emit_managed_wrapper_ilgen (MonoMethodBuilder *mb, MonoMethodSignature *invoke_s } arg_shift+=swift_lowering[i].num_lowered_elements - 1; - mono_mb_emit_ldloc(mb, struct_locals_start + lowered_struct_so_far); - lowered_struct_so_far++; + mono_mb_emit_ldloc(mb, tmp_locals[i]); + } + else if(mono_method_signature_has_ext_callconv (csig, MONO_EXT_CALLCONV_SWIFTCALL) && swift_lowering [i].by_reference) + { + mono_mb_emit_ldarg (mb, i + arg_shift); + MonoClass* klass = mono_class_from_mono_type_internal (sig->params [i]); + mono_mb_emit_op (mb, CEE_LDOBJ, klass); } else if (tmp_locals [i]) { if (m_type_is_byref (t)) @@ -2907,13 +2881,6 @@ emit_managed_wrapper_ilgen (MonoMethodBuilder *mb, MonoMethodSignature *invoke_s else mono_mb_emit_ldloc (mb, tmp_locals [i]); } - else if(mono_method_signature_has_ext_callconv (csig, MONO_EXT_CALLCONV_SWIFTCALL) && arg_is_lowered_struct[i] == 2) - { - mono_mb_emit_ldarg (mb, i + arg_shift); - MonoClass* klass = mono_class_from_mono_type_internal (sig->params [i]); - mono_mb_emit_op (mb, CEE_LDOBJ, klass); - lowered_struct_so_far++; - } else mono_mb_emit_ldarg (mb, i + arg_shift); } diff --git a/src/mono/mono/metadata/marshal.c b/src/mono/mono/metadata/marshal.c index 200dd1204fb50a..0f1d92dd890f2b 100644 --- a/src/mono/mono/metadata/marshal.c +++ b/src/mono/mono/metadata/marshal.c @@ -4103,6 +4103,7 @@ marshal_get_managed_wrapper (MonoMethod *method, MonoClass *delegate_klass, Mono int i; EmitMarshalContext m; gboolean marshalling_enabled = FALSE; + SwiftPhysicalLowering *swift_lowering = NULL; g_assert (method != NULL); error_init (error); @@ -4192,30 +4193,30 @@ marshal_get_managed_wrapper (MonoMethod *method, MonoClass *delegate_klass, Mono MonoClass *swift_self = mono_class_try_get_swift_self_class (); MonoClass *swift_error = mono_class_try_get_swift_error_class (); MonoClass *swift_indirect_result = mono_class_try_get_swift_indirect_result_class (); + swift_lowering = g_newa (SwiftPhysicalLowering, sig->param_count); GArray *new_params = g_array_sized_new (FALSE, FALSE, sizeof (MonoType*), csig->param_count); uint32_t new_param_count = 0; - - for (int j =0; j < csig->param_count; j++) { - MonoType *ptype = csig->params [j]; + for (i = 0; i < csig->param_count; i++) { + swift_lowering [i] = (SwiftPhysicalLowering){0}; + MonoType *ptype = csig->params [i]; MonoClass *klass = mono_class_from_mono_type_internal (ptype); if (mono_type_is_struct (ptype) && !(klass == swift_self || klass == swift_error || klass == swift_indirect_result)) { SwiftPhysicalLowering lowered_swift_struct = mono_marshal_get_swift_physical_lowering (ptype, FALSE); + swift_lowering [i] = lowered_swift_struct; if (!lowered_swift_struct.by_reference) { - - for (uint32_t idx_lowered = 0; idx_lowered < lowered_swift_struct.num_lowered_elements; ++idx_lowered) { + for (uint32_t idx_lowered = 0; idx_lowered < lowered_swift_struct.num_lowered_elements; idx_lowered++) { g_array_append_val (new_params, lowered_swift_struct.lowered_elements [idx_lowered]); new_param_count++; } } else { - MonoClass* klass2 = mono_class_from_mono_type_internal (ptype); - ptype = mono_class_get_byref_type (klass2); + ptype = mono_class_get_byref_type (klass); g_array_append_val (new_params, ptype); new_param_count++; } @@ -4241,11 +4242,7 @@ marshal_get_managed_wrapper (MonoMethod *method, MonoClass *delegate_klass, Mono m.csig = csig; m.image = get_method_image (method); m.runtime_marshalling_enabled = marshalling_enabled; - - if (invoke) - mono_marshal_set_callconv_from_modopt (invoke, csig, TRUE); - else - mono_marshal_set_callconv_from_unmanaged_callers_only_attribute(method, csig); + m.swift_lowering = swift_lowering; /* The attribute is only available in Net 2.0 */ if (delegate_klass && mono_class_try_get_unmanaged_function_pointer_attribute_class ()) { diff --git a/src/mono/mono/metadata/marshal.h b/src/mono/mono/metadata/marshal.h index d6ca2bdf0915ce..f94635eee0cad4 100644 --- a/src/mono/mono/metadata/marshal.h +++ b/src/mono/mono/metadata/marshal.h @@ -37,6 +37,16 @@ typedef const gunichar2 *mono_bstr_const; GENERATE_TRY_GET_CLASS_WITH_CACHE_DECL(stringbuilder) +typedef struct { + gboolean by_reference; + uint32_t num_lowered_elements; + MonoType *lowered_elements[4]; + uint32_t offsets[4]; +} SwiftPhysicalLowering; + +SwiftPhysicalLowering +mono_marshal_get_swift_physical_lowering (MonoType *type, gboolean native_layout); + /* * This structure holds the state kept by the emit_ marshalling functions. @@ -53,6 +63,7 @@ typedef struct { MonoMethodSignature *csig; /* Might need to be changed due to MarshalAs directives */ MonoImage *image; /* The image to use for looking up custom marshallers */ gboolean runtime_marshalling_enabled; + SwiftPhysicalLowering *swift_lowering; } EmitMarshalContext; typedef enum { @@ -744,14 +755,4 @@ GENERATE_TRY_GET_CLASS_WITH_CACHE_DECL (swift_self) GENERATE_TRY_GET_CLASS_WITH_CACHE_DECL (swift_error) GENERATE_TRY_GET_CLASS_WITH_CACHE_DECL (swift_indirect_result) -typedef struct { - gboolean by_reference; - uint32_t num_lowered_elements; - MonoType *lowered_elements[4]; - uint32_t offsets[4]; -} SwiftPhysicalLowering; - -SwiftPhysicalLowering -mono_marshal_get_swift_physical_lowering (MonoType *type, gboolean native_layout); - #endif /* __MONO_MARSHAL_H__ */ From 12ff9d86e7cff84261df6bbb4ae1e1d7fbf2f40e Mon Sep 17 00:00:00 2001 From: Jeremi Kurdek Date: Mon, 8 Jul 2024 17:59:46 +0200 Subject: [PATCH 08/17] Refactor emitting swift lowered struct --- src/mono/mono/metadata/marshal-lightweight.c | 74 +++++++++++--------- src/mono/mono/metadata/marshal.c | 6 +- src/mono/mono/metadata/marshal.h | 1 + 3 files changed, 48 insertions(+), 33 deletions(-) diff --git a/src/mono/mono/metadata/marshal-lightweight.c b/src/mono/mono/metadata/marshal-lightweight.c index c4a681dcc1a3a6..2fde11bec1c36d 100644 --- a/src/mono/mono/metadata/marshal-lightweight.c +++ b/src/mono/mono/metadata/marshal-lightweight.c @@ -2715,11 +2715,42 @@ emit_managed_wrapper_validate_signature (MonoMethodSignature* sig, MonoMarshalSp return TRUE; } +static void +emit_swift_lowered_struct_load (MonoMethodBuilder *mb, MonoMethodSignature *csig, SwiftPhysicalLowering swift_lowering, int tmp_local, uint32_t csig_argnum) +{ + guint8 stind_op; + uint32_t offset = 0; + + for (uint32_t idx_lowered = 0; idx_lowered < swift_lowering.num_lowered_elements; idx_lowered++) { + offset = swift_lowering.offsets [idx_lowered]; + mono_mb_emit_ldloc_addr (mb, tmp_local); + mono_mb_emit_icon (mb, offset); + mono_mb_emit_byte (mb, CEE_ADD); + + mono_mb_emit_ldarg (mb, csig_argnum + idx_lowered); + stind_op = mono_type_to_stind (csig->params [csig_argnum + idx_lowered]); + mono_mb_emit_byte (mb, stind_op); + } +} + +/* Swift struct lowering handling causes csig to have additional arguments. + * This function returns the index of the argument in the csig that corresponds to the argument in the original signature. + */ +static int +get_csig_argnum (int i, EmitMarshalContext* m) +{ + if (m->swift_sig_to_csig_mp) { + g_assert (i < m->sig->param_count); + return m->swift_sig_to_csig_mp [i]; + } + return i; +} + static void emit_managed_wrapper_ilgen (MonoMethodBuilder *mb, MonoMethodSignature *invoke_sig, MonoMarshalSpec **mspecs, EmitMarshalContext* m, MonoMethod *method, MonoGCHandle target_handle, gboolean runtime_init_callback, MonoError *error) { MonoMethodSignature *sig, *csig; - int i, *tmp_locals, *arg_is_lowered_struct = NULL; + int i, *tmp_locals; gboolean closed = FALSE; GCUnsafeTransitionBuilder gc_unsafe_builder = {0,}; SwiftPhysicalLowering *swift_lowering = m->swift_lowering; @@ -2797,21 +2828,22 @@ emit_managed_wrapper_ilgen (MonoMethodBuilder *mb, MonoMethodSignature *invoke_s /* we first do all conversions */ tmp_locals = g_newa (int, sig->param_count); - int arg_shift = 0; // used to skip arguments when we have lowered structs for (i = 0; i < sig->param_count; i ++) { MonoType *t = sig->params [i]; MonoMarshalSpec *spec = mspecs [i + 1]; + int csig_argnum = get_csig_argnum (i, m); if (spec && spec->native == MONO_NATIVE_CUSTOM) { - tmp_locals [i] = mono_emit_marshal (m, i, t, mspecs [i + 1], 0, &csig->params [i + arg_shift], MARSHAL_ACTION_MANAGED_CONV_IN); + tmp_locals [i] = mono_emit_marshal (m, csig_argnum, t, mspecs [i + 1], 0, &csig->params [csig_argnum], MARSHAL_ACTION_MANAGED_CONV_IN); } else { switch (t->type) { case MONO_TYPE_VALUETYPE: if (mono_method_signature_has_ext_callconv (csig, MONO_EXT_CALLCONV_SWIFTCALL)) { tmp_locals [i] = mono_mb_add_local (mb, sig->params [i]); - if(!swift_lowering[i].by_reference) - arg_shift+=swift_lowering[i].num_lowered_elements - 1; + if (!swift_lowering[i].by_reference) { + emit_swift_lowered_struct_load (mb, csig, swift_lowering[i], tmp_locals[i], csig_argnum); + } break; } case MONO_TYPE_OBJECT: @@ -2820,7 +2852,7 @@ emit_managed_wrapper_ilgen (MonoMethodBuilder *mb, MonoMethodSignature *invoke_s case MONO_TYPE_SZARRAY: case MONO_TYPE_STRING: case MONO_TYPE_BOOLEAN: - tmp_locals [i] = mono_emit_marshal (m, i, t, mspecs [i + 1], 0, &csig->params [i + arg_shift], MARSHAL_ACTION_MANAGED_CONV_IN); + tmp_locals [i] = mono_emit_marshal (m, csig_argnum, t, mspecs [i + 1], 0, &csig->params [csig_argnum], MARSHAL_ACTION_MANAGED_CONV_IN); break; default: tmp_locals [i] = 0; @@ -2844,34 +2876,12 @@ emit_managed_wrapper_ilgen (MonoMethodBuilder *mb, MonoMethodSignature *invoke_s mono_mb_emit_icall (mb, mono_gchandle_get_target_internal); } - arg_shift = 0; - int lowered_struct_so_far = 0; for (i = 0; i < sig->param_count; i++) { MonoType *t = sig->params [i]; - - if (mono_method_signature_has_ext_callconv (csig, MONO_EXT_CALLCONV_SWIFTCALL) && swift_lowering [i].num_lowered_elements > 0) - { - uint32_t j = 0; - guint8 stind_op; - int offset = 0; - - for (;j < swift_lowering[i].num_lowered_elements; j++) { - offset = swift_lowering[i].offsets[j]; - mono_mb_emit_ldloc_addr (mb, tmp_locals [i]); - mono_mb_emit_icon (mb, offset); - mono_mb_emit_byte (mb, CEE_ADD); - - mono_mb_emit_ldarg (mb, i + j + arg_shift); - stind_op = mono_type_to_stind (csig->params[i+j + arg_shift]); - mono_mb_emit_byte (mb, stind_op); - } - - arg_shift+=swift_lowering[i].num_lowered_elements - 1; - mono_mb_emit_ldloc(mb, tmp_locals[i]); - } - else if(mono_method_signature_has_ext_callconv (csig, MONO_EXT_CALLCONV_SWIFTCALL) && swift_lowering [i].by_reference) + int csig_argnum = get_csig_argnum (i, m); + if(mono_method_signature_has_ext_callconv (csig, MONO_EXT_CALLCONV_SWIFTCALL) && swift_lowering [i].by_reference) { - mono_mb_emit_ldarg (mb, i + arg_shift); + mono_mb_emit_ldarg (mb, csig_argnum); MonoClass* klass = mono_class_from_mono_type_internal (sig->params [i]); mono_mb_emit_op (mb, CEE_LDOBJ, klass); } @@ -2882,7 +2892,7 @@ emit_managed_wrapper_ilgen (MonoMethodBuilder *mb, MonoMethodSignature *invoke_s mono_mb_emit_ldloc (mb, tmp_locals [i]); } else - mono_mb_emit_ldarg (mb, i + arg_shift); + mono_mb_emit_ldarg (mb, csig_argnum); } /* ret = method (...) */ diff --git a/src/mono/mono/metadata/marshal.c b/src/mono/mono/metadata/marshal.c index 0f1d92dd890f2b..08f454f9287701 100644 --- a/src/mono/mono/metadata/marshal.c +++ b/src/mono/mono/metadata/marshal.c @@ -4103,6 +4103,7 @@ marshal_get_managed_wrapper (MonoMethod *method, MonoClass *delegate_klass, Mono int i; EmitMarshalContext m; gboolean marshalling_enabled = FALSE; + int *swift_sig_to_csig_mp = NULL; SwiftPhysicalLowering *swift_lowering = NULL; g_assert (method != NULL); @@ -4194,12 +4195,14 @@ marshal_get_managed_wrapper (MonoMethod *method, MonoClass *delegate_klass, Mono MonoClass *swift_error = mono_class_try_get_swift_error_class (); MonoClass *swift_indirect_result = mono_class_try_get_swift_indirect_result_class (); swift_lowering = g_newa (SwiftPhysicalLowering, sig->param_count); + swift_sig_to_csig_mp = g_newa (int, sig->param_count); GArray *new_params = g_array_sized_new (FALSE, FALSE, sizeof (MonoType*), csig->param_count); - uint32_t new_param_count = 0; + int new_param_count = 0; for (i = 0; i < csig->param_count; i++) { swift_lowering [i] = (SwiftPhysicalLowering){0}; + swift_sig_to_csig_mp [i] = new_param_count; MonoType *ptype = csig->params [i]; MonoClass *klass = mono_class_from_mono_type_internal (ptype); @@ -4243,6 +4246,7 @@ marshal_get_managed_wrapper (MonoMethod *method, MonoClass *delegate_klass, Mono m.image = get_method_image (method); m.runtime_marshalling_enabled = marshalling_enabled; m.swift_lowering = swift_lowering; + m.swift_sig_to_csig_mp = swift_sig_to_csig_mp; /* The attribute is only available in Net 2.0 */ if (delegate_klass && mono_class_try_get_unmanaged_function_pointer_attribute_class ()) { diff --git a/src/mono/mono/metadata/marshal.h b/src/mono/mono/metadata/marshal.h index f94635eee0cad4..a682f4dc2b5101 100644 --- a/src/mono/mono/metadata/marshal.h +++ b/src/mono/mono/metadata/marshal.h @@ -64,6 +64,7 @@ typedef struct { MonoImage *image; /* The image to use for looking up custom marshallers */ gboolean runtime_marshalling_enabled; SwiftPhysicalLowering *swift_lowering; + int *swift_sig_to_csig_mp; } EmitMarshalContext; typedef enum { From 39122250a6d257809ca1b845633d5bb9caa20976 Mon Sep 17 00:00:00 2001 From: Jeremi Kurdek Date: Mon, 8 Jul 2024 18:32:25 +0200 Subject: [PATCH 09/17] Fix formatting --- src/mono/mono/metadata/marshal-lightweight.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/mono/mono/metadata/marshal-lightweight.c b/src/mono/mono/metadata/marshal-lightweight.c index 2fde11bec1c36d..6908ed907d2c22 100644 --- a/src/mono/mono/metadata/marshal-lightweight.c +++ b/src/mono/mono/metadata/marshal-lightweight.c @@ -2719,7 +2719,7 @@ static void emit_swift_lowered_struct_load (MonoMethodBuilder *mb, MonoMethodSignature *csig, SwiftPhysicalLowering swift_lowering, int tmp_local, uint32_t csig_argnum) { guint8 stind_op; - uint32_t offset = 0; + uint32_t offset = 0; for (uint32_t idx_lowered = 0; idx_lowered < swift_lowering.num_lowered_elements; idx_lowered++) { offset = swift_lowering.offsets [idx_lowered]; @@ -2741,7 +2741,9 @@ get_csig_argnum (int i, EmitMarshalContext* m) { if (m->swift_sig_to_csig_mp) { g_assert (i < m->sig->param_count); - return m->swift_sig_to_csig_mp [i]; + int csig_argnum = m->swift_sig_to_csig_mp [i]; + g_assert (csig_argnum >= 0 && csig_argnum < m->csig->param_count); + return csig_argnum; } return i; } @@ -2841,8 +2843,8 @@ emit_managed_wrapper_ilgen (MonoMethodBuilder *mb, MonoMethodSignature *invoke_s if (mono_method_signature_has_ext_callconv (csig, MONO_EXT_CALLCONV_SWIFTCALL)) { tmp_locals [i] = mono_mb_add_local (mb, sig->params [i]); - if (!swift_lowering[i].by_reference) { - emit_swift_lowered_struct_load (mb, csig, swift_lowering[i], tmp_locals[i], csig_argnum); + if (swift_lowering [i].num_lowered_elements > 0) { + emit_swift_lowered_struct_load (mb, csig, swift_lowering [i], tmp_locals [i], csig_argnum); } break; } From e6401cb205b940ffc28e9e237964c86fa23deee6 Mon Sep 17 00:00:00 2001 From: Jeremi Kurdek Date: Mon, 8 Jul 2024 18:33:13 +0200 Subject: [PATCH 10/17] Remove extra newline --- src/mono/mono/metadata/marshal-lightweight.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/mono/mono/metadata/marshal-lightweight.c b/src/mono/mono/metadata/marshal-lightweight.c index 6908ed907d2c22..126af67f520300 100644 --- a/src/mono/mono/metadata/marshal-lightweight.c +++ b/src/mono/mono/metadata/marshal-lightweight.c @@ -2827,7 +2827,6 @@ emit_managed_wrapper_ilgen (MonoMethodBuilder *mb, MonoMethodSignature *invoke_s gc_unsafe_transition_builder_emit_enter(&gc_unsafe_builder); - /* we first do all conversions */ tmp_locals = g_newa (int, sig->param_count); for (i = 0; i < sig->param_count; i ++) { From f95d478145c1e5d78f71a016a9a074acae1d1032 Mon Sep 17 00:00:00 2001 From: Jeremi Kurdek Date: Mon, 8 Jul 2024 21:25:16 +0200 Subject: [PATCH 11/17] Fix SwiftIndirectResult errors --- src/mono/mono/metadata/marshal-lightweight.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/mono/mono/metadata/marshal-lightweight.c b/src/mono/mono/metadata/marshal-lightweight.c index 126af67f520300..22a33ca22ac64d 100644 --- a/src/mono/mono/metadata/marshal-lightweight.c +++ b/src/mono/mono/metadata/marshal-lightweight.c @@ -2841,11 +2841,16 @@ emit_managed_wrapper_ilgen (MonoMethodBuilder *mb, MonoMethodSignature *invoke_s case MONO_TYPE_VALUETYPE: if (mono_method_signature_has_ext_callconv (csig, MONO_EXT_CALLCONV_SWIFTCALL)) { - tmp_locals [i] = mono_mb_add_local (mb, sig->params [i]); if (swift_lowering [i].num_lowered_elements > 0) { + tmp_locals [i] = mono_mb_add_local (mb, sig->params [i]); emit_swift_lowered_struct_load (mb, csig, swift_lowering [i], tmp_locals [i], csig_argnum); + break; + } + else if (swift_lowering [i].by_reference) { + /* Structs passed by reference are handled during arg loading emission */ + tmp_locals [i] = 0; + break; } - break; } case MONO_TYPE_OBJECT: case MONO_TYPE_CLASS: From 9e1f6e24b9a4940e8b8a013894d7abc8516497bc Mon Sep 17 00:00:00 2001 From: Jeremi Kurdek Date: Tue, 9 Jul 2024 17:41:00 +0200 Subject: [PATCH 12/17] Address review comments --- src/mono/mono/metadata/marshal.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/mono/mono/metadata/marshal.c b/src/mono/mono/metadata/marshal.c index 08f454f9287701..304f3fcf9f313d 100644 --- a/src/mono/mono/metadata/marshal.c +++ b/src/mono/mono/metadata/marshal.c @@ -4188,7 +4188,7 @@ marshal_get_managed_wrapper (MonoMethod *method, MonoClass *delegate_klass, Mono if (invoke) mono_marshal_set_callconv_from_modopt (invoke, csig, TRUE); else - mono_marshal_set_callconv_from_unmanaged_callers_only_attribute(method, csig); + mono_marshal_set_callconv_from_unmanaged_callers_only_attribute (method, csig); if (mono_method_signature_has_ext_callconv (csig, MONO_EXT_CALLCONV_SWIFTCALL)) { MonoClass *swift_self = mono_class_try_get_swift_self_class (); @@ -4232,6 +4232,7 @@ marshal_get_managed_wrapper (MonoMethod *method, MonoClass *delegate_klass, Mono } csig = mono_metadata_signature_dup_new_params (NULL, NULL, get_method_image (method), csig, new_param_count, (MonoType**)new_params->data); + g_array_free (new_params, TRUE); } if (!marshalling_enabled) From b7e8f3557f953881da455d560613e7cce7ccf8ab Mon Sep 17 00:00:00 2001 From: Jeremi Kurdek Date: Wed, 10 Jul 2024 09:41:14 +0200 Subject: [PATCH 13/17] Fix loop indent --- src/mono/mono/metadata/marshal-lightweight.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/mono/mono/metadata/marshal-lightweight.c b/src/mono/mono/metadata/marshal-lightweight.c index 22a33ca22ac64d..d2b966748ccab4 100644 --- a/src/mono/mono/metadata/marshal-lightweight.c +++ b/src/mono/mono/metadata/marshal-lightweight.c @@ -2722,14 +2722,14 @@ emit_swift_lowered_struct_load (MonoMethodBuilder *mb, MonoMethodSignature *csig uint32_t offset = 0; for (uint32_t idx_lowered = 0; idx_lowered < swift_lowering.num_lowered_elements; idx_lowered++) { - offset = swift_lowering.offsets [idx_lowered]; - mono_mb_emit_ldloc_addr (mb, tmp_local); - mono_mb_emit_icon (mb, offset); - mono_mb_emit_byte (mb, CEE_ADD); - - mono_mb_emit_ldarg (mb, csig_argnum + idx_lowered); - stind_op = mono_type_to_stind (csig->params [csig_argnum + idx_lowered]); - mono_mb_emit_byte (mb, stind_op); + offset = swift_lowering.offsets [idx_lowered]; + mono_mb_emit_ldloc_addr (mb, tmp_local); + mono_mb_emit_icon (mb, offset); + mono_mb_emit_byte (mb, CEE_ADD); + + mono_mb_emit_ldarg (mb, csig_argnum + idx_lowered); + stind_op = mono_type_to_stind (csig->params [csig_argnum + idx_lowered]); + mono_mb_emit_byte (mb, stind_op); } } From a176c16716e1e4b0a8fbf694f4d754153a68bfec Mon Sep 17 00:00:00 2001 From: Jeremi Kurdek <59935235+jkurdek@users.noreply.github.com> Date: Thu, 11 Jul 2024 09:51:38 +0200 Subject: [PATCH 14/17] Update src/mono/mono/metadata/marshal-lightweight.c MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Aleksey Kliger (λgeek) --- src/mono/mono/metadata/marshal-lightweight.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mono/mono/metadata/marshal-lightweight.c b/src/mono/mono/metadata/marshal-lightweight.c index d2b966748ccab4..aec41a7820f513 100644 --- a/src/mono/mono/metadata/marshal-lightweight.c +++ b/src/mono/mono/metadata/marshal-lightweight.c @@ -2852,6 +2852,7 @@ emit_managed_wrapper_ilgen (MonoMethodBuilder *mb, MonoMethodSignature *invoke_s break; } } + /* else fallthru */ case MONO_TYPE_OBJECT: case MONO_TYPE_CLASS: case MONO_TYPE_ARRAY: From cb449f93b78f224b399e528354e393cbdca3bd69 Mon Sep 17 00:00:00 2001 From: Jeremi Kurdek Date: Thu, 11 Jul 2024 10:09:02 +0200 Subject: [PATCH 15/17] Remove passing MonoImage --- src/mono/mono/metadata/marshal.c | 2 +- src/mono/mono/metadata/metadata-internals.h | 2 +- src/mono/mono/metadata/metadata.c | 5 ++--- src/mono/mono/mini/interp/transform.c | 2 +- src/mono/mono/mini/method-to-ir.c | 2 +- 5 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/mono/mono/metadata/marshal.c b/src/mono/mono/metadata/marshal.c index 304f3fcf9f313d..afca709ed01c98 100644 --- a/src/mono/mono/metadata/marshal.c +++ b/src/mono/mono/metadata/marshal.c @@ -4231,7 +4231,7 @@ marshal_get_managed_wrapper (MonoMethod *method, MonoClass *delegate_klass, Mono } } - csig = mono_metadata_signature_dup_new_params (NULL, NULL, get_method_image (method), csig, new_param_count, (MonoType**)new_params->data); + csig = mono_metadata_signature_dup_new_params (NULL, m_method_get_mem_manager (method), csig, new_param_count, (MonoType**)new_params->data); g_array_free (new_params, TRUE); } diff --git a/src/mono/mono/metadata/metadata-internals.h b/src/mono/mono/metadata/metadata-internals.h index ecab39249fc548..54d85997d7af4a 100644 --- a/src/mono/mono/metadata/metadata-internals.h +++ b/src/mono/mono/metadata/metadata-internals.h @@ -1011,7 +1011,7 @@ MonoMethodSignature *mono_metadata_signature_dup_mem_manager (MonoMemoryManager MonoMethodSignature *mono_metadata_signature_dup_add_this (MonoImage *image, MonoMethodSignature *sig, MonoClass *klass); MonoMethodSignature *mono_metadata_signature_dup_delegate_invoke_to_target (MonoMethodSignature *sig); MonoMethodSignature *mono_metadata_signature_allocate_internal (MonoImage *image, MonoMemPool *mp, MonoMemoryManager *mem_manager, size_t sig_size); -MonoMethodSignature *mono_metadata_signature_dup_new_params (MonoMemPool *mp, MonoMemoryManager *mem_manager, MonoImage* image, MonoMethodSignature *sig, uint32_t num_params, MonoType **new_params); +MonoMethodSignature *mono_metadata_signature_dup_new_params (MonoMemPool *mp, MonoMemoryManager *mem_manager, MonoMethodSignature *sig, uint32_t num_params, MonoType **new_params); MonoGenericInst * mono_get_shared_generic_inst (MonoGenericContainer *container); diff --git a/src/mono/mono/metadata/metadata.c b/src/mono/mono/metadata/metadata.c index e5bf02c317cc60..a9b291bcadc54d 100644 --- a/src/mono/mono/metadata/metadata.c +++ b/src/mono/mono/metadata/metadata.c @@ -2565,7 +2565,6 @@ mono_metadata_signature_dup_delegate_invoke_to_target (MonoMethodSignature *sig) * mono_metadata_signature_dup_new_params: * @param mp The mempool to allocate the new signature from. * @param mem_manager The memory manager to allocate the new signature from. - * @param image The image to allocate the new signature from. * @param sig The original method signature. * @param num_params The number parameters in the new signature. * @param new_params An array of MonoType pointers representing the new parameters. @@ -2576,13 +2575,13 @@ mono_metadata_signature_dup_delegate_invoke_to_target (MonoMethodSignature *sig) * @return the new \c MonoMethodSignature structure. */ MonoMethodSignature* -mono_metadata_signature_dup_new_params (MonoMemPool *mp, MonoMemoryManager *mem_manager, MonoImage *image, MonoMethodSignature *sig, uint32_t num_params, MonoType **new_params) +mono_metadata_signature_dup_new_params (MonoMemPool *mp, MonoMemoryManager *mem_manager, MonoMethodSignature *sig, uint32_t num_params, MonoType **new_params) { size_t new_sig_size = MONO_SIZEOF_METHOD_SIGNATURE + num_params * sizeof (MonoType*); if (sig->ret) new_sig_size += mono_sizeof_type (sig->ret); - MonoMethodSignature *res = mono_metadata_signature_allocate_internal (image, mp, mem_manager, new_sig_size); + MonoMethodSignature *res = mono_metadata_signature_allocate_internal (NULL, mp, mem_manager, new_sig_size); memcpy (res, sig, MONO_SIZEOF_METHOD_SIGNATURE); res->param_count = GUINT32_TO_UINT16 (num_params); diff --git a/src/mono/mono/mini/interp/transform.c b/src/mono/mono/mini/interp/transform.c index 6c88968c1b5001..06d836056d8bc2 100644 --- a/src/mono/mono/mini/interp/transform.c +++ b/src/mono/mono/mini/interp/transform.c @@ -3461,7 +3461,7 @@ interp_emit_swiftcall_struct_lowering (TransformData *td, MonoMethodSignature *c ++td->sp; // Create a new dummy signature with the lowered arguments - new_csignature = mono_metadata_signature_dup_new_params (NULL, td->mem_manager, NULL, csignature, new_param_count, (MonoType**)new_params->data); + new_csignature = mono_metadata_signature_dup_new_params (NULL, td->mem_manager, csignature, new_param_count, (MonoType**)new_params->data); // Deallocate temp array g_array_free (new_params, TRUE); diff --git a/src/mono/mono/mini/method-to-ir.c b/src/mono/mono/mini/method-to-ir.c index f18b1d922587a4..5975236dfa98e2 100644 --- a/src/mono/mono/mini/method-to-ir.c +++ b/src/mono/mono/mini/method-to-ir.c @@ -7586,7 +7586,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b } // Create a new dummy signature with the lowered arguments - fsig = mono_metadata_signature_dup_new_params (cfg->mempool, NULL, NULL, fsig, new_param_count, (MonoType**)new_params->data); + fsig = mono_metadata_signature_dup_new_params (cfg->mempool, NULL, fsig, new_param_count, (MonoType**)new_params->data); // Deallocate temp array g_array_free (new_params, TRUE); From 022eab347021a395be8e22e7b3237ab693137068 Mon Sep 17 00:00:00 2001 From: Jeremi Kurdek Date: Fri, 12 Jul 2024 10:35:07 +0200 Subject: [PATCH 16/17] Fix formatting around conditional blocks --- src/mono/mono/metadata/marshal-lightweight.c | 18 ++++++------------ src/mono/mono/metadata/marshal.c | 14 ++++---------- 2 files changed, 10 insertions(+), 22 deletions(-) diff --git a/src/mono/mono/metadata/marshal-lightweight.c b/src/mono/mono/metadata/marshal-lightweight.c index aec41a7820f513..7530e7250459ac 100644 --- a/src/mono/mono/metadata/marshal-lightweight.c +++ b/src/mono/mono/metadata/marshal-lightweight.c @@ -2839,20 +2839,17 @@ emit_managed_wrapper_ilgen (MonoMethodBuilder *mb, MonoMethodSignature *invoke_s } else { switch (t->type) { case MONO_TYPE_VALUETYPE: - if (mono_method_signature_has_ext_callconv (csig, MONO_EXT_CALLCONV_SWIFTCALL)) - { + if (mono_method_signature_has_ext_callconv (csig, MONO_EXT_CALLCONV_SWIFTCALL)) { if (swift_lowering [i].num_lowered_elements > 0) { tmp_locals [i] = mono_mb_add_local (mb, sig->params [i]); emit_swift_lowered_struct_load (mb, csig, swift_lowering [i], tmp_locals [i], csig_argnum); break; - } - else if (swift_lowering [i].by_reference) { + } else if (swift_lowering [i].by_reference) { /* Structs passed by reference are handled during arg loading emission */ tmp_locals [i] = 0; break; } - } - /* else fallthru */ + } /* else fallthru */ case MONO_TYPE_OBJECT: case MONO_TYPE_CLASS: case MONO_TYPE_ARRAY: @@ -2886,19 +2883,16 @@ emit_managed_wrapper_ilgen (MonoMethodBuilder *mb, MonoMethodSignature *invoke_s for (i = 0; i < sig->param_count; i++) { MonoType *t = sig->params [i]; int csig_argnum = get_csig_argnum (i, m); - if(mono_method_signature_has_ext_callconv (csig, MONO_EXT_CALLCONV_SWIFTCALL) && swift_lowering [i].by_reference) - { + if(mono_method_signature_has_ext_callconv (csig, MONO_EXT_CALLCONV_SWIFTCALL) && swift_lowering [i].by_reference) { mono_mb_emit_ldarg (mb, csig_argnum); MonoClass* klass = mono_class_from_mono_type_internal (sig->params [i]); mono_mb_emit_op (mb, CEE_LDOBJ, klass); - } - else if (tmp_locals [i]) { + } else if (tmp_locals [i]) { if (m_type_is_byref (t)) mono_mb_emit_ldloc_addr (mb, tmp_locals [i]); else mono_mb_emit_ldloc (mb, tmp_locals [i]); - } - else + } else mono_mb_emit_ldarg (mb, csig_argnum); } diff --git a/src/mono/mono/metadata/marshal.c b/src/mono/mono/metadata/marshal.c index afca709ed01c98..bff7eb1d3e3ad4 100644 --- a/src/mono/mono/metadata/marshal.c +++ b/src/mono/mono/metadata/marshal.c @@ -4206,26 +4206,20 @@ marshal_get_managed_wrapper (MonoMethod *method, MonoClass *delegate_klass, Mono MonoType *ptype = csig->params [i]; MonoClass *klass = mono_class_from_mono_type_internal (ptype); - if (mono_type_is_struct (ptype) && !(klass == swift_self || klass == swift_error || klass == swift_indirect_result)) - { + if (mono_type_is_struct (ptype) && !(klass == swift_self || klass == swift_error || klass == swift_indirect_result)) { SwiftPhysicalLowering lowered_swift_struct = mono_marshal_get_swift_physical_lowering (ptype, FALSE); swift_lowering [i] = lowered_swift_struct; - if (!lowered_swift_struct.by_reference) - { + if (!lowered_swift_struct.by_reference) { for (uint32_t idx_lowered = 0; idx_lowered < lowered_swift_struct.num_lowered_elements; idx_lowered++) { g_array_append_val (new_params, lowered_swift_struct.lowered_elements [idx_lowered]); new_param_count++; } - } - else - { + } else { ptype = mono_class_get_byref_type (klass); g_array_append_val (new_params, ptype); new_param_count++; } - } - else - { + } else { g_array_append_val (new_params, ptype); new_param_count++; } From 96a2cb9a20abd1ab9e94fa1f9e6f343cbd009686 Mon Sep 17 00:00:00 2001 From: Jeremi Kurdek Date: Fri, 12 Jul 2024 10:40:59 +0200 Subject: [PATCH 17/17] Fix missing whitespace --- src/mono/mono/metadata/marshal-lightweight.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mono/mono/metadata/marshal-lightweight.c b/src/mono/mono/metadata/marshal-lightweight.c index 7530e7250459ac..9829c95232baef 100644 --- a/src/mono/mono/metadata/marshal-lightweight.c +++ b/src/mono/mono/metadata/marshal-lightweight.c @@ -2883,7 +2883,7 @@ emit_managed_wrapper_ilgen (MonoMethodBuilder *mb, MonoMethodSignature *invoke_s for (i = 0; i < sig->param_count; i++) { MonoType *t = sig->params [i]; int csig_argnum = get_csig_argnum (i, m); - if(mono_method_signature_has_ext_callconv (csig, MONO_EXT_CALLCONV_SWIFTCALL) && swift_lowering [i].by_reference) { + if (mono_method_signature_has_ext_callconv (csig, MONO_EXT_CALLCONV_SWIFTCALL) && swift_lowering [i].by_reference) { mono_mb_emit_ldarg (mb, csig_argnum); MonoClass* klass = mono_class_from_mono_type_internal (sig->params [i]); mono_mb_emit_op (mb, CEE_LDOBJ, klass);