ghc-dump-core-0.1.1.0: GhcDump/Plugin.hs
{-# LANGUAGE CPP #-}
module GhcDump.Plugin where
import Data.Maybe
import qualified Data.ByteString.Lazy as BSL
import qualified Codec.Serialise as Ser
import GhcPlugins hiding (TB)
import CoreMonad (pprPassDetails)
import ErrUtils (showPass)
import Text.Printf
import System.FilePath
import System.Directory
import GhcDump.Convert
plugin :: Plugin
plugin = defaultPlugin { installCoreToDos = install }
install :: [CommandLineOption] -> [CoreToDo] -> CoreM [CoreToDo]
install _opts todo = do
dflags <- getDynFlags
return (intersperseDumps dflags todo)
intersperseDumps :: DynFlags -> [CoreToDo] -> [CoreToDo]
intersperseDumps dflags = go 0 "desugar"
where
go n phase (todo : rest) = pass n phase : todo : go (n+1) phase' rest
where phase' = showSDocDump dflags (ppr todo GhcPlugins.<> text ":" <+> pprPassDetails todo)
go n phase [] = [pass n phase]
pass n phase = CoreDoPluginPass "DumpCore" (liftIO . dumpIn dflags n phase)
dumpIn :: DynFlags -> Int -> String -> ModGuts -> IO ModGuts
dumpIn dflags n phase guts = do
let prefix = fromMaybe "dump" $ dumpPrefix dflags
fname = printf "%spass-%04u.cbor" prefix n
showPass dflags $ "GhcDump: Dumping core to "++fname
let in_dump_dir = maybe id (</>) (dumpDir dflags)
createDirectoryIfMissing True $ takeDirectory $ in_dump_dir fname
BSL.writeFile (in_dump_dir fname) $ Ser.serialise (cvtModule phase guts)
return guts