[pcre-dev] Fwd: Bug#840354: src:pcre3: FTBFS on powerpc (G4 …

Top Page
Delete this message
Author: Matthew Vernon
Date:  
To: pcre-dev
Subject: [pcre-dev] Fwd: Bug#840354: src:pcre3: FTBFS on powerpc (G4 CPU)
Hi,

I've had the following bug report submitted; if the submitter is correct
(which seems likely, but I don't have a G4 powerpc box to test on), then
the jit code in 8.39 is using G5 instructions inappropriately (where the
8.38 code didn't).

Obviously, I could just disable jit for this architecture, but I'd
rather avoid it if possible...

Regards,

Matthew

-------- Forwarded Message --------
Subject: Bug#840354: src:pcre3: FTBFS on powerpc (G4 CPU)
Resent-Date: Mon, 10 Oct 2016 20:39:06 +0000
Resent-From: Christoph Biedl <debian.axhn@???>
Resent-To: debian-bugs-dist@???
Resent-CC: Matthew Vernon <matthew@???>
Date: Mon, 10 Oct 2016 22:37:40 +0200
From: Christoph Biedl <debian.axhn@???>
Reply-To: Christoph Biedl <debian.axhn@???>,
840354@???
To: Debian Bug Tracking System <submit@???>

Package: src:pcre3
Version: 2:8.39-2
Severity: important
Usertag: debian-powerpc@???

Dear Maintainer,

Rebuilding syslog-ng 3.7.3-3 on a PowerMac G4 failed with SIGILL,
debugging led to libpcre, and finally rebuilding src:pcre3 itself
fails with very similar symptoms:

(...)
/usr/bin/make  check-TESTS
make[3]: Entering directory '/tmp/pcre3/pcre3-8.39'
make[4]: Entering directory '/tmp/pcre3/pcre3-8.39'
./test-driver: line 107: 12195 Illegal instruction     "$@" > $log_file 2>&1
FAIL: pcre_jit_test
PASS: pcrecpp_unittest
PASS: pcre_scanner_unittest
(...)


The failing program is .libs/lt-pcre_jit_test. Using gdb is no help at
all, the failures happen at a different point every invocation:

Program received signal SIGILL, Illegal instruction.
0xb7faf0ec in ?? ()
(gdb) bt
#0  0xb7faf0ec in ?? ()
#1  0x1ff30718 in ?? ()
#2  0x1ff30718 in ?? ()
#3  0x1ff0adf4 in ?? ()
#4  0x200061c8 in ?? ()
#5  0x20004a3c in ?? ()
#6  0x1fc97274 in ?? ()
#7  0x1fc9747c in ?? ()
#8  0x00000000 in ?? ()
(gdb) disassemble 0xb7faf0ec,0xb7faf0ff
Dump of assembler code from 0xb7faf0ec to 0xb7faf0ff:
=> 0xb7faf0ec:  li      r3,-1
   0xb7faf0f0:  addi    r5,r30,6
   0xb7faf0f4:  cmplw   cr1,r5,r29
   0xb7faf0f8:  bgt     cr1,0xb7faf1b8
   0xb7faf0fc:  lwz     r5,36(r1)


Program received signal SIGILL, Illegal instruction.
0xb7fe5008 in ?? ()
(gdb) bt
#0  0xb7fe5008 in ?? ()
#1  0x1ffb8b80 in ?? ()
#2  0x1ff91820 in ?? ()
#3  0x20006110 in ?? ()
#4  0x20004a3c in ?? ()
#5  0x1fc97274 in ?? ()
#6  0x1fc9747c in ?? ()
#7  0x00000000 in ?? ()
(gdb) disassemble 0xb7fe5008,0xb7fe5020
Dump of assembler code from 0xb7fe5008 to 0xb7fe5020:
=> 0xb7fe5008:  mflr    r0
   0xb7fe500c:  stw     r31,-4(r1)
   0xb7fe5010:  stw     r30,-8(r1)
   0xb7fe5014:  stw     r29,-12(r1)
   0xb7fe5018:  stw     r28,-16(r1)
   0xb7fe501c:  stw     r27,-20(r1)


Program received signal SIGILL, Illegal instruction.
0xb7faf060 in ?? ()
(gdb) bt
#0  0xb7faf060 in ?? ()
#1  0x1ff30718 in ?? ()
#2  0x1ff30718 in ?? ()
#3  0x1ff0adf4 in ?? ()
#4  0x200061c8 in ?? ()
#5  0x20004a3c in ?? ()
#6  0x1fc97274 in ?? ()
#7  0x1fc9747c in ?? ()
#8  0x00000000 in ?? ()
(gdb) disassemble 0xb7faf060,0xb7faf070
Dump of assembler code from 0xb7faf060 to 0xb7faf070:
=> 0xb7faf060:  lwz     r28,8(r5)
   0xb7faf064:  addi    r3,r3,1
   0xb7faf068:  stw     r3,32(r1)
   0xb7faf06c:  b       0xb7faf0cc



My last rebuild of syslog-ng in July, using pcre3 version 2:8.38-3.1,
succeded. Therefore I guess it's the changes between 8.38 and 8.39.
Very likely this was introduced by the changes in the ppc_jit code
which unfortunately I was unable to understand.

Disabling jit for powerpc using the following patch:

--- pcre3-8.39.orig/sljit/sljitConfigInternal.h
+++ pcre3-8.39/sljit/sljitConfigInternal.h
@@ -135,11 +135,7 @@
#elif defined(__ppc64__) || defined(__powerpc64__) ||
defined(_ARCH_PPC64) || (defined(_POWER) && defined(__64BIT__))
#define SLJIT_CONFIG_PPC_64 1
#elif defined(__ppc__) || defined(__powerpc__) || defined(_ARCH_PPC) ||
defined(_ARCH_PWR) || defined(_ARCH_PWR2) || defined(_POWER)
-# ifndef __NO_FPRS__
-# define SLJIT_CONFIG_PPC_32 1
-# else
# define SLJIT_CONFIG_UNSUPPORTED 1
-# endif
#elif defined(__mips__) && !defined(_LP64)
#define SLJIT_CONFIG_MIPS_32 1
#elif defined(__mips64)

resulted in a successful pcre3 build, and using the created packages
also syslog-ng passes the failing test again.


So I'm asking you to bring this upstream to sort out how the breakage
was introduced. From other bug reports I guess the created code uses
G5 instructions; the Debian powerpc buildds didn't notice as they
actually are such newer boxes.

As a hopefully temporary workaround you could disable jit for powerpc,
of course a the cost of a performance penalty.

    Christoph


-- System Information:
Debian Release: stretch/sid
APT prefers testing
APT policy: (500, 'testing')
Architecture: powerpc (ppc)

Kernel: Linux 4.4.23
Locale: LANG=C, LC_CTYPE=C (charmap=ANSI_X3.4-1968)
Shell: /bin/sh linked to /bin/dash
Init: unable to detect