| Index: libffi/ChangeLog.libffi |
| =================================================================== |
| --- libffi.orig/ChangeLog.libffi |
| +++ libffi/ChangeLog.libffi |
| @@ -1,3 +1,19 @@ |
| +2009-10-23 Frank Everdij <f.p.x.everdij@tudelft.nl> |
| + |
| + * include/ffi.h.in: Placed '__GNUC__' ifdef around |
| + '__attribute__((aligned(8)))' in ffi_closure, fixes compile for |
| + IRIX MIPSPro c99. |
| + * include/ffi_common.h: Added '__sgi' define to non |
| + '__attribute__((__mode__()))' integer typedefs. |
| + * src/mips/ffi.c (ffi_call, ffi_closure_mips_inner_O32, |
| + ffi_closure_mips_inner_N32): Added 'defined(_MIPSEB)' to BE check. |
| + (ffi_closure_mips_inner_O32, ffi_closure_mips_inner_N32): Added |
| + FFI_LONGDOUBLE support and alignment(N32 only). |
| + * src/mips/ffitarget.h: Corrected '#include <sgidefs.h>' for IRIX and |
| + fixed non '__attribute__((__mode__()))' integer typedefs. |
| + * src/mips/n32.S: Put '#ifdef linux' around '.abicalls' and '.eh_frame' |
| + since they are Linux/GNU Assembler specific. |
| + |
| 2009-12-25 Andreas Tobler <a.tobler@schweiz.org> |
| |
| * fficonfig.h.in: Rebuilt again. |
| Index: libffi/include/ffi.h.in |
| =================================================================== |
| --- libffi.orig/include/ffi.h.in |
| +++ libffi/include/ffi.h.in |
| @@ -256,7 +256,11 @@ typedef struct { |
| ffi_cif *cif; |
| void (*fun)(ffi_cif*,void*,void**,void*); |
| void *user_data; |
| +#ifdef __GNUC__ |
| } ffi_closure __attribute__((aligned (8))); |
| +#else |
| +} ffi_closure; |
| +#endif |
| |
| void *ffi_closure_alloc (size_t size, void **code); |
| void ffi_closure_free (void *); |
| Index: libffi/include/ffi_common.h |
| =================================================================== |
| --- libffi.orig/include/ffi_common.h |
| +++ libffi/include/ffi_common.h |
| @@ -84,15 +84,21 @@ typedef struct |
| } extended_cif; |
| |
| /* Terse sized type definitions. */ |
| -#ifdef _MSC_VER |
| +#if defined(_MSC_VER) || defined(__sgi) |
| typedef unsigned char UINT8; |
| typedef signed char SINT8; |
| typedef unsigned short UINT16; |
| typedef signed short SINT16; |
| typedef unsigned int UINT32; |
| typedef signed int SINT32; |
| +# ifdef _MSC_VER |
| typedef unsigned __int64 UINT64; |
| typedef signed __int64 SINT64; |
| +# else |
| +# include <inttypes.h> |
| +typedef uint64_t UINT64; |
| +typedef int64_t SINT64; |
| +# endif |
| #else |
| typedef unsigned int UINT8 __attribute__((__mode__(__QI__))); |
| typedef signed int SINT8 __attribute__((__mode__(__QI__))); |
| Index: libffi/src/mips/ffi.c |
| =================================================================== |
| --- libffi.orig/src/mips/ffi.c |
| +++ libffi/src/mips/ffi.c |
| @@ -625,7 +625,7 @@ void ffi_call(ffi_cif *cif, void (*fn)(v |
| { |
| rvalue_copy = alloca (8); |
| copy_rvalue = 1; |
| -#ifdef __MIPSEB__ |
| +#if defined(__MIPSEB__) || defined(_MIPSEB) |
| copy_offset = 4; |
| #endif |
| } |
| @@ -772,9 +772,10 @@ ffi_closure_mips_inner_O32 (ffi_closure |
| { |
| if (i < 2 && !seen_int && |
| (arg_types[i]->type == FFI_TYPE_FLOAT || |
| - arg_types[i]->type == FFI_TYPE_DOUBLE)) |
| + arg_types[i]->type == FFI_TYPE_DOUBLE || |
| + arg_types[i]->type == FFI_TYPE_LONGDOUBLE)) |
| { |
| -#ifdef __MIPSEB__ |
| +#if defined(__MIPSEB__) || defined(_MIPSEB) |
| if (arg_types[i]->type == FFI_TYPE_FLOAT) |
| avaluep[i] = ((char *) &fpr[i]) + sizeof (float); |
| else |
| @@ -931,10 +932,16 @@ ffi_closure_mips_inner_N32 (ffi_closure |
| while (i < avn) |
| { |
| if (arg_types[i]->type == FFI_TYPE_FLOAT |
| - || arg_types[i]->type == FFI_TYPE_DOUBLE) |
| + || arg_types[i]->type == FFI_TYPE_DOUBLE |
| + || arg_types[i]->type == FFI_TYPE_LONGDOUBLE) |
| { |
| argp = (argn >= 8 || soft_float) ? ar + argn : fpr + argn; |
| -#ifdef __MIPSEB__ |
| + if ((arg_types[i]->type == FFI_TYPE_LONGDOUBLE) && ((unsigned)argp & (arg_types[i]->alignment-1))) |
| + { |
| + argp=(ffi_arg*)ALIGN(argp,arg_types[i]->alignment); |
| + argn++; |
| + } |
| +#if defined(__MIPSEB__) || defined(_MIPSEB) |
| if (arg_types[i]->type == FFI_TYPE_FLOAT && argn < 8) |
| avaluep[i] = ((char *) argp) + sizeof (float); |
| else |
| Index: libffi/src/mips/ffitarget.h |
| =================================================================== |
| --- libffi.orig/src/mips/ffitarget.h |
| +++ libffi/src/mips/ffitarget.h |
| @@ -28,7 +28,10 @@ |
| #define LIBFFI_TARGET_H |
| |
| #ifdef linux |
| -#include <asm/sgidefs.h> |
| +# include <asm/sgidefs.h> |
| +#else |
| +# include <sgidefs.h> |
| +#endif |
| # ifndef _ABIN32 |
| # define _ABIN32 _MIPS_SIM_NABI32 |
| # endif |
| @@ -38,7 +41,6 @@ |
| # ifndef _ABIO32 |
| # define _ABIO32 _MIPS_SIM_ABI32 |
| # endif |
| -#endif |
| |
| #if !defined(_MIPS_SIM) |
| -- something is very wrong -- |
| @@ -154,7 +156,8 @@ |
| # endif /* _MIPS_SIM==_ABI64 */ |
| #endif /* !FFI_MIPS_O32 */ |
| #else /* !LIBFFI_ASM */ |
| -#ifdef FFI_MIPS_O32 |
| +# ifdef __GNUC__ |
| +# ifdef FFI_MIPS_O32 |
| /* O32 stack frames have 32bit integer args */ |
| typedef unsigned int ffi_arg __attribute__((__mode__(__SI__))); |
| typedef signed int ffi_sarg __attribute__((__mode__(__SI__))); |
| @@ -162,7 +165,18 @@ typedef signed int ffi_sarg __attr |
| /* N32 and N64 frames have 64bit integer args */ |
| typedef unsigned int ffi_arg __attribute__((__mode__(__DI__))); |
| typedef signed int ffi_sarg __attribute__((__mode__(__DI__))); |
| -#endif |
| +# endif |
| +# else |
| +# ifdef FFI_MIPS_O32 |
| +/* O32 stack frames have 32bit integer args */ |
| +typedef __uint32_t ffi_arg; |
| +typedef __int32_t ffi_sarg; |
| +# else |
| +/* N32 and N64 frames have 64bit integer args */ |
| +typedef __uint64_t ffi_arg; |
| +typedef __int64_t ffi_sarg; |
| +# endif |
| +# endif /* __GNUC__ */ |
| |
| typedef enum ffi_abi { |
| FFI_FIRST_ABI = 0, |
| Index: libffi/src/mips/n32.S |
| =================================================================== |
| --- libffi.orig/src/mips/n32.S |
| +++ libffi/src/mips/n32.S |
| @@ -40,7 +40,9 @@ |
| |
| #define SIZEOF_FRAME ( 8 * FFI_SIZEOF_ARG ) |
| |
| +#ifdef linux |
| .abicalls |
| +#endif |
| .text |
| .align 2 |
| .globl ffi_call_N32 |
| @@ -527,6 +529,7 @@ cls_epilogue: |
| .LFE2: |
| .end ffi_closure_N32 |
| |
| +#ifdef linux |
| .section .eh_frame,"aw",@progbits |
| .Lframe1: |
| .4byte .LECIE1-.LSCIE1 # length |
| @@ -583,5 +586,6 @@ cls_epilogue: |
| .uleb128 (SIZEOF_FRAME2 - RA_OFF2)/4 |
| .align EH_FRAME_ALIGN |
| .LEFDE3: |
| +#endif /* linux */ |
| |
| #endif |