module LLVM.Wrapper.Analysis where

import qualified LLVM.FFI.Analysis as FFI
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)

-- VerifierFailureAction 2 is 'no side effects'
verifyFunction :: Value -> IO Bool
verifyFunction f = fmap toBool $ FFI.verifyFunction f 2

verifyModule :: Module -> IO (Maybe String)
verifyModule (MkModule m _) =
    alloca $ \msgPtr -> do
               result <- withForeignPtr m (\m' -> FFI.verifyModule m' 2 msgPtr)
               msg <- peek msgPtr
               if not . toBool $ result
                 then return Nothing
                 else do str <- peekCString msg
                         FFI.disposeMessage msg
                         return $ Just str