2d838d339da3d1a04c5354fc8e920085aa565d0e
[kaleidoscope-hs-old.git] / Main.hs
1 {-# LANGUAGE OverloadedStrings #-}
2
3 module Main where
4
5 import qualified AST
6 import qualified Data.Text.Lazy.IO as Text
7 import Foreign.Ptr
8 import System.IO
9 import LLVM.Context
10 import LLVM.CodeModel
11 import LLVM.ExecutionEngine
12 import LLVM.Module
13 import LLVM.IRBuilder
14 import LLVM.AST.Constant
15 import LLVM.AST.Float
16 import LLVM.AST.Operand
17 import LLVM.AST.Type
18 import LLVM.Pretty
19
20 foreign import ccall "dynamic" exprFun :: FunPtr (IO Float) -> IO Float
21
22 main :: IO ()
23 main = do
24   ast <- read <$> getContents
25   let mdl = buildModule "main" $
26         function "expr" [] float $ \_ -> build ast >>= ret
27   Text.hPutStrLn stderr (ppllvm mdl)
28   withContext $ \ctx ->
29     withMCJIT ctx Nothing Nothing Nothing Nothing $ \mcjit ->
30       withModuleFromAST ctx mdl $ \mdl' ->
31         withModuleInEngine mcjit mdl' $ \emdl -> do
32           Just f <- getFunction emdl "expr"
33           let f' = castFunPtr f :: FunPtr (IO Float)
34           exprFun f' >>= print
35
36 build :: AST.Expr -> IRBuilderT ModuleBuilder Operand
37 build (AST.Num a) = pure $ ConstantOperand (Float (Single a))
38 build (AST.Add a b) = do
39   va <- build a
40   vb <- build b
41   fadd va vb