| Index: libffi/ChangeLog |
| =================================================================== |
| --- libffi.orig/ChangeLog |
| +++ libffi/ChangeLog |
| @@ -1,3 +1,13 @@ |
| +2012-03-19 Alan Hourihane <alanh@fairlite.co.uk> |
| + |
| + * src/m68k/ffi.c: Add MINT support. |
| + * src/m68k/sysv.S: Ditto. |
| + |
| +2012-03-19 chennam <csit@axway.com> |
| + |
| + * src/powerpc/ffi_darwin.c (ffi_prep_closure_loc): Fix AIX closure |
| + support. |
| + |
| 2012-04-02 Peter Bergner <bergner@vnet.ibm.com> |
| |
| * src/powerpc/ffi.c (ffi_prep_args_SYSV): Declare double_tmp. |
| @@ -6,11 +16,6 @@ |
| (ffi_call): Silence possibly undefined warning. |
| (ffi_closure_helper_SYSV): Declare variable type. |
| |
| -2012-03-19 chennam <csit@axway.com> |
| - |
| - * src/powerpc/ffi_darwin.c (ffi_prep_closure_loc): Fix AIX closure |
| - support. |
| - |
| 2012-03-13 Kaz Kojima <kkojima@gcc.gnu.org> |
| |
| * src/sh/ffi.c (ffi_prep_closure_loc): Don't ASSERT ABI test, |
| Index: libffi/src/m68k/ffi.c |
| =================================================================== |
| --- libffi.orig/src/m68k/ffi.c |
| +++ libffi/src/m68k/ffi.c |
| @@ -1,7 +1,7 @@ |
| /* ----------------------------------------------------------------------- |
| ffi.c |
| - |
| - m68k Foreign Function Interface |
| + |
| + m68k Foreign Function Interface |
| ----------------------------------------------------------------------- */ |
| |
| #include <ffi.h> |
| @@ -13,8 +13,13 @@ |
| void rtems_cache_flush_multiple_data_lines( const void *, size_t ); |
| #else |
| #include <sys/syscall.h> |
| +#ifdef __MINT__ |
| +#include <mint/mintbind.h> |
| +#include <mint/ssystem.h> |
| +#else |
| #include <asm/cachectl.h> |
| #endif |
| +#endif |
| |
| void ffi_call_SYSV (extended_cif *, |
| unsigned, unsigned, |
| @@ -39,8 +44,12 @@ ffi_prep_args (void *stack, extended_cif |
| |
| argp = stack; |
| |
| - if (ecif->cif->rtype->type == FFI_TYPE_STRUCT |
| - && !ecif->cif->flags) |
| + if ( |
| +#ifdef __MINT__ |
| + (ecif->cif->rtype->type == FFI_TYPE_LONGDOUBLE) || |
| +#endif |
| + (((ecif->cif->rtype->type == FFI_TYPE_STRUCT) |
| + && !ecif->cif->flags))) |
| struct_value_ptr = ecif->rvalue; |
| else |
| struct_value_ptr = NULL; |
| @@ -51,12 +60,12 @@ ffi_prep_args (void *stack, extended_cif |
| i != 0; |
| i--, p_arg++) |
| { |
| - size_t z; |
| + size_t z = (*p_arg)->size; |
| + int type = (*p_arg)->type; |
| |
| - z = (*p_arg)->size; |
| if (z < sizeof (int)) |
| { |
| - switch ((*p_arg)->type) |
| + switch (type) |
| { |
| case FFI_TYPE_SINT8: |
| *(signed int *) argp = (signed int) *(SINT8 *) *p_argv; |
| @@ -75,7 +84,14 @@ ffi_prep_args (void *stack, extended_cif |
| break; |
| |
| case FFI_TYPE_STRUCT: |
| +#ifdef __MINT__ |
| + if (z == 1 || z == 2) |
| + memcpy (argp + 2, *p_argv, z); |
| + else |
| + memcpy (argp, *p_argv, z); |
| +#else |
| memcpy (argp + sizeof (int) - z, *p_argv, z); |
| +#endif |
| break; |
| |
| default: |
| @@ -120,17 +136,34 @@ ffi_prep_cif_machdep (ffi_cif *cif) |
| break; |
| |
| case FFI_TYPE_STRUCT: |
| + if (cif->rtype->elements[0]->type == FFI_TYPE_STRUCT && |
| + cif->rtype->elements[1]) |
| + { |
| + cif->flags = 0; |
| + break; |
| + } |
| + |
| switch (cif->rtype->size) |
| { |
| case 1: |
| +#ifdef __MINT__ |
| + cif->flags = CIF_FLAGS_STRUCT2; |
| +#else |
| cif->flags = CIF_FLAGS_STRUCT1; |
| +#endif |
| break; |
| case 2: |
| cif->flags = CIF_FLAGS_STRUCT2; |
| break; |
| +#ifdef __MINT__ |
| + case 3: |
| +#endif |
| case 4: |
| cif->flags = CIF_FLAGS_INT; |
| break; |
| +#ifdef __MINT__ |
| + case 7: |
| +#endif |
| case 8: |
| cif->flags = CIF_FLAGS_DINT; |
| break; |
| @@ -150,7 +183,11 @@ ffi_prep_cif_machdep (ffi_cif *cif) |
| |
| #if (FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE) |
| case FFI_TYPE_LONGDOUBLE: |
| +#ifdef __MINT__ |
| + cif->flags = 0; |
| +#else |
| cif->flags = CIF_FLAGS_LDOUBLE; |
| +#endif |
| break; |
| #endif |
| |
| @@ -218,6 +255,26 @@ ffi_prep_incoming_args_SYSV (char *stack |
| size_t z; |
| |
| z = (*p_arg)->size; |
| +#ifdef __MINT__ |
| + if (cif->flags && |
| + cif->rtype->type == FFI_TYPE_STRUCT && |
| + (z == 1 || z == 2)) |
| + { |
| + *p_argv = (void *) (argp + 2); |
| + |
| + z = 4; |
| + } |
| + else |
| + if (cif->flags && |
| + cif->rtype->type == FFI_TYPE_STRUCT && |
| + (z == 3 || z == 4)) |
| + { |
| + *p_argv = (void *) (argp); |
| + |
| + z = 4; |
| + } |
| + else |
| +#endif |
| if (z <= 4) |
| { |
| *p_argv = (void *) (argp + 4 - z); |
| @@ -267,14 +324,21 @@ ffi_prep_closure_loc (ffi_closure* closu |
| *(unsigned short *)closure->tramp = 0x207c; |
| *(void **)(closure->tramp + 2) = codeloc; |
| *(unsigned short *)(closure->tramp + 6) = 0x4ef9; |
| - if (cif->rtype->type == FFI_TYPE_STRUCT |
| - && !cif->flags) |
| + |
| + if ( |
| +#ifdef __MINT__ |
| + (cif->rtype->type == FFI_TYPE_LONGDOUBLE) || |
| +#endif |
| + (((cif->rtype->type == FFI_TYPE_STRUCT) |
| + && !cif->flags))) |
| *(void **)(closure->tramp + 8) = ffi_closure_struct_SYSV; |
| else |
| *(void **)(closure->tramp + 8) = ffi_closure_SYSV; |
| |
| #ifdef __rtems__ |
| rtems_cache_flush_multiple_data_lines( codeloc, FFI_TRAMPOLINE_SIZE ); |
| +#elif defined(__MINT__) |
| + Ssystem(S_FLUSHCACHE, codeloc, FFI_TRAMPOLINE_SIZE); |
| #else |
| syscall(SYS_cacheflush, codeloc, FLUSH_SCOPE_LINE, |
| FLUSH_CACHE_BOTH, FFI_TRAMPOLINE_SIZE); |
| @@ -286,4 +350,3 @@ ffi_prep_closure_loc (ffi_closure* closu |
| |
| return FFI_OK; |
| } |
| - |
| Index: libffi/src/m68k/sysv.S |
| =================================================================== |
| --- libffi.orig/src/m68k/sysv.S |
| +++ libffi/src/m68k/sysv.S |
| @@ -1,6 +1,7 @@ |
| /* ----------------------------------------------------------------------- |
| |
| - sysv.S - Copyright (c) 1998, 2012 Andreas Schwab |
| + sysv.S - Copyright (c) 2012 Alan Hourihane |
| + Copyright (c) 1998, 2012 Andreas Schwab |
| Copyright (c) 2008 Red Hat, Inc. |
| |
| m68k Foreign Function Interface |
| @@ -42,13 +43,19 @@ |
| #define CFI_ENDPROC() |
| #endif |
| |
| +#ifdef __MINT__ |
| +#define CALLFUNC(funcname) _ ## funcname |
| +#else |
| +#define CALLFUNC(funcname) funcname |
| +#endif |
| + |
| .text |
| |
| - .globl ffi_call_SYSV |
| - .type ffi_call_SYSV,@function |
| + .globl CALLFUNC(ffi_call_SYSV) |
| + .type CALLFUNC(ffi_call_SYSV),@function |
| .align 4 |
| |
| -ffi_call_SYSV: |
| +CALLFUNC(ffi_call_SYSV): |
| CFI_STARTPROC() |
| link %fp,#0 |
| CFI_OFFSET(14,-8) |
| @@ -63,14 +70,18 @@ ffi_call_SYSV: |
| move.l 8(%fp),-(%sp) |
| pea 4(%sp) |
| #if !defined __PIC__ |
| - jsr ffi_prep_args |
| + jsr CALLFUNC(ffi_prep_args) |
| #else |
| - bsr.l ffi_prep_args@PLTPC |
| + bsr.l CALLFUNC(ffi_prep_args@PLTPC) |
| #endif |
| addq.l #8,%sp |
| |
| | Pass pointer to struct value, if any |
| +#ifdef __MINT__ |
| + move.l %d0,%a1 |
| +#else |
| move.l %a0,%a1 |
| +#endif |
| |
| | Call the function |
| move.l 24(%fp),%a0 |
| @@ -142,7 +153,11 @@ retlongdouble: |
| retpointer: |
| btst #5,%d2 |
| jbeq retstruct1 |
| +#ifdef __MINT__ |
| + move.l %d0,(%a1) |
| +#else |
| move.l %a0,(%a1) |
| +#endif |
| jbra epilogue |
| |
| retstruct1: |
| @@ -162,13 +177,13 @@ epilogue: |
| unlk %fp |
| rts |
| CFI_ENDPROC() |
| - .size ffi_call_SYSV,.-ffi_call_SYSV |
| + .size CALLFUNC(ffi_call_SYSV),.-CALLFUNC(ffi_call_SYSV) |
| |
| - .globl ffi_closure_SYSV |
| - .type ffi_closure_SYSV, @function |
| + .globl CALLFUNC(ffi_closure_SYSV) |
| + .type CALLFUNC(ffi_closure_SYSV), @function |
| .align 4 |
| |
| -ffi_closure_SYSV: |
| +CALLFUNC(ffi_closure_SYSV): |
| CFI_STARTPROC() |
| link %fp,#-12 |
| CFI_OFFSET(14,-8) |
| @@ -178,9 +193,9 @@ ffi_closure_SYSV: |
| pea -12(%fp) |
| move.l %a0,-(%sp) |
| #if !defined __PIC__ |
| - jsr ffi_closure_SYSV_inner |
| + jsr CALLFUNC(ffi_closure_SYSV_inner) |
| #else |
| - bsr.l ffi_closure_SYSV_inner@PLTPC |
| + bsr.l CALLFUNC(ffi_closure_SYSV_inner@PLTPC) |
| #endif |
| |
| lsr.l #1,%d0 |
| @@ -240,13 +255,13 @@ ffi_closure_SYSV: |
| jra .Lcls_epilogue |
| CFI_ENDPROC() |
| |
| - .size ffi_closure_SYSV,.-ffi_closure_SYSV |
| + .size CALLFUNC(ffi_closure_SYSV),.-CALLFUNC(ffi_closure_SYSV) |
| |
| - .globl ffi_closure_struct_SYSV |
| - .type ffi_closure_struct_SYSV, @function |
| + .globl CALLFUNC(ffi_closure_struct_SYSV) |
| + .type CALLFUNC(ffi_closure_struct_SYSV), @function |
| .align 4 |
| |
| -ffi_closure_struct_SYSV: |
| +CALLFUNC(ffi_closure_struct_SYSV): |
| CFI_STARTPROC() |
| link %fp,#0 |
| CFI_OFFSET(14,-8) |
| @@ -256,14 +271,14 @@ ffi_closure_struct_SYSV: |
| move.l %a1,-(%sp) |
| move.l %a0,-(%sp) |
| #if !defined __PIC__ |
| - jsr ffi_closure_SYSV_inner |
| + jsr CALLFUNC(ffi_closure_SYSV_inner) |
| #else |
| - bsr.l ffi_closure_SYSV_inner@PLTPC |
| + bsr.l CALLFUNC(ffi_closure_SYSV_inner@PLTPC) |
| #endif |
| unlk %fp |
| rts |
| CFI_ENDPROC() |
| - .size ffi_closure_struct_SYSV,.-ffi_closure_struct_SYSV |
| + .size CALLFUNC(ffi_closure_struct_SYSV),.-CALLFUNC(ffi_closure_struct_SYSV) |
| |
| #if defined __ELF__ && defined __linux__ |
| .section .note.GNU-stack,"",@progbits |
| Index: libffi/README |
| =================================================================== |
| --- libffi.orig/README |
| +++ libffi/README |
| @@ -58,6 +58,7 @@ tested: |
| | AVR32 | Linux | |
| | HPPA | HPUX | |
| | IA-64 | Linux | |
| +| M68K | FreeMiNT | |
| | M68K | RTEMS | |
| | MIPS | IRIX | |
| | MIPS | Linux | |
| @@ -152,6 +153,7 @@ See the ChangeLog files for details. |
| Add thiscall, fastcall and MSVC cdecl support on Windows. |
| Add Amiga and newer MacOS support. |
| Fix Octeon and MC68881 support. |
| + Add m68k FreeMiNT support. |
| Fix code pessimizations. |
| Lots of build fixes. |
| |