2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1995
4 \section[Unique]{The @Unique@ data type and a (monadic) supply thereof}
6 @Uniques@ are used to distinguish entities in the compiler (@Ids@,
7 @Classes@, etc.) from each other. Thus, @Uniques@ are the basic
8 comparison key in the compiler.
10 If there is any single operation that needs to be fast, it is @Unique@
11 comparison. Unsurprisingly, there is quite a bit of huff-and-puff
14 Some of the other hair in this code is to be able to use a
15 ``splittable @UniqueSupply@'' if requested/possible (not standard
19 #include "HsVersions.h"
23 UniqueSupply, -- abstract types
24 u2i, -- hack: used in UniqFM
25 getUnique, getUniques, -- basic ops
26 eqUnique, cmpUnique, -- comparison is everything!
28 --not exported: mkUnique, unpkUnique,
29 mkUniqueGrimily, -- use in SplitUniq only!
30 mkUniqueSupplyGrimily, -- ditto! (but FALSE: WDP 95/01)
31 mkUnifiableTyVarUnique,
32 unpkUnifiableTyVarUnique,
33 showUnique, pprUnique, pprUnique10,
35 UniqSM(..), -- type: unique supply monad
36 initUs, thenUs, returnUs,
39 -- the pre-defined unique supplies:
41 uniqSupply_r, uniqSupply_t, uniqSupply_d,
42 uniqSupply_s, uniqSupply_c, uniqSupply_T,
48 -- otherwise, not exported
49 uniqSupply_p, uniqSupply_S, uniqSupply_L,
52 -- and the access functions for the `builtin' UniqueSupply
53 getBuiltinUniques, mkBuiltinUnique, runBuiltinUs,
54 mkPseudoUnique1, mkPseudoUnique2, mkPseudoUnique3,
56 -- now all the built-in Uniques (and functions to make them)
57 -- [the Oh-So-Wonderful Haskell module system wins again...]
62 runSTIdKey, realWorldPrimIdKey,
64 byteArrayPrimTyConKey, --UNUSED: byteArrayDataConKey, byteArrayTyConKey,
66 boolTyConKey, buildDataConKey, buildIdKey, charDataConKey,
67 charPrimTyConKey, charTyConKey, cmpTagTyConKey,
73 enumClassKey, eqClassKey,
74 eqTagDataConKey, errorIdKey,
75 falseDataConKey, floatDataConKey,
76 floatPrimTyConKey, floatTyConKey, floatingClassKey,
77 foldlIdKey, foldrIdKey,
80 gtTagDataConKey, --UNUSED: iOErrorTyConKey,
81 --UNUSED: iOIntPrimTyConKey, -- UNUSED: int2IntegerIdKey,
84 wordPrimTyConKey, wordTyConKey, wordDataConKey,
85 addrPrimTyConKey, addrTyConKey, addrDataConKey,
86 intPrimTyConKey, intTyConKey,
87 integerDataConKey, integerTyConKey, integralClassKey,
90 liftDataConKey, liftTyConKey, listTyConKey,
92 mutableArrayPrimTyConKey, -- UNUSED: mutableArrayDataConKey, mutableArrayTyConKey,
93 mutableByteArrayPrimTyConKey, -- UNUSED: mutableByteArrayDataConKey,
94 --UNUSED: mutableByteArrayTyConKey,
96 nilDataConKey, numClassKey, ordClassKey,
97 parIdKey, parErrorIdKey,
99 parGlobalIdKey, parLocalIdKey, copyableIdKey, noFollowIdKey,
102 ratioDataConKey, ratioTyConKey,
104 --UNUSED: readParenIdKey,
105 realClassKey, realFloatClassKey,
107 --UNUSED: requestTyConKey, responseTyConKey,
108 return2GMPsDataConKey, return2GMPsTyConKey,
109 returnIntAndGMPDataConKey, returnIntAndGMPTyConKey,
110 seqIdKey, -- UNUSED: seqIntPrimTyConKey,
111 --UNUSED: seqTyConKey,
112 --UNUSED: showParenIdKey,
113 --UNUSED: showSpaceIdKey,
114 statePrimTyConKey, stateTyConKey, stateDataConKey,
117 stablePtrPrimTyConKey, stablePtrTyConKey, stablePtrDataConKey,
118 mallocPtrPrimTyConKey, mallocPtrTyConKey, mallocPtrDataConKey,
119 stateAndPtrPrimTyConKey,
120 stateAndPtrPrimDataConKey,
121 stateAndCharPrimTyConKey,
122 stateAndCharPrimDataConKey,
123 stateAndIntPrimTyConKey,
124 stateAndIntPrimDataConKey,
125 stateAndWordPrimTyConKey,
126 stateAndWordPrimDataConKey,
127 stateAndAddrPrimTyConKey,
128 stateAndAddrPrimDataConKey,
129 stateAndStablePtrPrimTyConKey,
130 stateAndStablePtrPrimDataConKey,
131 stateAndMallocPtrPrimTyConKey,
132 stateAndMallocPtrPrimDataConKey,
133 stateAndFloatPrimTyConKey,
134 stateAndFloatPrimDataConKey,
135 stateAndDoublePrimTyConKey,
136 stateAndDoublePrimDataConKey,
137 stateAndArrayPrimTyConKey,
138 stateAndArrayPrimDataConKey,
139 stateAndMutableArrayPrimTyConKey,
140 stateAndMutableArrayPrimDataConKey,
141 stateAndByteArrayPrimTyConKey,
142 stateAndByteArrayPrimDataConKey,
143 stateAndMutableByteArrayPrimTyConKey,
144 stateAndMutableByteArrayPrimDataConKey,
145 stateAndSynchVarPrimTyConKey,
146 stateAndSynchVarPrimDataConKey,
148 stTyConKey, primIoTyConKey,
149 --UNUSED: ioResultTyConKey,
155 integerZeroIdKey, integerPlusOneIdKey, integerMinusOneIdKey,
159 --UNUSED: packedStringTyConKey, psDataConKey, cpsDataConKey,
161 -- to make interface self-sufficient
162 PrimOp, SplitUniqSupply, CSeq
164 #ifndef __GLASGOW_HASKELL__
169 import Outputable -- class for printing, forcing
171 import PrimOps -- ** DIRECTLY **
175 #ifndef __GLASGOW_HASKELL__
176 {-hide import from mkdependHS-}
180 #ifdef __GLASGOW_HASKELL__
187 %************************************************************************
189 \subsection[Unique-type]{@Unique@ type and operations}
191 %************************************************************************
193 The @Chars@ are ``tag letters'' that identify the @UniqueSupply@.
194 Fast comparison is everything on @Uniques@:
197 u2i :: Unique -> FAST_INT
199 #ifdef __GLASGOW_HASKELL__
201 data Unique = MkUnique Int#
206 data Unique = MkUnique Word{-#STRICT#-}
207 u2i (MkUnique w) = wordToInt w
212 Now come the functions which construct uniques from their pieces, and vice versa.
213 The stuff about unique *supplies* is handled further down this module.
216 mkUnique :: Char -> Int -> Unique -- Builds a unique from pieces
217 unpkUnique :: Unique -> (Char, Int) -- The reverse
219 mkUnifiableTyVarUnique :: Int -> Unique -- Injects a subst-array index into the Unique type
220 unpkUnifiableTyVarUnique :: Unique -> Int -- The reverse process
222 #ifdef __GLASGOW_HASKELL__
223 mkUniqueGrimily :: Int# -> Unique -- A trap-door for SplitUniq
225 mkUniqueGrimily :: Int -> Unique
231 #ifdef __GLASGOW_HASKELL__
232 mkUniqueGrimily x = MkUnique x
234 mkUniqueGrimily x = MkUnique (fromInteger (toInteger x))
237 mkUnifiableTyVarUnique i = mkUnique '_'{-MAGIC CHAR-} i
239 unpkUnifiableTyVarUnique uniq
240 = case (unpkUnique uniq) of { (tag, i) ->
241 ASSERT(tag == '_'{-MAGIC CHAR-})
244 -- pop the Char in the top 8 bits of the Unique(Supply)
246 #ifdef __GLASGOW_HASKELL__
248 -- No 64-bit bugs here, as long as we have at least 32 bits. --JSM
254 mkUnique (MkChar c#) (MkInt i#)
255 = MkUnique (w2i (((i2w (ord# c#)) `shiftL#` (i2w_s 24#)) `or#` (i2w i#)))
257 unpkUnique (MkUnique u)
259 tag = MkChar (chr# (w2i ((i2w u) `shiftr` (i2w_s 24#))))
260 i = MkInt (w2i ((i2w u) `and#` (i2w 16777215#){-``0x00ffffff''-}))
263 # if __GLASGOW_HASKELL__ >= 23
265 shiftr x y = shiftRA# x y
267 shiftr x y = shiftR# x y
270 #else {-probably HBC-}
273 = MkUnique (((fromInt (ord c)) `bitLsh` 24) `bitOr` (fromInt i))
275 unpkUnique (MkUnique u)
277 tag = chr (wordToInt (u `bitRsh` 24))
278 i = wordToInt (u `bitAnd` 16777215 {-0x00ffffff-})
282 #endif {-probably HBC-}
285 %************************************************************************
287 \subsection[Unique-instances]{Instance declarations for @Unique@}
289 %************************************************************************
291 And the whole point (besides uniqueness) is fast equality. We don't
292 use `deriving' because we want {\em precise} control of ordering
293 (equality on @Uniques@ is v common).
296 #ifdef __GLASGOW_HASKELL__
298 {-# INLINE eqUnique #-} -- this is Hammered City here...
299 {-# INLINE cmpUnique #-}
301 eqUnique (MkUnique u1) (MkUnique u2) = u1 ==# u2
302 ltUnique (MkUnique u1) (MkUnique u2) = u1 <# u2
303 leUnique (MkUnique u1) (MkUnique u2) = u1 <=# u2
305 cmpUnique (MkUnique u1) (MkUnique u2)
306 = if u1 ==# u2 then EQ_ else if u1 <# u2 then LT_ else GT_
309 eqUnique (MkUnique u1) (MkUnique u2) = u1 == u2
310 ltUnique (MkUnique u1) (MkUnique u2) = u1 < u2
311 leUnique (MkUnique u1) (MkUnique u2) = u1 <= u2
313 cmpUnique (MkUnique u1) (MkUnique u2)
314 = if u1 == u2 then EQ_ else if u1 < u2 then LT_ else GT_
317 instance Eq Unique where
318 a == b = eqUnique a b
319 a /= b = not (eqUnique a b)
321 instance Ord Unique where
323 a <= b = leUnique a b
324 a > b = not (leUnique a b)
325 a >= b = not (ltUnique a b)
326 #ifdef __GLASGOW_HASKELL__
327 _tagCmp a b = case cmpUnique a b of { LT_ -> _LT; EQ_ -> _EQ; GT__ -> _GT }
334 instance Outputable Unique where
336 = case unpkUnique uniq of
337 (tag, u) -> ppStr (tag : iToBase62 u)
341 We do sometimes make strings with @Uniques@ in them:
343 pprUnique, pprUnique10 :: Unique -> Pretty
346 = case unpkUnique uniq of
347 (tag, u) -> ppBeside (ppChar tag) (iToBase62 u)
349 pprUnique10 uniq -- in base-10, dudes
350 = case unpkUnique uniq of
351 (tag, u) -> ppBeside (ppChar tag) (ppInt u)
353 showUnique :: Unique -> FAST_STRING
354 showUnique uniq = _PK_ (ppShow 80 (pprUnique uniq))
356 instance Text Unique where
357 showsPrec p uniq rest = _UNPK_ (showUnique uniq)
358 readsPrec p = panic "no readsPrec for Unique"
361 %************************************************************************
363 \subsection[Utils-base62]{Base-62 numbers}
365 %************************************************************************
367 A character-stingy way to read/write numbers (notably Uniques).
368 The ``62-its'' are \tr{[0-9a-zA-Z]}. We don't handle negative Ints.
369 Code stolen from Lennart.
371 iToBase62 :: Int -> Pretty
373 #ifdef __GLASGOW_HASKELL__
377 bytes = case chars62 of { _ByteArray bounds_who_needs_'em bytes -> bytes }
380 case (indexCharArray# bytes n#) of { c ->
383 case (quotRem n 62) of { (q, I# r#) ->
384 case (indexCharArray# bytes r#) of { c ->
385 ppBeside (iToBase62 q) (ppChar (C# c)) }}
387 -- keep this at top level! (bug on 94/10/24 WDP)
388 chars62 :: _ByteArray Int
391 newCharArray (0, 61) `thenStrictlyST` \ ch_array ->
392 fill_in ch_array 0 62 "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
394 unsafeFreezeByteArray ch_array
397 fill_in ch_array i lim str
399 = returnStrictlyST ()
401 = writeCharArray ch_array i (str !! i) `seqStrictlyST`
402 fill_in ch_array (i+1) lim str
410 case (quotRem n 62) of { (q, r) ->
411 ppBeside (iToBase62 q) (ppChar (chars62 ! r)) }
413 -- keep this at top level! (bug on 94/10/24 WDP)
414 chars62 :: Array Int Char
416 = array (0,61) (zipWith (:=) [0..] "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
420 %************************************************************************
422 \subsection[Uniques-prelude]{@Uniques@ for wired-in Prelude things}
424 %************************************************************************
427 mkPreludeClassUnique i = mkUnique '1' i
428 mkPreludeTyConUnique i = mkUnique '2' i
429 mkPreludeDataConUnique i = mkUnique '3' i
430 mkTupleDataConUnique i = mkUnique '4' i
431 -- mkPrimOpIdUnique op: see below (uses '5')
432 mkPreludeMiscIdUnique i = mkUnique '7' i
435 %************************************************************************
437 \subsubsection[Uniques-prelude-Classes]{@Uniques@ for wired-in @Classes@}
439 %************************************************************************
442 eqClassKey = mkPreludeClassUnique 1
443 ordClassKey = mkPreludeClassUnique 2
444 numClassKey = mkPreludeClassUnique 3
445 integralClassKey = mkPreludeClassUnique 4
446 fractionalClassKey = mkPreludeClassUnique 5
447 floatingClassKey = mkPreludeClassUnique 6
448 realClassKey = mkPreludeClassUnique 7
449 realFracClassKey = mkPreludeClassUnique 8
450 realFloatClassKey = mkPreludeClassUnique 9
451 ixClassKey = mkPreludeClassUnique 10
452 enumClassKey = mkPreludeClassUnique 11
453 textClassKey = mkPreludeClassUnique 12
454 binaryClassKey = mkPreludeClassUnique 13
455 cCallableClassKey = mkPreludeClassUnique 14
456 cReturnableClassKey = mkPreludeClassUnique 15
458 pidClassKey = mkPreludeClassUnique 16
459 processorClassKey = mkPreludeClassUnique 17
460 #endif {- Data Parallel Haskell -}
463 %************************************************************************
465 \subsubsection[Uniques-prelude-TyCons]{@Uniques@ for wired-in @TyCons@}
467 %************************************************************************
470 addrPrimTyConKey = mkPreludeTyConUnique 1
471 addrTyConKey = mkPreludeTyConUnique 2
472 arrayPrimTyConKey = mkPreludeTyConUnique 3
473 boolTyConKey = mkPreludeTyConUnique 4
474 byteArrayPrimTyConKey = mkPreludeTyConUnique 5
475 --UNUSED:byteArrayTyConKey = mkPreludeTyConUnique 6
476 charPrimTyConKey = mkPreludeTyConUnique 7
477 charTyConKey = mkPreludeTyConUnique 8
478 cmpTagTyConKey = mkPreludeTyConUnique 9
479 dialogueTyConKey = mkPreludeTyConUnique 10
480 doublePrimTyConKey = mkPreludeTyConUnique 11
481 doubleTyConKey = mkPreludeTyConUnique 12
482 floatPrimTyConKey = mkPreludeTyConUnique 13
483 floatTyConKey = mkPreludeTyConUnique 14
484 --UNUSED:iOErrorTyConKey = mkPreludeTyConUnique 14
485 --UNUSED:iOIntPrimTyConKey = mkPreludeTyConUnique 15
486 iOTyConKey = mkPreludeTyConUnique 16
487 intPrimTyConKey = mkPreludeTyConUnique 17
488 intTyConKey = mkPreludeTyConUnique 18
489 integerTyConKey = mkPreludeTyConUnique 19
490 liftTyConKey = mkPreludeTyConUnique 20
491 listTyConKey = mkPreludeTyConUnique 21
492 mallocPtrPrimTyConKey = mkPreludeTyConUnique 22
493 mallocPtrTyConKey = mkPreludeTyConUnique 23
494 mutableArrayPrimTyConKey = mkPreludeTyConUnique 24
495 --UNUSED:mutableArrayTyConKey = mkPreludeTyConUnique 25
496 mutableByteArrayPrimTyConKey = mkPreludeTyConUnique 26
497 --UNUSED:mutableByteArrayTyConKey = mkPreludeTyConUnique 27
498 --UNUSED:packedStringTyConKey = mkPreludeTyConUnique 28
499 synchVarPrimTyConKey = mkPreludeTyConUnique 29
500 ratioTyConKey = mkPreludeTyConUnique 30
501 rationalTyConKey = mkPreludeTyConUnique 31
502 realWorldTyConKey = mkPreludeTyConUnique 32
503 --UNUSED:requestTyConKey = mkPreludeTyConUnique 33
504 --UNUSED:responseTyConKey = mkPreludeTyConUnique 34
505 return2GMPsTyConKey = mkPreludeTyConUnique 35
506 returnIntAndGMPTyConKey = mkPreludeTyConUnique 36
507 --UNUSED:seqIntPrimTyConKey = mkPreludeTyConUnique 37
508 --UNUSED:seqTyConKey = mkPreludeTyConUnique 38
509 stablePtrPrimTyConKey = mkPreludeTyConUnique 39
510 stablePtrTyConKey = mkPreludeTyConUnique 40
511 stateAndAddrPrimTyConKey = mkPreludeTyConUnique 41
512 stateAndArrayPrimTyConKey = mkPreludeTyConUnique 42
513 stateAndByteArrayPrimTyConKey = mkPreludeTyConUnique 43
514 stateAndCharPrimTyConKey = mkPreludeTyConUnique 44
515 stateAndDoublePrimTyConKey = mkPreludeTyConUnique 45
516 stateAndFloatPrimTyConKey = mkPreludeTyConUnique 46
517 stateAndIntPrimTyConKey = mkPreludeTyConUnique 47
518 stateAndMallocPtrPrimTyConKey = mkPreludeTyConUnique 48
519 stateAndMutableArrayPrimTyConKey = mkPreludeTyConUnique 49
520 stateAndMutableByteArrayPrimTyConKey = mkPreludeTyConUnique 50
521 stateAndSynchVarPrimTyConKey = mkPreludeTyConUnique 51
522 stateAndPtrPrimTyConKey = mkPreludeTyConUnique 52
523 stateAndStablePtrPrimTyConKey = mkPreludeTyConUnique 53
524 stateAndWordPrimTyConKey = mkPreludeTyConUnique 54
525 statePrimTyConKey = mkPreludeTyConUnique 55
526 stateTyConKey = mkPreludeTyConUnique 56
527 stringTyConKey = mkPreludeTyConUnique 57
528 stTyConKey = mkPreludeTyConUnique 58
529 primIoTyConKey = mkPreludeTyConUnique 59
530 --UNUSED:ioResultTyConKey = mkPreludeTyConUnique 60
531 voidPrimTyConKey = mkPreludeTyConUnique 61
532 wordPrimTyConKey = mkPreludeTyConUnique 62
533 wordTyConKey = mkPreludeTyConUnique 63
536 podTyConKey = mkPreludeTyConUnique 64
537 interfacePodTyConKey = mkPreludeTyConUnique 65
539 podizedPodTyConKey _ = panic "ToDo:DPH:podizedPodTyConKey"
540 #endif {- Data Parallel Haskell -}
543 %************************************************************************
545 \subsubsection[Uniques-prelude-DataCons]{@Uniques@ for wired-in @DataCons@}
547 %************************************************************************
550 addrDataConKey = mkPreludeDataConUnique 1
551 buildDataConKey = mkPreludeDataConUnique 2
552 --UNUSED:byteArrayDataConKey = mkPreludeDataConUnique 3
553 charDataConKey = mkPreludeDataConUnique 4
554 consDataConKey = mkPreludeDataConUnique 5
555 doubleDataConKey = mkPreludeDataConUnique 6
556 eqTagDataConKey = mkPreludeDataConUnique 7
557 falseDataConKey = mkPreludeDataConUnique 8
558 floatDataConKey = mkPreludeDataConUnique 9
559 gtTagDataConKey = mkPreludeDataConUnique 10
560 intDataConKey = mkPreludeDataConUnique 11
561 integerDataConKey = mkPreludeDataConUnique 12
562 liftDataConKey = mkPreludeDataConUnique 13
563 ltTagDataConKey = mkPreludeDataConUnique 14
564 mallocPtrDataConKey = mkPreludeDataConUnique 15
565 --UNUSED:mutableArrayDataConKey = mkPreludeDataConUnique 16
566 --UNUSED:mutableByteArrayDataConKey = mkPreludeDataConUnique 17
567 nilDataConKey = mkPreludeDataConUnique 18
568 --UNUSED:psDataConKey = mkPreludeDataConUnique 19
569 --UNUSED:cpsDataConKey = mkPreludeDataConUnique 20
570 ratioDataConKey = mkPreludeDataConUnique 21
571 return2GMPsDataConKey = mkPreludeDataConUnique 22
572 returnIntAndGMPDataConKey = mkPreludeDataConUnique 23
573 stablePtrDataConKey = mkPreludeDataConUnique 24
574 stateAndAddrPrimDataConKey = mkPreludeDataConUnique 25
575 stateAndArrayPrimDataConKey = mkPreludeDataConUnique 26
576 stateAndByteArrayPrimDataConKey = mkPreludeDataConUnique 27
577 stateAndCharPrimDataConKey = mkPreludeDataConUnique 28
578 stateAndDoublePrimDataConKey = mkPreludeDataConUnique 29
579 stateAndFloatPrimDataConKey = mkPreludeDataConUnique 30
580 stateAndIntPrimDataConKey = mkPreludeDataConUnique 31
581 stateAndMallocPtrPrimDataConKey = mkPreludeDataConUnique 32
582 stateAndMutableArrayPrimDataConKey = mkPreludeDataConUnique 33
583 stateAndMutableByteArrayPrimDataConKey = mkPreludeDataConUnique 34
584 stateAndSynchVarPrimDataConKey = mkPreludeDataConUnique 35
585 stateAndPtrPrimDataConKey = mkPreludeDataConUnique 36
586 stateAndStablePtrPrimDataConKey = mkPreludeDataConUnique 37
587 stateAndWordPrimDataConKey = mkPreludeDataConUnique 38
588 stateDataConKey = mkPreludeDataConUnique 39
589 trueDataConKey = mkPreludeDataConUnique 40
590 wordDataConKey = mkPreludeDataConUnique 41
593 interfacePodDataConKey = mkPreludeDataConUnique 42
594 #endif {- Data Parallel Haskell -}
597 %************************************************************************
599 \subsubsection[Uniques-prelude-Ids]{@Uniques@ for wired-in @Ids@ (except @DataCons@)}
601 %************************************************************************
603 First, for raw @PrimOps@ and their boxed versions:
605 mkPrimOpIdUnique :: PrimOp -> Unique
607 mkPrimOpIdUnique op = mkUnique '5' IBOX((tagOf_PrimOp op))
610 Now for other non-@DataCon@ @Ids@:
612 absentErrorIdKey = mkPreludeMiscIdUnique 1
613 buildIdKey = mkPreludeMiscIdUnique 2
614 errorIdKey = mkPreludeMiscIdUnique 3
615 foldlIdKey = mkPreludeMiscIdUnique 4
616 foldrIdKey = mkPreludeMiscIdUnique 5
617 forkIdKey = mkPreludeMiscIdUnique 6
618 int2IntegerIdKey = mkPreludeMiscIdUnique 7
619 integerMinusOneIdKey = mkPreludeMiscIdUnique 8
620 integerPlusOneIdKey = mkPreludeMiscIdUnique 9
621 integerZeroIdKey = mkPreludeMiscIdUnique 10
622 --UNUSED:lexIdKey = mkPreludeMiscIdUnique 11
623 packCStringIdKey = mkPreludeMiscIdUnique 12
624 parIdKey = mkPreludeMiscIdUnique 13
625 parErrorIdKey = mkPreludeMiscIdUnique 14
626 patErrorIdKey = mkPreludeMiscIdUnique 15
627 --UNUSED:readParenIdKey = mkPreludeMiscIdUnique 16
628 realWorldPrimIdKey = mkPreludeMiscIdUnique 17
629 runSTIdKey = mkPreludeMiscIdUnique 18
630 seqIdKey = mkPreludeMiscIdUnique 19
631 --UNUSED:showParenIdKey = mkPreludeMiscIdUnique 20
632 --UNUSED:showSpaceIdKey = mkPreludeMiscIdUnique 21
633 traceIdKey = mkPreludeMiscIdUnique 22
634 unpackCStringIdKey = mkPreludeMiscIdUnique 23
635 voidPrimIdKey = mkPreludeMiscIdUnique 24
638 parLocalIdKey = mkPreludeMiscIdUnique 25
639 parGlobalIdKey = mkPreludeMiscIdUnique 26
640 noFollowIdKey = mkPreludeMiscIdUnique 27
641 copyableIdKey = mkPreludeMiscIdUnique 28
645 podSelectorIdKey = mkPreludeMiscIdUnique 29
646 #endif {- Data Parallel Haskell -}
649 %************************************************************************
651 \subsection[UniqueSupply-type]{@UniqueSupply@ type and operations}
653 %************************************************************************
656 #ifdef __GLASGOW_HASKELL__
658 = MkUniqueSupply Int#
659 | MkNewSupply SplitUniqSupply
663 = MkUniqueSupply Word{-#STRICT#-}
664 | MkNewSupply SplitUniqSupply
668 @mkUniqueSupply@ is used to get a @UniqueSupply@ started.
670 mkUniqueSupply :: Char -> UniqueSupply
672 #ifdef __GLASGOW_HASKELL__
674 mkUniqueSupply (MkChar c#)
675 = MkUniqueSupply (w2i ((i2w (ord# c#)) `shiftL#` (i2w_s 24#)))
680 = MkUniqueSupply ((fromInt (ord c)) `bitLsh` 24)
684 mkUniqueSupplyGrimily s = MkNewSupply s
687 The basic operation on a @UniqueSupply@ is to get a @Unique@ (or a
688 few). It's just plain different when splittable vs.~not...
690 getUnique :: UniqueSupply -> (UniqueSupply, Unique)
692 getUnique (MkUniqueSupply n)
693 #ifdef __GLASGOW_HASKELL__
694 = (MkUniqueSupply (n +# 1#), MkUnique n)
696 = (MkUniqueSupply (n + 1), MkUnique n)
698 getUnique (MkNewSupply s)
700 (u, s1) = getSUniqueAndDepleted s
704 getUniques :: Int -- how many you want
706 -> (UniqueSupply, [Unique])
708 #ifdef __GLASGOW_HASKELL__
709 getUniques i@(MkInt i#) (MkUniqueSupply n)
710 = (MkUniqueSupply (n +# i#),
711 [ case x of { MkInt x# ->
712 MkUnique (n +# x#) } | x <- [0 .. i-1] ])
714 getUniques i (MkUniqueSupply n)
715 = (MkUniqueSupply (n + fromInt i), [ MkUnique (n + fromInt x) | x <- [0 .. i-1] ])
717 getUniques i (MkNewSupply s)
719 (us, s1) = getSUniquesAndDepleted i s
724 [OLD-ish NOTE] Simon says: The last line is preferable over @(n+i,
725 <mumble> [n .. (n+i-1)])@, because it is a little lazier. If n=bot
726 you get ([bot, bot, bot], bot) back instead of (bot,bot). This is
727 sometimes important for knot-tying.
729 Alternatively, if you hate the inefficiency:
731 (range 0, n+i) where range m | m=i = []
732 range m = n+m : range (m+1)
735 %************************************************************************
737 \subsection[UniqueSupplies-compiler]{@UniqueSupplies@ specific to the compiler}
739 %************************************************************************
741 Different parts of the compiler have their own @UniqueSupplies@, each
742 identified by their ``tag letter:''
744 B builtin; for when the compiler conjures @Uniques@ out of
746 b a second builtin; we need two in mkWrapperUnfolding (False)
750 p ``podizer'' (DPH only)
751 s core-to-core simplifier
752 S ``pod'' simplifier (DPH only)
754 T stg-to-stg simplifier
755 f flattener (of abstract~C)
756 L Assembly labels (for native-code generators)
757 u Printing out unfoldings (so don't have constant renaming)
758 P profiling (finalCCstg)
760 v used in specialised TyVarUniques (see TyVar.lhs)
762 1-9 used for ``prelude Uniques'' (wired-in things; see below)
767 5 = unboxed-primop ids
773 uniqSupply_r = mkUniqueSupply 'r'
774 uniqSupply_t = mkUniqueSupply 't'
775 uniqSupply_d = mkUniqueSupply 'd'
776 uniqSupply_p = mkUniqueSupply 'p'
777 uniqSupply_s = mkUniqueSupply 's'
778 uniqSupply_S = mkUniqueSupply 'S'
779 uniqSupply_c = mkUniqueSupply 'c'
780 uniqSupply_T = mkUniqueSupply 'T'
781 uniqSupply_f = mkUniqueSupply 'f'
782 uniqSupply_L = mkUniqueSupply 'L'
783 uniqSupply_u = mkUniqueSupply 'u'
784 uniqSupply_P = mkUniqueSupply 'P'
787 The ``builtin UniqueSupplies'' are more magical. You don't use the
788 supply, you ask for @Uniques@ directly from it. (They probably aren't
789 unique, but you know that!)
792 uniqSupply_B = mkUniqueSupply 'B' -- not exported!
793 uniqSupply_b = mkUniqueSupply 'b' -- not exported!
797 mkPseudoUnique1, mkPseudoUnique2, mkPseudoUnique3,
798 mkBuiltinUnique :: Int -> Unique
800 mkBuiltinUnique i = mkUnique 'B' i
801 mkPseudoUnique1 i = mkUnique 'C' i -- used for getTheUnique on Regs
802 mkPseudoUnique2 i = mkUnique 'D' i -- ditto
803 mkPseudoUnique3 i = mkUnique 'E' i -- ditto
805 getBuiltinUniques :: Int -> [Unique]
806 getBuiltinUniques n = map (mkUnique 'B') [1 .. n]
809 The following runs a uniq monad expression, using builtin uniq values:
811 runBuiltinUs :: UniqSM a -> a
812 runBuiltinUs m = snd (initUs uniqSupply_B m)
815 %************************************************************************
817 \subsection[Unique-monad]{Unique supply monad}
819 %************************************************************************
821 A very plain unique-supply monad.
824 type UniqSM result = UniqueSupply -> (UniqueSupply, result)
826 -- the initUs function also returns the final UniqueSupply
828 initUs :: UniqueSupply -> UniqSM a -> (UniqueSupply, a)
830 initUs init_us m = m init_us
832 #ifdef __GLASGOW_HASKELL__
833 {-# INLINE thenUs #-}
834 {-# INLINE returnUs #-}
838 @thenUs@ is are where we split the @UniqueSupply@.
840 thenUs :: UniqSM a -> (a -> UniqSM b) -> UniqSM b
844 (us1, result) -> cont result us1
848 returnUs :: a -> UniqSM a
849 returnUs result us = (us, result)
851 mapUs :: (a -> UniqSM b) -> [a] -> UniqSM [b]
853 mapUs f [] = returnUs []
855 = f x `thenUs` \ r ->
856 mapUs f xs `thenUs` \ rs ->
859 mapAndUnzipUs :: (a -> UniqSM (b,c)) -> [a] -> UniqSM ([b],[c])
861 mapAndUnzipUs f [] = returnUs ([],[])
862 mapAndUnzipUs f (x:xs)
863 = f x `thenUs` \ (r1, r2) ->
864 mapAndUnzipUs f xs `thenUs` \ (rs1, rs2) ->
865 returnUs (r1:rs1, r2:rs2)