[project @ 1999-05-26 14:12:07 by simonmar]
[ghc-hetmet.git] / ghc / compiler / basicTypes / Unique.lhs
index e097564..604a980 100644 (file)
@@ -1,7 +1,6 @@
 %
-% (c) The GRASP/AQUA Project, Glasgow University, 1992-1996
+% (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
 %
-\section[Unique]{The @Unique@ data type}
 
 @Uniques@ are used to distinguish entities in the compiler (@Ids@,
 @Classes@, etc.) from each other.  Thus, @Uniques@ are the basic
@@ -16,25 +15,32 @@ Some of the other hair in this code is to be able to use a
 Haskell).
 
 \begin{code}
-#include "HsVersions.h"
-
---<mkdependHS:friends> UniqSupply
-
 module Unique (
-       Unique,
+       Unique, Uniquable(..),
        u2i,                            -- hack: used in UniqFM
 
-       pprUnique, pprUnique10, showUnique,
+       pprUnique, pprUnique10,
 
        mkUnique,                       -- Used in UniqSupply
        mkUniqueGrimily,                -- Used in UniqSupply only!
+       getKey,                         -- Used in Var only!
+
+       incrUnique,                     -- Used for renumbering
+       deriveUnique,                   -- Ditto
+       initTyVarUnique,
+       initTidyUniques,
 
        -- now all the built-in Uniques (and functions to make them)
        -- [the Oh-So-Wonderful Haskell module system wins again...]
        mkAlphaTyVarUnique,
        mkPrimOpIdUnique,
        mkTupleDataConUnique,
+       mkUbxTupleDataConUnique,
        mkTupleTyConUnique,
+       mkUbxTupleTyConUnique,
+
+       getBuiltinUniques, mkBuiltinUnique,
+       mkPseudoUnique1, mkPseudoUnique2, mkPseudoUnique3,
 
        absentErrorIdKey,       -- alphabetical...
        addrDataConKey,
@@ -42,18 +48,23 @@ module Unique (
        addrTyConKey,
        appendIdKey,
        arrayPrimTyConKey,
+       assertIdKey,
        augmentIdKey,
-       binaryClassKey,
+       bindIOIdKey,
        boolTyConKey,
-       buildDataConKey,
+       boundedClassKey,
+       boxedConKey,
        buildIdKey,
        byteArrayPrimTyConKey,
+       byteArrayTyConKey,
        cCallableClassKey,
        cReturnableClassKey,
        charDataConKey,
        charPrimTyConKey,
        charTyConKey,
+       concatIdKey,
        consDataConKey,
+       deRefStablePtrIdKey,
        doubleDataConKey,
        doublePrimTyConKey,
        doubleTyConKey,
@@ -64,58 +75,71 @@ module Unique (
        enumFromToClassOpKey,
        eqClassKey,
        eqClassOpKey,
-       eqDataConKey,
        errorIdKey,
        falseDataConKey,
+       failMClassOpKey,
+       filterIdKey,
        floatDataConKey,
        floatPrimTyConKey,
        floatTyConKey,
        floatingClassKey,
        foldlIdKey,
        foldrIdKey,
-       forkIdKey,
+       foreignObjDataConKey,
+       foreignObjPrimTyConKey,
+       foreignObjTyConKey,
        fractionalClassKey,
+       fromEnumClassOpKey,
        fromIntClassOpKey,
        fromIntegerClassOpKey,
        fromRationalClassOpKey,
        funTyConKey,
+       functorClassKey,
        geClassOpKey,
-       gtDataConKey,
-       iOTyConKey,
+       getTagIdKey,
        intDataConKey,
        intPrimTyConKey,
        intTyConKey,
-       integerDataConKey,
+       int8TyConKey,
+       int16TyConKey,
+       int32TyConKey,
+       int64PrimTyConKey,
+       int64TyConKey,
+       smallIntegerDataConKey,
+       largeIntegerDataConKey,
        integerMinusOneIdKey,
        integerPlusOneIdKey,
        integerPlusTwoIdKey,
+       int2IntegerIdKey,
+       addr2IntegerIdKey,
        integerTyConKey,
        integerZeroIdKey,
        integralClassKey,
+       irrefutPatErrorIdKey,
        ixClassKey,
-       liftDataConKey,
-       liftTyConKey,
        listTyConKey,
-       ltDataConKey,
-       mainIdKey,
-       mainPrimIOIdKey,
-       mallocPtrDataConKey,
-       mallocPtrPrimTyConKey,
-       mallocPtrTyConKey,
+       mainKey,
+       makeStablePtrIdKey,
+       mapIdKey,
+       minusClassOpKey,
        monadClassKey,
-       monadZeroClassKey,
+       monadPlusClassKey,
        mutableArrayPrimTyConKey,
        mutableByteArrayPrimTyConKey,
-       negateClassOpKey,
+       mutableByteArrayTyConKey,
+       mutVarPrimTyConKey,
        nilDataConKey,
+       noMethodBindingErrorIdKey,
+       nonExhaustiveGuardsErrorIdKey,
        numClassKey,
+       anyBoxConKey,
        ordClassKey,
        orderingTyConKey,
+       otherwiseIdKey,
        packCStringIdKey,
        parErrorIdKey,
        parIdKey,
        patErrorIdKey,
-       primIoTyConKey,
        ratioDataConKey,
        ratioTyConKey,
        rationalTyConKey,
@@ -125,76 +149,59 @@ module Unique (
        realFracClassKey,
        realWorldPrimIdKey,
        realWorldTyConKey,
-       return2GMPsDataConKey,
-       return2GMPsTyConKey,
-       returnIntAndGMPDataConKey,
-       returnIntAndGMPTyConKey,
-       runSTIdKey,
-       seqIdKey,
+       recConErrorIdKey,
+       recSelErrIdKey,
+       recUpdErrorIdKey,
+       returnMClassOpKey,
+       runSTRepIdKey,
        showClassKey,
-       stTyConKey,
+       ioTyConKey,
+       ioDataConKey,
        stablePtrDataConKey,
        stablePtrPrimTyConKey,
        stablePtrTyConKey,
-       stateAndAddrPrimDataConKey,
-       stateAndAddrPrimTyConKey,
-       stateAndArrayPrimDataConKey,
-       stateAndArrayPrimTyConKey,
-       stateAndByteArrayPrimDataConKey,
-       stateAndByteArrayPrimTyConKey,
-       stateAndCharPrimDataConKey,
-       stateAndCharPrimTyConKey,
-       stateAndDoublePrimDataConKey,
-       stateAndDoublePrimTyConKey,
-       stateAndFloatPrimDataConKey,
-       stateAndFloatPrimTyConKey,
-       stateAndIntPrimDataConKey,
-       stateAndIntPrimTyConKey,
-       stateAndMallocPtrPrimDataConKey,
-       stateAndMallocPtrPrimTyConKey,
-       stateAndMutableArrayPrimDataConKey,
-       stateAndMutableArrayPrimTyConKey,
-       stateAndMutableByteArrayPrimDataConKey,
-       stateAndMutableByteArrayPrimTyConKey,
-       stateAndPtrPrimDataConKey,
-       stateAndPtrPrimTyConKey,
-       stateAndStablePtrPrimDataConKey,
-       stateAndStablePtrPrimTyConKey,
-       stateAndSynchVarPrimDataConKey,
-       stateAndSynchVarPrimTyConKey,
-       stateAndWordPrimDataConKey,
-       stateAndWordPrimTyConKey,
-       stateDataConKey,
+       stableNameDataConKey,
+       stableNamePrimTyConKey,
+       stableNameTyConKey,
+
        statePrimTyConKey,
-       stateTyConKey,
-       stringTyConKey,
-       synchVarPrimTyConKey,
+       typeConKey,
+       kindConKey,
+       boxityConKey,
+       mVarPrimTyConKey,
+       thenMClassOpKey,
+       threadIdPrimTyConKey,
+       toEnumClassOpKey,
        traceIdKey,
        trueDataConKey,
+       unboundKey,
+       unboxedConKey,
        unpackCString2IdKey,
        unpackCStringAppendIdKey,
        unpackCStringFoldrIdKey,
        unpackCStringIdKey,
-       voidPrimIdKey,
-       voidPrimTyConKey,
+       unsafeCoerceIdKey,
+       ushowListIdKey,
+       weakPrimTyConKey,
        wordDataConKey,
        wordPrimTyConKey,
-       wordTyConKey
-#ifdef GRAN
-       , copyableIdKey
-       , noFollowIdKey
-       , parGlobalIdKey
-       , parLocalIdKey
-#endif
-       -- to make interface self-sufficient
+       wordTyConKey,
+       word8TyConKey,
+       word16TyConKey,
+       word32TyConKey,
+       word64PrimTyConKey,
+       word64TyConKey,
+       zipIdKey
     ) where
 
-import PreludeGlaST
+#include "HsVersions.h"
 
-import Ubiq{-uitous-}
+import FastString      ( FastString, uniqueOfFS )
+import GlaExts
+import ST
+import PrelBase ( Char(..), chr, ord )
 
-import Pretty
-import Util
+import Outputable
 \end{code}
 
 %************************************************************************
@@ -207,9 +214,11 @@ The @Chars@ are ``tag letters'' that identify the @UniqueSupply@.
 Fast comparison is everything on @Uniques@:
 
 \begin{code}
-u2i :: Unique -> FAST_INT
-
 data Unique = MkUnique Int#
+\end{code}
+
+\begin{code}
+u2i :: Unique -> FAST_INT
 u2i (MkUnique i) = i
 \end{code}
 
@@ -217,25 +226,29 @@ Now come the functions which construct uniques from their pieces, and vice versa
 The stuff about unique *supplies* is handled further down this module.
 
 \begin{code}
-mkUnique                :: Char -> Int -> Unique       -- Builds a unique from pieces
-unpkUnique              :: Unique -> (Char, Int)       -- The reverse
-
-mkUnifiableTyVarUnique  :: Int -> Unique       -- Injects a subst-array index into the Unique type
-unpkUnifiableTyVarUnique :: Unique -> Int      -- The reverse process
+mkUnique       :: Char -> Int -> Unique        -- Builds a unique from pieces
+unpkUnique     :: Unique -> (Char, Int)        -- The reverse
 
 mkUniqueGrimily :: Int# -> Unique              -- A trap-door for UniqSupply
+
+getKey         :: Unique -> Int#               -- for Var
+
+incrUnique     :: Unique -> Unique
+deriveUnique   :: Unique -> Int -> Unique
 \end{code}
 
 
 \begin{code}
 mkUniqueGrimily x = MkUnique x
 
-mkUnifiableTyVarUnique i = mkUnique '_'{-MAGIC CHAR-} i
+{-# INLINE getKey #-}
+getKey (MkUnique x) = x
+
+incrUnique (MkUnique i) = MkUnique (i +# 1#)
 
-unpkUnifiableTyVarUnique uniq
-  = case (unpkUnique uniq) of { (tag, i) ->
-    ASSERT(tag == '_'{-MAGIC CHAR-})
-    i }
+-- deriveUnique uses an 'X' tag so that it won't clash with
+-- any of the uniques produced any other way
+deriveUnique (MkUnique i) delta = mkUnique 'X' (I# i + delta)
 
 -- pop the Char in the top 8 bits of the Unique(Supply)
 
@@ -245,19 +258,42 @@ w2i x = word2Int# x
 i2w x = int2Word# x
 i2w_s x = (x::Int#)
 
-mkUnique (MkChar c#) (MkInt i#)
-  = MkUnique (w2i (((i2w (ord# c#)) `shiftL#` (i2w_s 24#)) `or#` (i2w i#)))
+mkUnique (C# c) (I# i)
+  = MkUnique (w2i (tag `or#` bits))
+  where
+    tag  = i2w (ord# c) `shiftL#` i2w_s 24#
+    bits = i2w i `and#` (i2w 16777215#){-``0x00ffffff''-}
 
 unpkUnique (MkUnique u)
   = let
-       tag = MkChar (chr# (w2i ((i2w u) `shiftr` (i2w_s 24#))))
-       i   = MkInt  (w2i ((i2w u) `and#` (i2w 16777215#){-``0x00ffffff''-}))
+       tag = C# (chr# (w2i ((i2w u) `shiftr` (i2w_s 24#))))
+       i   = I# (w2i ((i2w u) `and#` (i2w 16777215#){-``0x00ffffff''-}))
     in
     (tag, i)
   where
-    shiftr x y = shiftRA# x y
+    shiftr x y = shiftRL# x y
+\end{code}
+
+
+
+%************************************************************************
+%*                                                                     *
+\subsection[Uniquable-class]{The @Uniquable@ class}
+%*                                                                     *
+%************************************************************************
+
+\begin{code}
+class Uniquable a where
+    getUnique :: a -> Unique
+
+instance Uniquable FastString where
+ getUnique fs = mkUniqueGrimily (uniqueOfFS fs)
+
+instance Uniquable Int where
+ getUnique (I# i#) = mkUniqueGrimily i#
 \end{code}
 
+
 %************************************************************************
 %*                                                                     *
 \subsection[Unique-instances]{Instance declarations for @Unique@}
@@ -274,7 +310,7 @@ ltUnique (MkUnique u1) (MkUnique u2) = u1 <#  u2
 leUnique (MkUnique u1) (MkUnique u2) = u1 <=# u2
 
 cmpUnique (MkUnique u1) (MkUnique u2)
-  = if u1 ==# u2 then EQ_ else if u1 <# u2 then LT_ else GT_
+  = if u1 ==# u2 then EQ else if u1 <# u2 then LT else GT
 
 instance Eq Unique where
     a == b = eqUnique a b
@@ -285,37 +321,36 @@ instance Ord Unique where
     a <= b = leUnique a b
     a  > b = not (leUnique a b)
     a >= b = not (ltUnique a b)
-    _tagCmp a b = case cmpUnique a b of { LT_ -> _LT; EQ_ -> _EQ; GT__ -> _GT }
-
-instance Ord3 Unique where
-    cmp = cmpUnique
+    compare a b = cmpUnique a b
 
+-----------------
+instance Uniquable Unique where
+    getUnique u = u
 \end{code}
 
 We do sometimes make strings with @Uniques@ in them:
 \begin{code}
-pprUnique, pprUnique10 :: Unique -> Pretty
+pprUnique, pprUnique10 :: Unique -> SDoc
 
 pprUnique uniq
   = case unpkUnique uniq of
-      (tag, u) -> ppBeside (ppChar tag) (iToBase62 u)
+      (tag, u) -> finish_ppr tag u (iToBase62 u)
 
 pprUnique10 uniq       -- in base-10, dudes
   = case unpkUnique uniq of
-      (tag, u) -> ppBeside (ppChar tag) (ppInt u)
+      (tag, u) -> finish_ppr tag u (int u)
 
-showUnique :: Unique -> FAST_STRING
-showUnique uniq = _PK_ (ppShow 80 (pprUnique uniq))
+finish_ppr 't' u pp_u | u < 26
+  =    -- Special case to make v common tyvars, t1, t2, ...
+       -- come out as a, b, ... (shorter, easier to read)
+    char (chr (ord 'a' + u))
+finish_ppr tag u pp_u = char tag <> pp_u
 
 instance Outputable Unique where
-    ppr sty u = pprUnique u
+    ppr u = pprUnique u
 
-instance Text Unique where
-    showsPrec p uniq rest = _UNPK_ (showUnique uniq)
-    readsPrec p = panic "no readsPrec for Unique"
-
-instance NamedThing Unique where
-    getItsUnique u = u
+instance Show Unique where
+    showsPrec p uniq = showsPrecSDoc p (pprUnique uniq)
 \end{code}
 
 %************************************************************************
@@ -328,36 +363,42 @@ A character-stingy way to read/write numbers (notably Uniques).
 The ``62-its'' are \tr{[0-9a-zA-Z]}.  We don't handle negative Ints.
 Code stolen from Lennart.
 \begin{code}
-iToBase62 :: Int -> Pretty
+# define BYTE_ARRAY GlaExts.ByteArray
+# define RUN_ST            ST.runST
+# define AND_THEN   >>=
+# define AND_THEN_  >>
+# define RETURN            return
+
+iToBase62 :: Int -> SDoc
 
 iToBase62 n@(I# n#)
   = ASSERT(n >= 0)
     let
-       bytes = case chars62 of { _ByteArray bounds_who_needs_'em bytes -> bytes }
+       bytes = case chars62 of { BYTE_ARRAY bounds_who_needs_'em bytes -> bytes }
     in
     if n# <# 62# then
        case (indexCharArray# bytes n#) of { c ->
-       ppChar (C# c) }
+       char (C# c) }
     else
        case (quotRem n 62)             of { (q, I# r#) ->
        case (indexCharArray# bytes r#) of { c  ->
-       ppBeside (iToBase62 q) (ppChar (C# c)) }}
+       (<>) (iToBase62 q) (char (C# c)) }}
 
 -- keep this at top level! (bug on 94/10/24 WDP)
-chars62 :: _ByteArray Int
+chars62 :: BYTE_ARRAY Int
 chars62
-  = _runST (
-       newCharArray (0, 61)    `thenStrictlyST` \ ch_array ->
+  = RUN_ST (
+       newCharArray (0, 61)    AND_THEN \ ch_array ->
        fill_in ch_array 0 62 "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
-                               `seqStrictlyST`
+                               AND_THEN_
        unsafeFreezeByteArray ch_array
     )
   where
     fill_in ch_array i lim str
       | i == lim
-      = returnStrictlyST ()
+      = RETURN ()
       | otherwise
-      = writeCharArray ch_array i (str !! i)   `seqStrictlyST`
+      = writeCharArray ch_array i (str !! i)   AND_THEN_
        fill_in ch_array (i+1) lim str
 \end{code}
 
@@ -368,24 +409,48 @@ chars62
 %************************************************************************
 
 Allocation of unique supply characters:
-       a-z: lower case chars for unique supplies (see Main.lhs)
-       B:   builtin            (see UniqSupply.lhs)
-       C-E: pseudo uniques     (see UniqSupply.lhs)
+       v,t,u : for renumbering value-, type- and usage- vars.
+       other a-z: lower case chars for unique supplies (see Main.lhs)
+       B:   builtin
+       C-E: pseudo uniques     (used in native-code generator)
+       X:   uniques derived by deriveUnique
        _:   unifiable tyvars   (above)
-       1-8: prelude things below
+       0-9: prelude things below
 
 \begin{code}
-mkAlphaTyVarUnique i           = mkUnique '1' i
+mkAlphaTyVarUnique i            = mkUnique '1' i
 
 mkPreludeClassUnique i         = mkUnique '2' i
 mkPreludeTyConUnique i         = mkUnique '3' i
 mkTupleTyConUnique a           = mkUnique '4' a
+mkUbxTupleTyConUnique a                = mkUnique '5' a
+
+mkPreludeDataConUnique i       = mkUnique '6' i -- must be alphabetic
+mkTupleDataConUnique a         = mkUnique '7' a -- ditto (*may* be used in C labels)
+mkUbxTupleDataConUnique a      = mkUnique '8' a
 
-mkPreludeDataConUnique i       = mkUnique '5' i        -- must be alphabetic
-mkTupleDataConUnique a         = mkUnique '6' a        -- ditto (*may* be used in C labels)
+mkPrimOpIdUnique op            = mkUnique '9' op
+mkPreludeMiscIdUnique i                = mkUnique '0' i
 
-mkPrimOpIdUnique op            = mkUnique '7' op
-mkPreludeMiscIdUnique i                = mkUnique '8' i
+-- The "tyvar uniques" print specially nicely: a, b, c, etc.
+-- See pprUnique for details
+
+initTyVarUnique :: Unique
+initTyVarUnique = mkUnique 't' 0
+
+initTidyUniques :: (Unique, Unique)    -- Global and local
+initTidyUniques = (mkUnique 'g' 0, mkUnique 'x' 0)
+
+mkPseudoUnique1, mkPseudoUnique2, mkPseudoUnique3,
+ mkBuiltinUnique :: Int -> Unique
+
+mkBuiltinUnique i = mkUnique 'B' i
+mkPseudoUnique1 i = mkUnique 'C' i -- used for getUnique on Regs
+mkPseudoUnique2 i = mkUnique 'D' i -- ditto
+mkPseudoUnique3 i = mkUnique 'E' i -- ditto
+
+getBuiltinUniques :: Int -> [Unique]
+getBuiltinUniques n = map (mkUnique 'B') [1 .. n]
 \end{code}
 
 %************************************************************************
@@ -395,24 +460,27 @@ mkPreludeMiscIdUnique i           = mkUnique '8' i
 %************************************************************************
 
 \begin{code}
-eqClassKey             = mkPreludeClassUnique 1
-ordClassKey            = mkPreludeClassUnique 2
-numClassKey            = mkPreludeClassUnique 3
-integralClassKey       = mkPreludeClassUnique 4
-fractionalClassKey     = mkPreludeClassUnique 5
-floatingClassKey       = mkPreludeClassUnique 6
-realClassKey           = mkPreludeClassUnique 7
-realFracClassKey       = mkPreludeClassUnique 8
-realFloatClassKey      = mkPreludeClassUnique 9
-ixClassKey             = mkPreludeClassUnique 10
-enumClassKey           = mkPreludeClassUnique 11
-showClassKey           = mkPreludeClassUnique 12
+boundedClassKey                = mkPreludeClassUnique 1 
+enumClassKey           = mkPreludeClassUnique 2 
+eqClassKey             = mkPreludeClassUnique 3 
+floatingClassKey       = mkPreludeClassUnique 5 
+fractionalClassKey     = mkPreludeClassUnique 6 
+integralClassKey       = mkPreludeClassUnique 7 
+monadClassKey          = mkPreludeClassUnique 8 
+monadPlusClassKey      = mkPreludeClassUnique 9
+functorClassKey                = mkPreludeClassUnique 10
+numClassKey            = mkPreludeClassUnique 11
+ordClassKey            = mkPreludeClassUnique 12
 readClassKey           = mkPreludeClassUnique 13
-monadClassKey          = mkPreludeClassUnique 14
-monadZeroClassKey      = mkPreludeClassUnique 15
-binaryClassKey         = mkPreludeClassUnique 16
-cCallableClassKey      = mkPreludeClassUnique 17       
-cReturnableClassKey    = mkPreludeClassUnique 18
+realClassKey           = mkPreludeClassUnique 14
+realFloatClassKey      = mkPreludeClassUnique 15
+realFracClassKey       = mkPreludeClassUnique 16
+showClassKey           = mkPreludeClassUnique 17
+                                              
+cCallableClassKey      = mkPreludeClassUnique 18
+cReturnableClassKey    = mkPreludeClassUnique 19
+
+ixClassKey             = mkPreludeClassUnique 20
 \end{code}
 
 %************************************************************************
@@ -434,47 +502,48 @@ doubleTyConKey                            = mkPreludeTyConUnique 10
 floatPrimTyConKey                      = mkPreludeTyConUnique 11
 floatTyConKey                          = mkPreludeTyConUnique 12
 funTyConKey                            = mkPreludeTyConUnique 13
-iOTyConKey                             = mkPreludeTyConUnique 14
-intPrimTyConKey                                = mkPreludeTyConUnique 15
-intTyConKey                            = mkPreludeTyConUnique 16
-integerTyConKey                                = mkPreludeTyConUnique 17
-liftTyConKey                           = mkPreludeTyConUnique 18
-listTyConKey                           = mkPreludeTyConUnique 19
-mallocPtrPrimTyConKey                  = mkPreludeTyConUnique 20
-mallocPtrTyConKey                      = mkPreludeTyConUnique 21
-mutableArrayPrimTyConKey               = mkPreludeTyConUnique 22
-mutableByteArrayPrimTyConKey           = mkPreludeTyConUnique 23
-orderingTyConKey                       = mkPreludeTyConUnique 24
-synchVarPrimTyConKey                   = mkPreludeTyConUnique 25
-ratioTyConKey                          = mkPreludeTyConUnique 26
-rationalTyConKey                       = mkPreludeTyConUnique 27
-realWorldTyConKey                      = mkPreludeTyConUnique 28
-return2GMPsTyConKey                    = mkPreludeTyConUnique 29
-returnIntAndGMPTyConKey                        = mkPreludeTyConUnique 30
-stablePtrPrimTyConKey                  = mkPreludeTyConUnique 31
-stablePtrTyConKey                      = mkPreludeTyConUnique 32
-stateAndAddrPrimTyConKey               = mkPreludeTyConUnique 33
-stateAndArrayPrimTyConKey              = mkPreludeTyConUnique 34
-stateAndByteArrayPrimTyConKey          = mkPreludeTyConUnique 35
-stateAndCharPrimTyConKey               = mkPreludeTyConUnique 36
-stateAndDoublePrimTyConKey             = mkPreludeTyConUnique 37
-stateAndFloatPrimTyConKey              = mkPreludeTyConUnique 38
-stateAndIntPrimTyConKey                        = mkPreludeTyConUnique 39
-stateAndMallocPtrPrimTyConKey          = mkPreludeTyConUnique 40
-stateAndMutableArrayPrimTyConKey       = mkPreludeTyConUnique 41
-stateAndMutableByteArrayPrimTyConKey   = mkPreludeTyConUnique 42
-stateAndSynchVarPrimTyConKey           = mkPreludeTyConUnique 43
-stateAndPtrPrimTyConKey                        = mkPreludeTyConUnique 44
-stateAndStablePtrPrimTyConKey          = mkPreludeTyConUnique 45
-stateAndWordPrimTyConKey               = mkPreludeTyConUnique 46
-statePrimTyConKey                      = mkPreludeTyConUnique 47
-stateTyConKey                          = mkPreludeTyConUnique 48
-stringTyConKey                         = mkPreludeTyConUnique 49
-stTyConKey                             = mkPreludeTyConUnique 50
-primIoTyConKey                         = mkPreludeTyConUnique 51
-voidPrimTyConKey                       = mkPreludeTyConUnique 52
-wordPrimTyConKey                       = mkPreludeTyConUnique 53
-wordTyConKey                           = mkPreludeTyConUnique 54
+intPrimTyConKey                                = mkPreludeTyConUnique 14
+intTyConKey                            = mkPreludeTyConUnique 15
+int8TyConKey                           = mkPreludeTyConUnique 16
+int16TyConKey                          = mkPreludeTyConUnique 17
+int32TyConKey                          = mkPreludeTyConUnique 18
+int64PrimTyConKey                      = mkPreludeTyConUnique 19
+int64TyConKey                          = mkPreludeTyConUnique 20
+integerTyConKey                                = mkPreludeTyConUnique 21
+listTyConKey                           = mkPreludeTyConUnique 22
+foreignObjPrimTyConKey                 = mkPreludeTyConUnique 23
+foreignObjTyConKey                     = mkPreludeTyConUnique 24
+weakPrimTyConKey                       = mkPreludeTyConUnique 25
+mutableArrayPrimTyConKey               = mkPreludeTyConUnique 26
+mutableByteArrayPrimTyConKey           = mkPreludeTyConUnique 27
+orderingTyConKey                       = mkPreludeTyConUnique 28
+mVarPrimTyConKey                       = mkPreludeTyConUnique 29
+ratioTyConKey                          = mkPreludeTyConUnique 30
+rationalTyConKey                       = mkPreludeTyConUnique 31
+realWorldTyConKey                      = mkPreludeTyConUnique 32
+stablePtrPrimTyConKey                  = mkPreludeTyConUnique 33
+stablePtrTyConKey                      = mkPreludeTyConUnique 34
+statePrimTyConKey                      = mkPreludeTyConUnique 35
+stableNamePrimTyConKey                 = mkPreludeTyConUnique 50
+stableNameTyConKey                     = mkPreludeTyConUnique 51
+mutableByteArrayTyConKey               = mkPreludeTyConUnique 52
+mutVarPrimTyConKey                     = mkPreludeTyConUnique 53
+ioTyConKey                             = mkPreludeTyConUnique 55
+byteArrayTyConKey                      = mkPreludeTyConUnique 56
+wordPrimTyConKey                       = mkPreludeTyConUnique 57
+wordTyConKey                           = mkPreludeTyConUnique 58
+word8TyConKey                          = mkPreludeTyConUnique 59
+word16TyConKey                         = mkPreludeTyConUnique 60
+word32TyConKey                         = mkPreludeTyConUnique 61
+word64PrimTyConKey                     = mkPreludeTyConUnique 62
+word64TyConKey                         = mkPreludeTyConUnique 63
+boxedConKey                            = mkPreludeTyConUnique 64
+unboxedConKey                          = mkPreludeTyConUnique 65
+anyBoxConKey                           = mkPreludeTyConUnique 66
+kindConKey                             = mkPreludeTyConUnique 67
+boxityConKey                           = mkPreludeTyConUnique 68
+typeConKey                             = mkPreludeTyConUnique 69
+threadIdPrimTyConKey                   = mkPreludeTyConUnique 70
 \end{code}
 
 %************************************************************************
@@ -485,41 +554,23 @@ wordTyConKey                              = mkPreludeTyConUnique 54
 
 \begin{code}
 addrDataConKey                         = mkPreludeDataConUnique  1
-buildDataConKey                                = mkPreludeDataConUnique  2
-charDataConKey                         = mkPreludeDataConUnique  4
-consDataConKey                         = mkPreludeDataConUnique  5
-doubleDataConKey                       = mkPreludeDataConUnique  6
-eqDataConKey                           = mkPreludeDataConUnique  7
-falseDataConKey                                = mkPreludeDataConUnique  8
-floatDataConKey                                = mkPreludeDataConUnique  9
-gtDataConKey                           = mkPreludeDataConUnique 10
-intDataConKey                          = mkPreludeDataConUnique 11
-integerDataConKey                      = mkPreludeDataConUnique 12
-liftDataConKey                         = mkPreludeDataConUnique 13
-ltDataConKey                           = mkPreludeDataConUnique 14
-mallocPtrDataConKey                    = mkPreludeDataConUnique 15
-nilDataConKey                          = mkPreludeDataConUnique 18
-ratioDataConKey                                = mkPreludeDataConUnique 21
-return2GMPsDataConKey                  = mkPreludeDataConUnique 22
-returnIntAndGMPDataConKey              = mkPreludeDataConUnique 23
-stablePtrDataConKey                    = mkPreludeDataConUnique 24
-stateAndAddrPrimDataConKey             = mkPreludeDataConUnique 25
-stateAndArrayPrimDataConKey            = mkPreludeDataConUnique 26
-stateAndByteArrayPrimDataConKey                = mkPreludeDataConUnique 27
-stateAndCharPrimDataConKey             = mkPreludeDataConUnique 28
-stateAndDoublePrimDataConKey           = mkPreludeDataConUnique 29
-stateAndFloatPrimDataConKey            = mkPreludeDataConUnique 30
-stateAndIntPrimDataConKey              = mkPreludeDataConUnique 31
-stateAndMallocPtrPrimDataConKey                = mkPreludeDataConUnique 32
-stateAndMutableArrayPrimDataConKey     = mkPreludeDataConUnique 33
-stateAndMutableByteArrayPrimDataConKey = mkPreludeDataConUnique 34
-stateAndSynchVarPrimDataConKey         = mkPreludeDataConUnique 35
-stateAndPtrPrimDataConKey              = mkPreludeDataConUnique 36
-stateAndStablePtrPrimDataConKey                = mkPreludeDataConUnique 37
-stateAndWordPrimDataConKey             = mkPreludeDataConUnique 38
-stateDataConKey                                = mkPreludeDataConUnique 39
-trueDataConKey                         = mkPreludeDataConUnique 40
-wordDataConKey                         = mkPreludeDataConUnique 41
+charDataConKey                         = mkPreludeDataConUnique  2
+consDataConKey                         = mkPreludeDataConUnique  3
+doubleDataConKey                       = mkPreludeDataConUnique  4
+falseDataConKey                                = mkPreludeDataConUnique  5
+floatDataConKey                                = mkPreludeDataConUnique  6
+intDataConKey                          = mkPreludeDataConUnique  7
+smallIntegerDataConKey                 = mkPreludeDataConUnique 12
+largeIntegerDataConKey                 = mkPreludeDataConUnique 13
+foreignObjDataConKey                   = mkPreludeDataConUnique 14
+nilDataConKey                          = mkPreludeDataConUnique 15
+ratioDataConKey                                = mkPreludeDataConUnique 16
+stablePtrDataConKey                    = mkPreludeDataConUnique 17
+stableNameDataConKey                   = mkPreludeDataConUnique 18
+trueDataConKey                         = mkPreludeDataConUnique 34
+wordDataConKey                         = mkPreludeDataConUnique 35
+stDataConKey                           = mkPreludeDataConUnique 40
+ioDataConKey                           = mkPreludeDataConUnique 42
 \end{code}
 
 %************************************************************************
@@ -529,59 +580,76 @@ wordDataConKey                            = mkPreludeDataConUnique 41
 %************************************************************************
 
 \begin{code}
-absentErrorIdKey       = mkPreludeMiscIdUnique  1
-appendIdKey            = mkPreludeMiscIdUnique  2
-augmentIdKey           = mkPreludeMiscIdUnique  3
-buildIdKey             = mkPreludeMiscIdUnique  4
-errorIdKey             = mkPreludeMiscIdUnique  5
-foldlIdKey             = mkPreludeMiscIdUnique  6
-foldrIdKey             = mkPreludeMiscIdUnique  7
-forkIdKey              = mkPreludeMiscIdUnique  8
-int2IntegerIdKey       = mkPreludeMiscIdUnique  9
-integerMinusOneIdKey   = mkPreludeMiscIdUnique 10
-integerPlusOneIdKey    = mkPreludeMiscIdUnique 11
-integerPlusTwoIdKey    = mkPreludeMiscIdUnique 12
-integerZeroIdKey       = mkPreludeMiscIdUnique 13
-packCStringIdKey       = mkPreludeMiscIdUnique 14
-parErrorIdKey          = mkPreludeMiscIdUnique 15
-parIdKey               = mkPreludeMiscIdUnique 16
-patErrorIdKey          = mkPreludeMiscIdUnique 17
-realWorldPrimIdKey     = mkPreludeMiscIdUnique 18
-runSTIdKey             = mkPreludeMiscIdUnique 19
-seqIdKey               = mkPreludeMiscIdUnique 20
-traceIdKey             = mkPreludeMiscIdUnique 21
-unpackCString2IdKey    = mkPreludeMiscIdUnique 22
-unpackCStringAppendIdKey= mkPreludeMiscIdUnique        23
-unpackCStringFoldrIdKey        = mkPreludeMiscIdUnique 24
-unpackCStringIdKey     = mkPreludeMiscIdUnique 25
-voidPrimIdKey          = mkPreludeMiscIdUnique 26
-mainIdKey              = mkPreludeMiscIdUnique 27
-mainPrimIOIdKey                = mkPreludeMiscIdUnique 28
-
-#ifdef GRAN
-parLocalIdKey          = mkPreludeMiscIdUnique 29
-parGlobalIdKey         = mkPreludeMiscIdUnique 30
-noFollowIdKey          = mkPreludeMiscIdUnique 31
-copyableIdKey          = mkPreludeMiscIdUnique 32
-#endif
+absentErrorIdKey             = mkPreludeMiscIdUnique  1
+appendIdKey                  = mkPreludeMiscIdUnique  2
+augmentIdKey                 = mkPreludeMiscIdUnique  3
+buildIdKey                   = mkPreludeMiscIdUnique  4
+errorIdKey                   = mkPreludeMiscIdUnique  5
+foldlIdKey                   = mkPreludeMiscIdUnique  6
+foldrIdKey                   = mkPreludeMiscIdUnique  7
+recSelErrIdKey               = mkPreludeMiscIdUnique  8
+integerMinusOneIdKey         = mkPreludeMiscIdUnique  9
+integerPlusOneIdKey          = mkPreludeMiscIdUnique 10
+integerPlusTwoIdKey          = mkPreludeMiscIdUnique 11
+integerZeroIdKey             = mkPreludeMiscIdUnique 12
+int2IntegerIdKey             = mkPreludeMiscIdUnique 13
+addr2IntegerIdKey            = mkPreludeMiscIdUnique 14
+irrefutPatErrorIdKey         = mkPreludeMiscIdUnique 15
+lexIdKey                     = mkPreludeMiscIdUnique 16
+noMethodBindingErrorIdKey     = mkPreludeMiscIdUnique 17
+nonExhaustiveGuardsErrorIdKey = mkPreludeMiscIdUnique 18
+packCStringIdKey             = mkPreludeMiscIdUnique 19
+parErrorIdKey                = mkPreludeMiscIdUnique 20
+parIdKey                     = mkPreludeMiscIdUnique 21
+patErrorIdKey                = mkPreludeMiscIdUnique 22
+realWorldPrimIdKey           = mkPreludeMiscIdUnique 23
+recConErrorIdKey             = mkPreludeMiscIdUnique 24
+recUpdErrorIdKey             = mkPreludeMiscIdUnique 25
+traceIdKey                   = mkPreludeMiscIdUnique 26
+unpackCString2IdKey          = mkPreludeMiscIdUnique 27
+unpackCStringAppendIdKey      = mkPreludeMiscIdUnique 28
+unpackCStringFoldrIdKey              = mkPreludeMiscIdUnique 29
+unpackCStringIdKey           = mkPreludeMiscIdUnique 30
+ushowListIdKey               = mkPreludeMiscIdUnique 31
+unsafeCoerceIdKey            = mkPreludeMiscIdUnique 32
+concatIdKey                  = mkPreludeMiscIdUnique 33
+filterIdKey                  = mkPreludeMiscIdUnique 34
+zipIdKey                     = mkPreludeMiscIdUnique 35
+bindIOIdKey                  = mkPreludeMiscIdUnique 36
+deRefStablePtrIdKey          = mkPreludeMiscIdUnique 37
+makeStablePtrIdKey           = mkPreludeMiscIdUnique 38
+getTagIdKey                  = mkPreludeMiscIdUnique 39
 \end{code}
 
-Certain class operations from Prelude classes.  They get
-their own uniques so we can look them up easily when we want
-to conjure them up during type checking.        
+Certain class operations from Prelude classes.  They get their own
+uniques so we can look them up easily when we want to conjure them up
+during type checking.
+
 \begin{code}                                     
-fromIntClassOpKey      = mkPreludeMiscIdUnique 33
-fromIntegerClassOpKey  = mkPreludeMiscIdUnique 34
-fromRationalClassOpKey = mkPreludeMiscIdUnique 35
-enumFromClassOpKey     = mkPreludeMiscIdUnique 36
-enumFromThenClassOpKey = mkPreludeMiscIdUnique 37
-enumFromToClassOpKey   = mkPreludeMiscIdUnique 38
-enumFromThenToClassOpKey= mkPreludeMiscIdUnique 39
-eqClassOpKey           = mkPreludeMiscIdUnique 40
-geClassOpKey           = mkPreludeMiscIdUnique 41
-negateClassOpKey       = mkPreludeMiscIdUnique 42
+fromIntClassOpKey            = mkPreludeMiscIdUnique 101
+fromIntegerClassOpKey        = mkPreludeMiscIdUnique 102
+minusClassOpKey                      = mkPreludeMiscIdUnique 103
+fromRationalClassOpKey       = mkPreludeMiscIdUnique 104
+enumFromClassOpKey           = mkPreludeMiscIdUnique 105
+enumFromThenClassOpKey       = mkPreludeMiscIdUnique 106
+enumFromToClassOpKey         = mkPreludeMiscIdUnique 107
+enumFromThenToClassOpKey      = mkPreludeMiscIdUnique 108
+eqClassOpKey                 = mkPreludeMiscIdUnique 109
+geClassOpKey                 = mkPreludeMiscIdUnique 110
+failMClassOpKey                      = mkPreludeMiscIdUnique 112
+thenMClassOpKey                      = mkPreludeMiscIdUnique 113 -- (>>=)
+       -- Just a place holder for  unbound variables  produced by the renamer:
+unboundKey                   = mkPreludeMiscIdUnique 114 
+fromEnumClassOpKey           = mkPreludeMiscIdUnique 115
+                             
+mainKey                              = mkPreludeMiscIdUnique 116
+returnMClassOpKey            = mkPreludeMiscIdUnique 117
+otherwiseIdKey               = mkPreludeMiscIdUnique 118
+toEnumClassOpKey             = mkPreludeMiscIdUnique 119
+mapIdKey                     = mkPreludeMiscIdUnique 120
 \end{code}
 
-
-
-
+\begin{code}
+assertIdKey                  = mkPreludeMiscIdUnique 121
+runSTRepIdKey                = mkPreludeMiscIdUnique 122
+\end{code}