1 {-# LANGUAGE OverloadedStrings #-}
6 import qualified Data.Text.Lazy.IO as Text
10 import LLVM.ExecutionEngine
13 import LLVM.AST.Constant
15 import LLVM.AST.Operand
19 foreign import ccall "dynamic" exprFun :: FunPtr (IO Float) -> IO Float
23 ast <- read <$> getContents
24 let mdl = buildModule "main" $
25 function "expr" [] float $ \_ -> build ast >>= ret
26 Text.putStrLn (ppllvm mdl)
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)
35 build :: AST.Expr -> IRBuilderT ModuleBuilder Operand
36 build (AST.Num a) = pure $ ConstantOperand (Float (Single a))
37 build (AST.Add a b) = do