diff --git a/pcre-8.37-RC1-Fix-ARM64-SP-alignment-issue-in-JIT.patch b/pcre-8.37-RC1-Fix-ARM64-SP-alignment-issue-in-JIT.patch new file mode 100644 index 0000000..41a836c --- /dev/null +++ b/pcre-8.37-RC1-Fix-ARM64-SP-alignment-issue-in-JIT.patch @@ -0,0 +1,96 @@ +From 4ef0a06d7be50e00918c63c90ad934ba29970c42 Mon Sep 17 00:00:00 2001 +From: zherczeg +Date: Thu, 23 Apr 2015 13:51:51 +0000 +Subject: [PATCH] Fix ARM64 SP alignment issue in JIT. +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +git-svn-id: svn://vcs.exim.org/pcre/code/trunk@1551 2f5784b3-3f2a-0410-8824-cb99058d5e15 +Signed-off-by: Petr Písař + +diff --git a/sljit/sljitNativeARM_64.c b/sljit/sljitNativeARM_64.c +index c5251be..b66455f 100644 +--- a/sljit/sljitNativeARM_64.c ++++ b/sljit/sljitNativeARM_64.c +@@ -1081,12 +1081,13 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compil + FAIL_IF(push_inst(compiler, ADDI | RD(SLJIT_SP) | RN(TMP_SP) | (0 << 10))); + offs = (local_size - saved_regs_size) << (15 - 3); + } else { +- compiler->local_size += 2 * sizeof(sljit_sw); +- local_size -= saved_regs_size; +- saved_regs_size += 2 * sizeof(sljit_sw); +- FAIL_IF(push_inst(compiler, STP_PRE | 29 | RT2(TMP_LR) +- | RN(TMP_SP) | ((-(saved_regs_size >> 3) & 0x7f) << 15))); +- offs = 2 << 15; ++ offs = 0 << 15; ++ if (saved_regs_size & 0x8) { ++ offs = 1 << 15; ++ saved_regs_size += sizeof(sljit_sw); ++ } ++ local_size -= saved_regs_size + SLJIT_LOCALS_OFFSET; ++ FAIL_IF(push_inst(compiler, SUBI | RD(TMP_SP) | RN(TMP_SP) | (saved_regs_size << 10))); + } + + tmp = saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - saveds) : SLJIT_FIRST_SAVED_REG; +@@ -1122,6 +1123,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compil + } + if (local_size) + FAIL_IF(push_inst(compiler, SUBI | RD(TMP_SP) | RN(TMP_SP) | (local_size << 10))); ++ FAIL_IF(push_inst(compiler, STP_PRE | 29 | RT2(TMP_LR) ++ | RN(TMP_SP) | ((-(16 >> 3) & 0x7f) << 15))); + FAIL_IF(push_inst(compiler, ADDI | RD(SLJIT_SP) | RN(TMP_SP) | (0 << 10))); + } + +@@ -1145,8 +1148,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_set_context(struct sljit_compiler *compi + + local_size += GET_SAVED_REGISTERS_SIZE(scratches, saveds, 0) + SLJIT_LOCALS_OFFSET; + local_size = (local_size + 15) & ~0xf; +- if (local_size > (63 * sizeof(sljit_sw))) +- local_size += 2 * sizeof(sljit_sw); + compiler->local_size = local_size; + return SLJIT_SUCCESS; + } +@@ -1167,16 +1168,20 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_return(struct sljit_compiler *compi + if (local_size <= (63 * sizeof(sljit_sw))) + offs = (local_size - saved_regs_size) << (15 - 3); + else { +- saved_regs_size += 2 * sizeof(sljit_sw); +- local_size -= saved_regs_size; ++ FAIL_IF(push_inst(compiler, LDP_PST | 29 | RT2(TMP_LR) ++ | RN(TMP_SP) | (((16 >> 3) & 0x7f) << 15))); ++ offs = 0 << 15; ++ if (saved_regs_size & 0x8) { ++ offs = 1 << 15; ++ saved_regs_size += sizeof(sljit_sw); ++ } ++ local_size -= saved_regs_size + SLJIT_LOCALS_OFFSET; + if (local_size > 0xfff) { + FAIL_IF(push_inst(compiler, ADDI | RD(TMP_SP) | RN(TMP_SP) | ((local_size >> 12) << 10) | (1 << 22))); + local_size &= 0xfff; + } + if (local_size) + FAIL_IF(push_inst(compiler, ADDI | RD(TMP_SP) | RN(TMP_SP) | (local_size << 10))); +- local_size = saved_regs_size; +- offs = 2 << 15; + } + + tmp = compiler->saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - compiler->saveds) : SLJIT_FIRST_SAVED_REG; +@@ -1204,8 +1209,12 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_return(struct sljit_compiler *compi + if (prev != -1) + FAIL_IF(push_inst(compiler, LDRI | RT(prev) | RN(TMP_SP) | (offs >> 5))); + +- FAIL_IF(push_inst(compiler, LDP_PST | 29 | RT2(TMP_LR) +- | RN(TMP_SP) | (((local_size >> 3) & 0x7f) << 15))); ++ if (compiler->local_size <= (63 * sizeof(sljit_sw))) { ++ FAIL_IF(push_inst(compiler, LDP_PST | 29 | RT2(TMP_LR) ++ | RN(TMP_SP) | (((local_size >> 3) & 0x7f) << 15))); ++ } else { ++ FAIL_IF(push_inst(compiler, ADDI | RD(TMP_SP) | RN(TMP_SP) | (saved_regs_size << 10))); ++ } + + FAIL_IF(push_inst(compiler, RET | RN(TMP_LR))); + return SLJIT_SUCCESS; +-- +2.1.0 + diff --git a/pcre.spec b/pcre.spec index 8d975b2..37e8b99 100644 --- a/pcre.spec +++ b/pcre.spec @@ -32,6 +32,8 @@ Patch0: pcre-8.21-multilib.patch Patch1: pcre-8.32-refused_spelling_terminated.patch # Fix static linking, bug #1214494, in upstream after 8.37-RC1 Patch2: pcre-8.37-RC1-Fix-static-linking-issue-with-pkg-config.patch +# Fix JIT on AArch64, in upstream after 8.37-RC1 +Patch3: pcre-8.37-RC1-Fix-ARM64-SP-alignment-issue-in-JIT.patch BuildRequires: readline-devel # New libtool to get rid of rpath BuildRequires: autoconf, automake, libtool @@ -74,6 +76,7 @@ Utilities demonstrating PCRE capabilities like pcregrep or pcretest. %patch0 -p1 -b .multilib %patch1 -p1 -b .terminated_typos %patch2 -p1 -b .static_linking +%patch3 -p1 -b .aarch64_jit # Because of rpath patch libtoolize --copy --force && autoreconf -vif # One contributor's name is non-UTF-8 @@ -89,7 +92,7 @@ done %global optflags %{optflags} -fno-strict-aliasing %endif %configure \ -%ifarch aarch64 s390 s390x sparc64 sparcv9 +%ifarch s390 s390x sparc64 sparcv9 --disable-jit \ %else --enable-jit \ @@ -130,7 +133,7 @@ make %{?_smp_mflags} check VERBOSE=yes %{_mandir}/man3/* %{_bindir}/pcre-config %doc doc/*.txt doc/html -%doc HACKING +%doc HACKING pcredemo.c %files static %{_libdir}/*.a @@ -146,6 +149,8 @@ make %{?_smp_mflags} check VERBOSE=yes %changelog * Thu Apr 23 2015 Petr Pisar - 8.37-0.2.RC1 - Fix static linking (bug #1214494) +- Package pcredemo.c as a documentation for pcre-devel +- Fix JIT on AArch64 * Wed Apr 22 2015 Petr Pisar - 8.37-0.1.RC1 - 8.37 RC1 bump