Author: zoltan
Date: 2008-02-21 07:55:47 -0500 (Thu, 21 Feb 2008)
New Revision: 96339

Modified:
   trunk/mono/mono/mini/ChangeLog
   trunk/mono/mono/mini/aot-compiler.c
   trunk/mono/mono/mini/aot-runtime.c
   trunk/mono/mono/mini/mini.c
   trunk/mono/mono/mini/patch-info.h
Log:
2008-02-21  Zoltan Varga  <[EMAIL PROTECTED]>

        * aot-compiler.c (encode_patch): Handle ICALL_ADDR patch type.

        * aot-runtime.c (decode_patch_info): Ditto.

        * mini.c (mono_resolve_patch_target): Ditto.
        
        * aot-compiler.c (compile_method): Add some experimental code for AOT 
compiling
        icall wrappers.

        * patch-info.h (PATCH_INFO): Add 'ICALL_ADDR' patch type.
        
        * mini.c (mono_method_to_ir): Convert a CEE_MONO_LDPTR opcode to an AOT 
constant
        if it references an icall address.


Modified: trunk/mono/mono/mini/ChangeLog
===================================================================
--- trunk/mono/mono/mini/ChangeLog      2008-02-21 12:54:27 UTC (rev 96338)
+++ trunk/mono/mono/mini/ChangeLog      2008-02-21 12:55:47 UTC (rev 96339)
@@ -1,3 +1,19 @@
+2008-02-21  Zoltan Varga  <[EMAIL PROTECTED]>
+
+       * aot-compiler.c (encode_patch): Handle ICALL_ADDR patch type.
+
+       * aot-runtime.c (decode_patch_info): Ditto.
+
+       * mini.c (mono_resolve_patch_target): Ditto.
+       
+       * aot-compiler.c (compile_method): Add some experimental code for AOT 
compiling
+       icall wrappers.
+
+       * patch-info.h (PATCH_INFO): Add 'ICALL_ADDR' patch type.
+       
+       * mini.c (mono_method_to_ir): Convert a CEE_MONO_LDPTR opcode to an AOT 
constant
+       if it references an icall address.
+
 2008-02-20  Zoltan Varga  <[EMAIL PROTECTED]>
 
        * cpu-s390x.md: Remove some more unused opcodes.

Modified: trunk/mono/mono/mini/aot-compiler.c
===================================================================
--- trunk/mono/mono/mini/aot-compiler.c 2008-02-21 12:54:27 UTC (rev 96338)
+++ trunk/mono/mono/mini/aot-compiler.c 2008-02-21 12:55:47 UTC (rev 96339)
@@ -115,6 +115,7 @@
        GPtrArray *shared_patches;
        GHashTable *image_hash;
        GHashTable *method_to_cfg;
+       GHashTable *wrapper_to_method;
        GHashTable *token_info_hash;
        GPtrArray *image_table;
        GList *method_order;
@@ -1837,6 +1838,20 @@
        return get_got_offset (acfg, ji);
 }
 
+static guint32
+get_method_index (MonoAotCompile *acfg, MonoMethod *method)
+{
+       int method_index = mono_metadata_token_index (method->token);
+
+       if (method_index == 0) {
+               MonoMethod *wrapped = g_hash_table_lookup 
(acfg->wrapper_to_method, method);
+               g_assert (wrapped);
+               method_index = mono_metadata_token_index (wrapped->token);
+       }
+
+       return method_index;
+}
+
 static void
 emit_method_code (MonoAotCompile *acfg, MonoCompile *cfg)
 {
@@ -1855,7 +1870,7 @@
        code = cfg->native_code;
        header = mono_method_get_header (method);
 
-       method_index = mono_metadata_token_index (method->token);
+       method_index = get_method_index (acfg, method);
 
        /* Make the labels local */
        symbol = g_strdup_printf (".Lm_%x", method_index);
@@ -2018,6 +2033,7 @@
        case MONO_PATCH_INFO_METHODCONST:
        case MONO_PATCH_INFO_METHOD:
        case MONO_PATCH_INFO_METHOD_JUMP:
+       case MONO_PATCH_INFO_ICALL_ADDR:
                encode_method_ref (acfg, patch_info->data.method, p, &p);
                break;
        case MONO_PATCH_INFO_INTERNAL_METHOD: {
@@ -2091,7 +2107,7 @@
                        encode_field_info (acfg, patch_info->data.field, p, &p);
                }
                break;
-       case MONO_PATCH_INFO_WRAPPER: {
+       case MONO_PATCH_INFO_WRAPPER:
                encode_value (patch_info->data.method->wrapper_type, p, &p);
 
                switch (patch_info->data.method->wrapper_type) {
@@ -2132,7 +2148,6 @@
                        g_assert_not_reached ();
                }
                break;
-       }
        default:
                g_warning ("unable to handle jump info %d", patch_info->type);
                g_assert_not_reached ();
@@ -2152,7 +2167,7 @@
        GPtrArray *patches;
        MonoJumpInfo *patch_info;
        MonoMethodHeader *header;
-       guint32 last_offset, method_idx;
+       guint32 last_offset, method_index;
        guint8 *p, *buf;
        guint32 first_got_offset;
 
@@ -2160,10 +2175,10 @@
        code = cfg->native_code;
        header = mono_method_get_header (method);
 
-       method_idx = mono_metadata_token_index (method->token);
+       method_index = get_method_index (acfg, method);
 
        /* Make the labels local */
-       symbol = g_strdup_printf (".Lm_%x_p", method_idx);
+       symbol = g_strdup_printf (".Lm_%x_p", method_index);
 
        /* Sort relocations */
        patches = g_ptr_array_new ();
@@ -2171,7 +2186,7 @@
                g_ptr_array_add (patches, patch_info);
        g_ptr_array_sort (patches, compare_patches);
 
-       first_got_offset = acfg->method_got_offsets [mono_metadata_token_index 
(cfg->method->token)];
+       first_got_offset = acfg->method_got_offsets [method_index];
 
        /**********************/
        /* Encode method info */
@@ -2229,7 +2244,7 @@
        }
 
        if (n_patches)
-               g_assert (acfg->has_got_slots [method_idx]);
+               g_assert (acfg->has_got_slots [method_index]);
 
        encode_value (n_patches, p, &p);
 
@@ -2297,7 +2312,7 @@
 emit_exception_debug_info (MonoAotCompile *acfg, MonoCompile *cfg)
 {
        MonoMethod *method;
-       int k, buf_size;
+       int k, buf_size, method_index;
        guint32 debug_info_size;
        guint8 *code;
        char *symbol;
@@ -2308,8 +2323,10 @@
        code = cfg->native_code;
        header = mono_method_get_header (method);
 
+       method_index = get_method_index (acfg, method);
+
        /* Make the labels local */
-       symbol = g_strdup_printf (".Le_%x_p", mono_metadata_token_index 
(method->token));
+       symbol = g_strdup_printf (".Le_%x_p", method_index);
 
        buf_size = header->num_clauses * 256 + 128;
        p = buf = g_malloc (buf_size);
@@ -2689,23 +2706,27 @@
        method_idx = mono_metadata_token_index (method->token); 
                
        /* fixme: maybe we can also precompile wrapper methods */
-       if ((method->iflags & METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL) ||
-               (method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL) ||
+       if ((method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL) ||
                (method->iflags & METHOD_IMPL_ATTRIBUTE_RUNTIME) ||
                (method->flags & METHOD_ATTRIBUTE_ABSTRACT)) {
                //printf ("Skip (impossible): %s\n", mono_method_full_name 
(method, TRUE));
                return;
        }
 
-       acfg->stats.mcount++;
+       if (method->iflags & METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL)
+               return;
 
-       /* fixme: we need to patch the IP for the LMF in that case */
-       if (method->save_lmf) {
-               //printf ("Skip (needs lmf):  %s\n", mono_method_full_name 
(method, TRUE));
-               acfg->stats.lmfcount++;
-               return;
+#if 0
+       if (method->iflags & METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL) {
+               /* Compile the wrapper instead */
+               MonoMethod *wrapper = mono_marshal_get_native_wrapper (method, 
check_for_pending_exc);
+               g_hash_table_insert (acfg->wrapper_to_method, wrapper, method);
+               method = wrapper;
        }
+#endif
 
+       acfg->stats.mcount++;
+
        if (method->iflags & METHOD_IMPL_ATTRIBUTE_SYNCHRONIZED) {
                /* 
                 * FIXME: Enabling this causes virtual-sync.exe to fail, since 
the trampoline
@@ -3458,6 +3479,7 @@
        acfg->patch_to_shared_got_offset = g_hash_table_new 
(mono_patch_info_hash, mono_patch_info_equal);
        acfg->shared_patches = g_ptr_array_new ();
        acfg->method_to_cfg = g_hash_table_new (NULL, NULL);
+       acfg->wrapper_to_method = g_hash_table_new (NULL, NULL);
        acfg->token_info_hash = g_hash_table_new (NULL, NULL);
        acfg->image_hash = g_hash_table_new (NULL, NULL);
        acfg->image_table = g_ptr_array_new ();

Modified: trunk/mono/mono/mini/aot-runtime.c
===================================================================
--- trunk/mono/mono/mini/aot-runtime.c  2008-02-21 12:54:27 UTC (rev 96338)
+++ trunk/mono/mono/mini/aot-runtime.c  2008-02-21 12:55:47 UTC (rev 96339)
@@ -1153,7 +1153,8 @@
        switch (ji->type) {
        case MONO_PATCH_INFO_METHOD:
        case MONO_PATCH_INFO_METHODCONST:
-       case MONO_PATCH_INFO_METHOD_JUMP: {
+       case MONO_PATCH_INFO_METHOD_JUMP:
+       case MONO_PATCH_INFO_ICALL_ADDR: {
                guint32 token;
 
                image = decode_method_ref (aot_module, &token, p, &p);

Modified: trunk/mono/mono/mini/mini.c
===================================================================
--- trunk/mono/mono/mini/mini.c 2008-02-21 12:54:27 UTC (rev 96338)
+++ trunk/mono/mono/mini/mini.c 2008-02-21 12:55:47 UTC (rev 96339)
@@ -7921,11 +7921,26 @@
 
                                break;
                        }
-                       case CEE_MONO_LDPTR:
+                       case CEE_MONO_LDPTR: {
+                               gpointer ptr;
+
                                CHECK_STACK_OVF (1);
                                CHECK_OPSIZE (6);
                                token = read32 (ip + 2);
-                               NEW_PCONST (cfg, ins, 
mono_method_get_wrapper_data (method, token));
+
+                               ptr = mono_method_get_wrapper_data (method, 
token);
+                               if (cfg->compile_aot && 
cfg->method->wrapper_type == MONO_WRAPPER_MANAGED_TO_NATIVE) {
+                                       MonoMethod *wrapped = 
mono_marshal_method_from_wrapper (cfg->method);
+
+                                       if (wrapped && ptr != NULL && 
mono_lookup_internal_call (wrapped) == ptr) {
+                                               NEW_AOTCONST (cfg, ins, 
MONO_PATCH_INFO_ICALL_ADDR, wrapped);
+                                               ins->cil_code = ip;
+                                               *sp++ = ins;
+                                               ip += 6;
+                                               break;
+                                       }
+                               }
+                               NEW_PCONST (cfg, ins, ptr);
                                ins->cil_code = ip;
                                *sp++ = ins;
                                ip += 6;
@@ -7933,6 +7948,7 @@
                                /* Can't embed random pointers into AOT code */
                                cfg->disable_aot = 1;
                                break;
+                       }
                        case CEE_MONO_VTADDR:
                                CHECK_STACK (1);
                                --sp;
@@ -10041,6 +10057,9 @@
        case MONO_PATCH_INFO_DECLSEC:
                target = (mono_metadata_blob_heap 
(patch_info->data.token->image, patch_info->data.token->token) + 2);
                break;
+       case MONO_PATCH_INFO_ICALL_ADDR:
+               target = mono_lookup_internal_call (patch_info->data.method);
+               break;
        case MONO_PATCH_INFO_BB_OVF:
        case MONO_PATCH_INFO_EXC_OVF:
        case MONO_PATCH_INFO_GOT_OFFSET:

Modified: trunk/mono/mono/mini/patch-info.h
===================================================================
--- trunk/mono/mono/mini/patch-info.h   2008-02-21 12:54:27 UTC (rev 96338)
+++ trunk/mono/mono/mini/patch-info.h   2008-02-21 12:55:47 UTC (rev 96339)
@@ -30,4 +30,5 @@
 PATCH_INFO(DECLSEC, "declsec")
 PATCH_INFO(RVA, "rva")
 PATCH_INFO(DELEGATE_TRAMPOLINE, "delegate_trampoline")
+PATCH_INFO(ICALL_ADDR, "icall_addr")
 PATCH_INFO(NONE, "none")

_______________________________________________
Mono-patches maillist  -  Mono-patches@lists.ximian.com
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to