module Main (main) where

import LLVM.Core
import LLVM.FFI.Core (CallingConvention(GHC))

import Data.Word (Word32)


-- Our module will have these two functions.
data Mod = Mod {
    m1 :: Function (Word32 -> IO Word32),
    m2 :: Function (Word32 -> Word32 -> IO Word32)
    }

main :: IO ()
main = do
    m <- newModule
    _fns <- defineModule m $ setTarget hostTriple >> buildMod
    --_ <- optimizeModule 3 m
    writeBitcodeToFile "CallConv.bc" m
    return ()

buildMod :: CodeGenModule Mod
buildMod = do
    mod2 <- createNamedFunction InternalLinkage "plus" $ \ x y -> do
      r <- add x y
      ret r
    setFuncCallConv mod2 GHC
    mod1 <- newNamedFunction ExternalLinkage "test"
    defineFunction mod1 $ \ arg -> do
      r <- callWithConv GHC mod2 arg (valueOf 1)
      ret r
    return $ Mod {m1 = mod1, m2 = mod2}
