2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
5 @Uniques@ are used to distinguish entities in the compiler (@Ids@,
6 @Classes@, etc.) from each other. Thus, @Uniques@ are the basic
7 comparison key in the compiler.
9 If there is any single operation that needs to be fast, it is @Unique@
10 comparison. Unsurprisingly, there is quite a bit of huff-and-puff
13 Some of the other hair in this code is to be able to use a
14 ``splittable @UniqueSupply@'' if requested/possible (not standard
19 Unique, Uniquable(..),
20 u2i, -- hack: used in UniqFM
22 pprUnique, pprUnique10,
24 mkUnique, -- Used in UniqSupply
25 mkUniqueGrimily, -- Used in UniqSupply only!
26 getKey, -- Used in Var only!
28 incrUnique, -- Used for renumbering
29 deriveUnique, -- Ditto
35 -- now all the built-in Uniques (and functions to make them)
36 -- [the Oh-So-Wonderful Haskell module system wins again...]
40 mkUbxTupleDataConUnique,
42 mkUbxTupleTyConUnique,
44 getBuiltinUniques, mkBuiltinUnique,
45 mkPseudoUnique1, mkPseudoUnique2, mkPseudoUnique3,
47 absentErrorIdKey, -- alphabetical...
60 byteArrayPrimTyConKey,
75 enumFromThenClassOpKey,
76 enumFromThenToClassOpKey,
91 foreignObjPrimTyConKey,
96 fromIntegerClassOpKey,
97 fromRationalClassOpKey,
110 smallIntegerDataConKey,
111 largeIntegerDataConKey,
112 integerMinusOneIdKey,
120 irrefutPatErrorIdKey,
129 mutableArrayPrimTyConKey,
130 mutableByteArrayPrimTyConKey,
131 mutableByteArrayTyConKey,
134 noMethodBindingErrorIdKey,
135 nonExhaustiveGuardsErrorIdKey,
164 stablePtrPrimTyConKey,
166 stableNameDataConKey,
167 stableNamePrimTyConKey,
176 threadIdPrimTyConKey,
183 unpackCStringAppendIdKey,
184 unpackCStringFoldrIdKey,
200 #include "HsVersions.h"
202 import FastString ( FastString, uniqueOfFS )
205 import PrelBase ( Char(..), chr, ord )
210 %************************************************************************
212 \subsection[Unique-type]{@Unique@ type and operations}
214 %************************************************************************
216 The @Chars@ are ``tag letters'' that identify the @UniqueSupply@.
217 Fast comparison is everything on @Uniques@:
220 data Unique = MkUnique Int#
224 u2i :: Unique -> FAST_INT
228 Now come the functions which construct uniques from their pieces, and vice versa.
229 The stuff about unique *supplies* is handled further down this module.
232 mkUnique :: Char -> Int -> Unique -- Builds a unique from pieces
233 unpkUnique :: Unique -> (Char, Int) -- The reverse
235 mkUniqueGrimily :: Int# -> Unique -- A trap-door for UniqSupply
237 getKey :: Unique -> Int# -- for Var
239 incrUnique :: Unique -> Unique
240 deriveUnique :: Unique -> Int -> Unique
242 isTupleKey :: Unique -> Bool
247 mkUniqueGrimily x = MkUnique x
249 {-# INLINE getKey #-}
250 getKey (MkUnique x) = x
252 incrUnique (MkUnique i) = MkUnique (i +# 1#)
254 -- deriveUnique uses an 'X' tag so that it won't clash with
255 -- any of the uniques produced any other way
256 deriveUnique (MkUnique i) delta = mkUnique 'X' (I# i + delta)
258 -- pop the Char in the top 8 bits of the Unique(Supply)
260 -- No 64-bit bugs here, as long as we have at least 32 bits. --JSM
266 mkUnique (C# c) (I# i)
267 = MkUnique (w2i (tag `or#` bits))
269 tag = i2w (ord# c) `shiftL#` i2w_s 24#
270 bits = i2w i `and#` (i2w 16777215#){-``0x00ffffff''-}
272 unpkUnique (MkUnique u)
274 tag = C# (chr# (w2i ((i2w u) `shiftr` (i2w_s 24#))))
275 i = I# (w2i ((i2w u) `and#` (i2w 16777215#){-``0x00ffffff''-}))
279 shiftr x y = shiftRL# x y
284 %************************************************************************
286 \subsection[Uniquable-class]{The @Uniquable@ class}
288 %************************************************************************
291 class Uniquable a where
292 getUnique :: a -> Unique
294 instance Uniquable FastString where
295 getUnique fs = mkUniqueGrimily (uniqueOfFS fs)
297 instance Uniquable Int where
298 getUnique (I# i#) = mkUniqueGrimily i#
302 %************************************************************************
304 \subsection[Unique-instances]{Instance declarations for @Unique@}
306 %************************************************************************
308 And the whole point (besides uniqueness) is fast equality. We don't
309 use `deriving' because we want {\em precise} control of ordering
310 (equality on @Uniques@ is v common).
313 eqUnique (MkUnique u1) (MkUnique u2) = u1 ==# u2
314 ltUnique (MkUnique u1) (MkUnique u2) = u1 <# u2
315 leUnique (MkUnique u1) (MkUnique u2) = u1 <=# u2
317 cmpUnique (MkUnique u1) (MkUnique u2)
318 = if u1 ==# u2 then EQ else if u1 <# u2 then LT else GT
320 instance Eq Unique where
321 a == b = eqUnique a b
322 a /= b = not (eqUnique a b)
324 instance Ord Unique where
326 a <= b = leUnique a b
327 a > b = not (leUnique a b)
328 a >= b = not (ltUnique a b)
329 compare a b = cmpUnique a b
332 instance Uniquable Unique where
336 We do sometimes make strings with @Uniques@ in them:
338 pprUnique, pprUnique10 :: Unique -> SDoc
341 = case unpkUnique uniq of
342 (tag, u) -> finish_ppr tag u (iToBase62 u)
344 pprUnique10 uniq -- in base-10, dudes
345 = case unpkUnique uniq of
346 (tag, u) -> finish_ppr tag u (int u)
348 finish_ppr 't' u pp_u | u < 26
349 = -- Special case to make v common tyvars, t1, t2, ...
350 -- come out as a, b, ... (shorter, easier to read)
351 char (chr (ord 'a' + u))
352 finish_ppr tag u pp_u = char tag <> pp_u
354 instance Outputable Unique where
357 instance Show Unique where
358 showsPrec p uniq = showsPrecSDoc p (pprUnique uniq)
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 # define BYTE_ARRAY GlaExts.ByteArray
372 # define RUN_ST ST.runST
373 # define AND_THEN >>=
374 # define AND_THEN_ >>
375 # define RETURN return
377 iToBase62 :: Int -> SDoc
382 #if __GLASGOW_HASKELL__ < 405
383 bytes = case chars62 of { BYTE_ARRAY bounds_who_needs_'em bytes -> bytes }
385 bytes = case chars62 of { BYTE_ARRAY _ _ bytes -> bytes }
389 case (indexCharArray# bytes n#) of { c ->
392 case (quotRem n 62) of { (q, I# r#) ->
393 case (indexCharArray# bytes r#) of { c ->
394 (<>) (iToBase62 q) (char (C# c)) }}
396 -- keep this at top level! (bug on 94/10/24 WDP)
397 chars62 :: BYTE_ARRAY Int
400 newCharArray (0, 61) AND_THEN \ ch_array ->
401 fill_in ch_array 0 62 "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
403 unsafeFreezeByteArray ch_array
406 fill_in ch_array i lim str
410 = writeCharArray ch_array i (str !! i) AND_THEN_
411 fill_in ch_array (i+1) lim str
414 %************************************************************************
416 \subsection[Uniques-prelude]{@Uniques@ for wired-in Prelude things}
418 %************************************************************************
420 Allocation of unique supply characters:
421 v,t,u : for renumbering value-, type- and usage- vars.
422 other a-z: lower case chars for unique supplies (see Main.lhs)
424 C-E: pseudo uniques (used in native-code generator)
425 X: uniques derived by deriveUnique
426 _: unifiable tyvars (above)
427 0-9: prelude things below
430 mkAlphaTyVarUnique i = mkUnique '1' i
432 mkPreludeClassUnique i = mkUnique '2' i
433 mkPreludeTyConUnique i = mkUnique '3' i
434 mkTupleTyConUnique a = mkUnique '4' a
435 mkUbxTupleTyConUnique a = mkUnique '5' a
437 -- Data constructor keys occupy *two* slots. The first is used for the
438 -- data constructor itself and its wrapper function (the function that
439 -- evaluates arguments as necessary and calls the worker). The second is
440 -- used for the worker function (the function that builds the constructor
443 mkPreludeDataConUnique i = mkUnique '6' (2*i) -- Must be alphabetic
444 mkTupleDataConUnique a = mkUnique '7' (2*a) -- ditto (*may* be used in C labels)
445 mkUbxTupleDataConUnique a = mkUnique '8' (2*a)
447 -- This one is used for a tiresome reason
448 -- to improve a consistency-checking error check in the renamer
449 isTupleKey u = case unpkUnique u of
450 (tag,_) -> tag == '4' || tag == '5' || tag == '7' || tag == '8'
452 mkPrimOpIdUnique op = mkUnique '9' op
453 mkPreludeMiscIdUnique i = mkUnique '0' i
455 -- The "tyvar uniques" print specially nicely: a, b, c, etc.
456 -- See pprUnique for details
458 initTyVarUnique :: Unique
459 initTyVarUnique = mkUnique 't' 0
461 initTidyUniques :: (Unique, Unique) -- Global and local
462 initTidyUniques = (mkUnique 'g' 0, mkUnique 'x' 0)
464 mkPseudoUnique1, mkPseudoUnique2, mkPseudoUnique3,
465 mkBuiltinUnique :: Int -> Unique
467 mkBuiltinUnique i = mkUnique 'B' i
468 mkPseudoUnique1 i = mkUnique 'C' i -- used for getUnique on Regs
469 mkPseudoUnique2 i = mkUnique 'D' i -- ditto
470 mkPseudoUnique3 i = mkUnique 'E' i -- ditto
472 getBuiltinUniques :: Int -> [Unique]
473 getBuiltinUniques n = map (mkUnique 'B') [1 .. n]
476 %************************************************************************
478 \subsubsection[Uniques-prelude-Classes]{@Uniques@ for wired-in @Classes@}
480 %************************************************************************
483 boundedClassKey = mkPreludeClassUnique 1
484 enumClassKey = mkPreludeClassUnique 2
485 eqClassKey = mkPreludeClassUnique 3
486 floatingClassKey = mkPreludeClassUnique 5
487 fractionalClassKey = mkPreludeClassUnique 6
488 integralClassKey = mkPreludeClassUnique 7
489 monadClassKey = mkPreludeClassUnique 8
490 monadPlusClassKey = mkPreludeClassUnique 9
491 functorClassKey = mkPreludeClassUnique 10
492 numClassKey = mkPreludeClassUnique 11
493 ordClassKey = mkPreludeClassUnique 12
494 readClassKey = mkPreludeClassUnique 13
495 realClassKey = mkPreludeClassUnique 14
496 realFloatClassKey = mkPreludeClassUnique 15
497 realFracClassKey = mkPreludeClassUnique 16
498 showClassKey = mkPreludeClassUnique 17
500 cCallableClassKey = mkPreludeClassUnique 18
501 cReturnableClassKey = mkPreludeClassUnique 19
503 ixClassKey = mkPreludeClassUnique 20
506 %************************************************************************
508 \subsubsection[Uniques-prelude-TyCons]{@Uniques@ for wired-in @TyCons@}
510 %************************************************************************
513 addrPrimTyConKey = mkPreludeTyConUnique 1
514 addrTyConKey = mkPreludeTyConUnique 2
515 arrayPrimTyConKey = mkPreludeTyConUnique 3
516 boolTyConKey = mkPreludeTyConUnique 4
517 byteArrayPrimTyConKey = mkPreludeTyConUnique 5
518 charPrimTyConKey = mkPreludeTyConUnique 7
519 charTyConKey = mkPreludeTyConUnique 8
520 doublePrimTyConKey = mkPreludeTyConUnique 9
521 doubleTyConKey = mkPreludeTyConUnique 10
522 floatPrimTyConKey = mkPreludeTyConUnique 11
523 floatTyConKey = mkPreludeTyConUnique 12
524 funTyConKey = mkPreludeTyConUnique 13
525 intPrimTyConKey = mkPreludeTyConUnique 14
526 intTyConKey = mkPreludeTyConUnique 15
527 int8TyConKey = mkPreludeTyConUnique 16
528 int16TyConKey = mkPreludeTyConUnique 17
529 int32TyConKey = mkPreludeTyConUnique 18
530 int64PrimTyConKey = mkPreludeTyConUnique 19
531 int64TyConKey = mkPreludeTyConUnique 20
532 integerTyConKey = mkPreludeTyConUnique 21
533 listTyConKey = mkPreludeTyConUnique 22
534 foreignObjPrimTyConKey = mkPreludeTyConUnique 23
535 foreignObjTyConKey = mkPreludeTyConUnique 24
536 weakPrimTyConKey = mkPreludeTyConUnique 25
537 mutableArrayPrimTyConKey = mkPreludeTyConUnique 26
538 mutableByteArrayPrimTyConKey = mkPreludeTyConUnique 27
539 orderingTyConKey = mkPreludeTyConUnique 28
540 mVarPrimTyConKey = mkPreludeTyConUnique 29
541 ratioTyConKey = mkPreludeTyConUnique 30
542 rationalTyConKey = mkPreludeTyConUnique 31
543 realWorldTyConKey = mkPreludeTyConUnique 32
544 stablePtrPrimTyConKey = mkPreludeTyConUnique 33
545 stablePtrTyConKey = mkPreludeTyConUnique 34
546 statePrimTyConKey = mkPreludeTyConUnique 35
547 stableNamePrimTyConKey = mkPreludeTyConUnique 50
548 stableNameTyConKey = mkPreludeTyConUnique 51
549 mutableByteArrayTyConKey = mkPreludeTyConUnique 52
550 mutVarPrimTyConKey = mkPreludeTyConUnique 53
551 ioTyConKey = mkPreludeTyConUnique 55
552 byteArrayTyConKey = mkPreludeTyConUnique 56
553 wordPrimTyConKey = mkPreludeTyConUnique 57
554 wordTyConKey = mkPreludeTyConUnique 58
555 word8TyConKey = mkPreludeTyConUnique 59
556 word16TyConKey = mkPreludeTyConUnique 60
557 word32TyConKey = mkPreludeTyConUnique 61
558 word64PrimTyConKey = mkPreludeTyConUnique 62
559 word64TyConKey = mkPreludeTyConUnique 63
560 boxedConKey = mkPreludeTyConUnique 64
561 unboxedConKey = mkPreludeTyConUnique 65
562 anyBoxConKey = mkPreludeTyConUnique 66
563 kindConKey = mkPreludeTyConUnique 67
564 boxityConKey = mkPreludeTyConUnique 68
565 typeConKey = mkPreludeTyConUnique 69
566 threadIdPrimTyConKey = mkPreludeTyConUnique 70
569 %************************************************************************
571 \subsubsection[Uniques-prelude-DataCons]{@Uniques@ for wired-in @DataCons@}
573 %************************************************************************
576 addrDataConKey = mkPreludeDataConUnique 0
577 charDataConKey = mkPreludeDataConUnique 1
578 consDataConKey = mkPreludeDataConUnique 2
579 doubleDataConKey = mkPreludeDataConUnique 3
580 falseDataConKey = mkPreludeDataConUnique 4
581 floatDataConKey = mkPreludeDataConUnique 5
582 intDataConKey = mkPreludeDataConUnique 6
583 smallIntegerDataConKey = mkPreludeDataConUnique 7
584 largeIntegerDataConKey = mkPreludeDataConUnique 8
585 foreignObjDataConKey = mkPreludeDataConUnique 9
586 nilDataConKey = mkPreludeDataConUnique 10
587 ratioDataConKey = mkPreludeDataConUnique 11
588 stablePtrDataConKey = mkPreludeDataConUnique 12
589 stableNameDataConKey = mkPreludeDataConUnique 13
590 trueDataConKey = mkPreludeDataConUnique 14
591 wordDataConKey = mkPreludeDataConUnique 15
592 stDataConKey = mkPreludeDataConUnique 16
593 ioDataConKey = mkPreludeDataConUnique 17
596 %************************************************************************
598 \subsubsection[Uniques-prelude-Ids]{@Uniques@ for wired-in @Ids@ (except @DataCons@)}
600 %************************************************************************
603 absentErrorIdKey = mkPreludeMiscIdUnique 1
604 appendIdKey = mkPreludeMiscIdUnique 2
605 augmentIdKey = mkPreludeMiscIdUnique 3
606 buildIdKey = mkPreludeMiscIdUnique 4
607 errorIdKey = mkPreludeMiscIdUnique 5
608 foldlIdKey = mkPreludeMiscIdUnique 6
609 foldrIdKey = mkPreludeMiscIdUnique 7
610 recSelErrIdKey = mkPreludeMiscIdUnique 8
611 integerMinusOneIdKey = mkPreludeMiscIdUnique 9
612 integerPlusOneIdKey = mkPreludeMiscIdUnique 10
613 integerPlusTwoIdKey = mkPreludeMiscIdUnique 11
614 integerZeroIdKey = mkPreludeMiscIdUnique 12
615 int2IntegerIdKey = mkPreludeMiscIdUnique 13
616 addr2IntegerIdKey = mkPreludeMiscIdUnique 14
617 irrefutPatErrorIdKey = mkPreludeMiscIdUnique 15
618 lexIdKey = mkPreludeMiscIdUnique 16
619 noMethodBindingErrorIdKey = mkPreludeMiscIdUnique 17
620 nonExhaustiveGuardsErrorIdKey = mkPreludeMiscIdUnique 18
621 packCStringIdKey = mkPreludeMiscIdUnique 19
622 parErrorIdKey = mkPreludeMiscIdUnique 20
623 parIdKey = mkPreludeMiscIdUnique 21
624 patErrorIdKey = mkPreludeMiscIdUnique 22
625 realWorldPrimIdKey = mkPreludeMiscIdUnique 23
626 recConErrorIdKey = mkPreludeMiscIdUnique 24
627 recUpdErrorIdKey = mkPreludeMiscIdUnique 25
628 traceIdKey = mkPreludeMiscIdUnique 26
629 unpackCString2IdKey = mkPreludeMiscIdUnique 27
630 unpackCStringAppendIdKey = mkPreludeMiscIdUnique 28
631 unpackCStringFoldrIdKey = mkPreludeMiscIdUnique 29
632 unpackCStringIdKey = mkPreludeMiscIdUnique 30
633 ushowListIdKey = mkPreludeMiscIdUnique 31
634 unsafeCoerceIdKey = mkPreludeMiscIdUnique 32
635 concatIdKey = mkPreludeMiscIdUnique 33
636 filterIdKey = mkPreludeMiscIdUnique 34
637 zipIdKey = mkPreludeMiscIdUnique 35
638 bindIOIdKey = mkPreludeMiscIdUnique 36
639 returnIOIdKey = mkPreludeMiscIdUnique 37
640 deRefStablePtrIdKey = mkPreludeMiscIdUnique 38
641 makeStablePtrIdKey = mkPreludeMiscIdUnique 39
642 getTagIdKey = mkPreludeMiscIdUnique 40
645 Certain class operations from Prelude classes. They get their own
646 uniques so we can look them up easily when we want to conjure them up
647 during type checking.
650 fromIntClassOpKey = mkPreludeMiscIdUnique 101
651 fromIntegerClassOpKey = mkPreludeMiscIdUnique 102
652 minusClassOpKey = mkPreludeMiscIdUnique 103
653 fromRationalClassOpKey = mkPreludeMiscIdUnique 104
654 enumFromClassOpKey = mkPreludeMiscIdUnique 105
655 enumFromThenClassOpKey = mkPreludeMiscIdUnique 106
656 enumFromToClassOpKey = mkPreludeMiscIdUnique 107
657 enumFromThenToClassOpKey = mkPreludeMiscIdUnique 108
658 eqClassOpKey = mkPreludeMiscIdUnique 109
659 geClassOpKey = mkPreludeMiscIdUnique 110
660 failMClassOpKey = mkPreludeMiscIdUnique 112
661 thenMClassOpKey = mkPreludeMiscIdUnique 113 -- (>>=)
662 -- Just a place holder for unbound variables produced by the renamer:
663 unboundKey = mkPreludeMiscIdUnique 114
664 fromEnumClassOpKey = mkPreludeMiscIdUnique 115
666 mainKey = mkPreludeMiscIdUnique 116
667 returnMClassOpKey = mkPreludeMiscIdUnique 117
668 otherwiseIdKey = mkPreludeMiscIdUnique 118
669 toEnumClassOpKey = mkPreludeMiscIdUnique 119
670 mapIdKey = mkPreludeMiscIdUnique 120
674 assertIdKey = mkPreludeMiscIdUnique 121
675 runSTRepIdKey = mkPreludeMiscIdUnique 122