Add a -fbuilding-cabal-package flag
[ghc-hetmet.git] / compiler / main / DynFlags.hs
1 -- |
2 -- Dynamic flags
3 --
4 --
5 -- (c) The University of Glasgow 2005
6 --
7
8 -- Most flags are dynamic flags, which means they can change from
9 -- compilation to compilation using @OPTIONS_GHC@ pragmas, and in a
10 -- multi-session GHC each session can be using different dynamic
11 -- flags.  Dynamic flags can also be set at the prompt in GHCi.
12 module DynFlags (
13         -- * Dynamic flags and associated configuration types
14         DynFlag(..),
15         DynFlags(..),
16         HscTarget(..), isObjectTarget, defaultObjectTarget,
17         GhcMode(..), isOneShot,
18         GhcLink(..), isNoLink,
19         PackageFlag(..),
20         Option(..), showOpt,
21         DynLibLoader(..),
22         fFlags, xFlags,
23         dphPackage,
24
25         -- ** Manipulating DynFlags
26         defaultDynFlags,                -- DynFlags
27         initDynFlags,                   -- DynFlags -> IO DynFlags
28
29         dopt,                           -- DynFlag -> DynFlags -> Bool
30         dopt_set, dopt_unset,           -- DynFlags -> DynFlag -> DynFlags
31         getOpts,                        -- DynFlags -> (DynFlags -> [a]) -> [a]
32         getVerbFlag,
33         updOptLevel,
34         setTmpDir,
35         setPackageName,
36         doingTickyProfiling,
37
38         -- ** Parsing DynFlags
39         parseDynamicFlags,
40         parseDynamicNoPackageFlags,
41         allFlags,
42
43         supportedLanguages, languageOptions,
44
45         -- ** DynFlag C compiler options
46         machdepCCOpts, picCCOpts,
47
48         -- * Configuration of the core-to-core passes
49         CoreToDo(..),
50         SimplifierMode(..),
51         SimplifierSwitch(..),
52         FloatOutSwitches(..),
53         getCoreToDo,
54
55         -- * Configuration of the stg-to-stg passes
56         StgToDo(..),
57         getStgToDo,
58
59         -- * Compiler configuration suitable for display to the user
60         Printable(..),
61         compilerInfo
62   ) where
63
64 #include "HsVersions.h"
65
66 #ifndef OMIT_NATIVE_CODEGEN
67 import Platform
68 #endif
69 import Module
70 import PackageConfig
71 import PrelNames        ( mAIN )
72 #if defined(i386_TARGET_ARCH) || (!defined(mingw32_TARGET_OS) && !defined(darwin_TARGET_OS))
73 import StaticFlags      ( opt_Static )
74 #endif
75 import StaticFlags      ( opt_PIC, WayName(..), v_Ways, v_Build_tag,
76                           v_RTS_Build_tag )
77 import {-# SOURCE #-} Packages (PackageState)
78 import DriverPhases     ( Phase(..), phaseInputExt )
79 import Config
80 import CmdLineParser
81 import Constants        ( mAX_CONTEXT_REDUCTION_DEPTH )
82 import Panic
83 import UniqFM           ( UniqFM )
84 import Util
85 import Maybes           ( orElse )
86 import SrcLoc
87 import FastString
88 import FiniteMap
89 import Outputable
90 import {-# SOURCE #-} ErrUtils ( Severity(..), Message, mkLocMessage )
91
92 import Data.IORef
93 import Control.Monad    ( when )
94
95 import Data.Char
96 import Data.List
97 import System.FilePath
98 import System.IO        ( stderr, hPutChar )
99
100 -- -----------------------------------------------------------------------------
101 -- DynFlags
102
103 -- | Enumerates the simple on-or-off dynamic flags
104 data DynFlag
105
106    -- debugging flags
107    = Opt_D_dump_cmm
108    | Opt_D_dump_cmmz
109    | Opt_D_dump_cmmz_pretty
110    | Opt_D_dump_cps_cmm
111    | Opt_D_dump_cvt_cmm
112    | Opt_D_dump_asm
113    | Opt_D_dump_asm_native
114    | Opt_D_dump_asm_liveness
115    | Opt_D_dump_asm_coalesce
116    | Opt_D_dump_asm_regalloc
117    | Opt_D_dump_asm_regalloc_stages
118    | Opt_D_dump_asm_conflicts
119    | Opt_D_dump_asm_stats
120    | Opt_D_dump_asm_expanded
121    | Opt_D_dump_cpranal
122    | Opt_D_dump_deriv
123    | Opt_D_dump_ds
124    | Opt_D_dump_flatC
125    | Opt_D_dump_foreign
126    | Opt_D_dump_inlinings
127    | Opt_D_dump_rule_firings
128    | Opt_D_dump_occur_anal
129    | Opt_D_dump_parsed
130    | Opt_D_dump_rn
131    | Opt_D_dump_simpl
132    | Opt_D_dump_simpl_iterations
133    | Opt_D_dump_simpl_phases
134    | Opt_D_dump_spec
135    | Opt_D_dump_prep
136    | Opt_D_dump_stg
137    | Opt_D_dump_stranal
138    | Opt_D_dump_tc
139    | Opt_D_dump_types
140    | Opt_D_dump_rules
141    | Opt_D_dump_cse
142    | Opt_D_dump_worker_wrapper
143    | Opt_D_dump_rn_trace
144    | Opt_D_dump_rn_stats
145    | Opt_D_dump_opt_cmm
146    | Opt_D_dump_simpl_stats
147    | Opt_D_dump_tc_trace
148    | Opt_D_dump_if_trace
149    | Opt_D_dump_splices
150    | Opt_D_dump_BCOs
151    | Opt_D_dump_vect
152    | Opt_D_dump_hpc
153    | Opt_D_dump_rtti
154    | Opt_D_source_stats
155    | Opt_D_verbose_core2core
156    | Opt_D_verbose_stg2stg
157    | Opt_D_dump_hi
158    | Opt_D_dump_hi_diffs
159    | Opt_D_dump_minimal_imports
160    | Opt_D_dump_mod_cycles
161    | Opt_D_dump_view_pattern_commoning
162    | Opt_D_faststring_stats
163    | Opt_DumpToFile                     -- ^ Append dump output to files instead of stdout.
164    | Opt_D_no_debug_output
165    | Opt_DoCoreLinting
166    | Opt_DoStgLinting
167    | Opt_DoCmmLinting
168    | Opt_DoAsmLinting
169
170    | Opt_WarnIsError                    -- -Werror; makes warnings fatal
171    | Opt_WarnDuplicateExports
172    | Opt_WarnHiShadows
173    | Opt_WarnImplicitPrelude
174    | Opt_WarnIncompletePatterns
175    | Opt_WarnIncompletePatternsRecUpd
176    | Opt_WarnMissingFields
177    | Opt_WarnMissingMethods
178    | Opt_WarnMissingSigs
179    | Opt_WarnNameShadowing
180    | Opt_WarnOverlappingPatterns
181    | Opt_WarnSimplePatterns
182    | Opt_WarnTypeDefaults
183    | Opt_WarnMonomorphism
184    | Opt_WarnUnusedBinds
185    | Opt_WarnUnusedImports
186    | Opt_WarnUnusedMatches
187    | Opt_WarnWarningsDeprecations
188    | Opt_WarnDeprecatedFlags
189    | Opt_WarnDodgyExports
190    | Opt_WarnDodgyImports
191    | Opt_WarnOrphans
192    | Opt_WarnTabs
193    | Opt_WarnUnrecognisedPragmas
194    | Opt_WarnDodgyForeignImports
195    | Opt_WarnLazyUnliftedBindings
196    | Opt_WarnUnusedDoBind
197    | Opt_WarnWrongDoBind
198
199
200    -- language opts
201    | Opt_OverlappingInstances
202    | Opt_UndecidableInstances
203    | Opt_IncoherentInstances
204    | Opt_MonomorphismRestriction
205    | Opt_MonoPatBinds
206    | Opt_MonoLocalBinds
207    | Opt_ExtendedDefaultRules           -- Use GHC's extended rules for defaulting
208    | Opt_ForeignFunctionInterface
209    | Opt_UnliftedFFITypes
210    | Opt_GHCForeignImportPrim
211    | Opt_PArr                           -- Syntactic support for parallel arrays
212    | Opt_Arrows                         -- Arrow-notation syntax
213    | Opt_TemplateHaskell
214    | Opt_QuasiQuotes
215    | Opt_ImplicitParams
216    | Opt_Generics                       -- "Derivable type classes"
217    | Opt_ImplicitPrelude
218    | Opt_ScopedTypeVariables
219    | Opt_UnboxedTuples
220    | Opt_BangPatterns
221    | Opt_TypeFamilies
222    | Opt_OverloadedStrings
223    | Opt_DisambiguateRecordFields
224    | Opt_RecordWildCards
225    | Opt_RecordPuns
226    | Opt_ViewPatterns
227    | Opt_GADTs
228    | Opt_RelaxedPolyRec
229    | Opt_NPlusKPatterns
230
231    | Opt_StandaloneDeriving
232    | Opt_DeriveDataTypeable
233    | Opt_DeriveFunctor
234    | Opt_DeriveTraversable
235    | Opt_DeriveFoldable
236
237    | Opt_TypeSynonymInstances
238    | Opt_FlexibleContexts
239    | Opt_FlexibleInstances
240    | Opt_ConstrainedClassMethods
241    | Opt_MultiParamTypeClasses
242    | Opt_FunctionalDependencies
243    | Opt_UnicodeSyntax
244    | Opt_PolymorphicComponents
245    | Opt_ExistentialQuantification
246    | Opt_MagicHash
247    | Opt_EmptyDataDecls
248    | Opt_KindSignatures
249    | Opt_ParallelListComp
250    | Opt_TransformListComp
251    | Opt_GeneralizedNewtypeDeriving
252    | Opt_RecursiveDo
253    | Opt_PostfixOperators
254    | Opt_TupleSections
255    | Opt_PatternGuards
256    | Opt_LiberalTypeSynonyms
257    | Opt_Rank2Types
258    | Opt_RankNTypes
259    | Opt_ImpredicativeTypes
260    | Opt_TypeOperators
261    | Opt_PackageImports
262    | Opt_NewQualifiedOperators
263
264    | Opt_PrintExplicitForalls
265
266    -- optimisation opts
267    | Opt_Strictness
268    | Opt_FullLaziness
269    | Opt_StaticArgumentTransformation
270    | Opt_CSE
271    | Opt_LiberateCase
272    | Opt_SpecConstr
273    | Opt_IgnoreInterfacePragmas
274    | Opt_OmitInterfacePragmas
275    | Opt_DoLambdaEtaExpansion
276    | Opt_IgnoreAsserts
277    | Opt_DoEtaReduction
278    | Opt_CaseMerge
279    | Opt_UnboxStrictFields
280    | Opt_MethodSharing
281    | Opt_DictsCheap
282    | Opt_InlineIfEnoughArgs
283    | Opt_EnableRewriteRules             -- Apply rewrite rules during simplification
284    | Opt_Vectorise
285    | Opt_RegsGraph                      -- do graph coloring register allocation
286    | Opt_RegsIterative                  -- do iterative coalescing graph coloring register allocation
287
288    -- profiling opts
289    | Opt_AutoSccsOnAllToplevs
290    | Opt_AutoSccsOnExportedToplevs
291    | Opt_AutoSccsOnIndividualCafs
292
293    -- misc opts
294    | Opt_Cpp
295    | Opt_Pp
296    | Opt_ForceRecomp
297    | Opt_DryRun
298    | Opt_DoAsmMangling
299    | Opt_ExcessPrecision
300    | Opt_EagerBlackHoling
301    | Opt_ReadUserPackageConf
302    | Opt_NoHsMain
303    | Opt_SplitObjs
304    | Opt_StgStats
305    | Opt_HideAllPackages
306    | Opt_PrintBindResult
307    | Opt_Haddock
308    | Opt_HaddockOptions
309    | Opt_Hpc_No_Auto
310    | Opt_BreakOnException
311    | Opt_BreakOnError
312    | Opt_PrintEvldWithShow
313    | Opt_PrintBindContents
314    | Opt_GenManifest
315    | Opt_EmbedManifest
316    | Opt_EmitExternalCore
317    | Opt_SharedImplib
318    | Opt_BuildingCabalPackage
319
320         -- temporary flags
321    | Opt_RunCPS
322    | Opt_RunCPSZ
323    | Opt_ConvertToZipCfgAndBack
324    | Opt_AutoLinkPackages
325    | Opt_ImplicitImportQualified
326    | Opt_TryNewCodeGen
327
328    -- keeping stuff
329    | Opt_KeepHiDiffs
330    | Opt_KeepHcFiles
331    | Opt_KeepSFiles
332    | Opt_KeepRawSFiles
333    | Opt_KeepTmpFiles
334    | Opt_KeepRawTokenStream
335
336    deriving (Eq, Show)
337
338 -- | Contains not only a collection of 'DynFlag's but also a plethora of
339 -- information relating to the compilation of a single file or GHC session
340 data DynFlags = DynFlags {
341   ghcMode               :: GhcMode,
342   ghcLink               :: GhcLink,
343   coreToDo              :: Maybe [CoreToDo], -- reserved for -Ofile
344   stgToDo               :: Maybe [StgToDo],  -- similarly
345   hscTarget             :: HscTarget,
346   hscOutName            :: String,      -- ^ Name of the output file
347   extCoreName           :: String,      -- ^ Name of the .hcr output file
348   verbosity             :: Int,         -- ^ Verbosity level: see "DynFlags#verbosity_levels"
349   optLevel              :: Int,         -- ^ Optimisation level
350   simplPhases           :: Int,         -- ^ Number of simplifier phases
351   maxSimplIterations    :: Int,         -- ^ Max simplifier iterations
352   shouldDumpSimplPhase  :: SimplifierMode -> Bool,
353   ruleCheck             :: Maybe String,
354
355   specConstrThreshold   :: Maybe Int,   -- ^ Threshold for SpecConstr
356   specConstrCount       :: Maybe Int,   -- ^ Max number of specialisations for any one function
357   liberateCaseThreshold :: Maybe Int,   -- ^ Threshold for LiberateCase
358
359 #ifndef OMIT_NATIVE_CODEGEN
360   targetPlatform        :: Platform,    -- ^ The platform we're compiling for. Used by the NCG.
361 #endif
362   stolen_x86_regs       :: Int,
363   cmdlineHcIncludes     :: [String],    -- ^ @\-\#includes@
364   importPaths           :: [FilePath],
365   mainModIs             :: Module,
366   mainFunIs             :: Maybe String,
367   ctxtStkDepth          :: Int,         -- ^ Typechecker context stack depth
368
369   dphBackend            :: DPHBackend,
370
371   thisPackage           :: PackageId,   -- ^ name of package currently being compiled
372
373   -- ways
374   wayNames              :: [WayName],   -- ^ Way flags from the command line
375   buildTag              :: String,      -- ^ The global \"way\" (e.g. \"p\" for prof)
376   rtsBuildTag           :: String,      -- ^ The RTS \"way\"
377
378   -- For object splitting
379   splitInfo             :: Maybe (String,Int),
380
381   -- paths etc.
382   objectDir             :: Maybe String,
383   hiDir                 :: Maybe String,
384   stubDir               :: Maybe String,
385
386   objectSuf             :: String,
387   hcSuf                 :: String,
388   hiSuf                 :: String,
389
390   outputFile            :: Maybe String,
391   outputHi              :: Maybe String,
392   dynLibLoader          :: DynLibLoader,
393
394   -- | This is set by 'DriverPipeline.runPipeline' based on where
395   --    its output is going.
396   dumpPrefix            :: Maybe FilePath,
397
398   -- | Override the 'dumpPrefix' set by 'DriverPipeline.runPipeline'.
399   --    Set by @-ddump-file-prefix@
400   dumpPrefixForce       :: Maybe FilePath,
401
402   includePaths          :: [String],
403   libraryPaths          :: [String],
404   frameworkPaths        :: [String],    -- used on darwin only
405   cmdlineFrameworks     :: [String],    -- ditto
406   tmpDir                :: String,      -- no trailing '/'
407
408   ghcUsagePath          :: FilePath,    -- Filled in by SysTools
409   ghciUsagePath         :: FilePath,    -- ditto
410
411   hpcDir                :: String,      -- ^ Path to store the .mix files
412
413   -- options for particular phases
414   opt_L                 :: [String],
415   opt_P                 :: [String],
416   opt_F                 :: [String],
417   opt_c                 :: [String],
418   opt_m                 :: [String],
419   opt_a                 :: [String],
420   opt_l                 :: [String],
421   opt_windres           :: [String],
422
423   -- commands for particular phases
424   pgm_L                 :: String,
425   pgm_P                 :: (String,[Option]),
426   pgm_F                 :: String,
427   pgm_c                 :: (String,[Option]),
428   pgm_m                 :: (String,[Option]),
429   pgm_s                 :: (String,[Option]),
430   pgm_a                 :: (String,[Option]),
431   pgm_l                 :: (String,[Option]),
432   pgm_dll               :: (String,[Option]),
433   pgm_T                 :: String,
434   pgm_sysman            :: String,
435   pgm_windres           :: String,
436
437   --  For ghc -M
438   depMakefile           :: FilePath,
439   depIncludePkgDeps     :: Bool,
440   depExcludeMods        :: [ModuleName],
441   depSuffixes           :: [String],
442
443   --  Package flags
444   extraPkgConfs         :: [FilePath],
445   topDir                :: FilePath,    -- filled in by SysTools
446   systemPackageConfig   :: FilePath,    -- ditto
447         -- ^ The @-package-conf@ flags given on the command line, in the order
448         -- they appeared.
449
450   packageFlags          :: [PackageFlag],
451         -- ^ The @-package@ and @-hide-package@ flags from the command-line
452
453   -- Package state
454   -- NB. do not modify this field, it is calculated by
455   -- Packages.initPackages and Packages.updatePackages.
456   pkgDatabase           :: Maybe (UniqFM PackageConfig),
457   pkgState              :: PackageState,
458
459   -- Temporary files
460   -- These have to be IORefs, because the defaultCleanupHandler needs to
461   -- know what to clean when an exception happens
462   filesToClean          :: IORef [FilePath],
463   dirsToClean           :: IORef (FiniteMap FilePath FilePath),
464
465   -- hsc dynamic flags
466   flags                 :: [DynFlag],
467
468   -- | Message output action: use "ErrUtils" instead of this if you can
469   log_action            :: Severity -> SrcSpan -> PprStyle -> Message -> IO (),
470
471   haddockOptions :: Maybe String
472  }
473
474 -- | The target code type of the compilation (if any).
475 --
476 -- Whenever you change the target, also make sure to set 'ghcLink' to
477 -- something sensible.
478 --
479 -- 'HscNothing' can be used to avoid generating any output, however, note
480 -- that:
481 --
482 --  * This will not run the desugaring step, thus no warnings generated in
483 --    this step will be output.  In particular, this includes warnings related
484 --    to pattern matching.  You can run the desugarer manually using
485 --    'GHC.desugarModule'.
486 --
487 --  * If a program uses Template Haskell the typechecker may try to run code
488 --    from an imported module.  This will fail if no code has been generated
489 --    for this module.  You can use 'GHC.needsTemplateHaskell' to detect
490 --    whether this might be the case and choose to either switch to a
491 --    different target or avoid typechecking such modules.  (The latter may
492 --    preferable for security reasons.)
493 --
494 data HscTarget
495   = HscC           -- ^ Generate C code.
496   | HscAsm         -- ^ Generate assembly using the native code generator.
497   | HscJava        -- ^ Generate Java bytecode.
498   | HscInterpreted -- ^ Generate bytecode.  (Requires 'LinkInMemory')
499   | HscNothing     -- ^ Don't generate any code.  See notes above.
500   deriving (Eq, Show)
501
502 -- | Will this target result in an object file on the disk?
503 isObjectTarget :: HscTarget -> Bool
504 isObjectTarget HscC     = True
505 isObjectTarget HscAsm   = True
506 isObjectTarget _        = False
507
508 -- | The 'GhcMode' tells us whether we're doing multi-module
509 -- compilation (controlled via the "GHC" API) or one-shot
510 -- (single-module) compilation.  This makes a difference primarily to
511 -- the "Finder": in one-shot mode we look for interface files for
512 -- imported modules, but in multi-module mode we look for source files
513 -- in order to check whether they need to be recompiled.
514 data GhcMode
515   = CompManager         -- ^ @\-\-make@, GHCi, etc.
516   | OneShot             -- ^ @ghc -c Foo.hs@
517   | MkDepend            -- ^ @ghc -M@, see "Finder" for why we need this
518   deriving Eq
519
520 instance Outputable GhcMode where
521   ppr CompManager = ptext (sLit "CompManager")
522   ppr OneShot     = ptext (sLit "OneShot")
523   ppr MkDepend    = ptext (sLit "MkDepend")
524
525 isOneShot :: GhcMode -> Bool
526 isOneShot OneShot = True
527 isOneShot _other  = False
528
529 -- | What to do in the link step, if there is one.
530 data GhcLink
531   = NoLink              -- ^ Don't link at all
532   | LinkBinary          -- ^ Link object code into a binary
533   | LinkInMemory        -- ^ Use the in-memory dynamic linker (works for both
534                         --   bytecode and object code).
535   | LinkDynLib          -- ^ Link objects into a dynamic lib (DLL on Windows, DSO on ELF platforms)
536   deriving (Eq, Show)
537
538 isNoLink :: GhcLink -> Bool
539 isNoLink NoLink = True
540 isNoLink _      = False
541
542 -- Is it worth evaluating this Bool and caching it in the DynFlags value
543 -- during initDynFlags?
544 doingTickyProfiling :: DynFlags -> Bool
545 doingTickyProfiling dflags = WayTicky `elem` wayNames dflags
546
547 data PackageFlag
548   = ExposePackage  String
549   | HidePackage    String
550   | IgnorePackage  String
551   deriving Eq
552
553 defaultHscTarget :: HscTarget
554 defaultHscTarget = defaultObjectTarget
555
556 -- | The 'HscTarget' value corresponding to the default way to create
557 -- object files on the current platform.
558 defaultObjectTarget :: HscTarget
559 defaultObjectTarget
560   | cGhcWithNativeCodeGen == "YES"      =  HscAsm
561   | otherwise                           =  HscC
562
563 data DynLibLoader
564   = Deployable
565   | Wrapped (Maybe String)
566   | SystemDependent
567   deriving Eq
568
569 -- | Used by 'GHC.newSession' to partially initialize a new 'DynFlags' value
570 initDynFlags :: DynFlags -> IO DynFlags
571 initDynFlags dflags = do
572  -- someday these will be dynamic flags
573  ways <- readIORef v_Ways
574  build_tag <- readIORef v_Build_tag
575  rts_build_tag <- readIORef v_RTS_Build_tag
576  refFilesToClean <- newIORef []
577  refDirsToClean <- newIORef emptyFM
578  return dflags{
579         wayNames        = ways,
580         buildTag        = build_tag,
581         rtsBuildTag     = rts_build_tag,
582         filesToClean    = refFilesToClean,
583         dirsToClean     = refDirsToClean
584         }
585
586 -- | The normal 'DynFlags'. Note that they is not suitable for use in this form
587 -- and must be fully initialized by 'GHC.newSession' first.
588 defaultDynFlags :: DynFlags
589 defaultDynFlags =
590      DynFlags {
591         ghcMode                 = CompManager,
592         ghcLink                 = LinkBinary,
593         coreToDo                = Nothing,
594         stgToDo                 = Nothing,
595         hscTarget               = defaultHscTarget,
596         hscOutName              = "",
597         extCoreName             = "",
598         verbosity               = 0,
599         optLevel                = 0,
600         simplPhases             = 2,
601         maxSimplIterations      = 4,
602         shouldDumpSimplPhase    = const False,
603         ruleCheck               = Nothing,
604         specConstrThreshold     = Just 200,
605         specConstrCount         = Just 3,
606         liberateCaseThreshold   = Just 200,
607 #ifndef OMIT_NATIVE_CODEGEN
608         targetPlatform          = defaultTargetPlatform,
609 #endif
610         stolen_x86_regs         = 4,
611         cmdlineHcIncludes       = [],
612         importPaths             = ["."],
613         mainModIs               = mAIN,
614         mainFunIs               = Nothing,
615         ctxtStkDepth            = mAX_CONTEXT_REDUCTION_DEPTH,
616
617         dphBackend              = DPHPar,
618
619         thisPackage             = mainPackageId,
620
621         objectDir               = Nothing,
622         hiDir                   = Nothing,
623         stubDir                 = Nothing,
624
625         objectSuf               = phaseInputExt StopLn,
626         hcSuf                   = phaseInputExt HCc,
627         hiSuf                   = "hi",
628
629         outputFile              = Nothing,
630         outputHi                = Nothing,
631         dynLibLoader            = SystemDependent,
632         dumpPrefix              = Nothing,
633         dumpPrefixForce         = Nothing,
634         includePaths            = [],
635         libraryPaths            = [],
636         frameworkPaths          = [],
637         cmdlineFrameworks       = [],
638         tmpDir                  = cDEFAULT_TMPDIR,
639
640         hpcDir                  = ".hpc",
641
642         opt_L                   = [],
643         opt_P                   = (if opt_PIC
644                                    then ["-D__PIC__", "-U __PIC__"] -- this list is reversed
645                                    else []),
646         opt_F                   = [],
647         opt_c                   = [],
648         opt_a                   = [],
649         opt_m                   = [],
650         opt_l                   = [],
651         opt_windres             = [],
652
653         extraPkgConfs           = [],
654         packageFlags            = [],
655         pkgDatabase             = Nothing,
656         pkgState                = panic "no package state yet: call GHC.setSessionDynFlags",
657         wayNames                = panic "defaultDynFlags: No wayNames",
658         buildTag                = panic "defaultDynFlags: No buildTag",
659         rtsBuildTag             = panic "defaultDynFlags: No rtsBuildTag",
660         splitInfo               = Nothing,
661         -- initSysTools fills all these in
662         ghcUsagePath            = panic "defaultDynFlags: No ghciUsagePath",
663         ghciUsagePath           = panic "defaultDynFlags: No ghciUsagePath",
664         topDir                  = panic "defaultDynFlags: No topDir",
665         systemPackageConfig     = panic  "no systemPackageConfig: call GHC.setSessionDynFlags",
666         pgm_L                   = panic "defaultDynFlags: No pgm_L",
667         pgm_P                   = panic "defaultDynFlags: No pgm_P",
668         pgm_F                   = panic "defaultDynFlags: No pgm_F",
669         pgm_c                   = panic "defaultDynFlags: No pgm_c",
670         pgm_m                   = panic "defaultDynFlags: No pgm_m",
671         pgm_s                   = panic "defaultDynFlags: No pgm_s",
672         pgm_a                   = panic "defaultDynFlags: No pgm_a",
673         pgm_l                   = panic "defaultDynFlags: No pgm_l",
674         pgm_dll                 = panic "defaultDynFlags: No pgm_dll",
675         pgm_T                   = panic "defaultDynFlags: No pgm_T",
676         pgm_sysman              = panic "defaultDynFlags: No pgm_sysman",
677         pgm_windres             = panic "defaultDynFlags: No pgm_windres",
678         -- end of initSysTools values
679         -- ghc -M values
680         depMakefile       = "Makefile",
681         depIncludePkgDeps = False,
682         depExcludeMods    = [],
683         depSuffixes       = [],
684         -- end of ghc -M values
685         filesToClean   = panic "defaultDynFlags: No filesToClean",
686         dirsToClean    = panic "defaultDynFlags: No dirsToClean",
687         haddockOptions = Nothing,
688         flags = [
689             Opt_AutoLinkPackages,
690             Opt_ReadUserPackageConf,
691
692             Opt_MonoPatBinds,   -- Experimentally, I'm making this non-standard
693                                 -- behaviour the default, to see if anyone notices
694                                 -- SLPJ July 06
695
696             Opt_ImplicitPrelude,
697             Opt_MonomorphismRestriction,
698             Opt_NPlusKPatterns,
699
700             Opt_MethodSharing,
701
702             Opt_DoAsmMangling,
703
704             Opt_SharedImplib,
705
706             Opt_GenManifest,
707             Opt_EmbedManifest,
708             Opt_PrintBindContents
709             ]
710             ++ [f | (ns,f) <- optLevelFlags, 0 `elem` ns]
711                     -- The default -O0 options
712             ++ standardWarnings,
713
714         log_action = \severity srcSpan style msg ->
715                         case severity of
716                           SevInfo  -> printErrs (msg style)
717                           SevFatal -> printErrs (msg style)
718                           _        -> do 
719                                 hPutChar stderr '\n'
720                                 printErrs ((mkLocMessage srcSpan msg) style)
721                      -- careful (#2302): printErrs prints in UTF-8, whereas
722                      -- converting to string first and using hPutStr would
723                      -- just emit the low 8 bits of each unicode char.
724       }
725
726 {-
727     #verbosity_levels#
728     Verbosity levels:
729
730     0   |   print errors & warnings only
731     1   |   minimal verbosity: print "compiling M ... done." for each module.
732     2   |   equivalent to -dshow-passes
733     3   |   equivalent to existing "ghc -v"
734     4   |   "ghc -v -ddump-most"
735     5   |   "ghc -v -ddump-all"
736 -}
737
738 -- | Test whether a 'DynFlag' is set
739 dopt :: DynFlag -> DynFlags -> Bool
740 dopt f dflags  = f `elem` (flags dflags)
741
742 -- | Set a 'DynFlag'
743 dopt_set :: DynFlags -> DynFlag -> DynFlags
744 dopt_set dfs f = dfs{ flags = f : flags dfs }
745
746 -- | Unset a 'DynFlag'
747 dopt_unset :: DynFlags -> DynFlag -> DynFlags
748 dopt_unset dfs f = dfs{ flags = filter (/= f) (flags dfs) }
749
750 -- | Retrieve the options corresponding to a particular @opt_*@ field in the correct order
751 getOpts :: DynFlags             -- ^ 'DynFlags' to retrieve the options from
752         -> (DynFlags -> [a])    -- ^ Relevant record accessor: one of the @opt_*@ accessors
753         -> [a]                  -- ^ Correctly ordered extracted options
754 getOpts dflags opts = reverse (opts dflags)
755         -- We add to the options from the front, so we need to reverse the list
756
757 -- | Gets the verbosity flag for the current verbosity level. This is fed to
758 -- other tools, so GHC-specific verbosity flags like @-ddump-most@ are not included
759 getVerbFlag :: DynFlags -> String
760 getVerbFlag dflags
761   | verbosity dflags >= 3  = "-v"
762   | otherwise =  ""
763
764 setObjectDir, setHiDir, setStubDir, setOutputDir,
765          setObjectSuf, setHiSuf, setHcSuf, parseDynLibLoaderMode,
766          setPgmP, setPgmL, setPgmF, setPgmc, setPgmm, setPgms, setPgma, setPgml, setPgmdll, setPgmwindres,
767          addOptL, addOptP, addOptF, addOptc, addOptm, addOpta, addOptl, addOptwindres,
768          addCmdlineFramework, addHaddockOpts
769    :: String -> DynFlags -> DynFlags
770 setOutputFile, setOutputHi, setDumpPrefixForce
771    :: Maybe String -> DynFlags -> DynFlags
772
773 setObjectDir  f d = d{ objectDir  = Just f}
774 setHiDir      f d = d{ hiDir      = Just f}
775 setStubDir    f d = d{ stubDir    = Just f, includePaths = f : includePaths d }
776   -- -stubdir D adds an implicit -I D, so that gcc can find the _stub.h file
777   -- \#included from the .hc file when compiling with -fvia-C.
778 setOutputDir  f = setObjectDir f . setHiDir f . setStubDir f
779
780 setObjectSuf  f d = d{ objectSuf  = f}
781 setHiSuf      f d = d{ hiSuf      = f}
782 setHcSuf      f d = d{ hcSuf      = f}
783
784 setOutputFile f d = d{ outputFile = f}
785 setOutputHi   f d = d{ outputHi   = f}
786
787 parseDynLibLoaderMode f d =
788  case splitAt 8 f of
789    ("deploy", "")       -> d{ dynLibLoader = Deployable }
790    ("sysdep", "")       -> d{ dynLibLoader = SystemDependent }
791    ("wrapped", "")      -> d{ dynLibLoader = Wrapped Nothing }
792    ("wrapped:", "hard") -> d{ dynLibLoader = Wrapped Nothing }
793    ("wrapped:", flex)   -> d{ dynLibLoader = Wrapped (Just flex) }
794    _                    -> ghcError (CmdLineError ("Unknown dynlib loader: " ++ f))
795
796 setDumpPrefixForce f d = d { dumpPrefixForce = f}
797
798 -- XXX HACK: Prelude> words "'does not' work" ===> ["'does","not'","work"]
799 -- Config.hs should really use Option.
800 setPgmP   f d = let (pgm:args) = words f in d{ pgm_P   = (pgm, map Option args)}
801
802 setPgmL   f d = d{ pgm_L   = f}
803 setPgmF   f d = d{ pgm_F   = f}
804 setPgmc   f d = d{ pgm_c   = (f,[])}
805 setPgmm   f d = d{ pgm_m   = (f,[])}
806 setPgms   f d = d{ pgm_s   = (f,[])}
807 setPgma   f d = d{ pgm_a   = (f,[])}
808 setPgml   f d = d{ pgm_l   = (f,[])}
809 setPgmdll f d = d{ pgm_dll = (f,[])}
810 setPgmwindres f d = d{ pgm_windres = f}
811
812 addOptL   f d = d{ opt_L   = f : opt_L d}
813 addOptP   f d = d{ opt_P   = f : opt_P d}
814 addOptF   f d = d{ opt_F   = f : opt_F d}
815 addOptc   f d = d{ opt_c   = f : opt_c d}
816 addOptm   f d = d{ opt_m   = f : opt_m d}
817 addOpta   f d = d{ opt_a   = f : opt_a d}
818 addOptl   f d = d{ opt_l   = f : opt_l d}
819 addOptwindres f d = d{ opt_windres = f : opt_windres d}
820
821 setDepMakefile :: FilePath -> DynFlags -> DynFlags
822 setDepMakefile f d = d { depMakefile = deOptDep f }
823
824 setDepIncludePkgDeps :: Bool -> DynFlags -> DynFlags
825 setDepIncludePkgDeps b d = d { depIncludePkgDeps = b }
826
827 addDepExcludeMod :: String -> DynFlags -> DynFlags
828 addDepExcludeMod m d
829     = d { depExcludeMods = mkModuleName (deOptDep m) : depExcludeMods d }
830
831 addDepSuffix :: FilePath -> DynFlags -> DynFlags
832 addDepSuffix s d = d { depSuffixes = deOptDep s : depSuffixes d }
833
834 -- XXX Legacy code:
835 -- We used to use "-optdep-flag -optdeparg", so for legacy applications
836 -- we need to strip the "-optdep" off of the arg
837 deOptDep :: String -> String
838 deOptDep x = case stripPrefix "-optdep" x of
839              Just rest -> rest
840              Nothing -> x
841
842 addCmdlineFramework f d = d{ cmdlineFrameworks = f : cmdlineFrameworks d}
843
844 addHaddockOpts f d = d{ haddockOptions = Just f}
845
846 -- -----------------------------------------------------------------------------
847 -- Command-line options
848
849 -- | When invoking external tools as part of the compilation pipeline, we
850 -- pass these a sequence of options on the command-line. Rather than
851 -- just using a list of Strings, we use a type that allows us to distinguish
852 -- between filepaths and 'other stuff'. The reason for this is that
853 -- this type gives us a handle on transforming filenames, and filenames only,
854 -- to whatever format they're expected to be on a particular platform.
855 data Option
856  = FileOption -- an entry that _contains_ filename(s) / filepaths.
857               String  -- a non-filepath prefix that shouldn't be
858                       -- transformed (e.g., "/out=")
859               String  -- the filepath/filename portion
860  | Option     String
861
862 showOpt :: Option -> String
863 showOpt (FileOption pre f) = pre ++ f
864 showOpt (Option s)  = s
865
866 -----------------------------------------------------------------------------
867 -- Setting the optimisation level
868
869 updOptLevel :: Int -> DynFlags -> DynFlags
870 -- ^ Sets the 'DynFlags' to be appropriate to the optimisation level
871 updOptLevel n dfs
872   = dfs2{ optLevel = final_n }
873   where
874    final_n = max 0 (min 2 n)    -- Clamp to 0 <= n <= 2
875    dfs1 = foldr (flip dopt_unset) dfs  remove_dopts
876    dfs2 = foldr (flip dopt_set)   dfs1 extra_dopts
877
878    extra_dopts  = [ f | (ns,f) <- optLevelFlags, final_n `elem` ns ]
879    remove_dopts = [ f | (ns,f) <- optLevelFlags, final_n `notElem` ns ]
880
881 optLevelFlags :: [([Int], DynFlag)]
882 optLevelFlags
883   = [ ([0],     Opt_IgnoreInterfacePragmas)
884     , ([0],     Opt_OmitInterfacePragmas)
885
886     , ([1,2],   Opt_IgnoreAsserts)
887     , ([1,2],   Opt_EnableRewriteRules)  -- Off for -O0; see Note [Scoping for Builtin rules]
888                                          --              in PrelRules
889     , ([1,2],   Opt_DoEtaReduction)
890     , ([1,2],   Opt_CaseMerge)
891     , ([1,2],   Opt_Strictness)
892     , ([1,2],   Opt_CSE)
893     , ([1,2],   Opt_FullLaziness)
894
895     , ([2],     Opt_LiberateCase)
896     , ([2],     Opt_SpecConstr)
897
898 --     , ([2],     Opt_StaticArgumentTransformation)
899 -- Max writes: I think it's probably best not to enable SAT with -O2 for the
900 -- 6.10 release. The version of SAT in HEAD at the moment doesn't incorporate
901 -- several improvements to the heuristics, and I'm concerned that without
902 -- those changes SAT will interfere with some attempts to write "high
903 -- performance Haskell", as we saw in some posts on Haskell-Cafe earlier
904 -- this year. In particular, the version in HEAD lacks the tail call
905 -- criterion, so many things that look like reasonable loops will be
906 -- turned into functions with extra (unneccesary) thunk creation.
907
908     , ([0,1,2], Opt_DoLambdaEtaExpansion)
909                 -- This one is important for a tiresome reason:
910                 -- we want to make sure that the bindings for data
911                 -- constructors are eta-expanded.  This is probably
912                 -- a good thing anyway, but it seems fragile.
913     ]
914
915 -- -----------------------------------------------------------------------------
916 -- Standard sets of warning options
917
918 standardWarnings :: [DynFlag]
919 standardWarnings
920     = [ Opt_WarnWarningsDeprecations,
921         Opt_WarnDeprecatedFlags,
922         Opt_WarnUnrecognisedPragmas,
923         Opt_WarnOverlappingPatterns,
924         Opt_WarnMissingFields,
925         Opt_WarnMissingMethods,
926         Opt_WarnDuplicateExports,
927         Opt_WarnLazyUnliftedBindings,
928         Opt_WarnDodgyForeignImports,
929         Opt_WarnWrongDoBind
930       ]
931
932 minusWOpts :: [DynFlag]
933 minusWOpts
934     = standardWarnings ++
935       [ Opt_WarnUnusedBinds,
936         Opt_WarnUnusedMatches,
937         Opt_WarnUnusedImports,
938         Opt_WarnIncompletePatterns,
939         Opt_WarnDodgyExports,
940         Opt_WarnDodgyImports
941       ]
942
943 minusWallOpts :: [DynFlag]
944 minusWallOpts
945     = minusWOpts ++
946       [ Opt_WarnTypeDefaults,
947         Opt_WarnNameShadowing,
948         Opt_WarnMissingSigs,
949         Opt_WarnHiShadows,
950         Opt_WarnOrphans,
951         Opt_WarnUnusedDoBind
952       ]
953
954 -- minuswRemovesOpts should be every warning option
955 minuswRemovesOpts :: [DynFlag]
956 minuswRemovesOpts
957     = minusWallOpts ++
958       [Opt_WarnImplicitPrelude,
959        Opt_WarnIncompletePatternsRecUpd,
960        Opt_WarnSimplePatterns,
961        Opt_WarnMonomorphism,
962        Opt_WarnUnrecognisedPragmas,
963        Opt_WarnTabs
964       ]
965
966 -- -----------------------------------------------------------------------------
967 -- CoreToDo:  abstraction of core-to-core passes to run.
968
969 data CoreToDo           -- These are diff core-to-core passes,
970                         -- which may be invoked in any order,
971                         -- as many times as you like.
972
973   = CoreDoSimplify      -- The core-to-core simplifier.
974         SimplifierMode
975         [SimplifierSwitch]
976                         -- Each run of the simplifier can take a different
977                         -- set of simplifier-specific flags.
978   | CoreDoFloatInwards
979   | CoreDoFloatOutwards FloatOutSwitches
980   | CoreLiberateCase
981   | CoreDoPrintCore
982   | CoreDoStaticArgs
983   | CoreDoStrictness
984   | CoreDoWorkerWrapper
985   | CoreDoSpecialising
986   | CoreDoSpecConstr
987   | CoreDoOldStrictness
988   | CoreDoGlomBinds
989   | CoreCSE
990   | CoreDoRuleCheck Int{-CompilerPhase-} String -- Check for non-application of rules
991                                                 -- matching this string
992   | CoreDoVectorisation PackageId
993   | CoreDoNothing                -- Useful when building up
994   | CoreDoPasses [CoreToDo]      -- lists of these things
995
996
997 data SimplifierMode             -- See comments in SimplMonad
998   = SimplGently
999   | SimplPhase Int [String]
1000
1001 instance Outputable SimplifierMode where
1002     ppr SimplGently       = ptext (sLit "gentle")
1003     ppr (SimplPhase n ss) = int n <+> brackets (text (concat $ intersperse "," ss))
1004
1005
1006 data SimplifierSwitch
1007   = MaxSimplifierIterations Int
1008   | NoCaseOfCase
1009
1010
1011 data FloatOutSwitches = FloatOutSwitches {
1012         floatOutLambdas :: Bool,     -- ^ True <=> float lambdas to top level
1013         floatOutConstants :: Bool    -- ^ True <=> float constants to top level,
1014                                      --            even if they do not escape a lambda
1015     }
1016
1017 instance Outputable FloatOutSwitches where
1018     ppr = pprFloatOutSwitches
1019
1020 pprFloatOutSwitches :: FloatOutSwitches -> SDoc
1021 pprFloatOutSwitches sw = pp_not (floatOutLambdas sw) <+> text "lambdas" <> comma
1022                      <+> pp_not (floatOutConstants sw) <+> text "constants"
1023   where
1024     pp_not True  = empty
1025     pp_not False = text "not"
1026
1027 -- | Switches that specify the minimum amount of floating out
1028 -- gentleFloatOutSwitches :: FloatOutSwitches
1029 -- gentleFloatOutSwitches = FloatOutSwitches False False
1030
1031 -- | Switches that do not specify floating out of lambdas, just of constants
1032 constantsOnlyFloatOutSwitches :: FloatOutSwitches
1033 constantsOnlyFloatOutSwitches = FloatOutSwitches False True
1034
1035
1036 -- The core-to-core pass ordering is derived from the DynFlags:
1037 runWhen :: Bool -> CoreToDo -> CoreToDo
1038 runWhen True  do_this = do_this
1039 runWhen False _       = CoreDoNothing
1040
1041 runMaybe :: Maybe a -> (a -> CoreToDo) -> CoreToDo
1042 runMaybe (Just x) f = f x
1043 runMaybe Nothing  _ = CoreDoNothing
1044
1045 getCoreToDo :: DynFlags -> [CoreToDo]
1046 getCoreToDo dflags
1047   | Just todo <- coreToDo dflags = todo -- set explicitly by user
1048   | otherwise = core_todo
1049   where
1050     opt_level     = optLevel dflags
1051     phases        = simplPhases dflags
1052     max_iter      = maxSimplIterations dflags
1053     strictness    = dopt Opt_Strictness dflags
1054     full_laziness = dopt Opt_FullLaziness dflags
1055     cse           = dopt Opt_CSE dflags
1056     spec_constr   = dopt Opt_SpecConstr dflags
1057     liberate_case = dopt Opt_LiberateCase dflags
1058     rule_check    = ruleCheck dflags
1059     static_args   = dopt Opt_StaticArgumentTransformation dflags
1060
1061     maybe_rule_check phase = runMaybe rule_check (CoreDoRuleCheck phase)
1062
1063     simpl_phase phase names iter
1064       = CoreDoPasses
1065           [ CoreDoSimplify (SimplPhase phase names) [
1066               MaxSimplifierIterations iter
1067             ],
1068             maybe_rule_check phase
1069           ]
1070
1071     vectorisation
1072       = runWhen (dopt Opt_Vectorise dflags)
1073         $ CoreDoPasses [ simpl_gently, CoreDoVectorisation (dphPackage dflags) ]
1074
1075
1076                 -- By default, we have 2 phases before phase 0.
1077
1078                 -- Want to run with inline phase 2 after the specialiser to give
1079                 -- maximum chance for fusion to work before we inline build/augment
1080                 -- in phase 1.  This made a difference in 'ansi' where an
1081                 -- overloaded function wasn't inlined till too late.
1082
1083                 -- Need phase 1 so that build/augment get
1084                 -- inlined.  I found that spectral/hartel/genfft lost some useful
1085                 -- strictness in the function sumcode' if augment is not inlined
1086                 -- before strictness analysis runs
1087     simpl_phases = CoreDoPasses [ simpl_phase phase ["main"] max_iter
1088                                   | phase <- [phases, phases-1 .. 1] ]
1089
1090
1091         -- initial simplify: mk specialiser happy: minimum effort please
1092     simpl_gently = CoreDoSimplify SimplGently [
1093                         --      Simplify "gently"
1094                         -- Don't inline anything till full laziness has bitten
1095                         -- In particular, inlining wrappers inhibits floating
1096                         -- e.g. ...(case f x of ...)...
1097                         --  ==> ...(case (case x of I# x# -> fw x#) of ...)...
1098                         --  ==> ...(case x of I# x# -> case fw x# of ...)...
1099                         -- and now the redex (f x) isn't floatable any more
1100                         -- Similarly, don't apply any rules until after full
1101                         -- laziness.  Notably, list fusion can prevent floating.
1102
1103             NoCaseOfCase,       -- Don't do case-of-case transformations.
1104                                 -- This makes full laziness work better
1105             MaxSimplifierIterations max_iter
1106         ]
1107
1108     core_todo =
1109      if opt_level == 0 then
1110        [vectorisation,
1111         simpl_phase 0 ["final"] max_iter]
1112      else {- opt_level >= 1 -} [
1113
1114     -- We want to do the static argument transform before full laziness as it
1115     -- may expose extra opportunities to float things outwards. However, to fix
1116     -- up the output of the transformation we need at do at least one simplify
1117     -- after this before anything else
1118         runWhen static_args (CoreDoPasses [ simpl_gently, CoreDoStaticArgs ]),
1119
1120         -- We run vectorisation here for now, but we might also try to run
1121         -- it later
1122         vectorisation,
1123
1124         -- initial simplify: mk specialiser happy: minimum effort please
1125         simpl_gently,
1126
1127         -- Specialisation is best done before full laziness
1128         -- so that overloaded functions have all their dictionary lambdas manifest
1129         CoreDoSpecialising,
1130
1131         runWhen full_laziness (CoreDoFloatOutwards constantsOnlyFloatOutSwitches),
1132                 -- Was: gentleFloatOutSwitches  
1133                 -- I have no idea why, but not floating constants to top level is
1134                 -- very bad in some cases. 
1135                 -- Notably: p_ident in spectral/rewrite
1136                 --          Changing from "gentle" to "constantsOnly" improved
1137                 --          rewrite's allocation by 19%, and made  0.0% difference
1138                 --          to any other nofib benchmark
1139
1140         CoreDoFloatInwards,
1141
1142         simpl_phases,
1143
1144                 -- Phase 0: allow all Ids to be inlined now
1145                 -- This gets foldr inlined before strictness analysis
1146
1147                 -- At least 3 iterations because otherwise we land up with
1148                 -- huge dead expressions because of an infelicity in the
1149                 -- simpifier.
1150                 --      let k = BIG in foldr k z xs
1151                 -- ==>  let k = BIG in letrec go = \xs -> ...(k x).... in go xs
1152                 -- ==>  let k = BIG in letrec go = \xs -> ...(BIG x).... in go xs
1153                 -- Don't stop now!
1154         simpl_phase 0 ["main"] (max max_iter 3),
1155
1156
1157 #ifdef OLD_STRICTNESS
1158         CoreDoOldStrictness,
1159 #endif
1160         runWhen strictness (CoreDoPasses [
1161                 CoreDoStrictness,
1162                 CoreDoWorkerWrapper,
1163                 CoreDoGlomBinds,
1164                 simpl_phase 0 ["post-worker-wrapper"] max_iter
1165                 ]),
1166
1167         runWhen full_laziness
1168           (CoreDoFloatOutwards constantsOnlyFloatOutSwitches),
1169                 -- nofib/spectral/hartel/wang doubles in speed if you
1170                 -- do full laziness late in the day.  It only happens
1171                 -- after fusion and other stuff, so the early pass doesn't
1172                 -- catch it.  For the record, the redex is
1173                 --        f_el22 (f_el21 r_midblock)
1174
1175
1176         runWhen cse CoreCSE,
1177                 -- We want CSE to follow the final full-laziness pass, because it may
1178                 -- succeed in commoning up things floated out by full laziness.
1179                 -- CSE used to rely on the no-shadowing invariant, but it doesn't any more
1180
1181         CoreDoFloatInwards,
1182
1183         maybe_rule_check 0,
1184
1185                 -- Case-liberation for -O2.  This should be after
1186                 -- strictness analysis and the simplification which follows it.
1187         runWhen liberate_case (CoreDoPasses [
1188             CoreLiberateCase,
1189             simpl_phase 0 ["post-liberate-case"] max_iter
1190             ]),         -- Run the simplifier after LiberateCase to vastly
1191                         -- reduce the possiblility of shadowing
1192                         -- Reason: see Note [Shadowing] in SpecConstr.lhs
1193
1194         runWhen spec_constr CoreDoSpecConstr,
1195
1196         maybe_rule_check 0,
1197
1198         -- Final clean-up simplification:
1199         simpl_phase 0 ["final"] max_iter
1200      ]
1201
1202 -- -----------------------------------------------------------------------------
1203 -- StgToDo:  abstraction of stg-to-stg passes to run.
1204
1205 data StgToDo
1206   = StgDoMassageForProfiling  -- should be (next to) last
1207   -- There's also setStgVarInfo, but its absolute "lastness"
1208   -- is so critical that it is hardwired in (no flag).
1209   | D_stg_stats
1210
1211 getStgToDo :: DynFlags -> [StgToDo]
1212 getStgToDo dflags
1213   | Just todo <- stgToDo dflags = todo -- set explicitly by user
1214   | otherwise = todo2
1215   where
1216         stg_stats = dopt Opt_StgStats dflags
1217
1218         todo1 = if stg_stats then [D_stg_stats] else []
1219
1220         todo2 | WayProf `elem` wayNames dflags
1221               = StgDoMassageForProfiling : todo1
1222               | otherwise
1223               = todo1
1224
1225 -- -----------------------------------------------------------------------------
1226 -- DynFlags parser
1227
1228 allFlags :: [String]
1229 allFlags = map ('-':) $
1230            [ flagName flag | flag <- dynamic_flags, ok (flagOptKind flag) ] ++
1231            map ("fno-"++) flags ++
1232            map ("f"++) flags ++
1233            map ("X"++) supportedLanguages ++
1234            map ("XNo"++) supportedLanguages
1235     where ok (PrefixPred _ _) = False
1236           ok _ = True
1237           flags = [ name | (name, _, _) <- fFlags ]
1238
1239 dynamic_flags :: [Flag DynP]
1240 dynamic_flags = [
1241     Flag "n"              (NoArg  (setDynFlag Opt_DryRun)) Supported
1242   , Flag "cpp"            (NoArg  (setDynFlag Opt_Cpp)) Supported
1243   , Flag "F"              (NoArg  (setDynFlag Opt_Pp)) Supported
1244   , Flag "#include"       (HasArg (addCmdlineHCInclude)) Supported
1245   , Flag "v"              (OptIntSuffix setVerbosity) Supported
1246
1247         ------- Specific phases  --------------------------------------------
1248   , Flag "pgmL"           (HasArg (upd . setPgmL)) Supported
1249   , Flag "pgmP"           (HasArg (upd . setPgmP)) Supported
1250   , Flag "pgmF"           (HasArg (upd . setPgmF)) Supported
1251   , Flag "pgmc"           (HasArg (upd . setPgmc)) Supported
1252   , Flag "pgmm"           (HasArg (upd . setPgmm)) Supported
1253   , Flag "pgms"           (HasArg (upd . setPgms)) Supported
1254   , Flag "pgma"           (HasArg (upd . setPgma)) Supported
1255   , Flag "pgml"           (HasArg (upd . setPgml)) Supported
1256   , Flag "pgmdll"         (HasArg (upd . setPgmdll)) Supported
1257   , Flag "pgmwindres"     (HasArg (upd . setPgmwindres)) Supported
1258
1259   , Flag "optL"           (HasArg (upd . addOptL)) Supported
1260   , Flag "optP"           (HasArg (upd . addOptP)) Supported
1261   , Flag "optF"           (HasArg (upd . addOptF)) Supported
1262   , Flag "optc"           (HasArg (upd . addOptc)) Supported
1263   , Flag "optm"           (HasArg (upd . addOptm)) Supported
1264   , Flag "opta"           (HasArg (upd . addOpta)) Supported
1265   , Flag "optl"           (HasArg (upd . addOptl)) Supported
1266   , Flag "optwindres"     (HasArg (upd . addOptwindres)) Supported
1267
1268   , Flag "split-objs"
1269          (NoArg (if can_split then setDynFlag Opt_SplitObjs else return ()))
1270          Supported
1271
1272         -------- ghc -M -----------------------------------------------------
1273   , Flag "dep-suffix"               (HasArg (upd . addDepSuffix)) Supported
1274   , Flag "optdep-s"                 (HasArg (upd . addDepSuffix))
1275          (Deprecated "Use -dep-suffix instead")
1276   , Flag "dep-makefile"             (HasArg (upd . setDepMakefile)) Supported
1277   , Flag "optdep-f"                 (HasArg (upd . setDepMakefile))
1278          (Deprecated "Use -dep-makefile instead")
1279   , Flag "optdep-w"                 (NoArg  (return ()))
1280          (Deprecated "-optdep-w doesn't do anything")
1281   , Flag "include-pkg-deps" (NoArg  (upd (setDepIncludePkgDeps True))) Supported
1282   , Flag "optdep--include-prelude"  (NoArg  (upd (setDepIncludePkgDeps True)))
1283          (Deprecated "Use -include-pkg-deps instead")
1284   , Flag "optdep--include-pkg-deps" (NoArg  (upd (setDepIncludePkgDeps True)))
1285          (Deprecated "Use -include-pkg-deps instead")
1286   , Flag "exclude-module"           (HasArg (upd . addDepExcludeMod)) Supported
1287   , Flag "optdep--exclude-module"   (HasArg (upd . addDepExcludeMod))
1288          (Deprecated "Use -exclude-module instead")
1289   , Flag "optdep-x"                 (HasArg (upd . addDepExcludeMod))
1290          (Deprecated "Use -exclude-module instead")
1291
1292         -------- Linking ----------------------------------------------------
1293   , Flag "c"              (NoArg (upd $ \d -> d{ ghcLink=NoLink } ))
1294          Supported
1295   , Flag "no-link"        (NoArg (upd $ \d -> d{ ghcLink=NoLink } ))
1296          (Deprecated "Use -c instead")
1297   , Flag "shared"         (NoArg (upd $ \d -> d{ ghcLink=LinkDynLib } ))
1298          Supported
1299   , Flag "dynload"        (HasArg (upd . parseDynLibLoaderMode))
1300          Supported
1301
1302         ------- Libraries ---------------------------------------------------
1303   , Flag "L"              (Prefix addLibraryPath ) Supported
1304   , Flag "l"              (AnySuffix (\s -> do upd (addOptl s))) Supported
1305
1306         ------- Frameworks --------------------------------------------------
1307         -- -framework-path should really be -F ...
1308   , Flag "framework-path" (HasArg addFrameworkPath ) Supported
1309   , Flag "framework"      (HasArg (upd . addCmdlineFramework)) Supported
1310
1311         ------- Output Redirection ------------------------------------------
1312   , Flag "odir"           (HasArg (upd . setObjectDir)) Supported
1313   , Flag "o"              (SepArg (upd . setOutputFile . Just)) Supported
1314   , Flag "ohi"            (HasArg (upd . setOutputHi   . Just )) Supported
1315   , Flag "osuf"           (HasArg (upd . setObjectSuf)) Supported
1316   , Flag "hcsuf"          (HasArg (upd . setHcSuf)) Supported
1317   , Flag "hisuf"          (HasArg (upd . setHiSuf)) Supported
1318   , Flag "hidir"          (HasArg (upd . setHiDir)) Supported
1319   , Flag "tmpdir"         (HasArg (upd . setTmpDir)) Supported
1320   , Flag "stubdir"        (HasArg (upd . setStubDir)) Supported
1321   , Flag "outputdir"      (HasArg (upd . setOutputDir)) Supported
1322   , Flag "ddump-file-prefix" (HasArg (upd . setDumpPrefixForce . Just))
1323          Supported
1324
1325         ------- Keeping temporary files -------------------------------------
1326      -- These can be singular (think ghc -c) or plural (think ghc --make)
1327   , Flag "keep-hc-file"     (NoArg (setDynFlag Opt_KeepHcFiles)) Supported
1328   , Flag "keep-hc-files"    (NoArg (setDynFlag Opt_KeepHcFiles)) Supported
1329   , Flag "keep-s-file"      (NoArg (setDynFlag Opt_KeepSFiles)) Supported
1330   , Flag "keep-s-files"     (NoArg (setDynFlag Opt_KeepSFiles)) Supported
1331   , Flag "keep-raw-s-file"  (NoArg (setDynFlag Opt_KeepRawSFiles)) Supported
1332   , Flag "keep-raw-s-files" (NoArg (setDynFlag Opt_KeepRawSFiles)) Supported
1333      -- This only makes sense as plural
1334   , Flag "keep-tmp-files"   (NoArg (setDynFlag Opt_KeepTmpFiles)) Supported
1335
1336         ------- Miscellaneous ----------------------------------------------
1337   , Flag "no-auto-link-packages" (NoArg (unSetDynFlag Opt_AutoLinkPackages)) Supported
1338   , Flag "no-hs-main"     (NoArg (setDynFlag Opt_NoHsMain)) Supported
1339   , Flag "main-is"        (SepArg setMainIs ) Supported
1340   , Flag "haddock"        (NoArg (setDynFlag Opt_Haddock)) Supported
1341   , Flag "haddock-opts"   (HasArg (upd . addHaddockOpts)) Supported
1342   , Flag "hpcdir"         (SepArg setOptHpcDir) Supported
1343
1344         ------- recompilation checker --------------------------------------
1345   , Flag "recomp"         (NoArg (unSetDynFlag Opt_ForceRecomp))
1346          (Deprecated "Use -fno-force-recomp instead")
1347   , Flag "no-recomp"      (NoArg (setDynFlag   Opt_ForceRecomp))
1348          (Deprecated "Use -fforce-recomp instead")
1349
1350         ------ HsCpp opts ---------------------------------------------------
1351   , Flag "D"              (AnySuffix (upd . addOptP)) Supported
1352   , Flag "U"              (AnySuffix (upd . addOptP)) Supported
1353
1354         ------- Include/Import Paths ----------------------------------------
1355   , Flag "I"              (Prefix    addIncludePath) Supported
1356   , Flag "i"              (OptPrefix addImportPath ) Supported
1357
1358         ------ Debugging ----------------------------------------------------
1359   , Flag "dstg-stats"     (NoArg (setDynFlag Opt_StgStats)) Supported
1360
1361   , Flag "ddump-cmm"               (setDumpFlag Opt_D_dump_cmm)
1362          Supported
1363   , Flag "ddump-cmmz"              (setDumpFlag Opt_D_dump_cmmz)
1364          Supported
1365   , Flag "ddump-cmmz-pretty"       (setDumpFlag Opt_D_dump_cmmz_pretty)
1366          Supported
1367   , Flag "ddump-cps-cmm"           (setDumpFlag Opt_D_dump_cps_cmm)
1368          Supported
1369   , Flag "ddump-cvt-cmm"           (setDumpFlag Opt_D_dump_cvt_cmm)
1370          Supported
1371   , Flag "ddump-asm"               (setDumpFlag Opt_D_dump_asm)
1372          Supported
1373   , Flag "ddump-asm-native"        (setDumpFlag Opt_D_dump_asm_native)
1374          Supported
1375   , Flag "ddump-asm-liveness"      (setDumpFlag Opt_D_dump_asm_liveness)
1376          Supported
1377   , Flag "ddump-asm-coalesce"      (setDumpFlag Opt_D_dump_asm_coalesce)
1378          Supported
1379   , Flag "ddump-asm-regalloc"      (setDumpFlag Opt_D_dump_asm_regalloc)
1380          Supported
1381   , Flag "ddump-asm-conflicts"     (setDumpFlag Opt_D_dump_asm_conflicts)
1382          Supported
1383   , Flag "ddump-asm-regalloc-stages"
1384                                  (setDumpFlag Opt_D_dump_asm_regalloc_stages)
1385          Supported
1386   , Flag "ddump-asm-stats"         (setDumpFlag Opt_D_dump_asm_stats)
1387          Supported
1388   , Flag "ddump-asm-expanded"      (setDumpFlag Opt_D_dump_asm_expanded)
1389          Supported
1390   , Flag "ddump-cpranal"           (setDumpFlag Opt_D_dump_cpranal)
1391          Supported
1392   , Flag "ddump-deriv"             (setDumpFlag Opt_D_dump_deriv)
1393          Supported
1394   , Flag "ddump-ds"                (setDumpFlag Opt_D_dump_ds)
1395          Supported
1396   , Flag "ddump-flatC"             (setDumpFlag Opt_D_dump_flatC)
1397          Supported
1398   , Flag "ddump-foreign"           (setDumpFlag Opt_D_dump_foreign)
1399          Supported
1400   , Flag "ddump-inlinings"         (setDumpFlag Opt_D_dump_inlinings)
1401          Supported
1402   , Flag "ddump-rule-firings"      (setDumpFlag Opt_D_dump_rule_firings)
1403          Supported
1404   , Flag "ddump-occur-anal"        (setDumpFlag Opt_D_dump_occur_anal)
1405          Supported
1406   , Flag "ddump-parsed"            (setDumpFlag Opt_D_dump_parsed)
1407          Supported
1408   , Flag "ddump-rn"                (setDumpFlag Opt_D_dump_rn)
1409          Supported
1410   , Flag "ddump-simpl"             (setDumpFlag Opt_D_dump_simpl)
1411          Supported
1412   , Flag "ddump-simpl-iterations"  (setDumpFlag Opt_D_dump_simpl_iterations)
1413          Supported
1414   , Flag "ddump-simpl-phases"      (OptPrefix setDumpSimplPhases)
1415          Supported
1416   , Flag "ddump-spec"              (setDumpFlag Opt_D_dump_spec)
1417          Supported
1418   , Flag "ddump-prep"              (setDumpFlag Opt_D_dump_prep)
1419          Supported
1420   , Flag "ddump-stg"               (setDumpFlag Opt_D_dump_stg)
1421          Supported
1422   , Flag "ddump-stranal"           (setDumpFlag Opt_D_dump_stranal)
1423          Supported
1424   , Flag "ddump-tc"                (setDumpFlag Opt_D_dump_tc)
1425          Supported
1426   , Flag "ddump-types"             (setDumpFlag Opt_D_dump_types)
1427          Supported
1428   , Flag "ddump-rules"             (setDumpFlag Opt_D_dump_rules)
1429          Supported
1430   , Flag "ddump-cse"               (setDumpFlag Opt_D_dump_cse)
1431          Supported
1432   , Flag "ddump-worker-wrapper"    (setDumpFlag Opt_D_dump_worker_wrapper)
1433          Supported
1434   , Flag "ddump-rn-trace"          (setDumpFlag Opt_D_dump_rn_trace)
1435          Supported
1436   , Flag "ddump-if-trace"          (setDumpFlag Opt_D_dump_if_trace)
1437          Supported
1438   , Flag "ddump-tc-trace"          (setDumpFlag Opt_D_dump_tc_trace)
1439          Supported
1440   , Flag "ddump-splices"           (setDumpFlag Opt_D_dump_splices)
1441          Supported
1442   , Flag "ddump-rn-stats"          (setDumpFlag Opt_D_dump_rn_stats)
1443          Supported
1444   , Flag "ddump-opt-cmm"           (setDumpFlag Opt_D_dump_opt_cmm)
1445          Supported
1446   , Flag "ddump-simpl-stats"       (setDumpFlag Opt_D_dump_simpl_stats)
1447          Supported
1448   , Flag "ddump-bcos"              (setDumpFlag Opt_D_dump_BCOs)
1449          Supported
1450   , Flag "dsource-stats"           (setDumpFlag Opt_D_source_stats)
1451          Supported
1452   , Flag "dverbose-core2core"      (NoArg setVerboseCore2Core)
1453          Supported
1454   , Flag "dverbose-stg2stg"        (setDumpFlag Opt_D_verbose_stg2stg)
1455          Supported
1456   , Flag "ddump-hi"                (setDumpFlag Opt_D_dump_hi)
1457          Supported
1458   , Flag "ddump-minimal-imports"   (setDumpFlag Opt_D_dump_minimal_imports)
1459          Supported
1460   , Flag "ddump-vect"              (setDumpFlag Opt_D_dump_vect)
1461          Supported
1462   , Flag "ddump-hpc"               (setDumpFlag Opt_D_dump_hpc)
1463          Supported
1464   , Flag "ddump-mod-cycles"        (setDumpFlag Opt_D_dump_mod_cycles)
1465          Supported
1466   , Flag "ddump-view-pattern-commoning" (setDumpFlag Opt_D_dump_view_pattern_commoning)
1467          Supported
1468   , Flag "ddump-to-file"           (setDumpFlag Opt_DumpToFile)
1469          Supported
1470   , Flag "ddump-hi-diffs"          (setDumpFlag Opt_D_dump_hi_diffs)
1471          Supported
1472   , Flag "ddump-rtti"              (setDumpFlag Opt_D_dump_rtti)
1473          Supported
1474
1475   , Flag "dcore-lint"              (NoArg (setDynFlag Opt_DoCoreLinting))
1476          Supported
1477   , Flag "dstg-lint"               (NoArg (setDynFlag Opt_DoStgLinting))
1478          Supported
1479   , Flag "dcmm-lint"               (NoArg (setDynFlag Opt_DoCmmLinting))
1480          Supported
1481   , Flag "dasm-lint"               (NoArg (setDynFlag Opt_DoAsmLinting))
1482          Supported
1483   , Flag "dshow-passes"
1484          (NoArg (do forceRecompile
1485                     setVerbosity (Just 2)))
1486          Supported
1487   , Flag "dfaststring-stats"       (NoArg (setDynFlag Opt_D_faststring_stats))
1488          Supported
1489
1490         ------ Machine dependant (-m<blah>) stuff ---------------------------
1491
1492   , Flag "monly-2-regs" (NoArg (upd (\s -> s{stolen_x86_regs = 2}) ))
1493          Supported
1494   , Flag "monly-3-regs" (NoArg (upd (\s -> s{stolen_x86_regs = 3}) ))
1495          Supported
1496   , Flag "monly-4-regs" (NoArg (upd (\s -> s{stolen_x86_regs = 4}) ))
1497          Supported
1498
1499      ------ Warning opts -------------------------------------------------
1500   , Flag "W"      (NoArg (mapM_ setDynFlag   minusWOpts))
1501          Supported
1502   , Flag "Werror" (NoArg (setDynFlag         Opt_WarnIsError))
1503          Supported
1504   , Flag "Wwarn"  (NoArg (unSetDynFlag       Opt_WarnIsError))
1505          Supported
1506   , Flag "Wall"   (NoArg (mapM_ setDynFlag   minusWallOpts))
1507          Supported
1508   , Flag "Wnot"   (NoArg (mapM_ unSetDynFlag minusWallOpts))
1509          (Deprecated "Use -w instead")
1510   , Flag "w"      (NoArg (mapM_ unSetDynFlag minuswRemovesOpts))
1511          Supported
1512
1513         ------ Optimisation flags ------------------------------------------
1514   , Flag "O"      (NoArg (upd (setOptLevel 1))) Supported
1515   , Flag "Onot"   (NoArg (upd (setOptLevel 0)))
1516          (Deprecated "Use -O0 instead")
1517   , Flag "Odph"   (NoArg (upd setDPHOpt)) Supported
1518   , Flag "O"      (OptIntSuffix (\mb_n -> upd (setOptLevel (mb_n `orElse` 1))))
1519          Supported
1520                 -- If the number is missing, use 1
1521
1522   , Flag "fsimplifier-phases"
1523          (IntSuffix (\n -> upd (\dfs -> dfs{ simplPhases = n })))
1524          Supported
1525   , Flag "fmax-simplifier-iterations"
1526          (IntSuffix (\n -> upd (\dfs -> dfs{ maxSimplIterations = n })))
1527          Supported
1528
1529   , Flag "fspec-constr-threshold"
1530          (IntSuffix (\n -> upd (\dfs -> dfs{ specConstrThreshold = Just n })))
1531          Supported
1532   , Flag "fno-spec-constr-threshold"
1533          (NoArg (upd (\dfs -> dfs{ specConstrThreshold = Nothing })))
1534          Supported
1535   , Flag "fspec-constr-count"
1536          (IntSuffix (\n -> upd (\dfs -> dfs{ specConstrCount = Just n })))
1537          Supported
1538   , Flag "fno-spec-constr-count"
1539          (NoArg (upd (\dfs -> dfs{ specConstrCount = Nothing })))
1540          Supported
1541   , Flag "fliberate-case-threshold"
1542          (IntSuffix (\n -> upd (\dfs -> dfs{ liberateCaseThreshold = Just n })))
1543          Supported
1544   , Flag "fno-liberate-case-threshold"
1545          (NoArg (upd (\dfs -> dfs{ liberateCaseThreshold = Nothing })))
1546          Supported
1547
1548   , Flag "frule-check"
1549          (SepArg (\s -> upd (\dfs -> dfs{ ruleCheck = Just s })))
1550          Supported
1551   , Flag "fcontext-stack"
1552          (IntSuffix $ \n -> upd $ \dfs -> dfs{ ctxtStkDepth = n })
1553          Supported
1554
1555         ------ Profiling ----------------------------------------------------
1556
1557   -- XXX Should the -f* flags be deprecated?
1558   -- They don't seem to be documented
1559   , Flag "fauto-sccs-on-all-toplevs"
1560          (NoArg (setDynFlag Opt_AutoSccsOnAllToplevs))
1561          Supported
1562   , Flag "auto-all"
1563          (NoArg (setDynFlag Opt_AutoSccsOnAllToplevs))
1564          Supported
1565   , Flag "no-auto-all"
1566          (NoArg (unSetDynFlag Opt_AutoSccsOnAllToplevs))
1567          Supported
1568   , Flag "fauto-sccs-on-exported-toplevs"
1569          (NoArg (setDynFlag Opt_AutoSccsOnExportedToplevs))
1570          Supported
1571   , Flag "auto"
1572          (NoArg (setDynFlag Opt_AutoSccsOnExportedToplevs))
1573          Supported
1574   , Flag "no-auto"
1575          (NoArg (unSetDynFlag Opt_AutoSccsOnExportedToplevs))
1576          Supported
1577   , Flag "fauto-sccs-on-individual-cafs"
1578          (NoArg (setDynFlag Opt_AutoSccsOnIndividualCafs))
1579          Supported
1580   , Flag "caf-all"
1581          (NoArg (setDynFlag Opt_AutoSccsOnIndividualCafs))
1582          Supported
1583   , Flag "no-caf-all"
1584          (NoArg (unSetDynFlag Opt_AutoSccsOnIndividualCafs))
1585          Supported
1586
1587         ------ DPH flags ----------------------------------------------------
1588
1589   , Flag "fdph-seq"
1590          (NoArg (setDPHBackend DPHSeq))
1591          Supported
1592   , Flag "fdph-par"
1593          (NoArg (setDPHBackend DPHPar))
1594          Supported
1595   , Flag "fdph-this"
1596          (NoArg (setDPHBackend DPHThis))
1597          Supported
1598
1599         ------ Compiler flags -----------------------------------------------
1600
1601   , Flag "fasm"             (NoArg (setObjTarget HscAsm)) Supported
1602   , Flag "fvia-c"           (NoArg (setObjTarget HscC)) Supported
1603   , Flag "fvia-C"           (NoArg (setObjTarget HscC)) Supported
1604
1605   , Flag "fno-code"         (NoArg (setTarget HscNothing)) Supported
1606   , Flag "fbyte-code"       (NoArg (setTarget HscInterpreted)) Supported
1607   , Flag "fobject-code"     (NoArg (setTarget defaultHscTarget)) Supported
1608
1609   , Flag "fglasgow-exts"    (NoArg (mapM_ setDynFlag   glasgowExtsFlags))
1610          Supported
1611   , Flag "fno-glasgow-exts" (NoArg (mapM_ unSetDynFlag glasgowExtsFlags))
1612          Supported
1613  ]
1614  ++ map (mkFlag True  "f"    setDynFlag  ) fFlags
1615  ++ map (mkFlag False "fno-" unSetDynFlag) fFlags
1616  ++ map (mkFlag True  "X"    setDynFlag  ) xFlags
1617  ++ map (mkFlag False "XNo"  unSetDynFlag) xFlags
1618
1619 package_flags :: [Flag DynP]
1620 package_flags = [
1621         ------- Packages ----------------------------------------------------
1622     Flag "package-conf"   (HasArg extraPkgConf_) Supported
1623   , Flag "no-user-package-conf" (NoArg (unSetDynFlag Opt_ReadUserPackageConf))
1624          Supported
1625   , Flag "package-name"   (HasArg (upd . setPackageName)) Supported
1626   , Flag "package"        (HasArg exposePackage) Supported
1627   , Flag "hide-package"   (HasArg hidePackage) Supported
1628   , Flag "hide-all-packages" (NoArg (setDynFlag Opt_HideAllPackages))
1629          Supported
1630   , Flag "ignore-package" (HasArg ignorePackage)
1631          Supported
1632   , Flag "syslib"         (HasArg exposePackage)
1633          (Deprecated "Use -package instead")
1634   ]
1635
1636 mkFlag :: Bool                  -- ^ True <=> it should be turned on
1637        -> String                -- ^ The flag prefix
1638        -> (DynFlag -> DynP ())
1639        -> (String, DynFlag, Bool -> Deprecated)
1640        -> Flag DynP
1641 mkFlag turnOn flagPrefix f (name, dynflag, deprecated)
1642     = Flag (flagPrefix ++ name) (NoArg (f dynflag)) (deprecated turnOn)
1643
1644 deprecatedForLanguage :: String -> Bool -> Deprecated
1645 deprecatedForLanguage lang turn_on
1646     = Deprecated ("use -X"  ++ flag ++ " or pragma {-# LANGUAGE " ++ flag ++ "#-} instead")
1647     where 
1648       flag | turn_on    = lang
1649            | otherwise = "No"++lang
1650
1651 useInstead :: String -> Bool -> Deprecated
1652 useInstead flag turn_on
1653   = Deprecated ("Use -f" ++ no ++ flag ++ " instead")
1654   where
1655     no = if turn_on then "" else "no-"
1656
1657 -- | These @-f\<blah\>@ flags can all be reversed with @-fno-\<blah\>@
1658 fFlags :: [(String, DynFlag, Bool -> Deprecated)]
1659 fFlags = [
1660   ( "warn-dodgy-foreign-imports",       Opt_WarnDodgyForeignImports, const Supported ),
1661   ( "warn-dodgy-exports",               Opt_WarnDodgyExports, const Supported ),
1662   ( "warn-dodgy-imports",               Opt_WarnDodgyImports, const Supported ),
1663   ( "warn-duplicate-exports",           Opt_WarnDuplicateExports, const Supported ),
1664   ( "warn-hi-shadowing",                Opt_WarnHiShadows, const Supported ),
1665   ( "warn-implicit-prelude",            Opt_WarnImplicitPrelude, const Supported ),
1666   ( "warn-incomplete-patterns",         Opt_WarnIncompletePatterns, const Supported ),
1667   ( "warn-incomplete-record-updates",   Opt_WarnIncompletePatternsRecUpd, const Supported ),
1668   ( "warn-missing-fields",              Opt_WarnMissingFields, const Supported ),
1669   ( "warn-missing-methods",             Opt_WarnMissingMethods, const Supported ),
1670   ( "warn-missing-signatures",          Opt_WarnMissingSigs, const Supported ),
1671   ( "warn-name-shadowing",              Opt_WarnNameShadowing, const Supported ),
1672   ( "warn-overlapping-patterns",        Opt_WarnOverlappingPatterns, const Supported ),
1673   ( "warn-simple-patterns",             Opt_WarnSimplePatterns, const Supported ),
1674   ( "warn-type-defaults",               Opt_WarnTypeDefaults, const Supported ),
1675   ( "warn-monomorphism-restriction",    Opt_WarnMonomorphism, const Supported ),
1676   ( "warn-unused-binds",                Opt_WarnUnusedBinds, const Supported ),
1677   ( "warn-unused-imports",              Opt_WarnUnusedImports, const Supported ),
1678   ( "warn-unused-matches",              Opt_WarnUnusedMatches, const Supported ),
1679   ( "warn-warnings-deprecations",       Opt_WarnWarningsDeprecations, const Supported ),
1680   ( "warn-deprecations",                Opt_WarnWarningsDeprecations, const Supported ),
1681   ( "warn-deprecated-flags",            Opt_WarnDeprecatedFlags, const Supported ),
1682   ( "warn-orphans",                     Opt_WarnOrphans, const Supported ),
1683   ( "warn-tabs",                        Opt_WarnTabs, const Supported ),
1684   ( "warn-unrecognised-pragmas",        Opt_WarnUnrecognisedPragmas, const Supported ),
1685   ( "warn-lazy-unlifted-bindings",      Opt_WarnLazyUnliftedBindings,
1686     const $ Deprecated "lazy unlifted bindings will be an error in GHC 6.14, and this flag will no longer exist"),
1687   ( "warn-unused-do-bind",              Opt_WarnUnusedDoBind, const Supported ),
1688   ( "warn-wrong-do-bind",               Opt_WarnWrongDoBind, const Supported ),
1689   ( "print-explicit-foralls",           Opt_PrintExplicitForalls, const Supported ),
1690   ( "strictness",                       Opt_Strictness, const Supported ),
1691   ( "static-argument-transformation",   Opt_StaticArgumentTransformation, const Supported ),
1692   ( "full-laziness",                    Opt_FullLaziness, const Supported ),
1693   ( "liberate-case",                    Opt_LiberateCase, const Supported ),
1694   ( "spec-constr",                      Opt_SpecConstr, const Supported ),
1695   ( "cse",                              Opt_CSE, const Supported ),
1696   ( "ignore-interface-pragmas",         Opt_IgnoreInterfacePragmas, const Supported ),
1697   ( "omit-interface-pragmas",           Opt_OmitInterfacePragmas, const Supported ),
1698   ( "do-lambda-eta-expansion",          Opt_DoLambdaEtaExpansion, const Supported ),
1699   ( "ignore-asserts",                   Opt_IgnoreAsserts, const Supported ),
1700   ( "do-eta-reduction",                 Opt_DoEtaReduction, const Supported ),
1701   ( "case-merge",                       Opt_CaseMerge, const Supported ),
1702   ( "unbox-strict-fields",              Opt_UnboxStrictFields, const Supported ),
1703   ( "method-sharing",                   Opt_MethodSharing, const Supported ),
1704   ( "dicts-cheap",                      Opt_DictsCheap, const Supported ),
1705   ( "inline-if-enough-args",            Opt_InlineIfEnoughArgs, const Supported ),
1706   ( "excess-precision",                 Opt_ExcessPrecision, const Supported ),
1707   ( "eager-blackholing",                Opt_EagerBlackHoling, const Supported ),
1708   ( "asm-mangling",                     Opt_DoAsmMangling, const Supported ),
1709   ( "print-bind-result",                Opt_PrintBindResult, const Supported ),
1710   ( "force-recomp",                     Opt_ForceRecomp, const Supported ),
1711   ( "hpc-no-auto",                      Opt_Hpc_No_Auto, const Supported ),
1712   ( "rewrite-rules",                    Opt_EnableRewriteRules, useInstead "enable-rewrite-rules" ),
1713   ( "enable-rewrite-rules",             Opt_EnableRewriteRules, const Supported ),
1714   ( "break-on-exception",               Opt_BreakOnException, const Supported ),
1715   ( "break-on-error",                   Opt_BreakOnError, const Supported ),
1716   ( "print-evld-with-show",             Opt_PrintEvldWithShow, const Supported ),
1717   ( "print-bind-contents",              Opt_PrintBindContents, const Supported ),
1718   ( "run-cps",                          Opt_RunCPS, const Supported ),
1719   ( "run-cpsz",                         Opt_RunCPSZ, const Supported ),
1720   ( "new-codegen",                      Opt_TryNewCodeGen, const Supported ),
1721   ( "convert-to-zipper-and-back",       Opt_ConvertToZipCfgAndBack, const Supported ),
1722   ( "vectorise",                        Opt_Vectorise, const Supported ),
1723   ( "regs-graph",                       Opt_RegsGraph, const Supported ),
1724   ( "regs-iterative",                   Opt_RegsIterative, const Supported ),
1725   ( "th",                               Opt_TemplateHaskell,
1726     deprecatedForLanguage "TemplateHaskell" ),
1727   ( "fi",                               Opt_ForeignFunctionInterface,
1728     deprecatedForLanguage "ForeignFunctionInterface" ),
1729   ( "ffi",                              Opt_ForeignFunctionInterface,
1730     deprecatedForLanguage "ForeignFunctionInterface" ),
1731   ( "arrows",                           Opt_Arrows,
1732     deprecatedForLanguage "Arrows" ),
1733   ( "generics",                         Opt_Generics,
1734     deprecatedForLanguage "Generics" ),
1735   ( "implicit-prelude",                 Opt_ImplicitPrelude,
1736     deprecatedForLanguage "ImplicitPrelude" ),
1737   ( "bang-patterns",                    Opt_BangPatterns,
1738     deprecatedForLanguage "BangPatterns" ),
1739   ( "monomorphism-restriction",         Opt_MonomorphismRestriction,
1740     deprecatedForLanguage "MonomorphismRestriction" ),
1741   ( "mono-pat-binds",                   Opt_MonoPatBinds,
1742     deprecatedForLanguage "MonoPatBinds" ),
1743   ( "extended-default-rules",           Opt_ExtendedDefaultRules,
1744     deprecatedForLanguage "ExtendedDefaultRules" ),
1745   ( "implicit-params",                  Opt_ImplicitParams,
1746     deprecatedForLanguage "ImplicitParams" ),
1747   ( "scoped-type-variables",            Opt_ScopedTypeVariables,
1748     deprecatedForLanguage "ScopedTypeVariables" ),
1749   ( "parr",                             Opt_PArr,
1750     deprecatedForLanguage "PArr" ),
1751   ( "allow-overlapping-instances",      Opt_OverlappingInstances,
1752     deprecatedForLanguage "OverlappingInstances" ),
1753   ( "allow-undecidable-instances",      Opt_UndecidableInstances,
1754     deprecatedForLanguage "UndecidableInstances" ),
1755   ( "allow-incoherent-instances",       Opt_IncoherentInstances,
1756     deprecatedForLanguage "IncoherentInstances" ),
1757   ( "gen-manifest",                     Opt_GenManifest, const Supported ),
1758   ( "embed-manifest",                   Opt_EmbedManifest, const Supported ),
1759   ( "ext-core",                         Opt_EmitExternalCore, const Supported ),
1760   ( "shared-implib",                    Opt_SharedImplib, const Supported ),
1761   ( "building-cabal-package",           Opt_BuildingCabalPackage, const Supported ),
1762   ( "implicit-import-qualified",        Opt_ImplicitImportQualified, const Supported )
1763   ]
1764
1765 supportedLanguages :: [String]
1766 supportedLanguages = [ name | (name, _, _) <- xFlags ]
1767
1768 -- This may contain duplicates
1769 languageOptions :: [DynFlag]
1770 languageOptions = [ dynFlag | (_, dynFlag, _) <- xFlags ]
1771
1772 -- | These -X<blah> flags can all be reversed with -XNo<blah>
1773 xFlags :: [(String, DynFlag, Bool -> Deprecated)]
1774 xFlags = [
1775   ( "CPP",                              Opt_Cpp, const Supported ),
1776   ( "PostfixOperators",                 Opt_PostfixOperators, const Supported ),
1777   ( "TupleSections",                    Opt_TupleSections, const Supported ),
1778   ( "PatternGuards",                    Opt_PatternGuards, const Supported ),
1779   ( "UnicodeSyntax",                    Opt_UnicodeSyntax, const Supported ),
1780   ( "MagicHash",                        Opt_MagicHash, const Supported ),
1781   ( "PolymorphicComponents",            Opt_PolymorphicComponents, const Supported ),
1782   ( "ExistentialQuantification",        Opt_ExistentialQuantification, const Supported ),
1783   ( "KindSignatures",                   Opt_KindSignatures, const Supported ),
1784   ( "EmptyDataDecls",                   Opt_EmptyDataDecls, const Supported ),
1785   ( "ParallelListComp",                 Opt_ParallelListComp, const Supported ),
1786   ( "TransformListComp",                Opt_TransformListComp, const Supported ),
1787   ( "ForeignFunctionInterface",         Opt_ForeignFunctionInterface, const Supported ),
1788   ( "UnliftedFFITypes",                 Opt_UnliftedFFITypes, const Supported ),
1789   ( "GHCForeignImportPrim",             Opt_GHCForeignImportPrim, const Supported ),
1790   ( "LiberalTypeSynonyms",              Opt_LiberalTypeSynonyms, const Supported ),
1791   ( "Rank2Types",                       Opt_Rank2Types, const Supported ),
1792   ( "RankNTypes",                       Opt_RankNTypes, const Supported ),
1793   ( "ImpredicativeTypes",               Opt_ImpredicativeTypes, const Supported ),
1794   ( "TypeOperators",                    Opt_TypeOperators, const Supported ),
1795   ( "RecursiveDo",                      Opt_RecursiveDo, const Supported ),
1796   ( "Arrows",                           Opt_Arrows, const Supported ),
1797   ( "PArr",                             Opt_PArr, const Supported ),
1798   ( "TemplateHaskell",                  Opt_TemplateHaskell, const Supported ),
1799   ( "QuasiQuotes",                      Opt_QuasiQuotes, const Supported ),
1800   ( "Generics",                         Opt_Generics, const Supported ),
1801   -- On by default:
1802   ( "ImplicitPrelude",                  Opt_ImplicitPrelude, const Supported ),
1803   ( "RecordWildCards",                  Opt_RecordWildCards, const Supported ),
1804   ( "NamedFieldPuns",                   Opt_RecordPuns, const Supported ),
1805   ( "RecordPuns",                       Opt_RecordPuns,
1806     deprecatedForLanguage "NamedFieldPuns" ),
1807   ( "DisambiguateRecordFields",         Opt_DisambiguateRecordFields, const Supported ),
1808   ( "OverloadedStrings",                Opt_OverloadedStrings, const Supported ),
1809   ( "GADTs",                            Opt_GADTs, const Supported ),
1810   ( "ViewPatterns",                     Opt_ViewPatterns, const Supported ),
1811   ( "TypeFamilies",                     Opt_TypeFamilies, const Supported ),
1812   ( "BangPatterns",                     Opt_BangPatterns, const Supported ),
1813   -- On by default:
1814   ( "MonomorphismRestriction",          Opt_MonomorphismRestriction, const Supported ),
1815   -- On by default:
1816   ( "NPlusKPatterns",                   Opt_NPlusKPatterns, const Supported ),
1817   -- On by default (which is not strictly H98):
1818   ( "MonoPatBinds",                     Opt_MonoPatBinds, const Supported ),
1819   ( "MonoLocalBinds",                   Opt_MonoLocalBinds, const Supported ),
1820   ( "RelaxedPolyRec",                   Opt_RelaxedPolyRec, const Supported ),
1821   ( "ExtendedDefaultRules",             Opt_ExtendedDefaultRules, const Supported ),
1822   ( "ImplicitParams",                   Opt_ImplicitParams, const Supported ),
1823   ( "ScopedTypeVariables",              Opt_ScopedTypeVariables, const Supported ),
1824
1825   ( "PatternSignatures",                Opt_ScopedTypeVariables, 
1826     deprecatedForLanguage "ScopedTypeVariables" ),
1827
1828   ( "UnboxedTuples",                    Opt_UnboxedTuples, const Supported ),
1829   ( "StandaloneDeriving",               Opt_StandaloneDeriving, const Supported ),
1830   ( "DeriveDataTypeable",               Opt_DeriveDataTypeable, const Supported ),
1831   ( "DeriveFunctor",                    Opt_DeriveFunctor, const Supported ),
1832   ( "DeriveTraversable",                Opt_DeriveTraversable, const Supported ),
1833   ( "DeriveFoldable",                   Opt_DeriveFoldable, const Supported ),
1834   ( "TypeSynonymInstances",             Opt_TypeSynonymInstances, const Supported ),
1835   ( "FlexibleContexts",                 Opt_FlexibleContexts, const Supported ),
1836   ( "FlexibleInstances",                Opt_FlexibleInstances, const Supported ),
1837   ( "ConstrainedClassMethods",          Opt_ConstrainedClassMethods, const Supported ),
1838   ( "MultiParamTypeClasses",            Opt_MultiParamTypeClasses, const Supported ),
1839   ( "FunctionalDependencies",           Opt_FunctionalDependencies, const Supported ),
1840   ( "GeneralizedNewtypeDeriving",       Opt_GeneralizedNewtypeDeriving, const Supported ),
1841   ( "OverlappingInstances",             Opt_OverlappingInstances, const Supported ),
1842   ( "UndecidableInstances",             Opt_UndecidableInstances, const Supported ),
1843   ( "IncoherentInstances",              Opt_IncoherentInstances, const Supported ),
1844   ( "PackageImports",                   Opt_PackageImports, const Supported ),
1845   ( "NewQualifiedOperators",            Opt_NewQualifiedOperators, const Supported )
1846   ]
1847
1848 impliedFlags :: [(DynFlag, DynFlag)]
1849 impliedFlags
1850   = [ (Opt_GADTs,               Opt_RelaxedPolyRec)  -- We want type-sig variables to
1851                                                      --      be completely rigid for GADTs
1852
1853     , (Opt_TypeFamilies,        Opt_RelaxedPolyRec)  -- Trac #2944 gives a nice example
1854     , (Opt_TypeFamilies,        Opt_KindSignatures)  -- Type families use kind signatures
1855                                                      -- all over the place
1856
1857     , (Opt_ScopedTypeVariables, Opt_RelaxedPolyRec)  -- Ditto for scoped type variables; see
1858                                                      --      Note [Scoped tyvars] in TcBinds
1859     , (Opt_ImpredicativeTypes,  Opt_RankNTypes)
1860   ]
1861
1862 glasgowExtsFlags :: [DynFlag]
1863 glasgowExtsFlags = [
1864              Opt_PrintExplicitForalls
1865            , Opt_ForeignFunctionInterface
1866            , Opt_UnliftedFFITypes
1867            , Opt_GADTs
1868            , Opt_ImplicitParams
1869            , Opt_ScopedTypeVariables
1870            , Opt_UnboxedTuples
1871            , Opt_TypeSynonymInstances
1872            , Opt_StandaloneDeriving
1873            , Opt_DeriveDataTypeable
1874            , Opt_DeriveFunctor
1875            , Opt_DeriveFoldable
1876            , Opt_DeriveTraversable
1877            , Opt_FlexibleContexts
1878            , Opt_FlexibleInstances
1879            , Opt_ConstrainedClassMethods
1880            , Opt_MultiParamTypeClasses
1881            , Opt_FunctionalDependencies
1882            , Opt_MagicHash
1883            , Opt_PolymorphicComponents
1884            , Opt_ExistentialQuantification
1885            , Opt_UnicodeSyntax
1886            , Opt_PostfixOperators
1887            , Opt_PatternGuards
1888            , Opt_LiberalTypeSynonyms
1889            , Opt_RankNTypes
1890            , Opt_TypeOperators
1891            , Opt_RecursiveDo
1892            , Opt_ParallelListComp
1893            , Opt_EmptyDataDecls
1894            , Opt_KindSignatures
1895            , Opt_GeneralizedNewtypeDeriving
1896            , Opt_TypeFamilies ]
1897
1898 -- -----------------------------------------------------------------------------
1899 -- Parsing the dynamic flags.
1900
1901 -- | Parse dynamic flags from a list of command line arguments.  Returns the
1902 -- the parsed 'DynFlags', the left-over arguments, and a list of warnings.
1903 -- Throws a 'UsageError' if errors occurred during parsing (such as unknown
1904 -- flags or missing arguments).
1905 parseDynamicFlags :: Monad m =>
1906                      DynFlags -> [Located String]
1907                   -> m (DynFlags, [Located String], [Located String])
1908                      -- ^ Updated 'DynFlags', left-over arguments, and
1909                      -- list of warnings.
1910 parseDynamicFlags dflags args = parseDynamicFlags_ dflags args True
1911
1912 -- | Like 'parseDynamicFlags' but does not allow the package flags (-package,
1913 -- -hide-package, -ignore-package, -hide-all-packages, -package-conf).
1914 parseDynamicNoPackageFlags :: Monad m =>
1915                      DynFlags -> [Located String]
1916                   -> m (DynFlags, [Located String], [Located String])
1917                      -- ^ Updated 'DynFlags', left-over arguments, and
1918                      -- list of warnings.
1919 parseDynamicNoPackageFlags dflags args = parseDynamicFlags_ dflags args False
1920
1921 parseDynamicFlags_ :: Monad m =>
1922                       DynFlags -> [Located String] -> Bool
1923                   -> m (DynFlags, [Located String], [Located String])
1924 parseDynamicFlags_ dflags args pkg_flags = do
1925   -- XXX Legacy support code
1926   -- We used to accept things like
1927   --     optdep-f  -optdepdepend
1928   --     optdep-f  -optdep depend
1929   --     optdep -f -optdepdepend
1930   --     optdep -f -optdep depend
1931   -- but the spaces trip up proper argument handling. So get rid of them.
1932   let f (L p "-optdep" : L _ x : xs) = (L p ("-optdep" ++ x)) : f xs
1933       f (x : xs) = x : f xs
1934       f xs = xs
1935       args' = f args
1936
1937       -- Note: -ignore-package (package_flags) must precede -i* (dynamic_flags)
1938       flag_spec | pkg_flags = package_flags ++ dynamic_flags
1939                 | otherwise = dynamic_flags
1940
1941   let ((leftover, errs, warns), dflags')
1942           = runCmdLine (processArgs flag_spec args') dflags
1943   when (not (null errs)) $ ghcError $ errorsToGhcException errs
1944   return (dflags', leftover, warns)
1945
1946 type DynP = CmdLineP DynFlags
1947
1948 upd :: (DynFlags -> DynFlags) -> DynP ()
1949 upd f = do
1950    dfs <- getCmdLineState
1951    putCmdLineState $! (f dfs)
1952
1953 --------------------------
1954 setDynFlag, unSetDynFlag :: DynFlag -> DynP ()
1955 setDynFlag f = do { upd (\dfs -> dopt_set dfs f)
1956                   ; mapM_ setDynFlag deps }
1957   where
1958     deps = [ d | (f', d) <- impliedFlags, f' == f ]
1959         -- When you set f, set the ones it implies
1960         -- NB: use setDynFlag recursively, in case the implied flags
1961         --     implies further flags
1962         -- When you un-set f, however, we don't un-set the things it implies
1963         --      (except for -fno-glasgow-exts, which is treated specially)
1964
1965 unSetDynFlag f = upd (\dfs -> dopt_unset dfs f)
1966
1967 --------------------------
1968 setDumpFlag :: DynFlag -> OptKind DynP
1969 setDumpFlag dump_flag
1970   = NoArg (setDynFlag dump_flag >> when want_recomp forceRecompile)
1971   where
1972         -- Certain dumpy-things are really interested in what's going
1973         -- on during recompilation checking, so in those cases we
1974         -- don't want to turn it off.
1975     want_recomp = dump_flag `notElem` [Opt_D_dump_if_trace,
1976                                        Opt_D_dump_hi_diffs]
1977
1978 forceRecompile :: DynP ()
1979 -- Whenver we -ddump, force recompilation (by switching off the 
1980 -- recompilation checker), else you don't see the dump! However, 
1981 -- don't switch it off in --make mode, else *everything* gets
1982 -- recompiled which probably isn't what you want
1983 forceRecompile = do { dfs <- getCmdLineState
1984                     ; when (force_recomp dfs) (setDynFlag Opt_ForceRecomp) }
1985         where
1986           force_recomp dfs = isOneShot (ghcMode dfs)
1987
1988 setVerboseCore2Core :: DynP ()
1989 setVerboseCore2Core = do setDynFlag Opt_D_verbose_core2core 
1990                          forceRecompile
1991                          upd (\s -> s { shouldDumpSimplPhase = const True })
1992
1993 setDumpSimplPhases :: String -> DynP ()
1994 setDumpSimplPhases s = do forceRecompile
1995                           upd (\s -> s { shouldDumpSimplPhase = spec })
1996   where
1997     spec :: SimplifierMode -> Bool
1998     spec = join (||)
1999          . map (join (&&) . map match . split ':')
2000          . split ','
2001          $ case s of
2002              '=' : s' -> s'
2003              _        -> s
2004
2005     join :: (Bool -> Bool -> Bool)
2006          -> [SimplifierMode -> Bool]
2007          -> SimplifierMode -> Bool
2008     join _  [] = const True
2009     join op ss = foldr1 (\f g x -> f x `op` g x) ss
2010
2011     match :: String -> SimplifierMode -> Bool
2012     match "" = const True
2013     match s  = case reads s of
2014                 [(n,"")] -> phase_num  n
2015                 _        -> phase_name s
2016
2017     phase_num :: Int -> SimplifierMode -> Bool
2018     phase_num n (SimplPhase k _) = n == k
2019     phase_num _ _                = False
2020
2021     phase_name :: String -> SimplifierMode -> Bool
2022     phase_name s SimplGently       = s == "gentle"
2023     phase_name s (SimplPhase _ ss) = s `elem` ss
2024
2025 setVerbosity :: Maybe Int -> DynP ()
2026 setVerbosity mb_n = upd (\dfs -> dfs{ verbosity = mb_n `orElse` 3 })
2027
2028 addCmdlineHCInclude :: String -> DynP ()
2029 addCmdlineHCInclude a = upd (\s -> s{cmdlineHcIncludes =  a : cmdlineHcIncludes s})
2030
2031 extraPkgConf_ :: FilePath -> DynP ()
2032 extraPkgConf_  p = upd (\s -> s{ extraPkgConfs = p : extraPkgConfs s })
2033
2034 exposePackage, hidePackage, ignorePackage :: String -> DynP ()
2035 exposePackage p =
2036   upd (\s -> s{ packageFlags = ExposePackage p : packageFlags s })
2037 hidePackage p =
2038   upd (\s -> s{ packageFlags = HidePackage p : packageFlags s })
2039 ignorePackage p =
2040   upd (\s -> s{ packageFlags = IgnorePackage p : packageFlags s })
2041
2042 setPackageName :: String -> DynFlags -> DynFlags
2043 setPackageName p
2044   | Nothing <- unpackPackageId pid
2045   = ghcError (CmdLineError ("cannot parse \'" ++ p ++ "\' as a package identifier"))
2046   | otherwise
2047   = \s -> s{ thisPackage = pid }
2048   where
2049         pid = stringToPackageId p
2050
2051 -- If we're linking a binary, then only targets that produce object
2052 -- code are allowed (requests for other target types are ignored).
2053 setTarget :: HscTarget -> DynP ()
2054 setTarget l = upd set
2055   where
2056    set dfs
2057      | ghcLink dfs /= LinkBinary || isObjectTarget l  = dfs{ hscTarget = l }
2058      | otherwise = dfs
2059
2060 -- Changes the target only if we're compiling object code.  This is
2061 -- used by -fasm and -fvia-C, which switch from one to the other, but
2062 -- not from bytecode to object-code.  The idea is that -fasm/-fvia-C
2063 -- can be safely used in an OPTIONS_GHC pragma.
2064 setObjTarget :: HscTarget -> DynP ()
2065 setObjTarget l = upd set
2066   where
2067    set dfs
2068      | isObjectTarget (hscTarget dfs) = dfs { hscTarget = l }
2069      | otherwise = dfs
2070
2071 setOptLevel :: Int -> DynFlags -> DynFlags
2072 setOptLevel n dflags
2073    | hscTarget dflags == HscInterpreted && n > 0
2074         = dflags
2075             -- not in IO any more, oh well:
2076             -- putStr "warning: -O conflicts with --interactive; -O ignored.\n"
2077    | otherwise
2078         = updOptLevel n dflags
2079
2080
2081 -- -Odph is equivalent to
2082 --
2083 --    -O2                               optimise as much as possible
2084 --    -fno-method-sharing               sharing specialisation defeats fusion
2085 --                                      sometimes
2086 --    -fdicts-cheap                     always inline dictionaries
2087 --    -fmax-simplifier-iterations20     this is necessary sometimes
2088 --    -fsimplifier-phases=3             we use an additional simplifier phase
2089 --                                      for fusion
2090 --    -fno-spec-constr-threshold        run SpecConstr even for big loops
2091 --    -fno-spec-constr-count            SpecConstr as much as possible
2092 --    -finline-enough-args              hack to prevent excessive inlining
2093 --
2094 setDPHOpt :: DynFlags -> DynFlags
2095 setDPHOpt dflags = setOptLevel 2 (dflags { maxSimplIterations  = 20
2096                                          , simplPhases         = 3
2097                                          , specConstrThreshold = Nothing
2098                                          , specConstrCount     = Nothing
2099                                          })
2100                    `dopt_set`   Opt_DictsCheap
2101                    `dopt_unset` Opt_MethodSharing
2102                    `dopt_set`   Opt_InlineIfEnoughArgs
2103
2104 data DPHBackend = DPHPar
2105                 | DPHSeq
2106                 | DPHThis
2107         deriving(Eq, Ord, Enum, Show)
2108
2109 setDPHBackend :: DPHBackend -> DynP ()
2110 setDPHBackend backend 
2111   = do
2112       upd $ \dflags -> dflags { dphBackend = backend }
2113       mapM_ exposePackage (dph_packages backend)
2114   where
2115     dph_packages DPHThis = []
2116     dph_packages DPHPar  = ["dph-prim-par", "dph-par"]
2117     dph_packages DPHSeq  = ["dph-prim-seq", "dph-seq"]
2118
2119 dphPackage :: DynFlags -> PackageId
2120 dphPackage dflags = case dphBackend dflags of
2121                       DPHPar  -> dphParPackageId
2122                       DPHSeq  -> dphSeqPackageId
2123                       DPHThis -> thisPackage dflags
2124
2125 setMainIs :: String -> DynP ()
2126 setMainIs arg
2127   | not (null main_fn) && isLower (head main_fn)
2128      -- The arg looked like "Foo.Bar.baz"
2129   = upd $ \d -> d{ mainFunIs = Just main_fn,
2130                    mainModIs = mkModule mainPackageId (mkModuleName main_mod) }
2131
2132   | isUpper (head arg)  -- The arg looked like "Foo" or "Foo.Bar"
2133   = upd $ \d -> d{ mainModIs = mkModule mainPackageId (mkModuleName arg) }
2134
2135   | otherwise                   -- The arg looked like "baz"
2136   = upd $ \d -> d{ mainFunIs = Just arg }
2137   where
2138     (main_mod, main_fn) = splitLongestPrefix arg (== '.')
2139
2140 -----------------------------------------------------------------------------
2141 -- Paths & Libraries
2142
2143 addImportPath, addLibraryPath, addIncludePath, addFrameworkPath :: FilePath -> DynP ()
2144
2145 -- -i on its own deletes the import paths
2146 addImportPath "" = upd (\s -> s{importPaths = []})
2147 addImportPath p  = upd (\s -> s{importPaths = importPaths s ++ splitPathList p})
2148
2149
2150 addLibraryPath p =
2151   upd (\s -> s{libraryPaths = libraryPaths s ++ splitPathList p})
2152
2153 addIncludePath p =
2154   upd (\s -> s{includePaths = includePaths s ++ splitPathList p})
2155
2156 addFrameworkPath p =
2157   upd (\s -> s{frameworkPaths = frameworkPaths s ++ splitPathList p})
2158
2159 #ifndef mingw32_TARGET_OS
2160 split_marker :: Char
2161 split_marker = ':'   -- not configurable (ToDo)
2162 #endif
2163
2164 splitPathList :: String -> [String]
2165 splitPathList s = filter notNull (splitUp s)
2166                 -- empty paths are ignored: there might be a trailing
2167                 -- ':' in the initial list, for example.  Empty paths can
2168                 -- cause confusion when they are translated into -I options
2169                 -- for passing to gcc.
2170   where
2171 #ifndef mingw32_TARGET_OS
2172     splitUp xs = split split_marker xs
2173 #else
2174      -- Windows: 'hybrid' support for DOS-style paths in directory lists.
2175      --
2176      -- That is, if "foo:bar:baz" is used, this interpreted as
2177      -- consisting of three entries, 'foo', 'bar', 'baz'.
2178      -- However, with "c:/foo:c:\\foo;x:/bar", this is interpreted
2179      -- as 3 elts, "c:/foo", "c:\\foo", "x:/bar"
2180      --
2181      -- Notice that no attempt is made to fully replace the 'standard'
2182      -- split marker ':' with the Windows / DOS one, ';'. The reason being
2183      -- that this will cause too much breakage for users & ':' will
2184      -- work fine even with DOS paths, if you're not insisting on being silly.
2185      -- So, use either.
2186     splitUp []             = []
2187     splitUp (x:':':div:xs) | div `elem` dir_markers
2188                            = ((x:':':div:p): splitUp rs)
2189                            where
2190                               (p,rs) = findNextPath xs
2191           -- we used to check for existence of the path here, but that
2192           -- required the IO monad to be threaded through the command-line
2193           -- parser which is quite inconvenient.  The
2194     splitUp xs = cons p (splitUp rs)
2195                where
2196                  (p,rs) = findNextPath xs
2197
2198                  cons "" xs = xs
2199                  cons x  xs = x:xs
2200
2201     -- will be called either when we've consumed nought or the
2202     -- "<Drive>:/" part of a DOS path, so splitting is just a Q of
2203     -- finding the next split marker.
2204     findNextPath xs =
2205         case break (`elem` split_markers) xs of
2206            (p, _:ds) -> (p, ds)
2207            (p, xs)   -> (p, xs)
2208
2209     split_markers :: [Char]
2210     split_markers = [':', ';']
2211
2212     dir_markers :: [Char]
2213     dir_markers = ['/', '\\']
2214 #endif
2215
2216 -- -----------------------------------------------------------------------------
2217 -- tmpDir, where we store temporary files.
2218
2219 setTmpDir :: FilePath -> DynFlags -> DynFlags
2220 setTmpDir dir dflags = dflags{ tmpDir = normalise dir }
2221   -- we used to fix /cygdrive/c/.. on Windows, but this doesn't
2222   -- seem necessary now --SDM 7/2/2008
2223
2224 -----------------------------------------------------------------------------
2225 -- Hpc stuff
2226
2227 setOptHpcDir :: String -> DynP ()
2228 setOptHpcDir arg  = upd $ \ d -> d{hpcDir = arg}
2229
2230 -----------------------------------------------------------------------------
2231 -- Via-C compilation stuff
2232
2233 -- There are some options that we need to pass to gcc when compiling
2234 -- Haskell code via C, but are only supported by recent versions of
2235 -- gcc.  The configure script decides which of these options we need,
2236 -- and puts them in the file "extra-gcc-opts" in $topdir, which is
2237 -- read before each via-C compilation.  The advantage of having these
2238 -- in a separate file is that the file can be created at install-time
2239 -- depending on the available gcc version, and even re-generated  later
2240 -- if gcc is upgraded.
2241 --
2242 -- The options below are not dependent on the version of gcc, only the
2243 -- platform.
2244
2245 machdepCCOpts :: DynFlags -> ([String], -- flags for all C compilations
2246                               [String]) -- for registerised HC compilations
2247 machdepCCOpts _dflags
2248 #if alpha_TARGET_ARCH
2249         =       ( ["-w", "-mieee"
2250 #ifdef HAVE_THREADED_RTS_SUPPORT
2251                     , "-D_REENTRANT"
2252 #endif
2253                    ], [] )
2254         -- For now, to suppress the gcc warning "call-clobbered
2255         -- register used for global register variable", we simply
2256         -- disable all warnings altogether using the -w flag. Oh well.
2257
2258 #elif hppa_TARGET_ARCH
2259         -- ___HPUX_SOURCE, not _HPUX_SOURCE, is #defined if -ansi!
2260         -- (very nice, but too bad the HP /usr/include files don't agree.)
2261         = ( ["-D_HPUX_SOURCE"], [] )
2262
2263 #elif m68k_TARGET_ARCH
2264       -- -fno-defer-pop : for the .hc files, we want all the pushing/
2265       --    popping of args to routines to be explicit; if we let things
2266       --    be deferred 'til after an STGJUMP, imminent death is certain!
2267       --
2268       -- -fomit-frame-pointer : *don't*
2269       --     It's better to have a6 completely tied up being a frame pointer
2270       --     rather than let GCC pick random things to do with it.
2271       --     (If we want to steal a6, then we would try to do things
2272       --     as on iX86, where we *do* steal the frame pointer [%ebp].)
2273         = ( [], ["-fno-defer-pop", "-fno-omit-frame-pointer"] )
2274
2275 #elif i386_TARGET_ARCH
2276       -- -fno-defer-pop : basically the same game as for m68k
2277       --
2278       -- -fomit-frame-pointer : *must* in .hc files; because we're stealing
2279       --   the fp (%ebp) for our register maps.
2280         =  let n_regs = stolen_x86_regs _dflags
2281                sta = opt_Static
2282            in
2283                     ( [ if sta then "-DDONT_WANT_WIN32_DLL_SUPPORT" else ""
2284                       ],
2285                       [ "-fno-defer-pop",
2286                         "-fomit-frame-pointer",
2287                         -- we want -fno-builtin, because when gcc inlines
2288                         -- built-in functions like memcpy() it tends to
2289                         -- run out of registers, requiring -monly-n-regs
2290                         "-fno-builtin",
2291                         "-DSTOLEN_X86_REGS="++show n_regs ]
2292                     )
2293
2294 #elif ia64_TARGET_ARCH
2295         = ( [], ["-fomit-frame-pointer", "-G0"] )
2296
2297 #elif x86_64_TARGET_ARCH
2298         = (
2299 #if darwin_TARGET_OS
2300             ["-m64"],
2301 #else
2302             [],
2303 #endif
2304                 ["-fomit-frame-pointer",
2305                  "-fno-asynchronous-unwind-tables",
2306                         -- the unwind tables are unnecessary for HC code,
2307                         -- and get in the way of -split-objs.  Another option
2308                         -- would be to throw them away in the mangler, but this
2309                         -- is easier.
2310                  "-fno-builtin"
2311                         -- calling builtins like strlen() using the FFI can
2312                         -- cause gcc to run out of regs, so use the external
2313                         -- version.
2314                 ] )
2315
2316 #elif sparc_TARGET_ARCH
2317         = ( [], ["-w"] )
2318         -- For now, to suppress the gcc warning "call-clobbered
2319         -- register used for global register variable", we simply
2320         -- disable all warnings altogether using the -w flag. Oh well.
2321
2322 #elif powerpc_apple_darwin_TARGET
2323       -- -no-cpp-precomp:
2324       --     Disable Apple's precompiling preprocessor. It's a great thing
2325       --     for "normal" programs, but it doesn't support register variable
2326       --     declarations.
2327         = ( [], ["-no-cpp-precomp"] )
2328 #else
2329         = ( [], [] )
2330 #endif
2331
2332 picCCOpts :: DynFlags -> [String]
2333 picCCOpts _dflags
2334 #if darwin_TARGET_OS
2335       -- Apple prefers to do things the other way round.
2336       -- PIC is on by default.
2337       -- -mdynamic-no-pic:
2338       --     Turn off PIC code generation.
2339       -- -fno-common:
2340       --     Don't generate "common" symbols - these are unwanted
2341       --     in dynamic libraries.
2342
2343     | opt_PIC
2344         = ["-fno-common", "-U __PIC__","-D__PIC__"]
2345     | otherwise
2346         = ["-mdynamic-no-pic"]
2347 #elif mingw32_TARGET_OS
2348       -- no -fPIC for Windows
2349     | opt_PIC
2350         = ["-U __PIC__","-D__PIC__"]
2351     | otherwise
2352         = []
2353 #else
2354     | opt_PIC || not opt_Static
2355         = ["-fPIC", "-U __PIC__", "-D__PIC__"]
2356     | otherwise
2357         = []
2358 #endif
2359
2360 -- -----------------------------------------------------------------------------
2361 -- Splitting
2362
2363 can_split :: Bool
2364 can_split = cSplitObjs == "YES"
2365
2366 -- -----------------------------------------------------------------------------
2367 -- Compiler Info
2368
2369 data Printable = String String
2370                | FromDynFlags (DynFlags -> String)
2371
2372 compilerInfo :: [(String, Printable)]
2373 compilerInfo = [("Project name",                String cProjectName),
2374                 ("Project version",             String cProjectVersion),
2375                 ("Booter version",              String cBooterVersion),
2376                 ("Stage",                       String cStage),
2377                 ("Have interpreter",            String cGhcWithInterpreter),
2378                 ("Object splitting",            String cSplitObjs),
2379                 ("Have native code generator",  String cGhcWithNativeCodeGen),
2380                 ("Support SMP",                 String cGhcWithSMP),
2381                 ("Unregisterised",              String cGhcUnregisterised),
2382                 ("Tables next to code",         String cGhcEnableTablesNextToCode),
2383                 ("Win32 DLLs",                  String cEnableWin32DLLs),
2384                 ("RTS ways",                    String cGhcRTSWays),
2385                 ("Leading underscore",          String cLeadingUnderscore),
2386                 ("Debug on",                    String (show debugIsOn)),
2387                 ("LibDir",                      FromDynFlags topDir)
2388                ]
2389