[project @ 2006-01-06 16:30:17 by simonmar]
[ghc-hetmet.git] / ghc / compiler / profiling / CostCentre.lhs
index 5efe37a..f4a6ba9 100644 (file)
@@ -13,16 +13,18 @@ module CostCentre (
        noCCS, subsumedCCS, currentCCS, overheadCCS, dontCareCCS,
        noCostCentre, noCCAttached,
        noCCSAttached, isCurrentCCS,  isSubsumedCCS, currentOrSubsumedCCS,
-       isDerivedFromCurrentCCS,
+       isDerivedFromCurrentCCS, maybeSingletonCCS,
+       decomposeCCS,
 
        mkUserCC, mkAutoCC, mkAllCafsCC, 
        mkSingletonCCS, dupifyCC, pushCCOnCCS,
-       isCafCCS,
+       isCafCCS, isCafCC,
        isSccCountCostCentre,
        sccAbleCostCentre,
        ccFromThisModule,
 
-       pprCostCentreDecl, pprCostCentreStackDecl, pprCostCentreCore,
+       pprCostCentreCore,
+       costCentreUserName,
 
        cmpCostCentre   -- used for removing dups in a list
     ) where
@@ -30,14 +32,9 @@ module CostCentre (
 #include "HsVersions.h"
 
 import Var             ( Id )
-import Name            ( UserFS, EncodedFS, encodeFS, decode,
-                         getOccName, occNameFS
-                       )
-import Module          ( Module, ModuleName, moduleName,
-                         moduleNameUserString
-                       )
+import Name            ( getOccName, occNameFS )
+import Module          ( Module )
 import Outputable      
-import CStrings                ( pprStringInCStyle )
 import FastTypes
 import FastString
 import Util            ( thenCmp )
@@ -112,16 +109,16 @@ data CostCentre
 
   | NormalCC {  
                cc_name :: CcName,      -- Name of the cost centre itself
-               cc_mod  :: ModuleName,  -- Name of module defining this CC.
+               cc_mod  :: Module,      -- Name of module defining this CC.
                cc_is_dupd :: IsDupdCC, -- see below
                cc_is_caf  :: IsCafCC   -- see below
     }
 
   | AllCafsCC {        
-               cc_mod  :: ModuleName   -- Name of module defining this CC.
+               cc_mod  :: Module       -- Name of module defining this CC.
     }
 
-type CcName = EncodedFS
+type CcName = FastString
 
 data IsDupdCC
   = OriginalCC -- This says how the CC is *used*.  Saying that
@@ -193,24 +190,27 @@ isDerivedFromCurrentCCS _         = False
 currentOrSubsumedCCS SubsumedCCS       = True
 currentOrSubsumedCCS CurrentCCS                = True
 currentOrSubsumedCCS _                 = False
+
+maybeSingletonCCS (PushCC cc NoCCS)    = Just cc
+maybeSingletonCCS _                    = Nothing
 \end{code}
 
 Building cost centres
 
 \begin{code}
-mkUserCC :: UserFS -> Module -> CostCentre
+mkUserCC :: FastString -> Module -> CostCentre
 mkUserCC cc_name mod
-  = NormalCC { cc_name = encodeFS cc_name, cc_mod =  moduleName mod,
+  = NormalCC { cc_name = cc_name, cc_mod =  mod,
               cc_is_dupd = OriginalCC, cc_is_caf = NotCafCC {-might be changed-}
     }
 
 mkAutoCC :: Id -> Module -> IsCafCC -> CostCentre
 mkAutoCC id mod is_caf
-  = NormalCC { cc_name = occNameFS (getOccName id), cc_mod =  moduleName mod,
+  = NormalCC { cc_name = occNameFS (getOccName id), cc_mod =  mod,
               cc_is_dupd = OriginalCC, cc_is_caf = is_caf
     }
 
-mkAllCafsCC m = AllCafsCC  { cc_mod = moduleName m }
+mkAllCafsCC m = AllCafsCC  { cc_mod = m }
 
 
 
@@ -222,10 +222,7 @@ pushCCOnCCS = PushCC
 
 dupifyCC cc = cc {cc_is_dupd = DupdCC}
 
-isEmptyCC, isCafCC, isDupdCC :: CostCentre -> Bool
-
-isEmptyCC (NoCostCentre)               = True
-isEmptyCC _                            = False
+isCafCC, isDupdCC :: CostCentre -> Bool
 
 isCafCC (AllCafsCC {})                  = True
 isCafCC (NormalCC {cc_is_caf = CafCC}) = True
@@ -254,7 +251,7 @@ sccAbleCostCentre cc | isCafCC cc = False
                     | otherwise  = True
 
 ccFromThisModule :: CostCentre -> Module -> Bool
-ccFromThisModule cc m = cc_mod cc == moduleName m
+ccFromThisModule cc m = cc_mod cc == m
 \end{code}
 
 \begin{code}
@@ -288,6 +285,11 @@ cmp_caf NotCafCC CafCC     = LT
 cmp_caf NotCafCC NotCafCC  = EQ
 cmp_caf CafCC    CafCC     = EQ
 cmp_caf CafCC    NotCafCC  = GT
+
+decomposeCCS :: CostCentreStack -> ([CostCentre],CostCentreStack)
+decomposeCCS (PushCC cc ccs) = (cc:more, ccs') 
+  where (more,ccs') = decomposeCCS ccs
+decomposeCCS ccs = ([],ccs)
 \end{code}
 
 -----------------------------------------------------------------------------
@@ -310,20 +312,8 @@ instance Outputable CostCentreStack where
   ppr SubsumedCCS      = ptext SLIT("CCS_SUBSUMED")
   ppr (PushCC cc NoCCS) = ppr cc <> ptext SLIT("_ccs")
   ppr (PushCC cc ccs)   = ptext SLIT("PushCostCentre") <> 
-                          parens (ppr ccs <> comma <> ppr cc)
-
--- print the static declaration for a singleton CCS.
-pprCostCentreStackDecl :: CostCentreStack -> SDoc
-pprCostCentreStackDecl ccs@(PushCC cc NoCCS)
-  = hcat [ ptext SLIT("CCS_DECLARE"), char '(',
-          ppr ccs,             comma,  -- better be codeStyle
-          ppCostCentreLbl cc,  comma,
-          empty,       -- Now always externally visible
-          text ");"
-        ]
-
-pprCostCentreStackDecl ccs 
-  = pprPanic "pprCostCentreStackDecl: " (ppr ccs)
+                          parens (ppr ccs <> comma <> 
+                          parens(ptext SLIT("void *")) <> ppr cc)
 \end{code}
 
 -----------------------------------------------------------------------------
@@ -378,34 +368,5 @@ ppCostCentreLbl (NormalCC {cc_name = n, cc_mod = m, cc_is_caf = is_caf})
 costCentreUserName (NoCostCentre)  = "NO_CC"
 costCentreUserName (AllCafsCC {})  = "CAF"
 costCentreUserName cc@(NormalCC {cc_name = name, cc_is_caf = is_caf})
-  =  case is_caf of { CafCC -> "CAF:";   _ -> "" } ++ decode (unpackFS name)
-\end{code}
-
-Cost Centre Declarations
-
-\begin{code}
-#ifdef DEBUG
-pprCostCentreDecl is_local (NoCostCentre)
-  = panic "pprCostCentreDecl: no cost centre!"
-#endif
-pprCostCentreDecl is_local cc
-  = if is_local then
-       hcat [
-           ptext SLIT("CC_DECLARE"),char '(',
-           cc_ident,                                                   comma,
-           pprStringInCStyle (costCentreUserName cc),                  comma,
-           pprStringInCStyle (moduleNameUserString mod_name),          comma,
-           is_subsumed,                                                comma,
-           empty,      -- Now always externally visible
-           text ");"]
-    else
-       hcat [ ptext SLIT("CC_EXTERN"),char '(', cc_ident, text ");" ]
-  where
-    cc_ident    = ppCostCentreLbl cc
-    mod_name   = cc_mod cc
-    is_subsumed = ccSubsumed cc
-
-ccSubsumed :: CostCentre -> SDoc               -- subsumed value
-ccSubsumed cc | isCafCC  cc = ptext SLIT("CC_IS_CAF")
-             | otherwise   = ptext SLIT("CC_IS_BORING")
+  =  case is_caf of { CafCC -> "CAF:";   _ -> "" } ++ unpackFS name
 \end{code}