{-# LANGUAGE ForeignFunctionInterface, MultiParamTypeClasses #-}
module LLVM.Internal.FFI.OrcJIT.IRTransformLayer where

import LLVM.Prelude

import LLVM.Internal.FFI.OrcJIT.CompileLayer
import LLVM.Internal.FFI.PtrHierarchy
import LLVM.Internal.FFI.Module

import Foreign.Ptr

data IRTransformLayer
instance ChildOf CompileLayer IRTransformLayer

type ModuleTransform = Ptr Module -> IO (Ptr Module)

foreign import ccall "wrapper" wrapModuleTransform ::
  ModuleTransform -> IO (FunPtr ModuleTransform)

foreign import ccall safe "LLVM_Hs_createIRTransformLayer" createIRTransformLayer ::
  Ptr CompileLayer -> FunPtr ModuleTransform -> IO (Ptr IRTransformLayer)