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, mkTemplateLocal, 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))
135 mkTemplateLocal :: Int -> Type -> Id
136 mkTemplateLocal i ty = mkSysLocal SLIT("tpl") (mkBuiltinUnique i) ty
140 %************************************************************************
142 \subsection[Id-general-funs]{General @Id@-related functions}
144 %************************************************************************
147 idFreeTyVars :: Id -> TyVarSet
148 idFreeTyVars id = tyVarsOfType (idType id)
150 setIdType :: Id -> Type -> Id
151 -- Add free tyvar info to the type
152 setIdType id ty = setVarType id (addFreeTyVars ty)
154 idPrimRep :: Id -> PrimRep
155 idPrimRep id = typePrimRep (idType id)
158 omitIfaceSigForId tells whether an Id's info is implied by other declarations,
159 so we don't need to put its signature in an interface file, even if it's mentioned
160 in some other interface unfolding.
163 omitIfaceSigForId :: Id -> Bool
165 | isWiredInName (idName id)
169 = case idDetails id of
170 RecordSelId _ -> True -- Includes dictionary selectors
172 -- ConstantIds are implied by their type or class decl;
173 -- remember that all type and class decls appear in the interface file.
174 -- The dfun id must *not* be omitted, because it carries version info for
177 other -> False -- Don't omit!
180 %************************************************************************
182 \subsection{Special Ids}
184 %************************************************************************
187 recordSelectorFieldLabel :: Id -> FieldLabel
188 recordSelectorFieldLabel id = case idDetails id of
189 RecordSelId lbl -> lbl
191 isRecordSelector id = case idDetails id of
192 RecordSelId lbl -> True
195 isPrimitiveId_maybe id = case idDetails id of
196 ConstantId (PrimOp op) -> Just op
199 isDataConId_maybe id = case idDetails id of
200 ConstantId (DataCon con) -> Just con
203 isConstantId id = case idDetails id of
209 %************************************************************************
211 \subsection{IdInfo stuff}
213 %************************************************************************
216 ---------------------------------
218 getIdArity :: Id -> ArityInfo
219 getIdArity id = arityInfo (idInfo id)
221 setIdArity :: Id -> ArityInfo -> Id
222 setIdArity id arity = modifyIdInfo id (arity `setArityInfo`)
224 ---------------------------------
226 getIdStrictness :: Id -> StrictnessInfo
227 getIdStrictness id = strictnessInfo (idInfo id)
229 setIdStrictness :: Id -> StrictnessInfo -> Id
230 setIdStrictness id strict_info = modifyIdInfo id (strict_info `setStrictnessInfo`)
232 -- isBottomingId returns true if an application to n args would diverge
233 isBottomingId :: Id -> Bool
234 isBottomingId id = isBottomingStrictness (strictnessInfo (idInfo id))
236 idAppIsBottom :: Id -> Int -> Bool
237 idAppIsBottom id n = appIsBottom (strictnessInfo (idInfo id)) n
239 ---------------------------------
241 getIdUnfolding :: Id -> Unfolding
242 getIdUnfolding id = unfoldingInfo (idInfo id)
244 setIdUnfolding :: Id -> Unfolding -> Id
245 setIdUnfolding id unfolding = modifyIdInfo id (unfolding `setUnfoldingInfo`)
247 ---------------------------------
249 getIdDemandInfo :: Id -> Demand
250 getIdDemandInfo id = demandInfo (idInfo id)
252 setIdDemandInfo :: Id -> Demand -> Id
253 setIdDemandInfo id demand_info = modifyIdInfo id (demand_info `setDemandInfo`)
255 ---------------------------------
257 getIdUpdateInfo :: Id -> UpdateInfo
258 getIdUpdateInfo id = updateInfo (idInfo id)
260 setIdUpdateInfo :: Id -> UpdateInfo -> Id
261 setIdUpdateInfo id upd_info = modifyIdInfo id (upd_info `setUpdateInfo`)
263 ---------------------------------
265 getIdSpecialisation :: Id -> IdSpecEnv
266 getIdSpecialisation id = specInfo (idInfo id)
268 setIdSpecialisation :: Id -> IdSpecEnv -> Id
269 setIdSpecialisation id spec_info = modifyIdInfo id (spec_info `setSpecInfo`)
271 ---------------------------------
273 getIdCafInfo :: Id -> CafInfo
274 getIdCafInfo id = cafInfo (idInfo id)
276 setIdCafInfo :: Id -> CafInfo -> Id
277 setIdCafInfo id caf_info = modifyIdInfo id (caf_info `setCafInfo`)
281 ---------------------------------
283 The inline pragma tells us to be very keen to inline this Id, but it's still
284 OK not to if optimisation is switched off.
287 getInlinePragma :: Id -> InlinePragInfo
288 getInlinePragma id = inlinePragInfo (idInfo id)
290 setInlinePragma :: Id -> InlinePragInfo -> Id
291 setInlinePragma id prag = modifyIdInfo id (setInlinePragInfo prag)
293 modifyInlinePragma :: Id -> (InlinePragInfo -> InlinePragInfo) -> Id
294 modifyInlinePragma id fn = modifyIdInfo id (\info -> setInlinePragInfo (fn (inlinePragInfo info)) info)
296 idWantsToBeINLINEd :: Id -> Bool
297 idWantsToBeINLINEd id = case getInlinePragma id of
298 IWantToBeINLINEd -> True
299 IMustBeINLINEd -> True
302 idMustNotBeINLINEd id = case getInlinePragma id of
303 IMustNotBeINLINEd -> True
304 IAmASpecPragmaId -> True
305 IAmALoopBreaker -> True
308 idMustBeINLINEd id = case getInlinePragma id of
309 IMustBeINLINEd -> True
312 isSpecPragmaId id = case getInlinePragma id of
313 IAmASpecPragmaId -> True