module LLVM.Internal.FFI.OrcJIT where

import LLVM.Prelude

import LLVM.Internal.FFI.DataLayout (DataLayout)
import LLVM.Internal.FFI.Module (Module)
import LLVM.Internal.FFI.Target (TargetMachine)
import LLVM.Internal.FFI.LLVMCTypes

import Foreign.Ptr
import Foreign.C

newtype TargetAddress = TargetAddress Word64

data JITEvaluatedSymbol
data ExpectedJITEvaluatedSymbol
data MangleAndInterner
data ThreadSafeContext
data ThreadSafeModule
data ObjectLayer
data IRLayer
data JITDylib
data ExecutionSession
data SymbolStringPtr

foreign import ccall safe "LLVM_Hs_createExecutionSession" createExecutionSession ::
  IO (Ptr ExecutionSession)

foreign import ccall safe "LLVM_Hs_disposeExecutionSession" disposeExecutionSession ::
  Ptr ExecutionSession -> IO ()

foreign import ccall safe "LLVM_Hs_ExecutionSession_endSession" endSession ::
  Ptr ExecutionSession -> IO ()

foreign import ccall safe "LLVM_Hs_ExecutionSession_createJITDylib" createJITDylib ::
  Ptr ExecutionSession -> CString -> IO (Ptr JITDylib)

foreign import ccall safe "LLVM_Hs_ExecutionSession_lookupSymbol" lookupSymbol ::
  Ptr ExecutionSession -> Ptr JITDylib -> Ptr MangleAndInterner -> CString -> IO (Ptr ExpectedJITEvaluatedSymbol)

foreign import ccall safe "LLVM_Hs_createThreadSafeContext" createThreadSafeContext ::
  IO (Ptr ThreadSafeContext)

foreign import ccall safe "LLVM_Hs_disposeThreadSafeContext" disposeThreadSafeContext ::
  Ptr ThreadSafeContext -> IO ()

foreign import ccall safe "LLVM_Hs_cloneAsThreadSafeModule" cloneAsThreadSafeModule ::
  Ptr Module -> IO (Ptr ThreadSafeModule)

foreign import ccall safe "LLVM_Hs_disposeThreadSafeModule" disposeThreadSafeModule ::
  Ptr ThreadSafeModule -> IO ()

foreign import ccall safe "LLVM_Hs_createRTDyldObjectLinkingLayer" createRTDyldObjectLinkingLayer ::
  Ptr ExecutionSession -> IO (Ptr ObjectLayer)

foreign import ccall safe "LLVM_Hs_createObjectLinkingLayer" createObjectLinkingLayer ::
  Ptr ExecutionSession -> IO (Ptr ObjectLayer)

foreign import ccall safe "LLVM_Hs_ObjectLayerAddObjectFile" objectLayerAddObjectFile ::
  Ptr ObjectLayer -> Ptr JITDylib -> CString -> IO ()

foreign import ccall safe "LLVM_Hs_disposeObjectLayer" disposeObjectLayer ::
  Ptr ObjectLayer -> IO ()

foreign import ccall safe "LLVM_Hs_createIRCompileLayer" createIRCompileLayer ::
  Ptr ExecutionSession -> Ptr ObjectLayer -> Ptr TargetMachine -> IO (Ptr IRLayer)

foreign import ccall safe "LLVM_Hs_disposeIRLayer" disposeIRLayer ::
  Ptr IRLayer -> IO ()

foreign import ccall safe "LLVM_Hs_JITDylib_addDynamicLibrarySearchGenerator_forCurrentProcess"
  addDynamicLibrarySearchGeneratorForCurrentProcess ::
    Ptr JITDylib -> Ptr DataLayout -> IO ()

foreign import ccall safe "LLVM_Hs_JITDylib_addDynamicLibrarySearchGenerator_load"
  addDynamicLibrarySearchGenerator ::
    Ptr JITDylib -> Ptr DataLayout -> CString -> IO ()

foreign import ccall safe "LLVM_Hs_JITDylib_defineAbsoluteSymbols"
  defineAbsoluteSymbols :: Ptr JITDylib -> CUInt -> Ptr (Ptr SymbolStringPtr) -> Ptr (Ptr JITEvaluatedSymbol) -> IO ()

foreign import ccall safe "LLVM_Hs_IRLayer_addModule" irLayerAddModule ::
  Ptr ThreadSafeModule -> Ptr JITDylib -> Ptr DataLayout -> Ptr IRLayer -> IO ()

foreign import ccall safe "LLVM_Hs_getExpectedJITEvaluatedSymbolAddress" getExpectedSymbolAddress ::
  Ptr ExpectedJITEvaluatedSymbol -> Ptr (OwnerTransfered CString) -> IO TargetAddress

foreign import ccall safe "LLVM_Hs_getExpectedJITEvaluatedSymbolFlags" getExpectedSymbolFlags ::
  Ptr ExpectedJITEvaluatedSymbol -> IO JITSymbolFlags

foreign import ccall safe "LLVM_Hs_disposeExpectedJITEvaluatedSymbol" disposeExpectedJITEvaluatedSymbol ::
  Ptr ExpectedJITEvaluatedSymbol -> IO ()

foreign import ccall safe "LLVM_Hs_createJITEvaluatedSymbol" createJITEvaluatedSymbol ::
  TargetAddress -> JITSymbolFlags -> IO (Ptr JITEvaluatedSymbol)

foreign import ccall safe "LLVM_Hs_disposeJITEvaluatedSymbol" disposeJITEvaluatedSymbol ::
  Ptr JITEvaluatedSymbol -> IO ()

foreign import ccall safe "LLVM_Hs_createMangleAndInterner" createMangleAndInterner ::
  Ptr ExecutionSession -> Ptr DataLayout -> IO (Ptr MangleAndInterner)

foreign import ccall safe "LLVM_Hs_disposeMangleAndInterner" disposeMangleAndInterner ::
  Ptr MangleAndInterner -> IO ()

foreign import ccall safe "LLVM_Hs_MangleAndInterner_call" mangleSymbol ::
  Ptr MangleAndInterner -> CString -> IO (Ptr SymbolStringPtr)

foreign import ccall safe "LLVM_Hs_SymbolStringPtr_c_str" mangledSymbolString ::
  Ptr SymbolStringPtr -> IO CString

foreign import ccall safe "LLVM_Hs_disposeSymbolStringPtr" disposeMangledSymbol ::
  Ptr SymbolStringPtr -> IO ()