X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=compiler%2Fprofiling%2FSCCfinal.lhs;h=8c3b62574d0158802c4b94cd6dd250eeb48697af;hp=dd72341f59b589fcc9f34063e44dca013ee24b9f;hb=aedb94f5f220b5e442b23ecc445fd38c8d9b6ba0;hpb=1a7d1b77334529ca96ed4cbc03fcb5f55dc2de4a diff --git a/compiler/profiling/SCCfinal.lhs b/compiler/profiling/SCCfinal.lhs index dd72341..8c3b625 100644 --- a/compiler/profiling/SCCfinal.lhs +++ b/compiler/profiling/SCCfinal.lhs @@ -5,78 +5,69 @@ This is now a sort-of-normal STG-to-STG pass (WDP 94/06), run by stg2stg. -* Traverses the STG program collecting the cost centres. These are - required to declare the cost centres at the start of code - generation. + - Traverses the STG program collecting the cost centres. These are required + to declare the cost centres at the start of code generation. - Note: because of cross-module unfolding, some of these cost centres - may be from other modules. But will still have to give them - "extern" declarations. + Note: because of cross-module unfolding, some of these cost centres may be + from other modules. But will still have to give them "extern" + declarations. -* Puts on CAF cost-centres if the user has asked for individual CAF - cost-centres. + - Puts on CAF cost-centres if the user has asked for individual CAF + cost-centres. -* Ditto for individual DICT cost-centres. + - Ditto for individual DICT cost-centres. -* Boxes top-level inherited functions passed as arguments. + - Boxes top-level inherited functions passed as arguments. -* "Distributes" given cost-centres to all as-yet-unmarked RHSs. + - "Distributes" given cost-centres to all as-yet-unmarked RHSs. \begin{code} -{-# OPTIONS -w #-} --- The above warning supression flag is a temporary kludge. --- While working on this module you are encouraged to remove it and fix --- any warnings in the module. See --- http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings --- for details - module SCCfinal ( stgMassageForProfiling ) where #include "HsVersions.h" import StgSyn -import StaticFlags ( opt_AutoSccsOnIndividualCafs ) -import CostCentre -- lots of things +import CostCentre -- lots of things import Id import Name import Module -import UniqSupply ( splitUniqSupply, UniqSupply ) +import UniqSupply ( splitUniqSupply, UniqSupply ) #ifdef PROF_DO_BOXING -import UniqSupply ( uniqFromSupply ) +import UniqSupply ( uniqFromSupply ) #endif import VarSet -import ListSetOps ( removeDups ) -import Outputable - -infixr 9 `thenMM`, `thenMM_` +import ListSetOps ( removeDups ) +import Outputable +import DynFlags \end{code} \begin{code} stgMassageForProfiling - :: PackageId - -> Module -- module name - -> UniqSupply -- unique supply - -> [StgBinding] -- input - -> (CollectedCCs, [StgBinding]) - -stgMassageForProfiling this_pkg mod_name us stg_binds + :: DynFlags + -> PackageId + -> Module -- module name + -> UniqSupply -- unique supply + -> [StgBinding] -- input + -> (CollectedCCs, [StgBinding]) + +stgMassageForProfiling dflags this_pkg mod_name us stg_binds = let - ((local_ccs, extern_ccs, cc_stacks), - stg_binds2) - = initMM mod_name us (do_top_bindings stg_binds) - - (fixed_ccs, fixed_cc_stacks) - = if opt_AutoSccsOnIndividualCafs - then ([],[]) -- don't need "all CAFs" CC - -- (for Prelude, we use PreludeCC) - else ([all_cafs_cc], [all_cafs_ccs]) - - local_ccs_no_dups = fst (removeDups cmpCostCentre local_ccs) - extern_ccs_no_dups = fst (removeDups cmpCostCentre extern_ccs) + ((local_ccs, extern_ccs, cc_stacks), + stg_binds2) + = initMM mod_name us (do_top_bindings stg_binds) + + (fixed_ccs, fixed_cc_stacks) + = if dopt Opt_AutoSccsOnIndividualCafs dflags + then ([],[]) -- don't need "all CAFs" CC + -- (for Prelude, we use PreludeCC) + else ([all_cafs_cc], [all_cafs_ccs]) + + local_ccs_no_dups = fst (removeDups cmpCostCentre local_ccs) + extern_ccs_no_dups = fst (removeDups cmpCostCentre extern_ccs) in - ((fixed_ccs ++ local_ccs_no_dups, - extern_ccs_no_dups, + ((fixed_ccs ++ local_ccs_no_dups, + extern_ccs_no_dups, fixed_cc_stacks ++ cc_stacks), stg_binds2) where @@ -86,94 +77,92 @@ stgMassageForProfiling this_pkg mod_name us stg_binds ---------- do_top_bindings :: [StgBinding] -> MassageM [StgBinding] - do_top_bindings [] = returnMM [] + do_top_bindings [] = return [] - do_top_bindings (StgNonRec b rhs : bs) - = do_top_rhs b rhs `thenMM` \ rhs' -> - addTopLevelIshId b ( - do_top_bindings bs `thenMM` \bs' -> - returnMM (StgNonRec b rhs' : bs') - ) + do_top_bindings (StgNonRec b rhs : bs) = do + rhs' <- do_top_rhs b rhs + addTopLevelIshId b $ do + bs' <- do_top_bindings bs + return (StgNonRec b rhs' : bs') do_top_bindings (StgRec pairs : bs) - = addTopLevelIshIds binders ( - mapMM do_pair pairs `thenMM` \ pairs2 -> - do_top_bindings bs `thenMM` \ bs' -> - returnMM (StgRec pairs2 : bs') - ) + = addTopLevelIshIds binders $ do + pairs2 <- mapM do_pair pairs + bs' <- do_top_bindings bs + return (StgRec pairs2 : bs') where - binders = map fst pairs - do_pair (b, rhs) - = do_top_rhs b rhs `thenMM` \ rhs2 -> - returnMM (b, rhs2) + binders = map fst pairs + do_pair (b, rhs) = do + rhs2 <- do_top_rhs b rhs + return (b, rhs2) ---------- do_top_rhs :: Id -> StgRhs -> MassageM StgRhs - do_top_rhs binder (StgRhsClosure _ bi fv u srt [] (StgSCC cc (StgConApp con args))) + do_top_rhs _ (StgRhsClosure _ _ _ _ _ [] (StgSCC cc (StgConApp con args))) | not (isSccCountCostCentre cc) && not (isDllConApp this_pkg con args) - -- Trivial _scc_ around nothing but static data - -- Eliminate _scc_ ... and turn into StgRhsCon + -- Trivial _scc_ around nothing but static data + -- Eliminate _scc_ ... and turn into StgRhsCon - -- isDllConApp checks for LitLit args too - = returnMM (StgRhsCon dontCareCCS con args) + -- isDllConApp checks for LitLit args too + = return (StgRhsCon dontCareCCS con args) {- Can't do this one with cost-centre stacks: --SDM do_top_rhs binder (StgRhsClosure no_cc bi fv u [] (StgSCC ty cc expr)) | (noCCSAttached no_cc || currentOrSubsumedCCS no_cc) && not (isSccCountCostCentre cc) - -- Top level CAF without a cost centre attached - -- Attach and collect cc of trivial _scc_ in body - = collectCC cc `thenMM_` - set_prevailing_cc cc (do_expr expr) `thenMM` \ expr' -> - returnMM (StgRhsClosure cc bi fv u [] expr') + -- Top level CAF without a cost centre attached + -- Attach and collect cc of trivial _scc_ in body + = do collectCC cc + expr' <- set_prevailing_cc cc (do_expr expr) + return (StgRhsClosure cc bi fv u [] expr') -} do_top_rhs binder (StgRhsClosure no_cc bi fv u srt [] body) - | noCCSAttached no_cc || currentOrSubsumedCCS no_cc - -- Top level CAF without a cost centre attached - -- Attach CAF cc (collect if individual CAF ccs) - = (if opt_AutoSccsOnIndividualCafs - then let cc = mkAutoCC binder modl CafCC - ccs = mkSingletonCCS cc - -- careful: the binder might be :Main.main, - -- which doesn't belong to module mod_name. - -- bug #249, tests prof001, prof002 - modl | Just m <- nameModule_maybe (idName binder) = m - | otherwise = mod_name - in - collectNewCC cc `thenMM_` - collectCCS ccs `thenMM_` - returnMM ccs - else - returnMM all_cafs_ccs) `thenMM` \ caf_ccs -> - set_prevailing_cc caf_ccs (do_expr body) `thenMM` \ body' -> - returnMM (StgRhsClosure caf_ccs bi fv u srt [] body') - - do_top_rhs binder (StgRhsClosure cc bi fv u srt [] body) - -- Top level CAF with cost centre attached - -- Should this be a CAF cc ??? Does this ever occur ??? + | noCCSAttached no_cc || currentOrSubsumedCCS no_cc = do + -- Top level CAF without a cost centre attached + -- Attach CAF cc (collect if individual CAF ccs) + caf_ccs <- if dopt Opt_AutoSccsOnIndividualCafs dflags + then let cc = mkAutoCC binder modl CafCC + ccs = mkSingletonCCS cc + -- careful: the binder might be :Main.main, + -- which doesn't belong to module mod_name. + -- bug #249, tests prof001, prof002 + modl | Just m <- nameModule_maybe (idName binder) = m + | otherwise = mod_name + in do + collectNewCC cc + collectCCS ccs + return ccs + else + return all_cafs_ccs + body' <- set_prevailing_cc caf_ccs (do_expr body) + return (StgRhsClosure caf_ccs bi fv u srt [] body') + + do_top_rhs _ (StgRhsClosure cc _ _ _ _ [] _) + -- Top level CAF with cost centre attached + -- Should this be a CAF cc ??? Does this ever occur ??? = pprPanic "SCCfinal: CAF with cc:" (ppr cc) - do_top_rhs binder (StgRhsClosure no_ccs bi fv u srt args body) - -- Top level function, probably subsumed + do_top_rhs _ (StgRhsClosure no_ccs bi fv u srt args body) + -- Top level function, probably subsumed | noCCSAttached no_ccs - = set_lambda_cc (do_expr body) `thenMM` \ body' -> - returnMM (StgRhsClosure subsumedCCS bi fv u srt args body') + = do body' <- set_lambda_cc (do_expr body) + return (StgRhsClosure subsumedCCS bi fv u srt args body') | otherwise = pprPanic "SCCfinal: CAF with cc:" (ppr no_ccs) - do_top_rhs binder (StgRhsCon ccs con args) - -- Top-level (static) data is not counted in heap - -- profiles; nor do we set CCCS from it; so we - -- just slam in dontCareCostCentre - = returnMM (StgRhsCon dontCareCCS con args) + do_top_rhs _ (StgRhsCon _ con args) + -- Top-level (static) data is not counted in heap + -- profiles; nor do we set CCCS from it; so we + -- just slam in dontCareCostCentre + = return (StgRhsCon dontCareCCS con args) ------ do_expr :: StgExpr -> MassageM StgExpr - do_expr (StgLit l) = returnMM (StgLit l) + do_expr (StgLit l) = return (StgLit l) do_expr (StgApp fn args) = boxHigherOrderArgs (StgApp fn) args @@ -184,88 +173,84 @@ stgMassageForProfiling this_pkg mod_name us stg_binds do_expr (StgOpApp con args res_ty) = boxHigherOrderArgs (\args -> StgOpApp con args res_ty) args - do_expr (StgSCC cc expr) -- Ha, we found a cost centre! - = collectCC cc `thenMM_` - do_expr expr `thenMM` \ expr' -> - returnMM (StgSCC cc expr') + do_expr (StgSCC cc expr) = do -- Ha, we found a cost centre! + collectCC cc + expr' <- do_expr expr + return (StgSCC cc expr') - do_expr (StgCase expr fv1 fv2 bndr srt alt_type alts) - = do_expr expr `thenMM` \ expr' -> - mapMM do_alt alts `thenMM` \ alts' -> - returnMM (StgCase expr' fv1 fv2 bndr srt alt_type alts') + do_expr (StgCase expr fv1 fv2 bndr srt alt_type alts) = do + expr' <- do_expr expr + alts' <- mapM do_alt alts + return (StgCase expr' fv1 fv2 bndr srt alt_type alts') where - do_alt (id, bs, use_mask, e) - = do_expr e `thenMM` \ e' -> - returnMM (id, bs, use_mask, e') + do_alt (id, bs, use_mask, e) = do + e' <- do_expr e + return (id, bs, use_mask, e') - do_expr (StgLet b e) - = do_let b e `thenMM` \ (b,e) -> - returnMM (StgLet b e) + do_expr (StgLet b e) = do + (b,e) <- do_let b e + return (StgLet b e) - do_expr (StgLetNoEscape lvs1 lvs2 b e) - = do_let b e `thenMM` \ (b,e) -> - returnMM (StgLetNoEscape lvs1 lvs2 b e) + do_expr (StgLetNoEscape lvs1 lvs2 b e) = do + (b,e) <- do_let b e + return (StgLetNoEscape lvs1 lvs2 b e) - do_expr (StgTick m n expr) - = do_expr expr `thenMM` \ expr' -> - returnMM (StgTick m n expr') + do_expr (StgTick m n expr) = do + expr' <- do_expr expr + return (StgTick m n expr') -#ifdef DEBUG do_expr other = pprPanic "SCCfinal.do_expr" (ppr other) -#endif ---------------------------------- - do_let (StgNonRec b rhs) e - = do_rhs rhs `thenMM` \ rhs' -> - addTopLevelIshId b ( - do_expr e `thenMM` \ e' -> - returnMM (StgNonRec b rhs',e') - ) + do_let (StgNonRec b rhs) e = do + rhs' <- do_rhs rhs + addTopLevelIshId b $ do + e' <- do_expr e + return (StgNonRec b rhs',e') do_let (StgRec pairs) e - = addTopLevelIshIds binders ( - mapMM do_pair pairs `thenMM` \ pairs' -> - do_expr e `thenMM` \ e' -> - returnMM (StgRec pairs', e') - ) + = addTopLevelIshIds binders $ do + pairs' <- mapM do_pair pairs + e' <- do_expr e + return (StgRec pairs', e') where - binders = map fst pairs - do_pair (b, rhs) - = do_rhs rhs `thenMM` \ rhs2 -> - returnMM (b, rhs2) + binders = map fst pairs + do_pair (b, rhs) = do + rhs2 <- do_rhs rhs + return (b, rhs2) ---------------------------------- do_rhs :: StgRhs -> MassageM StgRhs - -- We play much the same game as we did in do_top_rhs above; - -- but we don't have to worry about cafs etc. + -- We play much the same game as we did in do_top_rhs above; + -- but we don't have to worry about cafs etc. {- do_rhs (StgRhsClosure closure_cc bi fv u [] (StgSCC ty cc (StgCon (DataCon con) args _))) | not (isSccCountCostCentre cc) - = collectCC cc `thenMM_` - returnMM (StgRhsCon cc con args) + = do collectCC cc + return (StgRhsCon cc con args) -} - do_rhs (StgRhsClosure _ bi fv u srt args expr) - = slurpSCCs currentCCS expr `thenMM` \ (expr', ccs) -> - do_expr expr' `thenMM` \ expr'' -> - returnMM (StgRhsClosure ccs bi fv u srt args expr'') + do_rhs (StgRhsClosure _ bi fv u srt args expr) = do + (expr', ccs) <- slurpSCCs currentCCS expr + expr'' <- do_expr expr' + return (StgRhsClosure ccs bi fv u srt args expr'') where - slurpSCCs ccs (StgSCC cc e) - = collectCC cc `thenMM_` - slurpSCCs (cc `pushCCOnCCS` ccs) e - slurpSCCs ccs e - = returnMM (e, ccs) - - do_rhs (StgRhsCon cc con args) - = returnMM (StgRhsCon currentCCS con args) + slurpSCCs ccs (StgSCC cc e) + = do collectCC cc + slurpSCCs (cc `pushCCOnCCS` ccs) e + slurpSCCs ccs e + = return (e, ccs) + + do_rhs (StgRhsCon _ con args) + = return (StgRhsCon currentCCS con args) \end{code} %************************************************************************ -%* * +%* * \subsection{Boxing higher-order args} -%* * +%* * %************************************************************************ Boxing is *turned off* at the moment, until we can figure out how to @@ -274,125 +259,114 @@ do it properly in general. \begin{code} boxHigherOrderArgs :: ([StgArg] -> StgExpr) - -- An application lacking its arguments - -> [StgArg] -- arguments which we might box + -- An application lacking its arguments + -> [StgArg] -- arguments which we might box -> MassageM StgExpr #ifndef PROF_DO_BOXING boxHigherOrderArgs almost_expr args - = returnMM (almost_expr args) + = return (almost_expr args) #else -boxHigherOrderArgs almost_expr args - = getTopLevelIshIds `thenMM` \ ids -> - mapAccumMM (do_arg ids) [] args `thenMM` \ (let_bindings, new_args) -> - returnMM (foldr (mk_stg_let currentCCS) (almost_expr new_args) let_bindings) +boxHigherOrderArgs almost_expr args = do + ids <- getTopLevelIshIds + (let_bindings, new_args) <- mapAccumLM (do_arg ids) [] args + return (foldr (mk_stg_let currentCCS) (almost_expr new_args) let_bindings) where --------------- do_arg ids bindings arg@(StgVarArg old_var) - | (not (isLocalVar old_var) || elemVarSet old_var ids) - && isFunTy (dropForAlls var_type) - = -- make a trivial let-binding for the top-level function - getUniqueMM `thenMM` \ uniq -> - let - new_var = mkSysLocal FSLIT("sf") uniq var_type - in - returnMM ( (new_var, old_var) : bindings, StgVarArg new_var ) + | (not (isLocalVar old_var) || elemVarSet old_var ids) + && isFunTy (dropForAlls var_type) + = do -- make a trivial let-binding for the top-level function + uniq <- getUniqueMM + let + new_var = mkSysLocal (fsLit "sf") uniq var_type + return ( (new_var, old_var) : bindings, StgVarArg new_var ) where - var_type = idType old_var + var_type = idType old_var - do_arg ids bindings arg = returnMM (bindings, arg) + do_arg ids bindings arg = return (bindings, arg) --------------- mk_stg_let :: CostCentreStack -> (Id, Id) -> StgExpr -> StgExpr mk_stg_let cc (new_var, old_var) body = let - rhs_body = StgApp old_var [{-args-}] - rhs_closure = StgRhsClosure cc stgArgOcc [{-fvs-}] ReEntrant NoSRT{-eeek!!!-} [{-args-}] rhs_body + rhs_body = StgApp old_var [{-args-}] + rhs_closure = StgRhsClosure cc stgArgOcc [{-fvs-}] ReEntrant NoSRT{-eeek!!!-} [{-args-}] rhs_body in - StgLet (StgNonRec new_var rhs_closure) body + StgLet (StgNonRec new_var rhs_closure) body where - bOGUS_LVs = emptyUniqSet -- easier to print than: panic "mk_stg_let: LVs" + bOGUS_LVs = emptyUniqSet -- easier to print than: panic "mk_stg_let: LVs" #endif \end{code} %************************************************************************ -%* * +%* * \subsection{Boring monad stuff for this} -%* * +%* * %************************************************************************ \begin{code} -type MassageM result - = Module -- module name - -> CostCentreStack -- prevailing CostCentre - -- if none, subsumedCosts at top-level - -- currentCostCentre at nested levels - -> UniqSupply - -> VarSet -- toplevel-ish Ids for boxing - -> CollectedCCs - -> (CollectedCCs, result) +newtype MassageM result + = MassageM { + unMassageM :: Module -- module name + -> CostCentreStack -- prevailing CostCentre + -- if none, subsumedCosts at top-level + -- currentCostCentre at nested levels + -> UniqSupply + -> VarSet -- toplevel-ish Ids for boxing + -> CollectedCCs + -> (CollectedCCs, result) + } + +instance Monad MassageM where + return x = MassageM (\_ _ _ _ ccs -> (ccs, x)) + (>>=) = thenMM + (>>) = thenMM_ -- the initMM function also returns the final CollectedCCs -initMM :: Module -- module name, which we may consult +initMM :: Module -- module name, which we may consult -> UniqSupply -> MassageM a -> (CollectedCCs, a) -initMM mod_name init_us m = m mod_name noCCS init_us emptyVarSet ([],[],[]) +initMM mod_name init_us (MassageM m) = m mod_name noCCS init_us emptyVarSet ([],[],[]) thenMM :: MassageM a -> (a -> MassageM b) -> MassageM b thenMM_ :: MassageM a -> (MassageM b) -> MassageM b -thenMM expr cont mod scope_cc us ids ccs - = case splitUniqSupply us of { (s1, s2) -> - case (expr mod scope_cc s1 ids ccs) of { (ccs2, result) -> - cont result mod scope_cc s2 ids ccs2 }} - -thenMM_ expr cont mod scope_cc us ids ccs - = case splitUniqSupply us of { (s1, s2) -> - case (expr mod scope_cc s1 ids ccs) of { (ccs2, _) -> - cont mod scope_cc s2 ids ccs2 }} - -returnMM :: a -> MassageM a -returnMM result mod scope_cc us ids ccs = (ccs, result) +thenMM expr cont = MassageM $ \mod scope_cc us ids ccs -> + case splitUniqSupply us of { (s1, s2) -> + case unMassageM expr mod scope_cc s1 ids ccs of { (ccs2, result) -> + unMassageM (cont result) mod scope_cc s2 ids ccs2 }} -nopMM :: MassageM () -nopMM mod scope_cc us ids ccs = (ccs, ()) - -mapMM :: (a -> MassageM b) -> [a] -> MassageM [b] -mapMM f [] = returnMM [] -mapMM f (m:ms) - = f m `thenMM` \ r -> - mapMM f ms `thenMM` \ rs -> - returnMM (r:rs) - -mapAccumMM :: (acc -> x -> MassageM (acc, y)) -> acc -> [x] -> MassageM (acc, [y]) -mapAccumMM f b [] = returnMM (b, []) -mapAccumMM f b (m:ms) - = f b m `thenMM` \ (b2, r) -> - mapAccumMM f b2 ms `thenMM` \ (b3, rs) -> - returnMM (b3, r:rs) +thenMM_ expr cont = MassageM $ \mod scope_cc us ids ccs -> + case splitUniqSupply us of { (s1, s2) -> + case unMassageM expr mod scope_cc s1 ids ccs of { (ccs2, _) -> + unMassageM cont mod scope_cc s2 ids ccs2 }} #ifdef PROF_DO_BOXING getUniqueMM :: MassageM Unique -getUniqueMM mod scope_cc us ids ccs = (ccs, uniqFromSupply us) +getUniqueMM = MassageM \mod scope_cc us ids ccs -> (ccs, uniqFromSupply us) #endif addTopLevelIshId :: Id -> MassageM a -> MassageM a -addTopLevelIshId id scope mod scope_cc us ids ccs - | isCurrentCCS scope_cc = scope mod scope_cc us ids ccs - | otherwise = scope mod scope_cc us (extendVarSet ids id) ccs +addTopLevelIshId id scope + = MassageM $ \mod scope_cc us ids ccs -> + if isCurrentCCS scope_cc then unMassageM scope mod scope_cc us ids ccs + else unMassageM scope mod scope_cc us (extendVarSet ids id) ccs addTopLevelIshIds :: [Id] -> MassageM a -> MassageM a addTopLevelIshIds [] cont = cont -addTopLevelIshIds (id:ids) cont +addTopLevelIshIds (id:ids) cont = addTopLevelIshId id (addTopLevelIshIds ids cont) +#ifdef PROF_DO_BOXING getTopLevelIshIds :: MassageM VarSet -getTopLevelIshIds mod scope_cc us ids ccs = (ccs, ids) +getTopLevelIshIds = MassageM $ \_mod _scope_cc _us ids ccs -> (ccs, ids) +#endif \end{code} The prevailing CCS is used to tell whether we're in a top-levelish @@ -402,38 +376,39 @@ I'm sure --SDM \begin{code} set_lambda_cc :: MassageM a -> MassageM a -set_lambda_cc action mod scope_cc us ids ccs - = action mod currentCCS us ids ccs +set_lambda_cc action + = MassageM $ \mod _scope_cc us ids ccs + -> unMassageM action mod currentCCS us ids ccs set_prevailing_cc :: CostCentreStack -> MassageM a -> MassageM a -set_prevailing_cc cc_to_set_to action mod scope_cc us ids ccs - = action mod cc_to_set_to us ids ccs - -get_prevailing_cc :: MassageM CostCentreStack -get_prevailing_cc mod scope_cc us ids ccs = (ccs, scope_cc) +set_prevailing_cc cc_to_set_to action + = MassageM $ \mod _scope_cc us ids ccs + -> unMassageM action mod cc_to_set_to us ids ccs \end{code} \begin{code} collectCC :: CostCentre -> MassageM () - -collectCC cc mod_name scope_cc us ids (local_ccs, extern_ccs, ccss) - = ASSERT(not (noCCAttached cc)) - if (cc `ccFromThisModule` mod_name) then - ((cc : local_ccs, extern_ccs, ccss), ()) - else -- must declare it "extern" - ((local_ccs, cc : extern_ccs, ccss), ()) +collectCC cc + = MassageM $ \mod_name _scope_cc _us _ids (local_ccs, extern_ccs, ccss) + -> ASSERT(not (noCCAttached cc)) + if (cc `ccFromThisModule` mod_name) then + ((cc : local_ccs, extern_ccs, ccss), ()) + else -- must declare it "extern" + ((local_ccs, cc : extern_ccs, ccss), ()) -- Version of collectCC used when we definitely want to declare this -- CC as local, even if its module name is not the same as the current --- module name (eg. the special :Main module) see bug #249, #1472, +-- module name (eg. the special :Main module) see bug #249, #1472, -- test prof001,prof002. collectNewCC :: CostCentre -> MassageM () -collectNewCC cc mod_name scope_cc us ids (local_ccs, extern_ccs, ccss) - = ((cc : local_ccs, extern_ccs, ccss), ()) +collectNewCC cc + = MassageM $ \_mod_name _scope_cc _us _ids (local_ccs, extern_ccs, ccss) + -> ((cc : local_ccs, extern_ccs, ccss), ()) collectCCS :: CostCentreStack -> MassageM () -collectCCS ccs mod_name scope_cc us ids (local_ccs, extern_ccs, ccss) - = ASSERT(not (noCCSAttached ccs)) - ((local_ccs, extern_ccs, ccs : ccss), ()) +collectCCS ccs + = MassageM $ \_mod_name _scope_cc _us _ids (local_ccs, extern_ccs, ccss) + -> ASSERT(not (noCCSAttached ccs)) + ((local_ccs, extern_ccs, ccs : ccss), ()) \end{code}