From: Johan Lorensson Date: Fri, 10 Mar 2017 10:16:23 +0000 (+0100) Subject: Merge pull request #4444 from lateralusX/jlorenss/windows-unwind-info X-Git-Url: http://wien.tomnetworks.com/gitweb/?p=mono.git;a=commitdiff_plain;h=c63aa7cd12a077ef1b2b90b119bfef7687c800d0 Merge pull request #4444 from lateralusX/jlorenss/windows-unwind-info Improve unwind support on Windows x64. --- c63aa7cd12a077ef1b2b90b119bfef7687c800d0 diff --cc mono/mini/tramp-amd64.c index f0b3e9cbbed,0a93c0e69e6..7ec7437eb30 --- a/mono/mini/tramp-amd64.c +++ b/mono/mini/tramp-amd64.c @@@ -980,35 -1010,21 +1008,35 @@@ gpointe mono_arch_get_enter_icall_trampoline (MonoTrampInfo **info) { #ifdef ENABLE_INTERPRETER - const int gregs_num = 6; - guint8 *start = NULL, *code, *exits [gregs_num], *leave_tramp; + const int gregs_num = 8; + const int fregs_num = 3; + guint8 *start = NULL, *code, *label_gexits [gregs_num], *label_fexits [fregs_num], *label_leave_tramp [3], *label_is_float_ret; MonoJumpInfo *ji = NULL; GSList *unwind_ops = NULL; - static int arg_regs[] = {AMD64_ARG_REG1, AMD64_ARG_REG2, AMD64_ARG_REG3, AMD64_ARG_REG4, AMD64_R8, AMD64_R9}; - int i, offset = 0; + static int farg_regs[] = {AMD64_XMM0, AMD64_XMM1, AMD64_XMM2}; + int i, framesize = 0, off_rbp, off_methodargs, off_targetaddr; - start = code = (guint8 *) mono_global_codeman_reserve (256); + start = code = (guint8 *) mono_global_codeman_reserve (256 + MONO_TRAMPOLINE_UNWINDINFO_SIZE(0)); + off_rbp = -framesize; + + framesize += sizeof (mgreg_t); + off_methodargs = -framesize; + + framesize += sizeof (mgreg_t); + off_targetaddr = -framesize; + + framesize += (gregs_num - PARAM_REGS) * sizeof (mgreg_t); + + amd64_push_reg (code, AMD64_RBP); + amd64_mov_reg_reg (code, AMD64_RBP, AMD64_RSP, sizeof (mgreg_t)); + amd64_alu_reg_imm (code, X86_SUB, AMD64_RSP, ALIGN_TO (framesize, MONO_ARCH_FRAME_ALIGNMENT)); + /* save MethodArguments* onto stack */ - amd64_push_reg (code, AMD64_ARG_REG2); + amd64_mov_membase_reg (code, AMD64_RBP, off_methodargs, AMD64_ARG_REG2, sizeof (mgreg_t)); /* save target address on stack */ - amd64_push_reg (code, AMD64_ARG_REG1); - amd64_push_reg (code, AMD64_RAX); + amd64_mov_membase_reg (code, AMD64_RBP, off_targetaddr, AMD64_ARG_REG1, sizeof (mgreg_t)); /* load pointer to MethodArguments* into R11 */ amd64_mov_reg_reg (code, AMD64_R11, AMD64_ARG_REG2, 8);