X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Ftramp-amd64-gsharedvt.c;h=17a6849ed2564315e2f81d0b93601fcac42e779f;hb=6e2db26f5ed7b992de75d07522bb215a43af124a;hp=f5600adbde78198f5a9935ef9971316cc1abfb8c;hpb=fee5ece80556eb45d16da5f6c0fde991e5af1d40;p=mono.git diff --git a/mono/mini/tramp-amd64-gsharedvt.c b/mono/mini/tramp-amd64-gsharedvt.c index f5600adbde7..17a6849ed25 100644 --- a/mono/mini/tramp-amd64-gsharedvt.c +++ b/mono/mini/tramp-amd64-gsharedvt.c @@ -1,5 +1,6 @@ -/* - * tramp-amd64-gsharedvt.c: libcorkscrew-based native unwinder +/** + * \file + * libcorkscrew-based native unwinder * * Authors: * Zoltan Varga @@ -17,7 +18,6 @@ #include #include #include -#include #include #include #include @@ -90,6 +90,28 @@ mono_amd64_start_gsharedvt_call (GSharedVtCallInfo *info, gpointer *caller, gpoi DEBUG_AMD64_GSHAREDVT_PRINT ("[%d] <- [%d] (%d words) (%p) <- (%p)\n", dest_reg, source_reg, slot_count, &callee [dest_reg], &caller [source_reg]); break; } + case GSHAREDVT_ARG_BYREF_TO_BYVAL_U1: { + guint8 *addr = caller [source_reg]; + + callee [dest_reg] = (gpointer)(mgreg_t)*addr; + DEBUG_AMD64_GSHAREDVT_PRINT ("[%d] <- (u1) [%d] (%p) <- (%p)\n", dest_reg, source_reg, &callee [dest_reg], &caller [source_reg]); + break; + } + case GSHAREDVT_ARG_BYREF_TO_BYVAL_U2: { + guint16 *addr = caller [source_reg]; + + callee [dest_reg] = (gpointer)(mgreg_t)*addr; + DEBUG_AMD64_GSHAREDVT_PRINT ("[%d] <- (u2) [%d] (%p) <- (%p)\n", dest_reg, source_reg, &callee [dest_reg], &caller [source_reg]); + break; + } + case GSHAREDVT_ARG_BYREF_TO_BYVAL_U4: { + guint32 *addr = caller [source_reg]; + + callee [dest_reg] = (gpointer)(mgreg_t)*addr; + DEBUG_AMD64_GSHAREDVT_PRINT ("[%d] <- (u4) [%d] (%p) <- (%p)\n", dest_reg, source_reg, &callee [dest_reg], &caller [source_reg]); + break; + } + default: g_error ("cant handle arg marshal %d\n", arg_marshal); } @@ -140,9 +162,10 @@ mono_arch_get_gsharedvt_arg_trampoline (MonoDomain *domain, gpointer arg, gpoint g_assert ((code - start) < buf_len); mono_arch_flush_icache (start, code - start); - mono_profiler_code_buffer_new (start, code - start, MONO_PROFILER_CODE_BUFFER_GENERICS_TRAMPOLINE, NULL); + MONO_PROFILER_RAISE (jit_code_buffer, (start, code - start, MONO_PROFILER_CODE_BUFFER_GENERICS_TRAMPOLINE, NULL)); + + mono_tramp_info_register (mono_tramp_info_create (NULL, start, code - start, NULL, NULL), domain); - g_assert (0); return start; } @@ -161,7 +184,7 @@ mono_arch_get_gsharedvt_trampoline (MonoTrampInfo **info, gboolean aot) int reg_area_size; buf_len = 2048; - buf = code = mono_global_codeman_reserve (buf_len); + buf = code = mono_global_codeman_reserve (buf_len + MONO_MAX_TRAMPOLINE_UNWINDINFO_SIZE); /* * We are being called by an gsharedvt arg trampoline, the info argument is in AMD64_RAX. @@ -207,6 +230,7 @@ mono_arch_get_gsharedvt_trampoline (MonoTrampInfo **info, gboolean aot) /* unwind markers 3/3 */ mono_add_unwind_op_def_cfa_reg (unwind_ops, code, buf, AMD64_RBP); + mono_add_unwind_op_fp_alloc (unwind_ops, code, buf, AMD64_RBP, 0); /* setup the frame */ amd64_alu_reg_imm (code, X86_SUB, AMD64_RSP, framesize); @@ -281,7 +305,7 @@ mono_arch_get_gsharedvt_trampoline (MonoTrampInfo **info, gboolean aot) amd64_call_reg (code, AMD64_R11); #endif } else { - g_error ("no aot"); + amd64_call_code (code, mono_amd64_start_gsharedvt_call); } /* Method to call is now on RAX. Restore regs and jump */ @@ -443,10 +467,17 @@ mono_arch_get_gsharedvt_trampoline (MonoTrampInfo **info, gboolean aot) mono_amd64_patch (br_ret [i], code); /* Exit code path */ +#if TARGET_WIN32 + amd64_lea_membase (code, AMD64_RSP, AMD64_RBP, 0); + amd64_pop_reg (code, AMD64_RBP); + mono_add_unwind_op_same_value (unwind_ops, code, buf, AMD64_RBP); +#else amd64_leave (code); +#endif amd64_ret (code); g_assert ((code - buf) < buf_len); + g_assert_checked (mono_arch_unwindinfo_validate_size (unwind_ops, MONO_MAX_TRAMPOLINE_UNWINDINFO_SIZE)); if (info) *info = mono_tramp_info_create ("gsharedvt_trampoline", buf, code - buf, ji, unwind_ops); @@ -482,4 +513,4 @@ mono_amd64_start_gsharedvt_call (GSharedVtCallInfo *info, gpointer *caller, gpoi return NULL; } -#endif \ No newline at end of file +#endif