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


{-# LINE 1 "./Foreign/NVVM/Info.chs" #-}
{-# LANGUAGE CPP             #-}
{-# LANGUAGE TemplateHaskell #-}
--------------------------------------------------------------------------------
-- |
-- Module    : Foreign.NVVM.Info
-- Copyright : [2016..2023] Trevor L. McDonell
-- License   : BSD
--
-- General information query
--
--------------------------------------------------------------------------------

module Foreign.NVVM.Info (

  nvvmVersion,
  nvvmIRVersion,

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



import Foreign.NVVM.Error
import Foreign.NVVM.Internal.C2HS
import Foreign.Marshal
import Foreign.C
import Foreign.Ptr

import Data.Version
import System.IO.Unsafe




{-# LINE 31 "./Foreign/NVVM/Info.chs" #-}



-- | Get the version of NVVM IR supported by this library. The first component
-- is the NVVM IR version, and the second the version of the debug metadata.
--
-- Requires: CUDA-7.0
--
-- <http://docs.nvidia.com/cuda/libnvvm-api/group__query.html#group__query_1g0894677934db095b3c40d4f8e2578cc5>
--
nvvmIRVersion :: (Version, Version)
nvvmIRVersion :: (Version, Version)
nvvmIRVersion = IO (Version, Version) -> (Version, Version)
forall a. IO a -> a
unsafePerformIO (IO (Version, Version) -> (Version, Version))
-> IO (Version, Version) -> (Version, Version)
forall a b. (a -> b) -> a -> b
$ do
  (Status
status, Int
r1, Int
r2, Int
d1, Int
d2) <- IO (Status, Int, Int, Int, Int)
c_nvvmIRVersion
  (Status, (Version, Version)) -> IO (Version, Version)
forall a. (Status, a) -> IO a
resultIfOk (Status
status, ([Int] -> Version
makeVersion [Int
r1,Int
r2], [Int] -> Version
makeVersion [Int
d1,Int
d2]))

c_nvvmIRVersion :: IO ((Status), (Int), (Int), (Int), (Int))
c_nvvmIRVersion :: IO (Status, Int, Int, Int, Int)
c_nvvmIRVersion =
  (Ptr CInt -> IO (Status, Int, Int, Int, Int))
-> IO (Status, Int, Int, Int, Int)
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr CInt -> IO (Status, Int, Int, Int, Int))
 -> IO (Status, Int, Int, Int, Int))
-> (Ptr CInt -> IO (Status, Int, Int, Int, Int))
-> IO (Status, Int, Int, Int, Int)
forall a b. (a -> b) -> a -> b
$ \Ptr CInt
a1' -> 
  (Ptr CInt -> IO (Status, Int, Int, Int, Int))
-> IO (Status, Int, Int, Int, Int)
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr CInt -> IO (Status, Int, Int, Int, Int))
 -> IO (Status, Int, Int, Int, Int))
-> (Ptr CInt -> IO (Status, Int, Int, Int, Int))
-> IO (Status, Int, Int, Int, Int)
forall a b. (a -> b) -> a -> b
$ \Ptr CInt
a2' -> 
  (Ptr CInt -> IO (Status, Int, Int, Int, Int))
-> IO (Status, Int, Int, Int, Int)
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr CInt -> IO (Status, Int, Int, Int, Int))
 -> IO (Status, Int, Int, Int, Int))
-> (Ptr CInt -> IO (Status, Int, Int, Int, Int))
-> IO (Status, Int, Int, Int, Int)
forall a b. (a -> b) -> a -> b
$ \Ptr CInt
a3' -> 
  (Ptr CInt -> IO (Status, Int, Int, Int, Int))
-> IO (Status, Int, Int, Int, Int)
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr CInt -> IO (Status, Int, Int, Int, Int))
 -> IO (Status, Int, Int, Int, Int))
-> (Ptr CInt -> IO (Status, Int, Int, Int, Int))
-> IO (Status, Int, Int, Int, Int)
forall a b. (a -> b) -> a -> b
$ \Ptr CInt
a4' -> 
  Ptr CInt -> Ptr CInt -> Ptr CInt -> Ptr CInt -> IO CInt
c_nvvmIRVersion'_ Ptr CInt
a1' Ptr CInt
a2' Ptr CInt
a3' Ptr CInt
a4' IO CInt
-> (CInt -> IO (Status, Int, Int, Int, Int))
-> IO (Status, Int, Int, Int, Int)
forall a b. IO a -> (a -> IO b) -> IO b
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 CInt -> IO Int
forall a b. (Storable a, Integral a, Integral b) => Ptr a -> IO b
peekIntConv  Ptr CInt
a1'IO Int
-> (Int -> IO (Status, Int, Int, Int, Int))
-> IO (Status, Int, Int, Int, Int)
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Int
a1'' -> 
  Ptr CInt -> IO Int
forall a b. (Storable a, Integral a, Integral b) => Ptr a -> IO b
peekIntConv  Ptr CInt
a2'IO Int
-> (Int -> IO (Status, Int, Int, Int, Int))
-> IO (Status, Int, Int, Int, Int)
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Int
a2'' -> 
  Ptr CInt -> IO Int
forall a b. (Storable a, Integral a, Integral b) => Ptr a -> IO b
peekIntConv  Ptr CInt
a3'IO Int
-> (Int -> IO (Status, Int, Int, Int, Int))
-> IO (Status, Int, Int, Int, Int)
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Int
a3'' -> 
  Ptr CInt -> IO Int
forall a b. (Storable a, Integral a, Integral b) => Ptr a -> IO b
peekIntConv  Ptr CInt
a4'IO Int
-> (Int -> IO (Status, Int, Int, Int, Int))
-> IO (Status, Int, Int, Int, Int)
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Int
a4'' -> 
  (Status, Int, Int, Int, Int) -> IO (Status, Int, Int, Int, Int)
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Status
res', Int
a1'', Int
a2'', Int
a3'', Int
a4'')

{-# LINE 58 "./Foreign/NVVM/Info.chs" #-}



-- | Get the version of the NVVM library
--
-- <http://docs.nvidia.com/cuda/libnvvm-api/group__query.html#group__query_1gcdd062f26078d20ded68f1017e999246>
--
nvvmVersion :: Version
nvvmVersion :: Version
nvvmVersion = IO Version -> Version
forall a. IO a -> a
unsafePerformIO (IO Version -> Version) -> IO Version -> Version
forall a b. (a -> b) -> a -> b
$ do
  (Status
status, Int
v1, Int
v2) <- IO (Status, Int, Int)
c_nvvmVersion
  (Status, Version) -> IO Version
forall a. (Status, a) -> IO a
resultIfOk (Status
status, [Int] -> Version
makeVersion [Int
v1,Int
v2])

c_nvvmVersion :: IO ((Status), (Int), (Int))
c_nvvmVersion :: IO (Status, Int, Int)
c_nvvmVersion =
  (Ptr CInt -> IO (Status, Int, Int)) -> IO (Status, Int, Int)
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr CInt -> IO (Status, Int, Int)) -> IO (Status, Int, Int))
-> (Ptr CInt -> IO (Status, Int, Int)) -> IO (Status, Int, Int)
forall a b. (a -> b) -> a -> b
$ \Ptr CInt
a1' -> 
  (Ptr CInt -> IO (Status, Int, Int)) -> IO (Status, Int, Int)
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr CInt -> IO (Status, Int, Int)) -> IO (Status, Int, Int))
-> (Ptr CInt -> IO (Status, Int, Int)) -> IO (Status, Int, Int)
forall a b. (a -> b) -> a -> b
$ \Ptr CInt
a2' -> 
  Ptr CInt -> Ptr CInt -> IO CInt
c_nvvmVersion'_ Ptr CInt
a1' Ptr CInt
a2' IO CInt -> (CInt -> IO (Status, Int, Int)) -> IO (Status, Int, Int)
forall a b. IO a -> (a -> IO b) -> IO b
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 CInt -> IO Int
forall a b. (Storable a, Integral a, Integral b) => Ptr a -> IO b
peekIntConv  Ptr CInt
a1'IO Int -> (Int -> IO (Status, Int, Int)) -> IO (Status, Int, Int)
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Int
a1'' -> 
  Ptr CInt -> IO Int
forall a b. (Storable a, Integral a, Integral b) => Ptr a -> IO b
peekIntConv  Ptr CInt
a2'IO Int -> (Int -> IO (Status, Int, Int)) -> IO (Status, Int, Int)
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Int
a2'' -> 
  (Status, Int, Int) -> IO (Status, Int, Int)
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Status
res', Int
a1'', Int
a2'')

{-# LINE 76 "./Foreign/NVVM/Info.chs" #-}




foreign import ccall unsafe "Foreign/NVVM/Info.chs.h nvvmIRVersion"
  c_nvvmIRVersion'_ :: ((C2HSImp.Ptr C2HSImp.CInt) -> ((C2HSImp.Ptr C2HSImp.CInt) -> ((C2HSImp.Ptr C2HSImp.CInt) -> ((C2HSImp.Ptr C2HSImp.CInt) -> (IO C2HSImp.CInt)))))

foreign import ccall unsafe "Foreign/NVVM/Info.chs.h nvvmVersion"
  c_nvvmVersion'_ :: ((C2HSImp.Ptr C2HSImp.CInt) -> ((C2HSImp.Ptr C2HSImp.CInt) -> (IO C2HSImp.CInt)))