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 (UniFun addrPrimTy{-a char *-} stringTy) noIdInfo
121 --------------------------------------------------------------------
122 unpackCStringAppendId
123 = pcMiscPrelId unpackCStringIdKey pRELUDE_BUILTIN SLIT("unpackCStringAppend#")
124 (addrPrimTy{-a "char *" pointer-}
126 `UniFun` stringTy)) noIdInfo
128 --------------------------------------------------------------------
131 = pcMiscPrelId packCStringIdKey{-ToDo:rename-} pRELUDE_PS SLIT("_packStringForC")
132 (UniFun stringTy byteArrayPrimTy) noIdInfo
135 OK, this is Will's idea: we should have magic values for Integers 0,
136 +1, and -1 (go ahead, fire me):
139 = pcMiscPrelId integerZeroIdKey pRELUDE_CORE SLIT("_integer_0") integerTy noIdInfo
141 = pcMiscPrelId integerPlusOneIdKey pRELUDE_CORE SLIT("_integer_1") integerTy noIdInfo
143 = pcMiscPrelId integerMinusOneIdKey pRELUDE_CORE SLIT("_integer_m1") integerTy noIdInfo
146 %************************************************************************
148 \subsection[PrelVals-parallel]{@seq@ and @par@: for parallel operation (only)}
150 %************************************************************************
152 In the definitions that follow, we use the @TyVar@-based
153 alpha/beta/gamma types---not the usual @TyVarTemplate@ ones.
155 This is so the @TyVars@ in the @CoTyLams@ (@alpha_tyvar@, etc) match
156 up with those in the types of the {\em lambda-bound} template-locals
157 we create (using types @alpha_ty@, etc.).
160 --------------------------------------------------------------------
161 -- seqId :: "_seq_", used w/ GRIP, etc., is really quite similar to
165 _seq_ = /\ a b -> \ x y -> case x of { _ -> y }
168 _seq_ = /\ a b -> \ x y -> case seq# x y of { _Lift y' -> y' }
171 _seq_ = /\ a b -> \ x::a y::b -> case seq# x of { 0# -> parError#; _ -> y; }
175 seqId = pcMiscPrelId seqIdKey pRELUDE_BUILTIN SLIT("_seq_")
176 (mkSigmaTy [alpha_tv, beta_tv] []
177 (alpha `UniFun` (beta `UniFun` beta)))
178 (noIdInfo `addInfo_UF` (mkUnfolding EssentialUnfolding seq_template))
188 = CoTyLam alpha_tyvar
191 CoCase (CoPrim SeqOp [alpha_ty] [CoVarAtom x]) (
193 [(mkMachInt 0, CoTyApp (CoVar pAR_ERROR_ID) beta_ty)]
194 (CoBindDefault z (CoVar y))))))
196 --------------------------------------------------------------------
197 -- parId :: "_par_", also used w/ GRIP, etc.
201 par = /\ a b -> \ x y -> case (par# (case x of { _ -> () })) of { _ -> y }
205 _par_ = /\ a b -> \ x y -> case par# x y of { _Lift y' -> y' }
209 _par_ = /\ a b -> \ x::a y::b -> case par# x of { 0# -> parError#; _ -> y; }
212 parId = pcMiscPrelId parIdKey pRELUDE_BUILTIN SLIT("_par_")
213 (mkSigmaTy [alpha_tv, beta_tv] []
214 (alpha `UniFun` (beta `UniFun` beta)))
215 (noIdInfo `addInfo_UF` (mkUnfolding EssentialUnfolding par_template))
225 = CoTyLam alpha_tyvar
228 CoCase (CoPrim ParOp [alpha_ty] [CoVarAtom x]) (
230 [(mkMachInt 0, CoTyApp (CoVar pAR_ERROR_ID) beta_ty)]
231 (CoBindDefault z (CoVar y))))))
233 -- forkId :: "_fork_", for *required* concurrent threads
235 _fork_ = /\ a b -> \ x::a y::b -> case fork# x of { 0# -> parError#; _ -> y; }
237 forkId = pcMiscPrelId forkIdKey pRELUDE_BUILTIN SLIT("_fork_")
238 (mkSigmaTy [alpha_tv, beta_tv] []
239 (alpha `UniFun` (beta `UniFun` beta)))
240 (noIdInfo `addInfo_UF` (mkUnfolding EssentialUnfolding fork_template))
250 = CoTyLam alpha_tyvar
253 CoCase (CoPrim ForkOp [alpha_ty] [CoVarAtom x]) (
255 [(mkMachInt 0, CoTyApp (CoVar pAR_ERROR_ID) beta_ty)]
256 (CoBindDefault z (CoVar y))))))
263 parLocalId = pcMiscPrelId parLocalIdKey pRELUDE_BUILTIN SLIT("_parLocal_")
264 (mkSigmaTy [alpha_tv, beta_tv] []
265 (intPrimTy `UniFun` (alpha `UniFun` (beta `UniFun` beta))))
266 (noIdInfo `addInfo_UF` (mkUnfolding EssentialUnfolding parLocal_template))
277 = CoTyLam alpha_tyvar
280 CoCase (CoPrim ParLocalOp [alpha_ty, beta_ty] [CoVarAtom x, CoVarAtom w, CoVarAtom y]) (
282 [(liftDataCon, [z], CoVar z)]
285 parGlobalId = pcMiscPrelId parGlobalIdKey pRELUDE_BUILTIN SLIT("_parGlobal_")
286 (mkSigmaTy [alpha_tv, beta_tv] []
287 (intPrimTy `UniFun` (alpha `UniFun` (beta `UniFun` beta))))
288 (noIdInfo `addInfo_UF` (mkUnfolding EssentialUnfolding parGlobal_template))
299 = CoTyLam alpha_tyvar
302 CoCase (CoPrim ParGlobalOp [alpha_ty, beta_ty] [CoVarAtom x, CoVarAtom w, CoVarAtom y]) (
304 [(liftDataCon, [z], CoVar z)]
312 vectorMapId = pcChooseToKnowId vectorMapU pRELUDE "vectorMap"
313 (mkSigmaTy [alpha_tv, beta_tv , gamma_tv]
315 ((beta `UniFun` gamma) `UniFun`
316 ((mkPodTy (mkProcessorTy [alpha] beta)) `UniFun`
317 (mkPodTy (mkProcessorTy [alpha] gamma)))))
318 (panic "vectorMap:unfolding")--ToDo:DPH: (mkUnfoldTemplate vector_map_template)
322 vectorMap fn vec = << (|x;fn y|) | (|x;y|) <<- vec >>
325 vectorMap :: for all a.83, b.82, c.86. <Pid a.83>
330 /\ t83 t82 o86 -> \ dict.127 ->
334 << let si.133 = fn.129 ds.132 in
338 dict.127 ((toDomain t82) dict.127 ds.131)
339 in MkProcessor1! Integer o86 si.134 si.133 |
340 (| ds.131 ; ds.132 |) <<- vec.130 >>
343 NOTE : no need to bother with overloading in class Pid; because the result
344 PID (si.133) is wrapped in fromDomain.toDomain == id . Therefore we
345 use the simplification below.
349 for all d.83, e.82, f.86.
350 <Pid e.82> -> (d.83 -> f.86) -> <<e.82;d.83>> -> <<e.82;f.86>>
352 /\ t83 t82 o86 -> \ dict.127 fn.129 vec.130 ->
353 << MkProcessor1! Integer o86 ds.131 (fn.129 ds.132) |
354 (| ds.131 ; ds.132 |) <<- vec.130 >>
359 [dict,fn,vec,ds131,ds132]
361 [mkDictTy pidClass alpha_ty,
362 beta_ty `UniFun` gamma_ty,
363 mkPodTy (mkProcessorTy [alpha_ty] beta_ty),
370 (mkCoLam [dict,fn,vec]
372 (CoCon (mkProcessorCon 1)
373 [integerTy,mkTyVarTy gamma_tyvar]
375 (CoApp (CoVar fn) (CoVar ds132))])
376 (CoDrawnGen [ds131] ds132 (CoVar vec)) ))))
378 #endif {- Data Parallel Haskell -}
383 -- A function used during podization that produces an index POD for a given
386 primIfromPodNSelectorId :: Int -> Int -> Id
387 primIfromPodNSelectorId i n
391 ("prim"++ show i ++ "fromPod" ++ show n ++ "Selector")
396 #endif {- Data Parallel Haskell -}
399 %************************************************************************
401 \subsection[PrelVals-deriving]{Values known about mainly for doing derived instance decls}
403 %************************************************************************
405 map :: (a -> b) -> [a] -> [b]
406 -- this is up in the here-because-of-unfolding list
408 --??showChar :: Char -> ShowS
409 showSpace :: ShowS -- non-std: == "showChar ' '"
410 showString :: String -> ShowS
411 showParen :: Bool -> ShowS -> ShowS
413 (++) :: [a] -> [a] -> [a]
414 readParen :: Bool -> ReadS a -> ReadS a
419 readS_ty :: UniType -> UniType
421 = UniFun stringTy (mkListTy (mkTupleTy 2 [ty, stringTy]))
424 showS_ty = UniFun stringTy stringTy
430 showSpaceId = pcMiscPrelId showSpaceIdKey pRELUDE_TEXT SLIT("_showSpace")
434 showParenId = pcMiscPrelId showParenIdKey pRELUDE_TEXT SLIT("showParen")
435 (boolTy `UniFun` (showS_ty `UniFun` showS_ty))
438 readParenId = pcMiscPrelId readParenIdKey pRELUDE_TEXT SLIT("readParen")
439 (mkSigmaTy [alpha_tv] [] (
441 (readS_ty alpha) `UniFun` (readS_ty alpha))))
444 lexId = pcMiscPrelId lexIdKey pRELUDE_TEXT SLIT("lex")
445 (readS_ty (mkListTy charTy))
450 %************************************************************************
452 \subsection[PrelVals-void]{@void#@: Magic value of type @Void#@}
454 %************************************************************************
456 I don't think this is available to the user; it's used in the
457 simplifier (WDP 94/06).
460 = pcMiscPrelId voidPrimIdKey pRELUDE_BUILTIN SLIT("void#")
464 %************************************************************************
466 \subsection[PrelVals-runST]{@_runST@: Magic start-state-transformer function}
468 %************************************************************************
470 @_runST@ has a non-Haskell-able type:
472 -- _runST :: forall a. (forall s. _ST s a) -> a
473 -- which is to say ::
474 -- forall a. (forall s. (_State s -> (a, _State s))) -> a
476 _runST a m = case m _RealWorld (S# _RealWorld realWorld#) of
477 (r :: a, wild :: _State _RealWorld) -> r
479 We unfold always, just for simplicity:
482 = pcMiscPrelId runSTIdKey pRELUDE_BUILTIN SLIT("_runST") run_ST_ty id_info
487 st_ty a = mkSigmaTy [s_tv] [] (mkStateTransformerTy s a)
490 = mkSigmaTy [alpha_tv] [] (st_ty alpha `UniFun` alpha)
491 -- NB: rank-2 polymorphism! (forall inside the st_ty...)
495 `addInfo` mkArityInfo 1
496 `addInfo` mkStrictnessInfo [WwStrict] Nothing
497 -- ABSOLUTELY NO UNFOLDING, e.g.: (mkUnfolding EssentialUnfolding run_ST_template)
502 {-m-} st_ty alpha_ty,
503 {-t-} realWorldStateTy,
505 {-_-} realWorldStateTy
509 = CoTyLam alpha_tyvar
511 CoLet (CoNonRec t (CoCon stateDataCon [realWorldTy] [CoVarAtom realWorldPrimId])) (
512 CoCase (CoApp (mkCoTyApp (CoVar m) realWorldTy) (CoVarAtom t)) (
514 [(mkTupleCon 2, [r, wild], CoVar r)]
519 SLPJ 95/04: Why @_runST@ must not have an unfolding; consider:
523 (a, s') = newArray# 100 [] s
524 (_, s'') = fill_in_array_or_something a x s'
528 If we inline @_runST@, we'll get:
531 (a, s') = newArray# 100 [] realWorld#{-NB-}
532 (_, s'') = fill_in_array_or_something a x s'
536 And now the @newArray#@ binding can be floated to become a CAF, which
537 is totally and utterly wrong:
540 (a, s') = newArray# 100 [] realWorld#{-NB-} -- YIKES!!!
543 let (_, s'') = fill_in_array_or_something a x s' in
546 All calls to @f@ will share a {\em single} array! End SLPJ 95/04.
548 @realWorld#@ used to be a magic literal, \tr{void#}. If things get
549 nasty as-is, change it back to a literal (@BasicLit@).
552 = pcMiscPrelId realWorldPrimIdKey pRELUDE_BUILTIN SLIT("realWorld#")
557 %************************************************************************
559 \subsection[PrelVals-foldr-build]{Values known about for ``foldr/build''}
561 %************************************************************************
565 = pcMiscPrelId buildIdKey pRELUDE_CORE SLIT("_build") buildTy
567 `addInfo_UF` mkMagicUnfolding SLIT("build"))
568 `addInfo` mkStrictnessInfo [WwStrict] Nothing)
569 `addInfo` mkArgUsageInfo [ArgUsage 2])
570 -- cheating, but since _build never actually exists ...
572 -- The type of this strange object is:
573 -- \/ a . (\/ b . (a -> b -> b) -> b -> b) -> [a]
575 buildTy = mkSigmaTy [alpha_tv] [] (buildUniTy `UniFun` (mkListTy alpha))
577 buildUniTy = mkSigmaTy [beta_tv] []
578 ((alpha `UniFun` (beta `UniFun` beta))
579 `UniFun` (beta `UniFun` beta))
582 @mkBuild@ is sugar for building a build!
584 @mkbuild ty tv c n e@ $Rightarrow$ @build ty (/\ tv -> \ c n -> e)@
585 @ty@ is the type of the list.
586 @tv@ is always a new type variable.
587 @c,n@ are Id's for the abstract cons and nil, @g@ for let binding the argument argument.
590 v :: (\/ b . (a -> b -> b) -> b -> b) -> [a]
591 -- \/ a . (\/ b . (a -> b -> b) -> b -> b) -> [a]
592 @e@ is the object right inside the @build@
600 -> PlainCoreExpr -- template
601 -> PlainCoreExpr -- template
603 mkBuild ty tv c n g expr
604 = CoLet (CoNonRec g (CoTyLam tv (mkCoLam [c,n] expr)))
605 (CoApp (mkCoTyApp (CoVar buildId) ty) (CoVarAtom g))
608 mkFoldr ty_a ty_b [x,y...] => foldr ty_a ty_b x y ..
611 foldrId = pcMiscPrelId foldrIdKey pRELUDE_FB{-not "List"-} SLIT("foldr")
615 mkSigmaTy [alpha_tv, beta_tv] []
616 ((alpha `UniFun` (beta `UniFun` beta))
618 `UniFun` ((mkListTy alpha)
621 idInfo = ((((noIdInfo
622 `addInfo_UF` mkMagicUnfolding SLIT("foldr"))
623 `addInfo` mkStrictnessInfo [WwLazy False,WwLazy False,WwStrict] Nothing)
624 `addInfo` mkArityInfo 3)
625 `addInfo` mkUpdateInfo [2,2,1])
627 mkFoldr a b f z xs = foldl CoApp
628 (mkCoTyApps (CoVar foldrId) [a, b])
629 [CoVarAtom f,CoVarAtom z,CoVarAtom xs]
631 foldlId = pcMiscPrelId foldlIdKey pRELUDE_FB{-not "List"-} SLIT("foldl")
635 mkSigmaTy [alpha_tv, beta_tv] []
636 ((alpha `UniFun` (beta `UniFun` alpha))
638 `UniFun` ((mkListTy beta)
641 idInfo = ((((noIdInfo
642 `addInfo_UF` mkMagicUnfolding SLIT("foldl"))
643 `addInfo` mkStrictnessInfo [WwLazy False,WwLazy False,WwStrict] Nothing)
644 `addInfo` mkArityInfo 3)
645 `addInfo` mkUpdateInfo [2,2,1])
647 mkFoldl a b f z xs = foldl CoApp
648 (mkCoTyApps (CoVar foldlId) [a, b])
649 [CoVarAtom f,CoVarAtom z,CoVarAtom xs]
651 pRELUDE_FB = SLIT("PreludeFoldrBuild")