|
| 1 | +{-# LANGUAGE ParallelListComp #-} |
| 2 | +{-# LANGUAGE TupleSections #-} |
| 3 | + |
| 4 | +module Recon where |
| 5 | + |
| 6 | +import ARM.MRAS |
| 7 | +import ARM.MRAS.ASL.Parser |
| 8 | +import ARM.MRAS.ASL.Parser.Lexer |
| 9 | +import ARM.MRAS.ASL.Parser.Parser |
| 10 | +import ARM.MRAS.ASL.Parser.ParserMonad |
| 11 | +import ARM.MRAS.ASL.Parser.Syntax |
| 12 | +import ARM.MRAS.ASL.Parser.Tokens |
| 13 | + |
| 14 | +import Control.DeepSeq |
| 15 | +import Control.Lens |
| 16 | +import Control.Monad |
| 17 | +import Control.Monad.Except |
| 18 | +import Control.Monad.State |
| 19 | +import Data.List |
| 20 | +import Data.Monoid |
| 21 | +import System.IO |
| 22 | +import System.Exit |
| 23 | +import System.FilePath |
| 24 | +import System.Directory |
| 25 | + |
| 26 | + |
| 27 | +defChunks :: [String] |
| 28 | +defChunks = map _shared_ps_code (topoSort sharedps) |
| 29 | + |
| 30 | +stmtChunks :: [String] |
| 31 | +stmtChunks = (base ++ fpsimd) ^.. traverse.(insn_classes.traverse._2 <> insn_ps).traverse.ps_code |
| 32 | + |
| 33 | +parseDefsM :: Monad m => String -> StateT [String] (ExceptT PError m) [Definition] |
| 34 | +parseDefsM asl = StateT $ ExceptT . return . parseDefs asl |
| 35 | + |
| 36 | +parseStmtsM :: Monad m => String -> StateT [String] (ExceptT PError m) [Statement] |
| 37 | +parseStmtsM asl = StateT $ \s -> ExceptT (return (fmap (, s) (parseStmts s asl))) |
| 38 | + |
| 39 | +needle = "LExprDots" |
| 40 | + |
| 41 | +recon :: IO () |
| 42 | +recon = do |
| 43 | + r <- runExceptT . flip runStateT [] $ do |
| 44 | + liftIO (readFile "test/prelude.asl") >>= parseDefsM |
| 45 | + forM_ (topoSort sharedps) $ \ps -> do |
| 46 | + ast <- parseDefsM (_shared_ps_code ps) |
| 47 | + when (needle `isInfixOf` (show ast)) $ do |
| 48 | + liftIO . putStrLn $ "sharedps: " ++ _shared_ps_name ps |
| 49 | + forM_ (base ++ fpsimd) $ \insn -> do |
| 50 | + let pss = insn ^.. (insn_classes.traverse._2 <> insn_ps).traverse |
| 51 | + forM_ pss $ \ps -> do |
| 52 | + ast <- parseStmtsM (_ps_code ps) |
| 53 | + when (needle `isInfixOf` (show ast)) $ do |
| 54 | + liftIO . putStrLn $ "insn: " ++ _insn_file insn |
| 55 | + case r of |
| 56 | + Left err -> die (show err) |
| 57 | + Right _ -> return () |
0 commit comments