module GHC.Driver.Config.Cmm
  ( initCmmConfig
  ) where

import GHC.Cmm.Config

import GHC.Driver.Session
import GHC.Driver.Backend

import GHC.Platform

import GHC.Prelude

initCmmConfig :: DynFlags -> CmmConfig
initCmmConfig :: DynFlags -> CmmConfig
initCmmConfig DynFlags
dflags = CmmConfig
  { cmmProfile :: Profile
cmmProfile             = DynFlags -> Profile
targetProfile                DynFlags
dflags
  , cmmOptControlFlow :: Bool
cmmOptControlFlow      = GeneralFlag -> DynFlags -> Bool
gopt GeneralFlag
Opt_CmmControlFlow      DynFlags
dflags
  , cmmDoLinting :: Bool
cmmDoLinting           = GeneralFlag -> DynFlags -> Bool
gopt GeneralFlag
Opt_DoCmmLinting        DynFlags
dflags
  , cmmOptElimCommonBlks :: Bool
cmmOptElimCommonBlks   = GeneralFlag -> DynFlags -> Bool
gopt GeneralFlag
Opt_CmmElimCommonBlocks DynFlags
dflags
  , cmmOptSink :: Bool
cmmOptSink             = GeneralFlag -> DynFlags -> Bool
gopt GeneralFlag
Opt_CmmSink             DynFlags
dflags
  , cmmOptThreadSanitizer :: Bool
cmmOptThreadSanitizer  = GeneralFlag -> DynFlags -> Bool
gopt GeneralFlag
Opt_CmmThreadSanitizer DynFlags
dflags
  , cmmGenStackUnwindInstr :: Bool
cmmGenStackUnwindInstr = DynFlags -> Int
debugLevel DynFlags
dflags Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
0
  , cmmExternalDynamicRefs :: Bool
cmmExternalDynamicRefs = GeneralFlag -> DynFlags -> Bool
gopt GeneralFlag
Opt_ExternalDynamicRefs DynFlags
dflags
  , cmmDoCmmSwitchPlans :: Bool
cmmDoCmmSwitchPlans    = Bool -> Bool
not (Backend -> Bool
backendHasNativeSwitch (DynFlags -> Backend
backend DynFlags
dflags))
                             Bool -> Bool -> Bool
|| Platform -> Arch
platformArch Platform
platform Arch -> Arch -> Bool
forall a. Eq a => a -> a -> Bool
== Arch
ArchWasm32
  , cmmSplitProcPoints :: Bool
cmmSplitProcPoints     = Bool -> Bool
not (Backend -> Bool
backendSupportsUnsplitProcPoints (DynFlags -> Backend
backend DynFlags
dflags))
                             Bool -> Bool -> Bool
|| Bool -> Bool
not (Platform -> Bool
platformTablesNextToCode Platform
platform)
                             Bool -> Bool -> Bool
|| Bool
usingInconsistentPicReg
  }
  where platform :: Platform
platform                = DynFlags -> Platform
targetPlatform DynFlags
dflags
        usingInconsistentPicReg :: Bool
usingInconsistentPicReg =
          case (Platform -> Arch
platformArch Platform
platform, Platform -> OS
platformOS Platform
platform, DynFlags -> Bool
positionIndependent DynFlags
dflags)
          of   (Arch
ArchX86, OS
OSDarwin, Bool
pic) -> Bool
pic
               (Arch, OS, Bool)
_                        -> Bool
False