This is the mail archive of the libffi-discuss@sourceware.org mailing list for the libffi project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: IRIX/MIPSPro build of libffi 3.0.8, patches included


ChangeLog entry:

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.

I hope this is clear but concise enough.


I also revised the patch to build and run on libffi-3.0.9rc1
(10-05-2009):

--- include/ffi.h.in	Sun Oct  4 05:10:33 2009
+++ include/ffi.h.in	Fri Oct 23 13:47:45 2009
@@ -256,7 +256,11 @@
   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 *);
--- include/ffi_common.h	Sun Oct  4 05:10:33 2009
+++ include/ffi_common.h	Fri Oct 23 13:54:40 2009
@@ -84,7 +84,7 @@
 } 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;
@@ -91,8 +91,14 @@
 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__)));
--- src/mips/ffi.c	Sun Oct  4 05:10:33 2009
+++ src/mips/ffi.c	Fri Oct 23 14:08:43 2009
@@ -625,7 +625,7 @@
 	  {
 	    rvalue_copy = alloca (8);
 	    copy_rvalue = 1;
-#ifdef __MIPSEB__
+#if defined(__MIPSEB__) || defined(_MIPSEB)
 	    copy_offset = 4;
 #endif
 	  }
@@ -772,9 +772,10 @@
     {
       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 @@
   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
--- src/mips/ffitarget.h	Sun Oct  4 05:10:33 2009
+++ src/mips/ffitarget.h	Fri Oct 23 13:58:34 2009
@@ -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 @@
 /* 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,
--- src/mips/n32.S	Sun Oct  4 05:10:33 2009
+++ src/mips/n32.S	Fri Oct 23 13:58:34 2009
@@ -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 @@
 .LFE2:	
 	.end	ffi_closure_N32
 
+#ifdef linux
         .section        .eh_frame,"aw",@progbits
 .Lframe1:
         .4byte  .LECIE1-.LSCIE1		# length
@@ -583,5 +586,6 @@
 	.uleb128 (SIZEOF_FRAME2 - RA_OFF2)/4
 	.align	EH_FRAME_ALIGN
 .LEFDE3:
+#endif /* linux */	
 	
 #endif


Cheers,

Frank

On Fri, 2009-10-23 at 07:36 -0400, Anthony Green wrote:
> Frank Everdij wrote:
> > Hi libffi maintainers,
> >   
> Thanks for the patch.
> 
> I plan on getting libffi 3.0.9 rc2 out sometime between Sunday and 
> Tuesday, and will be sure to include this.   Could you please send me a 
> ChangeLog entry?
> 
> Thanks,
> 
> AG

-- 
drs Frank Everdij  Email:F.P.X.Everdij@tudelft.nl  Tel:+31 15 2788202
Room:6.34 Technical Support staff for Structural Mechanics
Dept. of Civil Engineering, Delft University of Technology


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]