------------------------------------------------------------------------------
---
+-- |
-- Dynamic flags
--
--
-- (c) The University of Glasgow 2005
--
------------------------------------------------------------------------------
--- | Most flags are dynamic flags, which means they can change from
+-- Most flags are dynamic flags, which means they can change from
-- compilation to compilation using @OPTIONS_GHC@ pragmas, and in a
-- multi-session GHC each session can be using different dynamic
-- flags. Dynamic flags can also be set at the prompt in GHCi.
Option(..),
DynLibLoader(..),
fFlags, xFlags,
- DPHBackend(..),
+ dphPackage,
-- ** Manipulating DynFlags
defaultDynFlags, -- DynFlags
| Opt_KeepSFiles
| Opt_KeepRawSFiles
| Opt_KeepTmpFiles
+ | Opt_KeepRawTokenStream
deriving (Eq, Show)
stgToDo :: Maybe [StgToDo], -- similarly
hscTarget :: HscTarget,
hscOutName :: String, -- ^ Name of the output file
- extCoreName :: String, -- ^ Name of the .core output file
+ extCoreName :: String, -- ^ Name of the .hcr output file
verbosity :: Int, -- ^ Verbosity level: see "DynFlags#verbosity_levels"
optLevel :: Int, -- ^ Optimisation level
simplPhases :: Int, -- ^ Number of simplifier phases
dphBackend :: DPHBackend,
- thisPackage :: PackageId,
+ thisPackage :: PackageId, -- ^ name of package currently being compiled
-- ways
wayNames :: [WayName], -- ^ Way flags from the command line
| MkDepend -- ^ @ghc -M@, see "Finder" for why we need this
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
ghcUsagePath = panic "defaultDynFlags: No ghciUsagePath",
ghciUsagePath = panic "defaultDynFlags: No ghciUsagePath",
topDir = panic "defaultDynFlags: No topDir",
- systemPackageConfig = panic "defaultDynFlags: No systemPackageConfig",
+ 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",
, ([2], Opt_LiberateCase)
, ([2], Opt_SpecConstr)
- , ([2], Opt_StaticArgumentTransformation)
+
+-- , ([2], Opt_StaticArgumentTransformation)
+-- Max writes: I think it's probably best not to enable SAT with -O2 for the
+-- 6.10 release. The version of SAT in HEAD at the moment doesn't incorporate
+-- several improvements to the heuristics, and I'm concerned that without
+-- those changes SAT will interfere with some attempts to write "high
+-- performance Haskell", as we saw in some posts on Haskell-Cafe earlier
+-- this year. In particular, the version in HEAD lacks the tail call
+-- criterion, so many things that look like reasonable loops will be
+-- turned into functions with extra (unneccesary) thunk creation.
, ([0,1,2], Opt_DoLambdaEtaExpansion)
-- This one is important for a tiresome reason:
| CoreCSE
| CoreDoRuleCheck Int{-CompilerPhase-} String -- Check for non-application of rules
-- matching this string
- | CoreDoVectorisation DPHBackend
+ | CoreDoVectorisation PackageId
| CoreDoNothing -- Useful when building up
| CoreDoPasses [CoreToDo] -- lists of these things
vectorisation
= runWhen (dopt Opt_Vectorise dflags)
- $ CoreDoPasses [ simpl_gently, CoreDoVectorisation (dphBackend dflags) ]
+ $ CoreDoPasses [ simpl_gently, CoreDoVectorisation (dphPackage dflags) ]
-- By default, we have 2 phases before phase 0.
, Flag "dasm-lint" (NoArg (setDynFlag Opt_DoAsmLinting))
Supported
, Flag "dshow-passes"
- (NoArg (do setDynFlag Opt_ForceRecomp
+ (NoArg (do forceRecompile
setVerbosity (Just 2)))
Supported
, Flag "dfaststring-stats" (NoArg (setDynFlag Opt_D_faststring_stats))
------ DPH flags ----------------------------------------------------
, Flag "fdph-seq"
- (NoArg (upd (setDPHBackend DPHSeq)))
+ (NoArg (setDPHBackend DPHSeq))
Supported
, Flag "fdph-par"
- (NoArg (upd (setDPHBackend DPHPar)))
+ (NoArg (setDPHBackend DPHPar))
+ Supported
+ , Flag "fdph-this"
+ (NoArg (setDPHBackend DPHThis))
Supported
------ Compiler flags -----------------------------------------------
-- -----------------------------------------------------------------------------
-- Parsing the dynamic flags.
-parseDynamicFlags :: DynFlags -> [Located String]
- -> IO (DynFlags, [Located String], [Located String])
+-- | Parse dynamic flags from a list of command line argument. Returns the
+-- the parsed 'DynFlags', the left-over arguments, and a list of warnings.
+-- Throws a 'UsageError' if errors occurred during parsing (such as unknown
+-- flags or missing arguments).
+parseDynamicFlags :: Monad m =>
+ DynFlags -> [Located String]
+ -> m (DynFlags, [Located String], [Located String])
+ -- ^ Updated 'DynFlags', left-over arguments, and
+ -- list of warnings.
parseDynamicFlags dflags args = do
-- XXX Legacy support code
-- We used to accept things like
--------------------------
setDumpFlag :: DynFlag -> OptKind DynP
setDumpFlag dump_flag
- | force_recomp = NoArg (setDynFlag Opt_ForceRecomp >> setDynFlag dump_flag)
- | otherwise = NoArg (setDynFlag dump_flag)
+ = NoArg (setDynFlag dump_flag >> when want_recomp forceRecompile)
where
- -- Whenver we -ddump, switch off the recompilation checker,
- -- else you don't see the dump!
- -- However, certain dumpy-things are really interested in what's going
+ -- Certain dumpy-things are really interested in what's going
-- on during recompilation checking, so in those cases we
-- don't want to turn it off.
- force_recomp = dump_flag `notElem` [Opt_D_dump_if_trace,
- Opt_D_dump_hi_diffs]
+ want_recomp = dump_flag `notElem` [Opt_D_dump_if_trace,
+ Opt_D_dump_hi_diffs]
+
+forceRecompile :: DynP ()
+-- Whenver we -ddump, force recompilation (by switching off the
+-- recompilation checker), else you don't see the dump! However,
+-- don't switch it off in --make mode, else *everything* gets
+-- recompiled which probably isn't what you want
+forceRecompile = do { dfs <- getCmdLineState
+ ; when (force_recomp dfs) (setDynFlag Opt_ForceRecomp) }
+ where
+ force_recomp dfs = isOneShot (ghcMode dfs)
setVerboseCore2Core :: DynP ()
-setVerboseCore2Core = do setDynFlag Opt_ForceRecomp
- setDynFlag Opt_D_verbose_core2core
+setVerboseCore2Core = do setDynFlag Opt_D_verbose_core2core
+ forceRecompile
upd (\s -> s { shouldDumpSimplPhase = const True })
setDumpSimplPhases :: String -> DynP ()
-setDumpSimplPhases s = do setDynFlag Opt_ForceRecomp
+setDumpSimplPhases s = do forceRecompile
upd (\s -> s { shouldDumpSimplPhase = spec })
where
spec :: SimplifierMode -> Bool
-- -fdicts-cheap always inline dictionaries
-- -fmax-simplifier-iterations20 this is necessary sometimes
-- -fno-spec-constr-threshold run SpecConstr even for big loops
+-- -fno-spec-constr-count SpecConstr as much as possible
--
setDPHOpt :: DynFlags -> DynFlags
setDPHOpt dflags = setOptLevel 2 (dflags { maxSimplIterations = 20
, specConstrThreshold = Nothing
+ , specConstrCount = Nothing
})
`dopt_set` Opt_DictsCheap
`dopt_unset` Opt_MethodSharing
data DPHBackend = DPHPar
| DPHSeq
-
-setDPHBackend :: DPHBackend -> DynFlags -> DynFlags
-setDPHBackend backend dflags = dflags { dphBackend = backend }
-
+ | 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