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