module LLVM.Internal.DataLayout where

import LLVM.Prelude

import Control.Exception
import Control.Monad.AnyCont
import Control.Monad.IO.Class

import Foreign.Ptr

import qualified LLVM.Internal.FFI.DataLayout as FFI

import LLVM.AST.DataLayout
import LLVM.DataLayout

import LLVM.Internal.Coding
import LLVM.Internal.String ()

withFFIDataLayout :: DataLayout -> (Ptr FFI.DataLayout -> IO a) -> IO a
withFFIDataLayout :: DataLayout -> (Ptr DataLayout -> IO a) -> IO a
withFFIDataLayout dl :: DataLayout
dl f :: Ptr DataLayout -> IO a
f = (AnyContT IO a -> (a -> IO a) -> IO a)
-> (a -> IO a) -> AnyContT IO a -> IO a
forall a b c. (a -> b -> c) -> b -> a -> c
flip AnyContT IO a -> (a -> IO a) -> IO a
forall (m :: * -> *) a. AnyContT m a -> forall r. (a -> m r) -> m r
runAnyContT a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (AnyContT IO a -> IO a) -> AnyContT IO a -> IO a
forall a b. (a -> b) -> a -> b
$ do
  CString
dls <- ByteString -> AnyContT IO CString
forall (e :: * -> *) h c. EncodeM e h c => h -> e c
encodeM (DataLayout -> ByteString
dataLayoutToString DataLayout
dl)
  IO a -> AnyContT IO a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO a -> AnyContT IO a) -> IO a -> AnyContT IO a
forall a b. (a -> b) -> a -> b
$ IO (Ptr DataLayout)
-> (Ptr DataLayout -> IO ()) -> (Ptr DataLayout -> IO a) -> IO a
forall a b c. IO a -> (a -> IO b) -> (a -> IO c) -> IO c
bracket (CString -> IO (Ptr DataLayout)
FFI.createDataLayout CString
dls) Ptr DataLayout -> IO ()
FFI.disposeDataLayout Ptr DataLayout -> IO a
f