module Data.Array.Accelerate.LLVM.Native.Target (
module Data.Array.Accelerate.LLVM.Target,
module Data.Array.Accelerate.LLVM.Native.Target
) where
import LLVM.Target hiding ( Target )
import LLVM.AST.DataLayout ( DataLayout )
import qualified LLVM.Relocation as RelocationModel
import qualified LLVM.CodeModel as CodeModel
import qualified LLVM.CodeGenOpt as CodeOptimisation
import Data.Array.Accelerate.LLVM.Native.Link.Cache ( LinkCache )
import Data.Array.Accelerate.LLVM.Target ( Target(..) )
import Control.Parallel.Meta ( Executable )
import Data.ByteString ( ByteString )
import Data.ByteString.Short ( ShortByteString )
import System.IO.Unsafe
data Native = Native
{ gangSize :: {-# UNPACK #-} !Int
, linkCache :: {-# UNPACK #-} !LinkCache
, fillS :: {-# UNPACK #-} !Executable
, fillP :: {-# UNPACK #-} !Executable
, segmentOffset :: !Bool
}
instance Target Native where
targetTriple _ = Just nativeTargetTriple
targetDataLayout _ = Just nativeDataLayout
{-# NOINLINE nativeTargetTriple #-}
nativeTargetTriple :: ShortByteString
nativeTargetTriple = unsafePerformIO $
getProcessTargetTriple
{-# NOINLINE nativeDataLayout #-}
nativeDataLayout :: DataLayout
nativeDataLayout
= unsafePerformIO
$ withNativeTargetMachine getTargetMachineDataLayout
{-# NOINLINE nativeCPUName #-}
nativeCPUName :: ByteString
nativeCPUName = unsafePerformIO $ getHostCPUName
withNativeTargetMachine
:: (TargetMachine -> IO a)
-> IO a
withNativeTargetMachine k = do
initializeNativeTarget
nativeCPUFeatures <- getHostCPUFeatures
(nativeTarget, _) <- lookupTarget Nothing nativeTargetTriple
withTargetOptions $ \targetOptions ->
withTargetMachine
nativeTarget
nativeTargetTriple
nativeCPUName
nativeCPUFeatures
targetOptions
RelocationModel.DynamicNoPIC
CodeModel.Default
CodeOptimisation.Default
k