summaryrefslogtreecommitdiff
path: root/compiler/main
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/main')
-rw-r--r--compiler/main/DriverMkDepend.hs2
-rw-r--r--compiler/main/DynFlags.hs98
-rw-r--r--compiler/main/ErrUtils.lhs18
-rw-r--r--compiler/main/HscMain.hs4
-rw-r--r--compiler/main/InteractiveEval.hs2
-rw-r--r--compiler/main/TidyPgm.lhs4
6 files changed, 82 insertions, 46 deletions
diff --git a/compiler/main/DriverMkDepend.hs b/compiler/main/DriverMkDepend.hs
index fecf28362a..953b2c4568 100644
--- a/compiler/main/DriverMkDepend.hs
+++ b/compiler/main/DriverMkDepend.hs
@@ -335,7 +335,7 @@ endMkDependHS dflags
dumpModCycles :: DynFlags -> [ModSummary] -> IO ()
dumpModCycles dflags mod_summaries
- | not (gopt Opt_D_dump_mod_cycles dflags)
+ | not (dopt Opt_D_dump_mod_cycles dflags)
= return ()
| null cycles
diff --git a/compiler/main/DynFlags.hs b/compiler/main/DynFlags.hs
index cdbb08680b..e1e8c5a384 100644
--- a/compiler/main/DynFlags.hs
+++ b/compiler/main/DynFlags.hs
@@ -13,6 +13,7 @@
module DynFlags (
-- * Dynamic flags and associated configuration types
+ DumpFlag(..),
GeneralFlag(..),
WarningFlag(..),
ExtensionFlag(..),
@@ -21,15 +22,10 @@ module DynFlags (
FatalMessager, LogAction, FlushOut(..), FlushErr(..),
ProfAuto(..),
glasgowExtsFlags,
- gopt,
- gopt_set,
- gopt_unset,
- wopt,
- wopt_set,
- wopt_unset,
- xopt,
- xopt_set,
- xopt_unset,
+ dopt,
+ gopt, gopt_set, gopt_unset,
+ wopt, wopt_set, wopt_unset,
+ xopt, xopt_set, xopt_unset,
lang_set,
DynFlags(..),
HasDynFlags(..), ContainsDynFlags(..),
@@ -169,8 +165,7 @@ import qualified Data.IntSet as IntSet
-- -----------------------------------------------------------------------------
-- DynFlags
--- | Enumerates the simple on-or-off dynamic flags
-data GeneralFlag
+data DumpFlag
-- debugging flags
= Opt_D_dump_cmm
@@ -234,15 +229,21 @@ data GeneralFlag
| Opt_D_dump_ticked
| 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_verbose_core2core
+
+ deriving (Eq, Show, Enum)
+
+-- | Enumerates the simple on-or-off dynamic flags
+data GeneralFlag
+
+ = Opt_DumpToFile -- ^ Append dump output to files instead of stdout.
| Opt_D_faststring_stats
- | Opt_DumpToFile -- ^ Append dump output to files instead of stdout.
+ | Opt_D_dump_minimal_imports
| Opt_DoCoreLinting
| Opt_DoStgLinting
| Opt_DoCmmLinting
@@ -639,7 +640,8 @@ data DynFlags = DynFlags {
generatedDumps :: IORef (Set FilePath),
-- hsc dynamic flags
- flags :: IntSet,
+ dumpFlags :: IntSet,
+ generalFlags :: IntSet,
warningFlags :: IntSet,
-- Don't change this without updating extensionFlags:
language :: Maybe Language,
@@ -1194,7 +1196,8 @@ defaultDynFlags mySettings =
filesToNotIntermediateClean = panic "defaultDynFlags: No filesToNotIntermediateClean",
generatedDumps = panic "defaultDynFlags: No generatedDumps",
haddockOptions = Nothing,
- flags = IntSet.fromList (map fromEnum (defaultFlags mySettings)),
+ dumpFlags = IntSet.empty,
+ generalFlags = IntSet.fromList (map fromEnum (defaultFlags mySettings)),
warningFlags = IntSet.fromList (map fromEnum standardWarnings),
ghciScripts = [],
language = Nothing,
@@ -1343,17 +1346,50 @@ languageExtensions (Just Haskell2010)
Opt_DoAndIfThenElse,
Opt_RelaxedPolyRec]
+-- | Test whether a 'DumpFlag' is set
+dopt :: DumpFlag -> DynFlags -> Bool
+dopt f dflags = (fromEnum f `IntSet.member` dumpFlags dflags)
+ || (verbosity dflags >= 4 && enableIfVerbose f)
+ where enableIfVerbose Opt_D_dump_tc_trace = False
+ enableIfVerbose Opt_D_dump_rn_trace = False
+ enableIfVerbose Opt_D_dump_cs_trace = False
+ enableIfVerbose Opt_D_dump_if_trace = False
+ enableIfVerbose Opt_D_dump_vt_trace = False
+ enableIfVerbose Opt_D_dump_tc = False
+ enableIfVerbose Opt_D_dump_rn = False
+ enableIfVerbose Opt_D_dump_rn_stats = False
+ enableIfVerbose Opt_D_dump_hi_diffs = False
+ enableIfVerbose Opt_D_verbose_core2core = False
+ enableIfVerbose Opt_D_verbose_stg2stg = False
+ enableIfVerbose Opt_D_dump_splices = False
+ enableIfVerbose Opt_D_dump_rule_firings = False
+ enableIfVerbose Opt_D_dump_rule_rewrites = False
+ enableIfVerbose Opt_D_dump_rtti = False
+ enableIfVerbose Opt_D_dump_inlinings = False
+ enableIfVerbose Opt_D_dump_core_stats = False
+ enableIfVerbose Opt_D_dump_asm_stats = False
+ enableIfVerbose Opt_D_dump_types = False
+ enableIfVerbose Opt_D_dump_simpl_iterations = False
+ enableIfVerbose Opt_D_dump_ticked = False
+ enableIfVerbose Opt_D_dump_view_pattern_commoning = False
+ enableIfVerbose Opt_D_dump_mod_cycles = False
+ enableIfVerbose _ = True
+
+-- | Set a 'DumpFlag'
+dopt_set :: DynFlags -> DumpFlag -> DynFlags
+dopt_set dfs f = dfs{ dumpFlags = IntSet.insert (fromEnum f) (dumpFlags dfs) }
+
-- | Test whether a 'GeneralFlag' is set
gopt :: GeneralFlag -> DynFlags -> Bool
-gopt f dflags = fromEnum f `IntSet.member` flags dflags
+gopt f dflags = fromEnum f `IntSet.member` generalFlags dflags
-- | Set a 'GeneralFlag'
gopt_set :: DynFlags -> GeneralFlag -> DynFlags
-gopt_set dfs f = dfs{ flags = IntSet.insert (fromEnum f) (flags dfs) }
+gopt_set dfs f = dfs{ generalFlags = IntSet.insert (fromEnum f) (generalFlags dfs) }
-- | Unset a 'GeneralFlag'
gopt_unset :: DynFlags -> GeneralFlag -> DynFlags
-gopt_unset dfs f = dfs{ flags = IntSet.delete (fromEnum f) (flags dfs) }
+gopt_unset dfs f = dfs{ generalFlags = IntSet.delete (fromEnum f) (generalFlags dfs) }
-- | Test whether a 'WarningFlag' is set
wopt :: WarningFlag -> DynFlags -> Bool
@@ -2013,13 +2049,13 @@ dynamic_flags = [
setVerboseCore2Core))
, Flag "dverbose-stg2stg" (setDumpFlag Opt_D_verbose_stg2stg)
, Flag "ddump-hi" (setDumpFlag Opt_D_dump_hi)
- , Flag "ddump-minimal-imports" (setDumpFlag Opt_D_dump_minimal_imports)
+ , Flag "ddump-minimal-imports" (NoArg (setGeneralFlag Opt_D_dump_minimal_imports))
, Flag "ddump-vect" (setDumpFlag Opt_D_dump_vect)
, Flag "ddump-hpc" (setDumpFlag Opt_D_dump_ticked) -- back compat
, Flag "ddump-ticked" (setDumpFlag Opt_D_dump_ticked)
, Flag "ddump-mod-cycles" (setDumpFlag Opt_D_dump_mod_cycles)
, Flag "ddump-view-pattern-commoning" (setDumpFlag Opt_D_dump_view_pattern_commoning)
- , Flag "ddump-to-file" (setDumpFlag Opt_DumpToFile)
+ , Flag "ddump-to-file" (NoArg (setGeneralFlag Opt_DumpToFile))
, Flag "ddump-hi-diffs" (setDumpFlag Opt_D_dump_hi_diffs)
, Flag "ddump-rtti" (setDumpFlag Opt_D_dump_rtti)
, Flag "dcore-lint" (NoArg (setGeneralFlag Opt_DoCoreLinting))
@@ -2786,7 +2822,7 @@ optIntSuffixM :: (Maybe Int -> DynFlags -> DynP DynFlags)
-> OptKind (CmdLineP DynFlags)
optIntSuffixM fn = OptIntSuffix (\mi -> updM (fn mi))
-setDumpFlag :: GeneralFlag -> OptKind (CmdLineP DynFlags)
+setDumpFlag :: DumpFlag -> OptKind (CmdLineP DynFlags)
setDumpFlag dump_flag = NoArg (setDumpFlag' dump_flag)
--------------------------
@@ -2831,16 +2867,15 @@ alterSettings :: (Settings -> Settings) -> DynFlags -> DynFlags
alterSettings f dflags = dflags { settings = f (settings dflags) }
--------------------------
-setDumpFlag' :: GeneralFlag -> DynP ()
+setDumpFlag' :: DumpFlag -> DynP ()
setDumpFlag' dump_flag
- = do setGeneralFlag dump_flag
+ = do upd (\dfs -> dopt_set dfs dump_flag)
when want_recomp forceRecompile
- where
- -- 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.
- want_recomp = dump_flag `notElem` [Opt_D_dump_if_trace,
- Opt_D_dump_hi_diffs]
+ where -- 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.
+ 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
@@ -2853,8 +2888,7 @@ forceRecompile = do dfs <- liftEwM getCmdLineState
force_recomp dfs = isOneShot (ghcMode dfs)
setVerboseCore2Core :: DynP ()
-setVerboseCore2Core = do forceRecompile
- setGeneralFlag Opt_D_verbose_core2core
+setVerboseCore2Core = do setDumpFlag' Opt_D_verbose_core2core
upd (\dfs -> dfs { shouldDumpSimplPhase = Nothing })
setDumpSimplPhases :: String -> DynP ()
diff --git a/compiler/main/ErrUtils.lhs b/compiler/main/ErrUtils.lhs
index 7b1f55fb11..776382ecc3 100644
--- a/compiler/main/ErrUtils.lhs
+++ b/compiler/main/ErrUtils.lhs
@@ -206,9 +206,9 @@ dumpIfSet dflags flag hdr doc
| not flag = return ()
| otherwise = log_action dflags dflags SevDump noSrcSpan defaultDumpStyle (mkDumpDoc hdr doc)
-dumpIfSet_dyn :: DynFlags -> GeneralFlag -> String -> SDoc -> IO ()
+dumpIfSet_dyn :: DynFlags -> DumpFlag -> String -> SDoc -> IO ()
dumpIfSet_dyn dflags flag hdr doc
- | gopt flag dflags || verbosity dflags >= 4
+ | dopt flag dflags
= dumpSDoc dflags flag hdr doc
| otherwise
= return ()
@@ -229,7 +229,7 @@ mkDumpDoc hdr doc
--
-- When hdr is empty, we print in a more compact format (no separators and
-- blank lines)
-dumpSDoc :: DynFlags -> GeneralFlag -> String -> SDoc -> IO ()
+dumpSDoc :: DynFlags -> DumpFlag -> String -> SDoc -> IO ()
dumpSDoc dflags flag hdr doc
= do let mFile = chooseDumpFile dflags flag
case mFile of
@@ -263,7 +263,7 @@ dumpSDoc dflags flag hdr doc
-- | Choose where to put a dump file based on DynFlags
--
-chooseDumpFile :: DynFlags -> GeneralFlag -> Maybe String
+chooseDumpFile :: DynFlags -> DumpFlag -> Maybe String
chooseDumpFile dflags flag
| gopt Opt_DumpToFile dflags
@@ -289,11 +289,13 @@ chooseDumpFile dflags flag
Nothing -> f
-- | Build a nice file name from name of a GeneralFlag constructor
-beautifyDumpName :: GeneralFlag -> String
+beautifyDumpName :: DumpFlag -> String
beautifyDumpName flag
- = let str = show flag
- cut = if isPrefixOf "Opt_D_" str then drop 6 str else str
- dash = map (\c -> if c == '_' then '-' else c) cut
+ = let str = show flag
+ suff = case stripPrefix "Opt_D_" str of
+ Just x -> x
+ Nothing -> panic ("Bad flag name: " ++ str)
+ dash = map (\c -> if c == '_' then '-' else c) suff
in dash
diff --git a/compiler/main/HscMain.hs b/compiler/main/HscMain.hs
index d9949db1e4..ab48d35bf4 100644
--- a/compiler/main/HscMain.hs
+++ b/compiler/main/HscMain.hs
@@ -1779,8 +1779,8 @@ dumpIfaceStats hsc_env = do
(ifaceStats eps)
where
dflags = hsc_dflags hsc_env
- dump_rn_stats = gopt Opt_D_dump_rn_stats dflags
- dump_if_trace = gopt Opt_D_dump_if_trace dflags
+ dump_rn_stats = dopt Opt_D_dump_rn_stats dflags
+ dump_if_trace = dopt Opt_D_dump_if_trace dflags
{- **********************************************************************
diff --git a/compiler/main/InteractiveEval.hs b/compiler/main/InteractiveEval.hs
index 3f184d6278..64b2d3303c 100644
--- a/compiler/main/InteractiveEval.hs
+++ b/compiler/main/InteractiveEval.hs
@@ -706,7 +706,7 @@ rttiEnvironment hsc_env@HscEnv{hsc_IC=ic} = do
++ "improvement for a type")) hsc_env
Just subst -> do
let dflags = hsc_dflags hsc_env
- when (gopt Opt_D_dump_rtti dflags) $
+ when (dopt Opt_D_dump_rtti dflags) $
printInfoForUser dflags alwaysQualify $
fsep [text "RTTI Improvement for", ppr id, equals, ppr subst]
diff --git a/compiler/main/TidyPgm.lhs b/compiler/main/TidyPgm.lhs
index e2010645b2..64a9058e0c 100644
--- a/compiler/main/TidyPgm.lhs
+++ b/compiler/main/TidyPgm.lhs
@@ -373,14 +373,14 @@ tidyProgram hsc_env (ModGuts { mg_module = mod
-- If the endPass didn't print the rules, but ddump-rules is
-- on, print now
- ; unless (gopt Opt_D_dump_simpl dflags) $
+ ; unless (dopt Opt_D_dump_simpl dflags) $
Err.dumpIfSet_dyn dflags Opt_D_dump_rules
(showSDoc dflags (ppr CoreTidy <+> ptext (sLit "rules")))
(pprRulesForUser tidy_rules)
-- Print one-line size info
; let cs = coreBindsStats tidy_binds
- ; when (gopt Opt_D_dump_core_stats dflags)
+ ; when (dopt Opt_D_dump_core_stats dflags)
(log_action dflags dflags SevDump noSrcSpan defaultDumpStyle
(ptext (sLit "Tidy size (terms,types,coercions)")
<+> ppr (moduleName mod) <> colon