{-# LANGUAGE ForeignFunctionInterface, MultiParamTypeClasses #-}

module LLVM.Internal.FFI.OrcJIT.LinkingLayer where

import LLVM.Prelude

import Foreign.C
import Foreign.Ptr

import LLVM.Internal.FFI.OrcJIT
import LLVM.Internal.FFI.LLVMCTypes
import LLVM.Internal.FFI.PtrHierarchy
import LLVM.Internal.FFI.ObjectFile

data LinkingLayer
data ObjectLinkingLayer
instance ChildOf LinkingLayer ObjectLinkingLayer

foreign import ccall safe "LLVM_Hs_createObjectLinkingLayer" createObjectLinkingLayer ::
  Ptr ExecutionSession -> FunPtr (ModuleKey -> IO (Ptr SymbolResolver)) -> IO (Ptr ObjectLinkingLayer)

foreign import ccall safe "LLVM_Hs_LinkingLayer_dispose" disposeLinkingLayer ::
  Ptr LinkingLayer -> IO ()

foreign import ccall safe "LLVM_Hs_LinkingLayer_addObject" addObjectFile ::
  Ptr LinkingLayer ->
  ModuleKey ->
  Ptr ObjectFile ->
  Ptr (OwnerTransfered CString) ->
  IO ()

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

foreign import ccall safe "LLVM_Hs_LinkingLayer_findSymbolIn" findSymbolIn ::
  Ptr LinkingLayer ->
  ModuleKey ->
  CString ->
  LLVMBool ->
  IO (Ptr JITSymbol)