Fix microblaze big-endian struct issue
authorAnthony Green <green@moxielogic.com>
Fri, 8 Feb 2013 12:12:41 +0000 (07:12 -0500)
committerAnthony Green <green@moxielogic.com>
Fri, 8 Feb 2013 12:12:41 +0000 (07:12 -0500)
ChangeLog
src/microblaze/ffi.c

index 1b09d91..824d30a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2013-02-08  Nathan Rossi <nathan.rossi@xilinx.com>
+
+       * src/microblaze/ffi.c (ffi_closure_call_SYSV): Fix handling of
+       small big-endian structures.
+       (ffi_prep_args): Ditto.
+
 2013-02-07  Anthony Green <green@moxielogic.com>
 
        * src/sparc/v8.S (ffi_call_v8): Fix typo from last patch
index 86ea37d..5c155c5 100644 (file)
@@ -119,17 +119,8 @@ void ffi_prep_args(void* stack, extended_cif* ecif)
                                 */
                                if (size < WORD_SIZE)
                                {
-                                       if (size == 1) {
-                                               *(unsigned int *)addr =
-                                                               (unsigned int)*(UINT8*)(value);
-                                       } else if (size == 2) {
-                                               *(unsigned int *)addr =
-                                                               (unsigned int)*(UINT16*)(value);
-                                       } else {
-                                               *(unsigned int *)addr =
-                                                               ((unsigned int)*(UINT32*)(value)) >> 8;
-                                       }
-                                       break;
+                                 memcpy (addr + (WORD_SIZE - size), value, size);
+                                 break;
                                }
 #endif
                        case FFI_TYPE_SINT32:
@@ -250,16 +241,7 @@ void ffi_closure_call_SYSV(void* register_args, void* stack_args,
                                 */
                                if (arg_types[i]->size < WORD_SIZE)
                                {
-                                       if (arg_types[i]->size == 1) {
-                                               *(unsigned int *)ptr =
-                                                               ((unsigned int)*(UINT32*)(ptr)) << 24;
-                                       } else if (arg_types[i]->size == 2) {
-                                               *(unsigned int *)ptr =
-                                                               ((unsigned int)*(UINT32*)(ptr)) << 16;
-                                       } else {
-                                               *(unsigned int *)ptr =
-                                                               ((unsigned int)*(UINT32*)(ptr)) << 8;
-                                       }
+                                 memcpy (ptr, ptr + (WORD_SIZE - arg_types[i]->size), arg_types[i]->size);
                                }
 #endif
                                avalue[i] = (void*)ptr;