{-# LANGUAGE GADTs #-} module AsmTest where import Assembly import Compiler.Hoopl as Hoopl hiding ((<*>)) import Control.Exception import LinearScan import LinearScan.Hoopl import LinearScan.Hoopl.DSL import Normal () import Test.Hspec asmTestLiteral :: Int -> Program (Node IRVar) -> String -> Expectation asmTestLiteral regs program expected = do let (graph, entry) = runSimpleUniqueMonad $ compile "entry" program case allocateHoopl regs 0 8 entry graph of Left err -> error $ "Allocation failed: " ++ err Right graph' -> do let g = showGraph show graph' catch (g `shouldBe` expected) $ \e -> do putStrLn $ "---- Parsed ----\n" ++ showGraph show graph putStrLn $ "---- Expecting ----\n" ++ expected putStrLn $ "---- Compiled ----\n" ++ g putStrLn "-------------------" throwIO (e :: SomeException) asmTest :: Int -> Program (Node IRVar) -> Program (Node (Assign VarId PhysReg)) -> Expectation asmTest regs program = asmTestLiteral regs program . showGraph show . fst . runSimpleUniqueMonad . compile "entry"