{-# LANGUAGE ForeignFunctionInterface #-}
module LLVM.Internal.FFI.OrcJIT.CompileLayer where

import LLVM.Prelude

import LLVM.Internal.FFI.DataLayout
import LLVM.Internal.FFI.LLVMCTypes
import LLVM.Internal.FFI.Module
import LLVM.Internal.FFI.OrcJIT

import Foreign.C
import Foreign.Ptr

data CompileLayer

-- | Abstract type representing a set of modules in a 'LLVM.OrcJIT.CompileLayer'.
newtype ModuleSetHandle = ModuleSetHandle Word

foreign import ccall safe "LLVM_Hs_CompileLayer_dispose" disposeCompileLayer ::
  Ptr CompileLayer -> IO ()

foreign import ccall safe "LLVM_Hs_CompileLayer_addModuleSet" addModuleSet ::
  Ptr CompileLayer ->
  Ptr DataLayout ->
  Ptr (Ptr Module) ->
  CUInt ->
  Ptr LambdaResolver ->
  IO ModuleSetHandle

foreign import ccall safe "LLVM_Hs_CompileLayer_removeModuleSet" removeModuleSet ::
  Ptr CompileLayer -> ModuleSetHandle -> IO ()

foreign import ccall safe "LLVM_Hs_CompileLayer_findSymbol" findSymbol ::
  Ptr CompileLayer -> CString -> LLVMBool -> IO (Ptr JITSymbol)

foreign import ccall safe "LLVM_Hs_CompileLayer_findSymbolIn" findSymbolIn ::
  Ptr CompileLayer -> ModuleSetHandle -> CString -> LLVMBool -> IO (Ptr JITSymbol)