[llvmonly] Avoid emitting runtime invoke wrappers for the signatures which the gshare...
authorZoltan Varga <vargaz@gmail.com>
Sat, 19 Dec 2015 23:43:09 +0000 (18:43 -0500)
committerZoltan Varga <vargaz@gmail.com>
Sat, 19 Dec 2015 23:43:09 +0000 (18:43 -0500)
mono/mini/aot-compiler.c
mono/mini/mini-runtime.c
mono/mini/mini.h

index 32ef985f00026a33621c55d1483ff56e96408044..dd39c1c435bd1a7cef191c98573a4b1402398c8f 100644 (file)
@@ -3493,6 +3493,10 @@ add_wrappers (MonoAotCompile *acfg)
                }
 #endif
 
+               if (!skip && acfg->aot_opts.llvm_only && (acfg->opts & MONO_OPT_GSHAREDVT) && mini_gsharedvt_runtime_invoke_supported (sig))
+                       /* Supported by the gsharedvt based runtime-invoke wrapper */
+                       skip = TRUE;
+
                if (!skip) {
                        //printf ("%s\n", mono_method_full_name (method, TRUE));
                        add_method (acfg, get_runtime_invoke (acfg, method, FALSE));
index e714238a4a72829d76666e2433d1fd80ffed5899..b78a31d35c4b9fccf08478bb0e44171ff6c85bac 100644 (file)
@@ -2141,6 +2141,22 @@ typedef struct {
        gpointer *wrapper_arg;
 } RuntimeInvokeInfo;
 
+gboolean
+mini_gsharedvt_runtime_invoke_supported (MonoMethodSignature *sig)
+{
+       gboolean supported = TRUE;
+       int i;
+
+       for (i = 0; i < sig->param_count; ++i) {
+               MonoType *t = sig->params [i];
+
+               if (t->byref && t->type == MONO_TYPE_GENERICINST && mono_class_is_nullable (mono_class_from_mono_type (t)))
+                       supported = FALSE;
+       }
+
+       return supported;
+}
+
 static RuntimeInvokeInfo*
 create_runtime_invoke_info (MonoDomain *domain, MonoMethod *method, gpointer compiled_method)
 {
@@ -2230,15 +2246,9 @@ create_runtime_invoke_info (MonoDomain *domain, MonoMethod *method, gpointer com
 
        if (!info->dyn_call_info) {
                if (mono_llvm_only) {
-                       gboolean supported = TRUE;
-                       int i;
-
-                       for (i = 0; i < sig->param_count; ++i) {
-                               MonoType *t = sig->params [i];
+                       gboolean supported;
 
-                               if (t->byref && t->type == MONO_TYPE_GENERICINST && mono_class_is_nullable (mono_class_from_mono_type (t)))
-                                       supported = FALSE;
-                       }
+                       supported = mini_gsharedvt_runtime_invoke_supported (sig);
 
                        if (mono_class_is_contextbound (method->klass) || !info->compiled_method)
                                supported = FALSE;
index 5fc8b9916b305f49dc9e48ac5200096e2fec1755..b7742f6f123ef247c4ae003d1cfd65cd8d43673b 100644 (file)
@@ -2948,7 +2948,7 @@ gpointer mini_get_gsharedvt_wrapper (gboolean gsharedvt_in, gpointer addr, MonoM
 MonoMethod* mini_get_gsharedvt_in_sig_wrapper (MonoMethodSignature *sig);
 MonoMethod* mini_get_gsharedvt_out_sig_wrapper (MonoMethodSignature *sig);
 MonoMethodSignature* mini_get_gsharedvt_out_sig_wrapper_signature (gboolean has_this, gboolean has_ret, int param_count);
-MonoMethod* mono_get_runtime_invoke_wrapper_gsharedvt (gboolean has_this, gboolean has_ret, int param_count);
+gboolean mini_gsharedvt_runtime_invoke_supported (MonoMethodSignature *sig);
 
 /* SIMD support */