{-# LANGUAGE
  ForeignFunctionInterface,
  MultiParamTypeClasses
  #-}

module LLVM.General.Internal.FFI.Function where

import LLVM.General.Prelude

import Foreign.Ptr
import Foreign.C

import LLVM.General.Internal.FFI.Attribute
import LLVM.General.Internal.FFI.Context
import LLVM.General.Internal.FFI.LLVMCTypes
import LLVM.General.Internal.FFI.PtrHierarchy

foreign import ccall unsafe "LLVM_General_GetFunctionCallingConvention" getFunctionCallingConvention ::
  Ptr Function -> IO CallingConvention

foreign import ccall unsafe "LLVM_General_SetFunctionCallingConvention" setFunctionCallingConvention ::
  Ptr Function -> CallingConvention -> IO ()

foreign import ccall unsafe "LLVM_General_GetFunctionMixedAttributeSet" getMixedAttributeSet ::
  Ptr Function -> IO MixedAttributeSet

foreign import ccall unsafe "LLVM_General_SetFunctionMixedAttributeSet" setMixedAttributeSet ::
  Ptr Function -> MixedAttributeSet -> IO ()

foreign import ccall unsafe "LLVMGetFirstBasicBlock" getFirstBasicBlock ::
  Ptr Function -> IO (Ptr BasicBlock)

foreign import ccall unsafe "LLVMGetLastBasicBlock" getLastBasicBlock ::
  Ptr Function -> IO (Ptr BasicBlock)

foreign import ccall unsafe "LLVMGetNextBasicBlock" getNextBasicBlock ::
  Ptr BasicBlock -> IO (Ptr BasicBlock)

foreign import ccall unsafe "LLVMAppendBasicBlockInContext" appendBasicBlockInContext ::
  Ptr Context -> Ptr Function -> CString -> IO (Ptr BasicBlock)


foreign import ccall unsafe "LLVMCountParams" countParams ::
  Ptr Function -> IO CUInt

foreign import ccall unsafe "LLVMGetParams" getParams ::
  Ptr Function -> Ptr (Ptr Parameter) -> IO ()

foreign import ccall unsafe "LLVMGetGC" getGC ::
  Ptr Function -> IO CString

foreign import ccall unsafe "LLVMSetGC" setGC ::
  Ptr Function -> CString -> IO ()


foreign import ccall unsafe "LLVM_General_HasFunctionPrefixData" hasPrefixData ::
  Ptr Function -> IO LLVMBool

foreign import ccall unsafe "LLVM_General_GetFunctionPrefixData" getPrefixData ::
  Ptr Function -> IO (Ptr Constant)

foreign import ccall unsafe "LLVM_General_SetFunctionPrefixData" setPrefixData ::
  Ptr Function -> Ptr Constant -> IO ()