module DynFlags (
DynFlag(..),
DynFlags(..),
HscTarget(..), isObjectTarget, defaultObjectTarget,
GhcMode(..), isOneShot,
GhcLink(..), isNoLink,
PackageFlag(..),
Option(..), showOpt,
DynLibLoader(..),
fFlags, xFlags,
dphPackage,
wayNames,
defaultDynFlags,
initDynFlags,
dopt,
dopt_set, dopt_unset,
getOpts,
getVerbFlag,
updOptLevel,
setTmpDir,
setPackageName,
doingTickyProfiling,
parseDynamicFlags,
parseDynamicNoPackageFlags,
allFlags,
supportedLanguages, languageOptions,
machdepCCOpts, picCCOpts,
CoreToDo(..),
SimplifierMode(..),
SimplifierSwitch(..),
FloatOutSwitches(..),
getCoreToDo,
StgToDo(..),
getStgToDo,
Printable(..),
compilerInfo
) where
#include "HsVersions.h"
#ifndef OMIT_NATIVE_CODEGEN
import Platform
#endif
import Module
import PackageConfig
import PrelNames ( mAIN )
import StaticFlags
import Packages (PackageState)
import DriverPhases ( Phase(..), phaseInputExt )
import Config
import CmdLineParser
import Constants ( mAX_CONTEXT_REDUCTION_DEPTH )
import Panic
import Util
import Maybes ( orElse )
import SrcLoc
import FastString
import FiniteMap
import Outputable
import ErrUtils ( Severity(..), Message, mkLocMessage )
import Data.IORef
import Control.Monad ( when )
import Data.Char
import Data.List
import System.FilePath
import System.IO ( stderr, hPutChar )
data DynFlag
= Opt_D_dump_cmm
| Opt_D_dump_cmmz
| Opt_D_dump_cmmz_pretty
| Opt_D_dump_cps_cmm
| Opt_D_dump_cvt_cmm
| Opt_D_dump_asm
| Opt_D_dump_asm_native
| Opt_D_dump_asm_liveness
| Opt_D_dump_asm_coalesce
| Opt_D_dump_asm_regalloc
| Opt_D_dump_asm_regalloc_stages
| Opt_D_dump_asm_conflicts
| Opt_D_dump_asm_stats
| Opt_D_dump_asm_expanded
| Opt_D_dump_cpranal
| Opt_D_dump_deriv
| Opt_D_dump_ds
| Opt_D_dump_flatC
| Opt_D_dump_foreign
| Opt_D_dump_inlinings
| Opt_D_dump_rule_firings
| Opt_D_dump_occur_anal
| Opt_D_dump_parsed
| Opt_D_dump_rn
| Opt_D_dump_simpl
| Opt_D_dump_simpl_iterations
| Opt_D_dump_simpl_phases
| Opt_D_dump_spec
| Opt_D_dump_prep
| Opt_D_dump_stg
| Opt_D_dump_stranal
| Opt_D_dump_tc
| Opt_D_dump_types
| Opt_D_dump_rules
| Opt_D_dump_cse
| Opt_D_dump_worker_wrapper
| Opt_D_dump_rn_trace
| Opt_D_dump_rn_stats
| Opt_D_dump_opt_cmm
| Opt_D_dump_simpl_stats
| Opt_D_dump_tc_trace
| Opt_D_dump_if_trace
| Opt_D_dump_splices
| Opt_D_dump_BCOs
| Opt_D_dump_vect
| Opt_D_dump_hpc
| Opt_D_dump_rtti
| Opt_D_source_stats
| Opt_D_verbose_core2core
| Opt_D_verbose_stg2stg
| Opt_D_dump_hi
| Opt_D_dump_hi_diffs
| Opt_D_dump_minimal_imports
| Opt_D_dump_mod_cycles
| Opt_D_dump_view_pattern_commoning
| Opt_D_faststring_stats
| Opt_DumpToFile
| Opt_D_no_debug_output
| Opt_DoCoreLinting
| Opt_DoStgLinting
| Opt_DoCmmLinting
| Opt_DoAsmLinting
| Opt_WarnIsError
| Opt_WarnDuplicateExports
| Opt_WarnHiShadows
| Opt_WarnImplicitPrelude
| Opt_WarnIncompletePatterns
| Opt_WarnIncompletePatternsRecUpd
| Opt_WarnMissingFields
| Opt_WarnMissingMethods
| Opt_WarnMissingSigs
| Opt_WarnNameShadowing
| Opt_WarnOverlappingPatterns
| Opt_WarnSimplePatterns
| Opt_WarnTypeDefaults
| Opt_WarnMonomorphism
| Opt_WarnUnusedBinds
| Opt_WarnUnusedImports
| Opt_WarnUnusedMatches
| Opt_WarnWarningsDeprecations
| Opt_WarnDeprecatedFlags
| Opt_WarnDodgyExports
| Opt_WarnDodgyImports
| Opt_WarnOrphans
| Opt_WarnTabs
| Opt_WarnUnrecognisedPragmas
| Opt_WarnDodgyForeignImports
| Opt_WarnLazyUnliftedBindings
| Opt_WarnUnusedDoBind
| Opt_WarnWrongDoBind
| Opt_OverlappingInstances
| Opt_UndecidableInstances
| Opt_IncoherentInstances
| Opt_MonomorphismRestriction
| Opt_MonoPatBinds
| Opt_MonoLocalBinds
| Opt_ExtendedDefaultRules
| Opt_ForeignFunctionInterface
| Opt_UnliftedFFITypes
| Opt_GHCForeignImportPrim
| Opt_PArr
| Opt_Arrows
| Opt_TemplateHaskell
| Opt_QuasiQuotes
| Opt_ImplicitParams
| Opt_Generics
| Opt_ImplicitPrelude
| Opt_ScopedTypeVariables
| Opt_UnboxedTuples
| Opt_BangPatterns
| Opt_TypeFamilies
| Opt_OverloadedStrings
| Opt_DisambiguateRecordFields
| Opt_RecordWildCards
| Opt_RecordPuns
| Opt_ViewPatterns
| Opt_GADTs
| Opt_RelaxedPolyRec
| Opt_NPlusKPatterns
| Opt_StandaloneDeriving
| Opt_DeriveDataTypeable
| Opt_DeriveFunctor
| Opt_DeriveTraversable
| Opt_DeriveFoldable
| Opt_TypeSynonymInstances
| Opt_FlexibleContexts
| Opt_FlexibleInstances
| Opt_ConstrainedClassMethods
| Opt_MultiParamTypeClasses
| Opt_FunctionalDependencies
| Opt_UnicodeSyntax
| Opt_PolymorphicComponents
| Opt_ExistentialQuantification
| Opt_MagicHash
| Opt_EmptyDataDecls
| Opt_KindSignatures
| Opt_ParallelListComp
| Opt_TransformListComp
| Opt_GeneralizedNewtypeDeriving
| Opt_RecursiveDo
| Opt_DoRec
| Opt_PostfixOperators
| Opt_TupleSections
| Opt_PatternGuards
| Opt_LiberalTypeSynonyms
| Opt_Rank2Types
| Opt_RankNTypes
| Opt_ImpredicativeTypes
| Opt_TypeOperators
| Opt_PackageImports
| Opt_NewQualifiedOperators
| Opt_ExplicitForAll
| Opt_PrintExplicitForalls
| Opt_Strictness
| Opt_FullLaziness
| Opt_StaticArgumentTransformation
| Opt_CSE
| Opt_LiberateCase
| Opt_SpecConstr
| Opt_IgnoreInterfacePragmas
| Opt_OmitInterfacePragmas
| Opt_DoLambdaEtaExpansion
| Opt_IgnoreAsserts
| Opt_DoEtaReduction
| Opt_CaseMerge
| Opt_UnboxStrictFields
| Opt_MethodSharing
| Opt_DictsCheap
| Opt_InlineIfEnoughArgs
| Opt_EnableRewriteRules
| Opt_Vectorise
| Opt_RegsGraph
| Opt_RegsIterative
| Opt_AutoSccsOnAllToplevs
| Opt_AutoSccsOnExportedToplevs
| Opt_AutoSccsOnIndividualCafs
| Opt_Cpp
| Opt_Pp
| Opt_ForceRecomp
| Opt_DryRun
| Opt_DoAsmMangling
| Opt_ExcessPrecision
| Opt_EagerBlackHoling
| Opt_ReadUserPackageConf
| Opt_NoHsMain
| Opt_RtsOptsEnabled
| Opt_SplitObjs
| Opt_StgStats
| Opt_HideAllPackages
| Opt_PrintBindResult
| Opt_Haddock
| Opt_HaddockOptions
| Opt_Hpc_No_Auto
| Opt_BreakOnException
| Opt_BreakOnError
| Opt_PrintEvldWithShow
| Opt_PrintBindContents
| Opt_GenManifest
| Opt_EmbedManifest
| Opt_EmitExternalCore
| Opt_SharedImplib
| Opt_BuildingCabalPackage
| Opt_RunCPS
| Opt_RunCPSZ
| Opt_ConvertToZipCfgAndBack
| Opt_AutoLinkPackages
| Opt_ImplicitImportQualified
| Opt_TryNewCodeGen
| Opt_KeepHiDiffs
| Opt_KeepHcFiles
| Opt_KeepSFiles
| Opt_KeepRawSFiles
| Opt_KeepTmpFiles
| Opt_KeepRawTokenStream
deriving (Eq, Show)
data DynFlags = DynFlags {
ghcMode :: GhcMode,
ghcLink :: GhcLink,
coreToDo :: Maybe [CoreToDo],
stgToDo :: Maybe [StgToDo],
hscTarget :: HscTarget,
hscOutName :: String,
extCoreName :: String,
verbosity :: Int,
optLevel :: Int,
simplPhases :: Int,
maxSimplIterations :: Int,
shouldDumpSimplPhase :: SimplifierMode -> Bool,
ruleCheck :: Maybe String,
specConstrThreshold :: Maybe Int,
specConstrCount :: Maybe Int,
liberateCaseThreshold :: Maybe Int,
#ifndef OMIT_NATIVE_CODEGEN
targetPlatform :: Platform,
#endif
stolen_x86_regs :: Int,
cmdlineHcIncludes :: [String],
importPaths :: [FilePath],
mainModIs :: Module,
mainFunIs :: Maybe String,
ctxtStkDepth :: Int,
dphBackend :: DPHBackend,
thisPackage :: PackageId,
ways :: [Way],
buildTag :: String,
rtsBuildTag :: String,
splitInfo :: Maybe (String,Int),
objectDir :: Maybe String,
hiDir :: Maybe String,
stubDir :: Maybe String,
objectSuf :: String,
hcSuf :: String,
hiSuf :: String,
outputFile :: Maybe String,
outputHi :: Maybe String,
dynLibLoader :: DynLibLoader,
dumpPrefix :: Maybe FilePath,
dumpPrefixForce :: Maybe FilePath,
includePaths :: [String],
libraryPaths :: [String],
frameworkPaths :: [String],
cmdlineFrameworks :: [String],
tmpDir :: String,
ghcUsagePath :: FilePath,
ghciUsagePath :: FilePath,
hpcDir :: String,
opt_L :: [String],
opt_P :: [String],
opt_F :: [String],
opt_c :: [String],
opt_m :: [String],
opt_a :: [String],
opt_l :: [String],
opt_windres :: [String],
pgm_L :: String,
pgm_P :: (String,[Option]),
pgm_F :: String,
pgm_c :: (String,[Option]),
pgm_m :: (String,[Option]),
pgm_s :: (String,[Option]),
pgm_a :: (String,[Option]),
pgm_l :: (String,[Option]),
pgm_dll :: (String,[Option]),
pgm_T :: String,
pgm_sysman :: String,
pgm_windres :: String,
depMakefile :: FilePath,
depIncludePkgDeps :: Bool,
depExcludeMods :: [ModuleName],
depSuffixes :: [String],
extraPkgConfs :: [FilePath],
topDir :: FilePath,
systemPackageConfig :: FilePath,
packageFlags :: [PackageFlag],
pkgDatabase :: Maybe [PackageConfig],
pkgState :: PackageState,
filesToClean :: IORef [FilePath],
dirsToClean :: IORef (FiniteMap FilePath FilePath),
flags :: [DynFlag],
log_action :: Severity -> SrcSpan -> PprStyle -> Message -> IO (),
haddockOptions :: Maybe String
}
wayNames :: DynFlags -> [WayName]
wayNames = map wayName . ways
data HscTarget
= HscC
| HscAsm
| HscJava
| HscInterpreted
| HscNothing
deriving (Eq, Show)
isObjectTarget :: HscTarget -> Bool
isObjectTarget HscC = True
isObjectTarget HscAsm = True
isObjectTarget _ = False
data GhcMode
= CompManager
| OneShot
| MkDepend
deriving Eq
instance Outputable GhcMode where
ppr CompManager = ptext (sLit "CompManager")
ppr OneShot = ptext (sLit "OneShot")
ppr MkDepend = ptext (sLit "MkDepend")
isOneShot :: GhcMode -> Bool
isOneShot OneShot = True
isOneShot _other = False
data GhcLink
= NoLink
| LinkBinary
| LinkInMemory
| LinkDynLib
deriving (Eq, Show)
isNoLink :: GhcLink -> Bool
isNoLink NoLink = True
isNoLink _ = False
doingTickyProfiling :: DynFlags -> Bool
doingTickyProfiling _ = opt_Ticky
data PackageFlag
= ExposePackage String
| ExposePackageId String
| HidePackage String
| IgnorePackage String
deriving Eq
defaultHscTarget :: HscTarget
defaultHscTarget = defaultObjectTarget
defaultObjectTarget :: HscTarget
defaultObjectTarget
| cGhcWithNativeCodeGen == "YES" = HscAsm
| otherwise = HscC
data DynLibLoader
= Deployable
| Wrapped (Maybe String)
| SystemDependent
deriving Eq
initDynFlags :: DynFlags -> IO DynFlags
initDynFlags dflags = do
ways <- readIORef v_Ways
refFilesToClean <- newIORef []
refDirsToClean <- newIORef emptyFM
return dflags{
ways = ways,
buildTag = mkBuildTag (filter (not . wayRTSOnly) ways),
rtsBuildTag = mkBuildTag ways,
filesToClean = refFilesToClean,
dirsToClean = refDirsToClean
}
defaultDynFlags :: DynFlags
defaultDynFlags =
DynFlags {
ghcMode = CompManager,
ghcLink = LinkBinary,
coreToDo = Nothing,
stgToDo = Nothing,
hscTarget = defaultHscTarget,
hscOutName = "",
extCoreName = "",
verbosity = 0,
optLevel = 0,
simplPhases = 2,
maxSimplIterations = 4,
shouldDumpSimplPhase = const False,
ruleCheck = Nothing,
specConstrThreshold = Just 200,
specConstrCount = Just 3,
liberateCaseThreshold = Just 200,
#ifndef OMIT_NATIVE_CODEGEN
targetPlatform = defaultTargetPlatform,
#endif
stolen_x86_regs = 4,
cmdlineHcIncludes = [],
importPaths = ["."],
mainModIs = mAIN,
mainFunIs = Nothing,
ctxtStkDepth = mAX_CONTEXT_REDUCTION_DEPTH,
dphBackend = DPHPar,
thisPackage = mainPackageId,
objectDir = Nothing,
hiDir = Nothing,
stubDir = Nothing,
objectSuf = phaseInputExt StopLn,
hcSuf = phaseInputExt HCc,
hiSuf = "hi",
outputFile = Nothing,
outputHi = Nothing,
dynLibLoader = SystemDependent,
dumpPrefix = Nothing,
dumpPrefixForce = Nothing,
includePaths = [],
libraryPaths = [],
frameworkPaths = [],
cmdlineFrameworks = [],
tmpDir = cDEFAULT_TMPDIR,
hpcDir = ".hpc",
opt_L = [],
opt_P = (if opt_PIC
then ["-D__PIC__", "-U __PIC__"]
else []),
opt_F = [],
opt_c = [],
opt_a = [],
opt_m = [],
opt_l = [],
opt_windres = [],
extraPkgConfs = [],
packageFlags = [],
pkgDatabase = Nothing,
pkgState = panic "no package state yet: call GHC.setSessionDynFlags",
ways = panic "defaultDynFlags: No ways",
buildTag = panic "defaultDynFlags: No buildTag",
rtsBuildTag = panic "defaultDynFlags: No rtsBuildTag",
splitInfo = Nothing,
ghcUsagePath = panic "defaultDynFlags: No ghciUsagePath",
ghciUsagePath = panic "defaultDynFlags: No ghciUsagePath",
topDir = panic "defaultDynFlags: No topDir",
systemPackageConfig = panic "no systemPackageConfig: call GHC.setSessionDynFlags",
pgm_L = panic "defaultDynFlags: No pgm_L",
pgm_P = panic "defaultDynFlags: No pgm_P",
pgm_F = panic "defaultDynFlags: No pgm_F",
pgm_c = panic "defaultDynFlags: No pgm_c",
pgm_m = panic "defaultDynFlags: No pgm_m",
pgm_s = panic "defaultDynFlags: No pgm_s",
pgm_a = panic "defaultDynFlags: No pgm_a",
pgm_l = panic "defaultDynFlags: No pgm_l",
pgm_dll = panic "defaultDynFlags: No pgm_dll",
pgm_T = panic "defaultDynFlags: No pgm_T",
pgm_sysman = panic "defaultDynFlags: No pgm_sysman",
pgm_windres = panic "defaultDynFlags: No pgm_windres",
depMakefile = "Makefile",
depIncludePkgDeps = False,
depExcludeMods = [],
depSuffixes = [],
filesToClean = panic "defaultDynFlags: No filesToClean",
dirsToClean = panic "defaultDynFlags: No dirsToClean",
haddockOptions = Nothing,
flags = [
Opt_RtsOptsEnabled,
Opt_AutoLinkPackages,
Opt_ReadUserPackageConf,
Opt_MonoPatBinds,
Opt_ImplicitPrelude,
Opt_MonomorphismRestriction,
Opt_NPlusKPatterns,
Opt_MethodSharing,
Opt_DoAsmMangling,
Opt_SharedImplib,
Opt_GenManifest,
Opt_EmbedManifest,
Opt_PrintBindContents
]
++ [f | (ns,f) <- optLevelFlags, 0 `elem` ns]
++ standardWarnings,
log_action = \severity srcSpan style msg ->
case severity of
SevInfo -> printErrs (msg style)
SevFatal -> printErrs (msg style)
_ -> do
hPutChar stderr '\n'
printErrs ((mkLocMessage srcSpan msg) style)
}
dopt :: DynFlag -> DynFlags -> Bool
dopt f dflags = f `elem` (flags dflags)
dopt_set :: DynFlags -> DynFlag -> DynFlags
dopt_set dfs f = dfs{ flags = f : flags dfs }
dopt_unset :: DynFlags -> DynFlag -> DynFlags
dopt_unset dfs f = dfs{ flags = filter (/= f) (flags dfs) }
getOpts :: DynFlags
-> (DynFlags -> [a])
-> [a]
getOpts dflags opts = reverse (opts dflags)
getVerbFlag :: DynFlags -> String
getVerbFlag dflags
| verbosity dflags >= 3 = "-v"
| otherwise = ""
setObjectDir, setHiDir, setStubDir, setOutputDir,
setObjectSuf, setHiSuf, setHcSuf, parseDynLibLoaderMode,
setPgmP, setPgmL, setPgmF, setPgmc, setPgmm, setPgms, setPgma, setPgml, setPgmdll, setPgmwindres,
addOptL, addOptP, addOptF, addOptc, addOptm, addOpta, addOptl, addOptwindres,
addCmdlineFramework, addHaddockOpts
:: String -> DynFlags -> DynFlags
setOutputFile, setOutputHi, setDumpPrefixForce
:: Maybe String -> DynFlags -> DynFlags
setObjectDir f d = d{ objectDir = Just f}
setHiDir f d = d{ hiDir = Just f}
setStubDir f d = d{ stubDir = Just f, includePaths = f : includePaths d }
setOutputDir f = setObjectDir f . setHiDir f . setStubDir f
setObjectSuf f d = d{ objectSuf = f}
setHiSuf f d = d{ hiSuf = f}
setHcSuf f d = d{ hcSuf = f}
setOutputFile f d = d{ outputFile = f}
setOutputHi f d = d{ outputHi = f}
parseDynLibLoaderMode f d =
case splitAt 8 f of
("deploy", "") -> d{ dynLibLoader = Deployable }
("sysdep", "") -> d{ dynLibLoader = SystemDependent }
("wrapped", "") -> d{ dynLibLoader = Wrapped Nothing }
("wrapped:", "hard") -> d{ dynLibLoader = Wrapped Nothing }
("wrapped:", flex) -> d{ dynLibLoader = Wrapped (Just flex) }
_ -> ghcError (CmdLineError ("Unknown dynlib loader: " ++ f))
setDumpPrefixForce f d = d { dumpPrefixForce = f}
setPgmP f d = let (pgm:args) = words f in d{ pgm_P = (pgm, map Option args)}
setPgmL f d = d{ pgm_L = f}
setPgmF f d = d{ pgm_F = f}
setPgmc f d = d{ pgm_c = (f,[])}
setPgmm f d = d{ pgm_m = (f,[])}
setPgms f d = d{ pgm_s = (f,[])}
setPgma f d = d{ pgm_a = (f,[])}
setPgml f d = d{ pgm_l = (f,[])}
setPgmdll f d = d{ pgm_dll = (f,[])}
setPgmwindres f d = d{ pgm_windres = f}
addOptL f d = d{ opt_L = f : opt_L d}
addOptP f d = d{ opt_P = f : opt_P d}
addOptF f d = d{ opt_F = f : opt_F d}
addOptc f d = d{ opt_c = f : opt_c d}
addOptm f d = d{ opt_m = f : opt_m d}
addOpta f d = d{ opt_a = f : opt_a d}
addOptl f d = d{ opt_l = f : opt_l d}
addOptwindres f d = d{ opt_windres = f : opt_windres d}
setDepMakefile :: FilePath -> DynFlags -> DynFlags
setDepMakefile f d = d { depMakefile = deOptDep f }
setDepIncludePkgDeps :: Bool -> DynFlags -> DynFlags
setDepIncludePkgDeps b d = d { depIncludePkgDeps = b }
addDepExcludeMod :: String -> DynFlags -> DynFlags
addDepExcludeMod m d
= d { depExcludeMods = mkModuleName (deOptDep m) : depExcludeMods d }
addDepSuffix :: FilePath -> DynFlags -> DynFlags
addDepSuffix s d = d { depSuffixes = deOptDep s : depSuffixes d }
deOptDep :: String -> String
deOptDep x = case stripPrefix "-optdep" x of
Just rest -> rest
Nothing -> x
addCmdlineFramework f d = d{ cmdlineFrameworks = f : cmdlineFrameworks d}
addHaddockOpts f d = d{ haddockOptions = Just f}
data Option
= FileOption
String
String
| Option String
showOpt :: Option -> String
showOpt (FileOption pre f) = pre ++ f
showOpt (Option s) = s
updOptLevel :: Int -> DynFlags -> DynFlags
updOptLevel n dfs
= dfs2{ optLevel = final_n }
where
final_n = max 0 (min 2 n)
dfs1 = foldr (flip dopt_unset) dfs remove_dopts
dfs2 = foldr (flip dopt_set) dfs1 extra_dopts
extra_dopts = [ f | (ns,f) <- optLevelFlags, final_n `elem` ns ]
remove_dopts = [ f | (ns,f) <- optLevelFlags, final_n `notElem` ns ]
optLevelFlags :: [([Int], DynFlag)]
optLevelFlags
= [ ([0], Opt_IgnoreInterfacePragmas)
, ([0], Opt_OmitInterfacePragmas)
, ([1,2], Opt_IgnoreAsserts)
, ([1,2], Opt_EnableRewriteRules)
, ([1,2], Opt_DoEtaReduction)
, ([1,2], Opt_CaseMerge)
, ([1,2], Opt_Strictness)
, ([1,2], Opt_CSE)
, ([1,2], Opt_FullLaziness)
, ([2], Opt_LiberateCase)
, ([2], Opt_SpecConstr)
, ([0,1,2], Opt_DoLambdaEtaExpansion)
]
standardWarnings :: [DynFlag]
standardWarnings
= [ Opt_WarnWarningsDeprecations,
Opt_WarnDeprecatedFlags,
Opt_WarnUnrecognisedPragmas,
Opt_WarnOverlappingPatterns,
Opt_WarnMissingFields,
Opt_WarnMissingMethods,
Opt_WarnDuplicateExports,
Opt_WarnLazyUnliftedBindings,
Opt_WarnDodgyForeignImports,
Opt_WarnWrongDoBind
]
minusWOpts :: [DynFlag]
minusWOpts
= standardWarnings ++
[ Opt_WarnUnusedBinds,
Opt_WarnUnusedMatches,
Opt_WarnUnusedImports,
Opt_WarnIncompletePatterns,
Opt_WarnDodgyExports,
Opt_WarnDodgyImports
]
minusWallOpts :: [DynFlag]
minusWallOpts
= minusWOpts ++
[ Opt_WarnTypeDefaults,
Opt_WarnNameShadowing,
Opt_WarnMissingSigs,
Opt_WarnHiShadows,
Opt_WarnOrphans,
Opt_WarnUnusedDoBind
]
minuswRemovesOpts :: [DynFlag]
minuswRemovesOpts
= minusWallOpts ++
[Opt_WarnImplicitPrelude,
Opt_WarnIncompletePatternsRecUpd,
Opt_WarnSimplePatterns,
Opt_WarnMonomorphism,
Opt_WarnUnrecognisedPragmas,
Opt_WarnTabs
]
data CoreToDo
= CoreDoSimplify
SimplifierMode
[SimplifierSwitch]
| CoreDoFloatInwards
| CoreDoFloatOutwards FloatOutSwitches
| CoreLiberateCase
| CoreDoPrintCore
| CoreDoStaticArgs
| CoreDoStrictness
| CoreDoWorkerWrapper
| CoreDoSpecialising
| CoreDoSpecConstr
| CoreDoOldStrictness
| CoreDoGlomBinds
| CoreCSE
| CoreDoRuleCheck Int String
| CoreDoVectorisation PackageId
| CoreDoNothing
| CoreDoPasses [CoreToDo]
data SimplifierMode
= SimplGently
| SimplPhase Int [String]
instance Outputable SimplifierMode where
ppr SimplGently = ptext (sLit "gentle")
ppr (SimplPhase n ss) = int n <+> brackets (text (concat $ intersperse "," ss))
data SimplifierSwitch
= MaxSimplifierIterations Int
| NoCaseOfCase
data FloatOutSwitches = FloatOutSwitches {
floatOutLambdas :: Bool,
floatOutConstants :: Bool
}
instance Outputable FloatOutSwitches where
ppr = pprFloatOutSwitches
pprFloatOutSwitches :: FloatOutSwitches -> SDoc
pprFloatOutSwitches sw = pp_not (floatOutLambdas sw) <+> text "lambdas" <> comma
<+> pp_not (floatOutConstants sw) <+> text "constants"
where
pp_not True = empty
pp_not False = text "not"
constantsOnlyFloatOutSwitches :: FloatOutSwitches
constantsOnlyFloatOutSwitches = FloatOutSwitches False True
runWhen :: Bool -> CoreToDo -> CoreToDo
runWhen True do_this = do_this
runWhen False _ = CoreDoNothing
runMaybe :: Maybe a -> (a -> CoreToDo) -> CoreToDo
runMaybe (Just x) f = f x
runMaybe Nothing _ = CoreDoNothing
getCoreToDo :: DynFlags -> [CoreToDo]
getCoreToDo dflags
| Just todo <- coreToDo dflags = todo
| otherwise = core_todo
where
opt_level = optLevel dflags
phases = simplPhases dflags
max_iter = maxSimplIterations dflags
strictness = dopt Opt_Strictness dflags
full_laziness = dopt Opt_FullLaziness dflags
cse = dopt Opt_CSE dflags
spec_constr = dopt Opt_SpecConstr dflags
liberate_case = dopt Opt_LiberateCase dflags
rule_check = ruleCheck dflags
static_args = dopt Opt_StaticArgumentTransformation dflags
maybe_rule_check phase = runMaybe rule_check (CoreDoRuleCheck phase)
simpl_phase phase names iter
= CoreDoPasses
[ CoreDoSimplify (SimplPhase phase names) [
MaxSimplifierIterations iter
],
maybe_rule_check phase
]
vectorisation
= runWhen (dopt Opt_Vectorise dflags)
$ CoreDoPasses [ simpl_gently, CoreDoVectorisation (dphPackage dflags) ]
simpl_phases = CoreDoPasses [ simpl_phase phase ["main"] max_iter
| phase <- [phases, phases1 .. 1] ]
simpl_gently = CoreDoSimplify SimplGently [
NoCaseOfCase,
MaxSimplifierIterations max_iter
]
core_todo =
if opt_level == 0 then
[vectorisation,
simpl_phase 0 ["final"] max_iter]
else [
runWhen static_args (CoreDoPasses [ simpl_gently, CoreDoStaticArgs ]),
vectorisation,
simpl_gently,
CoreDoSpecialising,
runWhen full_laziness (CoreDoFloatOutwards constantsOnlyFloatOutSwitches),
CoreDoFloatInwards,
simpl_phases,
simpl_phase 0 ["main"] (max max_iter 3),
#ifdef OLD_STRICTNESS
CoreDoOldStrictness,
#endif
runWhen strictness (CoreDoPasses [
CoreDoStrictness,
CoreDoWorkerWrapper,
CoreDoGlomBinds,
simpl_phase 0 ["post-worker-wrapper"] max_iter
]),
runWhen full_laziness
(CoreDoFloatOutwards constantsOnlyFloatOutSwitches),
runWhen cse CoreCSE,
CoreDoFloatInwards,
maybe_rule_check 0,
runWhen liberate_case (CoreDoPasses [
CoreLiberateCase,
simpl_phase 0 ["post-liberate-case"] max_iter
]),
runWhen spec_constr CoreDoSpecConstr,
maybe_rule_check 0,
simpl_phase 0 ["final"] max_iter
]
data StgToDo
= StgDoMassageForProfiling
| D_stg_stats
getStgToDo :: DynFlags -> [StgToDo]
getStgToDo dflags
| Just todo <- stgToDo dflags = todo
| otherwise = todo2
where
stg_stats = dopt Opt_StgStats dflags
todo1 = if stg_stats then [D_stg_stats] else []
todo2 | WayProf `elem` wayNames dflags
= StgDoMassageForProfiling : todo1
| otherwise
= todo1
allFlags :: [String]
allFlags = map ('-':) $
[ flagName flag | flag <- dynamic_flags, ok (flagOptKind flag) ] ++
map ("fno-"++) flags ++
map ("f"++) flags ++
map ("X"++) supportedLanguages ++
map ("XNo"++) supportedLanguages
where ok (PrefixPred _ _) = False
ok _ = True
flags = [ name | (name, _, _) <- fFlags ]
dynamic_flags :: [Flag DynP]
dynamic_flags = [
Flag "n" (NoArg (setDynFlag Opt_DryRun)) Supported
, Flag "cpp" (NoArg (setDynFlag Opt_Cpp)) Supported
, Flag "F" (NoArg (setDynFlag Opt_Pp)) Supported
, Flag "#include" (HasArg (addCmdlineHCInclude))
(DeprecatedFullText "-#include and INCLUDE pragmas are deprecated: They no longer have any effect")
, Flag "v" (OptIntSuffix setVerbosity) Supported
, Flag "pgmL" (HasArg (upd . setPgmL)) Supported
, Flag "pgmP" (HasArg (upd . setPgmP)) Supported
, Flag "pgmF" (HasArg (upd . setPgmF)) Supported
, Flag "pgmc" (HasArg (upd . setPgmc)) Supported
, Flag "pgmm" (HasArg (upd . setPgmm)) Supported
, Flag "pgms" (HasArg (upd . setPgms)) Supported
, Flag "pgma" (HasArg (upd . setPgma)) Supported
, Flag "pgml" (HasArg (upd . setPgml)) Supported
, Flag "pgmdll" (HasArg (upd . setPgmdll)) Supported
, Flag "pgmwindres" (HasArg (upd . setPgmwindres)) Supported
, Flag "optL" (HasArg (upd . addOptL)) Supported
, Flag "optP" (HasArg (upd . addOptP)) Supported
, Flag "optF" (HasArg (upd . addOptF)) Supported
, Flag "optc" (HasArg (upd . addOptc)) Supported
, Flag "optm" (HasArg (upd . addOptm)) Supported
, Flag "opta" (HasArg (upd . addOpta)) Supported
, Flag "optl" (HasArg (upd . addOptl)) Supported
, Flag "optwindres" (HasArg (upd . addOptwindres)) Supported
, Flag "split-objs"
(NoArg (if can_split then setDynFlag Opt_SplitObjs else return ()))
Supported
, Flag "dep-suffix" (HasArg (upd . addDepSuffix)) Supported
, Flag "optdep-s" (HasArg (upd . addDepSuffix))
(Deprecated "Use -dep-suffix instead")
, Flag "dep-makefile" (HasArg (upd . setDepMakefile)) Supported
, Flag "optdep-f" (HasArg (upd . setDepMakefile))
(Deprecated "Use -dep-makefile instead")
, Flag "optdep-w" (NoArg (return ()))
(Deprecated "-optdep-w doesn't do anything")
, Flag "include-pkg-deps" (NoArg (upd (setDepIncludePkgDeps True))) Supported
, Flag "optdep--include-prelude" (NoArg (upd (setDepIncludePkgDeps True)))
(Deprecated "Use -include-pkg-deps instead")
, Flag "optdep--include-pkg-deps" (NoArg (upd (setDepIncludePkgDeps True)))
(Deprecated "Use -include-pkg-deps instead")
, Flag "exclude-module" (HasArg (upd . addDepExcludeMod)) Supported
, Flag "optdep--exclude-module" (HasArg (upd . addDepExcludeMod))
(Deprecated "Use -exclude-module instead")
, Flag "optdep-x" (HasArg (upd . addDepExcludeMod))
(Deprecated "Use -exclude-module instead")
, Flag "c" (NoArg (upd $ \d -> d{ ghcLink=NoLink } ))
Supported
, Flag "no-link" (NoArg (upd $ \d -> d{ ghcLink=NoLink } ))
(Deprecated "Use -c instead")
, Flag "shared" (NoArg (upd $ \d -> d{ ghcLink=LinkDynLib } ))
Supported
, Flag "dynload" (HasArg (upd . parseDynLibLoaderMode))
Supported
, Flag "L" (Prefix addLibraryPath ) Supported
, Flag "l" (AnySuffix (\s -> do upd (addOptl s))) Supported
, Flag "framework-path" (HasArg addFrameworkPath ) Supported
, Flag "framework" (HasArg (upd . addCmdlineFramework)) Supported
, Flag "odir" (HasArg (upd . setObjectDir)) Supported
, Flag "o" (SepArg (upd . setOutputFile . Just)) Supported
, Flag "ohi" (HasArg (upd . setOutputHi . Just )) Supported
, Flag "osuf" (HasArg (upd . setObjectSuf)) Supported
, Flag "hcsuf" (HasArg (upd . setHcSuf)) Supported
, Flag "hisuf" (HasArg (upd . setHiSuf)) Supported
, Flag "hidir" (HasArg (upd . setHiDir)) Supported
, Flag "tmpdir" (HasArg (upd . setTmpDir)) Supported
, Flag "stubdir" (HasArg (upd . setStubDir)) Supported
, Flag "outputdir" (HasArg (upd . setOutputDir)) Supported
, Flag "ddump-file-prefix" (HasArg (upd . setDumpPrefixForce . Just))
Supported
, Flag "keep-hc-file" (NoArg (setDynFlag Opt_KeepHcFiles)) Supported
, Flag "keep-hc-files" (NoArg (setDynFlag Opt_KeepHcFiles)) Supported
, Flag "keep-s-file" (NoArg (setDynFlag Opt_KeepSFiles)) Supported
, Flag "keep-s-files" (NoArg (setDynFlag Opt_KeepSFiles)) Supported
, Flag "keep-raw-s-file" (NoArg (setDynFlag Opt_KeepRawSFiles)) Supported
, Flag "keep-raw-s-files" (NoArg (setDynFlag Opt_KeepRawSFiles)) Supported
, Flag "keep-tmp-files" (NoArg (setDynFlag Opt_KeepTmpFiles)) Supported
, Flag "no-auto-link-packages" (NoArg (unSetDynFlag Opt_AutoLinkPackages)) Supported
, Flag "no-hs-main" (NoArg (setDynFlag Opt_NoHsMain)) Supported
, Flag "rtsopts" (NoArg (setDynFlag Opt_RtsOptsEnabled)) Supported
, Flag "no-rtsopts" (NoArg (unSetDynFlag Opt_RtsOptsEnabled)) Supported
, Flag "main-is" (SepArg setMainIs ) Supported
, Flag "haddock" (NoArg (setDynFlag Opt_Haddock)) Supported
, Flag "haddock-opts" (HasArg (upd . addHaddockOpts)) Supported
, Flag "hpcdir" (SepArg setOptHpcDir) Supported
, Flag "recomp" (NoArg (unSetDynFlag Opt_ForceRecomp))
(Deprecated "Use -fno-force-recomp instead")
, Flag "no-recomp" (NoArg (setDynFlag Opt_ForceRecomp))
(Deprecated "Use -fforce-recomp instead")
, Flag "D" (AnySuffix (upd . addOptP)) Supported
, Flag "U" (AnySuffix (upd . addOptP)) Supported
, Flag "I" (Prefix addIncludePath) Supported
, Flag "i" (OptPrefix addImportPath ) Supported
, Flag "dstg-stats" (NoArg (setDynFlag Opt_StgStats)) Supported
, Flag "ddump-cmm" (setDumpFlag Opt_D_dump_cmm)
Supported
, Flag "ddump-cmmz" (setDumpFlag Opt_D_dump_cmmz)
Supported
, Flag "ddump-cmmz-pretty" (setDumpFlag Opt_D_dump_cmmz_pretty)
Supported
, Flag "ddump-cps-cmm" (setDumpFlag Opt_D_dump_cps_cmm)
Supported
, Flag "ddump-cvt-cmm" (setDumpFlag Opt_D_dump_cvt_cmm)
Supported
, Flag "ddump-asm" (setDumpFlag Opt_D_dump_asm)
Supported
, Flag "ddump-asm-native" (setDumpFlag Opt_D_dump_asm_native)
Supported
, Flag "ddump-asm-liveness" (setDumpFlag Opt_D_dump_asm_liveness)
Supported
, Flag "ddump-asm-coalesce" (setDumpFlag Opt_D_dump_asm_coalesce)
Supported
, Flag "ddump-asm-regalloc" (setDumpFlag Opt_D_dump_asm_regalloc)
Supported
, Flag "ddump-asm-conflicts" (setDumpFlag Opt_D_dump_asm_conflicts)
Supported
, Flag "ddump-asm-regalloc-stages"
(setDumpFlag Opt_D_dump_asm_regalloc_stages)
Supported
, Flag "ddump-asm-stats" (setDumpFlag Opt_D_dump_asm_stats)
Supported
, Flag "ddump-asm-expanded" (setDumpFlag Opt_D_dump_asm_expanded)
Supported
, Flag "ddump-cpranal" (setDumpFlag Opt_D_dump_cpranal)
Supported
, Flag "ddump-deriv" (setDumpFlag Opt_D_dump_deriv)
Supported
, Flag "ddump-ds" (setDumpFlag Opt_D_dump_ds)
Supported
, Flag "ddump-flatC" (setDumpFlag Opt_D_dump_flatC)
Supported
, Flag "ddump-foreign" (setDumpFlag Opt_D_dump_foreign)
Supported
, Flag "ddump-inlinings" (setDumpFlag Opt_D_dump_inlinings)
Supported
, Flag "ddump-rule-firings" (setDumpFlag Opt_D_dump_rule_firings)
Supported
, Flag "ddump-occur-anal" (setDumpFlag Opt_D_dump_occur_anal)
Supported
, Flag "ddump-parsed" (setDumpFlag Opt_D_dump_parsed)
Supported
, Flag "ddump-rn" (setDumpFlag Opt_D_dump_rn)
Supported
, Flag "ddump-simpl" (setDumpFlag Opt_D_dump_simpl)
Supported
, Flag "ddump-simpl-iterations" (setDumpFlag Opt_D_dump_simpl_iterations)
Supported
, Flag "ddump-simpl-phases" (OptPrefix setDumpSimplPhases)
Supported
, Flag "ddump-spec" (setDumpFlag Opt_D_dump_spec)
Supported
, Flag "ddump-prep" (setDumpFlag Opt_D_dump_prep)
Supported
, Flag "ddump-stg" (setDumpFlag Opt_D_dump_stg)
Supported
, Flag "ddump-stranal" (setDumpFlag Opt_D_dump_stranal)
Supported
, Flag "ddump-tc" (setDumpFlag Opt_D_dump_tc)
Supported
, Flag "ddump-types" (setDumpFlag Opt_D_dump_types)
Supported
, Flag "ddump-rules" (setDumpFlag Opt_D_dump_rules)
Supported
, Flag "ddump-cse" (setDumpFlag Opt_D_dump_cse)
Supported
, Flag "ddump-worker-wrapper" (setDumpFlag Opt_D_dump_worker_wrapper)
Supported
, Flag "ddump-rn-trace" (setDumpFlag Opt_D_dump_rn_trace)
Supported
, Flag "ddump-if-trace" (setDumpFlag Opt_D_dump_if_trace)
Supported
, Flag "ddump-tc-trace" (setDumpFlag Opt_D_dump_tc_trace)
Supported
, Flag "ddump-splices" (setDumpFlag Opt_D_dump_splices)
Supported
, Flag "ddump-rn-stats" (setDumpFlag Opt_D_dump_rn_stats)
Supported
, Flag "ddump-opt-cmm" (setDumpFlag Opt_D_dump_opt_cmm)
Supported
, Flag "ddump-simpl-stats" (setDumpFlag Opt_D_dump_simpl_stats)
Supported
, Flag "ddump-bcos" (setDumpFlag Opt_D_dump_BCOs)
Supported
, Flag "dsource-stats" (setDumpFlag Opt_D_source_stats)
Supported
, Flag "dverbose-core2core" (NoArg setVerboseCore2Core)
Supported
, Flag "dverbose-stg2stg" (setDumpFlag Opt_D_verbose_stg2stg)
Supported
, Flag "ddump-hi" (setDumpFlag Opt_D_dump_hi)
Supported
, Flag "ddump-minimal-imports" (setDumpFlag Opt_D_dump_minimal_imports)
Supported
, Flag "ddump-vect" (setDumpFlag Opt_D_dump_vect)
Supported
, Flag "ddump-hpc" (setDumpFlag Opt_D_dump_hpc)
Supported
, Flag "ddump-mod-cycles" (setDumpFlag Opt_D_dump_mod_cycles)
Supported
, Flag "ddump-view-pattern-commoning" (setDumpFlag Opt_D_dump_view_pattern_commoning)
Supported
, Flag "ddump-to-file" (setDumpFlag Opt_DumpToFile)
Supported
, Flag "ddump-hi-diffs" (setDumpFlag Opt_D_dump_hi_diffs)
Supported
, Flag "ddump-rtti" (setDumpFlag Opt_D_dump_rtti)
Supported
, Flag "dcore-lint" (NoArg (setDynFlag Opt_DoCoreLinting))
Supported
, Flag "dstg-lint" (NoArg (setDynFlag Opt_DoStgLinting))
Supported
, Flag "dcmm-lint" (NoArg (setDynFlag Opt_DoCmmLinting))
Supported
, Flag "dasm-lint" (NoArg (setDynFlag Opt_DoAsmLinting))
Supported
, Flag "dshow-passes"
(NoArg (do forceRecompile
setVerbosity (Just 2)))
Supported
, Flag "dfaststring-stats" (NoArg (setDynFlag Opt_D_faststring_stats))
Supported
, Flag "monly-2-regs" (NoArg (upd (\s -> s{stolen_x86_regs = 2}) ))
Supported
, Flag "monly-3-regs" (NoArg (upd (\s -> s{stolen_x86_regs = 3}) ))
Supported
, Flag "monly-4-regs" (NoArg (upd (\s -> s{stolen_x86_regs = 4}) ))
Supported
, Flag "W" (NoArg (mapM_ setDynFlag minusWOpts))
Supported
, Flag "Werror" (NoArg (setDynFlag Opt_WarnIsError))
Supported
, Flag "Wwarn" (NoArg (unSetDynFlag Opt_WarnIsError))
Supported
, Flag "Wall" (NoArg (mapM_ setDynFlag minusWallOpts))
Supported
, Flag "Wnot" (NoArg (mapM_ unSetDynFlag minusWallOpts))
(Deprecated "Use -w instead")
, Flag "w" (NoArg (mapM_ unSetDynFlag minuswRemovesOpts))
Supported
, Flag "O" (NoArg (upd (setOptLevel 1))) Supported
, Flag "Onot" (NoArg (upd (setOptLevel 0)))
(Deprecated "Use -O0 instead")
, Flag "Odph" (NoArg (upd setDPHOpt)) Supported
, Flag "O" (OptIntSuffix (\mb_n -> upd (setOptLevel (mb_n `orElse` 1))))
Supported
, Flag "fsimplifier-phases"
(IntSuffix (\n -> upd (\dfs -> dfs{ simplPhases = n })))
Supported
, Flag "fmax-simplifier-iterations"
(IntSuffix (\n -> upd (\dfs -> dfs{ maxSimplIterations = n })))
Supported
, Flag "fspec-constr-threshold"
(IntSuffix (\n -> upd (\dfs -> dfs{ specConstrThreshold = Just n })))
Supported
, Flag "fno-spec-constr-threshold"
(NoArg (upd (\dfs -> dfs{ specConstrThreshold = Nothing })))
Supported
, Flag "fspec-constr-count"
(IntSuffix (\n -> upd (\dfs -> dfs{ specConstrCount = Just n })))
Supported
, Flag "fno-spec-constr-count"
(NoArg (upd (\dfs -> dfs{ specConstrCount = Nothing })))
Supported
, Flag "fliberate-case-threshold"
(IntSuffix (\n -> upd (\dfs -> dfs{ liberateCaseThreshold = Just n })))
Supported
, Flag "fno-liberate-case-threshold"
(NoArg (upd (\dfs -> dfs{ liberateCaseThreshold = Nothing })))
Supported
, Flag "frule-check"
(SepArg (\s -> upd (\dfs -> dfs{ ruleCheck = Just s })))
Supported
, Flag "fcontext-stack"
(IntSuffix $ \n -> upd $ \dfs -> dfs{ ctxtStkDepth = n })
Supported
, Flag "fauto-sccs-on-all-toplevs"
(NoArg (setDynFlag Opt_AutoSccsOnAllToplevs))
Supported
, Flag "auto-all"
(NoArg (setDynFlag Opt_AutoSccsOnAllToplevs))
Supported
, Flag "no-auto-all"
(NoArg (unSetDynFlag Opt_AutoSccsOnAllToplevs))
Supported
, Flag "fauto-sccs-on-exported-toplevs"
(NoArg (setDynFlag Opt_AutoSccsOnExportedToplevs))
Supported
, Flag "auto"
(NoArg (setDynFlag Opt_AutoSccsOnExportedToplevs))
Supported
, Flag "no-auto"
(NoArg (unSetDynFlag Opt_AutoSccsOnExportedToplevs))
Supported
, Flag "fauto-sccs-on-individual-cafs"
(NoArg (setDynFlag Opt_AutoSccsOnIndividualCafs))
Supported
, Flag "caf-all"
(NoArg (setDynFlag Opt_AutoSccsOnIndividualCafs))
Supported
, Flag "no-caf-all"
(NoArg (unSetDynFlag Opt_AutoSccsOnIndividualCafs))
Supported
, Flag "fdph-seq"
(NoArg (setDPHBackend DPHSeq))
Supported
, Flag "fdph-par"
(NoArg (setDPHBackend DPHPar))
Supported
, Flag "fdph-this"
(NoArg (setDPHBackend DPHThis))
Supported
, Flag "fasm" (NoArg (setObjTarget HscAsm)) Supported
, Flag "fvia-c" (NoArg (setObjTarget HscC)) Supported
, Flag "fvia-C" (NoArg (setObjTarget HscC)) Supported
, Flag "fno-code" (NoArg (setTarget HscNothing)) Supported
, Flag "fbyte-code" (NoArg (setTarget HscInterpreted)) Supported
, Flag "fobject-code" (NoArg (setTarget defaultHscTarget)) Supported
, Flag "fglasgow-exts" (NoArg (mapM_ setDynFlag glasgowExtsFlags))
Supported
, Flag "fno-glasgow-exts" (NoArg (mapM_ unSetDynFlag glasgowExtsFlags))
Supported
]
++ map (mkFlag True "f" setDynFlag ) fFlags
++ map (mkFlag False "fno-" unSetDynFlag) fFlags
++ map (mkFlag True "X" setDynFlag ) xFlags
++ map (mkFlag False "XNo" unSetDynFlag) xFlags
package_flags :: [Flag DynP]
package_flags = [
Flag "package-conf" (HasArg extraPkgConf_) Supported
, Flag "no-user-package-conf" (NoArg (unSetDynFlag Opt_ReadUserPackageConf))
Supported
, Flag "package-name" (HasArg (upd . setPackageName)) Supported
, Flag "package-id" (HasArg exposePackageId) Supported
, Flag "package" (HasArg exposePackage) Supported
, Flag "hide-package" (HasArg hidePackage) Supported
, Flag "hide-all-packages" (NoArg (setDynFlag Opt_HideAllPackages))
Supported
, Flag "ignore-package" (HasArg ignorePackage)
Supported
, Flag "syslib" (HasArg exposePackage)
(Deprecated "Use -package instead")
]
mkFlag :: Bool
-> String
-> (DynFlag -> DynP ())
-> (String, DynFlag, Bool -> Deprecated)
-> Flag DynP
mkFlag turnOn flagPrefix f (name, dynflag, deprecated)
= Flag (flagPrefix ++ name) (NoArg (f dynflag)) (deprecated turnOn)
deprecatedForLanguage :: String -> Bool -> Deprecated
deprecatedForLanguage lang turn_on
= Deprecated ("use -X" ++ flag ++ " or pragma {-# LANGUAGE " ++ flag ++ " #-} instead")
where
flag | turn_on = lang
| otherwise = "No"++lang
useInstead :: String -> Bool -> Deprecated
useInstead flag turn_on
= Deprecated ("Use -f" ++ no ++ flag ++ " instead")
where
no = if turn_on then "" else "no-"
fFlags :: [(String, DynFlag, Bool -> Deprecated)]
fFlags = [
( "warn-dodgy-foreign-imports", Opt_WarnDodgyForeignImports, const Supported ),
( "warn-dodgy-exports", Opt_WarnDodgyExports, const Supported ),
( "warn-dodgy-imports", Opt_WarnDodgyImports, const Supported ),
( "warn-duplicate-exports", Opt_WarnDuplicateExports, const Supported ),
( "warn-hi-shadowing", Opt_WarnHiShadows, const Supported ),
( "warn-implicit-prelude", Opt_WarnImplicitPrelude, const Supported ),
( "warn-incomplete-patterns", Opt_WarnIncompletePatterns, const Supported ),
( "warn-incomplete-record-updates", Opt_WarnIncompletePatternsRecUpd, const Supported ),
( "warn-missing-fields", Opt_WarnMissingFields, const Supported ),
( "warn-missing-methods", Opt_WarnMissingMethods, const Supported ),
( "warn-missing-signatures", Opt_WarnMissingSigs, const Supported ),
( "warn-name-shadowing", Opt_WarnNameShadowing, const Supported ),
( "warn-overlapping-patterns", Opt_WarnOverlappingPatterns, const Supported ),
( "warn-simple-patterns", Opt_WarnSimplePatterns, const Supported ),
( "warn-type-defaults", Opt_WarnTypeDefaults, const Supported ),
( "warn-monomorphism-restriction", Opt_WarnMonomorphism, const Supported ),
( "warn-unused-binds", Opt_WarnUnusedBinds, const Supported ),
( "warn-unused-imports", Opt_WarnUnusedImports, const Supported ),
( "warn-unused-matches", Opt_WarnUnusedMatches, const Supported ),
( "warn-warnings-deprecations", Opt_WarnWarningsDeprecations, const Supported ),
( "warn-deprecations", Opt_WarnWarningsDeprecations, const Supported ),
( "warn-deprecated-flags", Opt_WarnDeprecatedFlags, const Supported ),
( "warn-orphans", Opt_WarnOrphans, const Supported ),
( "warn-tabs", Opt_WarnTabs, const Supported ),
( "warn-unrecognised-pragmas", Opt_WarnUnrecognisedPragmas, const Supported ),
( "warn-lazy-unlifted-bindings", Opt_WarnLazyUnliftedBindings,
const $ Deprecated "lazy unlifted bindings will be an error in GHC 6.14, and this flag will no longer exist"),
( "warn-unused-do-bind", Opt_WarnUnusedDoBind, const Supported ),
( "warn-wrong-do-bind", Opt_WarnWrongDoBind, const Supported ),
( "print-explicit-foralls", Opt_PrintExplicitForalls, const Supported ),
( "strictness", Opt_Strictness, const Supported ),
( "static-argument-transformation", Opt_StaticArgumentTransformation, const Supported ),
( "full-laziness", Opt_FullLaziness, const Supported ),
( "liberate-case", Opt_LiberateCase, const Supported ),
( "spec-constr", Opt_SpecConstr, const Supported ),
( "cse", Opt_CSE, const Supported ),
( "ignore-interface-pragmas", Opt_IgnoreInterfacePragmas, const Supported ),
( "omit-interface-pragmas", Opt_OmitInterfacePragmas, const Supported ),
( "do-lambda-eta-expansion", Opt_DoLambdaEtaExpansion, const Supported ),
( "ignore-asserts", Opt_IgnoreAsserts, const Supported ),
( "do-eta-reduction", Opt_DoEtaReduction, const Supported ),
( "case-merge", Opt_CaseMerge, const Supported ),
( "unbox-strict-fields", Opt_UnboxStrictFields, const Supported ),
( "method-sharing", Opt_MethodSharing, const Supported ),
( "dicts-cheap", Opt_DictsCheap, const Supported ),
( "inline-if-enough-args", Opt_InlineIfEnoughArgs, const Supported ),
( "excess-precision", Opt_ExcessPrecision, const Supported ),
( "eager-blackholing", Opt_EagerBlackHoling, const Supported ),
( "asm-mangling", Opt_DoAsmMangling, const Supported ),
( "print-bind-result", Opt_PrintBindResult, const Supported ),
( "force-recomp", Opt_ForceRecomp, const Supported ),
( "hpc-no-auto", Opt_Hpc_No_Auto, const Supported ),
( "rewrite-rules", Opt_EnableRewriteRules, useInstead "enable-rewrite-rules" ),
( "enable-rewrite-rules", Opt_EnableRewriteRules, const Supported ),
( "break-on-exception", Opt_BreakOnException, const Supported ),
( "break-on-error", Opt_BreakOnError, const Supported ),
( "print-evld-with-show", Opt_PrintEvldWithShow, const Supported ),
( "print-bind-contents", Opt_PrintBindContents, const Supported ),
( "run-cps", Opt_RunCPS, const Supported ),
( "run-cpsz", Opt_RunCPSZ, const Supported ),
( "new-codegen", Opt_TryNewCodeGen, const Supported ),
( "convert-to-zipper-and-back", Opt_ConvertToZipCfgAndBack, const Supported ),
( "vectorise", Opt_Vectorise, const Supported ),
( "regs-graph", Opt_RegsGraph, const Supported ),
( "regs-iterative", Opt_RegsIterative, const Supported ),
( "th", Opt_TemplateHaskell,
deprecatedForLanguage "TemplateHaskell" ),
( "fi", Opt_ForeignFunctionInterface,
deprecatedForLanguage "ForeignFunctionInterface" ),
( "ffi", Opt_ForeignFunctionInterface,
deprecatedForLanguage "ForeignFunctionInterface" ),
( "arrows", Opt_Arrows,
deprecatedForLanguage "Arrows" ),
( "generics", Opt_Generics,
deprecatedForLanguage "Generics" ),
( "implicit-prelude", Opt_ImplicitPrelude,
deprecatedForLanguage "ImplicitPrelude" ),
( "bang-patterns", Opt_BangPatterns,
deprecatedForLanguage "BangPatterns" ),
( "monomorphism-restriction", Opt_MonomorphismRestriction,
deprecatedForLanguage "MonomorphismRestriction" ),
( "mono-pat-binds", Opt_MonoPatBinds,
deprecatedForLanguage "MonoPatBinds" ),
( "extended-default-rules", Opt_ExtendedDefaultRules,
deprecatedForLanguage "ExtendedDefaultRules" ),
( "implicit-params", Opt_ImplicitParams,
deprecatedForLanguage "ImplicitParams" ),
( "scoped-type-variables", Opt_ScopedTypeVariables,
deprecatedForLanguage "ScopedTypeVariables" ),
( "parr", Opt_PArr,
deprecatedForLanguage "PArr" ),
( "allow-overlapping-instances", Opt_OverlappingInstances,
deprecatedForLanguage "OverlappingInstances" ),
( "allow-undecidable-instances", Opt_UndecidableInstances,
deprecatedForLanguage "UndecidableInstances" ),
( "allow-incoherent-instances", Opt_IncoherentInstances,
deprecatedForLanguage "IncoherentInstances" ),
( "gen-manifest", Opt_GenManifest, const Supported ),
( "embed-manifest", Opt_EmbedManifest, const Supported ),
( "ext-core", Opt_EmitExternalCore, const Supported ),
( "shared-implib", Opt_SharedImplib, const Supported ),
( "building-cabal-package", Opt_BuildingCabalPackage, const Supported ),
( "implicit-import-qualified", Opt_ImplicitImportQualified, const Supported )
]
supportedLanguages :: [String]
supportedLanguages = [ name | (name, _, _) <- xFlags ]
languageOptions :: [DynFlag]
languageOptions = [ dynFlag | (_, dynFlag, _) <- xFlags ]
xFlags :: [(String, DynFlag, Bool -> Deprecated)]
xFlags = [
( "CPP", Opt_Cpp, const Supported ),
( "PostfixOperators", Opt_PostfixOperators, const Supported ),
( "TupleSections", Opt_TupleSections, const Supported ),
( "PatternGuards", Opt_PatternGuards, const Supported ),
( "UnicodeSyntax", Opt_UnicodeSyntax, const Supported ),
( "MagicHash", Opt_MagicHash, const Supported ),
( "PolymorphicComponents", Opt_PolymorphicComponents, const Supported ),
( "ExistentialQuantification", Opt_ExistentialQuantification, const Supported ),
( "KindSignatures", Opt_KindSignatures, const Supported ),
( "EmptyDataDecls", Opt_EmptyDataDecls, const Supported ),
( "ParallelListComp", Opt_ParallelListComp, const Supported ),
( "TransformListComp", Opt_TransformListComp, const Supported ),
( "ForeignFunctionInterface", Opt_ForeignFunctionInterface, const Supported ),
( "UnliftedFFITypes", Opt_UnliftedFFITypes, const Supported ),
( "GHCForeignImportPrim", Opt_GHCForeignImportPrim, const Supported ),
( "LiberalTypeSynonyms", Opt_LiberalTypeSynonyms, const Supported ),
( "Rank2Types", Opt_Rank2Types, const Supported ),
( "RankNTypes", Opt_RankNTypes, const Supported ),
( "ImpredicativeTypes", Opt_ImpredicativeTypes,
const $ Deprecated "impredicative polymorphism will be simplified or removed in GHC 6.14" ),
( "TypeOperators", Opt_TypeOperators, const Supported ),
( "RecursiveDo", Opt_RecursiveDo,
deprecatedForLanguage "DoRec"),
( "DoRec", Opt_DoRec, const Supported ),
( "Arrows", Opt_Arrows, const Supported ),
( "PArr", Opt_PArr, const Supported ),
( "TemplateHaskell", Opt_TemplateHaskell, const Supported ),
( "QuasiQuotes", Opt_QuasiQuotes, const Supported ),
( "Generics", Opt_Generics, const Supported ),
( "ImplicitPrelude", Opt_ImplicitPrelude, const Supported ),
( "RecordWildCards", Opt_RecordWildCards, const Supported ),
( "NamedFieldPuns", Opt_RecordPuns, const Supported ),
( "RecordPuns", Opt_RecordPuns,
deprecatedForLanguage "NamedFieldPuns" ),
( "DisambiguateRecordFields", Opt_DisambiguateRecordFields, const Supported ),
( "OverloadedStrings", Opt_OverloadedStrings, const Supported ),
( "GADTs", Opt_GADTs, const Supported ),
( "ViewPatterns", Opt_ViewPatterns, const Supported ),
( "TypeFamilies", Opt_TypeFamilies, const Supported ),
( "BangPatterns", Opt_BangPatterns, const Supported ),
( "MonomorphismRestriction", Opt_MonomorphismRestriction, const Supported ),
( "NPlusKPatterns", Opt_NPlusKPatterns, const Supported ),
( "MonoPatBinds", Opt_MonoPatBinds, const Supported ),
( "ExplicitForAll", Opt_ExplicitForAll, const Supported ),
( "MonoLocalBinds", Opt_MonoLocalBinds, const Supported ),
( "RelaxedPolyRec", Opt_RelaxedPolyRec, const Supported ),
( "ExtendedDefaultRules", Opt_ExtendedDefaultRules, const Supported ),
( "ImplicitParams", Opt_ImplicitParams, const Supported ),
( "ScopedTypeVariables", Opt_ScopedTypeVariables, const Supported ),
( "PatternSignatures", Opt_ScopedTypeVariables,
deprecatedForLanguage "ScopedTypeVariables" ),
( "UnboxedTuples", Opt_UnboxedTuples, const Supported ),
( "StandaloneDeriving", Opt_StandaloneDeriving, const Supported ),
( "DeriveDataTypeable", Opt_DeriveDataTypeable, const Supported ),
( "DeriveFunctor", Opt_DeriveFunctor, const Supported ),
( "DeriveTraversable", Opt_DeriveTraversable, const Supported ),
( "DeriveFoldable", Opt_DeriveFoldable, const Supported ),
( "TypeSynonymInstances", Opt_TypeSynonymInstances, const Supported ),
( "FlexibleContexts", Opt_FlexibleContexts, const Supported ),
( "FlexibleInstances", Opt_FlexibleInstances, const Supported ),
( "ConstrainedClassMethods", Opt_ConstrainedClassMethods, const Supported ),
( "MultiParamTypeClasses", Opt_MultiParamTypeClasses, const Supported ),
( "FunctionalDependencies", Opt_FunctionalDependencies, const Supported ),
( "GeneralizedNewtypeDeriving", Opt_GeneralizedNewtypeDeriving, const Supported ),
( "OverlappingInstances", Opt_OverlappingInstances, const Supported ),
( "UndecidableInstances", Opt_UndecidableInstances, const Supported ),
( "IncoherentInstances", Opt_IncoherentInstances, const Supported ),
( "PackageImports", Opt_PackageImports, const Supported ),
( "NewQualifiedOperators", Opt_NewQualifiedOperators, const Supported )
]
impliedFlags :: [(DynFlag, DynFlag)]
impliedFlags
= [ (Opt_RankNTypes, Opt_ExplicitForAll)
, (Opt_Rank2Types, Opt_ExplicitForAll)
, (Opt_ScopedTypeVariables, Opt_ExplicitForAll)
, (Opt_LiberalTypeSynonyms, Opt_ExplicitForAll)
, (Opt_ExistentialQuantification, Opt_ExplicitForAll)
, (Opt_PolymorphicComponents, Opt_ExplicitForAll)
, (Opt_GADTs, Opt_RelaxedPolyRec)
, (Opt_TypeFamilies, Opt_RelaxedPolyRec)
, (Opt_TypeFamilies, Opt_KindSignatures)
, (Opt_ScopedTypeVariables, Opt_RelaxedPolyRec)
, (Opt_ImpredicativeTypes, Opt_RankNTypes)
, (Opt_RecordWildCards, Opt_DisambiguateRecordFields)
]
glasgowExtsFlags :: [DynFlag]
glasgowExtsFlags = [
Opt_PrintExplicitForalls
, Opt_ForeignFunctionInterface
, Opt_UnliftedFFITypes
, Opt_GADTs
, Opt_ImplicitParams
, Opt_ScopedTypeVariables
, Opt_UnboxedTuples
, Opt_TypeSynonymInstances
, Opt_StandaloneDeriving
, Opt_DeriveDataTypeable
, Opt_DeriveFunctor
, Opt_DeriveFoldable
, Opt_DeriveTraversable
, Opt_FlexibleContexts
, Opt_FlexibleInstances
, Opt_ConstrainedClassMethods
, Opt_MultiParamTypeClasses
, Opt_FunctionalDependencies
, Opt_MagicHash
, Opt_PolymorphicComponents
, Opt_ExistentialQuantification
, Opt_UnicodeSyntax
, Opt_PostfixOperators
, Opt_PatternGuards
, Opt_LiberalTypeSynonyms
, Opt_RankNTypes
, Opt_TypeOperators
, Opt_DoRec
, Opt_ParallelListComp
, Opt_EmptyDataDecls
, Opt_KindSignatures
, Opt_GeneralizedNewtypeDeriving
, Opt_TypeFamilies ]
parseDynamicFlags :: Monad m =>
DynFlags -> [Located String]
-> m (DynFlags, [Located String], [Located String])
parseDynamicFlags dflags args = parseDynamicFlags_ dflags args True
parseDynamicNoPackageFlags :: Monad m =>
DynFlags -> [Located String]
-> m (DynFlags, [Located String], [Located String])
parseDynamicNoPackageFlags dflags args = parseDynamicFlags_ dflags args False
parseDynamicFlags_ :: Monad m =>
DynFlags -> [Located String] -> Bool
-> m (DynFlags, [Located String], [Located String])
parseDynamicFlags_ dflags0 args pkg_flags = do
let f (L p "-optdep" : L _ x : xs) = (L p ("-optdep" ++ x)) : f xs
f (x : xs) = x : f xs
f xs = xs
args' = f args
flag_spec | pkg_flags = package_flags ++ dynamic_flags
| otherwise = dynamic_flags
let ((leftover, errs, warns), dflags1)
= runCmdLine (processArgs flag_spec args') dflags0
when (not (null errs)) $ ghcError $ errorsToGhcException errs
let (pic_warns, dflags2) =
if opt_PIC && hscTarget dflags1 == HscC && cGhcUnregisterised == "NO"
then ([L noSrcSpan $ "Warning: -fvia-C is incompatible with -fPIC; ignoring -fvia-C"],
dflags1{ hscTarget = HscAsm })
else ([], dflags1)
return (dflags2, leftover, pic_warns ++ warns)
type DynP = CmdLineP DynFlags
upd :: (DynFlags -> DynFlags) -> DynP ()
upd f = do
dfs <- getCmdLineState
putCmdLineState $! (f dfs)
setDynFlag, unSetDynFlag :: DynFlag -> DynP ()
setDynFlag f = do { upd (\dfs -> dopt_set dfs f)
; mapM_ setDynFlag deps }
where
deps = [ d | (f', d) <- impliedFlags, f' == f ]
unSetDynFlag f = upd (\dfs -> dopt_unset dfs f)
setDumpFlag :: DynFlag -> OptKind DynP
setDumpFlag dump_flag
= NoArg (setDynFlag dump_flag >> when want_recomp forceRecompile)
where
want_recomp = dump_flag `notElem` [Opt_D_dump_if_trace,
Opt_D_dump_hi_diffs]
forceRecompile :: DynP ()
forceRecompile = do { dfs <- getCmdLineState
; when (force_recomp dfs) (setDynFlag Opt_ForceRecomp) }
where
force_recomp dfs = isOneShot (ghcMode dfs)
setVerboseCore2Core :: DynP ()
setVerboseCore2Core = do setDynFlag Opt_D_verbose_core2core
forceRecompile
upd (\s -> s { shouldDumpSimplPhase = const True })
setDumpSimplPhases :: String -> DynP ()
setDumpSimplPhases s = do forceRecompile
upd (\s -> s { shouldDumpSimplPhase = spec })
where
spec :: SimplifierMode -> Bool
spec = join (||)
. map (join (&&) . map match . split ':')
. split ','
$ case s of
'=' : s' -> s'
_ -> s
join :: (Bool -> Bool -> Bool)
-> [SimplifierMode -> Bool]
-> SimplifierMode -> Bool
join _ [] = const True
join op ss = foldr1 (\f g x -> f x `op` g x) ss
match :: String -> SimplifierMode -> Bool
match "" = const True
match s = case reads s of
[(n,"")] -> phase_num n
_ -> phase_name s
phase_num :: Int -> SimplifierMode -> Bool
phase_num n (SimplPhase k _) = n == k
phase_num _ _ = False
phase_name :: String -> SimplifierMode -> Bool
phase_name s SimplGently = s == "gentle"
phase_name s (SimplPhase _ ss) = s `elem` ss
setVerbosity :: Maybe Int -> DynP ()
setVerbosity mb_n = upd (\dfs -> dfs{ verbosity = mb_n `orElse` 3 })
addCmdlineHCInclude :: String -> DynP ()
addCmdlineHCInclude a = upd (\s -> s{cmdlineHcIncludes = a : cmdlineHcIncludes s})
extraPkgConf_ :: FilePath -> DynP ()
extraPkgConf_ p = upd (\s -> s{ extraPkgConfs = p : extraPkgConfs s })
exposePackage, exposePackageId, hidePackage, ignorePackage :: String -> DynP ()
exposePackage p =
upd (\s -> s{ packageFlags = ExposePackage p : packageFlags s })
exposePackageId p =
upd (\s -> s{ packageFlags = ExposePackageId p : packageFlags s })
hidePackage p =
upd (\s -> s{ packageFlags = HidePackage p : packageFlags s })
ignorePackage p =
upd (\s -> s{ packageFlags = IgnorePackage p : packageFlags s })
setPackageName :: String -> DynFlags -> DynFlags
setPackageName p s = s{ thisPackage = stringToPackageId p }
setTarget :: HscTarget -> DynP ()
setTarget l = upd set
where
set dfs
| ghcLink dfs /= LinkBinary || isObjectTarget l = dfs{ hscTarget = l }
| otherwise = dfs
setObjTarget :: HscTarget -> DynP ()
setObjTarget l = upd set
where
set dfs
| isObjectTarget (hscTarget dfs) = dfs { hscTarget = l }
| otherwise = dfs
setOptLevel :: Int -> DynFlags -> DynFlags
setOptLevel n dflags
| hscTarget dflags == HscInterpreted && n > 0
= dflags
| otherwise
= updOptLevel n dflags
setDPHOpt :: DynFlags -> DynFlags
setDPHOpt dflags = setOptLevel 2 (dflags { maxSimplIterations = 20
, simplPhases = 3
, specConstrThreshold = Nothing
, specConstrCount = Nothing
})
`dopt_set` Opt_DictsCheap
`dopt_unset` Opt_MethodSharing
`dopt_set` Opt_InlineIfEnoughArgs
data DPHBackend = DPHPar
| DPHSeq
| DPHThis
deriving(Eq, Ord, Enum, Show)
setDPHBackend :: DPHBackend -> DynP ()
setDPHBackend backend
= do
upd $ \dflags -> dflags { dphBackend = backend }
mapM_ exposePackage (dph_packages backend)
where
dph_packages DPHThis = []
dph_packages DPHPar = ["dph-prim-par", "dph-par"]
dph_packages DPHSeq = ["dph-prim-seq", "dph-seq"]
dphPackage :: DynFlags -> PackageId
dphPackage dflags = case dphBackend dflags of
DPHPar -> dphParPackageId
DPHSeq -> dphSeqPackageId
DPHThis -> thisPackage dflags
setMainIs :: String -> DynP ()
setMainIs arg
| not (null main_fn) && isLower (head main_fn)
= upd $ \d -> d{ mainFunIs = Just main_fn,
mainModIs = mkModule mainPackageId (mkModuleName main_mod) }
| isUpper (head arg)
= upd $ \d -> d{ mainModIs = mkModule mainPackageId (mkModuleName arg) }
| otherwise
= upd $ \d -> d{ mainFunIs = Just arg }
where
(main_mod, main_fn) = splitLongestPrefix arg (== '.')
addImportPath, addLibraryPath, addIncludePath, addFrameworkPath :: FilePath -> DynP ()
addImportPath "" = upd (\s -> s{importPaths = []})
addImportPath p = upd (\s -> s{importPaths = importPaths s ++ splitPathList p})
addLibraryPath p =
upd (\s -> s{libraryPaths = libraryPaths s ++ splitPathList p})
addIncludePath p =
upd (\s -> s{includePaths = includePaths s ++ splitPathList p})
addFrameworkPath p =
upd (\s -> s{frameworkPaths = frameworkPaths s ++ splitPathList p})
#ifndef mingw32_TARGET_OS
split_marker :: Char
split_marker = ':'
#endif
splitPathList :: String -> [String]
splitPathList s = filter notNull (splitUp s)
where
#ifndef mingw32_TARGET_OS
splitUp xs = split split_marker xs
#else
splitUp [] = []
splitUp (x:':':div:xs) | div `elem` dir_markers
= ((x:':':div:p): splitUp rs)
where
(p,rs) = findNextPath xs
splitUp xs = cons p (splitUp rs)
where
(p,rs) = findNextPath xs
cons "" xs = xs
cons x xs = x:xs
findNextPath xs =
case break (`elem` split_markers) xs of
(p, _:ds) -> (p, ds)
(p, xs) -> (p, xs)
split_markers :: [Char]
split_markers = [':', ';']
dir_markers :: [Char]
dir_markers = ['/', '\\']
#endif
setTmpDir :: FilePath -> DynFlags -> DynFlags
setTmpDir dir dflags = dflags{ tmpDir = normalise dir }
setOptHpcDir :: String -> DynP ()
setOptHpcDir arg = upd $ \ d -> d{hpcDir = arg}
machdepCCOpts :: DynFlags -> ([String],
[String])
machdepCCOpts _dflags
#if alpha_TARGET_ARCH
= ( ["-w", "-mieee"
#ifdef HAVE_THREADED_RTS_SUPPORT
, "-D_REENTRANT"
#endif
], [] )
#elif hppa_TARGET_ARCH
= ( ["-D_HPUX_SOURCE"], [] )
#elif m68k_TARGET_ARCH
= ( [], ["-fno-defer-pop", "-fno-omit-frame-pointer"] )
#elif i386_TARGET_ARCH
= let n_regs = stolen_x86_regs _dflags
in
(
#if darwin_TARGET_OS
["-march=i686", "-m32"],
#else
[ if opt_Static then "-DDONT_WANT_WIN32_DLL_SUPPORT" else ""
],
#endif
[ "-fno-defer-pop",
"-fomit-frame-pointer",
"-fno-builtin",
"-DSTOLEN_X86_REGS="++show n_regs ]
)
#elif ia64_TARGET_ARCH
= ( [], ["-fomit-frame-pointer", "-G0"] )
#elif x86_64_TARGET_ARCH
= (
#if darwin_TARGET_OS
["-m64"],
#else
[],
#endif
["-fomit-frame-pointer",
"-fno-asynchronous-unwind-tables",
"-fno-builtin"
] )
#elif sparc_TARGET_ARCH
= ( [], ["-w"] )
#elif powerpc_apple_darwin_TARGET
= ( [], ["-no-cpp-precomp"] )
#else
= ( [], [] )
#endif
picCCOpts :: DynFlags -> [String]
picCCOpts _dflags
#if darwin_TARGET_OS
| opt_PIC
= ["-fno-common", "-U __PIC__","-D__PIC__"]
| otherwise
= ["-mdynamic-no-pic"]
#elif mingw32_TARGET_OS
| opt_PIC
= ["-U __PIC__","-D__PIC__"]
| otherwise
= []
#else
| opt_PIC || not opt_Static
= ["-fPIC", "-U __PIC__", "-D__PIC__"]
| otherwise
= []
#endif
can_split :: Bool
can_split = cSplitObjs == "YES"
data Printable = String String
| FromDynFlags (DynFlags -> String)
compilerInfo :: [(String, Printable)]
compilerInfo = [("Project name", String cProjectName),
("Project version", String cProjectVersion),
("Booter version", String cBooterVersion),
("Stage", String cStage),
("Have interpreter", String cGhcWithInterpreter),
("Object splitting", String cSplitObjs),
("Have native code generator", String cGhcWithNativeCodeGen),
("Support SMP", String cGhcWithSMP),
("Unregisterised", String cGhcUnregisterised),
("Tables next to code", String cGhcEnableTablesNextToCode),
("Win32 DLLs", String cEnableWin32DLLs),
("RTS ways", String cGhcRTSWays),
("Leading underscore", String cLeadingUnderscore),
("Debug on", String (show debugIsOn)),
("LibDir", FromDynFlags topDir)
]