import qualified AST
import qualified Data.Text.Lazy.IO as Text
import Foreign.Ptr
+import System.IO
import LLVM.Context
import LLVM.CodeModel
import LLVM.ExecutionEngine
ast <- read <$> getContents
let mdl = buildModule "main" $
function "expr" [] float $ \_ -> build ast >>= ret
- Text.putStrLn (ppllvm mdl)
+ Text.hPutStrLn stderr (ppllvm mdl)
withContext $ \ctx ->
withMCJIT ctx Nothing Nothing Nothing Nothing $ \mcjit ->
withModuleFromAST ctx mdl $ \mdl' ->
build :: AST.Expr -> IRBuilderT ModuleBuilder Operand
build (AST.Num a) = pure $ ConstantOperand (Float (Single a))
-build (AST.Add a b) = do
+build (AST.BinOp op a b) = do
va <- build a
vb <- build b
- fadd va vb
+ let instr = case op of
+ AST.Add -> fadd
+ AST.Sub -> fsub
+ AST.Mul -> fmul
+ instr va vb