diff options
author | Frank Everdij <f.p.x.everdij@tudelft.nl> | 2009-12-26 05:59:25 +0100 |
---|---|---|
committer | Anthony Green <green@gcc.gnu.org> | 2009-12-26 04:59:25 +0000 |
commit | c4205f77f3c342d9ab243baee0ce4a1003f7c23d (patch) | |
tree | bdb1509b9afa7e4407e279f35b11ca4940a86ac1 /libffi/src | |
parent | 124f60ab29f46aefdf892a4fcf981e4e292eb08c (diff) | |
download | gcc-c4205f77f3c342d9ab243baee0ce4a1003f7c23d.zip gcc-c4205f77f3c342d9ab243baee0ce4a1003f7c23d.tar.gz gcc-c4205f77f3c342d9ab243baee0ce4a1003f7c23d.tar.bz2 |
IRIX support
From-SVN: r155470
Diffstat (limited to 'libffi/src')
-rw-r--r-- | libffi/src/mips/ffi.c | 17 | ||||
-rw-r--r-- | libffi/src/mips/ffitarget.h | 22 | ||||
-rw-r--r-- | libffi/src/mips/n32.S | 4 |
3 files changed, 34 insertions, 9 deletions
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 <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 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 |