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,
121 irrefutPatErrorIdKey,
130 mutableArrayPrimTyConKey,
131 mutableByteArrayPrimTyConKey,
132 mutableByteArrayTyConKey,
135 noMethodBindingErrorIdKey,
136 nonExhaustiveGuardsErrorIdKey,
165 stablePtrPrimTyConKey,
167 stableNameDataConKey,
168 stableNamePrimTyConKey,
178 threadIdPrimTyConKey,
184 unpackCStringUtf8IdKey,
185 unpackCStringAppendIdKey,
186 unpackCStringFoldrIdKey,
202 #include "HsVersions.h"
204 import BasicTypes ( Boxity(..) )
205 import FastString ( FastString, uniqueOfFS )
208 import PrelBase ( Char(..), chr, ord )
213 %************************************************************************
215 \subsection[Unique-type]{@Unique@ type and operations}
217 %************************************************************************
219 The @Chars@ are ``tag letters'' that identify the @UniqueSupply@.
220 Fast comparison is everything on @Uniques@:
223 data Unique = MkUnique Int#
227 u2i :: Unique -> FAST_INT
231 Now come the functions which construct uniques from their pieces, and vice versa.
232 The stuff about unique *supplies* is handled further down this module.
235 mkUnique :: Char -> Int -> Unique -- Builds a unique from pieces
236 unpkUnique :: Unique -> (Char, Int) -- The reverse
238 mkUniqueGrimily :: Int# -> Unique -- A trap-door for UniqSupply
240 getKey :: Unique -> Int# -- for Var
242 incrUnique :: Unique -> Unique
243 deriveUnique :: Unique -> Int -> Unique
244 newTagUnique :: Unique -> Char -> Unique
246 isTupleKey :: Unique -> Bool
251 mkUniqueGrimily x = MkUnique x
253 {-# INLINE getKey #-}
254 getKey (MkUnique x) = x
256 incrUnique (MkUnique i) = MkUnique (i +# 1#)
258 -- deriveUnique uses an 'X' tag so that it won't clash with
259 -- any of the uniques produced any other way
260 deriveUnique (MkUnique i) delta = mkUnique 'X' (I# i + delta)
262 -- newTagUnique changes the "domain" of a unique to a different char
263 newTagUnique u c = mkUnique c i where (_,i) = unpkUnique u
265 -- pop the Char in the top 8 bits of the Unique(Supply)
267 -- No 64-bit bugs here, as long as we have at least 32 bits. --JSM
273 mkUnique (C# c) (I# i)
274 = MkUnique (w2i (tag `or#` bits))
276 tag = i2w (ord# c) `shiftL#` i2w_s 24#
277 bits = i2w i `and#` (i2w 16777215#){-``0x00ffffff''-}
279 unpkUnique (MkUnique u)
281 tag = C# (chr# (w2i ((i2w u) `shiftr` (i2w_s 24#))))
282 i = I# (w2i ((i2w u) `and#` (i2w 16777215#){-``0x00ffffff''-}))
286 shiftr x y = shiftRL# x y
291 %************************************************************************
293 \subsection[Uniquable-class]{The @Uniquable@ class}
295 %************************************************************************
298 class Uniquable a where
299 getUnique :: a -> Unique
301 hasKey :: Uniquable a => a -> Unique -> Bool
302 x `hasKey` k = getUnique x == k
304 instance Uniquable FastString where
305 getUnique fs = mkUniqueGrimily (uniqueOfFS fs)
307 instance Uniquable Int where
308 getUnique (I# i#) = mkUniqueGrimily i#
312 %************************************************************************
314 \subsection[Unique-instances]{Instance declarations for @Unique@}
316 %************************************************************************
318 And the whole point (besides uniqueness) is fast equality. We don't
319 use `deriving' because we want {\em precise} control of ordering
320 (equality on @Uniques@ is v common).
323 eqUnique (MkUnique u1) (MkUnique u2) = u1 ==# u2
324 ltUnique (MkUnique u1) (MkUnique u2) = u1 <# u2
325 leUnique (MkUnique u1) (MkUnique u2) = u1 <=# u2
327 cmpUnique (MkUnique u1) (MkUnique u2)
328 = if u1 ==# u2 then EQ else if u1 <# u2 then LT else GT
330 instance Eq Unique where
331 a == b = eqUnique a b
332 a /= b = not (eqUnique a b)
334 instance Ord Unique where
336 a <= b = leUnique a b
337 a > b = not (leUnique a b)
338 a >= b = not (ltUnique a b)
339 compare a b = cmpUnique a b
342 instance Uniquable Unique where
346 We do sometimes make strings with @Uniques@ in them:
348 pprUnique, pprUnique10 :: Unique -> SDoc
351 = case unpkUnique uniq of
352 (tag, u) -> finish_ppr tag u (iToBase62 u)
354 pprUnique10 uniq -- in base-10, dudes
355 = case unpkUnique uniq of
356 (tag, u) -> finish_ppr tag u (int u)
358 finish_ppr 't' u pp_u | u < 26
359 = -- Special case to make v common tyvars, t1, t2, ...
360 -- come out as a, b, ... (shorter, easier to read)
361 char (chr (ord 'a' + u))
362 finish_ppr tag u pp_u = char tag <> pp_u
364 instance Outputable Unique where
367 instance Show Unique where
368 showsPrec p uniq = showsPrecSDoc p (pprUnique uniq)
371 %************************************************************************
373 \subsection[Utils-base62]{Base-62 numbers}
375 %************************************************************************
377 A character-stingy way to read/write numbers (notably Uniques).
378 The ``62-its'' are \tr{[0-9a-zA-Z]}. We don't handle negative Ints.
379 Code stolen from Lennart.
381 # define BYTE_ARRAY GlaExts.ByteArray
382 # define RUN_ST ST.runST
383 # define AND_THEN >>=
384 # define AND_THEN_ >>
385 # define RETURN return
387 iToBase62 :: Int -> SDoc
392 #if __GLASGOW_HASKELL__ < 405
393 bytes = case chars62 of { BYTE_ARRAY bounds_who_needs_'em bytes -> bytes }
395 bytes = case chars62 of { BYTE_ARRAY _ _ bytes -> bytes }
399 case (indexCharArray# bytes n#) of { c ->
402 case (quotRem n 62) of { (q, I# r#) ->
403 case (indexCharArray# bytes r#) of { c ->
404 (<>) (iToBase62 q) (char (C# c)) }}
406 -- keep this at top level! (bug on 94/10/24 WDP)
407 chars62 :: BYTE_ARRAY Int
410 newCharArray (0, 61) AND_THEN \ ch_array ->
411 fill_in ch_array 0 62 "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
413 unsafeFreezeByteArray ch_array
416 fill_in ch_array i lim str
420 = writeCharArray ch_array i (str !! i) AND_THEN_
421 fill_in ch_array (i+1) lim str
424 %************************************************************************
426 \subsection[Uniques-prelude]{@Uniques@ for wired-in Prelude things}
428 %************************************************************************
430 Allocation of unique supply characters:
431 v,t,u : for renumbering value-, type- and usage- vars.
432 other a-z: lower case chars for unique supplies (see Main.lhs)
434 C-E: pseudo uniques (used in native-code generator)
435 X: uniques derived by deriveUnique
436 _: unifiable tyvars (above)
437 0-9: prelude things below
440 mkAlphaTyVarUnique i = mkUnique '1' i
442 mkPreludeClassUnique i = mkUnique '2' i
443 mkPreludeTyConUnique i = mkUnique '3' i
444 mkTupleTyConUnique Boxed a = mkUnique '4' a
445 mkTupleTyConUnique Unboxed a = mkUnique '5' a
447 -- Data constructor keys occupy *two* slots. The first is used for the
448 -- data constructor itself and its wrapper function (the function that
449 -- evaluates arguments as necessary and calls the worker). The second is
450 -- used for the worker function (the function that builds the constructor
453 mkPreludeDataConUnique i = mkUnique '6' (2*i) -- Must be alphabetic
454 mkTupleDataConUnique Boxed a = mkUnique '7' (2*a) -- ditto (*may* be used in C labels)
455 mkTupleDataConUnique Unboxed a = mkUnique '8' (2*a)
457 -- This one is used for a tiresome reason
458 -- to improve a consistency-checking error check in the renamer
459 isTupleKey u = case unpkUnique u of
460 (tag,_) -> tag == '4' || tag == '5' || tag == '7' || tag == '8'
462 mkPrimOpIdUnique op = mkUnique '9' op
463 mkPreludeMiscIdUnique i = mkUnique '0' i
465 -- The "tyvar uniques" print specially nicely: a, b, c, etc.
466 -- See pprUnique for details
468 initTyVarUnique :: Unique
469 initTyVarUnique = mkUnique 't' 0
471 initTidyUniques :: (Unique, Unique) -- Global and local
472 initTidyUniques = (mkUnique 'g' 0, mkUnique 'x' 0)
474 mkPseudoUnique1, mkPseudoUnique2, mkPseudoUnique3,
475 mkBuiltinUnique :: Int -> Unique
477 mkBuiltinUnique i = mkUnique 'B' i
478 mkPseudoUnique1 i = mkUnique 'C' i -- used for getUnique on Regs
479 mkPseudoUnique2 i = mkUnique 'D' i -- used in NCG for getUnique on RealRegs
480 mkPseudoUnique3 i = mkUnique 'E' i -- used in NCG spiller to create spill VirtualRegs
484 getBuiltinUniques :: Int -> [Unique]
485 getBuiltinUniques n = map (mkUnique 'B') [1 .. n]
488 %************************************************************************
490 \subsubsection[Uniques-prelude-Classes]{@Uniques@ for wired-in @Classes@}
492 %************************************************************************
495 boundedClassKey = mkPreludeClassUnique 1
496 enumClassKey = mkPreludeClassUnique 2
497 eqClassKey = mkPreludeClassUnique 3
498 floatingClassKey = mkPreludeClassUnique 5
499 fractionalClassKey = mkPreludeClassUnique 6
500 integralClassKey = mkPreludeClassUnique 7
501 monadClassKey = mkPreludeClassUnique 8
502 monadPlusClassKey = mkPreludeClassUnique 9
503 functorClassKey = mkPreludeClassUnique 10
504 numClassKey = mkPreludeClassUnique 11
505 ordClassKey = mkPreludeClassUnique 12
506 readClassKey = mkPreludeClassUnique 13
507 realClassKey = mkPreludeClassUnique 14
508 realFloatClassKey = mkPreludeClassUnique 15
509 realFracClassKey = mkPreludeClassUnique 16
510 showClassKey = mkPreludeClassUnique 17
512 cCallableClassKey = mkPreludeClassUnique 18
513 cReturnableClassKey = mkPreludeClassUnique 19
515 ixClassKey = mkPreludeClassUnique 20
518 %************************************************************************
520 \subsubsection[Uniques-prelude-TyCons]{@Uniques@ for wired-in @TyCons@}
522 %************************************************************************
525 addrPrimTyConKey = mkPreludeTyConUnique 1
526 addrTyConKey = mkPreludeTyConUnique 2
527 arrayPrimTyConKey = mkPreludeTyConUnique 3
528 boolTyConKey = mkPreludeTyConUnique 4
529 byteArrayPrimTyConKey = mkPreludeTyConUnique 5
530 charPrimTyConKey = mkPreludeTyConUnique 7
531 charTyConKey = mkPreludeTyConUnique 8
532 doublePrimTyConKey = mkPreludeTyConUnique 9
533 doubleTyConKey = mkPreludeTyConUnique 10
534 floatPrimTyConKey = mkPreludeTyConUnique 11
535 floatTyConKey = mkPreludeTyConUnique 12
536 funTyConKey = mkPreludeTyConUnique 13
537 intPrimTyConKey = mkPreludeTyConUnique 14
538 intTyConKey = mkPreludeTyConUnique 15
539 int8TyConKey = mkPreludeTyConUnique 16
540 int16TyConKey = mkPreludeTyConUnique 17
541 int32TyConKey = mkPreludeTyConUnique 18
542 int64PrimTyConKey = mkPreludeTyConUnique 19
543 int64TyConKey = mkPreludeTyConUnique 20
544 integerTyConKey = mkPreludeTyConUnique 21
545 listTyConKey = mkPreludeTyConUnique 22
546 foreignObjPrimTyConKey = mkPreludeTyConUnique 23
547 foreignObjTyConKey = mkPreludeTyConUnique 24
548 weakPrimTyConKey = mkPreludeTyConUnique 25
549 mutableArrayPrimTyConKey = mkPreludeTyConUnique 26
550 mutableByteArrayPrimTyConKey = mkPreludeTyConUnique 27
551 orderingTyConKey = mkPreludeTyConUnique 28
552 mVarPrimTyConKey = mkPreludeTyConUnique 29
553 ratioTyConKey = mkPreludeTyConUnique 30
554 rationalTyConKey = mkPreludeTyConUnique 31
555 realWorldTyConKey = mkPreludeTyConUnique 32
556 stablePtrPrimTyConKey = mkPreludeTyConUnique 33
557 stablePtrTyConKey = mkPreludeTyConUnique 34
558 statePrimTyConKey = mkPreludeTyConUnique 35
559 stableNamePrimTyConKey = mkPreludeTyConUnique 50
560 stableNameTyConKey = mkPreludeTyConUnique 51
561 mutableByteArrayTyConKey = mkPreludeTyConUnique 52
562 mutVarPrimTyConKey = mkPreludeTyConUnique 53
563 ioTyConKey = mkPreludeTyConUnique 55
564 byteArrayTyConKey = mkPreludeTyConUnique 56
565 wordPrimTyConKey = mkPreludeTyConUnique 57
566 wordTyConKey = mkPreludeTyConUnique 58
567 word8TyConKey = mkPreludeTyConUnique 59
568 word16TyConKey = mkPreludeTyConUnique 60
569 word32TyConKey = mkPreludeTyConUnique 61
570 word64PrimTyConKey = mkPreludeTyConUnique 62
571 word64TyConKey = mkPreludeTyConUnique 63
572 boxedConKey = mkPreludeTyConUnique 64
573 unboxedConKey = mkPreludeTyConUnique 65
574 anyBoxConKey = mkPreludeTyConUnique 66
575 kindConKey = mkPreludeTyConUnique 67
576 boxityConKey = mkPreludeTyConUnique 68
577 typeConKey = mkPreludeTyConUnique 69
578 threadIdPrimTyConKey = mkPreludeTyConUnique 70
579 bcoPrimTyConKey = mkPreludeTyConUnique 71
582 %************************************************************************
584 \subsubsection[Uniques-prelude-DataCons]{@Uniques@ for wired-in @DataCons@}
586 %************************************************************************
589 addrDataConKey = mkPreludeDataConUnique 0
590 charDataConKey = mkPreludeDataConUnique 1
591 consDataConKey = mkPreludeDataConUnique 2
592 doubleDataConKey = mkPreludeDataConUnique 3
593 falseDataConKey = mkPreludeDataConUnique 4
594 floatDataConKey = mkPreludeDataConUnique 5
595 intDataConKey = mkPreludeDataConUnique 6
596 smallIntegerDataConKey = mkPreludeDataConUnique 7
597 largeIntegerDataConKey = mkPreludeDataConUnique 8
598 foreignObjDataConKey = mkPreludeDataConUnique 9
599 nilDataConKey = mkPreludeDataConUnique 10
600 ratioDataConKey = mkPreludeDataConUnique 11
601 stablePtrDataConKey = mkPreludeDataConUnique 12
602 stableNameDataConKey = mkPreludeDataConUnique 13
603 trueDataConKey = mkPreludeDataConUnique 14
604 wordDataConKey = mkPreludeDataConUnique 15
605 ioDataConKey = mkPreludeDataConUnique 16
608 %************************************************************************
610 \subsubsection[Uniques-prelude-Ids]{@Uniques@ for wired-in @Ids@ (except @DataCons@)}
612 %************************************************************************
615 absentErrorIdKey = mkPreludeMiscIdUnique 1
616 appendIdKey = mkPreludeMiscIdUnique 2
617 augmentIdKey = mkPreludeMiscIdUnique 3
618 buildIdKey = mkPreludeMiscIdUnique 4
619 errorIdKey = mkPreludeMiscIdUnique 5
620 foldlIdKey = mkPreludeMiscIdUnique 6
621 foldrIdKey = mkPreludeMiscIdUnique 7
622 recSelErrIdKey = mkPreludeMiscIdUnique 8
623 integerMinusOneIdKey = mkPreludeMiscIdUnique 9
624 integerPlusOneIdKey = mkPreludeMiscIdUnique 10
625 integerPlusTwoIdKey = mkPreludeMiscIdUnique 11
626 integerZeroIdKey = mkPreludeMiscIdUnique 12
627 int2IntegerIdKey = mkPreludeMiscIdUnique 13
628 addr2IntegerIdKey = mkPreludeMiscIdUnique 14
629 irrefutPatErrorIdKey = mkPreludeMiscIdUnique 15
630 eqStringIdKey = mkPreludeMiscIdUnique 16
631 noMethodBindingErrorIdKey = mkPreludeMiscIdUnique 17
632 nonExhaustiveGuardsErrorIdKey = mkPreludeMiscIdUnique 18
633 parErrorIdKey = mkPreludeMiscIdUnique 20
634 parIdKey = mkPreludeMiscIdUnique 21
635 patErrorIdKey = mkPreludeMiscIdUnique 22
636 realWorldPrimIdKey = mkPreludeMiscIdUnique 23
637 recConErrorIdKey = mkPreludeMiscIdUnique 24
638 recUpdErrorIdKey = mkPreludeMiscIdUnique 25
639 traceIdKey = mkPreludeMiscIdUnique 26
640 unpackCStringUtf8IdKey = mkPreludeMiscIdUnique 27
641 unpackCStringAppendIdKey = mkPreludeMiscIdUnique 28
642 unpackCStringFoldrIdKey = mkPreludeMiscIdUnique 29
643 unpackCStringIdKey = mkPreludeMiscIdUnique 30
644 ushowListIdKey = mkPreludeMiscIdUnique 31
645 unsafeCoerceIdKey = mkPreludeMiscIdUnique 32
646 concatIdKey = mkPreludeMiscIdUnique 33
647 filterIdKey = mkPreludeMiscIdUnique 34
648 zipIdKey = mkPreludeMiscIdUnique 35
649 bindIOIdKey = mkPreludeMiscIdUnique 36
650 returnIOIdKey = mkPreludeMiscIdUnique 37
651 deRefStablePtrIdKey = mkPreludeMiscIdUnique 38
652 makeStablePtrIdKey = mkPreludeMiscIdUnique 39
653 getTagIdKey = mkPreludeMiscIdUnique 40
654 plusIntegerIdKey = mkPreludeMiscIdUnique 41
655 timesIntegerIdKey = mkPreludeMiscIdUnique 42
658 Certain class operations from Prelude classes. They get their own
659 uniques so we can look them up easily when we want to conjure them up
660 during type checking.
663 fromIntClassOpKey = mkPreludeMiscIdUnique 101
664 fromIntegerClassOpKey = mkPreludeMiscIdUnique 102
665 minusClassOpKey = mkPreludeMiscIdUnique 103
666 fromRationalClassOpKey = mkPreludeMiscIdUnique 104
667 enumFromClassOpKey = mkPreludeMiscIdUnique 105
668 enumFromThenClassOpKey = mkPreludeMiscIdUnique 106
669 enumFromToClassOpKey = mkPreludeMiscIdUnique 107
670 enumFromThenToClassOpKey = mkPreludeMiscIdUnique 108
671 eqClassOpKey = mkPreludeMiscIdUnique 109
672 geClassOpKey = mkPreludeMiscIdUnique 110
673 failMClassOpKey = mkPreludeMiscIdUnique 112
674 thenMClassOpKey = mkPreludeMiscIdUnique 113 -- (>>=)
675 -- Just a place holder for unbound variables produced by the renamer:
676 unboundKey = mkPreludeMiscIdUnique 114
677 fromEnumClassOpKey = mkPreludeMiscIdUnique 115
679 mainKey = mkPreludeMiscIdUnique 116
680 returnMClassOpKey = mkPreludeMiscIdUnique 117
681 otherwiseIdKey = mkPreludeMiscIdUnique 118
682 toEnumClassOpKey = mkPreludeMiscIdUnique 119
683 mapIdKey = mkPreludeMiscIdUnique 120
687 assertIdKey = mkPreludeMiscIdUnique 121
688 runSTRepIdKey = mkPreludeMiscIdUnique 122