diff --git a/libffi/ChangeLog b/libffi/ChangeLog index 01052cd4fe0b9d005ad4316e3d885d36702855ae..7e18f65cf37e563cfc88f4fe7b476e61ad7ad659 100644 --- a/libffi/ChangeLog +++ b/libffi/ChangeLog @@ -1,3 +1,19 @@ +2009-12-25 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 Bradley Smith <brad@brad-smith.co.uk> * configure.ac, Makefile.am, src/avr32/ffi.c, diff --git a/libffi/include/ffi.h.in b/libffi/include/ffi.h.in index a06d626c2d7b6a3725a2dcf824d1afd31f6f29ce..32f610323b4d870291ca0ba7649e6786492d8aef 100644 --- a/libffi/include/ffi.h.in +++ b/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 *); diff --git a/libffi/include/ffi_common.h b/libffi/include/ffi_common.h index 16c5f8859f7515912929fe48b555037a8b21c55d..42cace915022092029207d422e22d5504dfc6871 100644 --- a/libffi/include/ffi_common.h +++ b/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__))); diff --git a/libffi/src/mips/ffi.c b/libffi/src/mips/ffi.c index 3143dcfc6539305c14093dc2b50e133d834a4ffb..d714cc9e998ae4c9bedce493605a999fefc2cd94 100644 --- a/libffi/src/mips/ffi.c +++ b/libffi/src/mips/ffi.c @@ -625,7 +625,7 @@ void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) { 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 *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 *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 diff --git a/libffi/src/mips/ffitarget.h b/libffi/src/mips/ffitarget.h index dd3fe739c224229b0f0d193592df34d841876773..c5f4e0568416434f9246d69f0332b5acce2856ee 100644 --- a/libffi/src/mips/ffitarget.h +++ b/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 __attribute__((__mode__(__SI__))); /* 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, diff --git a/libffi/src/mips/n32.S b/libffi/src/mips/n32.S index 6f0f4c6d530a4e121557b978266f9b8468f06718..81e81bcb4e965d8517509a8bdcb605791cdf0e9c 100644 --- a/libffi/src/mips/n32.S +++ b/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