Hello community,

here is the log from the commit of package ghc for openSUSE:Factory checked in 
at 2017-01-18 21:43:49
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ghc (Old)
 and      /work/SRC/openSUSE:Factory/.ghc.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "ghc"

Changes:
--------
--- /work/SRC/openSUSE:Factory/ghc/ghc.changes  2016-10-19 13:14:34.000000000 
+0200
+++ /work/SRC/openSUSE:Factory/.ghc.new/ghc.changes     2017-01-18 
21:43:51.571161516 +0100
@@ -1,0 +2,6 @@
+Fri Dec 16 08:45:26 UTC 2016 - peter.tromm...@ohm-hochschule.de
+
+- add D2844.patch
+  * fix issues with parallel builds 
+
+-------------------------------------------------------------------

New:
----
  D2844.patch

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ ghc.spec ++++++
--- /var/tmp/diff_new_pack.XCiEkX/_old  2017-01-18 21:43:52.463035366 +0100
+++ /var/tmp/diff_new_pack.XCiEkX/_new  2017-01-18 21:43:52.471034235 +0100
@@ -67,6 +67,8 @@
 Requires:       ghc-libraries = %{version}-%{release}
 Source:         
http://haskell.org/ghc/dist/%{version}/%{name}-%{version}-src.tar.xz
 Source1:        ghc-rpmlintrc
+# PATCH-FIX-UPSTREAM D2844.patch peter.tromm...@ohm-hochschule.de -- Use full 
range of machine word in UniqSupply. Fixes issues with parallel builds. 
Backport of upstream patch. See Haskell Trac #12899.
+Patch1:         D2844.patch
 # PATCH-FIX-UPSTREAM D2495.patch peter.tromm...@ohm-hochschule.de -- Add 
missing memory barrier on mutable variables. See 
https://ghc.haskell.org/trac/ghc/ticket/12469 for details. Backport of upstream 
fix for ghc 8.0.2.
 Patch27:        D2495.patch
 # PATCH-FIX_UPSTREAM 0001-StgCmmPrim-Add-missing-write-barrier.patch 
peter.tromm...@ohm-hochschule.de -- Add missing write barrier on mutable arrays.
@@ -161,6 +163,7 @@
 
 %prep
 %setup -q
+%patch1  -p1
 %patch27 -p1
 %patch28 -p1
 %patch29 -p1

++++++ D2844.patch ++++++
Index: ghc-8.0.1/compiler/Unique.h
===================================================================
--- /dev/null
+++ ghc-8.0.1/compiler/Unique.h
@@ -0,0 +1,3 @@
+#include "../includes/MachDeps.h"
+
+#define UNIQUE_BITS (WORD_SIZE_IN_BITS - 8)
Index: ghc-8.0.1/compiler/basicTypes/UniqSupply.hs
===================================================================
--- ghc-8.0.1.orig/compiler/basicTypes/UniqSupply.hs
+++ ghc-8.0.1/compiler/basicTypes/UniqSupply.hs
@@ -3,7 +3,7 @@
 (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
 -}
 
-{-# LANGUAGE UnboxedTuples #-}
+{-# LANGUAGE CPP, UnboxedTuples #-}
 
 module UniqSupply (
         -- * Main data type
@@ -38,6 +38,8 @@ import Control.Monad
 import Data.Bits
 import Data.Char
 
+#include "Unique.h"
+
 {-
 ************************************************************************
 *                                                                      *
@@ -73,7 +75,7 @@ takeUniqFromSupply :: UniqSupply -> (Uni
 -- ^ Obtain the 'Unique' from this particular 'UniqSupply', and a new supply
 
 mkSplitUniqSupply c
-  = case ord c `shiftL` 24 of
+  = case ord c `shiftL` UNIQUE_BITS of
      mask -> let
         -- here comes THE MAGIC:
 
Index: ghc-8.0.1/compiler/basicTypes/Unique.hs
===================================================================
--- ghc-8.0.1.orig/compiler/basicTypes/Unique.hs
+++ ghc-8.0.1/compiler/basicTypes/Unique.hs
@@ -8,6 +8,7 @@
 comparison key in the compiler.
 
 If there is any single operation that needs to be fast, it is @Unique@
+
 comparison.  Unsurprisingly, there is quite a bit of huff-and-puff
 directed to that end.
 
@@ -62,6 +63,7 @@ module Unique (
     ) where
 
 #include "HsVersions.h"
+#include "Unique.h"
 
 import BasicTypes
 import FastString
@@ -123,6 +125,11 @@ deriveUnique (MkUnique i) delta = mkUniq
 -- newTagUnique changes the "domain" of a unique to a different char
 newTagUnique u c = mkUnique c i where (_,i) = unpkUnique u
 
+-- | How many bits are devoted to the unique index (as opposed to the class
+-- character).
+uniqueMask :: Int
+uniqueMask = (1 `shiftL` UNIQUE_BITS) - 1
+
 -- pop the Char in the top 8 bits of the Unique(Supply)
 
 -- No 64-bit bugs here, as long as we have at least 32 bits. --JSM
@@ -135,15 +142,15 @@ mkUnique :: Char -> Int -> Unique
 mkUnique c i
   = MkUnique (tag .|. bits)
   where
-    tag  = ord c `shiftL` 24
-    bits = i .&. 16777215 {-``0x00ffffff''-}
+    tag  = ord c `shiftL` UNIQUE_BITS
+    bits = i .&. uniqueMask
 
 unpkUnique (MkUnique u)
   = let
         -- as long as the Char may have its eighth bit set, we
         -- really do need the logical right-shift here!
-        tag = chr (u `shiftR` 24)
-        i   = u .&. 16777215 {-``0x00ffffff''-}
+        tag = chr (u `shiftR` UNIQUE_BITS)
+        i   = u .&. uniqueMask
     in
     (tag, i)
 
Index: ghc-8.0.1/compiler/cbits/genSym.c
===================================================================
--- ghc-8.0.1.orig/compiler/cbits/genSym.c
+++ ghc-8.0.1/compiler/cbits/genSym.c
@@ -1,18 +1,35 @@
-
+#include <assert.h>
 #include "Rts.h"
+#include "Unique.h"
 
 static HsInt GenSymCounter = 0;
 static HsInt GenSymInc = 1;
 
+#define UNIQUE_MASK ((1ULL << UNIQUE_BITS) - 1)
+
+STATIC_INLINE void checkUniqueRange(HsInt u STG_UNUSED) {
+#if DEBUG
+    // Uh oh! We will overflow next time a unique is requested.
+    assert(h != UNIQUE_MASK);
+#endif
+}
+
 HsInt genSym(void) {
 #if defined(THREADED_RTS)
     if (n_capabilities == 1) {
-        return GenSymCounter = (GenSymCounter + GenSymInc) & 0xFFFFFF;
+        GenSymCounter = (GenSymCounter + GenSymInc) & UNIQUE_MASK;
+        checkUniqueRange(GenSymCounter);
+        return GenSymCounter;
     } else {
-        return atomic_inc((StgWord *)&GenSymCounter, GenSymInc) & 0xFFFFFF;
+        HsInt n = atomic_inc((StgWord *)&GenSymCounter, GenSymInc)
+          & UNIQUE_MASK;
+        checkUniqueRange(n);
+        return n;
     }
 #else
-    return GenSymCounter = (GenSymCounter + GenSymInc) & 0xFFFFFF;
+    GenSymCounter = (GenSymCounter + GenSymInc) & UNIQUE_MASK;
+    checkUniqueRange(GenSymCounter);
+    return GenSymCounter;
 #endif
 }
 

Reply via email to