From bbe5c66c50201816c14149fd3f259db86bc1f493 Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Sat, 23 Sep 2023 20:29:05 -0400 Subject: [PATCH] [mono] Generate gsharedvt versions of the callvirt delegate invoke wrappers. (#92472) Also change the IL of the wrapper so it works with gsharedvt. --- src/mono/mono/metadata/marshal-lightweight.c | 12 ++++----- src/mono/mono/metadata/marshal.c | 2 +- src/mono/mono/mini/aot-compiler.c | 27 +++++++++++++++----- 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/src/mono/mono/metadata/marshal-lightweight.c b/src/mono/mono/metadata/marshal-lightweight.c index 3c5b0de4c67bc..80a4a000f14c0 100644 --- a/src/mono/mono/metadata/marshal-lightweight.c +++ b/src/mono/mono/metadata/marshal-lightweight.c @@ -2094,13 +2094,13 @@ emit_delegate_invoke_internal_ilgen (MonoMethodBuilder *mb, MonoMethodSignature if (!closed_over_null) { for (i = 1; i <= sig->param_count; ++i) { mono_mb_emit_ldarg (mb, i); - if (i == 1 && (MONO_TYPE_ISSTRUCT (sig->params [0]) || MONO_TYPE_IS_PRIMITIVE (sig->params [0]))) - mono_mb_emit_op (mb, CEE_BOX, mono_class_from_mono_type_internal (sig->params [0])); + if (i == 1) { + MonoType *t = sig->params [0]; + if (!m_type_is_byref (t)) + mono_mb_emit_op (mb, CEE_BOX, mono_class_from_mono_type_internal (t)); + } } - if (MONO_TYPE_ISSTRUCT (sig->params [0]) || MONO_TYPE_IS_PRIMITIVE (sig->params [0])) - mono_mb_emit_ldarg_addr (mb, 1); - else - mono_mb_emit_ldarg (mb, 1); + mono_mb_emit_ldarg_addr (mb, 1); mono_mb_emit_ldarg (mb, 0); mono_mb_emit_icall (mb, mono_get_addr_compiled_method); mono_mb_emit_op (mb, CEE_CALLI, target_method_sig); diff --git a/src/mono/mono/metadata/marshal.c b/src/mono/mono/metadata/marshal.c index 21490ec4dd5e8..0831f22941e1f 100644 --- a/src/mono/mono/metadata/marshal.c +++ b/src/mono/mono/metadata/marshal.c @@ -5573,7 +5573,7 @@ mono_get_addr_compiled_method (gpointer arg, MonoDelegate *del) if (m_type_is_byref (invoke_sig->params [0])) { arg_class = mono_class_from_mono_type_internal (invoke_sig->params [0]); } else { - MonoObject *object = (MonoObject*)arg; + MonoObject *object = *(MonoObject**)arg; arg_class = object->vtable->klass; } diff --git a/src/mono/mono/mini/aot-compiler.c b/src/mono/mono/mini/aot-compiler.c index 5c86a19f7b467..3465fe8262e91 100644 --- a/src/mono/mono/mini/aot-compiler.c +++ b/src/mono/mono/mini/aot-compiler.c @@ -5019,24 +5019,39 @@ add_full_aot_wrappers (MonoAotCompile *acfg) MonoGenericContext ctx; MonoMethod *inst, *gshared; - create_ref_shared_inst (acfg, method, &ctx); - - inst = mono_class_inflate_generic_method_checked (method, &ctx, error); - g_assert (is_ok (error)); /* FIXME don't swallow the error */ - sig = mono_method_signature_internal (method); if (sig->param_count && !m_class_is_byreflike (mono_class_from_mono_type_internal (sig->params [0])) && !m_type_is_byref (sig->params [0])) { + /* ref */ + create_ref_shared_inst (acfg, method, &ctx); + + inst = mono_class_inflate_generic_method_checked (method, &ctx, error); + g_assert (is_ok (error)); /* FIXME don't swallow the error */ + m = mono_marshal_get_delegate_invoke_internal (inst, TRUE, FALSE, NULL); gshared = mini_get_shared_method_full (m, SHARE_MODE_NONE, error); mono_error_assert_ok (error); add_extra_method (acfg, gshared); + + if (acfg->jit_opts & MONO_OPT_GSHAREDVT) { + /* gsharedvt */ + create_gsharedvt_inst (acfg, method, &ctx); + + inst = mono_class_inflate_generic_method_checked (method, &ctx, error); + g_assert (is_ok (error)); /* FIXME don't swallow the error */ + + m = mono_marshal_get_delegate_invoke_internal (inst, TRUE, FALSE, NULL); + + gshared = mini_get_shared_method_full (m, SHARE_MODE_GSHAREDVT, error); + mono_error_assert_ok (error); + + add_extra_method (acfg, gshared); + } } } if (!mono_class_is_gtd (klass)) { - m = mono_marshal_get_delegate_invoke (method, NULL); add_method (acfg, m);