Advertisement
Guest User

Untitled

a guest
Feb 21st, 2019
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module Koak.AST where
  2.  
  3. newtype Const = Const { fromConst :: Double }
  4.   deriving Show
  5.  
  6. newtype Var = Var { fromVar :: String }
  7.   deriving Show
  8.  
  9. data FnDef =
  10.   FnDef
  11.   { fnDefName :: String
  12.   , fnDefArgs :: [Var]
  13.   , fnDefBody :: Expr
  14.   }
  15.  
  16. data Expr
  17.   = ExprConst Const
  18.   | ExprIfThenElse Expr Expr Expr
  19.  
  20. data KDef = KDefFnDef FnDef
  21.  
  22. type Stmt = [KDef]
  23.  
  24.  
  25.  
  26.  
  27.  
  28.  
  29.  
  30. {-# LANGUAGE OverloadedStrings, RecursiveDo #-}
  31.  
  32. module Koak.AST.LLVM where
  33.  
  34. import Data.String
  35.  
  36.  -- llvm-hs-pure
  37. import qualified LLVM.AST.Constant as C ( Constant ( Float ) )
  38. import qualified LLVM.AST.Float    as F ( SomeFloat ( Double ) )
  39. import qualified LLVM.AST.Operand  as O ( Operand ( ConstantOperand ) )
  40. import LLVM.AST.Name ( Name(..) )
  41. import LLVM.AST.Type ( Type( FloatingPointType )
  42.                      , FloatingPointType ( DoubleFP )
  43.                      )
  44. import LLVM.IRBuilder.Monad
  45. import LLVM.IRBuilder.Module ( function
  46.                              , ParameterName(..)
  47.                              , buildModule
  48.                              )
  49. import LLVM.IRBuilder.Instruction ( ret, br, phi, condBr, fcmp )
  50.  
  51. import qualified LLVM.AST.FloatingPointPredicate as P
  52.  
  53. import Control.Monad.Fix
  54.  
  55. import Koak.AST
  56.  
  57. typeDouble :: Type
  58. typeDouble = FloatingPointType DoubleFP
  59.  
  60. constToOperand :: Const -> O.Operand
  61. constToOperand (Const value) = O.ConstantOperand $ C.Float $ F.Double value
  62.  
  63. -- exprToBuilder :: MonadFix m => Expr -> IRBuilderT m O.Operand
  64. exprToBuilder :: Expr -> IRBuilder O.Operand
  65. exprToBuilder (ExprConst const) = do
  66.   return $ constToOperand const
  67. exprToBuilder (ExprIfThenElse ifExpr thenExpr elseExpr) = mdo
  68.   entryBlock <- block
  69.   test <- exprToBuilder ifExpr
  70.   cond <- fcmp P.OLT test (O.ConstantOperand (C.Float $ F.Double 0))
  71.   condBr cond thenBlock elseBlock
  72.   thenBlock <- block
  73.   resThen <- exprToBuilder thenExpr
  74.   br exitBlock
  75.   elseBlock <- block
  76.   resElse <- exprToBuilder elseExpr
  77.   br exitBlock
  78.   exitBlock <- block
  79.   res <- phi [(resThen, thenBlock), (resElse, elseBlock)]
  80.   return res
  81.  
  82. -- fnDefToBuilder :: FnDef -> IRBuilder O.Operand
  83. fnDefToBuilder (FnDef name args body) = buildModule "exampleModule" $ mdo
  84.   function (stringToName name) (fmap varToParam args) typeDouble $ \arr -> do
  85.     -- block >>= br
  86.     exprToBuilder (ExprConst (Const 4)) >>= ret
  87.  
  88.  
  89. varToParam :: Var -> (Type, ParameterName)
  90. varToParam (Var name) = (typeDouble, stringToParamName name)
  91.  
  92. stringToParamName :: String -> ParameterName
  93. stringToParamName = ParameterName . fromString
  94.  
  95. stringToName :: String -> Name
  96. stringToName = Name . fromString
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement