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,
91 foreignObjPrimTyConKey,
96 fromIntegerClassOpKey,
97 fromRationalClassOpKey,
110 smallIntegerDataConKey,
111 largeIntegerDataConKey,
112 integerMinusOneIdKey,
120 irrefutPatErrorIdKey,
129 mutableArrayPrimTyConKey,
130 mutableByteArrayPrimTyConKey,
131 mutableByteArrayTyConKey,
134 noMethodBindingErrorIdKey,
135 nonExhaustiveGuardsErrorIdKey,
163 stablePtrPrimTyConKey,
165 stableNameDataConKey,
166 stableNamePrimTyConKey,
175 threadIdPrimTyConKey,
181 unpackCStringUtf8IdKey,
182 unpackCStringAppendIdKey,
183 unpackCStringFoldrIdKey,
199 #include "HsVersions.h"
201 import BasicTypes ( Boxity(..) )
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
241 newTagUnique :: Unique -> Char -> Unique
243 isTupleKey :: Unique -> Bool
248 mkUniqueGrimily x = MkUnique x
250 {-# INLINE getKey #-}
251 getKey (MkUnique x) = x
253 incrUnique (MkUnique i) = MkUnique (i +# 1#)
255 -- deriveUnique uses an 'X' tag so that it won't clash with
256 -- any of the uniques produced any other way
257 deriveUnique (MkUnique i) delta = mkUnique 'X' (I# i + delta)
259 -- newTagUnique changes the "domain" of a unique to a different char
260 newTagUnique u c = mkUnique c i where (_,i) = unpkUnique u
262 -- pop the Char in the top 8 bits of the Unique(Supply)
264 -- No 64-bit bugs here, as long as we have at least 32 bits. --JSM
270 mkUnique (C# c) (I# i)
271 = MkUnique (w2i (tag `or#` bits))
273 tag = i2w (ord# c) `shiftL#` i2w_s 24#
274 bits = i2w i `and#` (i2w 16777215#){-``0x00ffffff''-}
276 unpkUnique (MkUnique u)
278 tag = C# (chr# (w2i ((i2w u) `shiftr` (i2w_s 24#))))
279 i = I# (w2i ((i2w u) `and#` (i2w 16777215#){-``0x00ffffff''-}))
283 shiftr x y = shiftRL# x y
288 %************************************************************************
290 \subsection[Uniquable-class]{The @Uniquable@ class}
292 %************************************************************************
295 class Uniquable a where
296 getUnique :: a -> Unique
298 hasKey :: Uniquable a => a -> Unique -> Bool
299 x `hasKey` k = getUnique x == k
301 instance Uniquable FastString where
302 getUnique fs = mkUniqueGrimily (uniqueOfFS fs)
304 instance Uniquable Int where
305 getUnique (I# i#) = mkUniqueGrimily i#
309 %************************************************************************
311 \subsection[Unique-instances]{Instance declarations for @Unique@}
313 %************************************************************************
315 And the whole point (besides uniqueness) is fast equality. We don't
316 use `deriving' because we want {\em precise} control of ordering
317 (equality on @Uniques@ is v common).
320 eqUnique (MkUnique u1) (MkUnique u2) = u1 ==# u2
321 ltUnique (MkUnique u1) (MkUnique u2) = u1 <# u2
322 leUnique (MkUnique u1) (MkUnique u2) = u1 <=# u2
324 cmpUnique (MkUnique u1) (MkUnique u2)
325 = if u1 ==# u2 then EQ else if u1 <# u2 then LT else GT
327 instance Eq Unique where
328 a == b = eqUnique a b
329 a /= b = not (eqUnique a b)
331 instance Ord Unique where
333 a <= b = leUnique a b
334 a > b = not (leUnique a b)
335 a >= b = not (ltUnique a b)
336 compare a b = cmpUnique a b
339 instance Uniquable Unique where
343 We do sometimes make strings with @Uniques@ in them:
345 pprUnique, pprUnique10 :: Unique -> SDoc
348 = case unpkUnique uniq of
349 (tag, u) -> finish_ppr tag u (iToBase62 u)
351 pprUnique10 uniq -- in base-10, dudes
352 = case unpkUnique uniq of
353 (tag, u) -> finish_ppr tag u (int u)
355 finish_ppr 't' u pp_u | u < 26
356 = -- Special case to make v common tyvars, t1, t2, ...
357 -- come out as a, b, ... (shorter, easier to read)
358 char (chr (ord 'a' + u))
359 finish_ppr tag u pp_u = char tag <> pp_u
361 instance Outputable Unique where
364 instance Show Unique where
365 showsPrec p uniq = showsPrecSDoc p (pprUnique uniq)
368 %************************************************************************
370 \subsection[Utils-base62]{Base-62 numbers}
372 %************************************************************************
374 A character-stingy way to read/write numbers (notably Uniques).
375 The ``62-its'' are \tr{[0-9a-zA-Z]}. We don't handle negative Ints.
376 Code stolen from Lennart.
378 # define BYTE_ARRAY GlaExts.ByteArray
379 # define RUN_ST ST.runST
380 # define AND_THEN >>=
381 # define AND_THEN_ >>
382 # define RETURN return
384 iToBase62 :: Int -> SDoc
389 #if __GLASGOW_HASKELL__ < 405
390 bytes = case chars62 of { BYTE_ARRAY bounds_who_needs_'em bytes -> bytes }
392 bytes = case chars62 of { BYTE_ARRAY _ _ bytes -> bytes }
396 case (indexCharArray# bytes n#) of { c ->
399 case (quotRem n 62) of { (q, I# r#) ->
400 case (indexCharArray# bytes r#) of { c ->
401 (<>) (iToBase62 q) (char (C# c)) }}
403 -- keep this at top level! (bug on 94/10/24 WDP)
404 chars62 :: BYTE_ARRAY Int
407 newCharArray (0, 61) AND_THEN \ ch_array ->
408 fill_in ch_array 0 62 "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
410 unsafeFreezeByteArray ch_array
413 fill_in ch_array i lim str
417 = writeCharArray ch_array i (str !! i) AND_THEN_
418 fill_in ch_array (i+1) lim str
421 %************************************************************************
423 \subsection[Uniques-prelude]{@Uniques@ for wired-in Prelude things}
425 %************************************************************************
427 Allocation of unique supply characters:
428 v,t,u : for renumbering value-, type- and usage- vars.
429 other a-z: lower case chars for unique supplies (see Main.lhs)
431 C-E: pseudo uniques (used in native-code generator)
432 X: uniques derived by deriveUnique
433 _: unifiable tyvars (above)
434 0-9: prelude things below
437 mkAlphaTyVarUnique i = mkUnique '1' i
439 mkPreludeClassUnique i = mkUnique '2' i
440 mkPreludeTyConUnique i = mkUnique '3' i
441 mkTupleTyConUnique Boxed a = mkUnique '4' a
442 mkTupleTyConUnique Unboxed a = mkUnique '5' a
444 -- Data constructor keys occupy *two* slots. The first is used for the
445 -- data constructor itself and its wrapper function (the function that
446 -- evaluates arguments as necessary and calls the worker). The second is
447 -- used for the worker function (the function that builds the constructor
450 mkPreludeDataConUnique i = mkUnique '6' (2*i) -- Must be alphabetic
451 mkTupleDataConUnique Boxed a = mkUnique '7' (2*a) -- ditto (*may* be used in C labels)
452 mkTupleDataConUnique Unboxed a = mkUnique '8' (2*a)
454 -- This one is used for a tiresome reason
455 -- to improve a consistency-checking error check in the renamer
456 isTupleKey u = case unpkUnique u of
457 (tag,_) -> tag == '4' || tag == '5' || tag == '7' || tag == '8'
459 mkPrimOpIdUnique op = mkUnique '9' op
460 mkPreludeMiscIdUnique i = mkUnique '0' i
462 -- The "tyvar uniques" print specially nicely: a, b, c, etc.
463 -- See pprUnique for details
465 initTyVarUnique :: Unique
466 initTyVarUnique = mkUnique 't' 0
468 initTidyUniques :: (Unique, Unique) -- Global and local
469 initTidyUniques = (mkUnique 'g' 0, mkUnique 'x' 0)
471 mkPseudoUnique1, mkPseudoUnique2, mkPseudoUnique3,
472 mkBuiltinUnique :: Int -> Unique
474 mkBuiltinUnique i = mkUnique 'B' i
475 mkPseudoUnique1 i = mkUnique 'C' i -- used for getUnique on Regs
476 mkPseudoUnique2 i = mkUnique 'D' i -- used in NCG for getUnique on RealRegs
477 mkPseudoUnique3 i = mkUnique 'E' i -- used in NCG spiller to create spill VirtualRegs
481 getBuiltinUniques :: Int -> [Unique]
482 getBuiltinUniques n = map (mkUnique 'B') [1 .. n]
485 %************************************************************************
487 \subsubsection[Uniques-prelude-Classes]{@Uniques@ for wired-in @Classes@}
489 %************************************************************************
492 boundedClassKey = mkPreludeClassUnique 1
493 enumClassKey = mkPreludeClassUnique 2
494 eqClassKey = mkPreludeClassUnique 3
495 floatingClassKey = mkPreludeClassUnique 5
496 fractionalClassKey = mkPreludeClassUnique 6
497 integralClassKey = mkPreludeClassUnique 7
498 monadClassKey = mkPreludeClassUnique 8
499 monadPlusClassKey = mkPreludeClassUnique 9
500 functorClassKey = mkPreludeClassUnique 10
501 numClassKey = mkPreludeClassUnique 11
502 ordClassKey = mkPreludeClassUnique 12
503 readClassKey = mkPreludeClassUnique 13
504 realClassKey = mkPreludeClassUnique 14
505 realFloatClassKey = mkPreludeClassUnique 15
506 realFracClassKey = mkPreludeClassUnique 16
507 showClassKey = mkPreludeClassUnique 17
509 cCallableClassKey = mkPreludeClassUnique 18
510 cReturnableClassKey = mkPreludeClassUnique 19
512 ixClassKey = mkPreludeClassUnique 20
515 %************************************************************************
517 \subsubsection[Uniques-prelude-TyCons]{@Uniques@ for wired-in @TyCons@}
519 %************************************************************************
522 addrPrimTyConKey = mkPreludeTyConUnique 1
523 addrTyConKey = mkPreludeTyConUnique 2
524 arrayPrimTyConKey = mkPreludeTyConUnique 3
525 boolTyConKey = mkPreludeTyConUnique 4
526 byteArrayPrimTyConKey = mkPreludeTyConUnique 5
527 charPrimTyConKey = mkPreludeTyConUnique 7
528 charTyConKey = mkPreludeTyConUnique 8
529 doublePrimTyConKey = mkPreludeTyConUnique 9
530 doubleTyConKey = mkPreludeTyConUnique 10
531 floatPrimTyConKey = mkPreludeTyConUnique 11
532 floatTyConKey = mkPreludeTyConUnique 12
533 funTyConKey = mkPreludeTyConUnique 13
534 intPrimTyConKey = mkPreludeTyConUnique 14
535 intTyConKey = mkPreludeTyConUnique 15
536 int8TyConKey = mkPreludeTyConUnique 16
537 int16TyConKey = mkPreludeTyConUnique 17
538 int32TyConKey = mkPreludeTyConUnique 18
539 int64PrimTyConKey = mkPreludeTyConUnique 19
540 int64TyConKey = mkPreludeTyConUnique 20
541 integerTyConKey = mkPreludeTyConUnique 21
542 listTyConKey = mkPreludeTyConUnique 22
543 foreignObjPrimTyConKey = mkPreludeTyConUnique 23
544 foreignObjTyConKey = mkPreludeTyConUnique 24
545 weakPrimTyConKey = mkPreludeTyConUnique 25
546 mutableArrayPrimTyConKey = mkPreludeTyConUnique 26
547 mutableByteArrayPrimTyConKey = mkPreludeTyConUnique 27
548 orderingTyConKey = mkPreludeTyConUnique 28
549 mVarPrimTyConKey = mkPreludeTyConUnique 29
550 ratioTyConKey = mkPreludeTyConUnique 30
551 rationalTyConKey = mkPreludeTyConUnique 31
552 realWorldTyConKey = mkPreludeTyConUnique 32
553 stablePtrPrimTyConKey = mkPreludeTyConUnique 33
554 stablePtrTyConKey = mkPreludeTyConUnique 34
555 statePrimTyConKey = mkPreludeTyConUnique 35
556 stableNamePrimTyConKey = mkPreludeTyConUnique 50
557 stableNameTyConKey = mkPreludeTyConUnique 51
558 mutableByteArrayTyConKey = mkPreludeTyConUnique 52
559 mutVarPrimTyConKey = mkPreludeTyConUnique 53
560 ioTyConKey = mkPreludeTyConUnique 55
561 byteArrayTyConKey = mkPreludeTyConUnique 56
562 wordPrimTyConKey = mkPreludeTyConUnique 57
563 wordTyConKey = mkPreludeTyConUnique 58
564 word8TyConKey = mkPreludeTyConUnique 59
565 word16TyConKey = mkPreludeTyConUnique 60
566 word32TyConKey = mkPreludeTyConUnique 61
567 word64PrimTyConKey = mkPreludeTyConUnique 62
568 word64TyConKey = mkPreludeTyConUnique 63
569 boxedConKey = mkPreludeTyConUnique 64
570 unboxedConKey = mkPreludeTyConUnique 65
571 anyBoxConKey = mkPreludeTyConUnique 66
572 kindConKey = mkPreludeTyConUnique 67
573 boxityConKey = mkPreludeTyConUnique 68
574 typeConKey = mkPreludeTyConUnique 69
575 threadIdPrimTyConKey = mkPreludeTyConUnique 70
576 bcoPrimTyConKey = mkPreludeTyConUnique 71
579 %************************************************************************
581 \subsubsection[Uniques-prelude-DataCons]{@Uniques@ for wired-in @DataCons@}
583 %************************************************************************
586 addrDataConKey = mkPreludeDataConUnique 0
587 charDataConKey = mkPreludeDataConUnique 1
588 consDataConKey = mkPreludeDataConUnique 2
589 doubleDataConKey = mkPreludeDataConUnique 3
590 falseDataConKey = mkPreludeDataConUnique 4
591 floatDataConKey = mkPreludeDataConUnique 5
592 intDataConKey = mkPreludeDataConUnique 6
593 smallIntegerDataConKey = mkPreludeDataConUnique 7
594 largeIntegerDataConKey = mkPreludeDataConUnique 8
595 foreignObjDataConKey = mkPreludeDataConUnique 9
596 nilDataConKey = mkPreludeDataConUnique 10
597 ratioDataConKey = mkPreludeDataConUnique 11
598 stablePtrDataConKey = mkPreludeDataConUnique 12
599 stableNameDataConKey = mkPreludeDataConUnique 13
600 trueDataConKey = mkPreludeDataConUnique 14
601 wordDataConKey = mkPreludeDataConUnique 15
602 stDataConKey = mkPreludeDataConUnique 16
603 ioDataConKey = mkPreludeDataConUnique 17
606 %************************************************************************
608 \subsubsection[Uniques-prelude-Ids]{@Uniques@ for wired-in @Ids@ (except @DataCons@)}
610 %************************************************************************
613 absentErrorIdKey = mkPreludeMiscIdUnique 1
614 appendIdKey = mkPreludeMiscIdUnique 2
615 augmentIdKey = mkPreludeMiscIdUnique 3
616 buildIdKey = mkPreludeMiscIdUnique 4
617 errorIdKey = mkPreludeMiscIdUnique 5
618 foldlIdKey = mkPreludeMiscIdUnique 6
619 foldrIdKey = mkPreludeMiscIdUnique 7
620 recSelErrIdKey = mkPreludeMiscIdUnique 8
621 integerMinusOneIdKey = mkPreludeMiscIdUnique 9
622 integerPlusOneIdKey = mkPreludeMiscIdUnique 10
623 integerPlusTwoIdKey = mkPreludeMiscIdUnique 11
624 integerZeroIdKey = mkPreludeMiscIdUnique 12
625 int2IntegerIdKey = mkPreludeMiscIdUnique 13
626 addr2IntegerIdKey = mkPreludeMiscIdUnique 14
627 irrefutPatErrorIdKey = mkPreludeMiscIdUnique 15
628 lexIdKey = 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
654 Certain class operations from Prelude classes. They get their own
655 uniques so we can look them up easily when we want to conjure them up
656 during type checking.
659 fromIntClassOpKey = mkPreludeMiscIdUnique 101
660 fromIntegerClassOpKey = mkPreludeMiscIdUnique 102
661 minusClassOpKey = mkPreludeMiscIdUnique 103
662 fromRationalClassOpKey = mkPreludeMiscIdUnique 104
663 enumFromClassOpKey = mkPreludeMiscIdUnique 105
664 enumFromThenClassOpKey = mkPreludeMiscIdUnique 106
665 enumFromToClassOpKey = mkPreludeMiscIdUnique 107
666 enumFromThenToClassOpKey = mkPreludeMiscIdUnique 108
667 eqClassOpKey = mkPreludeMiscIdUnique 109
668 geClassOpKey = mkPreludeMiscIdUnique 110
669 failMClassOpKey = mkPreludeMiscIdUnique 112
670 thenMClassOpKey = mkPreludeMiscIdUnique 113 -- (>>=)
671 -- Just a place holder for unbound variables produced by the renamer:
672 unboundKey = mkPreludeMiscIdUnique 114
673 fromEnumClassOpKey = mkPreludeMiscIdUnique 115
675 mainKey = mkPreludeMiscIdUnique 116
676 returnMClassOpKey = mkPreludeMiscIdUnique 117
677 otherwiseIdKey = mkPreludeMiscIdUnique 118
678 toEnumClassOpKey = mkPreludeMiscIdUnique 119
679 mapIdKey = mkPreludeMiscIdUnique 120
683 assertIdKey = mkPreludeMiscIdUnique 121
684 runSTRepIdKey = mkPreludeMiscIdUnique 122