Skip to content

Commit f6a7475

Browse files
committed
add new compiler passes to compiler driver pipeline
1 parent 625208a commit f6a7475

File tree

1 file changed

+22
-6
lines changed

1 file changed

+22
-6
lines changed

lib/Halcyon/Driver/Pipeline.hs

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ module Halcyon.Driver.Pipeline
88
, handleStageResult
99
) where
1010

11+
12+
import qualified System.IO as SIO
13+
14+
1115
import Halcyon.Core.Monad
1216
import qualified Halcyon.Core.Tacky as Tacky
1317
import Halcyon.Core.TackyGen
@@ -16,6 +20,7 @@ import qualified Halcyon.Frontend.Lexer as Lexer
1620
import qualified Halcyon.Frontend.Parse as Parse
1721
import qualified Halcyon.Backend.Codegen as Codegen
1822
import qualified Halcyon.Backend.Emit as Emit
23+
import qualified Halcyon.Backend.ReplacePseudos as Replace
1924
import qualified Halcyon.Core.Assembly as Asm
2025
import qualified Halcyon.Core.Ast as Ast
2126
import 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
7894
handleStageResult :: MonadCompiler m => AppOptions -> StageResult -> m ()

0 commit comments

Comments
 (0)