diff options
author | Zoltan Varga <vargaz@gmail.com> | 2017-04-11 18:51:45 +0300 |
---|---|---|
committer | Zoltan Varga <vargaz@gmail.com> | 2017-04-17 21:49:29 +0300 |
commit | 4242008df510b40371da9b7ded9b4e3dd8c723ad (patch) | |
tree | 3a74a29e43a11b88fe0117baa7b4059c02beec30 | |
parent | 12f8ebafed161097a9828796c87d76594ee74011 (diff) |
[arm] Fix a gsharedvt assertion which happens with gsharedvt methods with a lot of arguments. Fixes #54976.mono-5.0.0.61
-rw-r--r-- | mono/mini/mini-arm-gsharedvt.c | 6 | ||||
-rw-r--r-- | mono/mini/tramp-arm-gsharedvt.c | 14 |
2 files changed, 10 insertions, 10 deletions
diff --git a/mono/mini/mini-arm-gsharedvt.c b/mono/mini/mini-arm-gsharedvt.c index 2c7f8812a69..43172ed82ad 100644 --- a/mono/mini/mini-arm-gsharedvt.c +++ b/mono/mini/mini-arm-gsharedvt.c @@ -217,8 +217,8 @@ mono_arch_get_gsharedvt_call_info (gpointer addr, MonoMethodSignature *normal_si else src_slot = map_stack_slot (ainfo->offset / 4); g_assert (ndst < 256); - g_assert (src_slot < 16); - src [0] = (ndst << 4) | src_slot; + g_assert (src_slot < 256); + src [0] = (ndst << 8) | src_slot; if (ainfo2->storage == RegTypeGeneral && ainfo2->size != 0 && ainfo2->size != 4) { /* Have to load less than 4 bytes */ @@ -256,7 +256,7 @@ mono_arch_get_gsharedvt_call_info (gpointer addr, MonoMethodSignature *normal_si ndst = get_arg_slots (ainfo2, &dst); } if (nsrc) - src [0] |= (arg_marshal << 16); + src [0] |= (arg_marshal << 24); nslots = MIN (nsrc, ndst); for (i = 0; i < nslots; ++i) diff --git a/mono/mini/tramp-arm-gsharedvt.c b/mono/mini/tramp-arm-gsharedvt.c index acc1dd839ff..5525bed4f5b 100644 --- a/mono/mini/tramp-arm-gsharedvt.c +++ b/mono/mini/tramp-arm-gsharedvt.c @@ -53,7 +53,7 @@ mono_arm_start_gsharedvt_call (GSharedVtCallInfo *info, gpointer *caller, gpoint for (i = 0; i < info->map_count; ++i) { int src = info->map [i * 2]; int dst = info->map [(i * 2) + 1]; - int arg_marshal = (src >> 16) & 0xff; + int arg_marshal = (src >> 24) & 0xff; switch (arg_marshal) { case GSHAREDVT_ARG_NONE: @@ -66,8 +66,8 @@ mono_arm_start_gsharedvt_call (GSharedVtCallInfo *info, gpointer *caller, gpoint break; case GSHAREDVT_ARG_BYREF_TO_BYVAL: { /* gsharedvt argument passed by value */ - int nslots = (src >> 4) & 0xff; - int src_slot = src & 0xf; + int nslots = (src >> 8) & 0xff; + int src_slot = src & 0xff; int j; gpointer *addr = caller [src_slot]; @@ -76,28 +76,28 @@ mono_arm_start_gsharedvt_call (GSharedVtCallInfo *info, gpointer *caller, gpoint break; } case GSHAREDVT_ARG_BYREF_TO_BYVAL_I1: { - int src_slot = src & 0xf; + int src_slot = src & 0xff; gpointer *addr = caller [src_slot]; callee [dst] = GINT_TO_POINTER ((int)*(gint8*)addr); break; } case GSHAREDVT_ARG_BYREF_TO_BYVAL_I2: { - int src_slot = src & 0xf; + int src_slot = src & 0xff; gpointer *addr = caller [src_slot]; callee [dst] = GINT_TO_POINTER ((int)*(gint16*)addr); break; } case GSHAREDVT_ARG_BYREF_TO_BYVAL_U1: { - int src_slot = src & 0xf; + int src_slot = src & 0xff; gpointer *addr = caller [src_slot]; callee [dst] = GUINT_TO_POINTER ((guint)*(guint8*)addr); break; } case GSHAREDVT_ARG_BYREF_TO_BYVAL_U2: { - int src_slot = src & 0xf; + int src_slot = src & 0xff; gpointer *addr = caller [src_slot]; callee [dst] = GUINT_TO_POINTER ((guint)*(guint16*)addr); |