[project @ 1999-01-27 14:51:14 by simonpj]
[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, 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         setIdSpecialisation,
44         setIdUpdateInfo,
45         setIdCafInfo,
46
47         getIdArity,
48         getIdDemandInfo,
49         getIdStrictness,
50         getIdUnfolding,
51         getIdSpecialisation,
52         getIdUpdateInfo,
53         getIdCafInfo
54
55     ) where
56
57 #include "HsVersions.h"
58
59 import {-# SOURCE #-} CoreUnfold ( Unfolding )
60
61 import Var              ( Id, DictId, VarDetails(..), 
62                           isId, mkId, 
63                           idName, idType, idUnique, idInfo, idDetails,
64                           setIdName, setVarType, setIdUnique, setIdInfo, modifyIdInfo,
65                           externallyVisibleId
66                         )
67 import VarSet
68 import Type             ( Type, tyVarsOfType, typePrimRep, addFreeTyVars )
69 import IdInfo
70 import Demand           ( Demand )
71 import Name             ( Name, OccName, Module,
72                           mkSysLocalName, mkLocalName,
73                           isWiredInName
74                         ) 
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 )
81 import Outputable
82
83 infixl  1 `setIdUnfolding`,
84           `setIdArity`,
85           `setIdDemandInfo`,
86           `setIdStrictness`,
87           `setIdSpecialisation`,
88           `setIdUpdateInfo`,
89           `setInlinePragma`
90         -- infixl so you can say (id `set` a `set` b)
91 \end{code}
92
93
94
95 %************************************************************************
96 %*                                                                      *
97 \subsection{Simple Id construction}
98 %*                                                                      *
99 %************************************************************************
100
101 \begin{code}
102 mkVanillaId :: Name -> Type -> Id
103 mkVanillaId name ty = mkId name (addFreeTyVars ty) VanillaId noIdInfo
104
105 mkImportedId :: Name -> Type -> IdInfo -> Id
106 mkImportedId name ty info = mkId name (addFreeTyVars ty) VanillaId info
107
108 mkUserId :: Name -> Type -> Id
109 mkUserId name ty = mkVanillaId name ty
110
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
115
116 mkSysLocal  fs uniq ty      = mkVanillaId (mkSysLocalName uniq fs)      ty
117 mkUserLocal occ uniq ty loc = mkVanillaId (mkLocalName    uniq occ loc) ty
118 \end{code}
119
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.
123
124 \begin{code}
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
128
129 -- "Template locals" typically used in unfoldings
130 mkTemplateLocals :: [Type] -> [Id]
131 mkTemplateLocals tys = zipWith (mkSysLocal SLIT("tpl"))
132                                (getBuiltinUniques (length tys))
133                                tys
134 \end{code}
135
136
137 %************************************************************************
138 %*                                                                      *
139 \subsection[Id-general-funs]{General @Id@-related functions}
140 %*                                                                      *
141 %************************************************************************
142
143 \begin{code}
144 idFreeTyVars :: Id -> TyVarSet
145 idFreeTyVars id = tyVarsOfType (idType id)
146
147 setIdType :: Id -> Type -> Id
148         -- Add free tyvar info to the type
149 setIdType id ty = setVarType id (addFreeTyVars ty)
150
151 idPrimRep :: Id -> PrimRep
152 idPrimRep id = typePrimRep (idType id)
153 \end{code}
154
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.
158
159 \begin{code}
160 omitIfaceSigForId :: Id -> Bool
161 omitIfaceSigForId id
162   | isWiredInName (idName id)
163   = True
164
165   | otherwise
166   = case idDetails id of
167         RecordSelId _  -> True  -- Includes dictionary selectors
168         ConstantId _   -> True
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
172                 -- the instance decl
173
174         other          -> False -- Don't omit!
175 \end{code}
176
177 %************************************************************************
178 %*                                                                      *
179 \subsection{Special Ids}
180 %*                                                                      *
181 %************************************************************************
182
183 \begin{code}
184 recordSelectorFieldLabel :: Id -> FieldLabel
185 recordSelectorFieldLabel id = case idDetails id of
186                                 RecordSelId lbl -> lbl
187
188 isRecordSelector id = case idDetails id of
189                         RecordSelId lbl -> True
190                         other           -> False
191
192 isPrimitiveId_maybe id = case idDetails id of
193                             ConstantId (PrimOp op) -> Just op
194                             other                  -> Nothing
195
196 isDataConId_maybe id = case idDetails id of
197                           ConstantId (DataCon con) -> Just con
198                           other                    -> Nothing
199
200 isConstantId id = case idDetails id of
201                     ConstantId _ -> True
202                     other        -> False
203 \end{code}
204
205
206 %************************************************************************
207 %*                                                                      *
208 \subsection{IdInfo stuff}
209 %*                                                                      *
210 %************************************************************************
211
212 \begin{code}
213         ---------------------------------
214         -- ARITY
215 getIdArity :: Id -> ArityInfo
216 getIdArity id = arityInfo (idInfo id)
217
218 setIdArity :: Id -> ArityInfo -> Id
219 setIdArity id arity = modifyIdInfo id (arity `setArityInfo`)
220
221         ---------------------------------
222         -- STRICTNESS
223 getIdStrictness :: Id -> StrictnessInfo
224 getIdStrictness id = strictnessInfo (idInfo id)
225
226 setIdStrictness :: Id -> StrictnessInfo -> Id
227 setIdStrictness id strict_info = modifyIdInfo id (strict_info `setStrictnessInfo`)
228
229 -- isBottomingId returns true if an application to n args would diverge
230 isBottomingId :: Id -> Bool
231 isBottomingId id = isBottomingStrictness (strictnessInfo (idInfo id))
232
233 idAppIsBottom :: Id -> Int -> Bool
234 idAppIsBottom id n = appIsBottom (strictnessInfo (idInfo id)) n
235
236         ---------------------------------
237         -- UNFOLDING
238 getIdUnfolding :: Id -> Unfolding
239 getIdUnfolding id = unfoldingInfo (idInfo id)
240
241 setIdUnfolding :: Id -> Unfolding -> Id
242 setIdUnfolding id unfolding = modifyIdInfo id (unfolding `setUnfoldingInfo`)
243
244         ---------------------------------
245         -- DEMAND
246 getIdDemandInfo :: Id -> Demand
247 getIdDemandInfo id = demandInfo (idInfo id)
248
249 setIdDemandInfo :: Id -> Demand -> Id
250 setIdDemandInfo id demand_info = modifyIdInfo id (demand_info `setDemandInfo`)
251
252         ---------------------------------
253         -- UPDATE INFO
254 getIdUpdateInfo :: Id -> UpdateInfo
255 getIdUpdateInfo id = updateInfo (idInfo id)
256
257 setIdUpdateInfo :: Id -> UpdateInfo -> Id
258 setIdUpdateInfo id upd_info = modifyIdInfo id (upd_info `setUpdateInfo`)
259
260         ---------------------------------
261         -- SPECIALISATION
262 getIdSpecialisation :: Id -> IdSpecEnv
263 getIdSpecialisation id = specInfo (idInfo id)
264
265 setIdSpecialisation :: Id -> IdSpecEnv -> Id
266 setIdSpecialisation id spec_info = modifyIdInfo id (spec_info `setSpecInfo`)
267
268         ---------------------------------
269         -- CAF INFO
270 getIdCafInfo :: Id -> CafInfo
271 getIdCafInfo id = cafInfo (idInfo id)
272
273 setIdCafInfo :: Id -> CafInfo -> Id
274 setIdCafInfo id caf_info = modifyIdInfo id (caf_info `setCafInfo`)
275 \end{code}
276
277
278         ---------------------------------
279         -- INLINING
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.
282
283 \begin{code}
284 getInlinePragma :: Id -> InlinePragInfo
285 getInlinePragma id = inlinePragInfo (idInfo id)
286
287 setInlinePragma :: Id -> InlinePragInfo -> Id
288 setInlinePragma id prag = modifyIdInfo id (setInlinePragInfo prag)
289
290 modifyInlinePragma :: Id -> (InlinePragInfo -> InlinePragInfo) -> Id
291 modifyInlinePragma id fn = modifyIdInfo id (\info -> setInlinePragInfo (fn (inlinePragInfo info)) info)
292
293 idWantsToBeINLINEd :: Id -> Bool
294 idWantsToBeINLINEd id = case getInlinePragma id of
295                           IWantToBeINLINEd -> True
296                           IMustBeINLINEd   -> True
297                           other            -> False
298
299 idMustNotBeINLINEd id = case getInlinePragma id of
300                           IMustNotBeINLINEd -> True
301                           IAmASpecPragmaId  -> True
302                           IAmALoopBreaker   -> True
303                           other             -> False
304
305 idMustBeINLINEd id =  case getInlinePragma id of
306                         IMustBeINLINEd -> True
307                         other          -> False
308
309 isSpecPragmaId id = case getInlinePragma id of
310                         IAmASpecPragmaId -> True
311                         other            -> False
312 \end{code}