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