module GHC.Driver.Config.CmmToLlvm
  ( initLlvmCgConfig
  ) where

import GHC.Prelude
import GHC.Driver.Session
import GHC.Platform
import GHC.CmmToLlvm.Config
import GHC.SysTools.Tasks
import GHC.Utils.Outputable
import GHC.Utils.Logger

-- | Initialize the Llvm code generator configuration from DynFlags
initLlvmCgConfig :: Logger -> DynFlags -> IO LlvmCgConfig
initLlvmCgConfig :: Logger -> DynFlags -> IO LlvmCgConfig
initLlvmCgConfig Logger
logger DynFlags
dflags = do
  Maybe LlvmVersion
version <- Logger -> DynFlags -> IO (Maybe LlvmVersion)
figureLlvmVersion Logger
logger DynFlags
dflags
  LlvmCgConfig -> IO LlvmCgConfig
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (LlvmCgConfig -> IO LlvmCgConfig)
-> LlvmCgConfig -> IO LlvmCgConfig
forall a b. (a -> b) -> a -> b
$! LlvmCgConfig {
    llvmCgPlatform :: Platform
llvmCgPlatform               = DynFlags -> Platform
targetPlatform DynFlags
dflags
    , llvmCgContext :: SDocContext
llvmCgContext              = DynFlags -> PprStyle -> SDocContext
initSDocContext DynFlags
dflags (LabelStyle -> PprStyle
PprCode LabelStyle
CStyle)
    , llvmCgFillUndefWithGarbage :: Bool
llvmCgFillUndefWithGarbage = GeneralFlag -> DynFlags -> Bool
gopt GeneralFlag
Opt_LlvmFillUndefWithGarbage DynFlags
dflags
    , llvmCgSplitSection :: Bool
llvmCgSplitSection         = GeneralFlag -> DynFlags -> Bool
gopt GeneralFlag
Opt_SplitSections DynFlags
dflags
    , llvmCgBmiVersion :: Maybe BmiVersion
llvmCgBmiVersion           = case Platform -> Arch
platformArch (DynFlags -> Platform
targetPlatform DynFlags
dflags) of
                                      Arch
ArchX86_64 -> DynFlags -> Maybe BmiVersion
bmiVersion DynFlags
dflags
                                      Arch
ArchX86    -> DynFlags -> Maybe BmiVersion
bmiVersion DynFlags
dflags
                                      Arch
_          -> Maybe BmiVersion
forall a. Maybe a
Nothing
    , llvmCgLlvmVersion :: Maybe LlvmVersion
llvmCgLlvmVersion          = Maybe LlvmVersion
version
    , llvmCgDoWarn :: Bool
llvmCgDoWarn               = WarningFlag -> DynFlags -> Bool
wopt WarningFlag
Opt_WarnUnsupportedLlvmVersion DynFlags
dflags
    , llvmCgLlvmTarget :: String
llvmCgLlvmTarget           = PlatformMisc -> String
platformMisc_llvmTarget (PlatformMisc -> String) -> PlatformMisc -> String
forall a b. (a -> b) -> a -> b
$! DynFlags -> PlatformMisc
platformMisc DynFlags
dflags
    , llvmCgLlvmConfig :: LlvmConfig
llvmCgLlvmConfig           = DynFlags -> LlvmConfig
llvmConfig DynFlags
dflags
    }