[project @ 1999-04-13 08:55:33 by kglynn]
[ghc-hetmet.git] / ghc / compiler / basicTypes / Id.lhs
1 %
2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
3 %
4 \section[Id]{@Ids@: Value and constructor identifiers}
5
6 \begin{code}
7 module Id (
8         Id, DictId,
9
10         -- Simple construction
11         mkVanillaId, mkImportedId, mkSysLocal, mkUserLocal,
12         mkTemplateLocals, mkTemplateLocal, mkWildId, mkUserId,
13
14         -- Taking an Id apart
15         idName, idType, idUnique, idInfo, idDetails,
16         idPrimRep, isId,
17         recordSelectorFieldLabel,
18
19         -- Modifying an Id
20         setIdName, setIdUnique, setIdType, setIdInfo,
21
22         -- Predicates
23         omitIfaceSigForId,
24         externallyVisibleId,
25         idFreeTyVars, 
26
27         -- Inline pragma stuff
28         getInlinePragma, setInlinePragma, modifyInlinePragma, 
29         idWantsToBeINLINEd, idMustBeINLINEd, idMustNotBeINLINEd,
30         isSpecPragmaId,
31         
32
33         isRecordSelector,
34         isPrimitiveId_maybe, isDataConId_maybe,
35         isConstantId,
36         isBottomingId, idAppIsBottom,
37
38         -- IdInfo stuff
39         setIdUnfolding,
40         setIdArity,
41         setIdDemandInfo,
42         setIdStrictness,
43         setIdWorkerInfo,
44         setIdSpecialisation,
45         setIdUpdateInfo,
46         setIdCafInfo,
47         setIdCprInfo,
48
49         getIdArity,
50         getIdDemandInfo,
51         getIdStrictness,
52         getIdWorkerInfo,
53         getIdUnfolding,
54         getIdSpecialisation,
55         getIdUpdateInfo,
56         getIdCafInfo,
57         getIdCprInfo
58
59     ) where
60
61 #include "HsVersions.h"
62
63 import {-# SOURCE #-} CoreUnfold ( Unfolding )
64
65 import Var              ( Id, DictId, VarDetails(..), 
66                           isId, mkId, 
67                           idName, idType, idUnique, idInfo, idDetails,
68                           setIdName, setVarType, setIdUnique, setIdInfo, modifyIdInfo,
69                           externallyVisibleId
70                         )
71 import VarSet
72 import Type             ( Type, tyVarsOfType, typePrimRep, addFreeTyVars )
73 import IdInfo
74 import Demand           ( Demand )
75 import Name             ( Name, OccName,
76                           mkSysLocalName, mkLocalName,
77                           isWiredInName
78                         ) 
79 import Const            ( Con(..) )
80 import PrimRep          ( PrimRep )
81 import PrimOp           ( PrimOp )
82 import FieldLabel       ( FieldLabel(..) )
83 import SrcLoc           ( SrcLoc )
84 import Unique           ( Unique, mkBuiltinUnique, getBuiltinUniques )
85 import Outputable
86
87 infixl  1 `setIdUnfolding`,
88           `setIdArity`,
89           `setIdDemandInfo`,
90           `setIdStrictness`,
91           `setIdWorkerInfo`,
92           `setIdSpecialisation`,
93           `setIdUpdateInfo`,
94           `setInlinePragma`,
95           `getIdCafInfo`,
96           `getIdCprInfo`
97
98         -- infixl so you can say (id `set` a `set` b)
99 \end{code}
100
101
102
103 %************************************************************************
104 %*                                                                      *
105 \subsection{Simple Id construction}
106 %*                                                                      *
107 %************************************************************************
108
109 \begin{code}
110 mkVanillaId :: Name -> Type -> Id
111 mkVanillaId name ty = mkId name (addFreeTyVars ty) VanillaId noIdInfo
112
113 mkImportedId :: Name -> Type -> IdInfo -> Id
114 mkImportedId name ty info = mkId name (addFreeTyVars ty) VanillaId info
115
116 mkUserId :: Name -> Type -> Id
117 mkUserId name ty = mkVanillaId name ty
118
119 -- SysLocal: for an Id being created by the compiler out of thin air...
120 -- UserLocal: an Id with a name the user might recognize...
121 mkUserLocal :: OccName     -> Unique -> Type -> SrcLoc -> Id
122 mkSysLocal  :: FAST_STRING -> Unique -> Type -> Id
123
124 mkSysLocal  fs uniq ty      = mkVanillaId (mkSysLocalName uniq fs)      ty
125 mkUserLocal occ uniq ty loc = mkVanillaId (mkLocalName    uniq occ loc) ty
126 \end{code}
127
128 Make some local @Ids@ for a template @CoreExpr@.  These have bogus
129 @Uniques@, but that's OK because the templates are supposed to be
130 instantiated before use.
131
132 \begin{code}
133 -- "Wild Id" typically used when you need a binder that you don't expect to use
134 mkWildId :: Type -> Id
135 mkWildId ty = mkSysLocal SLIT("wild") (mkBuiltinUnique 1) ty
136
137 -- "Template locals" typically used in unfoldings
138 mkTemplateLocals :: [Type] -> [Id]
139 mkTemplateLocals tys = zipWith (mkSysLocal SLIT("tpl"))
140                                (getBuiltinUniques (length tys))
141                                tys
142
143 mkTemplateLocal :: Int -> Type -> Id
144 mkTemplateLocal i ty = mkSysLocal SLIT("tpl") (mkBuiltinUnique i) ty
145 \end{code}
146
147
148 %************************************************************************
149 %*                                                                      *
150 \subsection[Id-general-funs]{General @Id@-related functions}
151 %*                                                                      *
152 %************************************************************************
153
154 \begin{code}
155 idFreeTyVars :: Id -> TyVarSet
156 idFreeTyVars id = tyVarsOfType (idType id)
157
158 setIdType :: Id -> Type -> Id
159         -- Add free tyvar info to the type
160 setIdType id ty = setVarType id (addFreeTyVars ty)
161
162 idPrimRep :: Id -> PrimRep
163 idPrimRep id = typePrimRep (idType id)
164 \end{code}
165
166 omitIfaceSigForId tells whether an Id's info is implied by other declarations,
167 so we don't need to put its signature in an interface file, even if it's mentioned
168 in some other interface unfolding.
169
170 \begin{code}
171 omitIfaceSigForId :: Id -> Bool
172 omitIfaceSigForId id
173   | isWiredInName (idName id)
174   = True
175
176   | otherwise
177   = case idDetails id of
178         RecordSelId _  -> True  -- Includes dictionary selectors
179         ConstantId _   -> True
180                 -- ConstantIds are implied by their type or class decl;
181                 -- remember that all type and class decls appear in the interface file.
182                 -- The dfun id must *not* be omitted, because it carries version info for
183                 -- the instance decl
184
185         other          -> False -- Don't omit!
186 \end{code}
187
188 %************************************************************************
189 %*                                                                      *
190 \subsection{Special Ids}
191 %*                                                                      *
192 %************************************************************************
193
194 \begin{code}
195 recordSelectorFieldLabel :: Id -> FieldLabel
196 recordSelectorFieldLabel id = case idDetails id of
197                                 RecordSelId lbl -> lbl
198
199 isRecordSelector id = case idDetails id of
200                         RecordSelId lbl -> True
201                         other           -> False
202
203 isPrimitiveId_maybe id = case idDetails id of
204                             ConstantId (PrimOp op) -> Just op
205                             other                  -> Nothing
206
207 isDataConId_maybe id = case idDetails id of
208                           ConstantId (DataCon con) -> Just con
209                           other                    -> Nothing
210
211 isConstantId id = case idDetails id of
212                     ConstantId _ -> True
213                     other        -> False
214 \end{code}
215
216
217 %************************************************************************
218 %*                                                                      *
219 \subsection{IdInfo stuff}
220 %*                                                                      *
221 %************************************************************************
222
223 \begin{code}
224         ---------------------------------
225         -- ARITY
226 getIdArity :: Id -> ArityInfo
227 getIdArity id = arityInfo (idInfo id)
228
229 setIdArity :: Id -> ArityInfo -> Id
230 setIdArity id arity = modifyIdInfo id (arity `setArityInfo`)
231
232         ---------------------------------
233         -- STRICTNESS
234 getIdStrictness :: Id -> StrictnessInfo
235 getIdStrictness id = strictnessInfo (idInfo id)
236
237 setIdStrictness :: Id -> StrictnessInfo -> Id
238 setIdStrictness id strict_info = modifyIdInfo id (strict_info `setStrictnessInfo`)
239
240 -- isBottomingId returns true if an application to n args would diverge
241 isBottomingId :: Id -> Bool
242 isBottomingId id = isBottomingStrictness (strictnessInfo (idInfo id))
243
244 idAppIsBottom :: Id -> Int -> Bool
245 idAppIsBottom id n = appIsBottom (strictnessInfo (idInfo id)) n
246
247         ---------------------------------
248         -- WORKER ID
249 getIdWorkerInfo :: Id -> WorkerInfo
250 getIdWorkerInfo id = workerInfo (idInfo id)
251
252 setIdWorkerInfo :: Id -> WorkerInfo -> Id
253 setIdWorkerInfo id work_info = modifyIdInfo id (work_info `setWorkerInfo`)
254
255         ---------------------------------
256         -- UNFOLDING
257 getIdUnfolding :: Id -> Unfolding
258 getIdUnfolding id = unfoldingInfo (idInfo id)
259
260 setIdUnfolding :: Id -> Unfolding -> Id
261 setIdUnfolding id unfolding = modifyIdInfo id (unfolding `setUnfoldingInfo`)
262
263         ---------------------------------
264         -- DEMAND
265 getIdDemandInfo :: Id -> Demand
266 getIdDemandInfo id = demandInfo (idInfo id)
267
268 setIdDemandInfo :: Id -> Demand -> Id
269 setIdDemandInfo id demand_info = modifyIdInfo id (demand_info `setDemandInfo`)
270
271         ---------------------------------
272         -- UPDATE INFO
273 getIdUpdateInfo :: Id -> UpdateInfo
274 getIdUpdateInfo id = updateInfo (idInfo id)
275
276 setIdUpdateInfo :: Id -> UpdateInfo -> Id
277 setIdUpdateInfo id upd_info = modifyIdInfo id (upd_info `setUpdateInfo`)
278
279         ---------------------------------
280         -- SPECIALISATION
281 getIdSpecialisation :: Id -> IdSpecEnv
282 getIdSpecialisation id = specInfo (idInfo id)
283
284 setIdSpecialisation :: Id -> IdSpecEnv -> Id
285 setIdSpecialisation id spec_info = modifyIdInfo id (spec_info `setSpecInfo`)
286
287         ---------------------------------
288         -- CAF INFO
289 getIdCafInfo :: Id -> CafInfo
290 getIdCafInfo id = cafInfo (idInfo id)
291
292 setIdCafInfo :: Id -> CafInfo -> Id
293 setIdCafInfo id caf_info = modifyIdInfo id (caf_info `setCafInfo`)
294
295         ---------------------------------
296         -- CPR INFO
297 getIdCprInfo :: Id -> CprInfo
298 getIdCprInfo id = cprInfo (idInfo id)
299
300 setIdCprInfo :: Id -> CprInfo -> Id
301 setIdCprInfo id cpr_info = modifyIdInfo id (cpr_info `setCprInfo`)
302
303 \end{code}
304
305
306         ---------------------------------
307         -- INLINING
308 The inline pragma tells us to be very keen to inline this Id, but it's still
309 OK not to if optimisation is switched off.
310
311 \begin{code}
312 getInlinePragma :: Id -> InlinePragInfo
313 getInlinePragma id = inlinePragInfo (idInfo id)
314
315 setInlinePragma :: Id -> InlinePragInfo -> Id
316 setInlinePragma id prag = modifyIdInfo id (setInlinePragInfo prag)
317
318 modifyInlinePragma :: Id -> (InlinePragInfo -> InlinePragInfo) -> Id
319 modifyInlinePragma id fn = modifyIdInfo id (\info -> setInlinePragInfo (fn (inlinePragInfo info)) info)
320
321 idWantsToBeINLINEd :: Id -> Bool
322 idWantsToBeINLINEd id = case getInlinePragma id of
323                           IWantToBeINLINEd -> True
324                           IMustBeINLINEd   -> True
325                           other            -> False
326
327 idMustNotBeINLINEd id = case getInlinePragma id of
328                           IMustNotBeINLINEd -> True
329                           IAmASpecPragmaId  -> True
330                           IAmALoopBreaker   -> True
331                           other             -> False
332
333 idMustBeINLINEd id =  case getInlinePragma id of
334                         IMustBeINLINEd -> True
335                         other          -> False
336
337 isSpecPragmaId id = case getInlinePragma id of
338                         IAmASpecPragmaId -> True
339                         other            -> False
340 \end{code}