packages feed

hLLVM-0.5.0.0: src/Llvm/Pass/PassTester.hs

module Llvm.Pass.PassTester where

import Llvm.Data.Ir
import Llvm.Query.IrCxt
import qualified Compiler.Hoopl as H 
import qualified Data.Set as Ds

type Optimization m a u x = IrCxt -> a -> H.Label -> H.Graph (Node u) H.C H.C -> m (H.Graph (Node u) H.C H.C, x)
  
opt :: (H.CheckpointMonad m, H.FuelMonad m) => IrCxt -> a -> Optimization m a u x -> Toplevel u -> m [(Toplevel u, (FunctionPrototype, x))]
opt dl gs f (ToplevelDefine (TlDefine fn entry graph)) = do { (graph', x) <- f dl gs entry graph
                                                            ; return [(ToplevelDefine $ TlDefine fn entry graph', (fn, x))]
                                                            }
opt _ _ _ _ = return []


optModule :: (H.CheckpointMonad m, H.FuelMonad m) => Optimization m (Ds.Set (Dtype, GlobalId)) u x -> Module u -> m (Module u, [(FunctionPrototype, x)])
optModule f (Module l) = 
  let gs = globalIdOfModule (Module l)
      dl = irCxtOfModule (Module l)
  in mapM (opt dl gs f) l >>= \x -> let (lx, ly) = unzip $ concat x
                                 in return (Module lx, ly)

{-
optModule1 :: (H.CheckpointMonad m, H.FuelMonad m) => a -> Optimization m a x -> Module -> m Module
optModule1 a f (Module l) = 
  mapM (opt a f) l >>= return . Module
-}