SRT(..),
-- utils
- stgArgHasCafRefs,
+ stgBindHasCafRefs, stgArgHasCafRefs, stgRhsArity,
isDllConApp, isStgTypeArg,
stgArgType,
import CostCentre ( CostCentreStack, CostCentre )
import VarSet ( IdSet, isEmptyVarSet )
import Var ( isId )
-import Id ( Id, idName, idPrimRep, idType, idCafInfo )
+import Id ( Id, idName, idType, idCafInfo )
import IdInfo ( mayHaveCafRefs )
-import Name ( isDllName )
-import Literal ( Literal, literalType, literalPrimRep )
+import Packages ( isDllName )
+import Literal ( Literal, literalType )
import ForeignCall ( ForeignCall )
import DataCon ( DataCon, dataConName )
import CoreSyn ( AltCon )
import UniqSet ( isEmptyUniqSet, uniqSetToList, UniqSet )
import Unique ( Unique )
import Bitmap
-import CmdLineOpts ( opt_SccProfilingOn )
+import DynFlags ( DynFlags )
+import StaticFlags ( opt_SccProfilingOn )
\end{code}
%************************************************************************
isStgTypeArg (StgTypeArg _) = True
isStgTypeArg other = False
-isDllArg :: StgArg -> Bool
+isDllArg :: DynFlags -> StgArg -> Bool
-- Does this argument refer to something in a different DLL?
-isDllArg (StgTypeArg v) = False
-isDllArg (StgVarArg v) = isDllName (idName v)
-isDllArg (StgLitArg lit) = False
+isDllArg dflags (StgTypeArg v) = False
+isDllArg dflags (StgVarArg v) = isDllName dflags (idName v)
+isDllArg dflags (StgLitArg lit) = False
-isDllConApp :: DataCon -> [StgArg] -> Bool
+isDllConApp :: DynFlags -> DataCon -> [StgArg] -> Bool
-- Does this constructor application refer to
-- anything in a different DLL?
-- If so, we can't allocate it statically
-isDllConApp con args = isDllName (dataConName con) || any isDllArg args
+isDllConApp dflags con args
+ = isDllName dflags (dataConName con) || any (isDllArg dflags) args
stgArgType :: StgArg -> Type
-- Very half baked becase we have lost the type arguments
| StgLetNoEscape -- remember: ``advanced stuff''
(GenStgLiveVars occ) -- Live in the whole let-expression
-- Mustn't overwrite these stack slots
- -- *Doesn't* include binders of the let(rec).
+ -- *Doesn't* include binders of the let(rec).
(GenStgLiveVars occ) -- Live in the right hand sides (only)
-- These are the ones which must be saved on
-- the stack if they aren't there already
- -- *Does* include binders of the let(rec) if recursive.
+ -- *Does* include binders of the let(rec) if recursive.
(GenStgBinding bndr occ) -- right hand sides (see below)
(GenStgExpr bndr occ) -- body
\end{code}
\begin{code}
+stgRhsArity :: StgRhs -> Int
+stgRhsArity (StgRhsClosure _ _ _ _ _ bndrs _) = count isId bndrs
+ -- The arity never includes type parameters, so
+ -- when keeping type arguments and binders in the Stg syntax
+ -- (opt_RuntimeTypes) we have to fliter out the type binders.
+stgRhsArity (StgRhsCon _ _ _) = 0
+\end{code}
+
+\begin{code}
+stgBindHasCafRefs :: GenStgBinding bndr Id -> Bool
+stgBindHasCafRefs (StgNonRec _ rhs) = rhsHasCafRefs rhs
+stgBindHasCafRefs (StgRec binds) = any rhsHasCafRefs (map snd binds)
+
rhsHasCafRefs (StgRhsClosure _ _ _ upd srt _ _)
= isUpdatable upd || nonEmptySRT srt
rhsHasCafRefs (StgRhsCon _ _ args)