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,
17 recordSelectorFieldLabel,
20 setIdName, setIdUnique, setIdType, setIdInfo,
21 setIdVisibility, mkIdVisible,
28 -- Inline pragma stuff
29 getInlinePragma, setInlinePragma, modifyInlinePragma,
30 idWantsToBeINLINEd, idMustBeINLINEd, idMustNotBeINLINEd,
35 isPrimitiveId_maybe, isDataConId_maybe,
58 #include "HsVersions.h"
60 import {-# SOURCE #-} CoreUnfold ( Unfolding )
62 import Var ( Id, GenId, DictId, VarDetails(..),
64 idName, idType, idUnique, idInfo, varDetails,
65 setIdName, setVarType, setIdUnique, setIdInfo, modifyIdInfo,
69 import Type ( GenType, Type, tyVarsOfType, typePrimRep, addFreeTyVars )
71 import Demand ( Demand )
72 import Name ( Name, OccName,
73 mkSysLocalName, mkLocalName,
74 isWiredInName, setNameVisibility, mkNameVisible
76 import Const ( Con(..) )
77 import PrimRep ( PrimRep )
78 import PrimOp ( PrimOp )
79 import FieldLabel ( FieldLabel(..) )
80 import BasicTypes ( Module )
81 import Unique ( Unique, mkBuiltinUnique, getBuiltinUniques )
84 infixl 1 `setIdUnfolding`,
88 `setIdSpecialisation`,
91 -- infixl so you can say (id `set` a `set` b)
96 %************************************************************************
98 \subsection{Simple Id construction}
100 %************************************************************************
103 mkVanillaId :: Name -> (GenType flexi) -> GenId flexi
104 mkVanillaId name ty = mkId name ty VanillaId noIdInfo
106 mkImportedId :: Name -> Type -> IdInfo -> Id
107 mkImportedId name ty info = mkId name ty VanillaId info
109 mkUserId :: Name -> GenType flexi -> GenId flexi
110 mkUserId name ty = mkVanillaId name ty
112 -- SysLocal: for an Id being created by the compiler out of thin air...
113 -- UserLocal: an Id with a name the user might recognize...
114 mkUserLocal :: OccName -> Unique -> GenType flexi -> GenId flexi
115 mkSysLocal :: Unique -> GenType flexi -> GenId flexi
117 mkSysLocal uniq ty = mkVanillaId (mkSysLocalName uniq) ty
118 mkUserLocal occ uniq ty = mkVanillaId (mkLocalName uniq occ) ty
121 Make some local @Ids@ for a template @CoreExpr@. These have bogus
122 @Uniques@, but that's OK because the templates are supposed to be
123 instantiated before use.
126 -- "Wild Id" typically used when you need a binder that you don't expect to use
127 mkWildId :: Type -> Id
128 mkWildId ty = mkSysLocal (mkBuiltinUnique 1) ty
130 -- "Template locals" typically used in unfoldings
131 mkTemplateLocals :: [Type] -> [Id]
132 mkTemplateLocals tys = zipWith mkSysLocal
133 (getBuiltinUniques (length tys))
138 %************************************************************************
140 \subsection[Id-general-funs]{General @Id@-related functions}
142 %************************************************************************
145 idFreeTyVars :: (GenId flexi) -> (GenTyVarSet flexi)
146 idFreeTyVars id = tyVarsOfType (idType id)
148 setIdType :: GenId flexi1 -> GenType flexi2 -> GenId flexi2
149 -- Add free tyvar info to the type
150 setIdType id ty = setVarType id (addFreeTyVars ty)
152 idPrimRep :: Id -> PrimRep
153 idPrimRep id = typePrimRep (idType id)
156 omitIfaceSigForId tells whether an Id's info is implied by other declarations,
157 so we don't need to put its signature in an interface file, even if it's mentioned
158 in some other interface unfolding.
161 omitIfaceSigForId :: Id -> Bool
163 | isWiredInName (idName id)
167 = case varDetails id of
168 RecordSelId _ -> True -- Includes dictionary selectors
170 -- ConstantIds are implied by their type or class decl;
171 -- remember that all type and class decls appear in the interface file.
172 -- The dfun id must *not* be omitted, because it carries version info for
175 other -> False -- Don't omit!
178 See notes with setNameVisibility (Name.lhs)
181 setIdVisibility :: Maybe Module -> Unique -> Id -> Id
182 setIdVisibility maybe_mod u id
183 = setIdName id (setNameVisibility maybe_mod u (idName id))
185 mkIdVisible :: Module -> Unique -> Id -> Id
187 = setIdName id (mkNameVisible mod u (idName id))
190 %************************************************************************
192 \subsection{Special Ids}
194 %************************************************************************
197 recordSelectorFieldLabel :: Id -> FieldLabel
198 recordSelectorFieldLabel id = case varDetails id of
199 RecordSelId lbl -> lbl
201 isRecordSelector id = case varDetails id of
202 RecordSelId lbl -> True
205 isPrimitiveId_maybe id = case varDetails id of
206 ConstantId (PrimOp op) -> Just op
209 isDataConId_maybe id = case varDetails id of
210 ConstantId (DataCon con) -> Just con
213 isConstantId id = case varDetails id of
219 %************************************************************************
221 \subsection{IdInfo stuff}
223 %************************************************************************
226 ---------------------------------
228 getIdArity :: GenId flexi -> ArityInfo
229 getIdArity id = arityInfo (idInfo id)
231 setIdArity :: GenId flexi -> ArityInfo -> GenId flexi
232 setIdArity id arity = modifyIdInfo id (arity `setArityInfo`)
234 ---------------------------------
236 getIdStrictness :: GenId flexi -> StrictnessInfo
237 getIdStrictness id = strictnessInfo (idInfo id)
239 setIdStrictness :: GenId flexi -> StrictnessInfo -> GenId flexi
240 setIdStrictness id strict_info = modifyIdInfo id (strict_info `setStrictnessInfo`)
242 isBottomingId :: GenId flexi -> Bool
243 isBottomingId id = bottomIsGuaranteed (strictnessInfo (idInfo id))
245 ---------------------------------
247 getIdUnfolding :: GenId flexi -> Unfolding
248 getIdUnfolding id = unfoldingInfo (idInfo id)
250 setIdUnfolding :: GenId flexi -> Unfolding -> GenId flexi
251 setIdUnfolding id unfolding = modifyIdInfo id (unfolding `setUnfoldingInfo`)
253 ---------------------------------
255 getIdDemandInfo :: GenId flexi -> Demand
256 getIdDemandInfo id = demandInfo (idInfo id)
258 setIdDemandInfo :: GenId flexi -> Demand -> GenId flexi
259 setIdDemandInfo id demand_info = modifyIdInfo id (demand_info `setDemandInfo`)
261 ---------------------------------
263 getIdUpdateInfo :: GenId flexi -> UpdateInfo
264 getIdUpdateInfo id = updateInfo (idInfo id)
266 setIdUpdateInfo :: GenId flexi -> UpdateInfo -> GenId flexi
267 setIdUpdateInfo id upd_info = modifyIdInfo id (upd_info `setUpdateInfo`)
269 ---------------------------------
271 getIdSpecialisation :: GenId flexi -> IdSpecEnv
272 getIdSpecialisation id = specInfo (idInfo id)
274 setIdSpecialisation :: GenId flexi -> IdSpecEnv -> GenId flexi
275 setIdSpecialisation id spec_info = modifyIdInfo id (spec_info `setSpecInfo`)
277 ---------------------------------
279 getIdCafInfo :: GenId flexi -> CafInfo
280 getIdCafInfo id = cafInfo (idInfo id)
282 setIdCafInfo :: GenId flexi -> CafInfo -> GenId flexi
283 setIdCafInfo id caf_info = modifyIdInfo id (caf_info `setCafInfo`)
287 ---------------------------------
289 The inline pragma tells us to be very keen to inline this Id, but it's still
290 OK not to if optimisation is switched off.
293 getInlinePragma :: GenId flexi -> InlinePragInfo
294 getInlinePragma id = inlinePragInfo (idInfo id)
296 setInlinePragma :: GenId flexi -> InlinePragInfo -> GenId flexi
297 setInlinePragma id prag = modifyIdInfo id (setInlinePragInfo prag)
299 modifyInlinePragma :: GenId flexi -> (InlinePragInfo -> InlinePragInfo) -> GenId flexi
300 modifyInlinePragma id fn = modifyIdInfo id (\info -> setInlinePragInfo (fn (inlinePragInfo info)) info)
302 idWantsToBeINLINEd :: GenId flexi -> Bool
303 idWantsToBeINLINEd id = case getInlinePragma id of
304 IWantToBeINLINEd -> True
305 IMustBeINLINEd -> True
308 idMustNotBeINLINEd id = case getInlinePragma id of
309 IMustNotBeINLINEd -> True
310 IAmASpecPragmaId -> True
311 IAmALoopBreaker -> True
314 idMustBeINLINEd id = case getInlinePragma id of
315 IMustBeINLINEd -> True
318 isSpecPragmaId id = case getInlinePragma id of
319 IAmASpecPragmaId -> True