2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
4 \section[Id]{@Ids@: Value and constructor identifiers}
10 -- Simple construction
11 mkVanillaId, mkImportedId, mkSysLocal, mkUserLocal,
12 mkTemplateLocals, mkWildId, mkUserId,
15 idName, idType, idUnique, idInfo, idDetails,
17 recordSelectorFieldLabel,
20 setIdName, setIdUnique, setIdType, setIdInfo,
27 -- Inline pragma stuff
28 getInlinePragma, setInlinePragma, modifyInlinePragma,
29 idWantsToBeINLINEd, idMustBeINLINEd, idMustNotBeINLINEd,
34 isPrimitiveId_maybe, isDataConId_maybe,
36 isBottomingId, idAppIsBottom,
57 #include "HsVersions.h"
59 import {-# SOURCE #-} CoreUnfold ( Unfolding )
61 import Var ( Id, DictId, VarDetails(..),
63 idName, idType, idUnique, idInfo, idDetails,
64 setIdName, setVarType, setIdUnique, setIdInfo, modifyIdInfo,
68 import Type ( Type, tyVarsOfType, typePrimRep, addFreeTyVars )
70 import Demand ( Demand )
71 import Name ( Name, OccName,
72 mkSysLocalName, mkLocalName,
75 import Const ( Con(..) )
76 import PrimRep ( PrimRep )
77 import PrimOp ( PrimOp )
78 import FieldLabel ( FieldLabel(..) )
79 import SrcLoc ( SrcLoc )
80 import Unique ( Unique, mkBuiltinUnique, getBuiltinUniques )
83 infixl 1 `setIdUnfolding`,
87 `setIdSpecialisation`,
90 -- infixl so you can say (id `set` a `set` b)
95 %************************************************************************
97 \subsection{Simple Id construction}
99 %************************************************************************
102 mkVanillaId :: Name -> Type -> Id
103 mkVanillaId name ty = mkId name (addFreeTyVars ty) VanillaId noIdInfo
105 mkImportedId :: Name -> Type -> IdInfo -> Id
106 mkImportedId name ty info = mkId name (addFreeTyVars ty) VanillaId info
108 mkUserId :: Name -> Type -> Id
109 mkUserId name ty = mkVanillaId name ty
111 -- SysLocal: for an Id being created by the compiler out of thin air...
112 -- UserLocal: an Id with a name the user might recognize...
113 mkUserLocal :: OccName -> Unique -> Type -> SrcLoc -> Id
114 mkSysLocal :: FAST_STRING -> Unique -> Type -> Id
116 mkSysLocal fs uniq ty = mkVanillaId (mkSysLocalName uniq fs) ty
117 mkUserLocal occ uniq ty loc = mkVanillaId (mkLocalName uniq occ loc) ty
120 Make some local @Ids@ for a template @CoreExpr@. These have bogus
121 @Uniques@, but that's OK because the templates are supposed to be
122 instantiated before use.
125 -- "Wild Id" typically used when you need a binder that you don't expect to use
126 mkWildId :: Type -> Id
127 mkWildId ty = mkSysLocal SLIT("wild") (mkBuiltinUnique 1) ty
129 -- "Template locals" typically used in unfoldings
130 mkTemplateLocals :: [Type] -> [Id]
131 mkTemplateLocals tys = zipWith (mkSysLocal SLIT("tpl"))
132 (getBuiltinUniques (length tys))
137 %************************************************************************
139 \subsection[Id-general-funs]{General @Id@-related functions}
141 %************************************************************************
144 idFreeTyVars :: Id -> TyVarSet
145 idFreeTyVars id = tyVarsOfType (idType id)
147 setIdType :: Id -> Type -> Id
148 -- Add free tyvar info to the type
149 setIdType id ty = setVarType id (addFreeTyVars ty)
151 idPrimRep :: Id -> PrimRep
152 idPrimRep id = typePrimRep (idType id)
155 omitIfaceSigForId tells whether an Id's info is implied by other declarations,
156 so we don't need to put its signature in an interface file, even if it's mentioned
157 in some other interface unfolding.
160 omitIfaceSigForId :: Id -> Bool
162 | isWiredInName (idName id)
166 = case idDetails id of
167 RecordSelId _ -> True -- Includes dictionary selectors
169 -- ConstantIds are implied by their type or class decl;
170 -- remember that all type and class decls appear in the interface file.
171 -- The dfun id must *not* be omitted, because it carries version info for
174 other -> False -- Don't omit!
177 %************************************************************************
179 \subsection{Special Ids}
181 %************************************************************************
184 recordSelectorFieldLabel :: Id -> FieldLabel
185 recordSelectorFieldLabel id = case idDetails id of
186 RecordSelId lbl -> lbl
188 isRecordSelector id = case idDetails id of
189 RecordSelId lbl -> True
192 isPrimitiveId_maybe id = case idDetails id of
193 ConstantId (PrimOp op) -> Just op
196 isDataConId_maybe id = case idDetails id of
197 ConstantId (DataCon con) -> Just con
200 isConstantId id = case idDetails id of
206 %************************************************************************
208 \subsection{IdInfo stuff}
210 %************************************************************************
213 ---------------------------------
215 getIdArity :: Id -> ArityInfo
216 getIdArity id = arityInfo (idInfo id)
218 setIdArity :: Id -> ArityInfo -> Id
219 setIdArity id arity = modifyIdInfo id (arity `setArityInfo`)
221 ---------------------------------
223 getIdStrictness :: Id -> StrictnessInfo
224 getIdStrictness id = strictnessInfo (idInfo id)
226 setIdStrictness :: Id -> StrictnessInfo -> Id
227 setIdStrictness id strict_info = modifyIdInfo id (strict_info `setStrictnessInfo`)
229 -- isBottomingId returns true if an application to n args would diverge
230 isBottomingId :: Id -> Bool
231 isBottomingId id = isBottomingStrictness (strictnessInfo (idInfo id))
233 idAppIsBottom :: Id -> Int -> Bool
234 idAppIsBottom id n = appIsBottom (strictnessInfo (idInfo id)) n
236 ---------------------------------
238 getIdUnfolding :: Id -> Unfolding
239 getIdUnfolding id = unfoldingInfo (idInfo id)
241 setIdUnfolding :: Id -> Unfolding -> Id
242 setIdUnfolding id unfolding = modifyIdInfo id (unfolding `setUnfoldingInfo`)
244 ---------------------------------
246 getIdDemandInfo :: Id -> Demand
247 getIdDemandInfo id = demandInfo (idInfo id)
249 setIdDemandInfo :: Id -> Demand -> Id
250 setIdDemandInfo id demand_info = modifyIdInfo id (demand_info `setDemandInfo`)
252 ---------------------------------
254 getIdUpdateInfo :: Id -> UpdateInfo
255 getIdUpdateInfo id = updateInfo (idInfo id)
257 setIdUpdateInfo :: Id -> UpdateInfo -> Id
258 setIdUpdateInfo id upd_info = modifyIdInfo id (upd_info `setUpdateInfo`)
260 ---------------------------------
262 getIdSpecialisation :: Id -> IdSpecEnv
263 getIdSpecialisation id = specInfo (idInfo id)
265 setIdSpecialisation :: Id -> IdSpecEnv -> Id
266 setIdSpecialisation id spec_info = modifyIdInfo id (spec_info `setSpecInfo`)
268 ---------------------------------
270 getIdCafInfo :: Id -> CafInfo
271 getIdCafInfo id = cafInfo (idInfo id)
273 setIdCafInfo :: Id -> CafInfo -> Id
274 setIdCafInfo id caf_info = modifyIdInfo id (caf_info `setCafInfo`)
278 ---------------------------------
280 The inline pragma tells us to be very keen to inline this Id, but it's still
281 OK not to if optimisation is switched off.
284 getInlinePragma :: Id -> InlinePragInfo
285 getInlinePragma id = inlinePragInfo (idInfo id)
287 setInlinePragma :: Id -> InlinePragInfo -> Id
288 setInlinePragma id prag = modifyIdInfo id (setInlinePragInfo prag)
290 modifyInlinePragma :: Id -> (InlinePragInfo -> InlinePragInfo) -> Id
291 modifyInlinePragma id fn = modifyIdInfo id (\info -> setInlinePragInfo (fn (inlinePragInfo info)) info)
293 idWantsToBeINLINEd :: Id -> Bool
294 idWantsToBeINLINEd id = case getInlinePragma id of
295 IWantToBeINLINEd -> True
296 IMustBeINLINEd -> True
299 idMustNotBeINLINEd id = case getInlinePragma id of
300 IMustNotBeINLINEd -> True
301 IAmASpecPragmaId -> True
302 IAmALoopBreaker -> True
305 idMustBeINLINEd id = case getInlinePragma id of
306 IMustBeINLINEd -> True
309 isSpecPragmaId id = case getInlinePragma id of
310 IAmASpecPragmaId -> True