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