Subject: guile 2.0.11 - test failures on mips64 big-endian with n32 ABI

From: "Schaefer, Frank" <[email-masked]>
Date: Wed, 13 May 2015 18:31:12 +0000

I've encountered two test failures with guile 2.0.11 on mips64 big-endian, whenever I build with -mabi=n32 (these test failures do not occur with -mabi=64).  At least one of them I have resolved with the attached patch.

First testcase failure: test-ffi (fixed by my patch).  The guile code apparently assumes that sizeof(ffi_arg)<=sizeof(void **).  This is a faulty assumption; it holds on *most* platforms, but with the mips64 n32 ABI, sizeof(void **)==4, and sizeof(ffi_arg)==8.  So every foreign function that returns a pointer is liable to corrupt data, and anyone retrieving the return value as a simple void * is only going to get sign-extension garbage on big-endian (usually NULL).

Second testcase failure: check-guile fails due to 'ERROR: foreign.test: procedure->pointer: qsort - arguments: ((null-pointer-error "pointer->bytevector" "null pointer dereference" () ()))'.  I strongly suspect it's related to the ffi_arg issue mentioned above, but I'm still peeling away macro ugliness to track it down.  If anyone wants to pitch in with additional guidance or patchwork, I'd be happy to listen and test.

(The patch applies against 2.0.11 release or against current HEAD, where it also fixes the new testcases for test-foreign-object-scm and test-foreign-object-c.  HEAD also fails the test-out-of-memory case, though, which precludes further unit tests.)