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