From: lateralusX Date: Thu, 14 Jul 2016 11:39:57 +0000 (+0200) Subject: Add gsharedvt support for changed Windows x64 value type ABI. X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=commitdiff_plain;h=bd83be49c31f3523033959a651313be850bce841;p=mono.git Add gsharedvt support for changed Windows x64 value type ABI. --- diff --git a/mono/mini/mini-amd64-gsharedvt.c b/mono/mini/mini-amd64-gsharedvt.c index ddf699c58ca..aec01c44b08 100644 --- a/mono/mini/mini-amd64-gsharedvt.c +++ b/mono/mini/mini-amd64-gsharedvt.c @@ -49,6 +49,7 @@ storage_name (ArgStorage st) case ArgOnStack: return "ArgOnStack"; case ArgValuetypeInReg: return "ArgValuetypeInReg"; case ArgValuetypeAddrInIReg: return "ArgValuetypeAddrInIReg"; + case ArgValuetypeAddrOnStack: return "ArgValuetypeAddrOnStack"; case ArgGSharedVtInReg: return "ArgGSharedVtInReg"; case ArgGSharedVtOnStack: return "ArgGSharedVtOnStack"; case ArgNone: return "ArgNone"; @@ -148,11 +149,13 @@ get_arg_slots (ArgInfo *ainfo, int **out_slots, gboolean is_source_argument) src [0] = map_reg (sreg); break; case ArgValuetypeInReg: + case ArgValuetypeAddrInIReg: nsrc = ainfo->nregs; src = g_malloc (nsrc * sizeof (int)); for (i = 0; i < ainfo->nregs; ++i) src [i] = map_reg (ainfo->pair_regs [i]); break; + case ArgValuetypeAddrOnStack: case ArgOnStack: nsrc = ainfo->arg_size / SLOT_BYTE_SIZE; src = g_malloc (nsrc * sizeof (int)); @@ -196,6 +199,11 @@ handle_marshal_when_src_gsharedvt (ArgInfo *dst_info, int *arg_marshal, int *arg *arg_marshal = GSHAREDVT_ARG_BYREF_TO_BYVAL; *arg_slots = dst_info->nregs; break; + case ArgValuetypeAddrInIReg: + case ArgValuetypeAddrOnStack: + *arg_marshal = GSHAREDVT_ARG_NONE; + *arg_slots = dst_info->nregs; + break; default: NOT_IMPLEMENTED; // Inappropriate value: if dst and src are gsharedvt at once, we shouldn't be here break; @@ -214,6 +222,10 @@ handle_marshal_when_dst_gsharedvt (ArgInfo *src_info, int *arg_marshal) case ArgOnStack: *arg_marshal = GSHAREDVT_ARG_BYVAL_TO_BYREF; break; + case ArgValuetypeAddrInIReg: + case ArgValuetypeAddrOnStack: + *arg_marshal = GSHAREDVT_ARG_NONE; + break; default: NOT_IMPLEMENTED; // See above break; @@ -325,6 +337,10 @@ mono_arch_get_gsharedvt_call_info (gpointer addr, MonoMethodSignature *normal_si handle_marshal_when_src_gsharedvt (dst_info, &arg_marshal, &arg_slots); handle_map_when_gsharedvt_on_stack (src_info, &nsrc, &src, TRUE); break; + case ArgValuetypeAddrInIReg: + case ArgValuetypeAddrOnStack: + nsrc = get_arg_slots (src_info, &src, TRUE); + break; default: g_error ("Gsharedvt can't handle source arg type %d", (int)src_info->storage); // Inappropriate value: ArgValuetypeAddrInIReg is for returns only } @@ -345,6 +361,10 @@ mono_arch_get_gsharedvt_call_info (gpointer addr, MonoMethodSignature *normal_si handle_marshal_when_dst_gsharedvt (src_info, &arg_marshal); handle_map_when_gsharedvt_on_stack (dst_info, &ndst, &dst, FALSE); break; + case ArgValuetypeAddrInIReg: + case ArgValuetypeAddrOnStack: + ndst = get_arg_slots (dst_info, &dst, FALSE); + break; default: g_error ("Gsharedvt can't handle dest arg type %d", (int)dst_info->storage); // See above }