2009-08-25 Zoltan Varga <vargaz@gmail.com>
authorZoltan Varga <vargaz@gmail.com>
Mon, 24 Aug 2009 22:25:36 +0000 (22:25 -0000)
committerZoltan Varga <vargaz@gmail.com>
Mon, 24 Aug 2009 22:25:36 +0000 (22:25 -0000)
* mini-arm.c (add_general): Fix the passing of 64 bit values on darwin, where
they are only 4 byte aligned.

svn path=/trunk/mono/; revision=140557

mono/mini/ChangeLog
mono/mini/mini-arm.c

index 9f0b5b0e29581a9a23e40f3349664349fbf290d6..9b428697f3e415ce4ae66fcf723dcb185df7e099 100644 (file)
@@ -1,3 +1,8 @@
+2009-08-25  Zoltan Varga  <vargaz@gmail.com>
+
+       * mini-arm.c (add_general): Fix the passing of 64 bit values on darwin, where
+       they are only 4 byte aligned.
+
 2009-08-21  Zoltan Varga  <vargaz@gmail.com>
 
        * mini-arm.c (mono_arch_allocate_vars): Use FP as the frame pointer as
index 47e0a1cf9a08f17fe9dd4e71a1c76afbe85da340..1595fc504545c65a40d6f214776b3cd14ad89cfa 100644 (file)
@@ -705,6 +705,11 @@ typedef struct {
 
 #define DEBUG(a)
 
+#ifndef __GNUC__
+/*#define __alignof__(a) sizeof(a)*/
+#define __alignof__(type) G_STRUCT_OFFSET(struct { char c; type x; }, x)
+#endif
+
 static void inline
 add_general (guint *gr, guint *stack_size, ArgInfo *ainfo, gboolean simple)
 {
@@ -718,11 +723,19 @@ add_general (guint *gr, guint *stack_size, ArgInfo *ainfo, gboolean simple)
                        ainfo->reg = *gr;
                }
        } else {
-               if (*gr == ARMREG_R3
-#ifdef __ARM_EABI__
-                               && 0
+#if defined(__APPLE__) && defined(MONO_CROSS_COMPILE)
+               int i8_align = 4;
+#else
+               int i8_align = __alignof__ (gint64);
 #endif
-                                       ) {
+
+#if __ARM_EABI__
+               gboolean split = i8_align == 4;
+#else
+               gboolean split = TRUE;
+#endif
+               
+               if (*gr == ARMREG_R3 && split) {
                        /* first word in r3 and the second on the stack */
                        ainfo->offset = *stack_size;
                        ainfo->reg = ARMREG_SP; /* in the caller */
@@ -730,8 +743,11 @@ add_general (guint *gr, guint *stack_size, ArgInfo *ainfo, gboolean simple)
                        *stack_size += 4;
                } else if (*gr >= ARMREG_R3) {
 #ifdef __ARM_EABI__
-                       *stack_size += 7;
-                       *stack_size &= ~7;
+                       /* darwin aligns longs to 4 byte only */
+                       if (i8_align == 8) {
+                               *stack_size += 7;
+                               *stack_size &= ~7;
+                       }
 #endif
                        ainfo->offset = *stack_size;
                        ainfo->reg = ARMREG_SP; /* in the caller */
@@ -739,7 +755,7 @@ add_general (guint *gr, guint *stack_size, ArgInfo *ainfo, gboolean simple)
                        *stack_size += 8;
                } else {
 #ifdef __ARM_EABI__
-                       if ((*gr) & 1)
+                       if (i8_align == 8 && ((*gr) & 1))
                                (*gr) ++;
 #endif
                        ainfo->reg = *gr;