Fix microblaze big-endian struct issue
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
diff --git a/ChangeLog b/ChangeLog
index 1b09d91..824d30a 100644
--- 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
diff --git a/src/microblaze/ffi.c b/src/microblaze/ffi.c
index 86ea37d..5c155c5 100644
--- a/src/microblaze/ffi.c
+++ b/src/microblaze/ffi.c
@@ -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;