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 ()