[interp] respect 64bit alignment on armv7
authorBernhard Urban <bernhard.urban@xamarin.com>
Wed, 17 May 2017 19:52:18 +0000 (21:52 +0200)
committerBernhard Urban <bernhard.urban@xamarin.com>
Thu, 18 May 2017 22:03:49 +0000 (00:03 +0200)
mono/mini/interp/interp.c
mono/mini/mini-arm.c
mono/mini/mini-arm.h

index 27b790a6a5016400cca788e7753eaf4b291852ef..68d3b3998a457502b485c9df372cd8aea54b47e9 100644 (file)
@@ -723,6 +723,7 @@ static InterpMethodArguments* build_args_from_sig (MonoMethodSignature *sig, Mon
 
 #ifdef TARGET_ARM
        g_assert (mono_arm_eabi_supported ());
+       int i8_align = mono_arm_i8_align ();
 #endif
 
        if (sig->hasthis)
@@ -757,7 +758,7 @@ static InterpMethodArguments* build_args_from_sig (MonoMethodSignature *sig, Mon
                case MONO_TYPE_I8:
 #ifdef TARGET_ARM
                        /* pairs begin at even registers */
-                       if (margs->ilen & 1)
+                       if (i8_align == 8 && margs->ilen & 1)
                                margs->ilen++;
 #endif
                        margs->ilen += 2;
@@ -834,7 +835,7 @@ static InterpMethodArguments* build_args_from_sig (MonoMethodSignature *sig, Mon
                        stackval *sarg = &frame->stack_args [i];
 #ifdef TARGET_ARM
                        /* pairs begin at even registers */
-                       if (int_i & 1)
+                       if (i8_align == 8 && int_i & 1)
                                int_i++;
 #endif
                        margs->iargs [int_i] = (gpointer) sarg->data.pair.lo;
index d88dc4f10cceca9aebb2a9d86ce38508f4eab103..96c7d3a6adf2743440a7ef17e0a3a48ccba1b0ef 100644 (file)
@@ -4039,6 +4039,12 @@ mono_arm_eabi_supported (void)
        return eabi_supported;
 }
 
+int
+mono_arm_i8_align (void)
+{
+       return i8_align;
+}
+
 #ifndef DISABLE_JIT
 
 static guint8*
index eec8a507f2815106fbfdccb18375cf6d79bc6382..671014199b8be525e33d87a860309975b9e4df74 100644 (file)
@@ -393,6 +393,9 @@ mono_arm_thumb_supported (void);
 gboolean
 mono_arm_eabi_supported (void);
 
+int
+mono_arm_i8_align (void);
+
 GSList*
 mono_arm_get_exception_trampolines (gboolean aot);