37c6cbc788a9849ef721995f58b9c1191ba0385d
[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 LLVM.Context
9 import LLVM.CodeModel
10 import LLVM.ExecutionEngine
11 import LLVM.Module
12 import LLVM.IRBuilder
13 import LLVM.AST.Constant
14 import LLVM.AST.Float
15 import LLVM.AST.Operand
16 import LLVM.AST.Type
17 import LLVM.Pretty
18
19 foreign import ccall "dynamic" exprFun :: FunPtr (IO Float) -> IO Float
20
21 main :: IO ()
22 main = do
23   ast <- read <$> getContents
24   let mdl = buildModule "main" $
25         function "expr" [] float $ \_ -> build ast >>= ret
26   Text.putStrLn (ppllvm mdl)
27   withContext $ \ctx ->
28     withMCJIT ctx Nothing Nothing Nothing Nothing $ \mcjit ->
29       withModuleFromAST ctx mdl $ \mdl' ->
30         withModuleInEngine mcjit mdl' $ \emdl -> do
31           Just f <- getFunction emdl "expr"
32           let f' = castFunPtr f :: FunPtr (IO Float)
33           exprFun f' >>= print
34
35 build :: AST.Expr -> IRBuilderT ModuleBuilder Operand
36 build (AST.Num a) = pure $ ConstantOperand (Float (Single a))
37 build (AST.Add a b) = do
38   va <- build a
39   vb <- build b
40   fadd va vb