@@ -8,6 +8,10 @@ module Halcyon.Driver.Pipeline
88 , handleStageResult
99 ) where
1010
11+
12+ import qualified System.IO as SIO
13+
14+
1115import Halcyon.Core.Monad
1216import qualified Halcyon.Core.Tacky as Tacky
1317import Halcyon.Core.TackyGen
@@ -16,6 +20,7 @@ import qualified Halcyon.Frontend.Lexer as Lexer
1620import qualified Halcyon.Frontend.Parse as Parse
1721import qualified Halcyon.Backend.Codegen as Codegen
1822import qualified Halcyon.Backend.Emit as Emit
23+ import qualified Halcyon.Backend.ReplacePseudos as Replace
1924import qualified Halcyon.Core.Assembly as Asm
2025import qualified Halcyon.Core.Ast as Ast
2126import Halcyon.Core.Settings (StageResult (.. ))
@@ -55,24 +60,35 @@ runCompilerStages AppOptions{..} src = case stage of
5560 Parse -> StageResultAST <$>
5661 (runLexStage src >>= runParseStage)
5762 Tacky -> StageResultTacky <$>
58- (runLexStage src >>= runParseStage >>= runTackyStage)
63+ (runLexStage src >>= runParseStage >>= debugStage " AST " >>= runTackyStage)
5964 Codegen -> StageResultAsm <$>
60- (runLexStage src >>= runParseStage >>= runCodegenStage)
65+ (runLexStage src >>= runParseStage >>= runTackyStage >>= debugStage " TACKY " >>= runCodegenStage)
6166 Assembly -> StageResultAssembly <$>
62- (runLexStage src >>= runParseStage >>= runCodegenStage >>= runEmitStage)
67+ (runLexStage src >>= runParseStage >>= runTackyStage >>= runCodegenStage >>= runFixupStage >>= debugStage " ASM " >>= runEmitStage)
6368 Executable -> StageResultExecutable <$>
64- (runLexStage src >>= runParseStage >>= runCodegenStage >>= runEmitStage)
69+ (runLexStage src >>= runParseStage >>= runTackyStage >>= runCodegenStage >>= runFixupStage >>= runEmitStage)
6570 where
6671 runLexStage :: MonadCompiler m => T. Text -> m [Tokens. CToken ]
6772 runLexStage input = liftLexResult $ runParser Lexer. lexer " " input
6873 runParseStage :: MonadCompiler m => [Tokens. CToken ] -> m Ast. Program
6974 runParseStage = liftParseResult . Parse. parseTokens
7075 runTackyStage :: MonadCompiler m => Ast. Program -> m Tacky. Program
7176 runTackyStage = genTacky
72- runCodegenStage :: MonadCompiler m => Ast. Program -> m Asm. Program
73- runCodegenStage = liftCompilerEither . Codegen. gen
77+ runCodegenStage :: MonadCompiler m => Tacky. Program -> m Asm. Program
78+ runCodegenStage = return . Codegen. gen
79+ runFixupStage :: MonadCompiler m => Asm. Program -> m Asm. Program
80+ runFixupStage program = do
81+ case Replace. replacePseudos program of
82+ Left err -> throwError $ CodegenError $ " Pseudo replacement failed: " <> T. pack (show err)
83+ Right (programWithStacks, lastOffset) ->
84+ return $ Replace. fixupProgram programWithStacks lastOffset
7485 runEmitStage :: MonadCompiler m => Asm. Program -> m T. Text
7586 runEmitStage = return . Emit. emitProgram
87+ debugStage :: (Show a , MonadCompiler m ) => String -> a -> m a
88+ debugStage label x = do
89+ liftIO $ SIO. hPutStrLn SIO. stderr $ " \n === " ++ label ++ " ===\n " ++ show x
90+ liftIO $ SIO. hFlush SIO. stderr
91+ return x
7692
7793-- | Handle the result of compilation
7894handleStageResult :: MonadCompiler m => AppOptions -> StageResult -> m ()
0 commit comments