2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1995
4 \section[PrelVals]{Prelude values the compiler ``knows about''}
7 #include "HsVersions.h"
11 import PrelFuns -- help functions, types and things
12 import BasicLit ( mkMachInt, BasicLit(..), PrimKind )
16 import TyPod ( mkPodNTy ,mkPodTy )
17 import TyProcs ( mkProcessorTy )
18 #endif {- Data Parallel Haskell -}
22 import Id ( mkTemplateLocals, mkTupleCon, getIdUniType,
26 import AbsUniType ( mkSigmaTy, mkDictTy, mkTyVarTy , SigmaType(..),
27 applyTyCon, splitType, specialiseTy
29 import Id ( mkTemplateLocals, mkTupleCon, getIdUniType,
30 mkSpecId, mkProcessorCon
32 #endif {- Data Parallel Haskell -}
35 import Maybes ( Maybe(..) )
36 import PlainCore -- to make unfolding templates
37 import Unique -- *Key things
41 %************************************************************************
43 \subsection[PrelVals-error-related]{@error@ and friends; @trace@}
45 %************************************************************************
47 GHC randomly injects these into the code.
49 @patError#@ is just a version of @error@ for pattern-matching
50 failures. It knows various ``codes'' which expand to longer
51 strings---this saves space!
53 @absent#@ is a thing we put in for ``absent'' arguments. They jolly
54 well shouldn't be yanked on, but if one is, then you will get a
55 friendly message from @absent#@ (rather a totally random crash).
57 @parError#@ is a special version of @error@ which the compiler does
58 not know to be a bottoming Id. It is used in the @_par_@ and @_seq_@
59 templates, but we don't ever expect to generate code for it.
62 pc_bottoming_Id key mod name ty
63 = pcMiscPrelId key mod name ty bottoming_info
65 bottoming_info = noIdInfo `addInfo` mkBottomStrictnessInfo
66 -- these "bottom" out, no matter what their arguments
69 = pc_bottoming_Id errorIdKey pRELUDE_BUILTIN SLIT("error") errorTy
72 = pc_bottoming_Id patErrorIdKey pRELUDE_BUILTIN SLIT("patError#") errorTy
75 = pc_bottoming_Id absentErrorIdKey pRELUDE_BUILTIN SLIT("absent#")
76 (mkSigmaTy [alpha_tv] [] alpha)
79 = pcMiscPrelId parErrorIdKey pRELUDE_BUILTIN SLIT("parError#")
80 (mkSigmaTy [alpha_tv] [] alpha) noIdInfo
83 errorTy = mkSigmaTy [alpha_tv] [] (UniFun (mkListTy charTy) alpha)
86 We want \tr{_trace} (NB: name not in user namespace) to be wired in
87 because we don't want the strictness analyser to get ahold of it,
88 decide that the second argument is strict, evaluate that first (!!),
89 and make a jolly old mess. Having \tr{_trace} wired in also helps when
90 attempting to re-export it---because it's in \tr{PreludeBuiltin}, it
91 won't get an \tr{import} declaration in the interface file, so the
92 importing-subsequently module needs to know it's magic.
95 = pcMiscPrelId traceIdKey pRELUDE_BUILTIN SLIT("_trace") traceTy
96 (noIdInfo `addInfo` pcGenerateSpecs traceIdKey tRACE_ID noIdInfo traceTy)
98 traceTy = mkSigmaTy [alpha_tv] [] (UniFun (mkListTy charTy) (UniFun alpha alpha))
101 %************************************************************************
103 \subsection[PrelVals-Integer-support]{To support @Integer@ and @String@ literals}
105 %************************************************************************
110 = pcMiscPrelId int2IntegerIdKey pRELUDE_BUILTIN SLIT("_int2Integer")
111 (UniFun intTy integerTy)
115 --------------------------------------------------------------------
118 = pcMiscPrelId unpackCStringIdKey pRELUDE_PS SLIT("unpackPS#")
119 (addrPrimTy{-a char *-} `UniFun` stringTy) noIdInfo
121 unpackCString2Id -- for cases when a string has a NUL in it
122 = pcMiscPrelId unpackCString2IdKey pRELUDE_PS SLIT("unpackPS2#")
123 (addrPrimTy{-a char *-}
124 `UniFun` (intPrimTy -- length
125 `UniFun` stringTy)) noIdInfo
127 --------------------------------------------------------------------
128 unpackCStringAppendId
129 = pcMiscPrelId unpackCStringAppendIdKey pRELUDE_BUILTIN SLIT("unpackCStringAppend#")
130 (addrPrimTy{-a "char *" pointer-}
132 `UniFun` stringTy)) noIdInfo
134 --------------------------------------------------------------------
137 = pcMiscPrelId packCStringIdKey{-ToDo:rename-} pRELUDE_PS SLIT("_packStringForC")
138 (UniFun stringTy byteArrayPrimTy) noIdInfo
141 OK, this is Will's idea: we should have magic values for Integers 0,
142 +1, +2, and -1 (go ahead, fire me):
145 = pcMiscPrelId integerZeroIdKey pRELUDE_CORE SLIT("__integer0") integerTy noIdInfo
147 = pcMiscPrelId integerPlusOneIdKey pRELUDE_CORE SLIT("__integer1") integerTy noIdInfo
149 = pcMiscPrelId integerPlusTwoIdKey pRELUDE_CORE SLIT("__integer2") integerTy noIdInfo
151 = pcMiscPrelId integerMinusOneIdKey pRELUDE_CORE SLIT("__integerm1") integerTy noIdInfo
154 %************************************************************************
156 \subsection[PrelVals-parallel]{@seq@ and @par@: for parallel operation (only)}
158 %************************************************************************
160 In the definitions that follow, we use the @TyVar@-based
161 alpha/beta/gamma types---not the usual @TyVarTemplate@ ones.
163 This is so the @TyVars@ in the @CoTyLams@ (@alpha_tyvar@, etc) match
164 up with those in the types of the {\em lambda-bound} template-locals
165 we create (using types @alpha_ty@, etc.).
168 --------------------------------------------------------------------
169 -- seqId :: "_seq_", used w/ GRIP, etc., is really quite similar to
173 _seq_ = /\ a b -> \ x y -> case x of { _ -> y }
176 _seq_ = /\ a b -> \ x y -> case seq# x y of { _Lift y' -> y' }
179 _seq_ = /\ a b -> \ x::a y::b -> case seq# x of { 0# -> parError#; _ -> y; }
183 seqId = pcMiscPrelId seqIdKey pRELUDE_BUILTIN SLIT("_seq_")
184 (mkSigmaTy [alpha_tv, beta_tv] []
185 (alpha `UniFun` (beta `UniFun` beta)))
186 (noIdInfo `addInfo_UF` (mkUnfolding EssentialUnfolding seq_template))
196 = CoTyLam alpha_tyvar
199 CoCase (CoPrim SeqOp [alpha_ty] [CoVarAtom x]) (
201 [(mkMachInt 0, CoTyApp (CoVar pAR_ERROR_ID) beta_ty)]
202 (CoBindDefault z (CoVar y))))))
204 --------------------------------------------------------------------
205 -- parId :: "_par_", also used w/ GRIP, etc.
209 par = /\ a b -> \ x y -> case (par# (case x of { _ -> () })) of { _ -> y }
213 _par_ = /\ a b -> \ x y -> case par# x y of { _Lift y' -> y' }
217 _par_ = /\ a b -> \ x::a y::b -> case par# x of { 0# -> parError#; _ -> y; }
220 parId = pcMiscPrelId parIdKey pRELUDE_BUILTIN SLIT("_par_")
221 (mkSigmaTy [alpha_tv, beta_tv] []
222 (alpha `UniFun` (beta `UniFun` beta)))
223 (noIdInfo `addInfo_UF` (mkUnfolding EssentialUnfolding par_template))
233 = CoTyLam alpha_tyvar
236 CoCase (CoPrim ParOp [alpha_ty] [CoVarAtom x]) (
238 [(mkMachInt 0, CoTyApp (CoVar pAR_ERROR_ID) beta_ty)]
239 (CoBindDefault z (CoVar y))))))
241 -- forkId :: "_fork_", for *required* concurrent threads
243 _fork_ = /\ a b -> \ x::a y::b -> case fork# x of { 0# -> parError#; _ -> y; }
245 forkId = pcMiscPrelId forkIdKey pRELUDE_BUILTIN SLIT("_fork_")
246 (mkSigmaTy [alpha_tv, beta_tv] []
247 (alpha `UniFun` (beta `UniFun` beta)))
248 (noIdInfo `addInfo_UF` (mkUnfolding EssentialUnfolding fork_template))
258 = CoTyLam alpha_tyvar
261 CoCase (CoPrim ForkOp [alpha_ty] [CoVarAtom x]) (
263 [(mkMachInt 0, CoTyApp (CoVar pAR_ERROR_ID) beta_ty)]
264 (CoBindDefault z (CoVar y))))))
271 parLocalId = pcMiscPrelId parLocalIdKey pRELUDE_BUILTIN SLIT("_parLocal_")
272 (mkSigmaTy [alpha_tv, beta_tv] []
273 (intPrimTy `UniFun` (alpha `UniFun` (beta `UniFun` beta))))
274 (noIdInfo `addInfo_UF` (mkUnfolding EssentialUnfolding parLocal_template))
285 = CoTyLam alpha_tyvar
288 CoCase (CoPrim ParLocalOp [alpha_ty, beta_ty] [CoVarAtom x, CoVarAtom w, CoVarAtom y]) (
290 [(liftDataCon, [z], CoVar z)]
293 parGlobalId = pcMiscPrelId parGlobalIdKey pRELUDE_BUILTIN SLIT("_parGlobal_")
294 (mkSigmaTy [alpha_tv, beta_tv] []
295 (intPrimTy `UniFun` (alpha `UniFun` (beta `UniFun` beta))))
296 (noIdInfo `addInfo_UF` (mkUnfolding EssentialUnfolding parGlobal_template))
307 = CoTyLam alpha_tyvar
310 CoCase (CoPrim ParGlobalOp [alpha_ty, beta_ty] [CoVarAtom x, CoVarAtom w, CoVarAtom y]) (
312 [(liftDataCon, [z], CoVar z)]
320 vectorMapId = pcChooseToKnowId vectorMapU pRELUDE "vectorMap"
321 (mkSigmaTy [alpha_tv, beta_tv , gamma_tv]
323 ((beta `UniFun` gamma) `UniFun`
324 ((mkPodTy (mkProcessorTy [alpha] beta)) `UniFun`
325 (mkPodTy (mkProcessorTy [alpha] gamma)))))
326 (panic "vectorMap:unfolding")--ToDo:DPH: (mkUnfoldTemplate vector_map_template)
330 vectorMap fn vec = << (|x;fn y|) | (|x;y|) <<- vec >>
333 vectorMap :: for all a.83, b.82, c.86. <Pid a.83>
338 /\ t83 t82 o86 -> \ dict.127 ->
342 << let si.133 = fn.129 ds.132 in
346 dict.127 ((toDomain t82) dict.127 ds.131)
347 in MkProcessor1! Integer o86 si.134 si.133 |
348 (| ds.131 ; ds.132 |) <<- vec.130 >>
351 NOTE : no need to bother with overloading in class Pid; because the result
352 PID (si.133) is wrapped in fromDomain.toDomain == id . Therefore we
353 use the simplification below.
357 for all d.83, e.82, f.86.
358 <Pid e.82> -> (d.83 -> f.86) -> <<e.82;d.83>> -> <<e.82;f.86>>
360 /\ t83 t82 o86 -> \ dict.127 fn.129 vec.130 ->
361 << MkProcessor1! Integer o86 ds.131 (fn.129 ds.132) |
362 (| ds.131 ; ds.132 |) <<- vec.130 >>
367 [dict,fn,vec,ds131,ds132]
369 [mkDictTy pidClass alpha_ty,
370 beta_ty `UniFun` gamma_ty,
371 mkPodTy (mkProcessorTy [alpha_ty] beta_ty),
378 (mkCoLam [dict,fn,vec]
380 (CoCon (mkProcessorCon 1)
381 [integerTy,mkTyVarTy gamma_tyvar]
383 (CoApp (CoVar fn) (CoVar ds132))])
384 (CoDrawnGen [ds131] ds132 (CoVar vec)) ))))
386 #endif {- Data Parallel Haskell -}
391 -- A function used during podization that produces an index POD for a given
394 primIfromPodNSelectorId :: Int -> Int -> Id
395 primIfromPodNSelectorId i n
399 ("prim"++ show i ++ "fromPod" ++ show n ++ "Selector")
404 #endif {- Data Parallel Haskell -}
407 %************************************************************************
409 \subsection[PrelVals-deriving]{Values known about mainly for doing derived instance decls}
411 %************************************************************************
413 map :: (a -> b) -> [a] -> [b]
414 -- this is up in the here-because-of-unfolding list
416 --??showChar :: Char -> ShowS
417 showSpace :: ShowS -- non-std: == "showChar ' '"
418 showString :: String -> ShowS
419 showParen :: Bool -> ShowS -> ShowS
421 (++) :: [a] -> [a] -> [a]
422 readParen :: Bool -> ReadS a -> ReadS a
427 readS_ty :: UniType -> UniType
429 = UniFun stringTy (mkListTy (mkTupleTy 2 [ty, stringTy]))
432 showS_ty = UniFun stringTy stringTy
438 showSpaceId = pcMiscPrelId showSpaceIdKey pRELUDE_TEXT SLIT("_showSpace")
442 showParenId = pcMiscPrelId showParenIdKey pRELUDE_TEXT SLIT("showParen")
443 (boolTy `UniFun` (showS_ty `UniFun` showS_ty))
446 readParenId = pcMiscPrelId readParenIdKey pRELUDE_TEXT SLIT("readParen")
447 (mkSigmaTy [alpha_tv] [] (
449 (readS_ty alpha) `UniFun` (readS_ty alpha))))
452 lexId = pcMiscPrelId lexIdKey pRELUDE_TEXT SLIT("lex")
453 (readS_ty (mkListTy charTy))
458 %************************************************************************
460 \subsection[PrelVals-void]{@void#@: Magic value of type @Void#@}
462 %************************************************************************
464 I don't think this is available to the user; it's used in the
465 simplifier (WDP 94/06).
468 = pcMiscPrelId voidPrimIdKey pRELUDE_BUILTIN SLIT("void#")
472 %************************************************************************
474 \subsection[PrelVals-runST]{@_runST@: Magic start-state-transformer function}
476 %************************************************************************
478 @_runST@ has a non-Haskell-able type:
480 -- _runST :: forall a. (forall s. _ST s a) -> a
481 -- which is to say ::
482 -- forall a. (forall s. (_State s -> (a, _State s))) -> a
484 _runST a m = case m _RealWorld (S# _RealWorld realWorld#) of
485 (r :: a, wild :: _State _RealWorld) -> r
487 We unfold always, just for simplicity:
490 = pcMiscPrelId runSTIdKey pRELUDE_BUILTIN SLIT("_runST") run_ST_ty id_info
495 st_ty a = mkSigmaTy [s_tv] [] (mkStateTransformerTy s a)
498 = mkSigmaTy [alpha_tv] [] (st_ty alpha `UniFun` alpha)
499 -- NB: rank-2 polymorphism! (forall inside the st_ty...)
503 `addInfo` mkArityInfo 1
504 `addInfo` mkStrictnessInfo [WwStrict] Nothing
505 -- ABSOLUTELY NO UNFOLDING, e.g.: (mkUnfolding EssentialUnfolding run_ST_template)
510 {-m-} st_ty alpha_ty,
511 {-t-} realWorldStateTy,
513 {-_-} realWorldStateTy
517 = CoTyLam alpha_tyvar
519 CoLet (CoNonRec t (CoCon stateDataCon [realWorldTy] [CoVarAtom realWorldPrimId])) (
520 CoCase (CoApp (mkCoTyApp (CoVar m) realWorldTy) (CoVarAtom t)) (
522 [(mkTupleCon 2, [r, wild], CoVar r)]
527 SLPJ 95/04: Why @_runST@ must not have an unfolding; consider:
531 (a, s') = newArray# 100 [] s
532 (_, s'') = fill_in_array_or_something a x s'
536 If we inline @_runST@, we'll get:
539 (a, s') = newArray# 100 [] realWorld#{-NB-}
540 (_, s'') = fill_in_array_or_something a x s'
544 And now the @newArray#@ binding can be floated to become a CAF, which
545 is totally and utterly wrong:
548 (a, s') = newArray# 100 [] realWorld#{-NB-} -- YIKES!!!
551 let (_, s'') = fill_in_array_or_something a x s' in
554 All calls to @f@ will share a {\em single} array! End SLPJ 95/04.
556 @realWorld#@ used to be a magic literal, \tr{void#}. If things get
557 nasty as-is, change it back to a literal (@BasicLit@).
560 = pcMiscPrelId realWorldPrimIdKey pRELUDE_BUILTIN SLIT("realWorld#")
565 %************************************************************************
567 \subsection[PrelVals-foldr-build]{Values known about for ``foldr/build''}
569 %************************************************************************
573 = pcMiscPrelId buildIdKey pRELUDE_CORE SLIT("_build") buildTy
575 `addInfo_UF` mkMagicUnfolding SLIT("build"))
576 `addInfo` mkStrictnessInfo [WwStrict] Nothing)
577 `addInfo` mkArgUsageInfo [ArgUsage 2])
578 `addInfo` pcGenerateSpecs buildIdKey buildId noIdInfo{-ToDo-} buildTy)
579 -- cheating, but since _build never actually exists ...
581 -- The type of this strange object is:
582 -- \/ a . (\/ b . (a -> b -> b) -> b -> b) -> [a]
584 buildTy = mkSigmaTy [alpha_tv] [] (buildUniTy `UniFun` (mkListTy alpha))
586 buildUniTy = mkSigmaTy [beta_tv] []
587 ((alpha `UniFun` (beta `UniFun` beta))
588 `UniFun` (beta `UniFun` beta))
591 @mkBuild@ is sugar for building a build!
593 @mkbuild ty tv c n e@ $Rightarrow$ @build ty (/\ tv -> \ c n -> e)@
594 @ty@ is the type of the list.
595 @tv@ is always a new type variable.
596 @c,n@ are Id's for the abstract cons and nil, @g@ for let binding the argument argument.
599 v :: (\/ b . (a -> b -> b) -> b -> b) -> [a]
600 -- \/ a . (\/ b . (a -> b -> b) -> b -> b) -> [a]
601 @e@ is the object right inside the @build@
609 -> PlainCoreExpr -- template
610 -> PlainCoreExpr -- template
612 mkBuild ty tv c n g expr
613 = CoLet (CoNonRec g (CoTyLam tv (mkCoLam [c,n] expr)))
614 (CoApp (mkCoTyApp (CoVar buildId) ty) (CoVarAtom g))
617 mkFoldr ty_a ty_b [x,y...] => foldr ty_a ty_b x y ..
620 foldrId = pcMiscPrelId foldrIdKey pRELUDE_FB{-not "List"-} SLIT("foldr")
624 mkSigmaTy [alpha_tv, beta_tv] []
625 ((alpha `UniFun` (beta `UniFun` beta))
627 `UniFun` ((mkListTy alpha)
630 idInfo = (((((noIdInfo
631 `addInfo_UF` mkMagicUnfolding SLIT("foldr"))
632 `addInfo` mkStrictnessInfo [WwLazy False,WwLazy False,WwStrict] Nothing)
633 `addInfo` mkArityInfo 3)
634 `addInfo` mkUpdateInfo [2,2,1])
635 `addInfo` pcGenerateSpecs foldrIdKey foldrId noIdInfo{-ToDo-} foldrTy)
637 mkFoldr a b f z xs = foldl CoApp
638 (mkCoTyApps (CoVar foldrId) [a, b])
639 [CoVarAtom f,CoVarAtom z,CoVarAtom xs]
641 foldlId = pcMiscPrelId foldlIdKey pRELUDE_FB{-not "List"-} SLIT("foldl")
645 mkSigmaTy [alpha_tv, beta_tv] []
646 ((alpha `UniFun` (beta `UniFun` alpha))
648 `UniFun` ((mkListTy beta)
651 idInfo = (((((noIdInfo
652 `addInfo_UF` mkMagicUnfolding SLIT("foldl"))
653 `addInfo` mkStrictnessInfo [WwLazy False,WwLazy False,WwStrict] Nothing)
654 `addInfo` mkArityInfo 3)
655 `addInfo` mkUpdateInfo [2,2,1])
656 `addInfo` pcGenerateSpecs foldlIdKey foldlId noIdInfo{-ToDo-} foldlTy)
658 mkFoldl a b f z xs = foldl CoApp
659 (mkCoTyApps (CoVar foldlId) [a, b])
660 [CoVarAtom f,CoVarAtom z,CoVarAtom xs]
662 pRELUDE_FB = SLIT("PreludeFoldrBuild")