{-# LINE 1 "src/LLVM/FFI/TargetMachine.hsc" #-}
{-# LANGUAGE Safe #-}
{-# LANGUAGE ForeignFunctionInterface #-}
{-# LANGUAGE EmptyDataDecls #-}
{-# LANGUAGE DeriveDataTypeable #-}

module LLVM.FFI.TargetMachine where


import qualified LLVM.FFI.Core as LLVM
import LLVM.FFI.Target (TargetDataRef)
import LLVM.FFI.Core (ModuleRef, PassManagerRef, MemoryBufferRef)

import qualified Foreign.C.Types as C
import Foreign.C.String (CString)
import Foreign.Ptr (Ptr)

import Data.Typeable (Typeable)
import Data.Word (Word32)


type CUInt = C.CUInt
type CInt = C.CInt
type Triple = CString
type ErrorMessage = CString




newtype CodeGenOptLevel = CodeGenOptLevel (Word32)
{-# LINE 30 "src/LLVM/FFI/TargetMachine.hsc" #-}
    deriving (Eq)

codeGenLevelNone, codeGenLevelLess :: CodeGenOptLevel
codeGenLevelDefault, codeGenLevelAggressive :: CodeGenOptLevel
codeGenLevelNone :: CodeGenOptLevel
codeGenLevelNone       = Word32 -> CodeGenOptLevel
CodeGenOptLevel (Word32
0)
{-# LINE 35 "src/LLVM/FFI/TargetMachine.hsc" #-}
codeGenLevelLess       = CodeGenOptLevel (1)
{-# LINE 36 "src/LLVM/FFI/TargetMachine.hsc" #-}
codeGenLevelDefault    = CodeGenOptLevel (2)
{-# LINE 37 "src/LLVM/FFI/TargetMachine.hsc" #-}
codeGenLevelAggressive = CodeGenOptLevel (3)
{-# LINE 38 "src/LLVM/FFI/TargetMachine.hsc" #-}

newtype RelocMode = RelocMode (Word32)
{-# LINE 40 "src/LLVM/FFI/TargetMachine.hsc" #-}
    deriving (Eq)

relocDefault      :: RelocMode
relocStatic       :: RelocMode
relocPIC          :: RelocMode
relocDynamicNoPic :: RelocMode
relocROPI         :: RelocMode
relocRWPI         :: RelocMode
relocROPI_RWPI    :: RelocMode

relocDefault :: RelocMode
relocDefault      = Word32 -> RelocMode
RelocMode (Word32
0)
{-# LINE 51 "src/LLVM/FFI/TargetMachine.hsc" #-}
relocStatic       = RelocMode (1)
relocPIC :: RelocMode
{-# LINE 52 "src/LLVM/FFI/TargetMachine.hsc" #-}
relocPIC          = RelocMode (2)
{-# LINE 53 "src/LLVM/FFI/TargetMachine.hsc" #-}
relocDynamicNoPic = RelocMode (3)
{-# LINE 54 "src/LLVM/FFI/TargetMachine.hsc" #-}
relocROPI         = RelocMode (4)
{-# LINE 55 "src/LLVM/FFI/TargetMachine.hsc" #-}
relocRWPI         = RelocMode (5)
{-# LINE 56 "src/LLVM/FFI/TargetMachine.hsc" #-}
relocROPI_RWPI    = RelocMode (6)
{-# LINE 57 "src/LLVM/FFI/TargetMachine.hsc" #-}

newtype CodeModel = CodeModel (Word32)
{-# LINE 59 "src/LLVM/FFI/TargetMachine.hsc" #-}
    deriving (Eq)

codeModelDefault    :: CodeModel
codeModelJITDefault :: CodeModel
codeModelTiny       :: CodeModel
codeModelSmall      :: CodeModel
codeModelKernel     :: CodeModel
codeModelMedium     :: CodeModel
codeModelLarge      :: CodeModel

codeModelDefault :: CodeModel
codeModelDefault    = Word32 -> CodeModel
CodeModel (Word32
0)
{-# LINE 70 "src/LLVM/FFI/TargetMachine.hsc" #-}
codeModelJITDefault = CodeModel (1)
{-# LINE 71 "src/LLVM/FFI/TargetMachine.hsc" #-}
codeModelTiny       = CodeModel (2)
{-# LINE 72 "src/LLVM/FFI/TargetMachine.hsc" #-}
codeModelSmall      = CodeModel (3)
{-# LINE 73 "src/LLVM/FFI/TargetMachine.hsc" #-}
codeModelKernel     = CodeModel (4)
{-# LINE 74 "src/LLVM/FFI/TargetMachine.hsc" #-}
codeModelMedium     = CodeModel (5)
{-# LINE 75 "src/LLVM/FFI/TargetMachine.hsc" #-}
codeModelLarge      = CodeModel (6)
{-# LINE 76 "src/LLVM/FFI/TargetMachine.hsc" #-}

newtype CodeGenFileType = CodeGenFileType (Word32)
{-# LINE 78 "src/LLVM/FFI/TargetMachine.hsc" #-}
    deriving (Eq)

assemblyFile, objectFile :: CodeGenFileType
assemblyFile :: CodeGenFileType
assemblyFile = Word32 -> CodeGenFileType
CodeGenFileType (Word32
0)
{-# LINE 82 "src/LLVM/FFI/TargetMachine.hsc" #-}
objectFile   = CodeGenFileType (1)
{-# LINE 83 "src/LLVM/FFI/TargetMachine.hsc" #-}


data TargetMachine
    deriving (Typeable)
type TargetMachineRef = Ptr TargetMachine

data Target
    deriving (Typeable)
type TargetRef = Ptr Target


foreign import ccall unsafe "LLVMGetFirstTarget" getFirstTarget
    :: IO TargetRef

foreign import ccall unsafe "LLVMGetNextTarget" getNextTarget
    :: TargetRef -> IO TargetRef

foreign import ccall unsafe "LLVMGetTargetFromName" getTargetFromName
    :: CString -> IO TargetRef

foreign import ccall unsafe "LLVMGetTargetFromTriple" getTargetFromTriple
    :: Triple -> (Ptr TargetRef) -> (Ptr CString) -> IO LLVM.Bool

foreign import ccall unsafe "LLVMGetTargetName" getTargetName
    :: TargetRef -> IO CString

foreign import ccall unsafe "LLVMGetTargetDescription" getTargetDescription
    :: TargetRef -> IO CString

foreign import ccall unsafe "LLVMTargetHasJIT" targetHasJIT
    :: TargetRef -> IO LLVM.Bool

foreign import ccall unsafe "LLVMTargetHasTargetMachine" targetHasTargetMachine
    :: TargetRef -> IO LLVM.Bool

foreign import ccall unsafe "LLVMTargetHasAsmBackend" targetHasAsmBackend
    :: TargetRef -> IO LLVM.Bool

foreign import ccall unsafe "LLVMCreateTargetMachine" createTargetMachine
    :: TargetRef -> CString -> CString -> CString -> CodeGenOptLevel -> RelocMode -> CodeModel -> IO TargetMachineRef

foreign import ccall unsafe "LLVMDisposeTargetMachine" disposeTargetMachine
    :: TargetMachineRef -> IO ()

foreign import ccall unsafe "LLVMGetTargetMachineTarget" getTargetMachineTarget
    :: TargetMachineRef -> IO TargetRef

foreign import ccall unsafe "LLVMGetTargetMachineTriple" getTargetMachineTriple
    :: TargetMachineRef -> IO Triple

foreign import ccall unsafe "LLVMGetTargetMachineCPU" getTargetMachineCPU
    :: TargetMachineRef -> IO CString

foreign import ccall unsafe "LLVMGetTargetMachineFeatureString" getTargetMachineFeatureString
    :: TargetMachineRef -> IO CString

foreign import ccall unsafe "LLVMCreateTargetDataLayout" createTargetDataLayout
    :: TargetMachineRef -> IO TargetDataRef

foreign import ccall unsafe "LLVMSetTargetMachineAsmVerbosity" setTargetMachineAsmVerbosity
    :: TargetMachineRef -> LLVM.Bool -> IO ()

foreign import ccall unsafe "LLVMTargetMachineEmitToFile" targetMachineEmitToFile
    :: TargetMachineRef -> ModuleRef -> CString -> CodeGenFileType -> Ptr ErrorMessage -> IO LLVM.Bool

foreign import ccall unsafe "LLVMTargetMachineEmitToMemoryBuffer" targetMachineEmitToMemoryBuffer
    :: TargetMachineRef -> ModuleRef -> CodeGenFileType -> Ptr ErrorMessage -> (Ptr MemoryBufferRef) -> IO LLVM.Bool

foreign import ccall unsafe "LLVMGetDefaultTargetTriple" getDefaultTargetTriple
    :: IO Triple

foreign import ccall unsafe "LLVMNormalizeTargetTriple" normalizeTargetTriple
    :: Triple -> IO CString

foreign import ccall unsafe "LLVMGetHostCPUName" getHostCPUName
    :: IO CString

foreign import ccall unsafe "LLVMGetHostCPUFeatures" getHostCPUFeatures
    :: IO CString

foreign import ccall unsafe "LLVMAddAnalysisPasses" addAnalysisPasses
    :: TargetMachineRef -> PassManagerRef -> IO ()