specInfo, setSpecInfo,
-- CAF info
- CafInfo(..), cafInfo, setCafInfo, ppCafInfo,
+ CafInfo(..), cafInfo, setCafInfo, mayHaveCafRefs, ppCafInfo,
-- Constructed Product Result Info
CprInfo(..), cprInfo, setCprInfo, ppCprInfo, noCprInfo,
strictnessInfo :: StrictnessInfo, -- Strictness properties
workerInfo :: WorkerInfo, -- Pointer to Worker Function
unfoldingInfo :: Unfolding, -- Its unfolding
- cafInfo :: CafInfo,
+ cafInfo :: CafInfo, -- whether it refers (indirectly) to any CAFs
cprInfo :: CprInfo, -- Function always constructs a product result
lbvarInfo :: LBVarInfo, -- Info about a lambda-bound variable
inlinePragInfo :: InlinePragInfo, -- Inline pragma
\begin{code}
vanillaIdInfo :: IdInfo
-vanillaIdInfo = mkIdInfo VanillaId
+ -- Used for locally-defined Ids
+ -- We are going to calculate correct CAF information at the end
+vanillaIdInfo = mkIdInfo VanillaId NoCafRefs
constantIdInfo :: IdInfo
-constantIdInfo = mkIdInfo ConstantId
-
-mkIdInfo :: IdFlavour -> IdInfo
-mkIdInfo flv = IdInfo {
- flavourInfo = flv,
- arityInfo = UnknownArity,
- demandInfo = wwLazy,
- specInfo = emptyCoreRules,
- tyGenInfo = noTyGenInfo,
- workerInfo = NoWorker,
- strictnessInfo = NoStrictnessInfo,
- unfoldingInfo = noUnfolding,
- cafInfo = MayHaveCafRefs,
- cprInfo = NoCPRInfo,
- lbvarInfo = NoLBVarInfo,
- inlinePragInfo = NoInlinePragInfo,
- occInfo = NoOccInfo
+ -- Used for imported Ids
+ -- The default is that they *do* have CAFs; an interface-file pragma
+ -- may say "oh no it doesn't", but in the absence of such a pragma
+ -- we'd better assume it does
+constantIdInfo = mkIdInfo ConstantId MayHaveCafRefs
+
+mkIdInfo :: IdFlavour -> CafInfo -> IdInfo
+mkIdInfo flv caf
+ = IdInfo {
+ flavourInfo = flv,
+ cafInfo = caf,
+ arityInfo = UnknownArity,
+ demandInfo = wwLazy,
+ specInfo = emptyCoreRules,
+ tyGenInfo = noTyGenInfo,
+ workerInfo = NoWorker,
+ strictnessInfo = NoStrictnessInfo,
+ unfoldingInfo = noUnfolding,
+ cprInfo = NoCPRInfo,
+ lbvarInfo = NoLBVarInfo,
+ inlinePragInfo = NoInlinePragInfo,
+ occInfo = NoOccInfo
}
\end{code}
| ExportedId -- Locally defined, exported
| SpecPragmaId -- Locally defined, RHS holds specialised call
- | ConstantId -- Imported from elsewhere, or a dictionary function,
- -- default method Id.
+ | ConstantId -- Imported from elsewhere, or a default method Id.
+
+ | DictFunId -- We flag dictionary functions so that we can
+ -- conveniently extract the DictFuns from a set of
+ -- bindings when building a module's interface
| DataConId DataCon -- The Id for a data constructor *worker*
| DataConWrapId DataCon -- The Id for a data constructor *wrapper*
ppFlavourInfo ExportedId = ptext SLIT("[Exported]")
ppFlavourInfo SpecPragmaId = ptext SLIT("[SpecPrag]")
ppFlavourInfo ConstantId = ptext SLIT("[Constant]")
+ppFlavourInfo DictFunId = ptext SLIT("[DictFun]")
ppFlavourInfo (DataConId _) = ptext SLIT("[DataCon]")
ppFlavourInfo (DataConWrapId _) = ptext SLIT("[DataConWrapper]")
ppFlavourInfo (PrimOpId _) = ptext SLIT("[PrimOp]")
-- | OneCafRef Id
+mayHaveCafRefs MayHaveCafRefs = True
+mayHaveCafRefs _ = False
+
seqCaf c = c `seq` ()
ppCafInfo NoCafRefs = ptext SLIT("__C")
Also forget specialisations and unfoldings because they would need
substitution to be correct. (They get pinned back on separately.)
+Hoever, we REMEMBER loop-breaker and dead-variable information. The loop-breaker
+information is used (for example) in MkIface to avoid exposing the unfolding of
+a loop breaker.
+
\begin{code}
zapFragileInfo :: IdInfo -> Maybe IdInfo
zapFragileInfo info@(IdInfo {occInfo = occ,