module LLVM.Wrapper.Transforms.PassManagerBuilder where

import Foreign.C.Types
import Foreign.ForeignPtr.Safe (withForeignPtr)
import Foreign.Marshal.Utils (fromBool, toBool)

import qualified LLVM.FFI.Transforms.PassManagerBuilder as FFI
import LLVM.Wrapper.Internal

passManagerBuilderCreate :: IO PassManagerBuilder
passManagerBuilderCreate = initPassManagerBuilder =<< FFI.passManagerBuilderCreate

passManagerBuilderSetOptLevel :: PassManagerBuilder -> CUInt -> IO ()
passManagerBuilderSetOptLevel (MkPassManagerBuilder p) level =
    withForeignPtr p (`FFI.passManagerBuilderSetOptLevel` level)

passManagerBuilderSetSizeLevel :: PassManagerBuilder -> CUInt -> IO ()
passManagerBuilderSetSizeLevel (MkPassManagerBuilder p) level =
    withForeignPtr p (`FFI.passManagerBuilderSetSizeLevel` level)

passManagerBuilderPopulateFunctionPassManager :: PassManagerBuilder -> PassManager -> IO ()
passManagerBuilderPopulateFunctionPassManager (MkPassManagerBuilder b) (MkPassManager m) =
    withForeignPtr b $ \bptr ->
    withForeignPtr m $ \mptr ->
        FFI.passManagerBuilderPopulateFunctionPassManager bptr mptr

passManagerBuilderPopulateModulePassManager :: PassManagerBuilder -> PassManager -> IO ()
passManagerBuilderPopulateModulePassManager (MkPassManagerBuilder b) (MkPassManager m) =
    withForeignPtr b $ \bptr ->
    withForeignPtr m $ \mptr ->
        FFI.passManagerBuilderPopulateModulePassManager bptr mptr

passManagerBuilderPopulateLTOPassManager :: PassManagerBuilder -> PassManager -> Bool -> Bool -> IO ()
passManagerBuilderPopulateLTOPassManager (MkPassManagerBuilder b) (MkPassManager m) internalize inline =
    withForeignPtr b $ \bptr ->
    withForeignPtr m $ \mptr ->
        FFI.passManagerBuilderPopulateLTOPassManager bptr mptr (fromBool internalize) (fromBool inline)