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
35 -- now all the built-in Uniques (and functions to make them)
36 -- [the Oh-So-Wonderful Haskell module system wins again...]
42 getBuiltinUniques, mkBuiltinUnique,
43 mkPseudoUnique1, mkPseudoUnique2, mkPseudoUnique3,
45 absentErrorIdKey, -- alphabetical...
59 byteArrayPrimTyConKey,
74 enumFromThenClassOpKey,
75 enumFromThenToClassOpKey,
90 foreignObjPrimTyConKey,
95 fromIntegerClassOpKey,
96 fromRationalClassOpKey,
109 smallIntegerDataConKey,
110 largeIntegerDataConKey,
111 integerMinusOneIdKey,
119 irrefutPatErrorIdKey,
128 mutableArrayPrimTyConKey,
129 mutableByteArrayPrimTyConKey,
130 mutableByteArrayTyConKey,
133 noMethodBindingErrorIdKey,
134 nonExhaustiveGuardsErrorIdKey,
162 stablePtrPrimTyConKey,
164 stableNameDataConKey,
165 stableNamePrimTyConKey,
174 threadIdPrimTyConKey,
181 unpackCStringAppendIdKey,
182 unpackCStringFoldrIdKey,
198 #include "HsVersions.h"
200 import BasicTypes ( Boxity(..) )
201 import FastString ( FastString, uniqueOfFS )
204 import PrelBase ( Char(..), chr, ord )
209 %************************************************************************
211 \subsection[Unique-type]{@Unique@ type and operations}
213 %************************************************************************
215 The @Chars@ are ``tag letters'' that identify the @UniqueSupply@.
216 Fast comparison is everything on @Uniques@:
219 data Unique = MkUnique Int#
223 u2i :: Unique -> FAST_INT
227 Now come the functions which construct uniques from their pieces, and vice versa.
228 The stuff about unique *supplies* is handled further down this module.
231 mkUnique :: Char -> Int -> Unique -- Builds a unique from pieces
232 unpkUnique :: Unique -> (Char, Int) -- The reverse
234 mkUniqueGrimily :: Int# -> Unique -- A trap-door for UniqSupply
236 getKey :: Unique -> Int# -- for Var
238 incrUnique :: Unique -> Unique
239 deriveUnique :: Unique -> Int -> Unique
241 isTupleKey :: Unique -> Bool
246 mkUniqueGrimily x = MkUnique x
248 {-# INLINE getKey #-}
249 getKey (MkUnique x) = x
251 incrUnique (MkUnique i) = MkUnique (i +# 1#)
253 -- deriveUnique uses an 'X' tag so that it won't clash with
254 -- any of the uniques produced any other way
255 deriveUnique (MkUnique i) delta = mkUnique 'X' (I# i + delta)
257 -- pop the Char in the top 8 bits of the Unique(Supply)
259 -- No 64-bit bugs here, as long as we have at least 32 bits. --JSM
265 mkUnique (C# c) (I# i)
266 = MkUnique (w2i (tag `or#` bits))
268 tag = i2w (ord# c) `shiftL#` i2w_s 24#
269 bits = i2w i `and#` (i2w 16777215#){-``0x00ffffff''-}
271 unpkUnique (MkUnique u)
273 tag = C# (chr# (w2i ((i2w u) `shiftr` (i2w_s 24#))))
274 i = I# (w2i ((i2w u) `and#` (i2w 16777215#){-``0x00ffffff''-}))
278 shiftr x y = shiftRL# x y
283 %************************************************************************
285 \subsection[Uniquable-class]{The @Uniquable@ class}
287 %************************************************************************
290 class Uniquable a where
291 getUnique :: a -> Unique
293 hasKey :: Uniquable a => a -> Unique -> Bool
294 x `hasKey` k = getUnique x == k
296 instance Uniquable FastString where
297 getUnique fs = mkUniqueGrimily (uniqueOfFS fs)
299 instance Uniquable Int where
300 getUnique (I# i#) = mkUniqueGrimily i#
304 %************************************************************************
306 \subsection[Unique-instances]{Instance declarations for @Unique@}
308 %************************************************************************
310 And the whole point (besides uniqueness) is fast equality. We don't
311 use `deriving' because we want {\em precise} control of ordering
312 (equality on @Uniques@ is v common).
315 eqUnique (MkUnique u1) (MkUnique u2) = u1 ==# u2
316 ltUnique (MkUnique u1) (MkUnique u2) = u1 <# u2
317 leUnique (MkUnique u1) (MkUnique u2) = u1 <=# u2
319 cmpUnique (MkUnique u1) (MkUnique u2)
320 = if u1 ==# u2 then EQ else if u1 <# u2 then LT else GT
322 instance Eq Unique where
323 a == b = eqUnique a b
324 a /= b = not (eqUnique a b)
326 instance Ord Unique where
328 a <= b = leUnique a b
329 a > b = not (leUnique a b)
330 a >= b = not (ltUnique a b)
331 compare a b = cmpUnique a b
334 instance Uniquable Unique where
338 We do sometimes make strings with @Uniques@ in them:
340 pprUnique, pprUnique10 :: Unique -> SDoc
343 = case unpkUnique uniq of
344 (tag, u) -> finish_ppr tag u (iToBase62 u)
346 pprUnique10 uniq -- in base-10, dudes
347 = case unpkUnique uniq of
348 (tag, u) -> finish_ppr tag u (int u)
350 finish_ppr 't' u pp_u | u < 26
351 = -- Special case to make v common tyvars, t1, t2, ...
352 -- come out as a, b, ... (shorter, easier to read)
353 char (chr (ord 'a' + u))
354 finish_ppr tag u pp_u = char tag <> pp_u
356 instance Outputable Unique where
359 instance Show Unique where
360 showsPrec p uniq = showsPrecSDoc p (pprUnique uniq)
363 %************************************************************************
365 \subsection[Utils-base62]{Base-62 numbers}
367 %************************************************************************
369 A character-stingy way to read/write numbers (notably Uniques).
370 The ``62-its'' are \tr{[0-9a-zA-Z]}. We don't handle negative Ints.
371 Code stolen from Lennart.
373 # define BYTE_ARRAY GlaExts.ByteArray
374 # define RUN_ST ST.runST
375 # define AND_THEN >>=
376 # define AND_THEN_ >>
377 # define RETURN return
379 iToBase62 :: Int -> SDoc
384 #if __GLASGOW_HASKELL__ < 405
385 bytes = case chars62 of { BYTE_ARRAY bounds_who_needs_'em bytes -> bytes }
387 bytes = case chars62 of { BYTE_ARRAY _ _ bytes -> bytes }
391 case (indexCharArray# bytes n#) of { c ->
394 case (quotRem n 62) of { (q, I# r#) ->
395 case (indexCharArray# bytes r#) of { c ->
396 (<>) (iToBase62 q) (char (C# c)) }}
398 -- keep this at top level! (bug on 94/10/24 WDP)
399 chars62 :: BYTE_ARRAY Int
402 newCharArray (0, 61) AND_THEN \ ch_array ->
403 fill_in ch_array 0 62 "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
405 unsafeFreezeByteArray ch_array
408 fill_in ch_array i lim str
412 = writeCharArray ch_array i (str !! i) AND_THEN_
413 fill_in ch_array (i+1) lim str
416 %************************************************************************
418 \subsection[Uniques-prelude]{@Uniques@ for wired-in Prelude things}
420 %************************************************************************
422 Allocation of unique supply characters:
423 v,t,u : for renumbering value-, type- and usage- vars.
424 other a-z: lower case chars for unique supplies (see Main.lhs)
426 C-E: pseudo uniques (used in native-code generator)
427 X: uniques derived by deriveUnique
428 _: unifiable tyvars (above)
429 0-9: prelude things below
432 mkAlphaTyVarUnique i = mkUnique '1' i
434 mkPreludeClassUnique i = mkUnique '2' i
435 mkPreludeTyConUnique i = mkUnique '3' i
436 mkTupleTyConUnique Boxed a = mkUnique '4' a
437 mkTupleTyConUnique Unboxed a = mkUnique '5' a
439 -- Data constructor keys occupy *two* slots. The first is used for the
440 -- data constructor itself and its wrapper function (the function that
441 -- evaluates arguments as necessary and calls the worker). The second is
442 -- used for the worker function (the function that builds the constructor
445 mkPreludeDataConUnique i = mkUnique '6' (2*i) -- Must be alphabetic
446 mkTupleDataConUnique Boxed a = mkUnique '7' (2*a) -- ditto (*may* be used in C labels)
447 mkTupleDataConUnique Unboxed a = mkUnique '8' (2*a)
449 -- This one is used for a tiresome reason
450 -- to improve a consistency-checking error check in the renamer
451 isTupleKey u = case unpkUnique u of
452 (tag,_) -> tag == '4' || tag == '5' || tag == '7' || tag == '8'
454 mkPrimOpIdUnique op = mkUnique '9' op
455 mkPreludeMiscIdUnique i = mkUnique '0' i
457 -- The "tyvar uniques" print specially nicely: a, b, c, etc.
458 -- See pprUnique for details
460 initTyVarUnique :: Unique
461 initTyVarUnique = mkUnique 't' 0
463 initTidyUniques :: (Unique, Unique) -- Global and local
464 initTidyUniques = (mkUnique 'g' 0, mkUnique 'x' 0)
466 mkPseudoUnique1, mkPseudoUnique2, mkPseudoUnique3,
467 mkBuiltinUnique :: Int -> Unique
469 mkBuiltinUnique i = mkUnique 'B' i
470 mkPseudoUnique1 i = mkUnique 'C' i -- used for getUnique on Regs
471 mkPseudoUnique2 i = mkUnique 'D' i -- used in NCG for getUnique on RealRegs
472 mkPseudoUnique3 i = mkUnique 'E' i -- used in NCG spiller to create spill VirtualRegs
476 getBuiltinUniques :: Int -> [Unique]
477 getBuiltinUniques n = map (mkUnique 'B') [1 .. n]
480 %************************************************************************
482 \subsubsection[Uniques-prelude-Classes]{@Uniques@ for wired-in @Classes@}
484 %************************************************************************
487 boundedClassKey = mkPreludeClassUnique 1
488 enumClassKey = mkPreludeClassUnique 2
489 eqClassKey = mkPreludeClassUnique 3
490 floatingClassKey = mkPreludeClassUnique 5
491 fractionalClassKey = mkPreludeClassUnique 6
492 integralClassKey = mkPreludeClassUnique 7
493 monadClassKey = mkPreludeClassUnique 8
494 monadPlusClassKey = mkPreludeClassUnique 9
495 functorClassKey = mkPreludeClassUnique 10
496 numClassKey = mkPreludeClassUnique 11
497 ordClassKey = mkPreludeClassUnique 12
498 readClassKey = mkPreludeClassUnique 13
499 realClassKey = mkPreludeClassUnique 14
500 realFloatClassKey = mkPreludeClassUnique 15
501 realFracClassKey = mkPreludeClassUnique 16
502 showClassKey = mkPreludeClassUnique 17
504 cCallableClassKey = mkPreludeClassUnique 18
505 cReturnableClassKey = mkPreludeClassUnique 19
507 ixClassKey = mkPreludeClassUnique 20
510 %************************************************************************
512 \subsubsection[Uniques-prelude-TyCons]{@Uniques@ for wired-in @TyCons@}
514 %************************************************************************
517 addrPrimTyConKey = mkPreludeTyConUnique 1
518 addrTyConKey = mkPreludeTyConUnique 2
519 arrayPrimTyConKey = mkPreludeTyConUnique 3
520 boolTyConKey = mkPreludeTyConUnique 4
521 byteArrayPrimTyConKey = mkPreludeTyConUnique 5
522 charPrimTyConKey = mkPreludeTyConUnique 7
523 charTyConKey = mkPreludeTyConUnique 8
524 doublePrimTyConKey = mkPreludeTyConUnique 9
525 doubleTyConKey = mkPreludeTyConUnique 10
526 floatPrimTyConKey = mkPreludeTyConUnique 11
527 floatTyConKey = mkPreludeTyConUnique 12
528 funTyConKey = mkPreludeTyConUnique 13
529 intPrimTyConKey = mkPreludeTyConUnique 14
530 intTyConKey = mkPreludeTyConUnique 15
531 int8TyConKey = mkPreludeTyConUnique 16
532 int16TyConKey = mkPreludeTyConUnique 17
533 int32TyConKey = mkPreludeTyConUnique 18
534 int64PrimTyConKey = mkPreludeTyConUnique 19
535 int64TyConKey = mkPreludeTyConUnique 20
536 integerTyConKey = mkPreludeTyConUnique 21
537 listTyConKey = mkPreludeTyConUnique 22
538 foreignObjPrimTyConKey = mkPreludeTyConUnique 23
539 foreignObjTyConKey = mkPreludeTyConUnique 24
540 weakPrimTyConKey = mkPreludeTyConUnique 25
541 mutableArrayPrimTyConKey = mkPreludeTyConUnique 26
542 mutableByteArrayPrimTyConKey = mkPreludeTyConUnique 27
543 orderingTyConKey = mkPreludeTyConUnique 28
544 mVarPrimTyConKey = mkPreludeTyConUnique 29
545 ratioTyConKey = mkPreludeTyConUnique 30
546 rationalTyConKey = mkPreludeTyConUnique 31
547 realWorldTyConKey = mkPreludeTyConUnique 32
548 stablePtrPrimTyConKey = mkPreludeTyConUnique 33
549 stablePtrTyConKey = mkPreludeTyConUnique 34
550 statePrimTyConKey = mkPreludeTyConUnique 35
551 stableNamePrimTyConKey = mkPreludeTyConUnique 50
552 stableNameTyConKey = mkPreludeTyConUnique 51
553 mutableByteArrayTyConKey = mkPreludeTyConUnique 52
554 mutVarPrimTyConKey = mkPreludeTyConUnique 53
555 ioTyConKey = mkPreludeTyConUnique 55
556 byteArrayTyConKey = mkPreludeTyConUnique 56
557 wordPrimTyConKey = mkPreludeTyConUnique 57
558 wordTyConKey = mkPreludeTyConUnique 58
559 word8TyConKey = mkPreludeTyConUnique 59
560 word16TyConKey = mkPreludeTyConUnique 60
561 word32TyConKey = mkPreludeTyConUnique 61
562 word64PrimTyConKey = mkPreludeTyConUnique 62
563 word64TyConKey = mkPreludeTyConUnique 63
564 boxedConKey = mkPreludeTyConUnique 64
565 unboxedConKey = mkPreludeTyConUnique 65
566 anyBoxConKey = mkPreludeTyConUnique 66
567 kindConKey = mkPreludeTyConUnique 67
568 boxityConKey = mkPreludeTyConUnique 68
569 typeConKey = mkPreludeTyConUnique 69
570 threadIdPrimTyConKey = mkPreludeTyConUnique 70
571 bcoPrimTyConKey = mkPreludeTyConUnique 71
574 %************************************************************************
576 \subsubsection[Uniques-prelude-DataCons]{@Uniques@ for wired-in @DataCons@}
578 %************************************************************************
581 addrDataConKey = mkPreludeDataConUnique 0
582 charDataConKey = mkPreludeDataConUnique 1
583 consDataConKey = mkPreludeDataConUnique 2
584 doubleDataConKey = mkPreludeDataConUnique 3
585 falseDataConKey = mkPreludeDataConUnique 4
586 floatDataConKey = mkPreludeDataConUnique 5
587 intDataConKey = mkPreludeDataConUnique 6
588 smallIntegerDataConKey = mkPreludeDataConUnique 7
589 largeIntegerDataConKey = mkPreludeDataConUnique 8
590 foreignObjDataConKey = mkPreludeDataConUnique 9
591 nilDataConKey = mkPreludeDataConUnique 10
592 ratioDataConKey = mkPreludeDataConUnique 11
593 stablePtrDataConKey = mkPreludeDataConUnique 12
594 stableNameDataConKey = mkPreludeDataConUnique 13
595 trueDataConKey = mkPreludeDataConUnique 14
596 wordDataConKey = mkPreludeDataConUnique 15
597 stDataConKey = mkPreludeDataConUnique 16
598 ioDataConKey = mkPreludeDataConUnique 17
601 %************************************************************************
603 \subsubsection[Uniques-prelude-Ids]{@Uniques@ for wired-in @Ids@ (except @DataCons@)}
605 %************************************************************************
608 absentErrorIdKey = mkPreludeMiscIdUnique 1
609 appendIdKey = mkPreludeMiscIdUnique 2
610 augmentIdKey = mkPreludeMiscIdUnique 3
611 buildIdKey = mkPreludeMiscIdUnique 4
612 errorIdKey = mkPreludeMiscIdUnique 5
613 foldlIdKey = mkPreludeMiscIdUnique 6
614 foldrIdKey = mkPreludeMiscIdUnique 7
615 recSelErrIdKey = mkPreludeMiscIdUnique 8
616 integerMinusOneIdKey = mkPreludeMiscIdUnique 9
617 integerPlusOneIdKey = mkPreludeMiscIdUnique 10
618 integerPlusTwoIdKey = mkPreludeMiscIdUnique 11
619 integerZeroIdKey = mkPreludeMiscIdUnique 12
620 int2IntegerIdKey = mkPreludeMiscIdUnique 13
621 addr2IntegerIdKey = mkPreludeMiscIdUnique 14
622 irrefutPatErrorIdKey = mkPreludeMiscIdUnique 15
623 lexIdKey = mkPreludeMiscIdUnique 16
624 noMethodBindingErrorIdKey = mkPreludeMiscIdUnique 17
625 nonExhaustiveGuardsErrorIdKey = mkPreludeMiscIdUnique 18
626 parErrorIdKey = mkPreludeMiscIdUnique 20
627 parIdKey = mkPreludeMiscIdUnique 21
628 patErrorIdKey = mkPreludeMiscIdUnique 22
629 realWorldPrimIdKey = mkPreludeMiscIdUnique 23
630 recConErrorIdKey = mkPreludeMiscIdUnique 24
631 recUpdErrorIdKey = mkPreludeMiscIdUnique 25
632 traceIdKey = mkPreludeMiscIdUnique 26
633 unpackCString2IdKey = mkPreludeMiscIdUnique 27
634 unpackCStringAppendIdKey = mkPreludeMiscIdUnique 28
635 unpackCStringFoldrIdKey = mkPreludeMiscIdUnique 29
636 unpackCStringIdKey = mkPreludeMiscIdUnique 30
637 ushowListIdKey = mkPreludeMiscIdUnique 31
638 unsafeCoerceIdKey = mkPreludeMiscIdUnique 32
639 concatIdKey = mkPreludeMiscIdUnique 33
640 filterIdKey = mkPreludeMiscIdUnique 34
641 zipIdKey = mkPreludeMiscIdUnique 35
642 bindIOIdKey = mkPreludeMiscIdUnique 36
643 returnIOIdKey = mkPreludeMiscIdUnique 37
644 deRefStablePtrIdKey = mkPreludeMiscIdUnique 38
645 makeStablePtrIdKey = mkPreludeMiscIdUnique 39
646 getTagIdKey = mkPreludeMiscIdUnique 40
649 Certain class operations from Prelude classes. They get their own
650 uniques so we can look them up easily when we want to conjure them up
651 during type checking.
654 fromIntClassOpKey = mkPreludeMiscIdUnique 101
655 fromIntegerClassOpKey = mkPreludeMiscIdUnique 102
656 minusClassOpKey = mkPreludeMiscIdUnique 103
657 fromRationalClassOpKey = mkPreludeMiscIdUnique 104
658 enumFromClassOpKey = mkPreludeMiscIdUnique 105
659 enumFromThenClassOpKey = mkPreludeMiscIdUnique 106
660 enumFromToClassOpKey = mkPreludeMiscIdUnique 107
661 enumFromThenToClassOpKey = mkPreludeMiscIdUnique 108
662 eqClassOpKey = mkPreludeMiscIdUnique 109
663 geClassOpKey = mkPreludeMiscIdUnique 110
664 failMClassOpKey = mkPreludeMiscIdUnique 112
665 thenMClassOpKey = mkPreludeMiscIdUnique 113 -- (>>=)
666 -- Just a place holder for unbound variables produced by the renamer:
667 unboundKey = mkPreludeMiscIdUnique 114
668 fromEnumClassOpKey = mkPreludeMiscIdUnique 115
670 mainKey = mkPreludeMiscIdUnique 116
671 returnMClassOpKey = mkPreludeMiscIdUnique 117
672 otherwiseIdKey = mkPreludeMiscIdUnique 118
673 toEnumClassOpKey = mkPreludeMiscIdUnique 119
674 mapIdKey = mkPreludeMiscIdUnique 120
678 assertIdKey = mkPreludeMiscIdUnique 121
679 runSTRepIdKey = mkPreludeMiscIdUnique 122