    -- | Datatype definitions for the flag representation stored in interface files
    module GHC.Iface.Flags (
         IfaceDynFlags(..)
       , IfaceGeneralFlag(..)
       , IfaceProfAuto(..)
       , IfaceExtension(..)
       , IfaceLanguage(..)
       , IfaceCppOptions(..)
       , pprIfaceDynFlags
       , missingExtraFlagInfo
       ) where

    import GHC.Prelude

    import GHC.Utils.Outputable
    import Control.DeepSeq
    import GHC.Utils.Fingerprint
    import GHC.Utils.Binary

    import GHC.Driver.DynFlags
    import GHC.Types.SafeHaskell
    import GHC.Core.Opt.CallerCC.Types

    import qualified GHC.LanguageExtensions as LangExt

    -- The part of DynFlags which recompilation information needs
    data IfaceDynFlags = IfaceDynFlags
            { IfaceDynFlags -> Maybe (Maybe String)
    ifaceMainIs :: Maybe (Maybe String)
            , IfaceDynFlags -> IfaceTrustInfo
    ifaceSafeMode :: IfaceTrustInfo
            , IfaceDynFlags -> Maybe IfaceLanguage
    ifaceLang :: Maybe IfaceLanguage
            , IfaceDynFlags -> [IfaceExtension]
    ifaceExts :: [IfaceExtension]
            , IfaceDynFlags -> IfaceCppOptions
    ifaceCppOptions :: IfaceCppOptions
            , IfaceDynFlags -> IfaceCppOptions
    ifaceJsOptions  :: IfaceCppOptions
            , IfaceDynFlags -> IfaceCppOptions
    ifaceCmmOptions :: IfaceCppOptions
            , IfaceDynFlags -> [String]
    ifacePaths :: [String]
            , IfaceDynFlags -> Maybe IfaceProfAuto
    ifaceProf  :: Maybe IfaceProfAuto
            , IfaceDynFlags -> [IfaceGeneralFlag]
    ifaceTicky :: [IfaceGeneralFlag]
            , IfaceDynFlags -> [IfaceGeneralFlag]
    ifaceCodeGen :: [IfaceGeneralFlag]
            , IfaceDynFlags -> Bool
    ifaceFatIface :: Bool
            , IfaceDynFlags -> Int
    ifaceDebugLevel :: Int
            , IfaceDynFlags -> [CallerCcFilter]
    ifaceCallerCCFilters :: [CallerCcFilter]
            }

    pprIfaceDynFlags :: IfaceDynFlags -> SDoc
    pprIfaceDynFlags :: IfaceDynFlags -> SDoc
    pprIfaceDynFlags (IfaceDynFlags Maybe (Maybe String)
    a1 IfaceTrustInfo
    a2 Maybe IfaceLanguage
    a3 [IfaceExtension]
    a4 IfaceCppOptions
    a5 IfaceCppOptions
    a6 IfaceCppOptions
    a7 [String]
    a8 Maybe IfaceProfAuto
    a9 [IfaceGeneralFlag]
    a10 [IfaceGeneralFlag]
    a11 Bool
    a12 Int
    a13 [CallerCcFilter]
    a14) =
      [SDoc] -> SDoc
    forall doc. IsDoc doc => [doc] -> doc
    vcat [ String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "main-is:" SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> (Maybe (Maybe SDoc) -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr (Maybe (Maybe SDoc) -> SDoc) -> Maybe (Maybe SDoc) -> SDoc
    forall a b. (a -> b) -> a -> b
    $ (Maybe String -> Maybe SDoc)
    -> Maybe (Maybe String) -> Maybe (Maybe SDoc)
    forall a b. (a -> b) -> Maybe a -> Maybe b
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    fmap ((String -> SDoc) -> Maybe String -> Maybe SDoc
    forall a b. (a -> b) -> Maybe a -> Maybe b
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    fmap (forall doc. IsLine doc => String -> doc
    text @SDoc)) Maybe (Maybe String)
    a1)
           , String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "safe-mode:" SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> IfaceTrustInfo -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr IfaceTrustInfo
    a2
           , String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "lang:" SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> Maybe IfaceLanguage -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Maybe IfaceLanguage
    a3
           , String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "exts:" SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> [IfaceExtension] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [IfaceExtension]
    a4
           , String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "cpp-options:"
           , Int -> SDoc -> SDoc
    nest Int
    2 (SDoc -> SDoc) -> SDoc -> SDoc
    forall a b. (a -> b) -> a -> b
    $ IfaceCppOptions -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr IfaceCppOptions
    a5
           , String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "js-options:"
           , Int -> SDoc -> SDoc
    nest Int
    2 (SDoc -> SDoc) -> SDoc -> SDoc
    forall a b. (a -> b) -> a -> b
    $ IfaceCppOptions -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr IfaceCppOptions
    a6
           , String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "cmm-options:"
           , Int -> SDoc -> SDoc
    nest Int
    2 (SDoc -> SDoc) -> SDoc -> SDoc
    forall a b. (a -> b) -> a -> b
    $ IfaceCppOptions -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr IfaceCppOptions
    a7
           , String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "paths:" SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> [SDoc] -> SDoc
    forall doc. IsLine doc => [doc] -> doc
    hcat ((String -> SDoc) -> [String] -> [SDoc]
    forall a b. (a -> b) -> [a] -> [b]
    map String -> SDoc
    forall doc. IsLine doc => String -> doc
    text [String]
    a8)
           , String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "prof:"  SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> Maybe IfaceProfAuto -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Maybe IfaceProfAuto
    a9
           , String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "ticky:"
           , Int -> SDoc -> SDoc
    nest Int
    2 (SDoc -> SDoc) -> SDoc -> SDoc
    forall a b. (a -> b) -> a -> b
    $ [SDoc] -> SDoc
    forall doc. IsDoc doc => [doc] -> doc
    vcat ((IfaceGeneralFlag -> SDoc) -> [IfaceGeneralFlag] -> [SDoc]
    forall a b. (a -> b) -> [a] -> [b]
    map IfaceGeneralFlag -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [IfaceGeneralFlag]
    a10)
           , String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "codegen:"
           , Int -> SDoc -> SDoc
    nest Int
    2 (SDoc -> SDoc) -> SDoc -> SDoc
    forall a b. (a -> b) -> a -> b
    $ [SDoc] -> SDoc
    forall doc. IsDoc doc => [doc] -> doc
    vcat ((IfaceGeneralFlag -> SDoc) -> [IfaceGeneralFlag] -> [SDoc]
    forall a b. (a -> b) -> [a] -> [b]
    map IfaceGeneralFlag -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [IfaceGeneralFlag]
    a11)
           , String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "fat-iface:" SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> Bool -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Bool
    a12
           , String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "debug-level:" SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> Int -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Int
    a13
           , String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "caller-cc-filters:" SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> [CallerCcFilter] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [CallerCcFilter]
    a14
           ]

    missingExtraFlagInfo :: SDoc
    missingExtraFlagInfo :: SDoc
    missingExtraFlagInfo = String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "flags: no detailed info, recompile with -fwrite-if-self-recomp-flags"
      where
        -- If you modify the name of this flag, you have to modify this string.
        _placeholder :: GeneralFlag
    _placeholder = GeneralFlag
    Opt_WriteSelfRecompFlags

    instance Binary IfaceDynFlags where
      put_ :: WriteBinHandle -> IfaceDynFlags -> IO ()
    put_ WriteBinHandle
    bh (IfaceDynFlags Maybe (Maybe String)
    a1 IfaceTrustInfo
    a2 Maybe IfaceLanguage
    a3 [IfaceExtension]
    a4 IfaceCppOptions
    a5 IfaceCppOptions
    a6 IfaceCppOptions
    a7 [String]
    a8 Maybe IfaceProfAuto
    a9 [IfaceGeneralFlag]
    a10 [IfaceGeneralFlag]
    a11 Bool
    a12 Int
    a13 [CallerCcFilter]
    a14) = do
        WriteBinHandle -> Maybe (Maybe String) -> IO ()
    forall a. Binary a => WriteBinHandle -> a -> IO ()
    put_ WriteBinHandle
    bh Maybe (Maybe String)
    a1
        WriteBinHandle -> IfaceTrustInfo -> IO ()
    forall a. Binary a => WriteBinHandle -> a -> IO ()
    put_ WriteBinHandle
    bh IfaceTrustInfo
    a2
        WriteBinHandle -> Maybe IfaceLanguage -> IO ()
    forall a. Binary a => WriteBinHandle -> a -> IO ()
    put_ WriteBinHandle
    bh Maybe IfaceLanguage
    a3
        WriteBinHandle -> [IfaceExtension] -> IO ()
    forall a. Binary a => WriteBinHandle -> a -> IO ()
    put_ WriteBinHandle
    bh [IfaceExtension]
    a4
        WriteBinHandle -> IfaceCppOptions -> IO ()
    forall a. Binary a => WriteBinHandle -> a -> IO ()
    put_ WriteBinHandle
    bh IfaceCppOptions
    a5
        WriteBinHandle -> IfaceCppOptions -> IO ()
    forall a. Binary a => WriteBinHandle -> a -> IO ()
    put_ WriteBinHandle
    bh IfaceCppOptions
    a6
        WriteBinHandle -> IfaceCppOptions -> IO ()
    forall a. Binary a => WriteBinHandle -> a -> IO ()
    put_ WriteBinHandle
    bh IfaceCppOptions
    a7
        WriteBinHandle -> [String] -> IO ()
    forall a. Binary a => WriteBinHandle -> a -> IO ()
    put_ WriteBinHandle
    bh [String]
    a8
        WriteBinHandle -> Maybe IfaceProfAuto -> IO ()
    forall a. Binary a => WriteBinHandle -> a -> IO ()
    put_ WriteBinHandle
    bh Maybe IfaceProfAuto
    a9
        WriteBinHandle -> [IfaceGeneralFlag] -> IO ()
    forall a. Binary a => WriteBinHandle -> a -> IO ()
    put_ WriteBinHandle
    bh [IfaceGeneralFlag]
    a10
        WriteBinHandle -> [IfaceGeneralFlag] -> IO ()
    forall a. Binary a => WriteBinHandle -> a -> IO ()
    put_ WriteBinHandle
    bh [IfaceGeneralFlag]
    a11
        WriteBinHandle -> Bool -> IO ()
    forall a. Binary a => WriteBinHandle -> a -> IO ()
    put_ WriteBinHandle
    bh Bool
    a12
        WriteBinHandle -> Int -> IO ()
    forall a. Binary a => WriteBinHandle -> a -> IO ()
    put_ WriteBinHandle
    bh Int
    a13
        WriteBinHandle -> [CallerCcFilter] -> IO ()
    forall a. Binary a => WriteBinHandle -> a -> IO ()
    put_ WriteBinHandle
    bh [CallerCcFilter]
    a14
      get :: ReadBinHandle -> IO IfaceDynFlags
    get ReadBinHandle
    bh = Maybe (Maybe String)
    -> IfaceTrustInfo
    -> Maybe IfaceLanguage
    -> [IfaceExtension]
    -> IfaceCppOptions
    -> IfaceCppOptions
    -> IfaceCppOptions
    -> [String]
    -> Maybe IfaceProfAuto
    -> [IfaceGeneralFlag]
    -> [IfaceGeneralFlag]
    -> Bool
    -> Int
    -> [CallerCcFilter]
    -> IfaceDynFlags
    IfaceDynFlags (Maybe (Maybe String)
     -> IfaceTrustInfo
     -> Maybe IfaceLanguage
     -> [IfaceExtension]
     -> IfaceCppOptions
     -> IfaceCppOptions
     -> IfaceCppOptions
     -> [String]
     -> Maybe IfaceProfAuto
     -> [IfaceGeneralFlag]
     -> [IfaceGeneralFlag]
     -> Bool
     -> Int
     -> [CallerCcFilter]
     -> IfaceDynFlags)
    -> IO (Maybe (Maybe String))
    -> IO
         (IfaceTrustInfo
          -> Maybe IfaceLanguage
          -> [IfaceExtension]
          -> IfaceCppOptions
          -> IfaceCppOptions
          -> IfaceCppOptions
          -> [String]
          -> Maybe IfaceProfAuto
          -> [IfaceGeneralFlag]
          -> [IfaceGeneralFlag]
          -> Bool
          -> Int
          -> [CallerCcFilter]
          -> IfaceDynFlags)
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$> ReadBinHandle -> IO (Maybe (Maybe String))
    forall a. Binary a => ReadBinHandle -> IO a
    get ReadBinHandle
    bh
                             IO
      (IfaceTrustInfo
       -> Maybe IfaceLanguage
       -> [IfaceExtension]
       -> IfaceCppOptions
       -> IfaceCppOptions
       -> IfaceCppOptions
       -> [String]
       -> Maybe IfaceProfAuto
       -> [IfaceGeneralFlag]
       -> [IfaceGeneralFlag]
       -> Bool
       -> Int
       -> [CallerCcFilter]
       -> IfaceDynFlags)
    -> IO IfaceTrustInfo
    -> IO
         (Maybe IfaceLanguage
          -> [IfaceExtension]
          -> IfaceCppOptions
          -> IfaceCppOptions
          -> IfaceCppOptions
          -> [String]
          -> Maybe IfaceProfAuto
          -> [IfaceGeneralFlag]
          -> [IfaceGeneralFlag]
          -> Bool
          -> Int
          -> [CallerCcFilter]
          -> IfaceDynFlags)
    forall a b. IO (a -> b) -> IO a -> IO b
    forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
    <*> ReadBinHandle -> IO IfaceTrustInfo
    forall a. Binary a => ReadBinHandle -> IO a
    get ReadBinHandle
    bh
                             IO
      (Maybe IfaceLanguage
       -> [IfaceExtension]
       -> IfaceCppOptions
       -> IfaceCppOptions
       -> IfaceCppOptions
       -> [String]
       -> Maybe IfaceProfAuto
       -> [IfaceGeneralFlag]
       -> [IfaceGeneralFlag]
       -> Bool
       -> Int
       -> [CallerCcFilter]
       -> IfaceDynFlags)
    -> IO (Maybe IfaceLanguage)
    -> IO
         ([IfaceExtension]
          -> IfaceCppOptions
          -> IfaceCppOptions
          -> IfaceCppOptions
          -> [String]
          -> Maybe IfaceProfAuto
          -> [IfaceGeneralFlag]
          -> [IfaceGeneralFlag]
          -> Bool
          -> Int
          -> [CallerCcFilter]
          -> IfaceDynFlags)
    forall a b. IO (a -> b) -> IO a -> IO b
    forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
    <*> ReadBinHandle -> IO (Maybe IfaceLanguage)
    forall a. Binary a => ReadBinHandle -> IO a
    get ReadBinHandle
    bh
                             IO
      ([IfaceExtension]
       -> IfaceCppOptions
       -> IfaceCppOptions
       -> IfaceCppOptions
       -> [String]
       -> Maybe IfaceProfAuto
       -> [IfaceGeneralFlag]
       -> [IfaceGeneralFlag]
       -> Bool
       -> Int
       -> [CallerCcFilter]
       -> IfaceDynFlags)
    -> IO [IfaceExtension]
    -> IO
         (IfaceCppOptions
          -> IfaceCppOptions
          -> IfaceCppOptions
          -> [String]
          -> Maybe IfaceProfAuto
          -> [IfaceGeneralFlag]
          -> [IfaceGeneralFlag]
          -> Bool
          -> Int
          -> [CallerCcFilter]
          -> IfaceDynFlags)
    forall a b. IO (a -> b) -> IO a -> IO b
    forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
    <*> ReadBinHandle -> IO [IfaceExtension]
    forall a. Binary a => ReadBinHandle -> IO a
    get ReadBinHandle
    bh
                             IO
      (IfaceCppOptions
       -> IfaceCppOptions
       -> IfaceCppOptions
       -> [String]
       -> Maybe IfaceProfAuto
       -> [IfaceGeneralFlag]
       -> [IfaceGeneralFlag]
       -> Bool
       -> Int
       -> [CallerCcFilter]
       -> IfaceDynFlags)
    -> IO IfaceCppOptions
    -> IO
         (IfaceCppOptions
          -> IfaceCppOptions
          -> [String]
          -> Maybe IfaceProfAuto
          -> [IfaceGeneralFlag]
          -> [IfaceGeneralFlag]
          -> Bool
          -> Int
          -> [CallerCcFilter]
          -> IfaceDynFlags)
    forall a b. IO (a -> b) -> IO a -> IO b
    forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
    <*> ReadBinHandle -> IO IfaceCppOptions
    forall a. Binary a => ReadBinHandle -> IO a
    get ReadBinHandle
    bh
                             IO
      (IfaceCppOptions
       -> IfaceCppOptions
       -> [String]
       -> Maybe IfaceProfAuto
       -> [IfaceGeneralFlag]
       -> [IfaceGeneralFlag]
       -> Bool
       -> Int
       -> [CallerCcFilter]
       -> IfaceDynFlags)
    -> IO IfaceCppOptions
    -> IO
         (IfaceCppOptions
          -> [String]
          -> Maybe IfaceProfAuto
          -> [IfaceGeneralFlag]
          -> [IfaceGeneralFlag]
          -> Bool
          -> Int
          -> [CallerCcFilter]
          -> IfaceDynFlags)
    forall a b. IO (a -> b) -> IO a -> IO b
    forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
    <*> ReadBinHandle -> IO IfaceCppOptions
    forall a. Binary a => ReadBinHandle -> IO a
    get ReadBinHandle
    bh
                             IO
      (IfaceCppOptions
       -> [String]
       -> Maybe IfaceProfAuto
       -> [IfaceGeneralFlag]
       -> [IfaceGeneralFlag]
       -> Bool
       -> Int
       -> [CallerCcFilter]
       -> IfaceDynFlags)
    -> IO IfaceCppOptions
    -> IO
         ([String]
          -> Maybe IfaceProfAuto
          -> [IfaceGeneralFlag]
          -> [IfaceGeneralFlag]
          -> Bool
          -> Int
          -> [CallerCcFilter]
          -> IfaceDynFlags)
    forall a b. IO (a -> b) -> IO a -> IO b
    forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
    <*> ReadBinHandle -> IO IfaceCppOptions
    forall a. Binary a => ReadBinHandle -> IO a
    get ReadBinHandle
    bh
                             IO
      ([String]
       -> Maybe IfaceProfAuto
       -> [IfaceGeneralFlag]
       -> [IfaceGeneralFlag]
       -> Bool
       -> Int
       -> [CallerCcFilter]
       -> IfaceDynFlags)
    -> IO [String]
    -> IO
         (Maybe IfaceProfAuto
          -> [IfaceGeneralFlag]
          -> [IfaceGeneralFlag]
          -> Bool
          -> Int
          -> [CallerCcFilter]
          -> IfaceDynFlags)
    forall a b. IO (a -> b) -> IO a -> IO b
    forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
    <*> ReadBinHandle -> IO [String]
    forall a. Binary a => ReadBinHandle -> IO a
    get ReadBinHandle
    bh
                             IO
      (Maybe IfaceProfAuto
       -> [IfaceGeneralFlag]
       -> [IfaceGeneralFlag]
       -> Bool
       -> Int
       -> [CallerCcFilter]
       -> IfaceDynFlags)
    -> IO (Maybe IfaceProfAuto)
    -> IO
         ([IfaceGeneralFlag]
          -> [IfaceGeneralFlag]
          -> Bool
          -> Int
          -> [CallerCcFilter]
          -> IfaceDynFlags)
    forall a b. IO (a -> b) -> IO a -> IO b
    forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
    <*> ReadBinHandle -> IO (Maybe IfaceProfAuto)
    forall a. Binary a => ReadBinHandle -> IO a
    get ReadBinHandle
    bh
                             IO
      ([IfaceGeneralFlag]
       -> [IfaceGeneralFlag]
       -> Bool
       -> Int
       -> [CallerCcFilter]
       -> IfaceDynFlags)
    -> IO [IfaceGeneralFlag]
    -> IO
         ([IfaceGeneralFlag]
          -> Bool -> Int -> [CallerCcFilter] -> IfaceDynFlags)
    forall a b. IO (a -> b) -> IO a -> IO b
    forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
    <*> ReadBinHandle -> IO [IfaceGeneralFlag]
    forall a. Binary a => ReadBinHandle -> IO a
    get ReadBinHandle
    bh
                             IO
      ([IfaceGeneralFlag]
       -> Bool -> Int -> [CallerCcFilter] -> IfaceDynFlags)
    -> IO [IfaceGeneralFlag]
    -> IO (Bool -> Int -> [CallerCcFilter] -> IfaceDynFlags)
    forall a b. IO (a -> b) -> IO a -> IO b
    forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
    <*> ReadBinHandle -> IO [IfaceGeneralFlag]
    forall a. Binary a => ReadBinHandle -> IO a
    get ReadBinHandle
    bh
                             IO (Bool -> Int -> [CallerCcFilter] -> IfaceDynFlags)
    -> IO Bool -> IO (Int -> [CallerCcFilter] -> IfaceDynFlags)
    forall a b. IO (a -> b) -> IO a -> IO b
    forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
    <*> ReadBinHandle -> IO Bool
    forall a. Binary a => ReadBinHandle -> IO a
    get ReadBinHandle
    bh
                             IO (Int -> [CallerCcFilter] -> IfaceDynFlags)
    -> IO Int -> IO ([CallerCcFilter] -> IfaceDynFlags)
    forall a b. IO (a -> b) -> IO a -> IO b
    forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
    <*> ReadBinHandle -> IO Int
    forall a. Binary a => ReadBinHandle -> IO a
    get ReadBinHandle
    bh
                             IO ([CallerCcFilter] -> IfaceDynFlags)
    -> IO [CallerCcFilter] -> IO IfaceDynFlags
    forall a b. IO (a -> b) -> IO a -> IO b
    forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
    <*> ReadBinHandle -> IO [CallerCcFilter]
    forall a. Binary a => ReadBinHandle -> IO a
    get ReadBinHandle
    bh

    instance NFData IfaceDynFlags where
      rnf :: IfaceDynFlags -> ()
    rnf (IfaceDynFlags Maybe (Maybe String)
    a1 IfaceTrustInfo
    a2 Maybe IfaceLanguage
    a3 [IfaceExtension]
    a4 IfaceCppOptions
    a5 IfaceCppOptions
    a6 IfaceCppOptions
    a7 [String]
    a8 Maybe IfaceProfAuto
    a9 [IfaceGeneralFlag]
    a10 [IfaceGeneralFlag]
    a11 Bool
    a12 Int
    a13 [CallerCcFilter]
    a14) =
              Maybe (Maybe String) -> ()
    forall a. NFData a => a -> ()
    rnf Maybe (Maybe String)
    a1
        () -> () -> ()
    forall a b. a -> b -> b
    `seq` IfaceTrustInfo -> ()
    forall a. NFData a => a -> ()
    rnf IfaceTrustInfo
    a2
        () -> () -> ()
    forall a b. a -> b -> b
    `seq` Maybe IfaceLanguage -> ()
    forall a. NFData a => a -> ()
    rnf Maybe IfaceLanguage
    a3
        () -> () -> ()
    forall a b. a -> b -> b
    `seq` [IfaceExtension] -> ()
    forall a. NFData a => a -> ()
    rnf [IfaceExtension]
    a4
        () -> () -> ()
    forall a b. a -> b -> b
    `seq` IfaceCppOptions -> ()
    forall a. NFData a => a -> ()
    rnf IfaceCppOptions
    a5
        () -> () -> ()
    forall a b. a -> b -> b
    `seq` IfaceCppOptions -> ()
    forall a. NFData a => a -> ()
    rnf IfaceCppOptions
    a6
        () -> () -> ()
    forall a b. a -> b -> b
    `seq` IfaceCppOptions -> ()
    forall a. NFData a => a -> ()
    rnf IfaceCppOptions
    a7
        () -> () -> ()
    forall a b. a -> b -> b
    `seq` [String] -> ()
    forall a. NFData a => a -> ()
    rnf [String]
    a8
        () -> () -> ()
    forall a b. a -> b -> b
    `seq` Maybe IfaceProfAuto -> ()
    forall a. NFData a => a -> ()
    rnf Maybe IfaceProfAuto
    a9
        () -> () -> ()
    forall a b. a -> b -> b
    `seq` [IfaceGeneralFlag] -> ()
    forall a. NFData a => a -> ()
    rnf [IfaceGeneralFlag]
    a10
        () -> () -> ()
    forall a b. a -> b -> b
    `seq` [IfaceGeneralFlag] -> ()
    forall a. NFData a => a -> ()
    rnf [IfaceGeneralFlag]
    a11
        () -> () -> ()
    forall a b. a -> b -> b
    `seq` Bool -> ()
    forall a. NFData a => a -> ()
    rnf Bool
    a12
        () -> () -> ()
    forall a b. a -> b -> b
    `seq` Int -> ()
    forall a. NFData a => a -> ()
    rnf Int
    a13
        () -> () -> ()
    forall a b. a -> b -> b
    `seq` [CallerCcFilter] -> ()
    forall a. NFData a => a -> ()
    rnf [CallerCcFilter]
    a14

    newtype IfaceGeneralFlag = IfaceGeneralFlag GeneralFlag

    instance NFData IfaceGeneralFlag where
      rnf :: IfaceGeneralFlag -> ()
    rnf (IfaceGeneralFlag !GeneralFlag
    _) = ()

    instance Binary IfaceGeneralFlag where
      put_ :: WriteBinHandle -> IfaceGeneralFlag -> IO ()
    put_ WriteBinHandle
    bh (IfaceGeneralFlag GeneralFlag
    f) = WriteBinHandle -> Int -> IO ()
    forall a. Binary a => WriteBinHandle -> a -> IO ()
    put_ WriteBinHandle
    bh (GeneralFlag -> Int
    forall a. Enum a => a -> Int
    fromEnum GeneralFlag
    f)
      get :: ReadBinHandle -> IO IfaceGeneralFlag
    get ReadBinHandle
    bh = GeneralFlag -> IfaceGeneralFlag
    IfaceGeneralFlag (GeneralFlag -> IfaceGeneralFlag)
    -> (Int -> GeneralFlag) -> Int -> IfaceGeneralFlag
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . Int -> GeneralFlag
    forall a. Enum a => Int -> a
    toEnum (Int -> IfaceGeneralFlag) -> IO Int -> IO IfaceGeneralFlag
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$> ReadBinHandle -> IO Int
    forall a. Binary a => ReadBinHandle -> IO a
    get ReadBinHandle
    bh

    instance Outputable IfaceGeneralFlag where
      ppr :: IfaceGeneralFlag -> SDoc
    ppr (IfaceGeneralFlag GeneralFlag
    f) = String -> SDoc
    forall doc. IsLine doc => String -> doc
    text (GeneralFlag -> String
    forall a. Show a => a -> String
    show GeneralFlag
    f)

    newtype IfaceProfAuto = IfaceProfAuto ProfAuto

    instance NFData IfaceProfAuto where
      rnf :: IfaceProfAuto -> ()
    rnf (IfaceProfAuto !ProfAuto
    _) = ()

    instance Binary IfaceProfAuto where
      put_ :: WriteBinHandle -> IfaceProfAuto -> IO ()
    put_ WriteBinHandle
    bh (IfaceProfAuto ProfAuto
    f) = WriteBinHandle -> Int -> IO ()
    forall a. Binary a => WriteBinHandle -> a -> IO ()
    put_ WriteBinHandle
    bh (ProfAuto -> Int
    forall a. Enum a => a -> Int
    fromEnum ProfAuto
    f)
      get :: ReadBinHandle -> IO IfaceProfAuto
    get ReadBinHandle
    bh = ProfAuto -> IfaceProfAuto
    IfaceProfAuto (ProfAuto -> IfaceProfAuto)
    -> (Int -> ProfAuto) -> Int -> IfaceProfAuto
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . Int -> ProfAuto
    forall a. Enum a => Int -> a
    toEnum (Int -> IfaceProfAuto) -> IO Int -> IO IfaceProfAuto
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$> ReadBinHandle -> IO Int
    forall a. Binary a => ReadBinHandle -> IO a
    get ReadBinHandle
    bh

    instance Outputable IfaceProfAuto where
      ppr :: IfaceProfAuto -> SDoc
    ppr (IfaceProfAuto ProfAuto
    f) = String -> SDoc
    forall doc. IsLine doc => String -> doc
    text (ProfAuto -> String
    forall a. Show a => a -> String
    show ProfAuto
    f)

    newtype IfaceExtension = IfaceExtension LangExt.Extension

    instance NFData IfaceExtension where
      rnf :: IfaceExtension -> ()
    rnf (IfaceExtension !Extension
    _) = ()

    instance Binary IfaceExtension where
      put_ :: WriteBinHandle -> IfaceExtension -> IO ()
    put_ WriteBinHandle
    bh (IfaceExtension Extension
    f) = WriteBinHandle -> Int -> IO ()
    forall a. Binary a => WriteBinHandle -> a -> IO ()
    put_ WriteBinHandle
    bh (Extension -> Int
    forall a. Enum a => a -> Int
    fromEnum Extension
    f)
      get :: ReadBinHandle -> IO IfaceExtension
    get ReadBinHandle
    bh = Extension -> IfaceExtension
    IfaceExtension (Extension -> IfaceExtension)
    -> (Int -> Extension) -> Int -> IfaceExtension
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . Int -> Extension
    forall a. Enum a => Int -> a
    toEnum (Int -> IfaceExtension) -> IO Int -> IO IfaceExtension
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$> ReadBinHandle -> IO Int
    forall a. Binary a => ReadBinHandle -> IO a
    get ReadBinHandle
    bh

    instance Outputable IfaceExtension where
      ppr :: IfaceExtension -> SDoc
    ppr (IfaceExtension Extension
    f) = String -> SDoc
    forall doc. IsLine doc => String -> doc
    text (Extension -> String
    forall a. Show a => a -> String
    show Extension
    f)

    newtype IfaceLanguage = IfaceLanguage Language

    instance NFData IfaceLanguage where
      rnf :: IfaceLanguage -> ()
    rnf (IfaceLanguage !Language
    _) = ()

    instance Binary IfaceLanguage where
      put_ :: WriteBinHandle -> IfaceLanguage -> IO ()
    put_ WriteBinHandle
    bh (IfaceLanguage Language
    f) = WriteBinHandle -> Int -> IO ()
    forall a. Binary a => WriteBinHandle -> a -> IO ()
    put_ WriteBinHandle
    bh (Language -> Int
    forall a. Enum a => a -> Int
    fromEnum Language
    f)
      get :: ReadBinHandle -> IO IfaceLanguage
    get ReadBinHandle
    bh = Language -> IfaceLanguage
    IfaceLanguage (Language -> IfaceLanguage)
    -> (Int -> Language) -> Int -> IfaceLanguage
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . Int -> Language
    forall a. Enum a => Int -> a
    toEnum (Int -> IfaceLanguage) -> IO Int -> IO IfaceLanguage
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$> ReadBinHandle -> IO Int
    forall a. Binary a => ReadBinHandle -> IO a
    get ReadBinHandle
    bh

    instance Outputable IfaceLanguage where
      ppr :: IfaceLanguage -> SDoc
    ppr (IfaceLanguage Language
    f) = String -> SDoc
    forall doc. IsLine doc => String -> doc
    text (Language -> String
    forall a. Show a => a -> String
    show Language
    f)

    data IfaceCppOptions = IfaceCppOptions { IfaceCppOptions -> [String]
    ifaceCppIncludes :: [FilePath]
                                           , IfaceCppOptions -> [String]
    ifaceCppOpts :: [String]
                                           , IfaceCppOptions -> ([String], Fingerprint)
    ifaceCppSig :: ([String], Fingerprint)
                                           }

    instance NFData IfaceCppOptions where
      rnf :: IfaceCppOptions -> ()
    rnf (IfaceCppOptions [String]
    is [String]
    os ([String], Fingerprint)
    s) = [String] -> ()
    forall a. NFData a => a -> ()
    rnf [String]
    is () -> () -> ()
    forall a b. a -> b -> b
    `seq` [String] -> ()
    forall a. NFData a => a -> ()
    rnf [String]
    os () -> () -> ()
    forall a b. a -> b -> b
    `seq` ([String], Fingerprint) -> ()
    forall a. NFData a => a -> ()
    rnf ([String], Fingerprint)
    s

    instance Binary IfaceCppOptions where
      put_ :: WriteBinHandle -> IfaceCppOptions -> IO ()
    put_ WriteBinHandle
    bh (IfaceCppOptions [String]
    is [String]
    os ([String], Fingerprint)
    s) = do
         WriteBinHandle -> [String] -> IO ()
    forall a. Binary a => WriteBinHandle -> a -> IO ()
    put_ WriteBinHandle
    bh [String]
    is
         WriteBinHandle -> [String] -> IO ()
    forall a. Binary a => WriteBinHandle -> a -> IO ()
    put_ WriteBinHandle
    bh [String]
    os
         WriteBinHandle -> ([String], Fingerprint) -> IO ()
    forall a. Binary a => WriteBinHandle -> a -> IO ()
    put_ WriteBinHandle
    bh ([String], Fingerprint)
    s
      get :: ReadBinHandle -> IO IfaceCppOptions
    get ReadBinHandle
    bh = [String] -> [String] -> ([String], Fingerprint) -> IfaceCppOptions
    IfaceCppOptions ([String]
     -> [String] -> ([String], Fingerprint) -> IfaceCppOptions)
    -> IO [String]
    -> IO ([String] -> ([String], Fingerprint) -> IfaceCppOptions)
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$> ReadBinHandle -> IO [String]
    forall a. Binary a => ReadBinHandle -> IO a
    get ReadBinHandle
    bh IO ([String] -> ([String], Fingerprint) -> IfaceCppOptions)
    -> IO [String] -> IO (([String], Fingerprint) -> IfaceCppOptions)
    forall a b. IO (a -> b) -> IO a -> IO b
    forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
    <*> ReadBinHandle -> IO [String]
    forall a. Binary a => ReadBinHandle -> IO a
    get ReadBinHandle
    bh IO (([String], Fingerprint) -> IfaceCppOptions)
    -> IO ([String], Fingerprint) -> IO IfaceCppOptions
    forall a b. IO (a -> b) -> IO a -> IO b
    forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
    <*> ReadBinHandle -> IO ([String], Fingerprint)
    forall a. Binary a => ReadBinHandle -> IO a
    get ReadBinHandle
    bh

    instance Outputable IfaceCppOptions where
      ppr :: IfaceCppOptions -> SDoc
    ppr (IfaceCppOptions [String]
    is [String]
    os ([String]
    wos, Fingerprint
    fp)) =
            [SDoc] -> SDoc
    forall doc. IsDoc doc => [doc] -> doc
    vcat [String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "includes:"
                 , Int -> SDoc -> SDoc
    nest Int
    2 (SDoc -> SDoc) -> SDoc -> SDoc
    forall a b. (a -> b) -> a -> b
    $ [SDoc] -> SDoc
    forall doc. IsLine doc => [doc] -> doc
    hcat ((String -> SDoc) -> [String] -> [SDoc]
    forall a b. (a -> b) -> [a] -> [b]
    map String -> SDoc
    forall doc. IsLine doc => String -> doc
    text [String]
    is)
                 , String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "opts:"
                 , Int -> SDoc -> SDoc
    nest Int
    2 (SDoc -> SDoc) -> SDoc -> SDoc
    forall a b. (a -> b) -> a -> b
    $ [SDoc] -> SDoc
    forall doc. IsLine doc => [doc] -> doc
    hcat ((String -> SDoc) -> [String] -> [SDoc]
    forall a b. (a -> b) -> [a] -> [b]
    map String -> SDoc
    forall doc. IsLine doc => String -> doc
    text [String]
    os)
                 , String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "signature:"
                 , Int -> SDoc -> SDoc
    nest Int
    2 (SDoc -> SDoc) -> SDoc -> SDoc
    forall a b. (a -> b) -> a -> b
    $ SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc
    parens (Fingerprint -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Fingerprint
    fp) SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> [SDoc] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr ((String -> SDoc) -> [String] -> [SDoc]
    forall a b. (a -> b) -> [a] -> [b]
    map (forall doc. IsLine doc => String -> doc
    text @SDoc) [String]
    wos)

                 ]