[runtime] Register unbox trampolines
authorVlad Brezae <brezaevlad@gmail.com>
Tue, 2 Jun 2015 20:58:53 +0000 (13:58 -0700)
committerVlad Brezae <brezaevlad@gmail.com>
Wed, 29 Jul 2015 22:06:38 +0000 (15:06 -0700)
mono/mini/aot-compiler.c
mono/mini/aot-runtime.c
mono/mini/tramp-amd64.c
mono/mini/tramp-arm.c
mono/mini/tramp-ia64.c
mono/mini/tramp-mips.c
mono/mini/tramp-ppc.c
mono/mini/tramp-s390x.c
mono/mini/tramp-sparc.c
mono/mini/tramp-x86.c

index fbac70e9c62a57442a4baed84a41323264fd7a71..f43234601e89b32ee31bef1717bb22892326079d 100644 (file)
@@ -7609,6 +7609,7 @@ static void
 emit_code (MonoAotCompile *acfg)
 {
        int oindex, i, prev_index;
+       gboolean saved_unbox_info = FALSE;
        char symbol [256];
 
 #if defined(TARGET_POWERPC64)
@@ -7676,6 +7677,21 @@ emit_code (MonoAotCompile *acfg)
 
                        if (acfg->thumb_mixed && cfg->compile_llvm)
                                emit_set_arm_mode (acfg);
+
+                       if (!saved_unbox_info) {
+                               char user_symbol [128];
+                               sprintf (user_symbol, "%sunbox_trampoline_p", acfg->user_symbol_prefix);
+
+                               emit_label (acfg, "ut_end");
+                               emit_section_change (acfg, RODATA_SECT, 0);
+                               emit_global (acfg, user_symbol, FALSE);
+                               emit_label (acfg, user_symbol);
+
+                               /* Save the unbox trampoline size */
+                               emit_symbol_diff (acfg, "ut_end", symbol, 0);
+
+                               saved_unbox_info = TRUE;
+                       }
                }
 
                if (cfg->compile_llvm)
index 870338ae0b8b7de57c09dd19d81e0e4b54193d2b..e0e68c496429adad25e7dca92817f74b73775456 100644 (file)
@@ -4989,6 +4989,7 @@ mono_aot_get_unbox_trampoline (MonoMethod *method)
        gpointer code;
        guint32 *ut, *ut_end, *entry;
        int low, high, entry_index = 0;
+       gpointer symbol_addr;
 
        if (method->is_inflated && !mono_method_is_generic_sharable_full (method, FALSE, FALSE, FALSE)) {
                method_index = find_aot_method (method, &amodule);
@@ -5028,6 +5029,12 @@ mono_aot_get_unbox_trampoline (MonoMethod *method)
        code = get_call_table_entry (amodule->unbox_trampoline_addresses, entry_index);
        g_assert (code);
 
+       find_symbol (amodule->sofile, amodule->globals, "unbox_trampoline_p", &symbol_addr);
+
+       g_assert (symbol_addr);
+
+       mono_tramp_info_register (mono_tramp_info_create (NULL, code, *(guint32*)symbol_addr, NULL, NULL));
+
        /* The caller expects an ftnptr */
        return mono_create_ftnptr (mono_domain_get (), code);
 }
index 687f2b3995cfce3f4a5702e013b6770da7a752c1..f795d0309fa33c475d656b2375140a2c2fdcb412 100644 (file)
@@ -70,6 +70,8 @@ mono_arch_get_unbox_trampoline (MonoMethod *m, gpointer addr)
        mono_arch_flush_icache (start, code - start);
        mono_profiler_code_buffer_new (start, code - start, MONO_PROFILER_CODE_BUFFER_UNBOX_TRAMPOLINE, m);
 
+       mono_tramp_info_register (mono_tramp_info_create (NULL, start, code - start, NULL, NULL));
+
        return start;
 }
 
index 79cf758b109a674d930d301003f8bba58235026e..fb55c86406246aec4cba8da370b9a4e3d378083a 100644 (file)
@@ -599,6 +599,8 @@ mono_arch_get_unbox_trampoline (MonoMethod *m, gpointer addr)
        /*g_print ("unbox trampoline at %d for %s:%s\n", this_pos, m->klass->name, m->name);
        g_print ("unbox code is at %p for method at %p\n", start, addr);*/
 
+       mono_tramp_info_register (mono_tramp_info_create (NULL, start, code - start, NULL, NULL));
+
        return start;
 }
 
index f0ca392d9c55c97355b605918d7d993562cdc802..5a3eeebeb0d38c877e32894796bd6c01f3ecdd6a 100644 (file)
@@ -67,6 +67,8 @@ mono_arch_get_unbox_trampoline (MonoMethod *m, gpointer addr)
        desc [0] = buf;
        desc [1] = func_gp;
 
+       mono_tramp_info_register (mono_tramp_info_create (NULL, buf, code.buf - buf, NULL, NULL));
+
        return desc;
 }
 
index baabbe85651f428a56a1373c19816e69e773f92b..55cc11870eb131c6514691d997d43aeea93e5125 100644 (file)
@@ -53,6 +53,8 @@ mono_arch_get_unbox_trampoline (MonoMethod *m, gpointer addr)
        /*g_print ("unbox trampoline at %d for %s:%s\n", this_pos, m->klass->name, m->name);
        g_print ("unbox code is at %p for method at %p\n", start, addr);*/
 
+       mono_tramp_info_register (mono_tramp_info_create (NULL, start, code - start, NULL, NULL));
+
        return start;
 }
 
index e13c4bf829f9448d1f418782c5ee704ab6b7ae69..2e94baff8845cfd8bb489615f3bbb503bcb47b5f 100644 (file)
@@ -104,6 +104,8 @@ mono_arch_get_unbox_trampoline (MonoMethod *m, gpointer addr)
        /*g_print ("unbox trampoline at %d for %s:%s\n", this_pos, m->klass->name, m->name);
        g_print ("unbox code is at %p for method at %p\n", start, addr);*/
 
+       mono_tramp_info_register (mono_tramp_info_create (NULL, start, code - start, NULL, NULL));
+
        return start;
 }
 
index 69994b7ab221746c447bc709734ceb6b44020405..111899812b2f69faa26d13327e0ae512f6dbba0f 100644 (file)
@@ -109,6 +109,8 @@ mono_arch_get_unbox_trampoline (MonoMethod *method, gpointer addr)
        mono_arch_flush_icache (start, code - start);
        mono_profiler_code_buffer_new (start, code - start, MONO_PROFILER_CODE_BUFFER_UNBOX_TRAMPOLINE, method);
 
+       mono_tramp_info_register (mono_tramp_info_create (NULL, start, code - start, NULL, NULL));
+
        return start;
 }
 
index d390ed4dcc6be5714d2e07d9d5d8db6b61b9c53e..5d1297000a815eaf112e3c4165ca69d623075615 100644 (file)
@@ -51,6 +51,8 @@ mono_arch_get_unbox_trampoline (MonoMethod *m, gpointer addr)
 
        mono_arch_flush_icache (start, code - start);
 
+       mono_tramp_info_register (mono_tramp_info_create (NULL, start, code - start, NULL, NULL));
+
        return start;
 }
 
index 64c4c5f91e1b2dbf030886ddd723db79d5bff255..abf8b0b509649a41e68f580f616b0e26b547081b 100644 (file)
@@ -54,6 +54,8 @@ mono_arch_get_unbox_trampoline (MonoMethod *m, gpointer addr)
        nacl_domain_code_validate (domain, &start, size, &code);
        mono_profiler_code_buffer_new (start, code - start, MONO_PROFILER_CODE_BUFFER_UNBOX_TRAMPOLINE, m);
 
+       mono_tramp_info_register (mono_tramp_info_create (NULL, start, code - start, NULL, NULL));
+
        return start;
 }