module LLVM.Internal.BasicBlock where
import LLVM.Prelude
import Control.Monad.Trans
import Foreign.Ptr
import qualified LLVM.Internal.FFI.PtrHierarchy as FFI
import qualified LLVM.Internal.FFI.BasicBlock as FFI
import qualified LLVM.Internal.FFI.Iterate as FFI
import LLVM.Internal.DecodeAST
import LLVM.Internal.Coding
import LLVM.Internal.Instruction ()
import qualified LLVM.AST.Instruction as A
getBasicBlockTerminator :: Ptr FFI.BasicBlock -> DecodeAST (DecodeAST (A.Named A.Terminator))
getBasicBlockTerminator = decodeM <=< (liftIO . FFI.getBasicBlockTerminator)
getNamedInstructions :: Ptr FFI.BasicBlock -> DecodeAST (DecodeAST [A.Named A.Instruction])
getNamedInstructions b = do
ffiInstructions <- liftIO $ FFI.getXs (FFI.getFirstInstruction b) FFI.getNextInstruction
let n = length ffiInstructions
liftM sequence . forM (take (n1) ffiInstructions) $ decodeM