X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Ftramp-ia64.c;h=d21ab21e17188c5cbb20c1ef74544bbb1cf80117;hb=38983b6b1bfddaad132f9defea168e810f537e98;hp=8024cc0ca085cc8f31167ce48a92f9d5b189a6e3;hpb=96edd46e16619fe64e26ea017330c22bf893f0dd;p=mono.git diff --git a/mono/mini/tramp-ia64.c b/mono/mini/tramp-ia64.c index 8024cc0ca08..d21ab21e171 100644 --- a/mono/mini/tramp-ia64.c +++ b/mono/mini/tramp-ia64.c @@ -18,6 +18,7 @@ #include "mini.h" #include "mini-ia64.h" +#include "jit-icalls.h" #define GP_SCRATCH_REG 31 #define GP_SCRATCH_REG2 30 @@ -67,6 +68,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), domain); + return desc; } @@ -123,52 +126,6 @@ mono_arch_patch_plt_entry (guint8 *code, gpointer *got, mgreg_t *regs, guint8 *a g_assert_not_reached (); } -void -mono_arch_nullify_class_init_trampoline (guint8 *code, mgreg_t *regs) -{ - guint8 *callsite_begin; - guint64 *callsite = (guint64*)(gpointer)(code - 16); - guint64 instructions [3]; - guint64 buf [16]; - Ia64CodegenState gen; - - while ((ia64_bundle_template (callsite) != IA64_TEMPLATE_MLX) && - (ia64_bundle_template (callsite) != IA64_TEMPLATE_MLXS)) - callsite -= 2; - callsite_begin = (guint8*)callsite; - - /* Replace the code generated by emit_call with a sets of nops */ - - /* The first bundle might have other instructions in it */ - instructions [0] = ia64_bundle_ins1 (callsite); - instructions [1] = IA64_NOP_X; - instructions [2] = IA64_NOP_X; - - ia64_codegen_init (gen, (guint8*)buf); - ia64_emit_bundle_template (&gen, ia64_bundle_template (callsite), instructions [0], instructions [1], instructions [2]); - ia64_codegen_close (gen); - - /* This might not be safe, but not all itanium processors support st16 */ - callsite [0] = buf [0]; - callsite [1] = buf [1]; - - callsite += 2; - - /* The other bundles can be full replaced with nops */ - - ia64_codegen_init (gen, (guint8*)buf); - ia64_emit_bundle_template (&gen, IA64_TEMPLATE_MII, IA64_NOP_M, IA64_NOP_I, IA64_NOP_I); - ia64_codegen_close (gen); - - while ((guint8*)callsite < code) { - callsite [0] = buf [0]; - callsite [1] = buf [1]; - callsite += 2; - } - - mono_arch_flush_icache (callsite_begin, code - callsite_begin); -} - guchar* mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInfo **info, gboolean aot) { @@ -181,8 +138,7 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf unw_dyn_region_info_t *r_pro; g_assert (!aot); - if (info) - *info = NULL; + *info = NULL; /* * Since jump trampolines are not patched, this trampoline is executed every @@ -301,7 +257,7 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf /* This is not perf critical code so no need to check the interrupt flag */ ia64_mov (code, l2, IA64_R8); - tramp = (guint8*)mono_thread_force_interruption_checkpoint; + tramp = (guint8*)mono_interruption_checkpoint_from_trampoline; ia64_movl (code, l0, tramp); ia64_ld8_inc_imm (code, l1, l0, 8); ia64_mov_to_br (code, IA64_B6, l1); @@ -317,25 +273,17 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf /* FIXME: Handle NATs in fp regs / scratch regs */ - if (tramp_type != MONO_TRAMPOLINE_CLASS_INIT) { - /* Load method address from function descriptor */ - ia64_ld8 (code, l0, IA64_R8); - ia64_mov_to_br (code, IA64_B6, l0); - } + /* Load method address from function descriptor */ + ia64_ld8 (code, l0, IA64_R8); + ia64_mov_to_br (code, IA64_B6, l0); /* Clean up register/memory stack frame */ ia64_adds_imm (code, IA64_SP, framesize, IA64_SP); ia64_mov_to_ar_i (code, IA64_PFS, l5); - if (tramp_type == MONO_TRAMPOLINE_CLASS_INIT) { - ia64_mov_ret_to_br (code, IA64_B0, l7); - ia64_br_ret_reg (code, IA64_B0); - } - else { - /* Call the compiled method */ - ia64_mov_to_br (code, IA64_B0, l7); - ia64_br_cond_reg (code, IA64_B6); - } + /* Call the compiled method */ + ia64_mov_to_br (code, IA64_B0, l7); + ia64_br_cond_reg (code, IA64_B6); ia64_codegen_close (code);