{-# LANGUAGE
  ForeignFunctionInterface,
  MultiParamTypeClasses,
  UndecidableInstances
  #-}
-- | FFI functions for handling the LLVM GlobalValue class
module LLVM.Internal.FFI.GlobalValue where

import LLVM.Prelude

import Foreign.Ptr
import Foreign.C

import LLVM.Internal.FFI.PtrHierarchy
import LLVM.Internal.FFI.LLVMCTypes

data COMDAT

foreign import ccall unsafe "LLVMIsAGlobalValue" isAGlobalValue ::
  Ptr Value -> IO (Ptr GlobalValue)

foreign import ccall unsafe "LLVMGetLinkage" getLinkage ::
  Ptr GlobalValue -> IO Linkage

foreign import ccall unsafe "LLVMSetLinkage" setLinkage ::
  Ptr GlobalValue -> Linkage -> IO ()

foreign import ccall unsafe "LLVM_Hs_GetSection" getSection ::
  Ptr GlobalValue -> Ptr CSize -> IO CString

foreign import ccall unsafe "LLVMSetSection" setSection ::
  Ptr GlobalValue -> CString -> IO ()

foreign import ccall unsafe "LLVM_Hs_GetCOMDAT" getCOMDAT ::
  Ptr GlobalValue -> IO (Ptr COMDAT)

foreign import ccall unsafe "LLVM_Hs_SetCOMDAT" setCOMDAT ::
  Ptr GlobalObject -> Ptr COMDAT -> IO ()

foreign import ccall unsafe "LLVM_Hs_GetCOMDATName" getCOMDATName ::
  Ptr COMDAT -> Ptr CSize -> IO (Ptr CChar)

foreign import ccall unsafe "LLVM_Hs_GetCOMDATSelectionKind" getCOMDATSelectionKind ::
  Ptr COMDAT -> IO COMDATSelectionKind

foreign import ccall unsafe "LLVM_Hs_SetCOMDATSelectionKind" setCOMDATSelectionKind ::
  Ptr COMDAT -> COMDATSelectionKind -> IO ()

foreign import ccall unsafe "LLVMGetVisibility" getVisibility ::
  Ptr GlobalValue -> IO Visibility

foreign import ccall unsafe "LLVMSetVisibility" setVisibility ::
  Ptr GlobalValue -> Visibility -> IO ()

foreign import ccall unsafe "LLVMGetDLLStorageClass" getDLLStorageClass ::
  Ptr GlobalValue -> IO DLLStorageClass

foreign import ccall unsafe "LLVMSetDLLStorageClass" setDLLStorageClass ::
  Ptr GlobalValue -> DLLStorageClass -> IO ()

foreign import ccall unsafe "LLVMGetAlignment" getAlignment ::
  Ptr GlobalValue -> IO CUInt

foreign import ccall unsafe "LLVMSetAlignment" setAlignment ::
  Ptr GlobalValue -> CUInt -> IO ()

foreign import ccall unsafe "LLVMGetUnnamedAddress" getUnnamedAddr ::
  Ptr GlobalValue -> IO UnnamedAddr

foreign import ccall unsafe "LLVMSetUnnamedAddress" setUnnamedAddr ::
  Ptr GlobalValue -> UnnamedAddr -> IO ()

foreign import ccall unsafe "LLVM_Hs_GetThreadLocalMode" getThreadLocalMode ::
  Ptr GlobalValue -> IO ThreadLocalMode

foreign import ccall unsafe "LLVM_Hs_SetThreadLocalMode" setThreadLocalMode ::
  Ptr GlobalValue -> ThreadLocalMode -> IO ()

foreign import ccall unsafe "LLVM_Hs_GlobalObject_GetNumMetadata" getNumMetadata ::
  Ptr GlobalObject -> IO CUInt

foreign import ccall unsafe "LLVM_Hs_GlobalObject_GetAllMetadata" getAllMetadata ::
  Ptr GlobalObject -> Ptr MDKindID -> Ptr (Ptr MDNode) -> IO ()

foreign import ccall unsafe "LLVM_Hs_GlobalObject_SetMetadata" setMetadata ::
  Ptr GlobalObject -> MDKindID -> Ptr MDNode -> IO ()