From c4205f77f3c342d9ab243baee0ce4a1003f7c23d Mon Sep 17 00:00:00 2001 From: Frank Everdij Date: Sat, 26 Dec 2009 05:59:25 +0100 Subject: IRIX support From-SVN: r155470 --- libffi/src/mips/ffi.c | 17 ++++++++++++----- libffi/src/mips/ffitarget.h | 22 ++++++++++++++++++---- libffi/src/mips/n32.S | 4 ++++ 3 files changed, 34 insertions(+), 9 deletions(-) (limited to 'libffi/src') diff --git a/libffi/src/mips/ffi.c b/libffi/src/mips/ffi.c index 3143dcf..d714cc9 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 dd3fe73..c5f4e05 100644 --- a/libffi/src/mips/ffitarget.h +++ b/libffi/src/mips/ffitarget.h @@ -28,7 +28,10 @@ #define LIBFFI_TARGET_H #ifdef linux -#include +# include +#else +# include +#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 6f0f4c6..81e81bc 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 -- cgit v1.1