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.Native.Execute.Scheduler          ( Workers )
import Data.Array.Accelerate.LLVM.Target                            ( Target(..) )
import Data.ByteString                                              ( ByteString )
import Data.ByteString.Short                                        ( ShortByteString )
import System.IO.Unsafe
data Native = Native
  { Native -> LinkCache
linkCache     :: !LinkCache
  , Native -> Workers
workers       :: !Workers
  }
instance Target Native where
  targetTriple :: Maybe ShortByteString
targetTriple     = ShortByteString -> Maybe ShortByteString
forall a. a -> Maybe a
Just ShortByteString
nativeTargetTriple
  targetDataLayout :: Maybe DataLayout
targetDataLayout = DataLayout -> Maybe DataLayout
forall a. a -> Maybe a
Just DataLayout
nativeDataLayout
{-# NOINLINE nativeTargetTriple #-}
nativeTargetTriple :: ShortByteString
nativeTargetTriple :: ShortByteString
nativeTargetTriple = IO ShortByteString -> ShortByteString
forall a. IO a -> a
unsafePerformIO (IO ShortByteString -> ShortByteString)
-> IO ShortByteString -> ShortByteString
forall a b. (a -> b) -> a -> b
$
    
    IO ShortByteString
getProcessTargetTriple
{-# NOINLINE nativeDataLayout #-}
nativeDataLayout :: DataLayout
nativeDataLayout :: DataLayout
nativeDataLayout
  = IO DataLayout -> DataLayout
forall a. IO a -> a
unsafePerformIO
  (IO DataLayout -> DataLayout) -> IO DataLayout -> DataLayout
forall a b. (a -> b) -> a -> b
$ (TargetMachine -> IO DataLayout) -> IO DataLayout
forall a. (TargetMachine -> IO a) -> IO a
withNativeTargetMachine TargetMachine -> IO DataLayout
getTargetMachineDataLayout
{-# NOINLINE nativeCPUName #-}
nativeCPUName :: ByteString
nativeCPUName :: ByteString
nativeCPUName = IO ByteString -> ByteString
forall a. IO a -> a
unsafePerformIO (IO ByteString -> ByteString) -> IO ByteString -> ByteString
forall a b. (a -> b) -> a -> b
$ IO ByteString
getHostCPUName
withNativeTargetMachine
    :: (TargetMachine -> IO a)
    -> IO a
withNativeTargetMachine :: (TargetMachine -> IO a) -> IO a
withNativeTargetMachine TargetMachine -> IO a
k = do
  IO ()
initializeNativeTarget
  Map CPUFeature Bool
nativeCPUFeatures <- IO (Map CPUFeature Bool)
getHostCPUFeatures
  (Target
nativeTarget, ShortByteString
_) <- Maybe ShortByteString
-> ShortByteString -> IO (Target, ShortByteString)
lookupTarget Maybe ShortByteString
forall a. Maybe a
Nothing ShortByteString
nativeTargetTriple
  (TargetOptions -> IO a) -> IO a
forall a. (TargetOptions -> IO a) -> IO a
withTargetOptions ((TargetOptions -> IO a) -> IO a)
-> (TargetOptions -> IO a) -> IO a
forall a b. (a -> b) -> a -> b
$ \TargetOptions
targetOptions ->
    Target
-> ShortByteString
-> ByteString
-> Map CPUFeature Bool
-> TargetOptions
-> Model
-> Model
-> Level
-> (TargetMachine -> IO a)
-> IO a
forall a.
Target
-> ShortByteString
-> ByteString
-> Map CPUFeature Bool
-> TargetOptions
-> Model
-> Model
-> Level
-> (TargetMachine -> IO a)
-> IO a
withTargetMachine
        Target
nativeTarget
        ShortByteString
nativeTargetTriple
        ByteString
nativeCPUName
        Map CPUFeature Bool
nativeCPUFeatures
        TargetOptions
targetOptions
        Model
RelocationModel.PIC
        Model
CodeModel.Default
        Level
CodeOptimisation.Default
        TargetMachine -> IO a
k