%
-% (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
Haskell).
\begin{code}
-#include "HsVersions.h"
-
---<mkdependHS:friends> UniqSupply
-
module Unique (
- Unique,
- u2i, -- hack: used in UniqFM
+ Unique, Uniquable(..), hasKey,
- pprUnique, pprUnique10, showUnique,
+ pprUnique, pprUnique10,
mkUnique, -- Used in UniqSupply
mkUniqueGrimily, -- Used in UniqSupply only!
+ getKey, getKey#, -- Used in Var, UniqFM, Name only!
+ unpkUnique,
incrUnique, -- Used for renumbering
- initRenumberingUniques,
+ deriveUnique, -- Ditto
+ newTagUnique, -- Used in CgCase
+ initTyVarUnique,
+ initTidyUniques,
+
+ isTupleKey,
-- now all the built-in Uniques (and functions to make them)
-- [the Oh-So-Wonderful Haskell module system wins again...]
mkAlphaTyVarUnique,
mkPrimOpIdUnique,
- mkTupleDataConUnique,
- mkTupleTyConUnique,
-
- getBuiltinUniques, mkBuiltinUnique,
- mkPseudoUnique1, mkPseudoUnique2, mkPseudoUnique3,
-
- absentErrorIdKey, -- alphabetical...
- addrDataConKey,
- addrPrimTyConKey,
- addrTyConKey,
- andandIdKey,
- appendIdKey,
- arrayPrimTyConKey,
- augmentIdKey,
- boolTyConKey,
- boundedClassKey,
- buildDataConKey,
- buildIdKey,
- byteArrayPrimTyConKey,
- cCallableClassKey,
- cReturnableClassKey,
- charDataConKey,
- charPrimTyConKey,
- charTyConKey,
- composeIdKey,
- consDataConKey,
- doubleDataConKey,
- doublePrimTyConKey,
- doubleTyConKey,
- enumClassKey,
- enumFromClassOpKey,
- enumFromThenClassOpKey,
- enumFromThenToClassOpKey,
- enumFromToClassOpKey,
- eqClassKey,
- eqClassOpKey,
- eqDataConKey,
- errorIdKey,
- evalClassKey,
- falseDataConKey,
- floatDataConKey,
- floatPrimTyConKey,
- floatTyConKey,
- floatingClassKey,
- foldlIdKey,
- foldrIdKey,
- foreignObjDataConKey,
- foreignObjPrimTyConKey,
- foreignObjTyConKey,
- forkIdKey,
- fractionalClassKey,
- fromEnumClassOpKey,
- fromIntClassOpKey,
- fromIntegerClassOpKey,
- fromRationalClassOpKey,
- funTyConKey,
- functorClassKey,
- geClassOpKey,
- gtDataConKey,
- iOTyConKey,
- intDataConKey,
- intPrimTyConKey,
- intTyConKey,
- integerDataConKey,
- integerMinusOneIdKey,
- integerPlusOneIdKey,
- integerPlusTwoIdKey,
- integerTyConKey,
- integerZeroIdKey,
- integralClassKey,
- irrefutPatErrorIdKey,
- ixClassKey,
- lexIdKey,
- liftDataConKey,
- liftTyConKey,
- listTyConKey,
- ltDataConKey,
- monadClassKey,
- monadPlusClassKey,
- monadZeroClassKey,
- mutableArrayPrimTyConKey,
- mutableByteArrayPrimTyConKey,
- nilDataConKey,
- noDefaultMethodErrorIdKey,
- nonExhaustiveGuardsErrorIdKey,
- nonExplicitMethodErrorIdKey,
- notIdKey,
- numClassKey,
- ordClassKey,
- orderingTyConKey,
- packCStringIdKey,
- parErrorIdKey,
- parIdKey,
- patErrorIdKey,
- primIoTyConKey,
- ratioDataConKey,
- ratioTyConKey,
- rationalTyConKey,
- readClassKey,
- readParenIdKey,
- realClassKey,
- realFloatClassKey,
- realFracClassKey,
- realWorldPrimIdKey,
- realWorldTyConKey,
- recConErrorIdKey,
- recUpdErrorIdKey,
- return2GMPsDataConKey,
- return2GMPsTyConKey,
- returnIntAndGMPDataConKey,
- returnIntAndGMPTyConKey,
- runSTIdKey,
- seqIdKey,
- showClassKey,
- showParenIdKey,
- showSpaceIdKey,
- showStringIdKey,
- stTyConKey,
- stDataConKey,
- stablePtrDataConKey,
- stablePtrPrimTyConKey,
- stablePtrTyConKey,
- stateAndAddrPrimDataConKey,
- stateAndAddrPrimTyConKey,
- stateAndArrayPrimDataConKey,
- stateAndArrayPrimTyConKey,
- stateAndByteArrayPrimDataConKey,
- stateAndByteArrayPrimTyConKey,
- stateAndCharPrimDataConKey,
- stateAndCharPrimTyConKey,
- stateAndDoublePrimDataConKey,
- stateAndDoublePrimTyConKey,
- stateAndFloatPrimDataConKey,
- stateAndFloatPrimTyConKey,
- stateAndForeignObjPrimDataConKey,
- stateAndForeignObjPrimTyConKey,
- stateAndIntPrimDataConKey,
- stateAndIntPrimTyConKey,
- stateAndMutableArrayPrimDataConKey,
- stateAndMutableArrayPrimTyConKey,
- stateAndMutableByteArrayPrimDataConKey,
- stateAndMutableByteArrayPrimTyConKey,
- stateAndPtrPrimDataConKey,
- stateAndPtrPrimTyConKey,
- stateAndStablePtrPrimDataConKey,
- stateAndStablePtrPrimTyConKey,
- stateAndSynchVarPrimDataConKey,
- stateAndSynchVarPrimTyConKey,
- stateAndWordPrimDataConKey,
- stateAndWordPrimTyConKey,
- stateDataConKey,
- statePrimTyConKey,
- stateTyConKey,
- synchVarPrimTyConKey,
- thenMClassOpKey,
- traceIdKey,
- trueDataConKey,
- unpackCString2IdKey,
- unpackCStringAppendIdKey,
- unpackCStringFoldrIdKey,
- unpackCStringIdKey,
- ureadListIdKey,
- ushowListIdKey,
- voidIdKey,
- voidTyConKey,
- wordDataConKey,
- wordPrimTyConKey,
- wordTyConKey,
- zeroClassOpKey
- , copyableIdKey
- , noFollowIdKey
- , parAtAbsIdKey
- , parAtForNowIdKey
- , parAtIdKey
- , parAtRelIdKey
- , parGlobalIdKey
- , parLocalIdKey
- , unboundKey
+ mkTupleTyConUnique, mkTupleDataConUnique,
+ mkPreludeMiscIdUnique, mkPreludeDataConUnique,
+ mkPreludeTyConUnique, mkPreludeClassUnique,
+ mkPArrDataConUnique,
+
+ mkBuiltinUnique, builtinUniques,
+ mkPseudoUnique1, mkPseudoUnique2, mkPseudoUnique3
) where
-import PreludeGlaST
+#include "HsVersions.h"
+
+import BasicTypes ( Boxity(..) )
+import FastString ( FastString, uniqueOfFS )
+import Outputable
+import FastTypes
-IMP_Ubiq(){-uitous-}
+import GLAEXTS
-import Pretty
-import Util
+import Char ( chr, ord )
\end{code}
%************************************************************************
Fast comparison is everything on @Uniques@:
\begin{code}
-u2i :: Unique -> FAST_INT
-
data Unique = MkUnique Int#
-u2i (MkUnique i) = i
\end{code}
Now come the functions which construct uniques from their pieces, and vice versa.
mkUnique :: Char -> Int -> Unique -- Builds a unique from pieces
unpkUnique :: Unique -> (Char, Int) -- The reverse
-mkUniqueGrimily :: Int# -> Unique -- A trap-door for UniqSupply
+mkUniqueGrimily :: Int -> Unique -- A trap-door for UniqSupply
+getKey :: Unique -> Int -- for Var
+getKey# :: Unique -> Int# -- for Var
incrUnique :: Unique -> Unique
+deriveUnique :: Unique -> Int -> Unique
+newTagUnique :: Unique -> Char -> Unique
+
+isTupleKey :: Unique -> Bool
\end{code}
\begin{code}
-mkUniqueGrimily x = MkUnique x
+mkUniqueGrimily (I# x) = MkUnique x
+
+{-# INLINE getKey #-}
+getKey (MkUnique x) = I# x
+{-# INLINE getKey# #-}
+getKey# (MkUnique x) = x
incrUnique (MkUnique i) = MkUnique (i +# 1#)
+-- 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)
+
+-- newTagUnique changes the "domain" of a unique to a different char
+newTagUnique u c = mkUnique c i where (_,i) = unpkUnique u
+
-- 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
i2w_s x = (x::Int#)
mkUnique (C# c) (I# i)
- = MkUnique (w2i (((i2w (ord# c)) `shiftL#` (i2w_s 24#)) `or#` (i2w i)))
+ = MkUnique (w2i (tag `or#` bits))
+ where
+#if __GLASGOW_HASKELL__ >= 503
+ tag = i2w (ord# c) `uncheckedShiftL#` i2w_s 24#
+#else
+ tag = i2w (ord# c) `shiftL#` i2w_s 24#
+#endif
+ bits = i2w i `and#` (i2w 16777215#){-``0x00ffffff''-}
unpkUnique (MkUnique u)
= let
tag = C# (chr# (w2i ((i2w u) `shiftr` (i2w_s 24#))))
- i = I# (w2i ((i2w u) `and#` (i2w 16777215#){-``0x00ffffff''-}))
+ i = I# (w2i ((i2w u) `and#` (i2w 16777215#){-``0x00ffffff''-}))
in
(tag, i)
where
- shiftr x y = shiftRA# x y
+#if __GLASGOW_HASKELL__ >= 503
+ shiftr x y = uncheckedShiftRL# x y
+#else
+ shiftr x y = shiftRL# x y
+#endif
\end{code}
+
+
+%************************************************************************
+%* *
+\subsection[Uniquable-class]{The @Uniquable@ class}
+%* *
+%************************************************************************
+
+\begin{code}
+class Uniquable a where
+ getUnique :: a -> Unique
+
+hasKey :: Uniquable a => a -> Unique -> Bool
+x `hasKey` k = getUnique x == k
+
+instance Uniquable FastString where
+ getUnique fs = mkUniqueGrimily (I# (uniqueOfFS fs))
+
+instance Uniquable Int where
+ getUnique i = mkUniqueGrimily i
+\end{code}
+
+
%************************************************************************
%* *
\subsection[Unique-instances]{Instance declarations for @Unique@}
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
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
- uniqueOf u = u
+ 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
pprUnique10 uniq -- in base-10, dudes
= case unpkUnique uniq of
- (tag, u) -> finish_ppr tag u (ppInt u)
-
-finish_ppr tag u pp_u
- = if tag /= 't' -- this is just to make v common tyvars, t1, t2, ...
- -- come out as a, b, ... (shorter, easier to read)
- then pp_all
- else case u of
- 1 -> ppChar 'a'
- 2 -> ppChar 'b'
- 3 -> ppChar 'c'
- 4 -> ppChar 'd'
- 5 -> ppChar 'e'
- _ -> pp_all
- where
- pp_all = ppBeside (ppChar tag) pp_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)
+instance Show Unique where
+ showsPrec p uniq = showsPrecSDoc p (pprUnique uniq)
\end{code}
%************************************************************************
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}
-#if __GLASGOW_HASKELL__ >= 200
-# define BYTE_ARRAY GHCbase.ByteArray
-# define RUN_ST GHCbase.runST
-# define AND_THEN >>=
-# define AND_THEN_ >>
-# define RETURN return
-#else
-# define BYTE_ARRAY _ByteArray
-# define RUN_ST _runST
-# define AND_THEN `thenStrictlyST`
-# define AND_THEN_ `seqStrictlyST`
-# define RETURN returnStrictlyST
-#endif
-iToBase62 :: Int -> Pretty
+\begin{code}
+iToBase62 :: Int -> SDoc
iToBase62 n@(I# n#)
= ASSERT(n >= 0)
- let
- 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) }
+ case (indexCharOffAddr# chars62# n#) of { 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)) }}
-
--- keep this at top level! (bug on 94/10/24 WDP)
-chars62 :: BYTE_ARRAY Int
-chars62
- = RUN_ST (
- newCharArray (0, 61) AND_THEN \ ch_array ->
- fill_in ch_array 0 62 "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
- AND_THEN_
- unsafeFreezeByteArray ch_array
- )
+ case (indexCharOffAddr# chars62# r#) of { c ->
+ (<>) (iToBase62 q) (char (C# c)) }}
where
- fill_in ch_array i lim str
- | i == lim
- = RETURN ()
- | otherwise
- = writeCharArray ch_array i (str !! i) AND_THEN_
- fill_in ch_array (i+1) lim str
+ chars62# = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"#
\end{code}
%************************************************************************
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
-mkPreludeDataConUnique i = mkUnique '5' i -- must be alphabetic
-mkTupleDataConUnique a = mkUnique '6' a -- ditto (*may* be used in C labels)
+-- Prelude type constructors occupy *three* slots.
+-- The first is for the tycon itself; the latter two
+-- are for the generic to/from Ids. See TysWiredIn.mk_tc_gen_info.
-mkPrimOpIdUnique op = mkUnique '7' op
-mkPreludeMiscIdUnique i = mkUnique '8' i
+mkPreludeTyConUnique i = mkUnique '3' (3*i)
+mkTupleTyConUnique Boxed a = mkUnique '4' (3*a)
+mkTupleTyConUnique Unboxed a = mkUnique '5' (3*a)
-initRenumberingUniques = (mkUnique 'v' 1, mkUnique 't' 1, mkUnique 'u' 1)
+-- Data constructor keys occupy *two* slots. The first is used for the
+-- data constructor itself and its wrapper function (the function that
+-- evaluates arguments as necessary and calls the worker). The second is
+-- used for the worker function (the function that builds the constructor
+-- representation).
-mkPseudoUnique1, mkPseudoUnique2, mkPseudoUnique3,
- mkBuiltinUnique :: Int -> Unique
+mkPreludeDataConUnique i = mkUnique '6' (2*i) -- Must be alphabetic
+mkTupleDataConUnique Boxed a = mkUnique '7' (2*a) -- ditto (*may* be used in C labels)
+mkTupleDataConUnique Unboxed a = mkUnique '8' (2*a)
-mkBuiltinUnique i = mkUnique 'B' i
-mkPseudoUnique1 i = mkUnique 'C' i -- used for uniqueOf on Regs
-mkPseudoUnique2 i = mkUnique 'D' i -- ditto
-mkPseudoUnique3 i = mkUnique 'E' i -- ditto
+-- This one is used for a tiresome reason
+-- to improve a consistency-checking error check in the renamer
+isTupleKey u = case unpkUnique u of
+ (tag,_) -> tag == '4' || tag == '5' || tag == '7' || tag == '8'
-getBuiltinUniques :: Int -> [Unique]
-getBuiltinUniques n = map (mkUnique 'B') [1 .. n]
-\end{code}
+mkPrimOpIdUnique op = mkUnique '9' op
+mkPreludeMiscIdUnique i = mkUnique '0' i
-%************************************************************************
-%* *
-\subsubsection[Uniques-prelude-Classes]{@Uniques@ for wired-in @Classes@}
-%* *
-%************************************************************************
+-- No numbers left anymore, so I pick something different for the character
+-- tag
+mkPArrDataConUnique a = mkUnique ':' (2*a)
-\begin{code}
-boundedClassKey = mkPreludeClassUnique 1
-enumClassKey = mkPreludeClassUnique 2
-eqClassKey = mkPreludeClassUnique 3
-evalClassKey = mkPreludeClassUnique 4
-floatingClassKey = mkPreludeClassUnique 5
-fractionalClassKey = mkPreludeClassUnique 6
-integralClassKey = mkPreludeClassUnique 7
-monadClassKey = mkPreludeClassUnique 8
-monadZeroClassKey = mkPreludeClassUnique 9
-monadPlusClassKey = mkPreludeClassUnique 10
-functorClassKey = mkPreludeClassUnique 11
-numClassKey = mkPreludeClassUnique 12
-ordClassKey = mkPreludeClassUnique 13
-readClassKey = mkPreludeClassUnique 14
-realClassKey = mkPreludeClassUnique 15
-realFloatClassKey = mkPreludeClassUnique 16
-realFracClassKey = mkPreludeClassUnique 17
-showClassKey = mkPreludeClassUnique 18
-
-cCallableClassKey = mkPreludeClassUnique 19
-cReturnableClassKey = mkPreludeClassUnique 20
-
-ixClassKey = mkPreludeClassUnique 21
-\end{code}
+-- The "tyvar uniques" print specially nicely: a, b, c, etc.
+-- See pprUnique for details
-%************************************************************************
-%* *
-\subsubsection[Uniques-prelude-TyCons]{@Uniques@ for wired-in @TyCons@}
-%* *
-%************************************************************************
+initTyVarUnique :: Unique
+initTyVarUnique = mkUnique 't' 0
-\begin{code}
-addrPrimTyConKey = mkPreludeTyConUnique 1
-addrTyConKey = mkPreludeTyConUnique 2
-arrayPrimTyConKey = mkPreludeTyConUnique 3
-boolTyConKey = mkPreludeTyConUnique 4
-byteArrayPrimTyConKey = mkPreludeTyConUnique 5
-charPrimTyConKey = mkPreludeTyConUnique 7
-charTyConKey = mkPreludeTyConUnique 8
-doublePrimTyConKey = mkPreludeTyConUnique 9
-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
-foreignObjPrimTyConKey = mkPreludeTyConUnique 20
-foreignObjTyConKey = 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
-stateAndForeignObjPrimTyConKey = 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
- -- 49 is spare
-stTyConKey = mkPreludeTyConUnique 50
-primIoTyConKey = mkPreludeTyConUnique 51
- -- 52 is spare
-wordPrimTyConKey = mkPreludeTyConUnique 53
-wordTyConKey = mkPreludeTyConUnique 54
-voidTyConKey = mkPreludeTyConUnique 55
-\end{code}
-
-%************************************************************************
-%* *
-\subsubsection[Uniques-prelude-DataCons]{@Uniques@ for wired-in @DataCons@}
-%* *
-%************************************************************************
+initTidyUniques :: (Unique, Unique) -- Global and local
+initTidyUniques = (mkUnique 'g' 0, mkUnique 'x' 0)
-\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
-foreignObjDataConKey = 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
-stateAndForeignObjPrimDataConKey = 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
-stDataConKey = mkPreludeDataConUnique 42
-\end{code}
+mkPseudoUnique1, mkPseudoUnique2, mkPseudoUnique3,
+ mkBuiltinUnique :: Int -> Unique
-%************************************************************************
-%* *
-\subsubsection[Uniques-prelude-Ids]{@Uniques@ for wired-in @Ids@ (except @DataCons@)}
-%* *
-%************************************************************************
+builtinUniques :: [Unique]
+builtinUniques = map mkBuiltinUnique [1..]
-\begin{code}
-absentErrorIdKey = mkPreludeMiscIdUnique 1
-andandIdKey = mkPreludeMiscIdUnique 2
-appendIdKey = mkPreludeMiscIdUnique 3
-augmentIdKey = mkPreludeMiscIdUnique 4
-buildIdKey = mkPreludeMiscIdUnique 5
-composeIdKey = mkPreludeMiscIdUnique 6
-errorIdKey = mkPreludeMiscIdUnique 7
-foldlIdKey = mkPreludeMiscIdUnique 8
-foldrIdKey = mkPreludeMiscIdUnique 9
-forkIdKey = mkPreludeMiscIdUnique 10
-int2IntegerIdKey = mkPreludeMiscIdUnique 11
-integerMinusOneIdKey = mkPreludeMiscIdUnique 12
-integerPlusOneIdKey = mkPreludeMiscIdUnique 13
-integerPlusTwoIdKey = mkPreludeMiscIdUnique 14
-integerZeroIdKey = mkPreludeMiscIdUnique 15
-irrefutPatErrorIdKey = mkPreludeMiscIdUnique 16
-lexIdKey = mkPreludeMiscIdUnique 17
-noDefaultMethodErrorIdKey = mkPreludeMiscIdUnique 20
-nonExhaustiveGuardsErrorIdKey = mkPreludeMiscIdUnique 21
-nonExplicitMethodErrorIdKey = mkPreludeMiscIdUnique 22
-notIdKey = mkPreludeMiscIdUnique 23
-packCStringIdKey = mkPreludeMiscIdUnique 24
-parErrorIdKey = mkPreludeMiscIdUnique 25
-parIdKey = mkPreludeMiscIdUnique 26
-patErrorIdKey = mkPreludeMiscIdUnique 27
-readParenIdKey = mkPreludeMiscIdUnique 28
-realWorldPrimIdKey = mkPreludeMiscIdUnique 29
-recConErrorIdKey = mkPreludeMiscIdUnique 30
-recUpdErrorIdKey = mkPreludeMiscIdUnique 31
-runSTIdKey = mkPreludeMiscIdUnique 32
-seqIdKey = mkPreludeMiscIdUnique 33
-showParenIdKey = mkPreludeMiscIdUnique 34
-showSpaceIdKey = mkPreludeMiscIdUnique 35
-showStringIdKey = mkPreludeMiscIdUnique 36
-traceIdKey = mkPreludeMiscIdUnique 37
-unpackCString2IdKey = mkPreludeMiscIdUnique 38
-unpackCStringAppendIdKey = mkPreludeMiscIdUnique 39
-unpackCStringFoldrIdKey = mkPreludeMiscIdUnique 40
-unpackCStringIdKey = mkPreludeMiscIdUnique 41
-voidIdKey = mkPreludeMiscIdUnique 42
-ushowListIdKey = mkPreludeMiscIdUnique 43
-ureadListIdKey = mkPreludeMiscIdUnique 44
-
-copyableIdKey = mkPreludeMiscIdUnique 45
-noFollowIdKey = mkPreludeMiscIdUnique 46
-parAtAbsIdKey = mkPreludeMiscIdUnique 47
-parAtForNowIdKey = mkPreludeMiscIdUnique 48
-parAtIdKey = mkPreludeMiscIdUnique 49
-parAtRelIdKey = mkPreludeMiscIdUnique 50
-parGlobalIdKey = mkPreludeMiscIdUnique 51
-parLocalIdKey = mkPreludeMiscIdUnique 52
+mkBuiltinUnique i = mkUnique 'B' i
+mkPseudoUnique1 i = mkUnique 'C' i -- used for getUnique on Regs
+mkPseudoUnique2 i = mkUnique 'D' i -- used in NCG for getUnique on RealRegs
+mkPseudoUnique3 i = mkUnique 'E' i -- used in NCG spiller to create spill VirtualRegs
\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.
-\begin{code}
-fromIntClassOpKey = mkPreludeMiscIdUnique 53
-fromIntegerClassOpKey = mkPreludeMiscIdUnique 54
-fromRationalClassOpKey = mkPreludeMiscIdUnique 55
-enumFromClassOpKey = mkPreludeMiscIdUnique 56
-enumFromThenClassOpKey = mkPreludeMiscIdUnique 57
-enumFromToClassOpKey = mkPreludeMiscIdUnique 58
-enumFromThenToClassOpKey= mkPreludeMiscIdUnique 59
-eqClassOpKey = mkPreludeMiscIdUnique 60
-geClassOpKey = mkPreludeMiscIdUnique 61
-zeroClassOpKey = mkPreludeMiscIdUnique 62
-thenMClassOpKey = mkPreludeMiscIdUnique 63 -- (>>=)
-unboundKey = mkPreludeMiscIdUnique 64 -- Just a place holder for unbound
- -- variables produced by the renamer
-fromEnumClassOpKey = mkPreludeMiscIdUnique 65
-\end{code}