packages feed

llvm-extra-0.13.1: test/Test/Run.hs

{-# LANGUAGE ForeignFunctionInterface #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE TypeFamilies #-}
module Test.Run where

import qualified LLVM.Extra.Memory as Memory
import qualified LLVM.ExecutionEngine as EE
import qualified LLVM.Core as LLVM

import Foreign.Ptr (FunPtr)


type Importer func = FunPtr func -> func

generateFunction ::
   EE.ExecutionFunction f =>
   Importer f -> LLVM.CodeGenModule (LLVM.Function f) -> IO f
generateFunction imprt code = do
   m <- LLVM.newModule
   fn <- do
      func <- LLVM.defineModule m $ LLVM.setTarget LLVM.hostTriple >> code
      EE.runEngineAccessWithModule m $ EE.getExecutionFunction imprt func
   LLVM.writeBitcodeToFile "test-vector.bc" m
   return fn


foreign import ccall safe "dynamic" derefTestCasePtr ::
   Importer (LLVM.Ptr inp -> LLVM.Ptr out -> IO ())

modul ::
   (Memory.C linp, Memory.Struct linp ~ minp, LLVM.IsType minp,
    Memory.C lout, Memory.Struct lout ~ mout, LLVM.IsType mout) =>
   (linp -> LLVM.CodeGenFunction () lout) ->
   LLVM.CodeGenModule (LLVM.Function (LLVM.Ptr minp -> LLVM.Ptr mout -> IO ()))
modul codegen =
   LLVM.createFunction LLVM.ExternalLinkage $ \xPtr yPtr -> do
      flip Memory.store yPtr =<< codegen =<< Memory.load xPtr
      LLVM.ret ()