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