{-# 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

newtype ObjectHandle = ObjectHandle Word

foreign import ccall safe "LLVM_Hs_createObjectLinkingLayer" createObjectLinkingLayer ::
  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 ->
  Ptr ObjectFile ->
  Ptr LambdaResolver ->
  Ptr (OwnerTransfered CString) ->
  IO ObjectHandle