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
32 -- now all the built-in Uniques (and functions to make them)
33 -- [the Oh-So-Wonderful Haskell module system wins again...]
37 mkUbxTupleDataConUnique,
39 mkUbxTupleTyConUnique,
41 getBuiltinUniques, mkBuiltinUnique,
42 mkPseudoUnique1, mkPseudoUnique2, mkPseudoUnique3,
44 absentErrorIdKey, -- alphabetical...
57 byteArrayPrimTyConKey,
72 enumFromThenClassOpKey,
73 enumFromThenToClassOpKey,
88 foreignObjPrimTyConKey,
93 fromIntegerClassOpKey,
94 fromRationalClassOpKey,
107 smallIntegerDataConKey,
108 largeIntegerDataConKey,
109 integerMinusOneIdKey,
117 irrefutPatErrorIdKey,
126 mutableArrayPrimTyConKey,
127 mutableByteArrayPrimTyConKey,
128 mutableByteArrayTyConKey,
131 noMethodBindingErrorIdKey,
132 nonExhaustiveGuardsErrorIdKey,
160 stablePtrPrimTyConKey,
162 stableNameDataConKey,
163 stableNamePrimTyConKey,
172 threadIdPrimTyConKey,
179 unpackCStringAppendIdKey,
180 unpackCStringFoldrIdKey,
196 #include "HsVersions.h"
198 import FastString ( FastString, uniqueOfFS )
201 import PrelBase ( Char(..), chr, ord )
206 %************************************************************************
208 \subsection[Unique-type]{@Unique@ type and operations}
210 %************************************************************************
212 The @Chars@ are ``tag letters'' that identify the @UniqueSupply@.
213 Fast comparison is everything on @Uniques@:
216 data Unique = MkUnique Int#
220 u2i :: Unique -> FAST_INT
224 Now come the functions which construct uniques from their pieces, and vice versa.
225 The stuff about unique *supplies* is handled further down this module.
228 mkUnique :: Char -> Int -> Unique -- Builds a unique from pieces
229 unpkUnique :: Unique -> (Char, Int) -- The reverse
231 mkUniqueGrimily :: Int# -> Unique -- A trap-door for UniqSupply
233 getKey :: Unique -> Int# -- for Var
235 incrUnique :: Unique -> Unique
240 mkUniqueGrimily x = MkUnique x
242 {-# INLINE getKey #-}
243 getKey (MkUnique x) = x
245 incrUnique (MkUnique i) = MkUnique (i +# 100#)
246 -- Bump the unique by a lot, to get it out of the neighbourhood
249 -- pop the Char in the top 8 bits of the Unique(Supply)
251 -- No 64-bit bugs here, as long as we have at least 32 bits. --JSM
257 mkUnique (C# c) (I# i)
258 = MkUnique (w2i (((i2w (ord# c)) `shiftL#` (i2w_s 24#)) `or#` (i2w i)))
260 unpkUnique (MkUnique u)
262 tag = C# (chr# (w2i ((i2w u) `shiftr` (i2w_s 24#))))
263 i = I# (w2i ((i2w u) `and#` (i2w 16777215#){-``0x00ffffff''-}))
267 shiftr x y = shiftRL# x y
272 %************************************************************************
274 \subsection[Uniquable-class]{The @Uniquable@ class}
276 %************************************************************************
279 class Uniquable a where
280 getUnique :: a -> Unique
282 instance Uniquable FastString where
283 getUnique fs = mkUniqueGrimily (uniqueOfFS fs)
285 instance Uniquable Int where
286 getUnique (I# i#) = mkUniqueGrimily i#
290 %************************************************************************
292 \subsection[Unique-instances]{Instance declarations for @Unique@}
294 %************************************************************************
296 And the whole point (besides uniqueness) is fast equality. We don't
297 use `deriving' because we want {\em precise} control of ordering
298 (equality on @Uniques@ is v common).
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
308 instance Eq Unique where
309 a == b = eqUnique a b
310 a /= b = not (eqUnique a b)
312 instance Ord Unique where
314 a <= b = leUnique a b
315 a > b = not (leUnique a b)
316 a >= b = not (ltUnique a b)
317 compare a b = cmpUnique a b
320 instance Uniquable Unique where
324 We do sometimes make strings with @Uniques@ in them:
326 pprUnique, pprUnique10 :: Unique -> SDoc
329 = case unpkUnique uniq of
330 (tag, u) -> finish_ppr tag u (iToBase62 u)
332 pprUnique10 uniq -- in base-10, dudes
333 = case unpkUnique uniq of
334 (tag, u) -> finish_ppr tag u (int u)
336 finish_ppr 't' u pp_u | u < 26
337 = -- Special case to make v common tyvars, t1, t2, ...
338 -- come out as a, b, ... (shorter, easier to read)
339 char (chr (ord 'a' + u))
340 finish_ppr tag u pp_u = char tag <> pp_u
342 instance Outputable Unique where
345 instance Show Unique where
346 showsPrec p uniq = showsPrecSDoc p (pprUnique uniq)
349 %************************************************************************
351 \subsection[Utils-base62]{Base-62 numbers}
353 %************************************************************************
355 A character-stingy way to read/write numbers (notably Uniques).
356 The ``62-its'' are \tr{[0-9a-zA-Z]}. We don't handle negative Ints.
357 Code stolen from Lennart.
359 # define BYTE_ARRAY GlaExts.ByteArray
360 # define RUN_ST ST.runST
361 # define AND_THEN >>=
362 # define AND_THEN_ >>
363 # define RETURN return
365 iToBase62 :: Int -> SDoc
370 bytes = case chars62 of { BYTE_ARRAY bounds_who_needs_'em bytes -> bytes }
373 case (indexCharArray# bytes n#) of { c ->
376 case (quotRem n 62) of { (q, I# r#) ->
377 case (indexCharArray# bytes r#) of { c ->
378 (<>) (iToBase62 q) (char (C# c)) }}
380 -- keep this at top level! (bug on 94/10/24 WDP)
381 chars62 :: BYTE_ARRAY Int
384 newCharArray (0, 61) AND_THEN \ ch_array ->
385 fill_in ch_array 0 62 "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
387 unsafeFreezeByteArray ch_array
390 fill_in ch_array i lim str
394 = writeCharArray ch_array i (str !! i) AND_THEN_
395 fill_in ch_array (i+1) lim str
398 %************************************************************************
400 \subsection[Uniques-prelude]{@Uniques@ for wired-in Prelude things}
402 %************************************************************************
404 Allocation of unique supply characters:
405 v,t,u : for renumbering value-, type- and usage- vars.
406 other a-z: lower case chars for unique supplies (see Main.lhs)
408 C-E: pseudo uniques (used in native-code generator)
409 _: unifiable tyvars (above)
410 0-9: prelude things below
413 mkAlphaTyVarUnique i = mkUnique '1' i
415 mkPreludeClassUnique i = mkUnique '2' i
416 mkPreludeTyConUnique i = mkUnique '3' i
417 mkTupleTyConUnique a = mkUnique '4' a
418 mkUbxTupleTyConUnique a = mkUnique '5' a
420 mkPreludeDataConUnique i = mkUnique '6' i -- must be alphabetic
421 mkTupleDataConUnique a = mkUnique '7' a -- ditto (*may* be used in C labels)
422 mkUbxTupleDataConUnique a = mkUnique '8' a
424 mkPrimOpIdUnique op = mkUnique '9' op
425 mkPreludeMiscIdUnique i = mkUnique '0' i
427 -- The "tyvar uniques" print specially nicely: a, b, c, etc.
428 -- See pprUnique for details
430 initTyVarUnique :: Unique
431 initTyVarUnique = mkUnique 't' 0
433 initTidyUniques :: (Unique, Unique) -- Global and local
434 initTidyUniques = (mkUnique 'g' 0, mkUnique 'x' 0)
436 mkPseudoUnique1, mkPseudoUnique2, mkPseudoUnique3,
437 mkBuiltinUnique :: Int -> Unique
439 mkBuiltinUnique i = mkUnique 'B' i
440 mkPseudoUnique1 i = mkUnique 'C' i -- used for getUnique on Regs
441 mkPseudoUnique2 i = mkUnique 'D' i -- ditto
442 mkPseudoUnique3 i = mkUnique 'E' i -- ditto
444 getBuiltinUniques :: Int -> [Unique]
445 getBuiltinUniques n = map (mkUnique 'B') [1 .. n]
448 %************************************************************************
450 \subsubsection[Uniques-prelude-Classes]{@Uniques@ for wired-in @Classes@}
452 %************************************************************************
455 boundedClassKey = mkPreludeClassUnique 1
456 enumClassKey = mkPreludeClassUnique 2
457 eqClassKey = mkPreludeClassUnique 3
458 floatingClassKey = mkPreludeClassUnique 5
459 fractionalClassKey = mkPreludeClassUnique 6
460 integralClassKey = mkPreludeClassUnique 7
461 monadClassKey = mkPreludeClassUnique 8
462 monadPlusClassKey = mkPreludeClassUnique 9
463 functorClassKey = mkPreludeClassUnique 10
464 numClassKey = mkPreludeClassUnique 11
465 ordClassKey = mkPreludeClassUnique 12
466 readClassKey = mkPreludeClassUnique 13
467 realClassKey = mkPreludeClassUnique 14
468 realFloatClassKey = mkPreludeClassUnique 15
469 realFracClassKey = mkPreludeClassUnique 16
470 showClassKey = mkPreludeClassUnique 17
472 cCallableClassKey = mkPreludeClassUnique 18
473 cReturnableClassKey = mkPreludeClassUnique 19
475 ixClassKey = mkPreludeClassUnique 20
478 %************************************************************************
480 \subsubsection[Uniques-prelude-TyCons]{@Uniques@ for wired-in @TyCons@}
482 %************************************************************************
485 addrPrimTyConKey = mkPreludeTyConUnique 1
486 addrTyConKey = mkPreludeTyConUnique 2
487 arrayPrimTyConKey = mkPreludeTyConUnique 3
488 boolTyConKey = mkPreludeTyConUnique 4
489 byteArrayPrimTyConKey = mkPreludeTyConUnique 5
490 charPrimTyConKey = mkPreludeTyConUnique 7
491 charTyConKey = mkPreludeTyConUnique 8
492 doublePrimTyConKey = mkPreludeTyConUnique 9
493 doubleTyConKey = mkPreludeTyConUnique 10
494 floatPrimTyConKey = mkPreludeTyConUnique 11
495 floatTyConKey = mkPreludeTyConUnique 12
496 funTyConKey = mkPreludeTyConUnique 13
497 intPrimTyConKey = mkPreludeTyConUnique 14
498 intTyConKey = mkPreludeTyConUnique 15
499 int8TyConKey = mkPreludeTyConUnique 16
500 int16TyConKey = mkPreludeTyConUnique 17
501 int32TyConKey = mkPreludeTyConUnique 18
502 int64PrimTyConKey = mkPreludeTyConUnique 19
503 int64TyConKey = mkPreludeTyConUnique 20
504 integerTyConKey = mkPreludeTyConUnique 21
505 listTyConKey = mkPreludeTyConUnique 22
506 foreignObjPrimTyConKey = mkPreludeTyConUnique 23
507 foreignObjTyConKey = mkPreludeTyConUnique 24
508 weakPrimTyConKey = mkPreludeTyConUnique 25
509 mutableArrayPrimTyConKey = mkPreludeTyConUnique 26
510 mutableByteArrayPrimTyConKey = mkPreludeTyConUnique 27
511 orderingTyConKey = mkPreludeTyConUnique 28
512 mVarPrimTyConKey = mkPreludeTyConUnique 29
513 ratioTyConKey = mkPreludeTyConUnique 30
514 rationalTyConKey = mkPreludeTyConUnique 31
515 realWorldTyConKey = mkPreludeTyConUnique 32
516 stablePtrPrimTyConKey = mkPreludeTyConUnique 33
517 stablePtrTyConKey = mkPreludeTyConUnique 34
518 statePrimTyConKey = mkPreludeTyConUnique 35
519 stableNamePrimTyConKey = mkPreludeTyConUnique 50
520 stableNameTyConKey = mkPreludeTyConUnique 51
521 mutableByteArrayTyConKey = mkPreludeTyConUnique 52
522 mutVarPrimTyConKey = mkPreludeTyConUnique 53
523 ioTyConKey = mkPreludeTyConUnique 55
524 byteArrayTyConKey = mkPreludeTyConUnique 56
525 wordPrimTyConKey = mkPreludeTyConUnique 57
526 wordTyConKey = mkPreludeTyConUnique 58
527 word8TyConKey = mkPreludeTyConUnique 59
528 word16TyConKey = mkPreludeTyConUnique 60
529 word32TyConKey = mkPreludeTyConUnique 61
530 word64PrimTyConKey = mkPreludeTyConUnique 62
531 word64TyConKey = mkPreludeTyConUnique 63
532 boxedConKey = mkPreludeTyConUnique 64
533 unboxedConKey = mkPreludeTyConUnique 65
534 anyBoxConKey = mkPreludeTyConUnique 66
535 kindConKey = mkPreludeTyConUnique 67
536 boxityConKey = mkPreludeTyConUnique 68
537 typeConKey = mkPreludeTyConUnique 69
538 threadIdPrimTyConKey = mkPreludeTyConUnique 70
541 %************************************************************************
543 \subsubsection[Uniques-prelude-DataCons]{@Uniques@ for wired-in @DataCons@}
545 %************************************************************************
548 addrDataConKey = mkPreludeDataConUnique 1
549 charDataConKey = mkPreludeDataConUnique 2
550 consDataConKey = mkPreludeDataConUnique 3
551 doubleDataConKey = mkPreludeDataConUnique 4
552 falseDataConKey = mkPreludeDataConUnique 5
553 floatDataConKey = mkPreludeDataConUnique 6
554 intDataConKey = mkPreludeDataConUnique 7
555 smallIntegerDataConKey = mkPreludeDataConUnique 12
556 largeIntegerDataConKey = mkPreludeDataConUnique 13
557 foreignObjDataConKey = mkPreludeDataConUnique 14
558 nilDataConKey = mkPreludeDataConUnique 15
559 ratioDataConKey = mkPreludeDataConUnique 16
560 stablePtrDataConKey = mkPreludeDataConUnique 17
561 stableNameDataConKey = mkPreludeDataConUnique 18
562 trueDataConKey = mkPreludeDataConUnique 34
563 wordDataConKey = mkPreludeDataConUnique 35
564 stDataConKey = mkPreludeDataConUnique 40
565 ioDataConKey = mkPreludeDataConUnique 42
568 %************************************************************************
570 \subsubsection[Uniques-prelude-Ids]{@Uniques@ for wired-in @Ids@ (except @DataCons@)}
572 %************************************************************************
575 absentErrorIdKey = mkPreludeMiscIdUnique 1
576 appendIdKey = mkPreludeMiscIdUnique 2
577 augmentIdKey = mkPreludeMiscIdUnique 3
578 buildIdKey = mkPreludeMiscIdUnique 4
579 errorIdKey = mkPreludeMiscIdUnique 5
580 foldlIdKey = mkPreludeMiscIdUnique 6
581 foldrIdKey = mkPreludeMiscIdUnique 7
582 recSelErrIdKey = mkPreludeMiscIdUnique 8
583 integerMinusOneIdKey = mkPreludeMiscIdUnique 9
584 integerPlusOneIdKey = mkPreludeMiscIdUnique 10
585 integerPlusTwoIdKey = mkPreludeMiscIdUnique 11
586 integerZeroIdKey = mkPreludeMiscIdUnique 12
587 int2IntegerIdKey = mkPreludeMiscIdUnique 13
588 addr2IntegerIdKey = mkPreludeMiscIdUnique 14
589 irrefutPatErrorIdKey = mkPreludeMiscIdUnique 15
590 lexIdKey = mkPreludeMiscIdUnique 16
591 noMethodBindingErrorIdKey = mkPreludeMiscIdUnique 17
592 nonExhaustiveGuardsErrorIdKey = mkPreludeMiscIdUnique 18
593 packCStringIdKey = mkPreludeMiscIdUnique 19
594 parErrorIdKey = mkPreludeMiscIdUnique 20
595 parIdKey = mkPreludeMiscIdUnique 21
596 patErrorIdKey = mkPreludeMiscIdUnique 22
597 realWorldPrimIdKey = mkPreludeMiscIdUnique 23
598 recConErrorIdKey = mkPreludeMiscIdUnique 24
599 recUpdErrorIdKey = mkPreludeMiscIdUnique 25
600 traceIdKey = mkPreludeMiscIdUnique 26
601 unpackCString2IdKey = mkPreludeMiscIdUnique 27
602 unpackCStringAppendIdKey = mkPreludeMiscIdUnique 28
603 unpackCStringFoldrIdKey = mkPreludeMiscIdUnique 29
604 unpackCStringIdKey = mkPreludeMiscIdUnique 30
605 ushowListIdKey = mkPreludeMiscIdUnique 31
606 unsafeCoerceIdKey = mkPreludeMiscIdUnique 32
607 concatIdKey = mkPreludeMiscIdUnique 33
608 filterIdKey = mkPreludeMiscIdUnique 34
609 zipIdKey = mkPreludeMiscIdUnique 35
610 bindIOIdKey = mkPreludeMiscIdUnique 36
611 deRefStablePtrIdKey = mkPreludeMiscIdUnique 37
612 makeStablePtrIdKey = mkPreludeMiscIdUnique 38
613 getTagIdKey = mkPreludeMiscIdUnique 39
616 Certain class operations from Prelude classes. They get their own
617 uniques so we can look them up easily when we want to conjure them up
618 during type checking.
621 fromIntClassOpKey = mkPreludeMiscIdUnique 101
622 fromIntegerClassOpKey = mkPreludeMiscIdUnique 102
623 minusClassOpKey = mkPreludeMiscIdUnique 103
624 fromRationalClassOpKey = mkPreludeMiscIdUnique 104
625 enumFromClassOpKey = mkPreludeMiscIdUnique 105
626 enumFromThenClassOpKey = mkPreludeMiscIdUnique 106
627 enumFromToClassOpKey = mkPreludeMiscIdUnique 107
628 enumFromThenToClassOpKey = mkPreludeMiscIdUnique 108
629 eqClassOpKey = mkPreludeMiscIdUnique 109
630 geClassOpKey = mkPreludeMiscIdUnique 110
631 failMClassOpKey = mkPreludeMiscIdUnique 112
632 thenMClassOpKey = mkPreludeMiscIdUnique 113 -- (>>=)
633 -- Just a place holder for unbound variables produced by the renamer:
634 unboundKey = mkPreludeMiscIdUnique 114
635 fromEnumClassOpKey = mkPreludeMiscIdUnique 115
637 mainKey = mkPreludeMiscIdUnique 116
638 returnMClassOpKey = mkPreludeMiscIdUnique 117
639 otherwiseIdKey = mkPreludeMiscIdUnique 118
640 toEnumClassOpKey = mkPreludeMiscIdUnique 119
641 mapIdKey = mkPreludeMiscIdUnique 120
645 assertIdKey = mkPreludeMiscIdUnique 121
646 runSTRepIdKey = mkPreludeMiscIdUnique 122