content: module LLVM.Wrapper.Target
      ( module LLVM.FFI.Target
      , TargetData
      , ByteOrdering(..)
      , byteOrder
      , copyStringRepOfTargetData
      , createTargetData
      , withTargetData
      ) where
  
  import LLVM.FFI.Target
      ( addTargetData
      , disposeTargetData
      , intPtrType
      , callFrameAlignmentOfType
      , aBIAlignmentOfType
      , aBISizeOfType
      , pointerSize
      , preferredAlignmentOfGlobal
      , preferredAlignmentOfType
      , sizeOfTypeInBits
      , storeSizeOfType
      , elementAtOffset
      , offsetOfElement
      )
  
  import qualified LLVM.FFI.Target as FFI.T
  
  import Foreign.C.String (peekCString, withCString)
  import Control.Exception (finally)
  
  type TargetData = FFI.T.TargetDataRef
  
  data ByteOrdering = BigEndian | LittleEndian deriving Eq
  
  byteOrder :: TargetData -> ByteOrdering
  byteOrder td = if FFI.T.byteOrder td == 0 then BigEndian else LittleEndian
  
  copyStringRepOfTargetData :: TargetData -> IO String
  copyStringRepOfTargetData td = do s <- FFI.T.copyStringRepOfTargetData td
                                    peekCString s
  
  createTargetData :: String -> IO TargetData
  createTargetData str = withCString str $ \p -> FFI.T.createTargetData p
  
  withTargetData :: String -> (TargetData -> IO a) -> IO a
  withTargetData str f = do t <- createTargetData str
                            finally (f t) (FFI.T.disposeTargetData t)
  