+++ /dev/null
-%
-% (c) The GRASP/AQUA Project, Glasgow University, 1993-1998
-%
-\section[SimplStg]{Driver for simplifying @STG@ programs}
-
-\begin{code}
-module SimplStg ( stg2stg ) where
-
-#include "HsVersions.h"
-
-import StgSyn
-
-import CostCentre ( CollectedCCs )
-import SCCfinal ( stgMassageForProfiling )
-import StgLint ( lintStgBindings )
-import StgStats ( showStgStats )
-import SRT ( computeSRTs )
-
-import Packages ( HomeModules )
-import DynFlags ( DynFlags(..), DynFlag(..), dopt, StgToDo(..),
- getStgToDo )
-import Id ( Id )
-import Module ( Module )
-import ErrUtils ( doIfSet_dyn, dumpIfSet_dyn, showPass )
-import UniqSupply ( mkSplitUniqSupply, splitUniqSupply )
-import Outputable
-\end{code}
-
-\begin{code}
-stg2stg :: DynFlags -- includes spec of what stg-to-stg passes to do
- -> HomeModules
- -> Module -- module name (profiling only)
- -> [StgBinding] -- input...
- -> IO ( [(StgBinding,[(Id,[Id])])] -- output program...
- , CollectedCCs) -- cost centre information (declared and used)
-
-stg2stg dflags pkg_deps module_name binds
- = do { showPass dflags "Stg2Stg"
- ; us <- mkSplitUniqSupply 'g'
-
- ; doIfSet_dyn dflags Opt_D_verbose_stg2stg
- (printDump (text "VERBOSE STG-TO-STG:"))
-
- ; (binds', us', ccs) <- end_pass us "Stg2Stg" ([],[],[]) binds
-
- -- Do the main business!
- ; (processed_binds, _, cost_centres)
- <- foldl_mn do_stg_pass (binds', us', ccs) (getStgToDo dflags)
-
- ; let srt_binds = computeSRTs processed_binds
-
- ; dumpIfSet_dyn dflags Opt_D_dump_stg "STG syntax:"
- (pprStgBindingsWithSRTs srt_binds)
-
- ; return (srt_binds, cost_centres)
- }
-
- where
- stg_linter = if dopt Opt_DoStgLinting dflags
- then lintStgBindings
- else ( \ whodunnit binds -> binds )
-
- -------------------------------------------
- do_stg_pass (binds, us, ccs) to_do
- = let
- (us1, us2) = splitUniqSupply us
- in
- case to_do of
- D_stg_stats ->
- trace (showStgStats binds)
- end_pass us2 "StgStats" ccs binds
-
- StgDoMassageForProfiling ->
- {-# SCC "ProfMassage" #-}
- let
- (collected_CCs, binds3)
- = stgMassageForProfiling pkg_deps module_name us1 binds
- in
- end_pass us2 "ProfMassage" collected_CCs binds3
-
- end_pass us2 what ccs binds2
- = do -- report verbosely, if required
- dumpIfSet_dyn dflags Opt_D_verbose_stg2stg what
- (vcat (map ppr binds2))
- let linted_binds = stg_linter what binds2
- return (linted_binds, us2, ccs)
- -- return: processed binds
- -- UniqueSupply for the next guy to use
- -- cost-centres to be declared/registered (specialised)
- -- add to description of what's happened (reverse order)
-
--- here so it can be inlined...
-foldl_mn f z [] = return z
-foldl_mn f z (x:xs) = f z x >>= \ zz ->
- foldl_mn f zz xs
-\end{code}