Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZoltan Varga <vargaz@gmail.com>2017-04-11 18:51:45 +0300
committerZoltan Varga <vargaz@gmail.com>2017-04-17 21:49:29 +0300
commit4242008df510b40371da9b7ded9b4e3dd8c723ad (patch)
tree3a74a29e43a11b88fe0117baa7b4059c02beec30
parent12f8ebafed161097a9828796c87d76594ee74011 (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.c6
-rw-r--r--mono/mini/tramp-arm-gsharedvt.c14
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);