[project @ 2001-02-07 16:12:47 by simonmar]
[ghc-hetmet.git] / ghc / compiler / basicTypes / IdInfo.lhs
index a8f16ae..76cb1f9 100644 (file)
@@ -60,7 +60,7 @@ module IdInfo (
        specInfo, setSpecInfo,
 
        -- CAF info
-       CafInfo(..), cafInfo, setCafInfo, ppCafInfo,
+       CafInfo(..), cafInfo, setCafInfo, mayHaveCafRefs, ppCafInfo,
 
         -- Constructed Product Result Info
         CprInfo(..), cprInfo, setCprInfo, ppCprInfo, noCprInfo,
@@ -131,7 +131,7 @@ data IdInfo
        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
@@ -208,26 +208,33 @@ zapSpecPragInfo   info = case flavourInfo info of
 
 \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}
 
@@ -244,8 +251,11 @@ data IdFlavour
   | 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*
@@ -262,6 +272,7 @@ ppFlavourInfo VanillaId         = empty
 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]")
@@ -514,6 +525,9 @@ data CafInfo
 --      | OneCafRef Id
 
 
+mayHaveCafRefs MayHaveCafRefs = True
+mayHaveCafRefs _             = False
+
 seqCaf c = c `seq` ()
 
 ppCafInfo NoCafRefs = ptext SLIT("__C")
@@ -640,6 +654,10 @@ isn't necessarily correct in the transformed program.
 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,