module Main (main) where

import qualified LLVM.ExecutionEngine as EE
import LLVM.Core

import Data.Word (Word8, Word32)


bldGreet :: CodeGenModule (Function (IO ()))
bldGreet = withStringNul "Hello, JIT!" (\greetz -> do
    puts <- newNamedFunction ExternalLinkage "puts" :: TFunction (Ptr Word8 -> IO Word32)
    func <- createFunction ExternalLinkage $ do
      _ <- call puts =<< getElementPtr0 greetz (0::Word32, ())
      ret ()
    return func)

main :: IO ()
main = do
    initializeNativeTarget
    greet <- EE.simpleFunction bldGreet
    greet
    greet
    greet