2009-05-15 Zoltan Varga <vargaz@gmail.com>
authorZoltan Varga <vargaz@gmail.com>
Fri, 15 May 2009 01:01:58 +0000 (01:01 -0000)
committerZoltan Varga <vargaz@gmail.com>
Fri, 15 May 2009 01:01:58 +0000 (01:01 -0000)
* mini-trampolines.c (mono_magic_trampoline): Handle static rgctx invoke
wrappers during full aot mode correctly.

* aot-runtime.c (mono_aot_get_unbox_trampoline): Handle shared generic
methods correctly.

svn path=/trunk/mono/; revision=134173

mono/mini/ChangeLog
mono/mini/aot-compiler.c
mono/mini/aot-runtime.c
mono/mini/mini-trampolines.c

index 26e56612eff79ab69d7d8b9ed552a0e5bcb2f7a6..746fdc7de4a4edde2b48e64eec92731448c91c02 100644 (file)
@@ -1,5 +1,11 @@
 2009-05-15  Zoltan Varga  <vargaz@gmail.com>
 
+       * mini-trampolines.c (mono_magic_trampoline): Handle static rgctx invoke
+       wrappers during full aot mode correctly.
+
+       * aot-runtime.c (mono_aot_get_unbox_trampoline): Handle shared generic
+       methods correctly.
+
        * aot-compiler.c (mono_aot_method_hash): Use our internal version of
        mono_metadata_type_hash ().
 
index de22e1c65013c70b6c536cb4be6a18f7cc9600ed..b584a9c3bcb3419d4024e301546fbe158ac52828 100644 (file)
@@ -2938,9 +2938,11 @@ can_encode_patch (MonoAotCompile *acfg, MonoJumpInfo *patch_info)
                        case MONO_WRAPPER_PROXY_ISINST:
                        case MONO_WRAPPER_ALLOC:
                        case MONO_WRAPPER_REMOTING_INVOKE:
-                       case MONO_WRAPPER_STATIC_RGCTX_INVOKE:
                        case MONO_WRAPPER_UNKNOWN:
                                break;
+                       case MONO_WRAPPER_STATIC_RGCTX_INVOKE:
+                               g_assert (!acfg->aot_opts.full_aot);
+                               break;
                        default:
                                //printf ("Skip (wrapper call): %d -> %s\n", patch_info->type, mono_method_full_name (patch_info->data.method, TRUE));
                                return FALSE;
index cbcefc98cf16fece9de7e54a23c6149ac59e0953..aa7608dc6a99046851b51254a9cd943475cf92a1 100644 (file)
@@ -2750,9 +2750,8 @@ mono_aot_get_unbox_trampoline (MonoMethod *method)
        char *symbol;
        gpointer code;
 
-       if (method->is_inflated) {
+       if (method->is_inflated && !mono_method_is_generic_sharable_impl (method, FALSE)) {
                guint32 index = find_extra_method (method, &amodule);
-
                g_assert (index != 0xffffff);
                
                symbol = g_strdup_printf ("ut_e_%d", index);
index 6fda8ac054e16dc80543c70252b2f2bf34d5cf82..c452034aeb25d99e3cea82c76e9790570e83ed13 100644 (file)
@@ -411,6 +411,15 @@ mono_magic_trampoline (gssize *regs, guint8 *code, MonoMethod *m, guint8* tramp)
        if (!code && mono_method_needs_static_rgctx_invoke (m, FALSE))
                m = mono_marshal_get_static_rgctx_invoke (m);
 
+       if (mono_aot_only && m->wrapper_type == MONO_WRAPPER_STATIC_RGCTX_INVOKE) {
+               /* 
+                * These wrappers can be created in mono_class_get_vtable_entry () for 
+                * example.
+                */
+               need_rgctx_tramp = TRUE;
+               m = mono_marshal_method_from_wrapper (m);
+       }
+
        addr = mono_compile_method (m);
        g_assert (addr);