{-# 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