Hi, while playing with GNUstep on my lemote, I found libffi absolute unusable. Since the GNUstep stuff also supports to link against ffcall, I tried that. The patches make ffcall compile with lots of warnings suppressed, and allow the configure script of gnustep-base to pass the test (before it didn't)
Running the regression tests of ffcall there, some tests are still failing. However, I enabled devel/clisp on mips64, the only consumer for ffcall, and with that I was at least able to run a simple hello world. Is the patch OK? Sebastian Index: Makefile =================================================================== RCS file: /cvs/ports/devel/ffcall/Makefile,v retrieving revision 1.22 diff -u -p -u -r1.22 Makefile --- Makefile 21 Mar 2013 08:45:14 -0000 1.22 +++ Makefile 18 Jan 2014 13:29:32 -0000 @@ -7,9 +7,9 @@ ONLY_FOR_ARCHS= alpha amd64 hppa i386 mi COMMENT= foreign function call libraries DISTNAME= ffcall-1.10 -REVISION = 1 -SHARED_LIBS= avcall 1.0 \ - callback 1.0 +REVISION = 2 +SHARED_LIBS= avcall 1.1 \ + callback 1.1 CATEGORIES= devel MASTER_SITES= http://www.haible.de/bruno/gnu/ \ ftp://ftp.ilog.fr/pub/Users/haible/gnu/ Index: patches/patch-avcall_avcall_h_in =================================================================== RCS file: /cvs/ports/devel/ffcall/patches/patch-avcall_avcall_h_in,v retrieving revision 1.1 diff -u -p -u -r1.1 patch-avcall_avcall_h_in --- patches/patch-avcall_avcall_h_in 23 Sep 2010 13:38:33 -0000 1.1 +++ patches/patch-avcall_avcall_h_in 18 Jan 2014 13:29:32 -0000 @@ -1,6 +1,54 @@ $OpenBSD: patch-avcall_avcall_h_in,v 1.1 2010/09/23 13:38:33 joshe Exp $ ---- avcall/avcall.h.in.orig Mon Jan 26 06:58:41 2004 -+++ avcall/avcall.h.in Sat Apr 25 16:17:43 2009 + +try fix mips64el + +--- avcall/avcall.h.in.orig Mon Jan 26 15:58:41 2004 ++++ avcall/avcall.h.in Tue Jan 14 20:29:21 2014 +@@ -367,7 +367,7 @@ typedef struct + __avword* iaptr; + __avword iargs[6]; + #endif +-#if defined(__mips__) && !defined(__mipsn32__) ++#if defined(__mips__) && !defined(__mipsn32__) && !defined(__mips64__) + /* store the floating-point arguments in an extra array */ + int anum; + double floatarg[2]; +@@ -447,7 +447,7 @@ typedef struct + #define __av_start1(LIST) \ + (LIST).aptr = &(LIST).args[0], + #endif +-#if defined(__mips__) && !defined(__mipsn32__) ++#if defined(__mips__) && !defined(__mipsn32__) && !defined(__mips64__) + #define __av_start1(LIST) \ + (LIST).anum = 0, \ + (LIST).aptr = &(LIST).args[0], +@@ -606,7 +606,7 @@ typedef struct + #define __av_start_struct3(LIST) \ + 0 + #endif +-#if defined(__mips__) && !defined(__mipsn32__) ++#if defined(__mips__) && !defined(__mipsn32__) && !defined(__mips64__) + #define __av_reg_struct_return(LIST,TYPE_SIZE,TYPE_SPLITTABLE) \ + ((TYPE_SIZE) == 1 || (TYPE_SIZE) == 2 || (TYPE_SIZE) == 4) + /* Test __AV_SMALL_STRUCT_RETURN instead of __AV_REGISTER_STRUCT_RETURN. */ +@@ -840,7 +840,7 @@ typedef struct + + #endif + +-#if defined(__mips__) && !defined(__mipsn32__) ++#if defined(__mips__) && !defined(__mipsn32__) && !defined(__mips64__) + + /* Up to 2 leading float or double non-varargs args can be passed in + * float registers, but we also push them into the corresponding int +@@ -1145,7 +1145,7 @@ typedef struct + 0))) + #endif + /* small structures < 1 word are adjusted depending on compiler */ +-#if defined(__mips__) && !defined(__mipsn32__) ++#if defined(__mips__) && !defined(__mipsn32__) && !defined(__mips64__) + #define __av_struct_leftadjusted(LIST,TYPE,TYPE_SIZE,TYPE_ALIGN,ASSIGN,VAL) \ + (((LIST).aptr = \ + (__avword*)(((__avword)(LIST).aptr+(TYPE_SIZE)+(TYPE_ALIGN)-1) & -(long)(TYPE_ALIGN)))\ @@ -1307,8 +1307,9 @@ typedef struct ? -1 : (ASSIGN(TYPE,TYPE_SIZE,TYPE_ALIGN,(void*)((__avword)(LIST).aptr-(TYPE_SIZE)),VAL),\ (LIST).aptr = (__avword*)(((__avword)(LIST).aptr+sizeof(__avword)-1) & -(long)sizeof(__avword)),\ Index: patches/patch-callback_trampoline_r_test1_c =================================================================== RCS file: /cvs/ports/devel/ffcall/patches/patch-callback_trampoline_r_test1_c,v retrieving revision 1.1 diff -u -p -u -r1.1 patch-callback_trampoline_r_test1_c --- patches/patch-callback_trampoline_r_test1_c 23 Aug 2010 14:16:09 -0000 1.1 +++ patches/patch-callback_trampoline_r_test1_c 18 Jan 2014 13:29:32 -0000 @@ -1,7 +1,21 @@ $OpenBSD: patch-callback_trampoline_r_test1_c,v 1.1 2010/08/23 14:16:09 jasper Exp $ ---- callback/trampoline_r/test1.c.orig Sun Apr 26 06:46:30 2009 -+++ callback/trampoline_r/test1.c Sun Apr 26 06:46:30 2009 -@@ -70,7 +70,7 @@ register void* env __asm__("%r29"); +--- callback/trampoline_r/test1.c.orig Mon Jan 26 15:59:26 2004 ++++ callback/trampoline_r/test1.c Fri Jan 17 23:33:22 2014 +@@ -48,12 +48,9 @@ int f (x) + #ifdef __m68k__ + register void* env __asm__("a0"); + #endif +-#ifdef __mips__ ++#if defined(__mips__) || defined(__mips64__) + register void* env __asm__("$2"); + #endif +-#ifdef __mips64__ +-register void* env __asm__("$2"); +-#endif + #if defined(__sparc__) && !defined(__sparc64__) + register void* env __asm__("%g2"); + #endif +@@ -70,7 +67,7 @@ register void* env __asm__("%r29"); register void* env __asm__("r12"); #endif #ifdef __rs6000__ Index: patches/patch-callback_trampoline_r_trampoline_c =================================================================== RCS file: /cvs/ports/devel/ffcall/patches/patch-callback_trampoline_r_trampoline_c,v retrieving revision 1.3 diff -u -p -u -r1.3 patch-callback_trampoline_r_trampoline_c --- patches/patch-callback_trampoline_r_trampoline_c 23 Sep 2010 13:38:33 -0000 1.3 +++ patches/patch-callback_trampoline_r_trampoline_c 18 Jan 2014 13:29:32 -0000 @@ -7,8 +7,8 @@ stack instead. Also fix powerpc and mips64. ---- callback/trampoline_r/trampoline.c.orig Mon Jan 26 07:00:05 2004 -+++ callback/trampoline_r/trampoline.c Fri Jul 30 14:34:10 2010 +--- callback/trampoline_r/trampoline.c.orig Mon Jan 26 16:00:05 2004 ++++ callback/trampoline_r/trampoline.c Wed Jan 15 09:14:02 2014 @@ -21,7 +21,7 @@ #endif #endif @@ -18,7 +18,7 @@ Also fix powerpc and mips64. #define __rs6000netbsd__ #else #if !defined(_AIX) -@@ -196,8 +196,12 @@ extern RETGETPAGESIZETYPE getpagesize (); +@@ -196,12 +196,16 @@ extern RETGETPAGESIZETYPE getpagesize (); #ifdef linux #include <asm/cachectl.h> #else @@ -27,11 +27,24 @@ Also fix powerpc and mips64. +#else #ifdef HAVE_SYS_CACHECTL_H #include <sys/cachectl.h> + #endif + #endif + #endif + #endif +#endif + #ifdef __m88k__ + #include <sys/syslocal.h> #endif +@@ -242,7 +246,7 @@ extern void __TR_clear_cache(); + #define TRAMP_LENGTH 14 + #define TRAMP_ALIGN 16 #endif +-#if defined(__mips__) && !defined(__mipsn32__) ++#if defined(__mips__) && !defined(__mipsn32__) && !defined(__mips64__) + #define TRAMP_LENGTH 24 + #define TRAMP_ALIGN 4 #endif -@@ -259,11 +259,11 @@ extern void __TR_clear_cache(); +@@ -259,11 +263,11 @@ extern void __TR_clear_cache(); #define TRAMP_ALIGN 8 #endif #if defined(__sparc__) && !defined(__sparc64__) @@ -45,7 +58,16 @@ Also fix powerpc and mips64. #define TRAMP_ALIGN 16 #endif #ifdef __alpha__ -@@ -614,52 +614,64 @@ __TR_function alloc_trampoline_r (address, data0, data +@@ -459,7 +463,7 @@ __TR_function alloc_trampoline_r (address, data0, data + #define tramp_data(function) \ + *(long *) (function + 2) + #endif +-#if defined(__mips__) && !defined(__mipsn32__) ++#if defined(__mips__) && !defined(__mipsn32__) && !defined(__mips64__) + /* function: + * li $2,<data>&0xffff0000 3C 02 hi16(<data>) + * ori $2,$2,<data>&0xffff 34 42 lo16(<data>) +@@ -614,52 +618,64 @@ __TR_function alloc_trampoline_r (address, data0, data /* function: * sethi %hi(<data>),%g2 05000000 | (<data> >> 10) * sethi %hi(<address>),%g1 03000000 | (<address> >> 10) Index: patches/patch-callback_vacall_r_vacall_r_h_in =================================================================== RCS file: /cvs/ports/devel/ffcall/patches/patch-callback_vacall_r_vacall_r_h_in,v retrieving revision 1.1 diff -u -p -u -r1.1 patch-callback_vacall_r_vacall_r_h_in --- patches/patch-callback_vacall_r_vacall_r_h_in 23 Feb 2010 20:11:15 -0000 1.1 +++ patches/patch-callback_vacall_r_vacall_r_h_in 18 Jan 2014 13:29:32 -0000 @@ -3,8 +3,8 @@ $OpenBSD: patch-callback_vacall_r_vacall On OpenBSD the mips64(el) architectures define both __mips__ and __mips64__, which leads to confusion and redeclarations here. ---- callback/vacall_r/vacall_r.h.in.orig Thu Feb 11 23:44:38 2010 -+++ callback/vacall_r/vacall_r.h.in Thu Feb 11 23:48:22 2010 +--- callback/vacall_r/vacall_r.h.in.orig Wed Jun 2 21:18:12 2004 ++++ callback/vacall_r/vacall_r.h.in Tue Jan 14 20:31:43 2014 @@ -395,7 +395,7 @@ typedef struct float farg[4]; double darg[2]; @@ -46,7 +46,7 @@ which leads to confusion and redeclarati #define __va_align_double(LIST) #endif -#if defined(__mips__) && !defined(__mipsn32__) || defined(__m88k__) -+#if defined(__mips__) && !defined(__mipsn32__) || defined(__m88k__) && !defined(__mips64__) ++#if defined(__mips__) && !defined(__mipsn32__) && !defined(__mips64__) || defined(__m88k__) /* __VA_alignof(double) > sizeof(__vaword) */ #define __va_align_double(LIST) \ (LIST)->aptr = ((LIST)->aptr + sizeof(double)-1) & -(long)sizeof(double), Index: patches/patch-trampoline_trampoline_c =================================================================== RCS file: /cvs/ports/devel/ffcall/patches/patch-trampoline_trampoline_c,v retrieving revision 1.1 diff -u -p -u -r1.1 patch-trampoline_trampoline_c --- patches/patch-trampoline_trampoline_c 23 Feb 2010 20:11:15 -0000 1.1 +++ patches/patch-trampoline_trampoline_c 18 Jan 2014 13:29:32 -0000 @@ -1,7 +1,7 @@ $OpenBSD: patch-trampoline_trampoline_c,v 1.1 2010/02/23 20:11:15 jasper Exp $ ---- trampoline/trampoline.c.orig Thu Feb 11 23:38:13 2010 -+++ trampoline/trampoline.c Thu Feb 11 23:40:59 2010 -@@ -192,8 +192,12 @@ extern RETGETPAGESIZETYPE getpagesize (); +--- trampoline/trampoline.c.orig Mon Jan 26 16:02:10 2004 ++++ trampoline/trampoline.c Wed Jan 15 08:53:57 2014 +@@ -192,12 +192,16 @@ extern RETGETPAGESIZETYPE getpagesize (); #ifdef linux #include <asm/cachectl.h> #else @@ -10,7 +10,29 @@ $OpenBSD: patch-trampoline_trampoline_c, +#else #ifdef HAVE_SYS_CACHECTL_H #include <sys/cachectl.h> + #endif + #endif + #endif + #endif +#endif + #ifdef __m88k__ + #include <sys/syslocal.h> + #endif +@@ -238,7 +242,7 @@ extern void __TR_clear_cache(); + #define TRAMP_LENGTH 18 + #define TRAMP_ALIGN 16 #endif +-#if defined(__mips__) && !defined(__mipsn32__) ++#if defined(__mips__) && !defined(__mipsn32__) && !defined(__mips64__) + #define TRAMP_LENGTH 32 + #define TRAMP_ALIGN 4 #endif +@@ -435,7 +439,7 @@ __TR_function alloc_trampoline (address, variable, dat + #define tramp_data(function) \ + *(long *) (function + 2) #endif +-#if defined(__mips__) && !defined(__mipsn32__) ++#if defined(__mips__) && !defined(__mipsn32__) && !defined(__mips64__) + /* function: + * li $2,<data>&0xffff0000 3C 02 hi16(<data>) + * ori $2,$2,<data>&0xffff 34 42 lo16(<data>)