\begin{code}
module MkId (
- mkSpecPragmaId, mkWorkerId,
-
mkDictFunId, mkDefaultMethodId,
mkDictSelId,
import Class ( Class, classTyCon, classTyVars, classSelIds )
import Var ( Id, TyVar )
import VarSet ( isEmptyVarSet )
-import Name ( mkWiredInName, mkLocalName,
- mkWorkerOcc, mkCCallName,
- Name, NamedThing(..), getSrcLoc
- )
+import Name ( mkWiredInName, mkCCallName, Name )
import OccName ( mkVarOcc )
import PrimOp ( PrimOp(DataToTagOp, CCallOp),
primOpSig, mkPrimOpIdName,
dataConSig, dataConStrictMarks, dataConId,
maybeMarkedUnboxed, splitProductType_maybe
)
-import Id ( idType, mkId,
- mkVanillaId, mkTemplateLocals, mkTemplateLocalsNum,
+import Id ( idType, mkGlobalId, mkVanillaGlobal,
+ mkTemplateLocals, mkTemplateLocalsNum,
mkTemplateLocal, idCprInfo
)
-import IdInfo ( IdInfo, constantIdInfo, mkIdInfo,
+import IdInfo ( IdInfo, vanillaIdInfo, noTyGenIdInfo, noCafOrTyGenIdInfo,
exactArity, setUnfoldingInfo, setCafInfo, setCprInfo,
- setArityInfo, setSpecInfo, setTyGenInfo,
+ setArityInfo, setSpecInfo,
mkStrictnessInfo, setStrictnessInfo,
- IdFlavour(..), CafInfo(..), CprInfo(..), TyGenInfo(..)
+ GlobalIdDetails(..), CafInfo(..), CprInfo(..)
)
import FieldLabel ( mkFieldLabel, fieldLabelName,
firstFieldLabelTag, allFieldLabelTags, fieldLabelType
import Char ( ord )
\end{code}
-
%************************************************************************
%* *
\subsection{Wired in Ids}
%************************************************************************
%* *
-\subsection{Easy ones}
-%* *
-%************************************************************************
-
-\begin{code}
-mkSpecPragmaId occ uniq ty loc
- = mkId (mkLocalName uniq occ loc) ty (mkIdInfo SpecPragmaId NoCafRefs)
- -- Maybe a SysLocal? But then we'd lose the location
-
-mkDefaultMethodId dm_name rec_c ty
- = mkId dm_name ty info
- where
- info = constantIdInfo `setTyGenInfo` TyGenNever
- -- type is wired-in (see comment at TcClassDcl.tcClassSig), so
- -- do not generalise it
-
-mkWorkerId :: Unique -> Id -> Type -> Id
--- A worker gets a local name. CoreTidy will globalise it if necessary.
-mkWorkerId uniq unwrkr ty
- = mkVanillaId wkr_name ty
- where
- wkr_name = mkLocalName uniq (mkWorkerOcc (getOccName unwrkr)) (getSrcLoc unwrkr)
-\end{code}
-
-%************************************************************************
-%* *
\subsection{Data constructors}
%* *
%************************************************************************
-- Makes the *worker* for the data constructor; that is, the function
-- that takes the reprsentation arguments and builds the constructor.
mkDataConId work_name data_con
- = mkId work_name (dataConRepType data_con) info
+ = mkGlobalId (DataConId data_con) work_name (dataConRepType data_con) info
where
- info = mkIdInfo (DataConId data_con) NoCafRefs
+ info = noCafOrTyGenIdInfo
`setArityInfo` exactArity arity
`setStrictnessInfo` strict_info
`setCprInfo` cpr_info
mkDataConWrapId data_con
= wrap_id
where
- wrap_id = mkId (dataConName data_con) wrap_ty info
+ wrap_id = mkGlobalId (DataConWrapId data_con) (dataConName data_con) wrap_ty info
work_id = dataConId data_con
- info = mkIdInfo (DataConWrapId data_con) NoCafRefs
+ info = noCafOrTyGenIdInfo
`setUnfoldingInfo` mkTopUnfolding (mkInlineMe wrap_rhs)
`setCprInfo` cpr_info
-- The Cpr info can be important inside INLINE rhss, where the
`setArityInfo` exactArity arity
-- It's important to specify the arity, so that partial
-- applications are treated as values
- `setTyGenInfo` TyGenNever
- -- No point generalising its type, since it gets eagerly inlined
- -- away anyway
wrap_ty = mkForAllTys all_tyvars $
mkFunTys all_arg_tys
-- we can't conjure it up out of thin air
= sel_id
where
- sel_id = mkId (fieldLabelName field_label) selector_ty info
-
+ sel_id = mkGlobalId (RecordSelId field_label) (fieldLabelName field_label) selector_ty info
field_ty = fieldLabelType field_label
data_cons = tyConDataCons tycon
tyvars = tyConTyVars tycon -- These scope over the types in
mkFunTy data_ty field_tau
arity = 1 + n_dict_tys + n_field_dict_tys
- info = mkIdInfo (RecordSelId field_label) caf_info
+ info = noTyGenIdInfo
+ `setCafInfo` caf_info
`setArityInfo` exactArity arity
`setUnfoldingInfo` unfolding
- `setTyGenInfo` TyGenNever
-- ToDo: consider adding further IdInfo
unfolding = mkTopUnfolding sel_rhs
= sel_id
where
ty = exprType rhs
- sel_id = mkId name ty info
+ sel_id = mkGlobalId (RecordSelId field_lbl) name ty info
field_lbl = mkFieldLabel name tycon ty tag
tag = assoc "MkId.mkDictSelId" (classSelIds clas `zip` allFieldLabelTags) sel_id
- info = mkIdInfo (RecordSelId field_lbl) NoCafRefs
+ info = noCafOrTyGenIdInfo
`setArityInfo` exactArity 1
`setUnfoldingInfo` unfolding
- `setTyGenInfo` TyGenNever
-- We no longer use 'must-inline' on record selectors. They'll
-- inline like crazy if they scrutinise a constructor
(tyvars,arg_tys,res_ty, arity, strict_info) = primOpSig prim_op
ty = mkForAllTys tyvars (mkFunTys arg_tys res_ty)
name = mkPrimOpIdName prim_op
- id = mkId name ty info
+ id = mkGlobalId (PrimOpId prim_op) name ty info
- info = mkIdInfo (PrimOpId prim_op) NoCafRefs
+ info = noCafOrTyGenIdInfo
`setSpecInfo` rules
`setArityInfo` exactArity arity
`setStrictnessInfo` strict_info
= ASSERT( isEmptyVarSet (tyVarsOfType ty) )
-- A CCallOpId should have no free type variables;
-- when doing substitutions won't substitute over it
- mkId name ty info
+ mkGlobalId (PrimOpId prim_op) name ty info
where
occ_str = showSDocIface (braces (pprCCallOp ccall <+> ppr ty))
-- The "occurrence name" of a ccall is the full info about the
name = mkCCallName uniq occ_str
prim_op = CCallOp ccall
- info = mkIdInfo (PrimOpId prim_op) NoCafRefs
+ info = noCafOrTyGenIdInfo
`setArityInfo` exactArity arity
`setStrictnessInfo` strict_info
%************************************************************************
%* *
-\subsection{DictFuns}
+\subsection{DictFuns and default methods}
%* *
%************************************************************************
\begin{code}
+mkDefaultMethodId dm_name ty
+ = mkVanillaGlobal dm_name ty noTyGenIdInfo
+
mkDictFunId :: Name -- Name to use for the dict fun;
-> Class
-> [TyVar]
-> Id
mkDictFunId dfun_name clas inst_tyvars inst_tys dfun_theta
- = mkId dfun_name dfun_ty info
+ = mkVanillaGlobal dfun_name dfun_ty noTyGenIdInfo
where
dfun_ty = mkSigmaTy inst_tyvars dfun_theta (mkDictTy clas inst_tys)
- info = mkIdInfo DictFunId MayHaveCafRefs
- `setTyGenInfo` TyGenNever
- -- type is wired-in (see comment at TcClassDcl.tcClassSig), so
- -- do not generalise it
- -- An imported dfun may refer to CAFs, so we assume the worst
+ info = noTyGenIdInfo
+ -- Type is wired-in (see comment at TcClassDcl.tcClassSig),
+ -- so do not generalise it
{- 1 dec 99: disable the Mark Jones optimisation for the sake
of compatibility with Hugs.
unsafeCoerceId
= pcMiscPrelId unsafeCoerceIdKey pREL_GHC SLIT("unsafeCoerce#") ty info
where
- info = constantIdInfo `setUnfoldingInfo` mkCompulsoryUnfolding rhs
+ info = noCafOrTyGenIdInfo `setUnfoldingInfo` mkCompulsoryUnfolding rhs
ty = mkForAllTys [openAlphaTyVar,openBetaTyVar]
getTagId
= pcMiscPrelId getTagIdKey pREL_GHC SLIT("getTag#") ty info
where
- info = constantIdInfo
- `setUnfoldingInfo` mkCompulsoryUnfolding rhs
+ info = noCafOrTyGenIdInfo `setUnfoldingInfo` mkCompulsoryUnfolding rhs
-- We don't provide a defn for this; you must inline it
ty = mkForAllTys [alphaTyVar] (mkFunTy alphaTy intPrimTy)
realWorldPrimId -- :: State# RealWorld
= pcMiscPrelId realWorldPrimIdKey pREL_GHC SLIT("realWorld#")
realWorldStatePrimTy
- (noCafIdInfo `setUnfoldingInfo` mkOtherCon [])
+ (noCafOrTyGenIdInfo `setUnfoldingInfo` mkOtherCon [])
-- The mkOtherCon makes it look that realWorld# is evaluated
-- which in turn makes Simplify.interestingArg return True,
-- which in turn makes INLINE things applied to realWorld# likely
pAR_ERROR_ID
= pcMiscPrelId parErrorIdKey pREL_ERR SLIT("parError")
- (mkSigmaTy [openAlphaTyVar] [] openAlphaTy) noCafIdInfo
-
+ (mkSigmaTy [openAlphaTyVar] [] openAlphaTy) noCafOrTyGenIdInfo
\end{code}
pcMiscPrelId key mod str ty info
= let
name = mkWiredInName mod (mkVarOcc str) key
- imp = mkId name ty info -- the usual case...
+ imp = mkVanillaGlobal name ty info -- the usual case...
in
imp
-- We lie and say the thing is imported; otherwise, we get into
pc_bottoming_Id key mod name ty
= pcMiscPrelId key mod name ty bottoming_info
where
- bottoming_info = noCafIdInfo
+ bottoming_info = noCafOrTyGenIdInfo
`setStrictnessInfo` mkStrictnessInfo ([wwStrict], True)
-- these "bottom" out, no matter what their arguments
generic_ERROR_ID u n = pc_bottoming_Id u pREL_ERR n errorTy
--- Very useful...
-noCafIdInfo = constantIdInfo `setCafInfo` NoCafRefs
-
(openAlphaTyVar:openBetaTyVar:_) = openAlphaTyVars
openAlphaTy = mkTyVarTy openAlphaTyVar
openBetaTy = mkTyVarTy openBetaTyVar