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(..), hasKey,
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
30 newTagUnique, -- Used in CgCase
36 -- now all the built-in Uniques (and functions to make them)
37 -- [the Oh-So-Wonderful Haskell module system wins again...]
43 getBuiltinUniques, mkBuiltinUnique,
44 mkPseudoUnique1, mkPseudoUnique2, mkPseudoUnique3,
46 absentErrorIdKey, -- alphabetical...
60 byteArrayPrimTyConKey,
75 enumFromThenClassOpKey,
76 enumFromThenToClassOpKey,
92 foreignObjPrimTyConKey,
97 fromIntegerClassOpKey,
98 fromRationalClassOpKey,
111 smallIntegerDataConKey,
112 largeIntegerDataConKey,
113 integerMinusOneIdKey,
120 irrefutPatErrorIdKey,
129 mutableArrayPrimTyConKey,
130 mutableByteArrayPrimTyConKey,
131 mutableByteArrayTyConKey,
134 noMethodBindingErrorIdKey,
135 nonExhaustiveGuardsErrorIdKey,
164 stablePtrPrimTyConKey,
166 stableNameDataConKey,
167 stableNamePrimTyConKey,
177 threadIdPrimTyConKey,
183 unpackCStringUtf8IdKey,
184 unpackCStringAppendIdKey,
185 unpackCStringFoldrIdKey,
201 #include "HsVersions.h"
203 import BasicTypes ( Boxity(..) )
204 import FastString ( FastString, uniqueOfFS )
207 import PrelBase ( Char(..), chr, ord )
212 %************************************************************************
214 \subsection[Unique-type]{@Unique@ type and operations}
216 %************************************************************************
218 The @Chars@ are ``tag letters'' that identify the @UniqueSupply@.
219 Fast comparison is everything on @Uniques@:
222 data Unique = MkUnique Int#
226 u2i :: Unique -> FAST_INT
230 Now come the functions which construct uniques from their pieces, and vice versa.
231 The stuff about unique *supplies* is handled further down this module.
234 mkUnique :: Char -> Int -> Unique -- Builds a unique from pieces
235 unpkUnique :: Unique -> (Char, Int) -- The reverse
237 mkUniqueGrimily :: Int# -> Unique -- A trap-door for UniqSupply
239 getKey :: Unique -> Int# -- for Var
241 incrUnique :: Unique -> Unique
242 deriveUnique :: Unique -> Int -> Unique
243 newTagUnique :: Unique -> Char -> Unique
245 isTupleKey :: Unique -> Bool
250 mkUniqueGrimily x = MkUnique x
252 {-# INLINE getKey #-}
253 getKey (MkUnique x) = x
255 incrUnique (MkUnique i) = MkUnique (i +# 1#)
257 -- deriveUnique uses an 'X' tag so that it won't clash with
258 -- any of the uniques produced any other way
259 deriveUnique (MkUnique i) delta = mkUnique 'X' (I# i + delta)
261 -- newTagUnique changes the "domain" of a unique to a different char
262 newTagUnique u c = mkUnique c i where (_,i) = unpkUnique u
264 -- pop the Char in the top 8 bits of the Unique(Supply)
266 -- No 64-bit bugs here, as long as we have at least 32 bits. --JSM
272 mkUnique (C# c) (I# i)
273 = MkUnique (w2i (tag `or#` bits))
275 tag = i2w (ord# c) `shiftL#` i2w_s 24#
276 bits = i2w i `and#` (i2w 16777215#){-``0x00ffffff''-}
278 unpkUnique (MkUnique u)
280 tag = C# (chr# (w2i ((i2w u) `shiftr` (i2w_s 24#))))
281 i = I# (w2i ((i2w u) `and#` (i2w 16777215#){-``0x00ffffff''-}))
285 shiftr x y = shiftRL# x y
290 %************************************************************************
292 \subsection[Uniquable-class]{The @Uniquable@ class}
294 %************************************************************************
297 class Uniquable a where
298 getUnique :: a -> Unique
300 hasKey :: Uniquable a => a -> Unique -> Bool
301 x `hasKey` k = getUnique x == k
303 instance Uniquable FastString where
304 getUnique fs = mkUniqueGrimily (uniqueOfFS fs)
306 instance Uniquable Int where
307 getUnique (I# i#) = mkUniqueGrimily i#
311 %************************************************************************
313 \subsection[Unique-instances]{Instance declarations for @Unique@}
315 %************************************************************************
317 And the whole point (besides uniqueness) is fast equality. We don't
318 use `deriving' because we want {\em precise} control of ordering
319 (equality on @Uniques@ is v common).
322 eqUnique (MkUnique u1) (MkUnique u2) = u1 ==# u2
323 ltUnique (MkUnique u1) (MkUnique u2) = u1 <# u2
324 leUnique (MkUnique u1) (MkUnique u2) = u1 <=# u2
326 cmpUnique (MkUnique u1) (MkUnique u2)
327 = if u1 ==# u2 then EQ else if u1 <# u2 then LT else GT
329 instance Eq Unique where
330 a == b = eqUnique a b
331 a /= b = not (eqUnique a b)
333 instance Ord Unique where
335 a <= b = leUnique a b
336 a > b = not (leUnique a b)
337 a >= b = not (ltUnique a b)
338 compare a b = cmpUnique a b
341 instance Uniquable Unique where
345 We do sometimes make strings with @Uniques@ in them:
347 pprUnique, pprUnique10 :: Unique -> SDoc
350 = case unpkUnique uniq of
351 (tag, u) -> finish_ppr tag u (iToBase62 u)
353 pprUnique10 uniq -- in base-10, dudes
354 = case unpkUnique uniq of
355 (tag, u) -> finish_ppr tag u (int u)
357 finish_ppr 't' u pp_u | u < 26
358 = -- Special case to make v common tyvars, t1, t2, ...
359 -- come out as a, b, ... (shorter, easier to read)
360 char (chr (ord 'a' + u))
361 finish_ppr tag u pp_u = char tag <> pp_u
363 instance Outputable Unique where
366 instance Show Unique where
367 showsPrec p uniq = showsPrecSDoc p (pprUnique uniq)
370 %************************************************************************
372 \subsection[Utils-base62]{Base-62 numbers}
374 %************************************************************************
376 A character-stingy way to read/write numbers (notably Uniques).
377 The ``62-its'' are \tr{[0-9a-zA-Z]}. We don't handle negative Ints.
378 Code stolen from Lennart.
380 # define BYTE_ARRAY GlaExts.ByteArray
381 # define RUN_ST ST.runST
382 # define AND_THEN >>=
383 # define AND_THEN_ >>
384 # define RETURN return
386 iToBase62 :: Int -> SDoc
391 #if __GLASGOW_HASKELL__ < 405
392 bytes = case chars62 of { BYTE_ARRAY bounds_who_needs_'em bytes -> bytes }
394 bytes = case chars62 of { BYTE_ARRAY _ _ bytes -> bytes }
398 case (indexCharArray# bytes n#) of { c ->
401 case (quotRem n 62) of { (q, I# r#) ->
402 case (indexCharArray# bytes r#) of { c ->
403 (<>) (iToBase62 q) (char (C# c)) }}
405 -- keep this at top level! (bug on 94/10/24 WDP)
406 chars62 :: BYTE_ARRAY Int
409 newCharArray (0, 61) AND_THEN \ ch_array ->
410 fill_in ch_array 0 62 "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
412 unsafeFreezeByteArray ch_array
415 fill_in ch_array i lim str
419 = writeCharArray ch_array i (str !! i) AND_THEN_
420 fill_in ch_array (i+1) lim str
423 %************************************************************************
425 \subsection[Uniques-prelude]{@Uniques@ for wired-in Prelude things}
427 %************************************************************************
429 Allocation of unique supply characters:
430 v,t,u : for renumbering value-, type- and usage- vars.
431 other a-z: lower case chars for unique supplies (see Main.lhs)
433 C-E: pseudo uniques (used in native-code generator)
434 X: uniques derived by deriveUnique
435 _: unifiable tyvars (above)
436 0-9: prelude things below
439 mkAlphaTyVarUnique i = mkUnique '1' i
441 mkPreludeClassUnique i = mkUnique '2' i
442 mkPreludeTyConUnique i = mkUnique '3' i
443 mkTupleTyConUnique Boxed a = mkUnique '4' a
444 mkTupleTyConUnique Unboxed a = mkUnique '5' a
446 -- Data constructor keys occupy *two* slots. The first is used for the
447 -- data constructor itself and its wrapper function (the function that
448 -- evaluates arguments as necessary and calls the worker). The second is
449 -- used for the worker function (the function that builds the constructor
452 mkPreludeDataConUnique i = mkUnique '6' (2*i) -- Must be alphabetic
453 mkTupleDataConUnique Boxed a = mkUnique '7' (2*a) -- ditto (*may* be used in C labels)
454 mkTupleDataConUnique Unboxed a = mkUnique '8' (2*a)
456 -- This one is used for a tiresome reason
457 -- to improve a consistency-checking error check in the renamer
458 isTupleKey u = case unpkUnique u of
459 (tag,_) -> tag == '4' || tag == '5' || tag == '7' || tag == '8'
461 mkPrimOpIdUnique op = mkUnique '9' op
462 mkPreludeMiscIdUnique i = mkUnique '0' i
464 -- The "tyvar uniques" print specially nicely: a, b, c, etc.
465 -- See pprUnique for details
467 initTyVarUnique :: Unique
468 initTyVarUnique = mkUnique 't' 0
470 initTidyUniques :: (Unique, Unique) -- Global and local
471 initTidyUniques = (mkUnique 'g' 0, mkUnique 'x' 0)
473 mkPseudoUnique1, mkPseudoUnique2, mkPseudoUnique3,
474 mkBuiltinUnique :: Int -> Unique
476 mkBuiltinUnique i = mkUnique 'B' i
477 mkPseudoUnique1 i = mkUnique 'C' i -- used for getUnique on Regs
478 mkPseudoUnique2 i = mkUnique 'D' i -- used in NCG for getUnique on RealRegs
479 mkPseudoUnique3 i = mkUnique 'E' i -- used in NCG spiller to create spill VirtualRegs
483 getBuiltinUniques :: Int -> [Unique]
484 getBuiltinUniques n = map (mkUnique 'B') [1 .. n]
487 %************************************************************************
489 \subsubsection[Uniques-prelude-Classes]{@Uniques@ for wired-in @Classes@}
491 %************************************************************************
494 boundedClassKey = mkPreludeClassUnique 1
495 enumClassKey = mkPreludeClassUnique 2
496 eqClassKey = mkPreludeClassUnique 3
497 floatingClassKey = mkPreludeClassUnique 5
498 fractionalClassKey = mkPreludeClassUnique 6
499 integralClassKey = mkPreludeClassUnique 7
500 monadClassKey = mkPreludeClassUnique 8
501 monadPlusClassKey = mkPreludeClassUnique 9
502 functorClassKey = mkPreludeClassUnique 10
503 numClassKey = mkPreludeClassUnique 11
504 ordClassKey = mkPreludeClassUnique 12
505 readClassKey = mkPreludeClassUnique 13
506 realClassKey = mkPreludeClassUnique 14
507 realFloatClassKey = mkPreludeClassUnique 15
508 realFracClassKey = mkPreludeClassUnique 16
509 showClassKey = mkPreludeClassUnique 17
511 cCallableClassKey = mkPreludeClassUnique 18
512 cReturnableClassKey = mkPreludeClassUnique 19
514 ixClassKey = mkPreludeClassUnique 20
517 %************************************************************************
519 \subsubsection[Uniques-prelude-TyCons]{@Uniques@ for wired-in @TyCons@}
521 %************************************************************************
524 addrPrimTyConKey = mkPreludeTyConUnique 1
525 addrTyConKey = mkPreludeTyConUnique 2
526 arrayPrimTyConKey = mkPreludeTyConUnique 3
527 boolTyConKey = mkPreludeTyConUnique 4
528 byteArrayPrimTyConKey = mkPreludeTyConUnique 5
529 charPrimTyConKey = mkPreludeTyConUnique 7
530 charTyConKey = mkPreludeTyConUnique 8
531 doublePrimTyConKey = mkPreludeTyConUnique 9
532 doubleTyConKey = mkPreludeTyConUnique 10
533 floatPrimTyConKey = mkPreludeTyConUnique 11
534 floatTyConKey = mkPreludeTyConUnique 12
535 funTyConKey = mkPreludeTyConUnique 13
536 intPrimTyConKey = mkPreludeTyConUnique 14
537 intTyConKey = mkPreludeTyConUnique 15
538 int8TyConKey = mkPreludeTyConUnique 16
539 int16TyConKey = mkPreludeTyConUnique 17
540 int32TyConKey = mkPreludeTyConUnique 18
541 int64PrimTyConKey = mkPreludeTyConUnique 19
542 int64TyConKey = mkPreludeTyConUnique 20
543 integerTyConKey = mkPreludeTyConUnique 21
544 listTyConKey = mkPreludeTyConUnique 22
545 foreignObjPrimTyConKey = mkPreludeTyConUnique 23
546 foreignObjTyConKey = mkPreludeTyConUnique 24
547 weakPrimTyConKey = mkPreludeTyConUnique 25
548 mutableArrayPrimTyConKey = mkPreludeTyConUnique 26
549 mutableByteArrayPrimTyConKey = mkPreludeTyConUnique 27
550 orderingTyConKey = mkPreludeTyConUnique 28
551 mVarPrimTyConKey = mkPreludeTyConUnique 29
552 ratioTyConKey = mkPreludeTyConUnique 30
553 rationalTyConKey = mkPreludeTyConUnique 31
554 realWorldTyConKey = mkPreludeTyConUnique 32
555 stablePtrPrimTyConKey = mkPreludeTyConUnique 33
556 stablePtrTyConKey = mkPreludeTyConUnique 34
557 statePrimTyConKey = mkPreludeTyConUnique 35
558 stableNamePrimTyConKey = mkPreludeTyConUnique 50
559 stableNameTyConKey = mkPreludeTyConUnique 51
560 mutableByteArrayTyConKey = mkPreludeTyConUnique 52
561 mutVarPrimTyConKey = mkPreludeTyConUnique 53
562 ioTyConKey = mkPreludeTyConUnique 55
563 byteArrayTyConKey = mkPreludeTyConUnique 56
564 wordPrimTyConKey = mkPreludeTyConUnique 57
565 wordTyConKey = mkPreludeTyConUnique 58
566 word8TyConKey = mkPreludeTyConUnique 59
567 word16TyConKey = mkPreludeTyConUnique 60
568 word32TyConKey = mkPreludeTyConUnique 61
569 word64PrimTyConKey = mkPreludeTyConUnique 62
570 word64TyConKey = mkPreludeTyConUnique 63
571 boxedConKey = mkPreludeTyConUnique 64
572 unboxedConKey = mkPreludeTyConUnique 65
573 anyBoxConKey = mkPreludeTyConUnique 66
574 kindConKey = mkPreludeTyConUnique 67
575 boxityConKey = mkPreludeTyConUnique 68
576 typeConKey = mkPreludeTyConUnique 69
577 threadIdPrimTyConKey = mkPreludeTyConUnique 70
578 bcoPrimTyConKey = mkPreludeTyConUnique 71
581 %************************************************************************
583 \subsubsection[Uniques-prelude-DataCons]{@Uniques@ for wired-in @DataCons@}
585 %************************************************************************
588 addrDataConKey = mkPreludeDataConUnique 0
589 charDataConKey = mkPreludeDataConUnique 1
590 consDataConKey = mkPreludeDataConUnique 2
591 doubleDataConKey = mkPreludeDataConUnique 3
592 falseDataConKey = mkPreludeDataConUnique 4
593 floatDataConKey = mkPreludeDataConUnique 5
594 intDataConKey = mkPreludeDataConUnique 6
595 smallIntegerDataConKey = mkPreludeDataConUnique 7
596 largeIntegerDataConKey = mkPreludeDataConUnique 8
597 foreignObjDataConKey = mkPreludeDataConUnique 9
598 nilDataConKey = mkPreludeDataConUnique 10
599 ratioDataConKey = mkPreludeDataConUnique 11
600 stablePtrDataConKey = mkPreludeDataConUnique 12
601 stableNameDataConKey = mkPreludeDataConUnique 13
602 trueDataConKey = mkPreludeDataConUnique 14
603 wordDataConKey = mkPreludeDataConUnique 15
604 ioDataConKey = mkPreludeDataConUnique 16
607 %************************************************************************
609 \subsubsection[Uniques-prelude-Ids]{@Uniques@ for wired-in @Ids@ (except @DataCons@)}
611 %************************************************************************
614 absentErrorIdKey = mkPreludeMiscIdUnique 1
615 appendIdKey = mkPreludeMiscIdUnique 2
616 augmentIdKey = mkPreludeMiscIdUnique 3
617 buildIdKey = mkPreludeMiscIdUnique 4
618 errorIdKey = mkPreludeMiscIdUnique 5
619 foldlIdKey = mkPreludeMiscIdUnique 6
620 foldrIdKey = mkPreludeMiscIdUnique 7
621 recSelErrIdKey = mkPreludeMiscIdUnique 8
622 integerMinusOneIdKey = mkPreludeMiscIdUnique 9
623 integerPlusOneIdKey = mkPreludeMiscIdUnique 10
624 integerPlusTwoIdKey = mkPreludeMiscIdUnique 11
625 integerZeroIdKey = mkPreludeMiscIdUnique 12
626 int2IntegerIdKey = mkPreludeMiscIdUnique 13
627 irrefutPatErrorIdKey = mkPreludeMiscIdUnique 15
628 eqStringIdKey = mkPreludeMiscIdUnique 16
629 noMethodBindingErrorIdKey = mkPreludeMiscIdUnique 17
630 nonExhaustiveGuardsErrorIdKey = mkPreludeMiscIdUnique 18
631 parErrorIdKey = mkPreludeMiscIdUnique 20
632 parIdKey = mkPreludeMiscIdUnique 21
633 patErrorIdKey = mkPreludeMiscIdUnique 22
634 realWorldPrimIdKey = mkPreludeMiscIdUnique 23
635 recConErrorIdKey = mkPreludeMiscIdUnique 24
636 recUpdErrorIdKey = mkPreludeMiscIdUnique 25
637 traceIdKey = mkPreludeMiscIdUnique 26
638 unpackCStringUtf8IdKey = mkPreludeMiscIdUnique 27
639 unpackCStringAppendIdKey = mkPreludeMiscIdUnique 28
640 unpackCStringFoldrIdKey = mkPreludeMiscIdUnique 29
641 unpackCStringIdKey = mkPreludeMiscIdUnique 30
642 ushowListIdKey = mkPreludeMiscIdUnique 31
643 unsafeCoerceIdKey = mkPreludeMiscIdUnique 32
644 concatIdKey = mkPreludeMiscIdUnique 33
645 filterIdKey = mkPreludeMiscIdUnique 34
646 zipIdKey = mkPreludeMiscIdUnique 35
647 bindIOIdKey = mkPreludeMiscIdUnique 36
648 returnIOIdKey = mkPreludeMiscIdUnique 37
649 deRefStablePtrIdKey = mkPreludeMiscIdUnique 38
650 makeStablePtrIdKey = mkPreludeMiscIdUnique 39
651 getTagIdKey = mkPreludeMiscIdUnique 40
652 plusIntegerIdKey = mkPreludeMiscIdUnique 41
653 timesIntegerIdKey = mkPreludeMiscIdUnique 42
656 Certain class operations from Prelude classes. They get their own
657 uniques so we can look them up easily when we want to conjure them up
658 during type checking.
661 fromIntClassOpKey = mkPreludeMiscIdUnique 101
662 fromIntegerClassOpKey = mkPreludeMiscIdUnique 102
663 minusClassOpKey = mkPreludeMiscIdUnique 103
664 fromRationalClassOpKey = mkPreludeMiscIdUnique 104
665 enumFromClassOpKey = mkPreludeMiscIdUnique 105
666 enumFromThenClassOpKey = mkPreludeMiscIdUnique 106
667 enumFromToClassOpKey = mkPreludeMiscIdUnique 107
668 enumFromThenToClassOpKey = mkPreludeMiscIdUnique 108
669 eqClassOpKey = mkPreludeMiscIdUnique 109
670 geClassOpKey = mkPreludeMiscIdUnique 110
671 failMClassOpKey = mkPreludeMiscIdUnique 112
672 thenMClassOpKey = mkPreludeMiscIdUnique 113 -- (>>=)
673 -- Just a place holder for unbound variables produced by the renamer:
674 unboundKey = mkPreludeMiscIdUnique 114
675 fromEnumClassOpKey = mkPreludeMiscIdUnique 115
677 mainKey = mkPreludeMiscIdUnique 116
678 returnMClassOpKey = mkPreludeMiscIdUnique 117
679 otherwiseIdKey = mkPreludeMiscIdUnique 118
680 toEnumClassOpKey = mkPreludeMiscIdUnique 119
681 mapIdKey = mkPreludeMiscIdUnique 120
685 assertIdKey = mkPreludeMiscIdUnique 121
686 runSTRepIdKey = mkPreludeMiscIdUnique 122