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