    -- | The stg to cmm code generator configuration

    module GHC.StgToCmm.Config
      ( StgToCmmConfig(..)
      , stgToCmmPlatform
      ) where

    import GHC.Platform.Profile
    import GHC.Platform
    import GHC.Unit.Module
    import GHC.Utils.Outputable
    import GHC.Utils.TmpFs

    import GHC.Cmm.MachOp ( FMASign(..) )
    import GHC.Prelude

    -- This config is static and contains information only passed *downwards* by StgToCmm.Monad
    data StgToCmmConfig = StgToCmmConfig
      ----------------------------- General Settings --------------------------------
      { StgToCmmConfig -> Profile
    stgToCmmProfile       :: !Profile            -- ^ Current profile
      , StgToCmmConfig -> Module
    stgToCmmThisModule    :: Module              -- ^ The module being compiled. This field kept lazy for
                                                     -- Cmm/Parser.y which preloads it with a panic
      , StgToCmmConfig -> TempDir
    stgToCmmTmpDir        :: !TempDir            -- ^ Temp Dir for files used in compilation
      , StgToCmmConfig -> SDocContext
    stgToCmmContext       :: !SDocContext        -- ^ Context for StgToCmm phase
      , StgToCmmConfig -> Bool
    stgToCmmEmitDebugInfo :: !Bool               -- ^ Whether we wish to output debug information
      , StgToCmmConfig -> Maybe Word
    stgToCmmBinBlobThresh :: !(Maybe Word)       -- ^ Threshold at which Binary literals (e.g. strings)
                                                     -- are either dumped to a file and a CmmFileEmbed literal
                                                     -- is emitted (over threshold), or become a CmmString
                                                     -- Literal (under or at threshold). CmmFileEmbed is only supported
                                                     -- with the NCG, thus a Just means two things: We have a threshold,
                                                     -- and will be using the NCG. Conversely, a Nothing implies we are not
                                                     -- using NCG and disables CmmFileEmbed. See Note
                                                     -- [Embedding large binary blobs] in GHC.CmmToAsm.Ppr, and
                                                     -- @cgTopBinding@ in GHC.StgToCmm.
      , StgToCmmConfig -> Int
    stgToCmmMaxInlAllocSize :: !Int              -- ^ Max size, in bytes, of inline array allocations.
      ------------------------------ Ticky Options ----------------------------------
      , StgToCmmConfig -> Bool
    stgToCmmDoTicky        :: !Bool              -- ^ Ticky profiling enabled (cf @-ticky@)
      , StgToCmmConfig -> Bool
    stgToCmmTickyAllocd    :: !Bool              -- ^ True indicates ticky prof traces allocs of each named
                                                     -- thing in addition to allocs _by_ that thing
      , StgToCmmConfig -> Bool
    stgToCmmTickyLNE       :: !Bool              -- ^ True indicates ticky uses name-specific counters for
                                                     -- join-points (let-no-escape)
      , StgToCmmConfig -> Bool
    stgToCmmTickyDynThunk  :: !Bool              -- ^ True indicates ticky uses name-specific counters for
                                                     -- dynamic thunks
      , StgToCmmConfig -> Bool
    stgToCmmTickyTag       :: !Bool              -- ^ True indicates ticky will count number of avoided tag checks by tag inference.
      ---------------------------------- Flags --------------------------------------
      , StgToCmmConfig -> Bool
    stgToCmmLoopification  :: !Bool              -- ^ Loopification enabled (cf @-floopification@)
      , StgToCmmConfig -> Bool
    stgToCmmAlignCheck     :: !Bool              -- ^ Insert alignment check (cf @-falignment-sanitisation@)
      , StgToCmmConfig -> Bool
    stgToCmmOptHpc         :: !Bool              -- ^ perform code generation for code coverage
      , StgToCmmConfig -> Bool
    stgToCmmFastPAPCalls   :: !Bool              -- ^
      , StgToCmmConfig -> Bool
    stgToCmmSCCProfiling   :: !Bool              -- ^ Check if cost-centre profiling is enabled
      , StgToCmmConfig -> Bool
    stgToCmmEagerBlackHole :: !Bool              -- ^
      , StgToCmmConfig -> Bool
    stgToCmmOrigThunkInfo  :: !Bool              -- ^ Push @stg_orig_thunk_info@ frames during thunk update.
      , StgToCmmConfig -> Bool
    stgToCmmInfoTableMap   :: !Bool              -- ^ true means generate C Stub for IPE map, See Note [Mapping Info Tables to Source Positions]
      , StgToCmmConfig -> Bool
    stgToCmmInfoTableMapWithFallback :: !Bool    -- ^ Include info tables with fallback source locations in the info table map
      , StgToCmmConfig -> Bool
    stgToCmmInfoTableMapWithStack :: !Bool       -- ^ Include info tables for STACK closures in the info table map
      , StgToCmmConfig -> Bool
    stgToCmmOmitYields     :: !Bool              -- ^ true means omit heap checks when no allocation is performed
      , StgToCmmConfig -> Bool
    stgToCmmOmitIfPragmas  :: !Bool              -- ^ true means don't generate interface programs (implied by -O0)
      , StgToCmmConfig -> Bool
    stgToCmmPIC            :: !Bool              -- ^ true if @-fPIC@
      , StgToCmmConfig -> Bool
    stgToCmmPIE            :: !Bool              -- ^ true if @-fPIE@
      , StgToCmmConfig -> Bool
    stgToCmmExtDynRefs     :: !Bool              -- ^ true if @-fexternal-dynamic-refs@, meaning generate
                                                     -- code for linking against dynamic libraries
      , StgToCmmConfig -> Bool
    stgToCmmDoBoundsCheck  :: !Bool              -- ^ decides whether to check array bounds in StgToCmm.Prim
                                                     -- or not
      , StgToCmmConfig -> Bool
    stgToCmmDoTagCheck     :: !Bool              -- ^ Verify tag inference predictions.
      ------------------------------ Backend Flags ----------------------------------
      , StgToCmmConfig -> Bool
    stgToCmmAllowBigArith             :: !Bool   -- ^ Allowed to emit larger than native size arithmetic (only LLVM and C backends)
      , StgToCmmConfig -> Bool
    stgToCmmAllowBigQuot              :: !Bool   -- ^ Allowed to emit larger than native size division operations
      , StgToCmmConfig -> Bool
    stgToCmmAllowQuotRemInstr         :: !Bool   -- ^ Allowed to generate QuotRem instructions
      , StgToCmmConfig -> Bool
    stgToCmmAllowQuotRem2             :: !Bool   -- ^ Allowed to generate QuotRem
      , StgToCmmConfig -> Bool
    stgToCmmAllowExtendedAddSubInstrs :: !Bool   -- ^ Allowed to generate AddWordC, SubWordC, Add2, etc.
      , StgToCmmConfig -> Bool
    stgToCmmAllowIntMul2Instr         :: !Bool   -- ^ Allowed to generate IntMul2 instruction
      , StgToCmmConfig -> FMASign -> Bool
    stgToCmmAllowFMAInstr             :: FMASign -> Bool -- ^ Allowed to generate FMA instruction
      , StgToCmmConfig -> Bool
    stgToCmmTickyAP                   :: !Bool   -- ^ Disable use of precomputed standard thunks.
      ------------------------------ SIMD flags ------------------------------------
      -- Each of these flags checks vector compatibility with the backend requested
      -- during compilation. In essence, this means checking for @-fllvm@ which is
      -- the only backend that currently allows SIMD instructions, see
      -- Ghc.StgToCmm.Prim.checkVecCompatibility for these flags only call site.
      , StgToCmmConfig -> Maybe String
    stgToCmmVecInstrsErr   :: Maybe String       -- ^ Error (if any) to raise when vector instructions are
                                                     -- used, see @StgToCmm.Prim.checkVecCompatibility@
      , StgToCmmConfig -> Bool
    stgToCmmAvx            :: !Bool              -- ^ check for Advanced Vector Extensions
      , StgToCmmConfig -> Bool
    stgToCmmAvx2           :: !Bool              -- ^ check for Advanced Vector Extensions 2
      , StgToCmmConfig -> Bool
    stgToCmmAvx512f        :: !Bool              -- ^ check for Advanced Vector 512-bit Extensions
      }

    stgToCmmPlatform :: StgToCmmConfig -> Platform
    stgToCmmPlatform :: StgToCmmConfig -> Platform
    stgToCmmPlatform = Profile -> Platform
    profilePlatform (Profile -> Platform)
    -> (StgToCmmConfig -> Profile) -> StgToCmmConfig -> Platform
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . StgToCmmConfig -> Profile
    stgToCmmProfile