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)