2010-02-08 Zoltan Varga <vargaz@gmail.com>
authorZoltan Varga <vargaz@gmail.com>
Mon, 8 Feb 2010 19:34:07 +0000 (19:34 -0000)
committerZoltan Varga <vargaz@gmail.com>
Mon, 8 Feb 2010 19:34:07 +0000 (19:34 -0000)
* aot-compiler.c (emit_code): Create the ut trampolines here, so they work for
llvm methods too.

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

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

index 9fd845f77a852df337d6231fb00c30c1545757f8..2c309f9f1f98ea29641b56dcc6fb3d8136c782fd 100755 (executable)
@@ -1,5 +1,8 @@
 2010-02-08  Zoltan Varga  <vargaz@gmail.com>
 
+       * aot-compiler.c (emit_code): Create the ut trampolines here, so they work for
+       llvm methods too.
+
        * aot-compiler.c (emit_code): Don't add the llvm label prefix to 'methods', since
        it is not an LLVM generated symbol.
 
index 68ee5a6238aa82bdcf07a037c3a6f2c5a2897f4e..9cc38db78f93180a51df1e645d8aa31af3e63434 100644 (file)
@@ -2843,26 +2843,6 @@ emit_method_code (MonoAotCompile *acfg, MonoCompile *cfg)
 
        method_index = get_method_index (acfg, method);
 
-       /* Emit unbox trampoline */
-       if (acfg->aot_opts.full_aot && cfg->orig_method->klass->valuetype && (method->flags & METHOD_ATTRIBUTE_VIRTUAL)) {
-               char call_target [256];
-
-               if (!method->wrapper_type && !method->is_inflated) {
-                       g_assert (method->token);
-                       sprintf (symbol, "ut_%d", mono_metadata_token_index (method->token) - 1);
-               } else {
-                       sprintf (symbol, "ut_e_%d", get_method_index (acfg, method));
-               }
-
-               emit_section_change (acfg, ".text", 0);
-               emit_global (acfg, symbol, TRUE);
-               emit_label (acfg, symbol);
-
-               sprintf (call_target, "%s", cfg->asm_symbol);
-
-               arch_emit_unbox_trampoline (acfg, cfg->orig_method, cfg->generic_sharing_context, call_target);
-       }
-
        /* Make the labels local */
        sprintf (symbol, "%s", cfg->asm_symbol);
 
@@ -4475,14 +4455,42 @@ emit_code (MonoAotCompile *acfg)
        emit_zero_bytes (acfg, 16);
 
        for (l = acfg->method_order; l != NULL; l = l->next) {
+               MonoCompile *cfg;
+               MonoMethod *method;
+
                i = GPOINTER_TO_UINT (l->data);
 
-               if (acfg->cfgs [i]) {
-                       if (acfg->cfgs [i]->compile_llvm)
-                               acfg->stats.llvm_count ++;
-                       else
-                               emit_method_code (acfg, acfg->cfgs [i]);
+               cfg = acfg->cfgs [i];
+
+               if (!cfg)
+                       continue;
+
+               method = cfg->orig_method;
+
+               /* Emit unbox trampoline */
+               if (acfg->aot_opts.full_aot && cfg->orig_method->klass->valuetype && (method->flags & METHOD_ATTRIBUTE_VIRTUAL)) {
+                       char call_target [256];
+
+                       if (!method->wrapper_type && !method->is_inflated) {
+                               g_assert (method->token);
+                               sprintf (symbol, "ut_%d", mono_metadata_token_index (method->token) - 1);
+                       } else {
+                               sprintf (symbol, "ut_e_%d", get_method_index (acfg, method));
+                       }
+
+                       emit_section_change (acfg, ".text", 0);
+                       emit_global (acfg, symbol, TRUE);
+                       emit_label (acfg, symbol);
+
+                       sprintf (call_target, "%s", cfg->asm_symbol);
+
+                       arch_emit_unbox_trampoline (acfg, cfg->orig_method, cfg->generic_sharing_context, call_target);
                }
+
+               if (cfg->compile_llvm)
+                       acfg->stats.llvm_count ++;
+               else
+                       emit_method_code (acfg, cfg);
        }
 
        sprintf (symbol, "methods_end");