X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Ftramp-sparc.c;h=99143b723b30291f156655b305b3bc19b4135f81;hb=0db4b09607843d097a6f60f5c8101bb7ef8f3866;hp=b737df17c28e667b279c70e72187067df869fee6;hpb=89866fadb0772bc092d7c77a188053eae5b4be4a;p=mono.git diff --git a/mono/mini/tramp-sparc.c b/mono/mini/tramp-sparc.c index b737df17c28..99143b723b3 100644 --- a/mono/mini/tramp-sparc.c +++ b/mono/mini/tramp-sparc.c @@ -32,11 +32,8 @@ gpointer mono_arch_get_unbox_trampoline (MonoMethod *m, gpointer addr) { guint8 *code, *start; - int this_pos = 4, reg; + int reg; - if (!mono_method_signature (m)->ret->byref && MONO_TYPE_ISSTRUCT (mono_method_signature (m)->ret)) - this_pos = 8; - start = code = mono_global_codeman_reserve (36); /* This executes in the context of the caller, hence o0 */ @@ -54,11 +51,13 @@ 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), NULL); + return start; } void -mono_arch_patch_callsite (guint8 *code, guint8 *addr) +mono_arch_patch_callsite (guint8 *method_start, guint8 *code, guint8 *addr) { if (sparc_inst_op (*(guint32*)code) == 0x1) { sparc_call_simple (code, (guint8*)addr - (guint8*)code); @@ -66,20 +65,7 @@ mono_arch_patch_callsite (guint8 *code, guint8 *addr) } void -mono_arch_patch_plt_entry (guint8 *code, guint8 *addr) -{ - g_assert_not_reached (); -} - -void -mono_arch_nullify_class_init_trampoline (guint8 *code, gssize *regs) -{ - /* Patch calling code */ - sparc_nop (code); -} - -void -mono_arch_nullify_plt_entry (guint8 *code) +mono_arch_patch_plt_entry (guint8 *code, gpointer *got, mgreg_t *regs, guint8 *addr) { g_assert_not_reached (); } @@ -87,12 +73,15 @@ mono_arch_nullify_plt_entry (guint8 *code) #define ALIGN_TO(val,align) (((val) + ((align) - 1)) & ~((align) - 1)) guchar* -mono_arch_create_trampoline_code (MonoTrampolineType tramp_type) +mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInfo **info, gboolean aot) { guint8 *buf, *code, *tramp_addr; guint32 lmf_offset, regs_offset, method_reg, i; gboolean has_caller; + g_assert (!aot); + *info = NULL; + if (tramp_type == MONO_TRAMPOLINE_JUMP) has_caller = FALSE; else @@ -181,7 +170,7 @@ mono_arch_create_trampoline_code (MonoTrampolineType tramp_type) sparc_sti_imm (code, sparc_o0, sparc_sp, MONO_SPARC_STACK_BIAS + 304); /* Check for thread interruption */ - sparc_set (code, (guint8*)mono_thread_interruption_checkpoint, sparc_o7); + sparc_set (code, (guint8*)mono_thread_force_interruption_checkpoint, sparc_o7); sparc_jmpl (code, sparc_o7, sparc_g0, sparc_o7); sparc_nop (code); @@ -197,10 +186,7 @@ mono_arch_create_trampoline_code (MonoTrampolineType tramp_type) sparc_lddf_imm (code, sparc_sp, MONO_SPARC_STACK_BIAS + 320 + (i * 8), sparc_f0 + (i * 2)); #endif - if (tramp_type == MONO_TRAMPOLINE_CLASS_INIT) - sparc_ret (code); - else - sparc_jmpl (code, sparc_o0, sparc_g0, sparc_g0); + sparc_jmpl (code, sparc_o0, sparc_g0, sparc_g0); /* restore previous frame in delay slot */ sparc_restore_simple (code); @@ -242,9 +228,7 @@ mono_arch_create_specific_trampoline (gpointer arg1, MonoTrampolineType tramp_ty tramp = mono_get_trampoline_code (tramp_type); - mono_domain_lock (domain); - code = buf = mono_code_manager_reserve (domain->code_mp, TRAMPOLINE_SIZE * 4); - mono_domain_unlock (domain); + code = buf = mono_domain_code_reserve (domain, TRAMPOLINE_SIZE * 4); /* We have to use g5 here because there is no other free register */ sparc_set (code, tramp, sparc_g5); @@ -262,40 +246,15 @@ mono_arch_create_specific_trampoline (gpointer arg1, MonoTrampolineType tramp_ty if (code_len) *code_len = (code - buf) * 4; - mono_jit_stats.method_trampolines++; - mono_arch_flush_icache ((guint8*)buf, (code - buf) * 4); return buf; } -/* - * This method is only called when running in the Mono Debugger. - */ -gpointer -mono_debugger_create_notification_function (void) -{ - guint8 *ptr, *buf; - - ptr = buf = mono_global_codeman_reserve (16); - - g_assert_not_reached (); - - return ptr; -} - gpointer -mono_arch_create_rgctx_lazy_fetch_trampoline (guint32 encoded_offset) +mono_arch_create_rgctx_lazy_fetch_trampoline (guint32 slot, MonoTrampInfo **info, gboolean aot) { /* FIXME: implement! */ g_assert_not_reached (); return NULL; } - -guint32 -mono_arch_get_rgctx_lazy_fetch_offset (gpointer *regs) -{ - /* FIXME: implement! */ - g_assert_not_reached (); - return 0; -}