IRIX support
authorFrank Everdij <f.p.x.everdij@tudelft.nl>
Sat, 26 Dec 2009 04:59:25 +0000 (05:59 +0100)
committerAnthony Green <green@gcc.gnu.org>
Sat, 26 Dec 2009 04:59:25 +0000 (04:59 +0000)
From-SVN: r155470

libffi/ChangeLog
libffi/include/ffi.h.in
libffi/include/ffi_common.h
libffi/src/mips/ffi.c
libffi/src/mips/ffitarget.h
libffi/src/mips/n32.S

index 01052cd4fe0b9d005ad4316e3d885d36702855ae..7e18f65cf37e563cfc88f4fe7b476e61ad7ad659 100644 (file)
@@ -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,
index a06d626c2d7b6a3725a2dcf824d1afd31f6f29ce..32f610323b4d870291ca0ba7649e6786492d8aef 100644 (file)
@@ -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 16c5f8859f7515912929fe48b555037a8b21c55d..42cace915022092029207d422e22d5504dfc6871 100644 (file)
@@ -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 3143dcfc6539305c14093dc2b50e133d834a4ffb..d714cc9e998ae4c9bedce493605a999fefc2cd94 100644 (file)
@@ -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
index dd3fe739c224229b0f0d193592df34d841876773..c5f4e0568416434f9246d69f0332b5acce2856ee 100644 (file)
 #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 --
 # 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,
index 6f0f4c6d530a4e121557b978266f9b8468f06718..81e81bcb4e965d8517509a8bdcb605791cdf0e9c 100644 (file)
@@ -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