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