-- GENERATED by C->Haskell Compiler, version 0.28.6 Switcheroo, 25 November 2017 (Haskell)
-- Edit the ORIGNAL .chs file instead!


{-# LINE 1 "src/Foreign/CUDA/Driver/Module/Link.chs" #-}
{-# LANGUAGE BangPatterns             #-}
{-# LANGUAGE CPP                      #-}
{-# LANGUAGE EmptyDataDecls           #-}
{-# LANGUAGE ForeignFunctionInterface #-}
{-# LANGUAGE MagicHash                #-}
{-# LANGUAGE TemplateHaskell          #-}
--------------------------------------------------------------------------------
-- |
-- Module    : Foreign.CUDA.Driver.Module.Link
-- Copyright : [2009..2018] Trevor L. McDonell
-- License   : BSD
--
-- Module linking for low-level driver interface
--
-- Since CUDA-5.5
--
--------------------------------------------------------------------------------

module Foreign.CUDA.Driver.Module.Link (

  -- ** JIT module linking
  LinkState, JITOption(..), JITInputType(..),

  create, destroy, complete,
  addFile,
  addData, addDataFromPtr,

) where
import qualified Foreign.C.Types as C2HSImp
import qualified Foreign.Ptr as C2HSImp





{-# LINE 31 "src/Foreign/CUDA/Driver/Module/Link.chs" #-}


-- Friends
import Foreign.CUDA.Driver.Error
import Foreign.CUDA.Driver.Module.Base
import Foreign.CUDA.Internal.C2HS

-- System
import Control.Monad                                    ( liftM )
import Foreign
import Foreign.C
import Unsafe.Coerce

import GHC.Ptr
import Data.ByteString.Char8                            ( ByteString )
import qualified Data.ByteString.Char8                  as B


--------------------------------------------------------------------------------
-- Data Types
--------------------------------------------------------------------------------

-- |
-- A pending JIT linker state
--
newtype LinkState = LinkState { LinkState -> Ptr ()
useLinkState :: ((C2HSImp.Ptr ())) }
  deriving (Int -> LinkState -> ShowS
[LinkState] -> ShowS
LinkState -> String
(Int -> LinkState -> ShowS)
-> (LinkState -> String)
-> ([LinkState] -> ShowS)
-> Show LinkState
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [LinkState] -> ShowS
$cshowList :: [LinkState] -> ShowS
show :: LinkState -> String
$cshow :: LinkState -> String
showsPrec :: Int -> LinkState -> ShowS
$cshowsPrec :: Int -> LinkState -> ShowS
Show)


--------------------------------------------------------------------------------
-- JIT linking
--------------------------------------------------------------------------------

-- |
-- Create a pending JIT linker invocation. The returned 'LinkState' should
-- be 'destroy'ed once no longer needed. The device code machine size will
-- match the calling application.
--
-- Requires CUDA-5.5.
--
-- <http://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__MODULE.html#group__CUDA__MODULE_1g86ca4052a2fab369cb943523908aa80d>
--
{-# INLINEABLE create #-}
create :: [JITOption] -> IO LinkState
create :: [JITOption] -> IO LinkState
create ![JITOption]
options =
  let ([JITOptionInternal]
opt,[Int]
val) = [(JITOptionInternal, Int)] -> ([JITOptionInternal], [Int])
forall a b. [(a, b)] -> ([a], [b])
unzip ([(JITOptionInternal, Int)] -> ([JITOptionInternal], [Int]))
-> [(JITOptionInternal, Int)] -> ([JITOptionInternal], [Int])
forall a b. (a -> b) -> a -> b
$ (JITOption -> (JITOptionInternal, Int))
-> [JITOption] -> [(JITOptionInternal, Int)]
forall a b. (a -> b) -> [a] -> [b]
map JITOption -> (JITOptionInternal, Int)
jitOptionUnpack [JITOption]
options
  in
  [CInt] -> (Ptr CInt -> IO LinkState) -> IO LinkState
forall a b. Storable a => [a] -> (Ptr a -> IO b) -> IO b
withArray ((JITOptionInternal -> CInt) -> [JITOptionInternal] -> [CInt]
forall a b. (a -> b) -> [a] -> [b]
map JITOptionInternal -> CInt
forall e i. (Enum e, Integral i) => e -> i
cFromEnum [JITOptionInternal]
opt)    ((Ptr CInt -> IO LinkState) -> IO LinkState)
-> (Ptr CInt -> IO LinkState) -> IO LinkState
forall a b. (a -> b) -> a -> b
$ \Ptr CInt
p_opts ->
  [Ptr ()] -> (Ptr (Ptr ()) -> IO LinkState) -> IO LinkState
forall a b. Storable a => [a] -> (Ptr a -> IO b) -> IO b
withArray ((Int -> Ptr ()) -> [Int] -> [Ptr ()]
forall a b. (a -> b) -> [a] -> [b]
map Int -> Ptr ()
forall a b. a -> b
unsafeCoerce [Int]
val) ((Ptr (Ptr ()) -> IO LinkState) -> IO LinkState)
-> (Ptr (Ptr ()) -> IO LinkState) -> IO LinkState
forall a b. (a -> b) -> a -> b
$ \Ptr (Ptr ())
p_vals ->
    (Status, LinkState) -> IO LinkState
forall a. (Status, a) -> IO a
resultIfOk ((Status, LinkState) -> IO LinkState)
-> IO (Status, LinkState) -> IO LinkState
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Int -> Ptr CInt -> Ptr (Ptr ()) -> IO (Status, LinkState)
cuLinkCreate ([JITOptionInternal] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [JITOptionInternal]
opt) Ptr CInt
p_opts Ptr (Ptr ())
p_vals

{-# INLINE cuLinkCreate #-}
cuLinkCreate :: (Int) -> (Ptr CInt) -> (Ptr (Ptr ())) -> IO ((Status), (LinkState))
cuLinkCreate :: Int -> Ptr CInt -> Ptr (Ptr ()) -> IO (Status, LinkState)
cuLinkCreate Int
a1 Ptr CInt
a2 Ptr (Ptr ())
a3 =
  let {a1' :: CUInt
a1' = Int -> CUInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
a1} in 
  let {a2' :: Ptr CInt
a2' = Ptr CInt -> Ptr CInt
forall a. a -> a
id Ptr CInt
a2} in 
  let {a3' :: Ptr (Ptr ())
a3' = Ptr (Ptr ()) -> Ptr (Ptr ())
forall a. a -> a
id Ptr (Ptr ())
a3} in 
  (Ptr (Ptr ()) -> IO (Status, LinkState)) -> IO (Status, LinkState)
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr (Ptr ()) -> IO (Status, LinkState))
 -> IO (Status, LinkState))
-> (Ptr (Ptr ()) -> IO (Status, LinkState))
-> IO (Status, LinkState)
forall a b. (a -> b) -> a -> b
$ \Ptr (Ptr ())
a4' -> 
  CUInt -> Ptr CInt -> Ptr (Ptr ()) -> Ptr (Ptr ()) -> IO CInt
cuLinkCreate'_ CUInt
a1' Ptr CInt
a2' Ptr (Ptr ())
a3' Ptr (Ptr ())
a4' IO CInt
-> (CInt -> IO (Status, LinkState)) -> IO (Status, LinkState)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \CInt
res ->
  let {res' :: Status
res' = CInt -> Status
forall i e. (Integral i, Enum e) => i -> e
cToEnum CInt
res} in
  Ptr (Ptr ()) -> IO LinkState
peekLS  Ptr (Ptr ())
a4'IO LinkState
-> (LinkState -> IO (Status, LinkState)) -> IO (Status, LinkState)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \LinkState
a4'' -> 
  (Status, LinkState) -> IO (Status, LinkState)
forall (m :: * -> *) a. Monad m => a -> m a
return (Status
res', LinkState
a4'')

{-# LINE 94 "src/Foreign/CUDA/Driver/Module/Link.chs" #-}

  where
    peekLS :: Ptr (Ptr ()) -> IO LinkState
peekLS = (Ptr () -> LinkState) -> IO (Ptr ()) -> IO LinkState
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM Ptr () -> LinkState
LinkState (IO (Ptr ()) -> IO LinkState)
-> (Ptr (Ptr ()) -> IO (Ptr ())) -> Ptr (Ptr ()) -> IO LinkState
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ptr (Ptr ()) -> IO (Ptr ())
forall a. Storable a => Ptr a -> IO a
peek


-- |
-- Destroy the state of a JIT linker invocation.
--
-- Requires CUDA-5.5.
--
-- <http://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__MODULE.html#group__CUDA__MODULE_1g01b7ae2a34047b05716969af245ce2d9>
--
{-# INLINEABLE destroy #-}
destroy :: LinkState -> IO ()
destroy :: LinkState -> IO ()
destroy !LinkState
s = Status -> IO ()
nothingIfOk (Status -> IO ()) -> IO Status -> IO ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< LinkState -> IO Status
cuLinkDestroy LinkState
s

{-# INLINE cuLinkDestroy #-}
cuLinkDestroy :: (LinkState) -> IO ((Status))
cuLinkDestroy :: LinkState -> IO Status
cuLinkDestroy LinkState
a1 =
  let {a1' :: Ptr ()
a1' = LinkState -> Ptr ()
useLinkState LinkState
a1} in 
  Ptr () -> IO CInt
cuLinkDestroy'_ Ptr ()
a1' IO CInt -> (CInt -> IO Status) -> IO Status
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \CInt
res ->
  let {res' :: Status
res' = CInt -> Status
forall i e. (Integral i, Enum e) => i -> e
cToEnum CInt
res} in
  Status -> IO Status
forall (m :: * -> *) a. Monad m => a -> m a
return (Status
res')

{-# LINE 117 "src/Foreign/CUDA/Driver/Module/Link.chs" #-}



-- |
-- Complete a pending linker invocation and load the current module. The
-- link state will be destroyed.
--
-- Requires CUDA-5.5.
--
-- <http://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__MODULE.html#group__CUDA__MODULE_1g818fcd84a4150a997c0bba76fef4e716>
--
{-# INLINEABLE complete #-}
complete :: LinkState -> IO Module
complete :: LinkState -> IO Module
complete !LinkState
ls = do
  Ptr ()
cubin <- (Status, Ptr ()) -> IO (Ptr ())
forall a. (Status, a) -> IO a
resultIfOk ((Status, Ptr ()) -> IO (Ptr ()))
-> IO (Status, Ptr ()) -> IO (Ptr ())
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< LinkState -> Ptr Int -> IO (Status, Ptr ())
cuLinkComplete LinkState
ls Ptr Int
forall a. Ptr a
nullPtr
  Module
mdl   <- Ptr Word8 -> IO Module
loadDataFromPtr (Ptr () -> Ptr Word8
forall a b. Ptr a -> Ptr b
castPtr Ptr ()
cubin)
  LinkState -> IO ()
destroy LinkState
ls
  Module -> IO Module
forall (m :: * -> *) a. Monad m => a -> m a
return Module
mdl

{-# INLINE cuLinkComplete #-}
cuLinkComplete :: (LinkState) -> (Ptr Int) -> IO ((Status), (Ptr ()))
cuLinkComplete :: LinkState -> Ptr Int -> IO (Status, Ptr ())
cuLinkComplete LinkState
a1 Ptr Int
a3 =
  let {a1' :: Ptr ()
a1' = LinkState -> Ptr ()
useLinkState LinkState
a1} in 
  (Ptr (Ptr ()) -> IO (Status, Ptr ())) -> IO (Status, Ptr ())
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr (Ptr ()) -> IO (Status, Ptr ())) -> IO (Status, Ptr ()))
-> (Ptr (Ptr ()) -> IO (Status, Ptr ())) -> IO (Status, Ptr ())
forall a b. (a -> b) -> a -> b
$ \Ptr (Ptr ())
a2' -> 
  let {a3' :: Ptr b
a3' = Ptr Int -> Ptr b
forall a b. Ptr a -> Ptr b
castPtr Ptr Int
a3} in 
  Ptr () -> Ptr (Ptr ()) -> Ptr CULong -> IO CInt
cuLinkComplete'_ Ptr ()
a1' Ptr (Ptr ())
a2' Ptr CULong
forall a. Ptr a
a3' IO CInt -> (CInt -> IO (Status, Ptr ())) -> IO (Status, Ptr ())
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \CInt
res ->
  let {res' :: Status
res' = CInt -> Status
forall i e. (Integral i, Enum e) => i -> e
cToEnum CInt
res} in
  Ptr (Ptr ()) -> IO (Ptr ())
forall a. Storable a => Ptr a -> IO a
peek  Ptr (Ptr ())
a2'IO (Ptr ())
-> (Ptr () -> IO (Status, Ptr ())) -> IO (Status, Ptr ())
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Ptr ()
a2'' -> 
  (Status, Ptr ()) -> IO (Status, Ptr ())
forall (m :: * -> *) a. Monad m => a -> m a
return (Status
res', Ptr ()
a2'')

{-# LINE 146 "src/Foreign/CUDA/Driver/Module/Link.chs" #-}



-- |
-- Add an input file to a pending linker invocation.
--
-- Requires CUDA-5.5.
--
-- <http://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__MODULE.html#group__CUDA__MODULE_1g1224c0fd48d4a683f3ce19997f200a8c>
--
{-# INLINEABLE addFile #-}
addFile :: LinkState -> FilePath -> JITInputType -> [JITOption] -> IO ()
addFile :: LinkState -> String -> JITInputType -> [JITOption] -> IO ()
addFile !LinkState
ls !String
fp !JITInputType
t ![JITOption]
options =
  let ([JITOptionInternal]
opt,[Int]
val) = [(JITOptionInternal, Int)] -> ([JITOptionInternal], [Int])
forall a b. [(a, b)] -> ([a], [b])
unzip ([(JITOptionInternal, Int)] -> ([JITOptionInternal], [Int]))
-> [(JITOptionInternal, Int)] -> ([JITOptionInternal], [Int])
forall a b. (a -> b) -> a -> b
$ (JITOption -> (JITOptionInternal, Int))
-> [JITOption] -> [(JITOptionInternal, Int)]
forall a b. (a -> b) -> [a] -> [b]
map JITOption -> (JITOptionInternal, Int)
jitOptionUnpack [JITOption]
options
  in
  [CInt] -> (Int -> Ptr CInt -> IO ()) -> IO ()
forall a b. Storable a => [a] -> (Int -> Ptr a -> IO b) -> IO b
withArrayLen ((JITOptionInternal -> CInt) -> [JITOptionInternal] -> [CInt]
forall a b. (a -> b) -> [a] -> [b]
map JITOptionInternal -> CInt
forall e i. (Enum e, Integral i) => e -> i
cFromEnum [JITOptionInternal]
opt)    ((Int -> Ptr CInt -> IO ()) -> IO ())
-> (Int -> Ptr CInt -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Int
i Ptr CInt
p_opts ->
  [Ptr ()] -> (Ptr (Ptr ()) -> IO ()) -> IO ()
forall a b. Storable a => [a] -> (Ptr a -> IO b) -> IO b
withArray    ((Int -> Ptr ()) -> [Int] -> [Ptr ()]
forall a b. (a -> b) -> [a] -> [b]
map Int -> Ptr ()
forall a b. a -> b
unsafeCoerce [Int]
val) ((Ptr (Ptr ()) -> IO ()) -> IO ())
-> (Ptr (Ptr ()) -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \  Ptr (Ptr ())
p_vals ->
    Status -> IO ()
nothingIfOk (Status -> IO ()) -> IO Status -> IO ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< LinkState
-> JITInputType
-> String
-> Int
-> Ptr CInt
-> Ptr (Ptr ())
-> IO Status
cuLinkAddFile LinkState
ls JITInputType
t String
fp Int
i Ptr CInt
p_opts Ptr (Ptr ())
p_vals

{-# INLINE cuLinkAddFile #-}
cuLinkAddFile :: (LinkState) -> (JITInputType) -> (FilePath) -> (Int) -> (Ptr CInt) -> (Ptr (Ptr ())) -> IO ((Status))
cuLinkAddFile :: LinkState
-> JITInputType
-> String
-> Int
-> Ptr CInt
-> Ptr (Ptr ())
-> IO Status
cuLinkAddFile LinkState
a1 JITInputType
a2 String
a3 Int
a4 Ptr CInt
a5 Ptr (Ptr ())
a6 =
  let {a1' :: Ptr ()
a1' = LinkState -> Ptr ()
useLinkState LinkState
a1} in 
  let {a2' :: CInt
a2' = JITInputType -> CInt
forall e i. (Enum e, Integral i) => e -> i
cFromEnum JITInputType
a2} in 
  String -> (CString -> IO Status) -> IO Status
forall a. String -> (CString -> IO a) -> IO a
withCString String
a3 ((CString -> IO Status) -> IO Status)
-> (CString -> IO Status) -> IO Status
forall a b. (a -> b) -> a -> b
$ \CString
a3' -> 
  let {a4' :: CUInt
a4' = Int -> CUInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
a4} in 
  let {a5' :: Ptr CInt
a5' = Ptr CInt -> Ptr CInt
forall a. a -> a
id Ptr CInt
a5} in 
  let {a6' :: Ptr (Ptr ())
a6' = Ptr (Ptr ()) -> Ptr (Ptr ())
forall a. a -> a
id Ptr (Ptr ())
a6} in 
  Ptr ()
-> CInt -> CString -> CUInt -> Ptr CInt -> Ptr (Ptr ()) -> IO CInt
cuLinkAddFile'_ Ptr ()
a1' CInt
a2' CString
a3' CUInt
a4' Ptr CInt
a5' Ptr (Ptr ())
a6' IO CInt -> (CInt -> IO Status) -> IO Status
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \CInt
res ->
  let {res' :: Status
res' = CInt -> Status
forall i e. (Integral i, Enum e) => i -> e
cToEnum CInt
res} in
  Status -> IO Status
forall (m :: * -> *) a. Monad m => a -> m a
return (Status
res')

{-# LINE 178 "src/Foreign/CUDA/Driver/Module/Link.chs" #-}



-- |
-- Add an input to a pending linker invocation.
--
-- Requires CUDA-5.5.
--
-- <http://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__MODULE.html#group__CUDA__MODULE_1g3ebcd2ccb772ba9c120937a2d2831b77>
--
{-# INLINEABLE addData #-}
addData :: LinkState -> ByteString -> JITInputType -> [JITOption] -> IO ()
addData :: LinkState -> ByteString -> JITInputType -> [JITOption] -> IO ()
addData !LinkState
ls !ByteString
img !JITInputType
k ![JITOption]
options =
  ByteString -> (CStringLen -> IO ()) -> IO ()
forall a. ByteString -> (CStringLen -> IO a) -> IO a
B.useAsCStringLen ByteString
img (\(CString
p, Int
n) -> LinkState
-> Int -> Ptr Word8 -> JITInputType -> [JITOption] -> IO ()
addDataFromPtr LinkState
ls Int
n (CString -> Ptr Word8
forall a b. Ptr a -> Ptr b
castPtr CString
p) JITInputType
k [JITOption]
options)

-- |
-- As 'addData', but read the specified number of bytes of image data from
-- the given pointer.
--
{-# INLINEABLE addDataFromPtr #-}
addDataFromPtr :: LinkState -> Int -> Ptr Word8 -> JITInputType -> [JITOption] -> IO ()
addDataFromPtr :: LinkState
-> Int -> Ptr Word8 -> JITInputType -> [JITOption] -> IO ()
addDataFromPtr !LinkState
ls !Int
n !Ptr Word8
img !JITInputType
t ![JITOption]
options =
  let ([JITOptionInternal]
opt,[Int]
val) = [(JITOptionInternal, Int)] -> ([JITOptionInternal], [Int])
forall a b. [(a, b)] -> ([a], [b])
unzip ([(JITOptionInternal, Int)] -> ([JITOptionInternal], [Int]))
-> [(JITOptionInternal, Int)] -> ([JITOptionInternal], [Int])
forall a b. (a -> b) -> a -> b
$ (JITOption -> (JITOptionInternal, Int))
-> [JITOption] -> [(JITOptionInternal, Int)]
forall a b. (a -> b) -> [a] -> [b]
map JITOption -> (JITOptionInternal, Int)
jitOptionUnpack [JITOption]
options
      name :: Ptr a
name      = Addr# -> Ptr a
forall a. Addr# -> Ptr a
Ptr Addr#
"<unknown>"#
  in
  [CInt] -> (Int -> Ptr CInt -> IO ()) -> IO ()
forall a b. Storable a => [a] -> (Int -> Ptr a -> IO b) -> IO b
withArrayLen ((JITOptionInternal -> CInt) -> [JITOptionInternal] -> [CInt]
forall a b. (a -> b) -> [a] -> [b]
map JITOptionInternal -> CInt
forall e i. (Enum e, Integral i) => e -> i
cFromEnum [JITOptionInternal]
opt)    ((Int -> Ptr CInt -> IO ()) -> IO ())
-> (Int -> Ptr CInt -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Int
i Ptr CInt
p_opts ->
  [Ptr ()] -> (Ptr (Ptr ()) -> IO ()) -> IO ()
forall a b. Storable a => [a] -> (Ptr a -> IO b) -> IO b
withArray    ((Int -> Ptr ()) -> [Int] -> [Ptr ()]
forall a b. (a -> b) -> [a] -> [b]
map Int -> Ptr ()
forall a b. a -> b
unsafeCoerce [Int]
val) ((Ptr (Ptr ()) -> IO ()) -> IO ())
-> (Ptr (Ptr ()) -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \  Ptr (Ptr ())
p_vals ->
    Status -> IO ()
nothingIfOk (Status -> IO ()) -> IO Status -> IO ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< LinkState
-> JITInputType
-> Ptr Word8
-> Int
-> CString
-> Int
-> Ptr CInt
-> Ptr (Ptr ())
-> IO Status
cuLinkAddData LinkState
ls JITInputType
t Ptr Word8
img Int
n CString
forall a. Ptr a
name Int
i Ptr CInt
p_opts Ptr (Ptr ())
p_vals

{-# INLINE cuLinkAddData #-}
cuLinkAddData :: (LinkState) -> (JITInputType) -> (Ptr Word8) -> (Int) -> (Ptr CChar) -> (Int) -> (Ptr CInt) -> (Ptr (Ptr ())) -> IO ((Status))
cuLinkAddData :: LinkState
-> JITInputType
-> Ptr Word8
-> Int
-> CString
-> Int
-> Ptr CInt
-> Ptr (Ptr ())
-> IO Status
cuLinkAddData LinkState
a1 JITInputType
a2 Ptr Word8
a3 Int
a4 CString
a5 Int
a6 Ptr CInt
a7 Ptr (Ptr ())
a8 =
  let {a1' :: Ptr ()
a1' = LinkState -> Ptr ()
useLinkState LinkState
a1} in 
  let {a2' :: CInt
a2' = JITInputType -> CInt
forall e i. (Enum e, Integral i) => e -> i
cFromEnum JITInputType
a2} in 
  let {a3' :: Ptr b
a3' = Ptr Word8 -> Ptr b
forall a b. Ptr a -> Ptr b
castPtr Ptr Word8
a3} in 
  let {a4' :: CULong
a4' = Int -> CULong
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
a4} in 
  let {a5' :: CString
a5' = CString -> CString
forall a. a -> a
id CString
a5} in 
  let {a6' :: CUInt
a6' = Int -> CUInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
a6} in 
  let {a7' :: Ptr CInt
a7' = Ptr CInt -> Ptr CInt
forall a. a -> a
id Ptr CInt
a7} in 
  let {a8' :: Ptr (Ptr ())
a8' = Ptr (Ptr ()) -> Ptr (Ptr ())
forall a. a -> a
id Ptr (Ptr ())
a8} in 
  Ptr ()
-> CInt
-> Ptr ()
-> CULong
-> CString
-> CUInt
-> Ptr CInt
-> Ptr (Ptr ())
-> IO CInt
cuLinkAddData'_ Ptr ()
a1' CInt
a2' Ptr ()
forall a. Ptr a
a3' CULong
a4' CString
a5' CUInt
a6' Ptr CInt
a7' Ptr (Ptr ())
a8' IO CInt -> (CInt -> IO Status) -> IO Status
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \CInt
res ->
  let {res' :: Status
res' = CInt -> Status
forall i e. (Integral i, Enum e) => i -> e
cToEnum CInt
res} in
  Status -> IO Status
forall (m :: * -> *) a. Monad m => a -> m a
return (Status
res')

{-# LINE 226 "src/Foreign/CUDA/Driver/Module/Link.chs" #-}



foreign import ccall unsafe "Foreign/CUDA/Driver/Module/Link.chs.h cuLinkCreate"
  cuLinkCreate'_ :: (C2HSImp.CUInt -> ((C2HSImp.Ptr C2HSImp.CInt) -> ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> (IO C2HSImp.CInt)))))

foreign import ccall unsafe "Foreign/CUDA/Driver/Module/Link.chs.h cuLinkDestroy"
  cuLinkDestroy'_ :: ((C2HSImp.Ptr ()) -> (IO C2HSImp.CInt))

foreign import ccall unsafe "Foreign/CUDA/Driver/Module/Link.chs.h cuLinkComplete"
  cuLinkComplete'_ :: ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> ((C2HSImp.Ptr C2HSImp.CULong) -> (IO C2HSImp.CInt))))

foreign import ccall unsafe "Foreign/CUDA/Driver/Module/Link.chs.h cuLinkAddFile"
  cuLinkAddFile'_ :: ((C2HSImp.Ptr ()) -> (C2HSImp.CInt -> ((C2HSImp.Ptr C2HSImp.CChar) -> (C2HSImp.CUInt -> ((C2HSImp.Ptr C2HSImp.CInt) -> ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> (IO C2HSImp.CInt)))))))

foreign import ccall unsafe "Foreign/CUDA/Driver/Module/Link.chs.h cuLinkAddData"
  cuLinkAddData'_ :: ((C2HSImp.Ptr ()) -> (C2HSImp.CInt -> ((C2HSImp.Ptr ()) -> (C2HSImp.CULong -> ((C2HSImp.Ptr C2HSImp.CChar) -> (C2HSImp.CUInt -> ((C2HSImp.Ptr C2HSImp.CInt) -> ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> (IO C2HSImp.CInt)))))))))