X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;ds=sidebyside;f=compiler%2Fprofiling%2FSCCfinal.lhs;h=e24eee123e9963792b8c049774eefcbfa0817c6e;hb=17b297d97d327620ed6bfab942f8992b2446f1bf;hp=8e0289225493d8e76d775aee8669f94241e5aa45;hpb=61d2625ae2e6a4cdae2ffc92df828905e81c24cc;p=ghc-hetmet.git diff --git a/compiler/profiling/SCCfinal.lhs b/compiler/profiling/SCCfinal.lhs index 8e02892..e24eee1 100644 --- a/compiler/profiling/SCCfinal.lhs +++ b/compiler/profiling/SCCfinal.lhs @@ -23,6 +23,13 @@ This is now a sort-of-normal STG-to-STG pass (WDP 94/06), run by stg2stg. * "Distributes" given cost-centres to all as-yet-unmarked RHSs. \begin{code} +{-# OPTIONS_GHC -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/WorkingConventions#Warnings +-- for details + module SCCfinal ( stgMassageForProfiling ) where #include "HsVersions.h" @@ -32,13 +39,13 @@ import StgSyn import PackageConfig ( PackageId ) import StaticFlags ( opt_AutoSccsOnIndividualCafs ) import CostCentre -- lots of things -import Id ( Id ) +import Id +import Name import Module ( Module ) import UniqSupply ( splitUniqSupply, UniqSupply ) #ifdef PROF_DO_BOXING import UniqSupply ( uniqFromSupply ) #endif -import Unique ( Unique ) import VarSet import ListSetOps ( removeDups ) import Outputable @@ -128,10 +135,15 @@ stgMassageForProfiling this_pkg 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_` + collectNewCC cc `thenMM_` collectCCS ccs `thenMM_` returnMM ccs else @@ -195,6 +207,10 @@ stgMassageForProfiling this_pkg 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 @@ -408,6 +424,14 @@ collectCC cc mod_name scope_cc us ids (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, +-- 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), ()) + collectCCS :: CostCentreStack -> MassageM () collectCCS ccs mod_name scope_cc us ids (local_ccs, extern_ccs, ccss)