2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
4 \section[PrelVals]{Prelude values the compiler ``knows about''}
9 #include "HsVersions.h"
11 import {-# SOURCE #-} CoreUnfold ( mkUnfolding )
13 import Id ( Id, mkVanillaId, setIdInfo, mkTemplateLocals )
21 import CoreSyn -- quite a bit
22 import IdInfo -- quite a bit
23 import Name ( mkWiredInIdName, Module )
26 import Unique -- lots of *Keys
31 %************************************************************************
33 \subsection{Un-definable}
35 %************************************************************************
37 These two can't be defined in Haskell.
40 unsafeCoerce# isn't so much a PrimOp as a phantom identifier, that
41 just gets expanded into a type coercion wherever it occurs. Hence we
42 add it as a built-in Id with an unfolding here.
44 The type variables we use here are "open" type variables: this means
45 they can unify with both unlifted and lifted types. Hence we provide
46 another gun with which to shoot yourself in the foot.
50 = pcMiscPrelId unsafeCoerceIdKey pREL_GHC SLIT("unsafeCoerce#") ty
51 (mk_inline_unfolding template)
53 (alphaTyVar:betaTyVar:_) = openAlphaTyVars
54 alphaTy = mkTyVarTy alphaTyVar
55 betaTy = mkTyVarTy betaTyVar
56 ty = mkForAllTys [alphaTyVar,betaTyVar] (mkFunTy alphaTy betaTy)
57 [x] = mkTemplateLocals [alphaTy]
58 template = mkLams [alphaTyVar,betaTyVar,x] $
59 Note (Coerce betaTy alphaTy) (Var x)
63 @realWorld#@ used to be a magic literal, \tr{void#}. If things get
64 nasty as-is, change it back to a literal (@Literal@).
68 = pcMiscPrelId realWorldPrimIdKey pREL_GHC SLIT("realWorld#")
74 %************************************************************************
76 \subsection[PrelVals-error-related]{@error@ and friends; @trace@}
78 %************************************************************************
80 GHC randomly injects these into the code.
82 @patError@ is just a version of @error@ for pattern-matching
83 failures. It knows various ``codes'' which expand to longer
84 strings---this saves space!
86 @absentErr@ is a thing we put in for ``absent'' arguments. They jolly
87 well shouldn't be yanked on, but if one is, then you will get a
88 friendly message from @absentErr@ (rather than a totally random
91 @parError@ is a special version of @error@ which the compiler does
92 not know to be a bottoming Id. It is used in the @_par_@ and @_seq_@
93 templates, but we don't ever expect to generate code for it.
96 pc_bottoming_Id key mod name ty
97 = pcMiscPrelId key mod name ty bottoming_info
99 bottoming_info = mkBottomStrictnessInfo `setStrictnessInfo` noCafIdInfo
100 -- these "bottom" out, no matter what their arguments
103 = pc_bottoming_Id errorIdKey pREL_ERR SLIT("error") errorTy
106 = pc_bottoming_Id u pREL_ERR n errorTy
109 = generic_ERROR_ID recSelErrIdKey SLIT("patError")
111 = generic_ERROR_ID patErrorIdKey SLIT("patError")
113 = generic_ERROR_ID recConErrorIdKey SLIT("recConError")
115 = generic_ERROR_ID recUpdErrorIdKey SLIT("recUpdError")
117 = generic_ERROR_ID irrefutPatErrorIdKey SLIT("irrefutPatError")
118 nON_EXHAUSTIVE_GUARDS_ERROR_ID
119 = generic_ERROR_ID nonExhaustiveGuardsErrorIdKey SLIT("nonExhaustiveGuardsError")
120 nO_METHOD_BINDING_ERROR_ID
121 = generic_ERROR_ID noMethodBindingErrorIdKey SLIT("noMethodBindingError")
124 = pc_bottoming_Id absentErrorIdKey pREL_ERR SLIT("absentErr")
125 (mkSigmaTy [openAlphaTyVar] [] openAlphaTy)
128 = pcMiscPrelId parErrorIdKey pREL_ERR SLIT("parError")
129 (mkSigmaTy [openAlphaTyVar] [] openAlphaTy) noCafIdInfo
131 openAlphaTy = mkTyVarTy openAlphaTyVar
134 errorTy = mkSigmaTy [openAlphaTyVar] [] (mkFunTys [mkListTy charTy] openAlphaTy)
135 -- Notice the openAlphaTyVar. It says that "error" can be applied
136 -- to unboxed as well as boxed types. This is OK because it never
137 -- returns, so the return type is irrelevant.
141 %************************************************************************
143 \subsection{Utilities}
145 %************************************************************************
147 Note IMustBeINLINEd below. These things have the same status as
148 constructor functions, i.e. they will *always* be inlined, wherever
152 mk_inline_unfolding expr = setUnfoldingInfo (mkUnfolding expr) $
153 setInlinePragInfo IMustBeINLINEd noIdInfo
155 exactArityInfo n = exactArity n `setArityInfo` noIdInfo
157 pcMiscPrelId :: Unique{-IdKey-} -> Module -> FAST_STRING -> Type -> IdInfo -> Id
159 pcMiscPrelId key mod occ ty info
161 name = mkWiredInIdName key mod occ imp
162 imp = mkVanillaId name ty `setIdInfo` info -- the usual case...
165 -- We lie and say the thing is imported; otherwise, we get into
166 -- a mess with dependency analysis; e.g., core2stg may heave in
167 -- random calls to GHCbase.unpackPS__. If GHCbase is the module
168 -- being compiled, then it's just a matter of luck if the definition
169 -- will be in "the right place" to be in scope.
172 noCafIdInfo = NoCafRefs `setCafInfo` noIdInfo