Hi,

Here is a patch that fix a limitation of the FFI library.
It enables libffi to handle 64 bit longs returned by calls
to foreign functions on Sparc hosts.

As a consequence, RandomAccessFileTest now works fine on Solaris/Sparc.


diff -u lib/libffi/src/ffitest.c.ini lib/libffi/src/ffitest.c
--- lib/libffi/src/ffitest.c.ini        Thu Mar 18 11:45:05 1999
+++ lib/libffi/src/ffitest.c    Thu Mar 18 11:46:14 1999
@@ -285,7 +285,7 @@
 
   /* return value tests */
   {
-#if defined(MIPS) || defined(SPARC) /* || defined(ARM) */
+#if defined(MIPS) /* || defined(SPARC) || defined(ARM) */
     puts ("long long tests not run. This is a known bug on this 
architecture.");
 #else
     args[0] = &ffi_type_sint64;
@@ -295,7 +295,7 @@
     CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, 
                       &ffi_type_sint64, args) == FFI_OK);
 
-    for (ll = 0LL; ll < 100LL; ll++)
+    for (ll = -100LL; ll < 100LL; ll++)
       {
        ul++;
        ffi_call(&cif, FFI_FN(return_ll), &rlonglong, values);



diff -u lib/libffi/src/sparc/ffi.c.ini  lib/libffi/src/sparc/ffi.c
--- lib/libffi/src/sparc/ffi.c.ini      Thu Mar 18 11:59:56 1999
+++ lib/libffi/src/sparc/ffi.c  Thu Mar 18 12:03:06 1999
@@ -176,6 +176,11 @@
       cif->flags = FFI_TYPE_DOUBLE;
       break;
 
+    case FFI_TYPE_UINT64:
+    case FFI_TYPE_SINT64:
+      cif->flags = FFI_TYPE_UINT64;
+      break;
+
     default:
       cif->flags = FFI_TYPE_INT;
       break;


diff -u lib/libffi/src/sparc/v8.S.ini lib/libffi/src/sparc/v8.S
--- lib/libffi/src/sparc/v8.S.ini       Thu Mar 18 12:00:26 1999
+++ lib/libffi/src/sparc/v8.S   Thu Mar 18 12:39:13 1999
@@ -70,6 +70,12 @@
        be,a    done
        st      %f0, [%i4+0]    ! (delay)
 
+        cmp     %i3, FFI_TYPE_UINT64
+        bne     next
+        st      %o0, [%i4]
+        st      %o1, [%i4+4]
+next:
+
        cmp     %i3, FFI_TYPE_DOUBLE
        bne     done
        nop




Hope that helps,

--Christophe

Reply via email to