Merge pull request #4444 from lateralusX/jlorenss/windows-unwind-info
authorJohan Lorensson <lateralusx.github@gmail.com>
Fri, 10 Mar 2017 10:16:23 +0000 (11:16 +0100)
committerGitHub <noreply@github.com>
Fri, 10 Mar 2017 10:16:23 +0000 (11:16 +0100)
Improve unwind support on Windows x64.

1  2 
mono/mini/Makefile.am.in
mono/mini/aot-compiler.c
mono/mini/mini-runtime.c
mono/mini/tramp-amd64-gsharedvt.c
mono/mini/tramp-amd64.c
mono/mini/unwind.c

Simple merge
Simple merge
Simple merge
Simple merge
index f0b3e9cbbedbae81c53f20dad9c5c1ccc626d69d,0a93c0e69e69b6300abab3ab163abbc8cb3c5e02..7ec7437eb30de65ba5895512bfc4619f583718d2
@@@ -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);
Simple merge