From 66c5e18eb1ab578a83a402cd5ce191cc684554f2 Mon Sep 17 00:00:00 2001 From: Paul Howarth Date: Fri, 4 Jun 2021 16:35:56 +0100 Subject: [PATCH] Replace undefined behaviour patch with one from upstream author This patch has been used in debian since 2015 (https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=782841) Drop gcc optimization flags as we can now use the distribution default flags again. --- ...during_aggressive_loop_optimizations.patch | 82 ++++++++++++ Judy-1.0.5-undefined-behavior.patch | 120 ------------------ Judy.spec | 19 +-- 3 files changed, 93 insertions(+), 128 deletions(-) create mode 100644 04_fix_undefined_behavior_during_aggressive_loop_optimizations.patch delete mode 100644 Judy-1.0.5-undefined-behavior.patch diff --git a/04_fix_undefined_behavior_during_aggressive_loop_optimizations.patch b/04_fix_undefined_behavior_during_aggressive_loop_optimizations.patch new file mode 100644 index 0000000..6a74df4 --- /dev/null +++ b/04_fix_undefined_behavior_during_aggressive_loop_optimizations.patch @@ -0,0 +1,82 @@ +Original author Doug Baskins: http://sourceforge.net/p/judy/patches/5/#ba53 + +Andrey Gursky: removed trailing whitespaces and the doubled code line + +--- + src/JudyCommon/JudyPrivateBranch.h | 33 +++++++++++++++++++++------------ + 1 file changed, 21 insertions(+), 12 deletions(-) + +Index: b/src/JudyCommon/JudyPrivateBranch.h +=================================================================== +--- a/src/JudyCommon/JudyPrivateBranch.h ++++ b/src/JudyCommon/JudyPrivateBranch.h +@@ -19,7 +19,7 @@ + // Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + // _________________ + +-// @(#) $Revision: 4.57 $ $Source: /judy/src/JudyCommon/JudyPrivateBranch.h $ ++// @(#) $Revision: 1.2 $ $Source: /home/doug/judy-1.0.5_min/test/../src/JudyCommon/RCS/JudyPrivateBranch.h,v $ + // + // Header file for all Judy sources, for global but private (non-exported) + // declarations specific to branch support. +@@ -55,7 +55,7 @@ typedef struct J_UDY_POINTER_OTHERS + { + Word_t j_po_Addr; // first word: Pjp_t, Word_t, etc. + union { +-// Word_t j_po_DcdPop0:cJU_BITSPERWORD-cJU_BITSPERBYTE; ++ Word_t j_po_Addr1; + uint8_t j_po_DcdP0[sizeof(Word_t) - 1]; + uint8_t j_po_Bytes[sizeof(Word_t)]; // last byte = jp_Type. + } jpo_u; +@@ -78,13 +78,18 @@ typedef struct J_UDY_POINTER_OTHERS + // TBD: Revise this structure to not overload j_po_DcdPopO this way? The + // current arrangement works, its just confusing. + +-typedef struct _JUDY_POINTER_IMMED // JPI. ++typedef struct _JUDY_POINTER_IMMEDL + { +- uint8_t j_pi_1Index[sizeof(Word_t)]; // see above. +- uint8_t j_pi_LIndex[sizeof(Word_t) - 1]; // see above. +- uint8_t j_pi_Type; // JP type, 1 of cJ*_JPIMMED*. +- } jpi_t; ++ Word_t j_pL_Addr; ++ uint8_t j_pL_LIndex[sizeof(Word_t) - 1]; // see above. ++ uint8_t j_pL_Type; ++ } jpL_t; + ++typedef struct _JUDY_POINTER_IMMED1 ++ { ++ uint8_t j_p1_1Index[(2 * sizeof(Word_t)) - 1]; ++ uint8_t j_p1_Type; ++ } jp1_t; + + // UNION OF JP TYPES: + // +@@ -96,18 +101,22 @@ typedef struct _JUDY_POINTER_IMMED + typedef union J_UDY_POINTER // JP. + { + jpo_t j_po; // other than immediate indexes. +- jpi_t j_pi; // immediate indexes. ++ jpL_t j_pL; // immediate indexes. ++ jp1_t j_p1; // immediate indexes. + } jp_t, *Pjp_t; + + // For coding convenience: + // +-// Note, jp_Type has the same bits in jpo_t and jpi_t. ++// Note, jp_Type has the same bits in jpo_t jpL_t and jp1_t. + +-#define jp_1Index j_pi.j_pi_1Index // for storing Indexes in first word. +-#define jp_LIndex j_pi.j_pi_LIndex // for storing Indexes in second word. ++#define jp_1Index j_p1.j_p1_1Index // for storing Indexes in first word. ++#define jp_LIndex j_pL.j_pL_LIndex // for storing Indexes in second word. + #define jp_Addr j_po.j_po_Addr ++#define jp_Addr1 j_po.jpo_u.j_po_Addr1 + //#define jp_DcdPop0 j_po.jpo_u.j_po_DcdPop0 +-#define jp_Type j_po.jpo_u.j_po_Bytes[sizeof(Word_t) - 1] ++#define jp_Addr1 j_po.jpo_u.j_po_Addr1 ++//#define jp_Type j_po.jpo_u.j_po_Bytes[sizeof(Word_t) - 1] ++#define jp_Type j_p1.j_p1_Type + #define jp_DcdP0 j_po.jpo_u.j_po_DcdP0 + + diff --git a/Judy-1.0.5-undefined-behavior.patch b/Judy-1.0.5-undefined-behavior.patch deleted file mode 100644 index e8741d0..0000000 --- a/Judy-1.0.5-undefined-behavior.patch +++ /dev/null @@ -1,120 +0,0 @@ -diff -crb judy-1.0.5-orig/src/JudyCommon/JudyByCount.c judy-1.0.5/src/JudyCommon/JudyByCount.c -*** judy-1.0.5-orig/src/JudyCommon/JudyByCount.c 2005-02-15 15:06:07.000000000 -0600 ---- judy-1.0.5/src/JudyCommon/JudyByCount.c 2014-02-18 13:45:35.225145230 -0600 -*************** -*** 817,823 **** - // Shorthand for where to find start of Index bytes array: - - #ifdef JUDY1 -! #define PJI (Pjp->jp_1Index) - #else - #define PJI (Pjp->jp_LIndex) - #endif ---- 817,823 ---- - // Shorthand for where to find start of Index bytes array: - - #ifdef JUDY1 -! #define PJI (Pjp->jp_2Index) - #else - #define PJI (Pjp->jp_LIndex) - #endif -diff -crb judy-1.0.5-orig/src/JudyCommon/JudyGet.c judy-1.0.5/src/JudyCommon/JudyGet.c -*** judy-1.0.5-orig/src/JudyCommon/JudyGet.c 2005-02-15 15:06:07.000000000 -0600 ---- judy-1.0.5/src/JudyCommon/JudyGet.c 2014-02-18 13:49:50.840632644 -0600 -*************** -*** 630,636 **** - #ifdef JUDY1 - - #define CHECKINDEXNATIVE(LEAF_T, PJP, IDX, INDEX) \ -! if (((LEAF_T *)((PJP)->jp_1Index))[(IDX) - 1] == (LEAF_T)(INDEX)) \ - return(1) - - #define CHECKLEAFNONNAT(LFBTS, PJP, INDEX, IDX, COPY) \ ---- 630,636 ---- - #ifdef JUDY1 - - #define CHECKINDEXNATIVE(LEAF_T, PJP, IDX, INDEX) \ -! if (((LEAF_T *)((PJP)->jp_2Index))[(IDX) - 1] == (LEAF_T)(INDEX)) \ - return(1) - - #define CHECKLEAFNONNAT(LFBTS, PJP, INDEX, IDX, COPY) \ -diff -crb judy-1.0.5-orig/src/JudyCommon/JudyIns.c judy-1.0.5/src/JudyCommon/JudyIns.c -*** judy-1.0.5-orig/src/JudyCommon/JudyIns.c 2005-02-15 15:06:07.000000000 -0600 ---- judy-1.0.5/src/JudyCommon/JudyIns.c 2014-02-18 13:00:49.871850635 -0600 -*************** -*** 1503,1509 **** - JU_BITMAPSETL(Pjlb, Index); - - for (offset = 0; offset < 15; ++offset) -! JU_BITMAPSETL(Pjlb, Pjp->jp_1Index[offset]); - - // Set jp_DcdPopO including the current pop0; incremented later: - DcdP0 = (Index & cJU_DCDMASK(1)) + 15 - 1; ---- 1503,1510 ---- - JU_BITMAPSETL(Pjlb, Index); - - for (offset = 0; offset < 15; ++offset) -! // JU_BITMAPSETL(Pjlb, Pjp->jp_1Index[offset]); // elements 8..15 are optimized out by gcc, so need to do the following -! JU_BITMAPSETL(Pjlb, Pjp->jp_2Index[offset]); - - // Set jp_DcdPopO including the current pop0; incremented later: - DcdP0 = (Index & cJU_DCDMASK(1)) + 15 - 1; -diff -crb judy-1.0.5-orig/src/JudyCommon/JudyPrevNext.c judy-1.0.5/src/JudyCommon/JudyPrevNext.c -*** judy-1.0.5-orig/src/JudyCommon/JudyPrevNext.c 2005-02-15 15:06:07.000000000 -0600 ---- judy-1.0.5/src/JudyCommon/JudyPrevNext.c 2014-02-18 13:45:40.972875737 -0600 -*************** -*** 907,913 **** - // Shorthand for where to find start of Index bytes array: - - #ifdef JUDY1 -! #define PJI (Pjp->jp_1Index) - #else - #define PJI (Pjp->jp_LIndex) - #endif ---- 907,913 ---- - // Shorthand for where to find start of Index bytes array: - - #ifdef JUDY1 -! #define PJI (Pjp->jp_2Index) - #else - #define PJI (Pjp->jp_LIndex) - #endif -diff -crb judy-1.0.5-orig/src/JudyCommon/JudyPrivateBranch.h judy-1.0.5/src/JudyCommon/JudyPrivateBranch.h -*** judy-1.0.5-orig/src/JudyCommon/JudyPrivateBranch.h 2005-02-15 15:06:07.000000000 -0600 ---- judy-1.0.5/src/JudyCommon/JudyPrivateBranch.h 2014-02-18 13:00:39.510533765 -0600 -*************** -*** 86,91 **** ---- 86,98 ---- - } jpi_t; - - -+ typedef struct _JUDY_POINTER_IMMED2 // JPI2. -+ { -+ uint8_t j_pi_2Index[2 * sizeof(Word_t) - 1]; // see above. -+ uint8_t j_pi_Type; // JP type, 1 of cJ*_JPIMMED*. -+ } jpi2_t; -+ -+ - // UNION OF JP TYPES: - // - // A branch is an array of cJU_BRANCHUNUMJPS (256) of this object, or an -*************** -*** 97,102 **** ---- 104,110 ---- - { - jpo_t j_po; // other than immediate indexes. - jpi_t j_pi; // immediate indexes. -+ jpi2_t j_pi2; // immediate indexes using j_pi_LIndex as well - } jp_t, *Pjp_t; - - // For coding convenience: -*************** -*** 105,110 **** ---- 113,119 ---- - - #define jp_1Index j_pi.j_pi_1Index // for storing Indexes in first word. - #define jp_LIndex j_pi.j_pi_LIndex // for storing Indexes in second word. -+ #define jp_2Index j_pi2.j_pi_2Index // for storing Indexes spanning both words. - #define jp_Addr j_po.j_po_Addr - //#define jp_DcdPop0 j_po.jpo_u.j_po_DcdPop0 - #define jp_Type j_po.jpo_u.j_po_Bytes[sizeof(Word_t) - 1] diff --git a/Judy.spec b/Judy.spec index 3b1b058..4ce3da7 100644 --- a/Judy.spec +++ b/Judy.spec @@ -1,6 +1,6 @@ Name: Judy Version: 1.0.5 -Release: 25%{?dist} +Release: 26%{?dist} Summary: General purpose dynamic array License: LGPLv2+ URL: http://sourceforge.net/projects/judy/ @@ -8,7 +8,7 @@ Source0: http://downloads.sf.net/judy/Judy-%{version}.tar.gz Source1: README.Fedora Patch0: Judy-1.0.4-test-shared.patch Patch1: Judy-1.0.4-fix-Judy1-mans.patch -Patch2: Judy-1.0.5-undefined-behavior.patch +Patch2: 04_fix_undefined_behavior_during_aggressive_loop_optimizations.patch BuildRequires: coreutils BuildRequires: gawk BuildRequires: gcc >= 4.1 @@ -45,18 +45,14 @@ for developing applications that use the Judy library. %patch1 -p1 -b .fix-Judy1-mans # Fix some code with undefined behavior, commented on and removed by gcc +# https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=782841 %patch2 -p1 -b .behavior # README.Fedora cp -p %{SOURCE1} . %build -%set_build_flags -case "%{__cc}" in -gcc) COMPILER_SPECIFIC_FLAGS="-fno-strict-aliasing -fno-tree-ccp -fno-tree-dominator-opts -fno-tree-copy-prop -fno-tree-vrp";; -*) COMPILER_SPECIFIC_FLAGS="-fno-strict-aliasing";; -esac -export CFLAGS="%{optflags} $COMPILER_SPECIFIC_FLAGS" +export CFLAGS="%{optflags} -fno-strict-aliasing" %configure --disable-static make #%{?_smp_mflags} @@ -91,6 +87,13 @@ cd - %{_mandir}/man3/J*.3* %changelog +* Fri Jun 4 2021 Paul Howarth - 1.0.5-26 +- Replace undefined behaviour patch with one from upstream author, as used + in debian since 2015 + (https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=782841) +- Drop gcc optimization flags as we can now use the distribution default + flags again + * Mon Jan 25 2021 Fedora Release Engineering - 1.0.5-25 - Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild