{-# LANGUAGE RecordWildCards #-}

-- | This module manages storing the various GHC option flags in a modules
-- interface file as part of the recompilation checking infrastructure.
module GHC.Iface.Recomp.Flags (
        fingerprintDynFlags
      , fingerprintOptFlags
      , fingerprintHpcFlags
    ) where

import GHC.Prelude

import GHC.Driver.Session
import GHC.Driver.Env

import GHC.Utils.Binary
import GHC.Unit.Module
import GHC.Types.Name
import GHC.Types.SafeHaskell
import GHC.Utils.Fingerprint
import GHC.Iface.Recomp.Binary
import GHC.Core.Opt.CallerCC () -- for Binary instances

import GHC.Data.EnumSet as EnumSet
import System.FilePath (normalise)

-- | Produce a fingerprint of a @DynFlags@ value. We only base
-- the finger print on important fields in @DynFlags@ so that
-- the recompilation checker can use this fingerprint.
--
-- NB: The 'Module' parameter is the 'Module' recorded by the *interface*
-- file, not the actual 'Module' according to our 'DynFlags'.
fingerprintDynFlags :: HscEnv -> Module
                    -> (BinHandle -> Name -> IO ())
                    -> IO Fingerprint

fingerprintDynFlags :: HscEnv -> Module -> (BinHandle -> Name -> IO ()) -> IO Fingerprint
fingerprintDynFlags HscEnv
hsc_env Module
this_mod BinHandle -> Name -> IO ()
nameio =
    let dflags :: DynFlags
dflags@DynFlags{Bool
Int
String
[Int]
[String]
[(String, String)]
[(ModuleName, String)]
[(ModuleName, Module)]
[ModuleName]
[CallerCcFilter]
[Option]
[ExternalPluginSpec]
[OnOff Extension]
[PackageDBFlag]
[PackageFlag]
[TrustFlag]
[IgnorePackageFlag]
Maybe Int
Maybe String
Maybe Word
Maybe (String, Int)
Maybe UnitId
Maybe Language
Maybe BmiVersion
Maybe SseVersion
Word
IORef (Maybe CompilerInfo)
IORef (Maybe LinkerInfo)
Set ModuleName
Ways
OverridingBool
Scheme
ModuleName
UnitId
UnfoldingOpts
ProfAuto
Weights
SrcSpan
EnumSet Extension
EnumSet WarningFlag
EnumSet GeneralFlag
EnumSet DumpFlag
SafeHaskellMode
IntWithInf
PlatformMisc
Platform
GhcNameVersion
FileSettings
ToolSettings
TempDir
Backend
FlushOut
RtsOptsEnabled
DynLibLoader
GhcLink
GhcMode
IncludeSpecs
ghcMode :: GhcMode
ghcLink :: GhcLink
backend :: Backend
ghcNameVersion :: GhcNameVersion
fileSettings :: FileSettings
targetPlatform :: Platform
toolSettings :: ToolSettings
platformMisc :: PlatformMisc
rawSettings :: [(String, String)]
tmpDir :: TempDir
llvmOptLevel :: Int
verbosity :: Int
debugLevel :: Int
simplPhases :: Int
maxSimplIterations :: Int
ruleCheck :: Maybe String
strictnessBefore :: [Int]
parMakeCount :: Maybe Int
enableTimeStats :: Bool
ghcHeapSize :: Maybe Int
maxRelevantBinds :: Maybe Int
maxValidHoleFits :: Maybe Int
maxRefHoleFits :: Maybe Int
refLevelHoleFits :: Maybe Int
maxUncoveredPatterns :: Int
maxPmCheckModels :: Int
simplTickFactor :: Int
dmdUnboxWidth :: Int
specConstrThreshold :: Maybe Int
specConstrCount :: Maybe Int
specConstrRecursive :: Int
binBlobThreshold :: Maybe Word
liberateCaseThreshold :: Maybe Int
floatLamArgs :: Maybe Int
liftLamsRecArgs :: Maybe Int
liftLamsNonRecArgs :: Maybe Int
liftLamsKnown :: Bool
cmmProcAlignment :: Maybe Int
historySize :: Int
importPaths :: [String]
mainModuleNameIs :: ModuleName
mainFunIs :: Maybe String
reductionDepth :: IntWithInf
solverIterations :: IntWithInf
homeUnitId_ :: UnitId
homeUnitInstanceOf_ :: Maybe UnitId
homeUnitInstantiations_ :: [(ModuleName, Module)]
workingDirectory :: Maybe String
thisPackageName :: Maybe String
hiddenModules :: Set ModuleName
reexportedModules :: Set ModuleName
targetWays_ :: Ways
splitInfo :: Maybe (String, Int)
objectDir :: Maybe String
dylibInstallName :: Maybe String
hiDir :: Maybe String
hieDir :: Maybe String
stubDir :: Maybe String
dumpDir :: Maybe String
objectSuf_ :: String
hcSuf :: String
hiSuf_ :: String
hieSuf :: String
dynObjectSuf_ :: String
dynHiSuf_ :: String
outputFile_ :: Maybe String
dynOutputFile_ :: Maybe String
outputHi :: Maybe String
dynOutputHi :: Maybe String
dynLibLoader :: DynLibLoader
dynamicNow :: Bool
dumpPrefix :: String
dumpPrefixForce :: Maybe String
ldInputs :: [Option]
includePaths :: IncludeSpecs
libraryPaths :: [String]
frameworkPaths :: [String]
cmdlineFrameworks :: [String]
rtsOpts :: Maybe String
rtsOptsEnabled :: RtsOptsEnabled
rtsOptsSuggestions :: Bool
hpcDir :: String
pluginModNames :: [ModuleName]
pluginModNameOpts :: [(ModuleName, String)]
frontendPluginOpts :: [String]
externalPluginSpecs :: [ExternalPluginSpec]
depMakefile :: String
depIncludePkgDeps :: Bool
depIncludeCppDeps :: Bool
depExcludeMods :: [ModuleName]
depSuffixes :: [String]
packageDBFlags :: [PackageDBFlag]
ignorePackageFlags :: [IgnorePackageFlag]
packageFlags :: [PackageFlag]
pluginPackageFlags :: [PackageFlag]
trustFlags :: [TrustFlag]
packageEnv :: Maybe String
dumpFlags :: EnumSet DumpFlag
generalFlags :: EnumSet GeneralFlag
warningFlags :: EnumSet WarningFlag
fatalWarningFlags :: EnumSet WarningFlag
language :: Maybe Language
safeHaskell :: SafeHaskellMode
safeInfer :: Bool
safeInferred :: Bool
thOnLoc :: SrcSpan
newDerivOnLoc :: SrcSpan
deriveViaOnLoc :: SrcSpan
overlapInstLoc :: SrcSpan
incoherentOnLoc :: SrcSpan
pkgTrustOnLoc :: SrcSpan
warnSafeOnLoc :: SrcSpan
warnUnsafeOnLoc :: SrcSpan
trustworthyOnLoc :: SrcSpan
extensions :: [OnOff Extension]
extensionFlags :: EnumSet Extension
unfoldingOpts :: UnfoldingOpts
maxWorkerArgs :: Int
ghciHistSize :: Int
flushOut :: FlushOut
ghcVersionFile :: Maybe String
haddockOptions :: Maybe String
ghciScripts :: [String]
pprUserLength :: Int
pprCols :: Int
useUnicode :: Bool
useColor :: OverridingBool
canUseColor :: Bool
colScheme :: Scheme
profAuto :: ProfAuto
callerCcFilters :: [CallerCcFilter]
interactivePrint :: Maybe String
sseVersion :: Maybe SseVersion
bmiVersion :: Maybe BmiVersion
avx :: Bool
avx2 :: Bool
avx512cd :: Bool
avx512er :: Bool
avx512f :: Bool
avx512pf :: Bool
rtldInfo :: IORef (Maybe LinkerInfo)
rtccInfo :: IORef (Maybe CompilerInfo)
rtasmInfo :: IORef (Maybe CompilerInfo)
maxInlineAllocSize :: Int
maxInlineMemcpyInsns :: Int
maxInlineMemsetInsns :: Int
reverseErrors :: Bool
maxErrors :: Maybe Int
initialUnique :: Word
uniqueIncrement :: Int
cfgWeights :: Weights
ghcMode :: DynFlags -> GhcMode
ghcLink :: DynFlags -> GhcLink
backend :: DynFlags -> Backend
ghcNameVersion :: DynFlags -> GhcNameVersion
fileSettings :: DynFlags -> FileSettings
targetPlatform :: DynFlags -> Platform
toolSettings :: DynFlags -> ToolSettings
platformMisc :: DynFlags -> PlatformMisc
rawSettings :: DynFlags -> [(String, String)]
tmpDir :: DynFlags -> TempDir
llvmOptLevel :: DynFlags -> Int
verbosity :: DynFlags -> Int
debugLevel :: DynFlags -> Int
simplPhases :: DynFlags -> Int
maxSimplIterations :: DynFlags -> Int
ruleCheck :: DynFlags -> Maybe String
strictnessBefore :: DynFlags -> [Int]
parMakeCount :: DynFlags -> Maybe Int
enableTimeStats :: DynFlags -> Bool
ghcHeapSize :: DynFlags -> Maybe Int
maxRelevantBinds :: DynFlags -> Maybe Int
maxValidHoleFits :: DynFlags -> Maybe Int
maxRefHoleFits :: DynFlags -> Maybe Int
refLevelHoleFits :: DynFlags -> Maybe Int
maxUncoveredPatterns :: DynFlags -> Int
maxPmCheckModels :: DynFlags -> Int
simplTickFactor :: DynFlags -> Int
dmdUnboxWidth :: DynFlags -> Int
specConstrThreshold :: DynFlags -> Maybe Int
specConstrCount :: DynFlags -> Maybe Int
specConstrRecursive :: DynFlags -> Int
binBlobThreshold :: DynFlags -> Maybe Word
liberateCaseThreshold :: DynFlags -> Maybe Int
floatLamArgs :: DynFlags -> Maybe Int
liftLamsRecArgs :: DynFlags -> Maybe Int
liftLamsNonRecArgs :: DynFlags -> Maybe Int
liftLamsKnown :: DynFlags -> Bool
cmmProcAlignment :: DynFlags -> Maybe Int
historySize :: DynFlags -> Int
importPaths :: DynFlags -> [String]
mainModuleNameIs :: DynFlags -> ModuleName
mainFunIs :: DynFlags -> Maybe String
reductionDepth :: DynFlags -> IntWithInf
solverIterations :: DynFlags -> IntWithInf
homeUnitId_ :: DynFlags -> UnitId
homeUnitInstanceOf_ :: DynFlags -> Maybe UnitId
homeUnitInstantiations_ :: DynFlags -> [(ModuleName, Module)]
workingDirectory :: DynFlags -> Maybe String
thisPackageName :: DynFlags -> Maybe String
hiddenModules :: DynFlags -> Set ModuleName
reexportedModules :: DynFlags -> Set ModuleName
targetWays_ :: DynFlags -> Ways
splitInfo :: DynFlags -> Maybe (String, Int)
objectDir :: DynFlags -> Maybe String
dylibInstallName :: DynFlags -> Maybe String
hiDir :: DynFlags -> Maybe String
hieDir :: DynFlags -> Maybe String
stubDir :: DynFlags -> Maybe String
dumpDir :: DynFlags -> Maybe String
objectSuf_ :: DynFlags -> String
hcSuf :: DynFlags -> String
hiSuf_ :: DynFlags -> String
hieSuf :: DynFlags -> String
dynObjectSuf_ :: DynFlags -> String
dynHiSuf_ :: DynFlags -> String
outputFile_ :: DynFlags -> Maybe String
dynOutputFile_ :: DynFlags -> Maybe String
outputHi :: DynFlags -> Maybe String
dynOutputHi :: DynFlags -> Maybe String
dynLibLoader :: DynFlags -> DynLibLoader
dynamicNow :: DynFlags -> Bool
dumpPrefix :: DynFlags -> String
dumpPrefixForce :: DynFlags -> Maybe String
ldInputs :: DynFlags -> [Option]
includePaths :: DynFlags -> IncludeSpecs
libraryPaths :: DynFlags -> [String]
frameworkPaths :: DynFlags -> [String]
cmdlineFrameworks :: DynFlags -> [String]
rtsOpts :: DynFlags -> Maybe String
rtsOptsEnabled :: DynFlags -> RtsOptsEnabled
rtsOptsSuggestions :: DynFlags -> Bool
hpcDir :: DynFlags -> String
pluginModNames :: DynFlags -> [ModuleName]
pluginModNameOpts :: DynFlags -> [(ModuleName, String)]
frontendPluginOpts :: DynFlags -> [String]
externalPluginSpecs :: DynFlags -> [ExternalPluginSpec]
depMakefile :: DynFlags -> String
depIncludePkgDeps :: DynFlags -> Bool
depIncludeCppDeps :: DynFlags -> Bool
depExcludeMods :: DynFlags -> [ModuleName]
depSuffixes :: DynFlags -> [String]
packageDBFlags :: DynFlags -> [PackageDBFlag]
ignorePackageFlags :: DynFlags -> [IgnorePackageFlag]
packageFlags :: DynFlags -> [PackageFlag]
pluginPackageFlags :: DynFlags -> [PackageFlag]
trustFlags :: DynFlags -> [TrustFlag]
packageEnv :: DynFlags -> Maybe String
dumpFlags :: DynFlags -> EnumSet DumpFlag
generalFlags :: DynFlags -> EnumSet GeneralFlag
warningFlags :: DynFlags -> EnumSet WarningFlag
fatalWarningFlags :: DynFlags -> EnumSet WarningFlag
language :: DynFlags -> Maybe Language
safeHaskell :: DynFlags -> SafeHaskellMode
safeInfer :: DynFlags -> Bool
safeInferred :: DynFlags -> Bool
thOnLoc :: DynFlags -> SrcSpan
newDerivOnLoc :: DynFlags -> SrcSpan
deriveViaOnLoc :: DynFlags -> SrcSpan
overlapInstLoc :: DynFlags -> SrcSpan
incoherentOnLoc :: DynFlags -> SrcSpan
pkgTrustOnLoc :: DynFlags -> SrcSpan
warnSafeOnLoc :: DynFlags -> SrcSpan
warnUnsafeOnLoc :: DynFlags -> SrcSpan
trustworthyOnLoc :: DynFlags -> SrcSpan
extensions :: DynFlags -> [OnOff Extension]
extensionFlags :: DynFlags -> EnumSet Extension
unfoldingOpts :: DynFlags -> UnfoldingOpts
maxWorkerArgs :: DynFlags -> Int
ghciHistSize :: DynFlags -> Int
flushOut :: DynFlags -> FlushOut
ghcVersionFile :: DynFlags -> Maybe String
haddockOptions :: DynFlags -> Maybe String
ghciScripts :: DynFlags -> [String]
pprUserLength :: DynFlags -> Int
pprCols :: DynFlags -> Int
useUnicode :: DynFlags -> Bool
useColor :: DynFlags -> OverridingBool
canUseColor :: DynFlags -> Bool
colScheme :: DynFlags -> Scheme
profAuto :: DynFlags -> ProfAuto
callerCcFilters :: DynFlags -> [CallerCcFilter]
interactivePrint :: DynFlags -> Maybe String
sseVersion :: DynFlags -> Maybe SseVersion
bmiVersion :: DynFlags -> Maybe BmiVersion
avx :: DynFlags -> Bool
avx2 :: DynFlags -> Bool
avx512cd :: DynFlags -> Bool
avx512er :: DynFlags -> Bool
avx512f :: DynFlags -> Bool
avx512pf :: DynFlags -> Bool
rtldInfo :: DynFlags -> IORef (Maybe LinkerInfo)
rtccInfo :: DynFlags -> IORef (Maybe CompilerInfo)
rtasmInfo :: DynFlags -> IORef (Maybe CompilerInfo)
maxInlineAllocSize :: DynFlags -> Int
maxInlineMemcpyInsns :: DynFlags -> Int
maxInlineMemsetInsns :: DynFlags -> Int
reverseErrors :: DynFlags -> Bool
maxErrors :: DynFlags -> Maybe Int
initialUnique :: DynFlags -> Word
uniqueIncrement :: DynFlags -> Int
cfgWeights :: DynFlags -> Weights
..} = HscEnv -> DynFlags
hsc_dflags HscEnv
hsc_env
        mainis :: Maybe (Maybe String)
mainis   = if HomeUnitEnv -> Module
mainModIs (HscEnv -> HomeUnitEnv
hsc_HUE HscEnv
hsc_env) Module -> Module -> Bool
forall a. Eq a => a -> a -> Bool
== Module
this_mod then Maybe String -> Maybe (Maybe String)
forall a. a -> Maybe a
Just Maybe String
mainFunIs else Maybe (Maybe String)
forall a. Maybe a
Nothing
                      -- see #5878
        -- pkgopts  = (homeUnit home_unit, sort $ packageFlags dflags)
        safeHs :: IfaceTrustInfo
safeHs   = SafeHaskellMode -> IfaceTrustInfo
setSafeMode SafeHaskellMode
safeHaskell
        -- oflags   = sort $ filter filterOFlags $ flags dflags

        -- all the extension flags and the language
        lang :: (Maybe Int, [Int])
lang = ((Language -> Int) -> Maybe Language -> Maybe Int
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Language -> Int
forall a. Enum a => a -> Int
fromEnum Maybe Language
language,
                (Extension -> Int) -> [Extension] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map Extension -> Int
forall a. Enum a => a -> Int
fromEnum ([Extension] -> [Int]) -> [Extension] -> [Int]
forall a b. (a -> b) -> a -> b
$ EnumSet Extension -> [Extension]
forall a. Enum a => EnumSet a -> [a]
EnumSet.toList EnumSet Extension
extensionFlags)

        -- avoid fingerprinting the absolute path to the directory of the source file
        -- see Note [Implicit include paths]
        includePathsMinusImplicit :: IncludeSpecs
includePathsMinusImplicit = IncludeSpecs
includePaths { includePathsQuoteImplicit = [] }

        -- -I, -D and -U flags affect CPP
        cpp :: ([String], [String], ([String], Fingerprint))
cpp = ( (String -> String) -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map String -> String
normalise ([String] -> [String]) -> [String] -> [String]
forall a b. (a -> b) -> a -> b
$ IncludeSpecs -> [String]
flattenIncludes IncludeSpecs
includePathsMinusImplicit
            -- normalise: eliminate spurious differences due to "./foo" vs "foo"
              , DynFlags -> [String]
picPOpts DynFlags
dflags
              , DynFlags -> ([String], Fingerprint)
opt_P_signature DynFlags
dflags)
            -- See Note [Repeated -optP hashing]

        -- Note [path flags and recompilation]
        paths :: [String]
paths = [ String
hcSuf ]

        -- -fprof-auto etc.
        prof :: Int
prof = if DynFlags -> Bool
sccProfilingEnabled DynFlags
dflags then ProfAuto -> Int
forall a. Enum a => a -> Int
fromEnum ProfAuto
profAuto else Int
0

        -- Ticky
        ticky :: [Bool]
ticky =
          (GeneralFlag -> Bool) -> [GeneralFlag] -> [Bool]
forall a b. (a -> b) -> [a] -> [b]
map (GeneralFlag -> DynFlags -> Bool
`gopt` DynFlags
dflags) [GeneralFlag
Opt_Ticky, GeneralFlag
Opt_Ticky_Allocd, GeneralFlag
Opt_Ticky_LNE, GeneralFlag
Opt_Ticky_Dyn_Thunk, GeneralFlag
Opt_Ticky_Tag]

        -- Other flags which affect code generation
        codegen :: [Bool]
codegen = (GeneralFlag -> Bool) -> [GeneralFlag] -> [Bool]
forall a b. (a -> b) -> [a] -> [b]
map (GeneralFlag -> DynFlags -> Bool
`gopt` DynFlags
dflags) (EnumSet GeneralFlag -> [GeneralFlag]
forall a. Enum a => EnumSet a -> [a]
EnumSet.toList EnumSet GeneralFlag
codeGenFlags)

        flags :: ((Maybe (Maybe String), IfaceTrustInfo, (Maybe Int, [Int]),
  ([String], [String], ([String], Fingerprint))),
 ([String], Int, [Bool], [Bool], Int, [CallerCcFilter]))
flags = ((Maybe (Maybe String)
mainis, IfaceTrustInfo
safeHs, (Maybe Int, [Int])
lang, ([String], [String], ([String], Fingerprint))
cpp), ([String]
paths, Int
prof, [Bool]
ticky, [Bool]
codegen, Int
debugLevel, [CallerCcFilter]
callerCcFilters))

    in -- pprTrace "flags" (ppr flags) $
       (BinHandle -> Name -> IO ())
-> ((Maybe (Maybe String), IfaceTrustInfo, (Maybe Int, [Int]),
     ([String], [String], ([String], Fingerprint))),
    ([String], Int, [Bool], [Bool], Int, [CallerCcFilter]))
-> IO Fingerprint
forall a.
Binary a =>
(BinHandle -> Name -> IO ()) -> a -> IO Fingerprint
computeFingerprint BinHandle -> Name -> IO ()
nameio ((Maybe (Maybe String), IfaceTrustInfo, (Maybe Int, [Int]),
  ([String], [String], ([String], Fingerprint))),
 ([String], Int, [Bool], [Bool], Int, [CallerCcFilter]))
flags

-- Fingerprint the optimisation info. We keep this separate from the rest of
-- the flags because GHCi users (especially) may wish to ignore changes in
-- optimisation level or optimisation flags so as to use as many pre-existing
-- object files as they can.
-- See Note [Ignoring some flag changes]
fingerprintOptFlags :: DynFlags
                      -> (BinHandle -> Name -> IO ())
                      -> IO Fingerprint
fingerprintOptFlags :: DynFlags -> (BinHandle -> Name -> IO ()) -> IO Fingerprint
fingerprintOptFlags DynFlags{Bool
Int
String
[Int]
[String]
[(String, String)]
[(ModuleName, String)]
[(ModuleName, Module)]
[ModuleName]
[CallerCcFilter]
[Option]
[ExternalPluginSpec]
[OnOff Extension]
[PackageDBFlag]
[PackageFlag]
[TrustFlag]
[IgnorePackageFlag]
Maybe Int
Maybe String
Maybe Word
Maybe (String, Int)
Maybe UnitId
Maybe Language
Maybe BmiVersion
Maybe SseVersion
Word
IORef (Maybe CompilerInfo)
IORef (Maybe LinkerInfo)
Set ModuleName
Ways
OverridingBool
Scheme
ModuleName
UnitId
UnfoldingOpts
ProfAuto
Weights
SrcSpan
EnumSet Extension
EnumSet WarningFlag
EnumSet GeneralFlag
EnumSet DumpFlag
SafeHaskellMode
IntWithInf
PlatformMisc
Platform
GhcNameVersion
FileSettings
ToolSettings
TempDir
Backend
FlushOut
RtsOptsEnabled
DynLibLoader
GhcLink
GhcMode
IncludeSpecs
ghcMode :: DynFlags -> GhcMode
ghcLink :: DynFlags -> GhcLink
backend :: DynFlags -> Backend
ghcNameVersion :: DynFlags -> GhcNameVersion
fileSettings :: DynFlags -> FileSettings
targetPlatform :: DynFlags -> Platform
toolSettings :: DynFlags -> ToolSettings
platformMisc :: DynFlags -> PlatformMisc
rawSettings :: DynFlags -> [(String, String)]
tmpDir :: DynFlags -> TempDir
llvmOptLevel :: DynFlags -> Int
verbosity :: DynFlags -> Int
debugLevel :: DynFlags -> Int
simplPhases :: DynFlags -> Int
maxSimplIterations :: DynFlags -> Int
ruleCheck :: DynFlags -> Maybe String
strictnessBefore :: DynFlags -> [Int]
parMakeCount :: DynFlags -> Maybe Int
enableTimeStats :: DynFlags -> Bool
ghcHeapSize :: DynFlags -> Maybe Int
maxRelevantBinds :: DynFlags -> Maybe Int
maxValidHoleFits :: DynFlags -> Maybe Int
maxRefHoleFits :: DynFlags -> Maybe Int
refLevelHoleFits :: DynFlags -> Maybe Int
maxUncoveredPatterns :: DynFlags -> Int
maxPmCheckModels :: DynFlags -> Int
simplTickFactor :: DynFlags -> Int
dmdUnboxWidth :: DynFlags -> Int
specConstrThreshold :: DynFlags -> Maybe Int
specConstrCount :: DynFlags -> Maybe Int
specConstrRecursive :: DynFlags -> Int
binBlobThreshold :: DynFlags -> Maybe Word
liberateCaseThreshold :: DynFlags -> Maybe Int
floatLamArgs :: DynFlags -> Maybe Int
liftLamsRecArgs :: DynFlags -> Maybe Int
liftLamsNonRecArgs :: DynFlags -> Maybe Int
liftLamsKnown :: DynFlags -> Bool
cmmProcAlignment :: DynFlags -> Maybe Int
historySize :: DynFlags -> Int
importPaths :: DynFlags -> [String]
mainModuleNameIs :: DynFlags -> ModuleName
mainFunIs :: DynFlags -> Maybe String
reductionDepth :: DynFlags -> IntWithInf
solverIterations :: DynFlags -> IntWithInf
homeUnitId_ :: DynFlags -> UnitId
homeUnitInstanceOf_ :: DynFlags -> Maybe UnitId
homeUnitInstantiations_ :: DynFlags -> [(ModuleName, Module)]
workingDirectory :: DynFlags -> Maybe String
thisPackageName :: DynFlags -> Maybe String
hiddenModules :: DynFlags -> Set ModuleName
reexportedModules :: DynFlags -> Set ModuleName
targetWays_ :: DynFlags -> Ways
splitInfo :: DynFlags -> Maybe (String, Int)
objectDir :: DynFlags -> Maybe String
dylibInstallName :: DynFlags -> Maybe String
hiDir :: DynFlags -> Maybe String
hieDir :: DynFlags -> Maybe String
stubDir :: DynFlags -> Maybe String
dumpDir :: DynFlags -> Maybe String
objectSuf_ :: DynFlags -> String
hcSuf :: DynFlags -> String
hiSuf_ :: DynFlags -> String
hieSuf :: DynFlags -> String
dynObjectSuf_ :: DynFlags -> String
dynHiSuf_ :: DynFlags -> String
outputFile_ :: DynFlags -> Maybe String
dynOutputFile_ :: DynFlags -> Maybe String
outputHi :: DynFlags -> Maybe String
dynOutputHi :: DynFlags -> Maybe String
dynLibLoader :: DynFlags -> DynLibLoader
dynamicNow :: DynFlags -> Bool
dumpPrefix :: DynFlags -> String
dumpPrefixForce :: DynFlags -> Maybe String
ldInputs :: DynFlags -> [Option]
includePaths :: DynFlags -> IncludeSpecs
libraryPaths :: DynFlags -> [String]
frameworkPaths :: DynFlags -> [String]
cmdlineFrameworks :: DynFlags -> [String]
rtsOpts :: DynFlags -> Maybe String
rtsOptsEnabled :: DynFlags -> RtsOptsEnabled
rtsOptsSuggestions :: DynFlags -> Bool
hpcDir :: DynFlags -> String
pluginModNames :: DynFlags -> [ModuleName]
pluginModNameOpts :: DynFlags -> [(ModuleName, String)]
frontendPluginOpts :: DynFlags -> [String]
externalPluginSpecs :: DynFlags -> [ExternalPluginSpec]
depMakefile :: DynFlags -> String
depIncludePkgDeps :: DynFlags -> Bool
depIncludeCppDeps :: DynFlags -> Bool
depExcludeMods :: DynFlags -> [ModuleName]
depSuffixes :: DynFlags -> [String]
packageDBFlags :: DynFlags -> [PackageDBFlag]
ignorePackageFlags :: DynFlags -> [IgnorePackageFlag]
packageFlags :: DynFlags -> [PackageFlag]
pluginPackageFlags :: DynFlags -> [PackageFlag]
trustFlags :: DynFlags -> [TrustFlag]
packageEnv :: DynFlags -> Maybe String
dumpFlags :: DynFlags -> EnumSet DumpFlag
generalFlags :: DynFlags -> EnumSet GeneralFlag
warningFlags :: DynFlags -> EnumSet WarningFlag
fatalWarningFlags :: DynFlags -> EnumSet WarningFlag
language :: DynFlags -> Maybe Language
safeHaskell :: DynFlags -> SafeHaskellMode
safeInfer :: DynFlags -> Bool
safeInferred :: DynFlags -> Bool
thOnLoc :: DynFlags -> SrcSpan
newDerivOnLoc :: DynFlags -> SrcSpan
deriveViaOnLoc :: DynFlags -> SrcSpan
overlapInstLoc :: DynFlags -> SrcSpan
incoherentOnLoc :: DynFlags -> SrcSpan
pkgTrustOnLoc :: DynFlags -> SrcSpan
warnSafeOnLoc :: DynFlags -> SrcSpan
warnUnsafeOnLoc :: DynFlags -> SrcSpan
trustworthyOnLoc :: DynFlags -> SrcSpan
extensions :: DynFlags -> [OnOff Extension]
extensionFlags :: DynFlags -> EnumSet Extension
unfoldingOpts :: DynFlags -> UnfoldingOpts
maxWorkerArgs :: DynFlags -> Int
ghciHistSize :: DynFlags -> Int
flushOut :: DynFlags -> FlushOut
ghcVersionFile :: DynFlags -> Maybe String
haddockOptions :: DynFlags -> Maybe String
ghciScripts :: DynFlags -> [String]
pprUserLength :: DynFlags -> Int
pprCols :: DynFlags -> Int
useUnicode :: DynFlags -> Bool
useColor :: DynFlags -> OverridingBool
canUseColor :: DynFlags -> Bool
colScheme :: DynFlags -> Scheme
profAuto :: DynFlags -> ProfAuto
callerCcFilters :: DynFlags -> [CallerCcFilter]
interactivePrint :: DynFlags -> Maybe String
sseVersion :: DynFlags -> Maybe SseVersion
bmiVersion :: DynFlags -> Maybe BmiVersion
avx :: DynFlags -> Bool
avx2 :: DynFlags -> Bool
avx512cd :: DynFlags -> Bool
avx512er :: DynFlags -> Bool
avx512f :: DynFlags -> Bool
avx512pf :: DynFlags -> Bool
rtldInfo :: DynFlags -> IORef (Maybe LinkerInfo)
rtccInfo :: DynFlags -> IORef (Maybe CompilerInfo)
rtasmInfo :: DynFlags -> IORef (Maybe CompilerInfo)
maxInlineAllocSize :: DynFlags -> Int
maxInlineMemcpyInsns :: DynFlags -> Int
maxInlineMemsetInsns :: DynFlags -> Int
reverseErrors :: DynFlags -> Bool
maxErrors :: DynFlags -> Maybe Int
initialUnique :: DynFlags -> Word
uniqueIncrement :: DynFlags -> Int
cfgWeights :: DynFlags -> Weights
ghcMode :: GhcMode
ghcLink :: GhcLink
backend :: Backend
ghcNameVersion :: GhcNameVersion
fileSettings :: FileSettings
targetPlatform :: Platform
toolSettings :: ToolSettings
platformMisc :: PlatformMisc
rawSettings :: [(String, String)]
tmpDir :: TempDir
llvmOptLevel :: Int
verbosity :: Int
debugLevel :: Int
simplPhases :: Int
maxSimplIterations :: Int
ruleCheck :: Maybe String
strictnessBefore :: [Int]
parMakeCount :: Maybe Int
enableTimeStats :: Bool
ghcHeapSize :: Maybe Int
maxRelevantBinds :: Maybe Int
maxValidHoleFits :: Maybe Int
maxRefHoleFits :: Maybe Int
refLevelHoleFits :: Maybe Int
maxUncoveredPatterns :: Int
maxPmCheckModels :: Int
simplTickFactor :: Int
dmdUnboxWidth :: Int
specConstrThreshold :: Maybe Int
specConstrCount :: Maybe Int
specConstrRecursive :: Int
binBlobThreshold :: Maybe Word
liberateCaseThreshold :: Maybe Int
floatLamArgs :: Maybe Int
liftLamsRecArgs :: Maybe Int
liftLamsNonRecArgs :: Maybe Int
liftLamsKnown :: Bool
cmmProcAlignment :: Maybe Int
historySize :: Int
importPaths :: [String]
mainModuleNameIs :: ModuleName
mainFunIs :: Maybe String
reductionDepth :: IntWithInf
solverIterations :: IntWithInf
homeUnitId_ :: UnitId
homeUnitInstanceOf_ :: Maybe UnitId
homeUnitInstantiations_ :: [(ModuleName, Module)]
workingDirectory :: Maybe String
thisPackageName :: Maybe String
hiddenModules :: Set ModuleName
reexportedModules :: Set ModuleName
targetWays_ :: Ways
splitInfo :: Maybe (String, Int)
objectDir :: Maybe String
dylibInstallName :: Maybe String
hiDir :: Maybe String
hieDir :: Maybe String
stubDir :: Maybe String
dumpDir :: Maybe String
objectSuf_ :: String
hcSuf :: String
hiSuf_ :: String
hieSuf :: String
dynObjectSuf_ :: String
dynHiSuf_ :: String
outputFile_ :: Maybe String
dynOutputFile_ :: Maybe String
outputHi :: Maybe String
dynOutputHi :: Maybe String
dynLibLoader :: DynLibLoader
dynamicNow :: Bool
dumpPrefix :: String
dumpPrefixForce :: Maybe String
ldInputs :: [Option]
includePaths :: IncludeSpecs
libraryPaths :: [String]
frameworkPaths :: [String]
cmdlineFrameworks :: [String]
rtsOpts :: Maybe String
rtsOptsEnabled :: RtsOptsEnabled
rtsOptsSuggestions :: Bool
hpcDir :: String
pluginModNames :: [ModuleName]
pluginModNameOpts :: [(ModuleName, String)]
frontendPluginOpts :: [String]
externalPluginSpecs :: [ExternalPluginSpec]
depMakefile :: String
depIncludePkgDeps :: Bool
depIncludeCppDeps :: Bool
depExcludeMods :: [ModuleName]
depSuffixes :: [String]
packageDBFlags :: [PackageDBFlag]
ignorePackageFlags :: [IgnorePackageFlag]
packageFlags :: [PackageFlag]
pluginPackageFlags :: [PackageFlag]
trustFlags :: [TrustFlag]
packageEnv :: Maybe String
dumpFlags :: EnumSet DumpFlag
generalFlags :: EnumSet GeneralFlag
warningFlags :: EnumSet WarningFlag
fatalWarningFlags :: EnumSet WarningFlag
language :: Maybe Language
safeHaskell :: SafeHaskellMode
safeInfer :: Bool
safeInferred :: Bool
thOnLoc :: SrcSpan
newDerivOnLoc :: SrcSpan
deriveViaOnLoc :: SrcSpan
overlapInstLoc :: SrcSpan
incoherentOnLoc :: SrcSpan
pkgTrustOnLoc :: SrcSpan
warnSafeOnLoc :: SrcSpan
warnUnsafeOnLoc :: SrcSpan
trustworthyOnLoc :: SrcSpan
extensions :: [OnOff Extension]
extensionFlags :: EnumSet Extension
unfoldingOpts :: UnfoldingOpts
maxWorkerArgs :: Int
ghciHistSize :: Int
flushOut :: FlushOut
ghcVersionFile :: Maybe String
haddockOptions :: Maybe String
ghciScripts :: [String]
pprUserLength :: Int
pprCols :: Int
useUnicode :: Bool
useColor :: OverridingBool
canUseColor :: Bool
colScheme :: Scheme
profAuto :: ProfAuto
callerCcFilters :: [CallerCcFilter]
interactivePrint :: Maybe String
sseVersion :: Maybe SseVersion
bmiVersion :: Maybe BmiVersion
avx :: Bool
avx2 :: Bool
avx512cd :: Bool
avx512er :: Bool
avx512f :: Bool
avx512pf :: Bool
rtldInfo :: IORef (Maybe LinkerInfo)
rtccInfo :: IORef (Maybe CompilerInfo)
rtasmInfo :: IORef (Maybe CompilerInfo)
maxInlineAllocSize :: Int
maxInlineMemcpyInsns :: Int
maxInlineMemsetInsns :: Int
reverseErrors :: Bool
maxErrors :: Maybe Int
initialUnique :: Word
uniqueIncrement :: Int
cfgWeights :: Weights
..} BinHandle -> Name -> IO ()
nameio =
      let
        -- See https://gitlab.haskell.org/ghc/ghc/issues/10923
        -- We used to fingerprint the optimisation level, but as Joachim
        -- Breitner pointed out in comment 9 on that ticket, it's better
        -- to ignore that and just look at the individual optimisation flags.
        opt_flags :: [Int]
opt_flags = (GeneralFlag -> Int) -> [GeneralFlag] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map GeneralFlag -> Int
forall a. Enum a => a -> Int
fromEnum ([GeneralFlag] -> [Int]) -> [GeneralFlag] -> [Int]
forall a b. (a -> b) -> a -> b
$ (GeneralFlag -> Bool) -> [GeneralFlag] -> [GeneralFlag]
forall a. (a -> Bool) -> [a] -> [a]
filter (GeneralFlag -> EnumSet GeneralFlag -> Bool
forall a. Enum a => a -> EnumSet a -> Bool
`EnumSet.member` EnumSet GeneralFlag
optimisationFlags)
                                          (EnumSet GeneralFlag -> [GeneralFlag]
forall a. Enum a => EnumSet a -> [a]
EnumSet.toList EnumSet GeneralFlag
generalFlags)

      in (BinHandle -> Name -> IO ()) -> [Int] -> IO Fingerprint
forall a.
Binary a =>
(BinHandle -> Name -> IO ()) -> a -> IO Fingerprint
computeFingerprint BinHandle -> Name -> IO ()
nameio [Int]
opt_flags

-- Fingerprint the HPC info. We keep this separate from the rest of
-- the flags because GHCi users (especially) may wish to use an object
-- file compiled for HPC when not actually using HPC.
-- See Note [Ignoring some flag changes]
fingerprintHpcFlags :: DynFlags
                      -> (BinHandle -> Name -> IO ())
                      -> IO Fingerprint
fingerprintHpcFlags :: DynFlags -> (BinHandle -> Name -> IO ()) -> IO Fingerprint
fingerprintHpcFlags dflags :: DynFlags
dflags@DynFlags{Bool
Int
String
[Int]
[String]
[(String, String)]
[(ModuleName, String)]
[(ModuleName, Module)]
[ModuleName]
[CallerCcFilter]
[Option]
[ExternalPluginSpec]
[OnOff Extension]
[PackageDBFlag]
[PackageFlag]
[TrustFlag]
[IgnorePackageFlag]
Maybe Int
Maybe String
Maybe Word
Maybe (String, Int)
Maybe UnitId
Maybe Language
Maybe BmiVersion
Maybe SseVersion
Word
IORef (Maybe CompilerInfo)
IORef (Maybe LinkerInfo)
Set ModuleName
Ways
OverridingBool
Scheme
ModuleName
UnitId
UnfoldingOpts
ProfAuto
Weights
SrcSpan
EnumSet Extension
EnumSet WarningFlag
EnumSet GeneralFlag
EnumSet DumpFlag
SafeHaskellMode
IntWithInf
PlatformMisc
Platform
GhcNameVersion
FileSettings
ToolSettings
TempDir
Backend
FlushOut
RtsOptsEnabled
DynLibLoader
GhcLink
GhcMode
IncludeSpecs
ghcMode :: DynFlags -> GhcMode
ghcLink :: DynFlags -> GhcLink
backend :: DynFlags -> Backend
ghcNameVersion :: DynFlags -> GhcNameVersion
fileSettings :: DynFlags -> FileSettings
targetPlatform :: DynFlags -> Platform
toolSettings :: DynFlags -> ToolSettings
platformMisc :: DynFlags -> PlatformMisc
rawSettings :: DynFlags -> [(String, String)]
tmpDir :: DynFlags -> TempDir
llvmOptLevel :: DynFlags -> Int
verbosity :: DynFlags -> Int
debugLevel :: DynFlags -> Int
simplPhases :: DynFlags -> Int
maxSimplIterations :: DynFlags -> Int
ruleCheck :: DynFlags -> Maybe String
strictnessBefore :: DynFlags -> [Int]
parMakeCount :: DynFlags -> Maybe Int
enableTimeStats :: DynFlags -> Bool
ghcHeapSize :: DynFlags -> Maybe Int
maxRelevantBinds :: DynFlags -> Maybe Int
maxValidHoleFits :: DynFlags -> Maybe Int
maxRefHoleFits :: DynFlags -> Maybe Int
refLevelHoleFits :: DynFlags -> Maybe Int
maxUncoveredPatterns :: DynFlags -> Int
maxPmCheckModels :: DynFlags -> Int
simplTickFactor :: DynFlags -> Int
dmdUnboxWidth :: DynFlags -> Int
specConstrThreshold :: DynFlags -> Maybe Int
specConstrCount :: DynFlags -> Maybe Int
specConstrRecursive :: DynFlags -> Int
binBlobThreshold :: DynFlags -> Maybe Word
liberateCaseThreshold :: DynFlags -> Maybe Int
floatLamArgs :: DynFlags -> Maybe Int
liftLamsRecArgs :: DynFlags -> Maybe Int
liftLamsNonRecArgs :: DynFlags -> Maybe Int
liftLamsKnown :: DynFlags -> Bool
cmmProcAlignment :: DynFlags -> Maybe Int
historySize :: DynFlags -> Int
importPaths :: DynFlags -> [String]
mainModuleNameIs :: DynFlags -> ModuleName
mainFunIs :: DynFlags -> Maybe String
reductionDepth :: DynFlags -> IntWithInf
solverIterations :: DynFlags -> IntWithInf
homeUnitId_ :: DynFlags -> UnitId
homeUnitInstanceOf_ :: DynFlags -> Maybe UnitId
homeUnitInstantiations_ :: DynFlags -> [(ModuleName, Module)]
workingDirectory :: DynFlags -> Maybe String
thisPackageName :: DynFlags -> Maybe String
hiddenModules :: DynFlags -> Set ModuleName
reexportedModules :: DynFlags -> Set ModuleName
targetWays_ :: DynFlags -> Ways
splitInfo :: DynFlags -> Maybe (String, Int)
objectDir :: DynFlags -> Maybe String
dylibInstallName :: DynFlags -> Maybe String
hiDir :: DynFlags -> Maybe String
hieDir :: DynFlags -> Maybe String
stubDir :: DynFlags -> Maybe String
dumpDir :: DynFlags -> Maybe String
objectSuf_ :: DynFlags -> String
hcSuf :: DynFlags -> String
hiSuf_ :: DynFlags -> String
hieSuf :: DynFlags -> String
dynObjectSuf_ :: DynFlags -> String
dynHiSuf_ :: DynFlags -> String
outputFile_ :: DynFlags -> Maybe String
dynOutputFile_ :: DynFlags -> Maybe String
outputHi :: DynFlags -> Maybe String
dynOutputHi :: DynFlags -> Maybe String
dynLibLoader :: DynFlags -> DynLibLoader
dynamicNow :: DynFlags -> Bool
dumpPrefix :: DynFlags -> String
dumpPrefixForce :: DynFlags -> Maybe String
ldInputs :: DynFlags -> [Option]
includePaths :: DynFlags -> IncludeSpecs
libraryPaths :: DynFlags -> [String]
frameworkPaths :: DynFlags -> [String]
cmdlineFrameworks :: DynFlags -> [String]
rtsOpts :: DynFlags -> Maybe String
rtsOptsEnabled :: DynFlags -> RtsOptsEnabled
rtsOptsSuggestions :: DynFlags -> Bool
hpcDir :: DynFlags -> String
pluginModNames :: DynFlags -> [ModuleName]
pluginModNameOpts :: DynFlags -> [(ModuleName, String)]
frontendPluginOpts :: DynFlags -> [String]
externalPluginSpecs :: DynFlags -> [ExternalPluginSpec]
depMakefile :: DynFlags -> String
depIncludePkgDeps :: DynFlags -> Bool
depIncludeCppDeps :: DynFlags -> Bool
depExcludeMods :: DynFlags -> [ModuleName]
depSuffixes :: DynFlags -> [String]
packageDBFlags :: DynFlags -> [PackageDBFlag]
ignorePackageFlags :: DynFlags -> [IgnorePackageFlag]
packageFlags :: DynFlags -> [PackageFlag]
pluginPackageFlags :: DynFlags -> [PackageFlag]
trustFlags :: DynFlags -> [TrustFlag]
packageEnv :: DynFlags -> Maybe String
dumpFlags :: DynFlags -> EnumSet DumpFlag
generalFlags :: DynFlags -> EnumSet GeneralFlag
warningFlags :: DynFlags -> EnumSet WarningFlag
fatalWarningFlags :: DynFlags -> EnumSet WarningFlag
language :: DynFlags -> Maybe Language
safeHaskell :: DynFlags -> SafeHaskellMode
safeInfer :: DynFlags -> Bool
safeInferred :: DynFlags -> Bool
thOnLoc :: DynFlags -> SrcSpan
newDerivOnLoc :: DynFlags -> SrcSpan
deriveViaOnLoc :: DynFlags -> SrcSpan
overlapInstLoc :: DynFlags -> SrcSpan
incoherentOnLoc :: DynFlags -> SrcSpan
pkgTrustOnLoc :: DynFlags -> SrcSpan
warnSafeOnLoc :: DynFlags -> SrcSpan
warnUnsafeOnLoc :: DynFlags -> SrcSpan
trustworthyOnLoc :: DynFlags -> SrcSpan
extensions :: DynFlags -> [OnOff Extension]
extensionFlags :: DynFlags -> EnumSet Extension
unfoldingOpts :: DynFlags -> UnfoldingOpts
maxWorkerArgs :: DynFlags -> Int
ghciHistSize :: DynFlags -> Int
flushOut :: DynFlags -> FlushOut
ghcVersionFile :: DynFlags -> Maybe String
haddockOptions :: DynFlags -> Maybe String
ghciScripts :: DynFlags -> [String]
pprUserLength :: DynFlags -> Int
pprCols :: DynFlags -> Int
useUnicode :: DynFlags -> Bool
useColor :: DynFlags -> OverridingBool
canUseColor :: DynFlags -> Bool
colScheme :: DynFlags -> Scheme
profAuto :: DynFlags -> ProfAuto
callerCcFilters :: DynFlags -> [CallerCcFilter]
interactivePrint :: DynFlags -> Maybe String
sseVersion :: DynFlags -> Maybe SseVersion
bmiVersion :: DynFlags -> Maybe BmiVersion
avx :: DynFlags -> Bool
avx2 :: DynFlags -> Bool
avx512cd :: DynFlags -> Bool
avx512er :: DynFlags -> Bool
avx512f :: DynFlags -> Bool
avx512pf :: DynFlags -> Bool
rtldInfo :: DynFlags -> IORef (Maybe LinkerInfo)
rtccInfo :: DynFlags -> IORef (Maybe CompilerInfo)
rtasmInfo :: DynFlags -> IORef (Maybe CompilerInfo)
maxInlineAllocSize :: DynFlags -> Int
maxInlineMemcpyInsns :: DynFlags -> Int
maxInlineMemsetInsns :: DynFlags -> Int
reverseErrors :: DynFlags -> Bool
maxErrors :: DynFlags -> Maybe Int
initialUnique :: DynFlags -> Word
uniqueIncrement :: DynFlags -> Int
cfgWeights :: DynFlags -> Weights
ghcMode :: GhcMode
ghcLink :: GhcLink
backend :: Backend
ghcNameVersion :: GhcNameVersion
fileSettings :: FileSettings
targetPlatform :: Platform
toolSettings :: ToolSettings
platformMisc :: PlatformMisc
rawSettings :: [(String, String)]
tmpDir :: TempDir
llvmOptLevel :: Int
verbosity :: Int
debugLevel :: Int
simplPhases :: Int
maxSimplIterations :: Int
ruleCheck :: Maybe String
strictnessBefore :: [Int]
parMakeCount :: Maybe Int
enableTimeStats :: Bool
ghcHeapSize :: Maybe Int
maxRelevantBinds :: Maybe Int
maxValidHoleFits :: Maybe Int
maxRefHoleFits :: Maybe Int
refLevelHoleFits :: Maybe Int
maxUncoveredPatterns :: Int
maxPmCheckModels :: Int
simplTickFactor :: Int
dmdUnboxWidth :: Int
specConstrThreshold :: Maybe Int
specConstrCount :: Maybe Int
specConstrRecursive :: Int
binBlobThreshold :: Maybe Word
liberateCaseThreshold :: Maybe Int
floatLamArgs :: Maybe Int
liftLamsRecArgs :: Maybe Int
liftLamsNonRecArgs :: Maybe Int
liftLamsKnown :: Bool
cmmProcAlignment :: Maybe Int
historySize :: Int
importPaths :: [String]
mainModuleNameIs :: ModuleName
mainFunIs :: Maybe String
reductionDepth :: IntWithInf
solverIterations :: IntWithInf
homeUnitId_ :: UnitId
homeUnitInstanceOf_ :: Maybe UnitId
homeUnitInstantiations_ :: [(ModuleName, Module)]
workingDirectory :: Maybe String
thisPackageName :: Maybe String
hiddenModules :: Set ModuleName
reexportedModules :: Set ModuleName
targetWays_ :: Ways
splitInfo :: Maybe (String, Int)
objectDir :: Maybe String
dylibInstallName :: Maybe String
hiDir :: Maybe String
hieDir :: Maybe String
stubDir :: Maybe String
dumpDir :: Maybe String
objectSuf_ :: String
hcSuf :: String
hiSuf_ :: String
hieSuf :: String
dynObjectSuf_ :: String
dynHiSuf_ :: String
outputFile_ :: Maybe String
dynOutputFile_ :: Maybe String
outputHi :: Maybe String
dynOutputHi :: Maybe String
dynLibLoader :: DynLibLoader
dynamicNow :: Bool
dumpPrefix :: String
dumpPrefixForce :: Maybe String
ldInputs :: [Option]
includePaths :: IncludeSpecs
libraryPaths :: [String]
frameworkPaths :: [String]
cmdlineFrameworks :: [String]
rtsOpts :: Maybe String
rtsOptsEnabled :: RtsOptsEnabled
rtsOptsSuggestions :: Bool
hpcDir :: String
pluginModNames :: [ModuleName]
pluginModNameOpts :: [(ModuleName, String)]
frontendPluginOpts :: [String]
externalPluginSpecs :: [ExternalPluginSpec]
depMakefile :: String
depIncludePkgDeps :: Bool
depIncludeCppDeps :: Bool
depExcludeMods :: [ModuleName]
depSuffixes :: [String]
packageDBFlags :: [PackageDBFlag]
ignorePackageFlags :: [IgnorePackageFlag]
packageFlags :: [PackageFlag]
pluginPackageFlags :: [PackageFlag]
trustFlags :: [TrustFlag]
packageEnv :: Maybe String
dumpFlags :: EnumSet DumpFlag
generalFlags :: EnumSet GeneralFlag
warningFlags :: EnumSet WarningFlag
fatalWarningFlags :: EnumSet WarningFlag
language :: Maybe Language
safeHaskell :: SafeHaskellMode
safeInfer :: Bool
safeInferred :: Bool
thOnLoc :: SrcSpan
newDerivOnLoc :: SrcSpan
deriveViaOnLoc :: SrcSpan
overlapInstLoc :: SrcSpan
incoherentOnLoc :: SrcSpan
pkgTrustOnLoc :: SrcSpan
warnSafeOnLoc :: SrcSpan
warnUnsafeOnLoc :: SrcSpan
trustworthyOnLoc :: SrcSpan
extensions :: [OnOff Extension]
extensionFlags :: EnumSet Extension
unfoldingOpts :: UnfoldingOpts
maxWorkerArgs :: Int
ghciHistSize :: Int
flushOut :: FlushOut
ghcVersionFile :: Maybe String
haddockOptions :: Maybe String
ghciScripts :: [String]
pprUserLength :: Int
pprCols :: Int
useUnicode :: Bool
useColor :: OverridingBool
canUseColor :: Bool
colScheme :: Scheme
profAuto :: ProfAuto
callerCcFilters :: [CallerCcFilter]
interactivePrint :: Maybe String
sseVersion :: Maybe SseVersion
bmiVersion :: Maybe BmiVersion
avx :: Bool
avx2 :: Bool
avx512cd :: Bool
avx512er :: Bool
avx512f :: Bool
avx512pf :: Bool
rtldInfo :: IORef (Maybe LinkerInfo)
rtccInfo :: IORef (Maybe CompilerInfo)
rtasmInfo :: IORef (Maybe CompilerInfo)
maxInlineAllocSize :: Int
maxInlineMemcpyInsns :: Int
maxInlineMemsetInsns :: Int
reverseErrors :: Bool
maxErrors :: Maybe Int
initialUnique :: Word
uniqueIncrement :: Int
cfgWeights :: Weights
..} BinHandle -> Name -> IO ()
nameio =
      let
        -- -fhpc, see https://gitlab.haskell.org/ghc/ghc/issues/11798
        -- hpcDir is output-only, so we should recompile if it changes
        hpc :: Maybe String
hpc = if GeneralFlag -> DynFlags -> Bool
gopt GeneralFlag
Opt_Hpc DynFlags
dflags then String -> Maybe String
forall a. a -> Maybe a
Just String
hpcDir else Maybe String
forall a. Maybe a
Nothing

      in (BinHandle -> Name -> IO ()) -> Maybe String -> IO Fingerprint
forall a.
Binary a =>
(BinHandle -> Name -> IO ()) -> a -> IO Fingerprint
computeFingerprint BinHandle -> Name -> IO ()
nameio Maybe String
hpc


{- Note [path flags and recompilation]
   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
There are several flags that we deliberately omit from the
recompilation check; here we explain why.

-osuf, -odir, -hisuf, -hidir
  If GHC decides that it does not need to recompile, then
  it must have found an up-to-date .hi file and .o file.
  There is no point recording these flags - the user must
  have passed the correct ones.  Indeed, the user may
  have compiled the source file in one-shot mode using
  -o to specify the .o file, and then loaded it in GHCi
  using -odir.

-stubdir
  We omit this one because it is automatically set by -outputdir, and
  we don't want changes in -outputdir to automatically trigger
  recompilation.  This could be wrong, but only in very rare cases.

-i (importPaths)
  For the same reason as -osuf etc. above: if GHC decides not to
  recompile, then it must have already checked all the .hi files on
  which the current module depends, so it must have found them
  successfully.  It is occasionally useful to be able to cd to a
  different directory and use -i flags to enable GHC to find the .hi
  files; we don't want this to force recompilation.

The only path-related flag left is -hcsuf.
-}

{- Note [Ignoring some flag changes]
   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Normally, --make tries to reuse only compilation products that are
the same as those that would have been produced compiling from
scratch. Sometimes, however, users would like to be more aggressive
about recompilation avoidance. This is particularly likely when
developing using GHCi (see #13604). Currently, we allow users to
ignore optimisation changes using -fignore-optim-changes, and to
ignore HPC option changes using -fignore-hpc-changes. If there's a
demand for it, we could also allow changes to -fprof-auto-* flags
(although we can't allow -prof flags to differ). The key thing about
these options is that we can still successfully link a library or
executable when some of its components differ in these ways.

The way we accomplish this is to leave the optimization and HPC
options out of the flag hash, hashing them separately.
-}

{- Note [Repeated -optP hashing]
   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
We invoke fingerprintDynFlags for each compiled module to include
the hash of relevant DynFlags in the resulting interface file.
-optP (preprocessor) flags are part of that hash.
-optP flags can come from multiple places:

  1. -optP flags directly passed on command line.
  2. -optP flags implied by other flags. Eg. -DPROFILING implied by -prof.
  3. -optP flags added with {-# OPTIONS -optP-D__F__ #-} in a file.

When compiling many modules at once with many -optP command line arguments
the work of hashing -optP flags would be repeated. This can get expensive
and as noted on #14697 it can take 7% of time and 14% of allocations on
a real codebase.

The obvious solution is to cache the hash of -optP flags per GHC invocation.
However, one has to be careful there, as the flags that were added in 3. way
have to be accounted for.

The current strategy is as follows:

  1. Lazily compute the hash of sOpt_p in sOpt_P_fingerprint whenever sOpt_p
     is modified. This serves dual purpose. It ensures correctness for when
     we add per file -optP flags and lets us save work for when we don't.
  2. When computing the fingerprint in fingerprintDynFlags use the cached
     value *and* fingerprint the additional implied (see 2. above) -optP flags.
     This is relatively cheap and saves the headache of fingerprinting all
     the -optP flags and tracking all the places that could invalidate the
     cache.
-}