X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Fprofiling%2FCostCentre.lhs;h=f4a6ba951d6c16735a25a91488eab05e231b9145;hb=9d7da331989abcd1844e9d03b8d1e4163796fa85;hp=5efe37a8c8da19771964a670261e8198d7de52dc;hpb=12e244ccac8f2215dcbdaceafe587a15b3f7bcf4;p=ghc-hetmet.git diff --git a/ghc/compiler/profiling/CostCentre.lhs b/ghc/compiler/profiling/CostCentre.lhs index 5efe37a..f4a6ba9 100644 --- a/ghc/compiler/profiling/CostCentre.lhs +++ b/ghc/compiler/profiling/CostCentre.lhs @@ -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}