content: {-# LANGUAGE ForeignFunctionInterface #-}
  {-# LANGUAGE ViewPatterns #-}
  
  module LLVM.Internal.FFI.Builder where
  
  import LLVM.Prelude
  
  import Foreign.Ptr
  import Foreign.C
  import GHC.Stack
  
  import qualified Data.List as List
  import qualified Data.Map as Map
  
  import qualified LLVM.AST.Instruction as A
  import LLVM.Internal.InstructionDefs as ID
  
  import LLVM.Internal.FFI.Context
  import LLVM.Internal.FFI.LLVMCTypes
  import LLVM.Internal.FFI.PtrHierarchy
  
  data Builder
  
  foreign import ccall unsafe "LLVMCreateBuilderInContext" createBuilderInContext ::
    Ptr Context -> IO (Ptr Builder)
  
  foreign import ccall unsafe "LLVMDisposeBuilder" disposeBuilder ::
    Ptr Builder -> IO ()
  
  foreign import ccall unsafe "LLVMPositionBuilderAtEnd" positionBuilderAtEnd ::
    Ptr Builder -> Ptr BasicBlock -> IO ()
  
  foreign import ccall unsafe "LLVMBuildRet" buildRet ::
    Ptr Builder -> Ptr Value -> IO (Ptr Instruction)
  
  foreign import ccall unsafe "LLVMBuildBr" buildBr ::
    Ptr Builder -> Ptr BasicBlock -> IO (Ptr Instruction)
  
  foreign import ccall unsafe "LLVMBuildCondBr" buildCondBr ::
    Ptr Builder -> Ptr Value -> Ptr BasicBlock -> Ptr BasicBlock -> IO (Ptr Instruction)
  
  foreign import ccall unsafe "LLVMBuildSwitch" buildSwitch ::
    Ptr Builder -> Ptr Value -> Ptr BasicBlock -> CUInt -> IO (Ptr Instruction)
  
  foreign import ccall unsafe "LLVMBuildIndirectBr" buildIndirectBr ::
    Ptr Builder -> Ptr Value -> CUInt -> IO (Ptr Instruction)
  
  foreign import ccall unsafe "LLVMBuildInvoke" buildInvoke ::
    Ptr Builder -> Ptr Value -> Ptr (Ptr Value) -> CUInt
                -> Ptr BasicBlock -> Ptr BasicBlock -> CString -> IO (Ptr Instruction)
  
  foreign import ccall unsafe "LLVMBuildResume" buildResume ::
    Ptr Builder -> Ptr Value -> IO (Ptr Instruction)
  
  foreign import ccall unsafe "LLVMBuildUnreachable" buildUnreachable ::
    Ptr Builder -> IO (Ptr Instruction)
  
  foreign import ccall unsafe "LLVM_Hs_BuildCleanupRet" buildCleanupRet ::
    Ptr Builder -> Ptr Value -> Ptr BasicBlock -> IO (Ptr Instruction)
  
  foreign import ccall unsafe "LLVM_Hs_BuildCatchRet" buildCatchRet ::
    Ptr Builder -> Ptr Value -> Ptr BasicBlock -> IO (Ptr Instruction)
  
  foreign import ccall unsafe "LLVM_Hs_BuildCatchSwitch" buildCatchSwitch ::
    Ptr Builder -> Ptr Value -> Ptr BasicBlock -> CUInt -> IO (Ptr Instruction)
  
  foreign import ccall unsafe "LLVM_Hs_BuildAdd" buildAdd ::
    Ptr Builder -> LLVMBool -> LLVMBool -> Ptr Value -> Ptr Value -> CString -> IO (Ptr BinaryOperator)
  
  foreign import ccall unsafe "LLVM_Hs_BuildMul" buildMul ::
    Ptr Builder -> LLVMBool -> LLVMBool -> Ptr Value -> Ptr Value -> CString -> IO (Ptr BinaryOperator)
  
  foreign import ccall unsafe "LLVM_Hs_BuildShl" buildShl ::
    Ptr Builder -> LLVMBool -> LLVMBool -> Ptr Value -> Ptr Value -> CString -> IO (Ptr BinaryOperator)
  
  foreign import ccall unsafe "LLVM_Hs_BuildSub" buildSub ::
    Ptr Builder -> LLVMBool -> LLVMBool -> Ptr Value -> Ptr Value -> CString -> IO (Ptr BinaryOperator)
  
  foreign import ccall unsafe "LLVM_Hs_BuildUDiv" buildUDiv ::
    Ptr Builder -> LLVMBool -> Ptr Value -> Ptr Value -> CString -> IO (Ptr BinaryOperator)
  
  foreign import ccall unsafe "LLVM_Hs_BuildSDiv" buildSDiv ::
    Ptr Builder -> LLVMBool -> Ptr Value -> Ptr Value -> CString -> IO (Ptr BinaryOperator)
  
  foreign import ccall unsafe "LLVM_Hs_BuildLShr" buildLShr ::
    Ptr Builder -> LLVMBool -> Ptr Value -> Ptr Value -> CString -> IO (Ptr BinaryOperator)
  
  foreign import ccall unsafe "LLVM_Hs_BuildAShr" buildAShr ::
    Ptr Builder -> LLVMBool -> Ptr Value -> Ptr Value -> CString -> IO (Ptr BinaryOperator)
  
  foreign import ccall unsafe "LLVM_Hs_BuildAddrSpaceCast" buildAddrSpaceCast ::
    Ptr Builder -> Ptr Value -> Ptr Type -> CString -> IO (Ptr Instruction)
  
  foreign import ccall unsafe "LLVM_Hs_BuildBitCast" buildBitCast ::
    Ptr Builder -> Ptr Value -> Ptr Type -> CString -> IO (Ptr Instruction)
  
  foreign import ccall unsafe "LLVM_Hs_BuildFPExt" buildFPExt ::
    Ptr Builder -> Ptr Value -> Ptr Type -> CString -> IO (Ptr Instruction)
  
  foreign import ccall unsafe "LLVM_Hs_BuildFPToSI" buildFPToSI ::
    Ptr Builder -> Ptr Value -> Ptr Type -> CString -> IO (Ptr Instruction)
  
  foreign import ccall unsafe "LLVM_Hs_BuildFPToUI" buildFPToUI ::
    Ptr Builder -> Ptr Value -> Ptr Type -> CString -> IO (Ptr Instruction)
  
  foreign import ccall unsafe "LLVM_Hs_BuildFPTrunc" buildFPTrunc ::
    Ptr Builder -> Ptr Value -> Ptr Type -> CString -> IO (Ptr Instruction)
  
  foreign import ccall unsafe "LLVM_Hs_BuildIntToPtr" buildIntToPtr ::
    Ptr Builder -> Ptr Value -> Ptr Type -> CString -> IO (Ptr Instruction)
  
  foreign import ccall unsafe "LLVM_Hs_BuildPtrToInt" buildPtrToInt ::
    Ptr Builder -> Ptr Value -> Ptr Type -> CString -> IO (Ptr Instruction)
  
  foreign import ccall unsafe "LLVM_Hs_BuildSExt" buildSExt ::
    Ptr Builder -> Ptr Value -> Ptr Type -> CString -> IO (Ptr Instruction)
  
  foreign import ccall unsafe "LLVM_Hs_BuildSIToFP" buildSIToFP ::
    Ptr Builder -> Ptr Value -> Ptr Type -> CString -> IO (Ptr Instruction)
  
  foreign import ccall unsafe "LLVM_Hs_BuildTrunc" buildTrunc ::
    Ptr Builder -> Ptr Value -> Ptr Type -> CString -> IO (Ptr Instruction)
  
  foreign import ccall unsafe "LLVM_Hs_BuildUIToFP" buildUIToFP ::
    Ptr Builder -> Ptr Value -> Ptr Type -> CString -> IO (Ptr Instruction)
  
  foreign import ccall unsafe "LLVM_Hs_BuildZExt" buildZExt ::
    Ptr Builder -> Ptr Value -> Ptr Type -> CString -> IO (Ptr Instruction)
  
  foreign import ccall unsafe "LLVM_Hs_BuildAnd" buildAnd ::
    Ptr Builder -> Ptr Value -> Ptr Value -> CString -> IO (Ptr BinaryOperator)
  
  foreign import ccall unsafe "LLVM_Hs_BuildOr" buildOr ::
    Ptr Builder -> Ptr Value -> Ptr Value -> CString -> IO (Ptr BinaryOperator)
  
  foreign import ccall unsafe "LLVM_Hs_BuildSRem" buildSRem ::
    Ptr Builder -> Ptr Value -> Ptr Value -> CString -> IO (Ptr BinaryOperator)
  
  foreign import ccall unsafe "LLVM_Hs_BuildURem" buildURem ::
    Ptr Builder -> Ptr Value -> Ptr Value -> CString -> IO (Ptr BinaryOperator)
  
  foreign import ccall unsafe "LLVM_Hs_BuildXor" buildXor ::
    Ptr Builder -> Ptr Value -> Ptr Value -> CString -> IO (Ptr BinaryOperator)
  
  foreign import ccall unsafe "LLVM_Hs_BuildFNeg" buildFNeg ::
    Ptr Builder -> Ptr Value -> CString -> IO (Ptr UnaryOperator)
  
  foreign import ccall unsafe "LLVM_Hs_BuildFAdd" buildFAdd ::
    Ptr Builder -> Ptr Value -> Ptr Value -> CString -> IO (Ptr BinaryOperator)
  
  foreign import ccall unsafe "LLVM_Hs_BuildFDiv" buildFDiv ::
    Ptr Builder -> Ptr Value -> Ptr Value -> CString -> IO (Ptr BinaryOperator)
  
  foreign import ccall unsafe "LLVM_Hs_BuildFMul" buildFMul ::
    Ptr Builder -> Ptr Value -> Ptr Value -> CString -> IO (Ptr BinaryOperator)
  
  foreign import ccall unsafe "LLVM_Hs_BuildFRem" buildFRem ::
    Ptr Builder -> Ptr Value -> Ptr Value -> CString -> IO (Ptr BinaryOperator)
  
  foreign import ccall unsafe "LLVM_Hs_BuildFSub" buildFSub ::
    Ptr Builder -> Ptr Value -> Ptr Value -> CString -> IO (Ptr BinaryOperator)
  
  foreign import ccall unsafe "LLVMBuildArrayAlloca" buildAlloca ::
    Ptr Builder -> Ptr Type -> Ptr Value -> CString -> IO (Ptr Instruction)
  
  foreign import ccall unsafe "LLVM_Hs_BuildLoad" buildLoad' ::
    Ptr Builder -> LLVMBool -> Ptr Value -> MemoryOrdering -> SynchronizationScope -> CUInt -> CString -> IO (Ptr Instruction)
  
  buildLoad :: Ptr Builder -> LLVMBool -> Ptr Value -> (SynchronizationScope, MemoryOrdering) -> CUInt -> CString -> IO (Ptr Instruction)
  buildLoad builder vol a' (ss, mo) al s = buildLoad' builder vol a' mo ss al s
  
  foreign import ccall unsafe "LLVM_Hs_BuildStore" buildStore' ::
    Ptr Builder -> LLVMBool -> Ptr Value -> Ptr Value -> MemoryOrdering -> SynchronizationScope -> CUInt -> CString -> IO (Ptr Instruction)
  
  buildStore :: Ptr Builder -> LLVMBool -> Ptr Value -> Ptr Value -> (SynchronizationScope, MemoryOrdering) -> CUInt -> CString -> IO (Ptr Instruction)
  buildStore builder vol a' v' (ss, mo) al s = buildStore' builder vol a' v' mo ss al s
  
  foreign import ccall unsafe "LLVM_Hs_BuildGEP" buildGetElementPtr' ::
    Ptr Builder -> Ptr Value -> Ptr (Ptr Value) -> CUInt -> CString -> IO (Ptr Instruction)
  
  foreign import ccall unsafe "LLVM_Hs_BuildInBoundsGEP" buildInBoundsGetElementPtr' ::
    Ptr Builder -> Ptr Value -> Ptr (Ptr Value) -> CUInt -> CString -> IO (Ptr Instruction)
  
  buildGetElementPtr :: HasCallStack => Ptr Builder -> LLVMBool -> Ptr Value -> (CUInt, Ptr (Ptr Value)) -> CString -> IO (Ptr Instruction)
  buildGetElementPtr builder (LLVMBool 1) a (n, is) s = buildInBoundsGetElementPtr' builder a is n s
  buildGetElementPtr builder (LLVMBool 0) a (n, is) s = buildGetElementPtr' builder a is n s
  buildGetElementPtr _ (LLVMBool i) _ _ _ = error ("LLVMBool should be 0 or 1 but is " <> show i)
  
  foreign import ccall unsafe "LLVM_Hs_BuildFence" buildFence' ::
    Ptr Builder -> MemoryOrdering -> SynchronizationScope -> CString -> IO (Ptr Instruction)
  
  buildFence :: Ptr Builder -> (SynchronizationScope, MemoryOrdering) -> CString -> IO (Ptr Instruction)
  buildFence builder (ss, mo) s = buildFence' builder mo ss s
  
  foreign import ccall unsafe "LLVM_Hs_BuildAtomicCmpXchg" buildCmpXchg' ::
    Ptr Builder -> LLVMBool -> Ptr Value -> Ptr Value -> Ptr Value -> MemoryOrdering -> MemoryOrdering -> SynchronizationScope -> CString -> IO (Ptr Instruction)
  
  buildCmpXchg :: Ptr Builder -> LLVMBool -> Ptr Value -> Ptr Value -> Ptr Value -> (SynchronizationScope, MemoryOrdering) -> MemoryOrdering -> CString -> IO (Ptr Instruction)
  buildCmpXchg builder vol a e r (ss, smo) fmo s =  buildCmpXchg' builder vol a e r smo fmo ss s
  
  foreign import ccall unsafe "LLVM_Hs_BuildAtomicRMW" buildAtomicRMW' ::
    Ptr Builder -> LLVMBool -> RMWOperation -> Ptr Value -> Ptr Value -> MemoryOrdering -> SynchronizationScope -> CString -> IO (Ptr Instruction)
  
  buildAtomicRMW :: Ptr Builder -> LLVMBool -> RMWOperation -> Ptr Value -> Ptr Value -> (SynchronizationScope, MemoryOrdering) -> CString -> IO (Ptr Instruction)
  buildAtomicRMW builder vol rmwOp a v (ss, mo) s = buildAtomicRMW' builder vol rmwOp a v mo ss s
  
  foreign import ccall unsafe "LLVM_Hs_BuildICmp" buildICmp ::
    Ptr Builder -> ICmpPredicate -> Ptr Value -> Ptr Value -> CString -> IO (Ptr Instruction)
  
  foreign import ccall unsafe "LLVMBuildFCmp" buildFCmp ::
    Ptr Builder -> FCmpPredicate -> Ptr Value -> Ptr Value -> CString -> IO (Ptr Instruction)
  
  foreign import ccall unsafe "LLVMBuildPhi" buildPhi ::
    Ptr Builder -> Ptr Type -> CString -> IO (Ptr Instruction)
  
  foreign import ccall unsafe "LLVMBuildCall" buildCall ::
    Ptr Builder -> Ptr Value -> Ptr (Ptr Value) -> CUInt -> CString -> IO (Ptr Instruction)
  
  foreign import ccall unsafe "LLVMBuildFreeze" buildFreeze ::
    Ptr Builder -> Ptr Value -> Ptr Type -> IO (Ptr Instruction)
  
  foreign import ccall unsafe "LLVM_Hs_BuildSelect" buildSelect ::
    Ptr Builder -> Ptr Value -> Ptr Value -> Ptr Value -> CString -> IO (Ptr Instruction)
  
  foreign import ccall unsafe "LLVMBuildVAArg" buildVAArg ::
    Ptr Builder -> Ptr Value -> Ptr Type -> CString -> IO (Ptr Instruction)
  
  foreign import ccall unsafe "LLVM_Hs_BuildExtractElement" buildExtractElement ::
    Ptr Builder -> Ptr Value -> Ptr Value -> CString -> IO (Ptr Instruction)
  
  foreign import ccall unsafe "LLVM_Hs_BuildInsertElement" buildInsertElement ::
    Ptr Builder -> Ptr Value -> Ptr Value -> Ptr Value -> CString -> IO (Ptr Instruction)
  
  foreign import ccall unsafe "LLVM_Hs_BuildShuffleVector" buildShuffleVector ::
    Ptr Builder -> Ptr Value -> Ptr Value -> Ptr CInt -> CUInt -> CString -> IO (Ptr Instruction)
  
  foreign import ccall unsafe "LLVM_Hs_BuildExtractValue" buildExtractValue ::
    Ptr Builder -> Ptr Value -> Ptr CUInt -> CUInt -> CString -> IO (Ptr Instruction)
  
  foreign import ccall unsafe "LLVM_Hs_BuildInsertValue" buildInsertValue ::
    Ptr Builder -> Ptr Value -> Ptr Value -> Ptr CUInt -> CUInt -> CString -> IO (Ptr Instruction)
  
  foreign import ccall unsafe "LLVMBuildLandingPad" buildLandingPad' ::
    Ptr Builder -> Ptr Type -> Ptr Value -> CUInt -> CString -> IO (Ptr Instruction)
  
  -- | The personality should be set via the function
  buildLandingPad :: Ptr Builder -> Ptr Type -> CUInt -> CString -> IO (Ptr Instruction)
  buildLandingPad builder ty numClauses name = buildLandingPad' builder ty nullPtr numClauses name
  
  foreign import ccall unsafe "LLVM_Hs_BuildCleanupPad" buildCleanupPad ::
    Ptr Builder -> Ptr Value -> Ptr (Ptr Value) -> CUInt -> CString -> IO (Ptr Instruction)
  
  foreign import ccall unsafe "LLVM_Hs_BuildCatchPad" buildCatchPad ::
    Ptr Builder -> Ptr Value -> Ptr (Ptr Value) -> CUInt -> CString -> IO (Ptr Instruction)
  
  foreign import ccall unsafe "LLVM_Hs_SetFastMathFlags" setFastMathFlags ::
    Ptr Builder -> FastMathFlags -> IO ()
  