X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fprofiling%2FSCCfinal.lhs;h=7aaf1096978115f19d8de7a2af73dc78b376b90c;hb=e07e2550074ddc7d96e2092e56add418403bd29a;hp=c95db9c358a72644a5e9e6560bf5693117bb0145;hpb=0065d5ab628975892cea1ec7303f968c3338cbe1;p=ghc-hetmet.git diff --git a/compiler/profiling/SCCfinal.lhs b/compiler/profiling/SCCfinal.lhs index c95db9c..7aaf109 100644 --- a/compiler/profiling/SCCfinal.lhs +++ b/compiler/profiling/SCCfinal.lhs @@ -29,12 +29,16 @@ module SCCfinal ( stgMassageForProfiling ) where import StgSyn -import Packages ( HomeModules ) +import PackageConfig ( PackageId ) import StaticFlags ( opt_AutoSccsOnIndividualCafs ) import CostCentre -- lots of things -import Id ( Id ) +import Id +import Name import Module ( Module ) -import UniqSupply ( uniqFromSupply, splitUniqSupply, UniqSupply ) +import UniqSupply ( splitUniqSupply, UniqSupply ) +#ifdef PROF_DO_BOXING +import UniqSupply ( uniqFromSupply ) +#endif import Unique ( Unique ) import VarSet import ListSetOps ( removeDups ) @@ -45,13 +49,13 @@ infixr 9 `thenMM`, `thenMM_` \begin{code} stgMassageForProfiling - :: HomeModules + :: PackageId -> Module -- module name -> UniqSupply -- unique supply -> [StgBinding] -- input -> (CollectedCCs, [StgBinding]) -stgMassageForProfiling pdeps mod_name us stg_binds +stgMassageForProfiling this_pkg mod_name us stg_binds = let ((local_ccs, extern_ccs, cc_stacks), stg_binds2) @@ -102,7 +106,7 @@ stgMassageForProfiling pdeps mod_name us stg_binds do_top_rhs :: Id -> StgRhs -> MassageM StgRhs do_top_rhs binder (StgRhsClosure _ bi fv u srt [] (StgSCC cc (StgConApp con args))) - | not (isSccCountCostCentre cc) && not (isDllConApp pdeps con args) + | not (isSccCountCostCentre cc) && not (isDllConApp this_pkg con args) -- Trivial _scc_ around nothing but static data -- Eliminate _scc_ ... and turn into StgRhsCon @@ -125,8 +129,13 @@ stgMassageForProfiling pdeps mod_name us stg_binds -- Top level CAF without a cost centre attached -- Attach CAF cc (collect if individual CAF ccs) = (if opt_AutoSccsOnIndividualCafs - then let cc = mkAutoCC binder mod_name CafCC + 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 collectCC cc `thenMM_` collectCCS ccs `thenMM_` @@ -192,6 +201,10 @@ stgMassageForProfiling pdeps mod_name us stg_binds = do_let b e `thenMM` \ (b,e) -> returnMM (StgLetNoEscape lvs1 lvs2 b e) + do_expr (StgTick m n expr) + = do_expr expr `thenMM` \ expr' -> + returnMM (StgTick m n expr') + #ifdef DEBUG do_expr other = pprPanic "SCCfinal.do_expr" (ppr other) #endif @@ -358,8 +371,10 @@ mapAccumMM f b (m:ms) mapAccumMM f b2 ms `thenMM` \ (b3, rs) -> returnMM (b3, r:rs) +#ifdef PROF_DO_BOXING getUniqueMM :: MassageM Unique getUniqueMM 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