module ConstMath.Plugin (
plugin
) where
import ConstMath.Types
import ConstMath.Pass (constMathProgram)
import GhcPlugins
import Data.List (intersperse)
plugin :: Plugin
plugin = defaultPlugin {
installCoreToDos = install
}
install :: [CommandLineOption] -> [CoreToDo] -> CoreM [CoreToDo]
install args todos = do
reinitializeGlobals
let pass = CoreDoPasses [constMath]
return $ intersperse pass todos
where constMath = CoreDoPluginPass "Constant Math Elimination"
(bindsOnlyPass (constMathProgram (parseOpts args)) )
parseOpts :: [CommandLineOption] -> Opts
parseOpts = foldr ($) defaultOpts . map mkArg
where
mkArg flag
| flag `elem` ["-v","--verbose","--verbosity=1"] = setVerbosity (CmVerbose 1)
| flag `elem` ["-v11", "-verbosity=11","--trace"] = setVerbosity Trace
| flag `elem` ["-q", "--quiet","--verbosity=0", "-v0"] = setVerbosity None
| otherwise = id