DynFlags.hs 92.9 KB
Newer Older
1
-- |
2
3
4
5
6
7
-- Dynamic flags
--
--
-- (c) The University of Glasgow 2005
--

8
-- Most flags are dynamic flags, which means they can change from
9
10
11
-- compilation to compilation using @OPTIONS_GHC@ pragmas, and in a
-- multi-session GHC each session can be using different dynamic
-- flags.  Dynamic flags can also be set at the prompt in GHCi.
12
module DynFlags (
13
        -- * Dynamic flags and associated configuration types
Ian Lynagh's avatar
Ian Lynagh committed
14
        DynFlag(..),
15
        ExtensionFlag(..),
16
        glasgowExtsFlags,
17
18
19
20
21
22
        dopt,
        dopt_set,
        dopt_unset,
        xopt,
        xopt_set,
        xopt_unset,
Ian Lynagh's avatar
Ian Lynagh committed
23
        DynFlags(..),
Ian Lynagh's avatar
Ian Lynagh committed
24
        RtsOptsEnabled(..),
Ian Lynagh's avatar
Ian Lynagh committed
25
26
27
28
        HscTarget(..), isObjectTarget, defaultObjectTarget,
        GhcMode(..), isOneShot,
        GhcLink(..), isNoLink,
        PackageFlag(..),
Ian Lynagh's avatar
Ian Lynagh committed
29
        Option(..), showOpt,
Ian Lynagh's avatar
Ian Lynagh committed
30
        DynLibLoader(..),
31
        fFlags, fLangFlags, xFlags,
32
        DPHBackend(..), dphPackageMaybe,
33
        wayNames,
34

35
36
37
38
39
        Settings(..),
        ghcUsagePath, ghciUsagePath, topDir, tmpDir, rawSettings,
        extraGccViaCFlags, systemPackageConfig,
        pgm_L, pgm_P, pgm_F, pgm_c, pgm_s, pgm_a, pgm_l, pgm_dll, pgm_T,
        pgm_sysman, pgm_windres, pgm_lo, pgm_lc,
40
41
        opt_L, opt_P, opt_F, opt_c, opt_m, opt_a, opt_l,
        opt_windres, opt_lo, opt_lc,
42
43


44
        -- ** Manipulating DynFlags
45
        defaultDynFlags,                -- Settings -> DynFlags
Ian Lynagh's avatar
Ian Lynagh committed
46
47
        initDynFlags,                   -- DynFlags -> IO DynFlags

48
        getOpts,                        -- DynFlags -> (DynFlags -> [a]) -> [a]
49
        getVerbFlags,
Ian Lynagh's avatar
Ian Lynagh committed
50
51
52
        updOptLevel,
        setTmpDir,
        setPackageName,
53
        doingTickyProfiling,
Ian Lynagh's avatar
Ian Lynagh committed
54

55
        -- ** Parsing DynFlags
Ian Lynagh's avatar
Ian Lynagh committed
56
        parseDynamicFlags,
57
        parseDynamicNoPackageFlags,
58
        allFlags,
59

60
        supportedLanguagesAndExtensions,
61
62

        -- ** DynFlag C compiler options
Ian Lynagh's avatar
Ian Lynagh committed
63
        machdepCCOpts, picCCOpts,
64
65
66
67
68
69

        -- * Configuration of the stg-to-stg passes
        StgToDo(..),
        getStgToDo,

        -- * Compiler configuration suitable for display to the user
70
71
72
73
74
75
        compilerInfo
#ifdef GHCI
-- Only in stage 2 can we be sure that the RTS 
-- exposes the appropriate runtime boolean
        , rtsIsProfiled
#endif
76
77
78
79
  ) where

#include "HsVersions.h"

80
#ifndef OMIT_NATIVE_CODEGEN
81
import Platform
82
#endif
83
import Module
Simon Marlow's avatar
Simon Marlow committed
84
import PackageConfig
85
import PrelNames        ( mAIN )
86
import StaticFlags
87
import {-# SOURCE #-} Packages (PackageState)
Ian Lynagh's avatar
Ian Lynagh committed
88
import DriverPhases     ( Phase(..), phaseInputExt )
89
90
import Config
import CmdLineParser
Ian Lynagh's avatar
Ian Lynagh committed
91
import Constants        ( mAX_CONTEXT_REDUCTION_DEPTH )
92
import Panic
93
import Util
94
import Maybes           ( orElse )
95
import SrcLoc
96
import FastString
Simon Marlow's avatar
Simon Marlow committed
97
import Outputable
Ian Lynagh's avatar
Ian Lynagh committed
98
#ifdef GHCI
99
import Foreign.C	( CInt )
Ian Lynagh's avatar
Ian Lynagh committed
100
#endif
Simon Marlow's avatar
Simon Marlow committed
101
import {-# SOURCE #-} ErrUtils ( Severity(..), Message, mkLocMessage )
102

Ian Lynagh's avatar
Ian Lynagh committed
103
#ifdef GHCI
104
import System.IO.Unsafe	( unsafePerformIO )
Ian Lynagh's avatar
Ian Lynagh committed
105
#endif
106
import Data.IORef
Ian Lynagh's avatar
Ian Lynagh committed
107
import Control.Monad    ( when )
simonpj@microsoft.com's avatar
simonpj@microsoft.com committed
108

109
import Data.Char
110
import Data.List
111
112
import Data.Map (Map)
import qualified Data.Map as Map
Ian Lynagh's avatar
Ian Lynagh committed
113
-- import Data.Maybe
Ian Lynagh's avatar
Ian Lynagh committed
114
import System.FilePath
115
import System.IO        ( stderr, hPutChar )
116

117
118
119
-- -----------------------------------------------------------------------------
-- DynFlags

120
-- | Enumerates the simple on-or-off dynamic flags
121
122
123
124
data DynFlag

   -- debugging flags
   = Opt_D_dump_cmm
125
   | Opt_D_dump_raw_cmm
126
   | Opt_D_dump_cmmz
127
   | Opt_D_dump_cmmz_pretty
128
   | Opt_D_dump_cps_cmm
129
   | Opt_D_dump_cvt_cmm
130
   | Opt_D_dump_asm
131
132
   | Opt_D_dump_asm_native
   | Opt_D_dump_asm_liveness
133
   | Opt_D_dump_asm_coalesce
134
135
136
   | Opt_D_dump_asm_regalloc
   | Opt_D_dump_asm_regalloc_stages
   | Opt_D_dump_asm_conflicts
137
   | Opt_D_dump_asm_stats
138
   | Opt_D_dump_asm_expanded
139
   | Opt_D_dump_llvm
140
   | Opt_D_dump_core_stats
141
142
143
144
145
146
   | Opt_D_dump_cpranal
   | Opt_D_dump_deriv
   | Opt_D_dump_ds
   | Opt_D_dump_flatC
   | Opt_D_dump_foreign
   | Opt_D_dump_inlinings
147
   | Opt_D_dump_rule_firings
148
   | Opt_D_dump_rule_rewrites
149
150
151
152
153
   | Opt_D_dump_occur_anal
   | Opt_D_dump_parsed
   | Opt_D_dump_rn
   | Opt_D_dump_simpl
   | Opt_D_dump_simpl_iterations
154
   | Opt_D_dump_simpl_phases
155
156
157
158
159
160
161
162
163
164
165
166
167
   | Opt_D_dump_spec
   | Opt_D_dump_prep
   | Opt_D_dump_stg
   | Opt_D_dump_stranal
   | Opt_D_dump_tc
   | Opt_D_dump_types
   | Opt_D_dump_rules
   | Opt_D_dump_cse
   | Opt_D_dump_worker_wrapper
   | Opt_D_dump_rn_trace
   | Opt_D_dump_rn_stats
   | Opt_D_dump_opt_cmm
   | Opt_D_dump_simpl_stats
168
   | Opt_D_dump_cs_trace	-- Constraint solver in type checker
169
170
   | Opt_D_dump_tc_trace
   | Opt_D_dump_if_trace
171
   | Opt_D_dump_vt_trace
172
173
174
   | Opt_D_dump_splices
   | Opt_D_dump_BCOs
   | Opt_D_dump_vect
andy@galois.com's avatar
andy@galois.com committed
175
   | Opt_D_dump_hpc
pepe's avatar
pepe committed
176
   | Opt_D_dump_rtti
177
178
179
180
181
182
   | Opt_D_source_stats
   | Opt_D_verbose_core2core
   | Opt_D_verbose_stg2stg
   | Opt_D_dump_hi
   | Opt_D_dump_hi_diffs
   | Opt_D_dump_minimal_imports
183
   | Opt_D_dump_mod_cycles
184
   | Opt_D_dump_view_pattern_commoning
185
   | Opt_D_faststring_stats
Ian Lynagh's avatar
Ian Lynagh committed
186
   | Opt_DumpToFile                     -- ^ Append dump output to files instead of stdout.
Simon Marlow's avatar
Simon Marlow committed
187
   | Opt_D_no_debug_output
188
189
190
   | Opt_DoCoreLinting
   | Opt_DoStgLinting
   | Opt_DoCmmLinting
Ben.Lippmeier@anu.edu.au's avatar
Ben.Lippmeier@anu.edu.au committed
191
   | Opt_DoAsmLinting
192

Ian Lynagh's avatar
Ian Lynagh committed
193
   | Opt_WarnIsError                    -- -Werror; makes warnings fatal
194
195
   | Opt_WarnDuplicateExports
   | Opt_WarnHiShadows
196
   | Opt_WarnImplicitPrelude
197
   | Opt_WarnIncompletePatterns
198
   | Opt_WarnIncompleteUniPatterns
199
200
   | Opt_WarnIncompletePatternsRecUpd
   | Opt_WarnMissingFields
201
   | Opt_WarnMissingImportList
202
203
   | Opt_WarnMissingMethods
   | Opt_WarnMissingSigs
204
   | Opt_WarnMissingLocalSigs
205
206
207
   | Opt_WarnNameShadowing
   | Opt_WarnOverlappingPatterns
   | Opt_WarnTypeDefaults
208
   | Opt_WarnMonomorphism
209
210
211
   | Opt_WarnUnusedBinds
   | Opt_WarnUnusedImports
   | Opt_WarnUnusedMatches
Ian Lynagh's avatar
Ian Lynagh committed
212
   | Opt_WarnWarningsDeprecations
213
   | Opt_WarnDeprecatedFlags
214
   | Opt_WarnDodgyExports
215
216
   | Opt_WarnDodgyImports
   | Opt_WarnOrphans
217
   | Opt_WarnAutoOrphans
218
   | Opt_WarnIdentities
219
   | Opt_WarnTabs
220
   | Opt_WarnUnrecognisedPragmas
221
   | Opt_WarnDodgyForeignImports
222
   | Opt_WarnLazyUnliftedBindings
223
224
   | Opt_WarnUnusedDoBind
   | Opt_WarnWrongDoBind
225
   | Opt_WarnAlternativeLayoutRuleTransitional
226

227
228
   | Opt_PrintExplicitForalls

229
230
231
   -- optimisation opts
   | Opt_Strictness
   | Opt_FullLaziness
232
233
   | Opt_FloatIn
   | Opt_Specialise
234
   | Opt_StaticArgumentTransformation
235
   | Opt_CSE
236
237
   | Opt_LiberateCase
   | Opt_SpecConstr
238
239
240
241
242
   | Opt_DoLambdaEtaExpansion
   | Opt_IgnoreAsserts
   | Opt_DoEtaReduction
   | Opt_CaseMerge
   | Opt_UnboxStrictFields
243
   | Opt_MethodSharing	-- Now a no-op; remove in GHC 7.2
244
   | Opt_DictsCheap
245
   | Opt_EnableRewriteRules		-- Apply rewrite rules during simplification
rl@cse.unsw.edu.au's avatar
rl@cse.unsw.edu.au committed
246
   | Opt_Vectorise
Ian Lynagh's avatar
Ian Lynagh committed
247
248
   | Opt_RegsGraph                      -- do graph coloring register allocation
   | Opt_RegsIterative                  -- do iterative coalescing graph coloring register allocation
249

250
251
252
253
254
   -- Interface files
   | Opt_IgnoreInterfacePragmas
   | Opt_OmitInterfacePragmas
   | Opt_ExposeAllUnfoldings

Ian Lynagh's avatar
Ian Lynagh committed
255
256
257
258
259
   -- profiling opts
   | Opt_AutoSccsOnAllToplevs
   | Opt_AutoSccsOnExportedToplevs
   | Opt_AutoSccsOnIndividualCafs

260
261
   -- misc opts
   | Opt_Pp
262
   | Opt_ForceRecomp
263
264
   | Opt_DryRun
   | Opt_ExcessPrecision
265
   | Opt_EagerBlackHoling
266
267
268
269
   | Opt_ReadUserPackageConf
   | Opt_NoHsMain
   | Opt_SplitObjs
   | Opt_StgStats
270
   | Opt_HideAllPackages
271
   | Opt_PrintBindResult
272
   | Opt_Haddock
David Waern's avatar
David Waern committed
273
   | Opt_HaddockOptions
274
   | Opt_Hpc_No_Auto
275
   | Opt_BreakOnException
276
   | Opt_BreakOnError
277
   | Opt_PrintEvldWithShow
278
   | Opt_PrintBindContents
279
280
   | Opt_GenManifest
   | Opt_EmbedManifest
281
   | Opt_EmitExternalCore
Ian Lynagh's avatar
Ian Lynagh committed
282
   | Opt_SharedImplib
283
   | Opt_BuildingCabalPackage
284
   | Opt_SSE2
285
   | Opt_GhciSandbox
286
   | Opt_HelpfulErrors
287
288
289

	-- temporary flags
   | Opt_RunCPS
290
291
   | Opt_RunCPSZ
   | Opt_ConvertToZipCfgAndBack
292
   | Opt_AutoLinkPackages
293
   | Opt_ImplicitImportQualified
294
   | Opt_TryNewCodeGen
295
296
297
298
299
300

   -- keeping stuff
   | Opt_KeepHiDiffs
   | Opt_KeepHcFiles
   | Opt_KeepSFiles
   | Opt_KeepTmpFiles
Jedai's avatar
Jedai committed
301
   | Opt_KeepRawTokenStream
302
   | Opt_KeepLlvmFiles
303

304
   deriving (Eq, Show)
Ian Lynagh's avatar
Ian Lynagh committed
305

306
307
data Language = Haskell98 | Haskell2010

308
data ExtensionFlag
309
310
311
312
313
314
315
   = Opt_Cpp
   | Opt_OverlappingInstances
   | Opt_UndecidableInstances
   | Opt_IncoherentInstances
   | Opt_MonomorphismRestriction
   | Opt_MonoPatBinds
   | Opt_MonoLocalBinds
316
   | Opt_RelaxedPolyRec		-- Deprecated
317
318
319
320
   | Opt_ExtendedDefaultRules           -- Use GHC's extended rules for defaulting
   | Opt_ForeignFunctionInterface
   | Opt_UnliftedFFITypes
   | Opt_GHCForeignImportPrim
benl's avatar
benl committed
321
   | Opt_ParallelArrays                 -- Syntactic support for parallel arrays
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
   | Opt_Arrows                         -- Arrow-notation syntax
   | Opt_TemplateHaskell
   | Opt_QuasiQuotes
   | Opt_ImplicitParams
   | Opt_Generics			-- "Derivable type classes"
   | Opt_ImplicitPrelude
   | Opt_ScopedTypeVariables
   | Opt_UnboxedTuples
   | Opt_BangPatterns
   | Opt_TypeFamilies
   | Opt_OverloadedStrings
   | Opt_DisambiguateRecordFields
   | Opt_RecordWildCards
   | Opt_RecordPuns
   | Opt_ViewPatterns
   | Opt_GADTs
Ian Lynagh's avatar
Ian Lynagh committed
338
   | Opt_GADTSyntax
339
   | Opt_NPlusKPatterns
Ian Lynagh's avatar
Ian Lynagh committed
340
   | Opt_DoAndIfThenElse
341
   | Opt_RebindableSyntax
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378

   | Opt_StandaloneDeriving
   | Opt_DeriveDataTypeable
   | Opt_DeriveFunctor
   | Opt_DeriveTraversable
   | Opt_DeriveFoldable

   | Opt_TypeSynonymInstances
   | Opt_FlexibleContexts
   | Opt_FlexibleInstances
   | Opt_ConstrainedClassMethods
   | Opt_MultiParamTypeClasses
   | Opt_FunctionalDependencies
   | Opt_UnicodeSyntax
   | Opt_PolymorphicComponents
   | Opt_ExistentialQuantification
   | Opt_MagicHash
   | Opt_EmptyDataDecls
   | Opt_KindSignatures
   | Opt_ParallelListComp
   | Opt_TransformListComp
   | Opt_GeneralizedNewtypeDeriving
   | Opt_RecursiveDo
   | Opt_DoRec
   | Opt_PostfixOperators
   | Opt_TupleSections
   | Opt_PatternGuards
   | Opt_LiberalTypeSynonyms
   | Opt_Rank2Types
   | Opt_RankNTypes
   | Opt_ImpredicativeTypes
   | Opt_TypeOperators
   | Opt_PackageImports
   | Opt_ExplicitForAll
   | Opt_AlternativeLayoutRule
   | Opt_AlternativeLayoutRuleTransitional
   | Opt_DatatypeContexts
379
   | Opt_NondecreasingIndentation
380
   | Opt_RelaxedLayout
381
382
   deriving (Eq, Show)

383
384
-- | Contains not only a collection of 'DynFlag's but also a plethora of
-- information relating to the compilation of a single file or GHC session
385
data DynFlags = DynFlags {
Ian Lynagh's avatar
Ian Lynagh committed
386
387
388
  ghcMode               :: GhcMode,
  ghcLink               :: GhcLink,
  hscTarget             :: HscTarget,
389
  hscOutName            :: String,      -- ^ Name of the output file
390
  extCoreName           :: String,      -- ^ Name of the .hcr output file
391
  verbosity             :: Int,         -- ^ Verbosity level: see Note [Verbosity levels]
392
393
394
  optLevel              :: Int,         -- ^ Optimisation level
  simplPhases           :: Int,         -- ^ Number of simplifier phases
  maxSimplIterations    :: Int,         -- ^ Max simplifier iterations
395
  shouldDumpSimplPhase  :: Maybe String,
Ian Lynagh's avatar
Ian Lynagh committed
396
  ruleCheck             :: Maybe String,
397
  strictnessBefore      :: [Int],       -- ^ Additional demand analysis
398

399
400
401
  specConstrThreshold   :: Maybe Int,   -- ^ Threshold for SpecConstr
  specConstrCount       :: Maybe Int,   -- ^ Max number of specialisations for any one function
  liberateCaseThreshold :: Maybe Int,   -- ^ Threshold for LiberateCase
402
403
  floatLamArgs          :: Maybe Int,   -- ^ Arg count for lambda floating
  			   	 	--   See CoreMonad.FloatOutSwitches
404

405
#ifndef OMIT_NATIVE_CODEGEN
406
  targetPlatform	:: Platform,	-- ^ The platform we're compiling for. Used by the NCG.
407
#endif
408
  cmdlineHcIncludes     :: [String],    -- ^ @\-\#includes@
Ian Lynagh's avatar
Ian Lynagh committed
409
410
411
  importPaths           :: [FilePath],
  mainModIs             :: Module,
  mainFunIs             :: Maybe String,
412
  ctxtStkDepth          :: Int,         -- ^ Typechecker context stack depth
413

414
415
  dphBackend            :: DPHBackend,

416
  thisPackage           :: PackageId,   -- ^ name of package currently being compiled
417
418

  -- ways
419
  ways                  :: [Way],       -- ^ Way flags from the command line
420
421
  buildTag              :: String,      -- ^ The global \"way\" (e.g. \"p\" for prof)
  rtsBuildTag           :: String,      -- ^ The RTS \"way\"
Ian Lynagh's avatar
Ian Lynagh committed
422

423
424
425
  -- For object splitting
  splitInfo             :: Maybe (String,Int),

426
  -- paths etc.
Ian Lynagh's avatar
Ian Lynagh committed
427
  objectDir             :: Maybe String,
428
  dylibInstallName      :: Maybe String,
Ian Lynagh's avatar
Ian Lynagh committed
429
430
  hiDir                 :: Maybe String,
  stubDir               :: Maybe String,
431

Ian Lynagh's avatar
Ian Lynagh committed
432
433
434
  objectSuf             :: String,
  hcSuf                 :: String,
  hiSuf                 :: String,
435

Ian Lynagh's avatar
Ian Lynagh committed
436
437
438
  outputFile            :: Maybe String,
  outputHi              :: Maybe String,
  dynLibLoader          :: DynLibLoader,
439

440
  -- | This is set by 'DriverPipeline.runPipeline' based on where
Ian Lynagh's avatar
Ian Lynagh committed
441
442
  --    its output is going.
  dumpPrefix            :: Maybe FilePath,
443

444
445
  -- | Override the 'dumpPrefix' set by 'DriverPipeline.runPipeline'.
  --    Set by @-ddump-file-prefix@
Ian Lynagh's avatar
Ian Lynagh committed
446
447
448
449
450
451
452
  dumpPrefixForce       :: Maybe FilePath,

  includePaths          :: [String],
  libraryPaths          :: [String],
  frameworkPaths        :: [String],    -- used on darwin only
  cmdlineFrameworks     :: [String],    -- ditto

453
  rtsOpts               :: Maybe String,
Ian Lynagh's avatar
Ian Lynagh committed
454
  rtsOptsEnabled        :: RtsOptsEnabled,
455

456
  hpcDir                :: String,      -- ^ Path to store the .mix files
andy@galois.com's avatar
andy@galois.com committed
457

458
  settings              :: Settings,
459

460
461
462
463
464
465
  --  For ghc -M
  depMakefile           :: FilePath,
  depIncludePkgDeps     :: Bool,
  depExcludeMods        :: [ModuleName],
  depSuffixes           :: [String],

466
  --  Package flags
Ian Lynagh's avatar
Ian Lynagh committed
467
  extraPkgConfs         :: [FilePath],
468
        -- ^ The @-package-conf@ flags given on the command line, in the order
Ian Lynagh's avatar
Ian Lynagh committed
469
        -- they appeared.
470

Ian Lynagh's avatar
Ian Lynagh committed
471
  packageFlags          :: [PackageFlag],
472
        -- ^ The @-package@ and @-hide-package@ flags from the command-line
473

474
  -- Package state
Ian Lynagh's avatar
Ian Lynagh committed
475
  -- NB. do not modify this field, it is calculated by
476
  -- Packages.initPackages and Packages.updatePackages.
477
  pkgDatabase           :: Maybe [PackageConfig],
Ian Lynagh's avatar
Ian Lynagh committed
478
  pkgState              :: PackageState,
479

480
481
482
483
  -- Temporary files
  -- These have to be IORefs, because the defaultCleanupHandler needs to
  -- know what to clean when an exception happens
  filesToClean          :: IORef [FilePath],
484
  dirsToClean           :: IORef (Map FilePath FilePath),
485

486
  -- hsc dynamic flags
Ian Lynagh's avatar
Ian Lynagh committed
487
  flags                 :: [DynFlag],
488
  -- Don't change this without updating extensionFlags:
489
  language              :: Maybe Language,
490
491
492
493
494
  -- Don't change this without updating extensionFlags:
  extensions            :: [OnOff ExtensionFlag],
  -- extensionFlags should always be equal to
  --     flattenExtensionFlags language extensions
  extensionFlags        :: [ExtensionFlag],
Ian Lynagh's avatar
Ian Lynagh committed
495

496
  -- | Message output action: use "ErrUtils" instead of this if you can
David Waern's avatar
David Waern committed
497
498
499
  log_action            :: Severity -> SrcSpan -> PprStyle -> Message -> IO (),

  haddockOptions :: Maybe String
500
501
 }

502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
data Settings = Settings {
  sGhcUsagePath          :: FilePath,    -- Filled in by SysTools
  sGhciUsagePath         :: FilePath,    -- ditto
  sTopDir                :: FilePath,
  sTmpDir                :: String,      -- no trailing '/'
  -- You shouldn't need to look things up in rawSettings directly.
  -- They should have their own fields instead.
  sRawSettings           :: [(String, String)],
  sExtraGccViaCFlags     :: [String],
  sSystemPackageConfig   :: FilePath,
  -- commands for particular phases
  sPgm_L                 :: String,
  sPgm_P                 :: (String,[Option]),
  sPgm_F                 :: String,
  sPgm_c                 :: (String,[Option]),
  sPgm_s                 :: (String,[Option]),
  sPgm_a                 :: (String,[Option]),
  sPgm_l                 :: (String,[Option]),
  sPgm_dll               :: (String,[Option]),
  sPgm_T                 :: String,
  sPgm_sysman            :: String,
  sPgm_windres           :: String,
  sPgm_lo                :: (String,[Option]), -- LLVM: opt llvm optimiser
525
526
527
528
529
530
531
532
533
534
535
536
537
  sPgm_lc                :: (String,[Option]), -- LLVM: llc static compiler
  -- options for particular phases
  sOpt_L                 :: [String],
  sOpt_P                 :: [String],
  sOpt_F                 :: [String],
  sOpt_c                 :: [String],
  sOpt_m                 :: [String],
  sOpt_a                 :: [String],
  sOpt_l                 :: [String],
  sOpt_windres           :: [String],
  sOpt_lo                :: [String], -- LLVM: llvm optimiser
  sOpt_lc                :: [String]  -- LLVM: llc static compiler

538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
 }

ghcUsagePath          :: DynFlags -> FilePath
ghcUsagePath dflags = sGhcUsagePath (settings dflags)
ghciUsagePath         :: DynFlags -> FilePath
ghciUsagePath dflags = sGhciUsagePath (settings dflags)
topDir                :: DynFlags -> FilePath
topDir dflags = sTopDir (settings dflags)
tmpDir                :: DynFlags -> String
tmpDir dflags = sTmpDir (settings dflags)
rawSettings           :: DynFlags -> [(String, String)]
rawSettings dflags = sRawSettings (settings dflags)
extraGccViaCFlags     :: DynFlags -> [String]
extraGccViaCFlags dflags = sExtraGccViaCFlags (settings dflags)
systemPackageConfig   :: DynFlags -> FilePath
systemPackageConfig dflags = sSystemPackageConfig (settings dflags)
pgm_L                 :: DynFlags -> String
pgm_L dflags = sPgm_L (settings dflags)
pgm_P                 :: DynFlags -> (String,[Option])
pgm_P dflags = sPgm_P (settings dflags)
pgm_F                 :: DynFlags -> String
pgm_F dflags = sPgm_F (settings dflags)
pgm_c                 :: DynFlags -> (String,[Option])
pgm_c dflags = sPgm_c (settings dflags)
pgm_s                 :: DynFlags -> (String,[Option])
pgm_s dflags = sPgm_s (settings dflags)
pgm_a                 :: DynFlags -> (String,[Option])
pgm_a dflags = sPgm_a (settings dflags)
pgm_l                 :: DynFlags -> (String,[Option])
pgm_l dflags = sPgm_l (settings dflags)
pgm_dll               :: DynFlags -> (String,[Option])
pgm_dll dflags = sPgm_dll (settings dflags)
pgm_T                 :: DynFlags -> String
pgm_T dflags = sPgm_T (settings dflags)
pgm_sysman            :: DynFlags -> String
pgm_sysman dflags = sPgm_sysman (settings dflags)
pgm_windres           :: DynFlags -> String
pgm_windres dflags = sPgm_windres (settings dflags)
pgm_lo                :: DynFlags -> (String,[Option])
pgm_lo dflags = sPgm_lo (settings dflags)
pgm_lc                :: DynFlags -> (String,[Option])
pgm_lc dflags = sPgm_lc (settings dflags)
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
opt_L                 :: DynFlags -> [String]
opt_L dflags = sOpt_L (settings dflags)
opt_P                 :: DynFlags -> [String]
opt_P dflags = sOpt_P (settings dflags)
opt_F                 :: DynFlags -> [String]
opt_F dflags = sOpt_F (settings dflags)
opt_c                 :: DynFlags -> [String]
opt_c dflags = sOpt_c (settings dflags)
opt_m                 :: DynFlags -> [String]
opt_m dflags = sOpt_m (settings dflags)
opt_a                 :: DynFlags -> [String]
opt_a dflags = sOpt_a (settings dflags)
opt_l                 :: DynFlags -> [String]
opt_l dflags = sOpt_l (settings dflags)
opt_windres           :: DynFlags -> [String]
opt_windres dflags = sOpt_windres (settings dflags)
opt_lo                :: DynFlags -> [String]
opt_lo dflags = sOpt_lo (settings dflags)
opt_lc                :: DynFlags -> [String]
opt_lc dflags = sOpt_lc (settings dflags)
600

601
602
603
wayNames :: DynFlags -> [WayName]
wayNames = map wayName . ways

604
605
-- | The target code type of the compilation (if any).
--
606
607
608
-- Whenever you change the target, also make sure to set 'ghcLink' to
-- something sensible.
--
609
610
611
612
-- 'HscNothing' can be used to avoid generating any output, however, note
-- that:
--
--  * This will not run the desugaring step, thus no warnings generated in
613
614
615
--    this step will be output.  In particular, this includes warnings related
--    to pattern matching.  You can run the desugarer manually using
--    'GHC.desugarModule'.
616
--
617
618
619
620
621
622
--  * If a program uses Template Haskell the typechecker may try to run code
--    from an imported module.  This will fail if no code has been generated
--    for this module.  You can use 'GHC.needsTemplateHaskell' to detect
--    whether this might be the case and choose to either switch to a
--    different target or avoid typechecking such modules.  (The latter may
--    preferable for security reasons.)
623
--
624
data HscTarget
625
626
  = HscC           -- ^ Generate C code.
  | HscAsm         -- ^ Generate assembly using the native code generator.
627
  | HscLlvm        -- ^ Generate assembly using the llvm code generator.
628
629
630
  | HscJava        -- ^ Generate Java bytecode.
  | HscInterpreted -- ^ Generate bytecode.  (Requires 'LinkInMemory')
  | HscNothing     -- ^ Don't generate any code.  See notes above.
631
632
  deriving (Eq, Show)

633
-- | Will this target result in an object file on the disk?
634
635
636
isObjectTarget :: HscTarget -> Bool
isObjectTarget HscC     = True
isObjectTarget HscAsm   = True
637
isObjectTarget HscLlvm  = True
638
639
640
641
642
643
644
645
isObjectTarget _        = False

-- | The 'GhcMode' tells us whether we're doing multi-module
-- compilation (controlled via the "GHC" API) or one-shot
-- (single-module) compilation.  This makes a difference primarily to
-- the "Finder": in one-shot mode we look for interface files for
-- imported modules, but in multi-module mode we look for source files
-- in order to check whether they need to be recompiled.
646
data GhcMode
647
648
649
  = CompManager         -- ^ @\-\-make@, GHCi, etc.
  | OneShot             -- ^ @ghc -c Foo.hs@
  | MkDepend            -- ^ @ghc -M@, see "Finder" for why we need this
650
651
  deriving Eq

652
653
654
655
656
instance Outputable GhcMode where
  ppr CompManager = ptext (sLit "CompManager")
  ppr OneShot     = ptext (sLit "OneShot")
  ppr MkDepend    = ptext (sLit "MkDepend")

657
658
659
660
isOneShot :: GhcMode -> Bool
isOneShot OneShot = True
isOneShot _other  = False

661
662
663
664
-- | What to do in the link step, if there is one.
data GhcLink
  = NoLink              -- ^ Don't link at all
  | LinkBinary          -- ^ Link object code into a binary
665
666
  | LinkInMemory        -- ^ Use the in-memory dynamic linker (works for both
                        --   bytecode and object code).
667
  | LinkDynLib          -- ^ Link objects into a dynamic lib (DLL on Windows, DSO on ELF platforms)
668
  deriving (Eq, Show)
669
670
671

isNoLink :: GhcLink -> Bool
isNoLink NoLink = True
twanvl's avatar
twanvl committed
672
isNoLink _      = False
673

674
675
676
-- Is it worth evaluating this Bool and caching it in the DynFlags value
-- during initDynFlags?
doingTickyProfiling :: DynFlags -> Bool
677
678
679
doingTickyProfiling _ = opt_Ticky
  -- XXX -ticky is a static flag, because it implies -debug which is also
  -- static.  If the way flags were made dynamic, we could fix this.
680

681
682
data PackageFlag
  = ExposePackage  String
683
  | ExposePackageId String
684
685
  | HidePackage    String
  | IgnorePackage  String
686
  deriving Eq
687

twanvl's avatar
twanvl committed
688
defaultHscTarget :: HscTarget
689
690
defaultHscTarget = defaultObjectTarget

691
-- | The 'HscTarget' value corresponding to the default way to create
692
-- object files on the current platform.
twanvl's avatar
twanvl committed
693
defaultObjectTarget :: HscTarget
694
defaultObjectTarget
Ian Lynagh's avatar
Ian Lynagh committed
695
696
  | cGhcWithNativeCodeGen == "YES"      =  HscAsm
  | otherwise                           =  HscC
697

698
699
700
701
702
data DynLibLoader
  = Deployable
  | SystemDependent
  deriving Eq

Ian Lynagh's avatar
Ian Lynagh committed
703
data RtsOptsEnabled = RtsOptsNone | RtsOptsSafeOnly | RtsOptsAll
704
  deriving (Show)
Ian Lynagh's avatar
Ian Lynagh committed
705

706
-- | Used by 'GHC.newSession' to partially initialize a new 'DynFlags' value
twanvl's avatar
twanvl committed
707
initDynFlags :: DynFlags -> IO DynFlags
708
709
710
initDynFlags dflags = do
 -- someday these will be dynamic flags
 ways <- readIORef v_Ways
711
 refFilesToClean <- newIORef []
712
 refDirsToClean <- newIORef Map.empty
713
 return dflags{
714
715
716
        ways            = ways,
        buildTag        = mkBuildTag (filter (not . wayRTSOnly) ways),
        rtsBuildTag     = mkBuildTag ways,
717
718
        filesToClean    = refFilesToClean,
        dirsToClean     = refDirsToClean
Ian Lynagh's avatar
Ian Lynagh committed
719
        }
720

721
722
-- | The normal 'DynFlags'. Note that they is not suitable for use in this form
-- and must be fully initialized by 'GHC.newSession' first.
723
724
defaultDynFlags :: Settings -> DynFlags
defaultDynFlags mySettings =
725
     DynFlags {
Ian Lynagh's avatar
Ian Lynagh committed
726
727
728
729
730
731
732
        ghcMode                 = CompManager,
        ghcLink                 = LinkBinary,
        hscTarget               = defaultHscTarget,
        hscOutName              = "",
        extCoreName             = "",
        verbosity               = 0,
        optLevel                = 0,
733
        simplPhases             = 2,
Ian Lynagh's avatar
Ian Lynagh committed
734
        maxSimplIterations      = 4,
735
        shouldDumpSimplPhase    = Nothing,
Ian Lynagh's avatar
Ian Lynagh committed
736
737
738
        ruleCheck               = Nothing,
        specConstrThreshold     = Just 200,
        specConstrCount         = Just 3,
739
        liberateCaseThreshold   = Just 200,
740
        floatLamArgs            = Just 0,	-- Default: float only if no fvs
741
742
        strictnessBefore        = [],

743
#ifndef OMIT_NATIVE_CODEGEN
744
        targetPlatform          = defaultTargetPlatform,
745
#endif
Ian Lynagh's avatar
Ian Lynagh committed
746
747
748
749
750
751
        cmdlineHcIncludes       = [],
        importPaths             = ["."],
        mainModIs               = mAIN,
        mainFunIs               = Nothing,
        ctxtStkDepth            = mAX_CONTEXT_REDUCTION_DEPTH,

chak@cse.unsw.edu.au.'s avatar
chak@cse.unsw.edu.au. committed
752
        dphBackend              = DPHNone,
753

Ian Lynagh's avatar
Ian Lynagh committed
754
755
756
        thisPackage             = mainPackageId,

        objectDir               = Nothing,
757
        dylibInstallName        = Nothing,
Ian Lynagh's avatar
Ian Lynagh committed
758
759
760
761
762
763
764
765
766
        hiDir                   = Nothing,
        stubDir                 = Nothing,

        objectSuf               = phaseInputExt StopLn,
        hcSuf                   = phaseInputExt HCc,
        hiSuf                   = "hi",

        outputFile              = Nothing,
        outputHi                = Nothing,
767
        dynLibLoader            = SystemDependent,
Ian Lynagh's avatar
Ian Lynagh committed
768
769
770
771
772
773
        dumpPrefix              = Nothing,
        dumpPrefixForce         = Nothing,
        includePaths            = [],
        libraryPaths            = [],
        frameworkPaths          = [],
        cmdlineFrameworks       = [],
774
        rtsOpts                 = Nothing,
Ian Lynagh's avatar
Ian Lynagh committed
775
        rtsOptsEnabled          = RtsOptsSafeOnly,
Ian Lynagh's avatar
Ian Lynagh committed
776
777
778
779
780

        hpcDir                  = ".hpc",

        extraPkgConfs           = [],
        packageFlags            = [],
781
782
        pkgDatabase             = Nothing,
        pkgState                = panic "no package state yet: call GHC.setSessionDynFlags",
783
        ways                    = panic "defaultDynFlags: No ways",
Ian Lynagh's avatar
Ian Lynagh committed
784
785
        buildTag                = panic "defaultDynFlags: No buildTag",
        rtsBuildTag             = panic "defaultDynFlags: No rtsBuildTag",
786
        splitInfo               = Nothing,
787
        settings                = mySettings,
788
789
790
791
792
793
        -- ghc -M values
        depMakefile       = "Makefile",
        depIncludePkgDeps = False,
        depExcludeMods    = [],
        depSuffixes       = [],
        -- end of ghc -M values
794
795
        filesToClean   = panic "defaultDynFlags: No filesToClean",
        dirsToClean    = panic "defaultDynFlags: No dirsToClean",
Ian Lynagh's avatar
Ian Lynagh committed
796
        haddockOptions = Nothing,
797
        flags = defaultFlags,
798
        language = Nothing,
799
800
        extensions = [],
        extensionFlags = flattenExtensionFlags Nothing [],
801

Ian Lynagh's avatar
Ian Lynagh committed
802
        log_action = \severity srcSpan style msg ->
803
                        case severity of
804
805
806
807
                          SevOutput -> printOutput (msg style)
                          SevInfo   -> printErrs (msg style)
                          SevFatal  -> printErrs (msg style)
                          _         -> do 
808
809
810
811
812
                                hPutChar stderr '\n'
                                printErrs ((mkLocMessage srcSpan msg) style)
                     -- careful (#2302): printErrs prints in UTF-8, whereas
                     -- converting to string first and using hPutStr would
                     -- just emit the low 8 bits of each unicode char.
813
814
      }

Ian Lynagh's avatar
Ian Lynagh committed
815
{-
816
817
Note [Verbosity levels]
~~~~~~~~~~~~~~~~~~~~~~~
Ian Lynagh's avatar
Ian Lynagh committed
818
    0   |   print errors & warnings only
819
820
821
822
823
824
825
    1   |   minimal verbosity: print "compiling M ... done." for each module.
    2   |   equivalent to -dshow-passes
    3   |   equivalent to existing "ghc -v"
    4   |   "ghc -v -ddump-most"
    5   |   "ghc -v -ddump-all"
-}

826
827
828
829
830
data OnOff a = On a
             | Off a

-- OnOffs accumulate in reverse order, so we use foldr in order to
-- process them in the right order
831
832
833
flattenExtensionFlags :: Maybe Language -> [OnOff ExtensionFlag]
                      -> [ExtensionFlag]
flattenExtensionFlags ml = foldr f defaultExtensionFlags
834
835
    where f (On f)  flags = f : delete f flags
          f (Off f) flags =     delete f flags
836
837
838
          defaultExtensionFlags = languageExtensions ml

languageExtensions :: Maybe Language -> [ExtensionFlag]
simonpj@microsoft.com's avatar
simonpj@microsoft.com committed
839

840
languageExtensions Nothing
simonpj@microsoft.com's avatar
simonpj@microsoft.com committed
841
    -- Nothing => the default case
842
843
844
    = Opt_MonoPatBinds   -- Experimentally, I'm making this non-standard
                         -- behaviour the default, to see if anyone notices
                         -- SLPJ July 06
Ian Lynagh's avatar
Ian Lynagh committed
845
      -- In due course I'd like Opt_MonoLocalBinds to be on by default
simonpj@microsoft.com's avatar
simonpj@microsoft.com committed
846
      -- But NB it's implied by GADTs etc
Ian Lynagh's avatar
Ian Lynagh committed
847
      -- SLPJ September 2010
848
    : Opt_NondecreasingIndentation -- This has been on by default for some time
849
    : languageExtensions (Just Haskell2010)
simonpj@microsoft.com's avatar
simonpj@microsoft.com committed
850

851
852
853
854
languageExtensions (Just Haskell98)
    = [Opt_ImplicitPrelude,
       Opt_MonomorphismRestriction,
       Opt_NPlusKPatterns,
855
856
857
858
859
860
861
862
       Opt_DatatypeContexts,
       Opt_NondecreasingIndentation
           -- strictly speaking non-standard, but we always had this
           -- on implicitly before the option was added in 7.1, and
           -- turning it off breaks code, so we're keeping it on for
           -- backwards compatibility.  Cabal uses -XHaskell98 by
           -- default unless you specify another language.
      ]
simonpj@microsoft.com's avatar
simonpj@microsoft.com committed
863

864
865
866
867
868
869
870
languageExtensions (Just Haskell2010)
    = [Opt_ImplicitPrelude,
       Opt_MonomorphismRestriction,
       Opt_DatatypeContexts,
       Opt_EmptyDataDecls,
       Opt_ForeignFunctionInterface,
       Opt_PatternGuards,
Ian Lynagh's avatar
Ian Lynagh committed
871
       Opt_DoAndIfThenElse,
872
       Opt_RelaxedPolyRec]
873

874
-- | Test whether a 'DynFlag' is set
875
876
dopt :: DynFlag -> DynFlags -> Bool
dopt f dflags  = f `elem` (flags dflags)
877

878
-- | Set a 'DynFlag'
879
880
dopt_set :: DynFlags -> DynFlag -> DynFlags
dopt_set dfs f = dfs{ flags = f : flags dfs }
881

882
-- | Unset a 'DynFlag'
883
884
dopt_unset :: DynFlags -> DynFlag -> DynFlags
dopt_unset dfs f = dfs{ flags = filter (/= f) (flags dfs) }
885

886
-- | Test whether a 'ExtensionFlag' is set
887
xopt :: ExtensionFlag -> DynFlags -> Bool
888
xopt f dflags = f `elem` extensionFlags dflags
889

890
-- | Set a 'ExtensionFlag'
891
xopt_set :: DynFlags -> ExtensionFlag -> DynFlags
892
893
894
895
xopt_set dfs f
    = let onoffs = On f : extensions dfs
      in dfs { extensions = onoffs,
               extensionFlags = flattenExtensionFlags (language dfs) onoffs }
896

897
-- | Unset a 'ExtensionFlag'
898
xopt_unset :: DynFlags -> ExtensionFlag -> DynFlags
899
900
901
902
xopt_unset dfs f
    = let onoffs = Off f : extensions dfs
      in dfs { extensions = onoffs,
               extensionFlags = flattenExtensionFlags (language dfs) onoffs }
903

904
905
906
907
908
909
910
911
setLanguage :: Language -> DynP ()
setLanguage l = upd f
    where f dfs = let mLang = Just l
                      oneoffs = extensions dfs
                  in dfs {
                         language = mLang,
                         extensionFlags = flattenExtensionFlags mLang oneoffs
                     }
912

913
914
915
916
-- | Retrieve the options corresponding to a particular @opt_*@ field in the correct order
getOpts :: DynFlags             -- ^ 'DynFlags' to retrieve the options from
        -> (DynFlags -> [a])    -- ^ Relevant record accessor: one of the @opt_*@ accessors
        -> [a]                  -- ^ Correctly ordered extracted options
917
getOpts dflags opts = reverse (opts dflags)
Ian Lynagh's avatar
Ian Lynagh committed
918
        -- We add to the options from the front, so we need to reverse the list
919

920
921
-- | Gets the verbosity flag for the current verbosity level. This is fed to
-- other tools, so GHC-specific verbosity flags like @-ddump-most@ are not included
922
923
924
925
getVerbFlags :: DynFlags -> [String]
getVerbFlags dflags
  | verbosity dflags >= 4 = ["-v"]
  | otherwise             = []
926

927
setObjectDir, setHiDir, setStubDir, setOutputDir, setDylibInstallName,
Simon Marlow's avatar
Simon Marlow committed
928
         setObjectSuf, setHiSuf, setHcSuf, parseDynLibLoaderMode,
929
         setPgmP, addOptl, addOptP,
930
         addCmdlineFramework, addHaddockOpts
twanvl's avatar
twanvl committed
931
932
933
934
   :: String -> DynFlags -> DynFlags
setOutputFile, setOutputHi, setDumpPrefixForce
   :: Maybe String -> DynFlags -> DynFlags

935
936
937
938
setObjectDir  f d = d{ objectDir  = Just f}
setHiDir      f d = d{ hiDir      = Just f}
setStubDir    f d = d{ stubDir    = Just f, includePaths = f : includePaths d }
  -- -stubdir D adds an implicit -I D, so that gcc can find the _stub.h file
Ian Lynagh's avatar
Ian Lynagh committed
939
940
  -- \#included from the .hc file when compiling via C (i.e. unregisterised
  -- builds).
Simon Marlow's avatar
Simon Marlow committed
941
setOutputDir  f = setObjectDir f . setHiDir f . setStubDir f
942
setDylibInstallName  f d = d{ dylibInstallName = Just f}
943

944
945
setObjectSuf  f d = d{ objectSuf  = f}
setHiSuf      f d = d{ hiSuf      = f}
946
947
948
949
setHcSuf      f d = d{ hcSuf      = f}

setOutputFile f d = d{ outputFile = f}
setOutputHi   f d = d{ outputHi   = f}
950

951
952
953
954
parseDynLibLoaderMode f d =
 case splitAt 8 f of
   ("deploy", "")       -> d{ dynLibLoader = Deployable }
   ("sysdep", "")       -> d{ dynLibLoader = SystemDependent }
955
   _                    -> ghcError (CmdLineError ("Unknown dynlib loader: " ++ f))
956

957
958
setDumpPrefixForce f d = d { dumpPrefixForce = f}

959
960
-- XXX HACK: Prelude> words "'does not' work" ===> ["'does","not'","work"]
-- Config.hs should really use Option.
961
setPgmP   f = let (pgm:args) = words f in alterSettings (\s -> s { sPgm_P   = (pgm, map Option args)})
962
963
addOptl   f = alterSettings (\s -> s { sOpt_l   = f : sOpt_l s})
addOptP   f = alterSettings (\s -> s { sOpt_P   = f : sOpt_P s})
964

965

966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
setDepMakefile :: FilePath -> DynFlags -> DynFlags
setDepMakefile f d = d { depMakefile = deOptDep f }

setDepIncludePkgDeps :: Bool -> DynFlags -> DynFlags
setDepIncludePkgDeps b d = d { depIncludePkgDeps = b }

addDepExcludeMod :: String -> DynFlags -> DynFlags
addDepExcludeMod m d
    = d { depExcludeMods = mkModuleName (deOptDep m) : depExcludeMods d }

addDepSuffix :: FilePath -> DynFlags -> DynFlags
addDepSuffix s d = d { depSuffixes = deOptDep s : depSuffixes d }

-- XXX Legacy code:
-- We used to use "-optdep-flag -optdeparg", so for legacy applications
-- we need to strip the "-optdep" off of the arg
deOptDep :: String -> String
983
deOptDep x = case stripPrefix "-optdep" x of
984
985
986
             Just rest -> rest
             Nothing -> x

987
988
addCmdlineFramework f d = d{ cmdlineFrameworks = f : cm