On Mon, Jan 09, 2012 at 10:09:58PM -0200, Antonio Terceiro wrote:
Hi Jurij,
Jurij Smakov escreveu isso aí:
On Wed, Jan 04, 2012 at 10:54:07AM -0200, Antonio Terceiro wrote:
Dear sparc porters,
I need some help from you to make ruby-ffi build correctly on sparc.
The source actually compiles OK, but the test suite crashes with an
Illegal instruction error. Is this a known problem?
I managed to create a minimal test script that reproduces the problem
without running the entire test suite. It is attached to this bug
report (http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=642266), and
all you need to do is run it from the root of the package source dir (it
will compile everything that's needed before running the actual test
code).
I also attached strace output from running the test script against both
ruby1.8 and ruby1.9.1 (a second run, after having the C code built to
remove unecessary cruft): they have similar results.
We used to have a bug in gcc-4.6 on sparc, which resulted in
miscompilation of pack/unpack function in Ruby:
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=635126
The fact that your test case causes a failure in pack-related function
makes me think that this might be the same problem. Last ruby-ffi
package has been built with gcc-4.6 4.6.2-4, according to
https://buildd.debian.org/status/fetch.php?pkg=ruby-ffiarch=sparcver=1.0.11debian-2stamp=1325143302
The first gcc-4.6 version containing a fix is 4.6.2-6, so the build
still happened with broken gcc. If you can, try either building
the code with older compiler and -fno-tree-sra flag, or newer
compiler, to see whether this fixes the problem. I'm on vacation for
another week and don't have access to my sparc box, so if you will not
be able to confirm this fix, I'll be glad to give it a go once I'm
back.
I've just tested on smetana.debian.org (where those strace logs
were obtained before), and the gcc there is way newer than that:
gcc 4:4.6.2-4
gcc-4.6 4.6.2-11
I also tried building with -fno-tree-sra, but got the same results. So,
it would be very nice if you could look at this issue.
Right, it's a different issue. 'Illegal instruction' error is
generated when the test code hits 'ta 6' instruction, which
is generated due to the following code in libtest/NumberTest.c:
#ifdef __sparc
#define fix_mem_access __asm(ta 6)
#else
#define fix_mem_access
#endif
This instruction means 'software trap 6', which normally invokes some
action in the kernel from userspace (kind of like 'int' instruction
on x86). According to a cursory search, this trap is Solaris-specific,
and its effect is to turn on the unaligned trap handler. In Linux
userspace unaligned traps are not handled (they just cause program
termination), so the #ifdef should be adjusted to only trigger on
Solaris/sparc. This may have unintended side effects (if the tests
have intentional unaligned accesses, for example), but I've confirmed
that with the attached patch applied the package builds successfully.
Note that I have no way to test it on Solaris, but judging by examples
like
http://www.winehq.org/pipermail/wine-patches/2011-February/098547.html
it should do the trick.
Best regards,
--
Jurij Smakov ju...@wooyd.org
Key: http://www.wooyd.org/pgpkey/ KeyID: C99E03CC
diff -aur a/libtest/NumberTest.c b/libtest/NumberTest.c
--- a/libtest/NumberTest.c 2011-11-13 20:03:45.0 +
+++ b/libtest/NumberTest.c 2012-01-10 17:53:07.684344142 +
@@ -23,7 +23,7 @@
#include string.h
#include stdint.h
-#ifdef __sparc
+#if defined(__sparc) defined(__sun__)
#define fix_mem_access __asm(ta 6)
#else
#define fix_mem_access