ghc-dump-core-0.1.2.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)
#if !MIN_VERSION_ghc(8,8,0)
import CoreMonad (pprPassDetails)
#endif
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