llvm-base-3.2.0.1: LLVM/Wrapper/Linker.hs
module LLVM.Wrapper.Linker ( LinkerMode(..)
, linkModules ) where
import qualified LLVM.FFI.Linker as FFI
import LLVM.FFI.Linker (LinkerMode(..))
import qualified LLVM.FFI.Core as FFI
import LLVM.Wrapper.Core
import LLVM.Wrapper.Internal
import Foreign.C.String (peekCString)
import Foreign.Marshal.Alloc (alloca)
import Foreign.Marshal.Utils (toBool)
import Foreign.Storable (peek)
import Foreign.ForeignPtr.Safe (withForeignPtr)
import Data.IORef
linkModules :: Module -> Module -> LinkerMode -> IO (Maybe String)
linkModules (MkModule dest _) (MkModule src srcOurs) mode =
withForeignPtr dest $ \dest' ->
withForeignPtr src $ \src' ->
alloca $ \msgPtr -> do
result <- FFI.linkModules dest' src' (FFI.fromLinkerMode mode) msgPtr
writeIORef srcOurs False
msg <- peek msgPtr
if not . toBool $ result
then return Nothing
else do str <- peekCString msg
FFI.disposeMessage msg
return (Just str)