DynFlags.hs 215 KB
Newer Older
1
{-# LANGUAGE CPP #-}
2
{-# LANGUAGE FlexibleInstances #-}
Rufflewind's avatar
Rufflewind committed
3
{-# LANGUAGE ScopedTypeVariables #-}
4

dterei's avatar
dterei committed
5
-------------------------------------------------------------------------------
6
--
dterei's avatar
dterei committed
7
8
9
10
11
12
-- | Dynamic flags
--
-- Most flags are dynamic flags, which means they can change from 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.
13
14
15
--
-- (c) The University of Glasgow 2005
--
dterei's avatar
dterei committed
16
-------------------------------------------------------------------------------
17

18
{-# OPTIONS_GHC -fno-cse #-}
19
20
-- -fno-cse is needed for GLOBAL_VAR's to behave properly

21
module DynFlags (
22
        -- * Dynamic flags and associated configuration types
23
        DumpFlag(..),
24
        GeneralFlag(..),
25
        WarningFlag(..), WarnReason(..),
26
        Language(..),
27
        PlatformConstants(..),
Ian Lynagh's avatar
Ian Lynagh committed
28
        FatalMessager, LogAction, FlushOut(..), FlushErr(..),
29
        ProfAuto(..),
30
        glasgowExtsFlags,
31
        dopt, dopt_set, dopt_unset,
triple's avatar
triple committed
32
        gopt, gopt_set, gopt_unset, setGeneralFlag', unSetGeneralFlag',
33
        wopt, wopt_set, wopt_unset,
34
        wopt_fatal,
35
        xopt, xopt_set, xopt_unset,
36
        lang_set,
37
        useUnicodeSyntax,
38
39
        whenGeneratingDynamicToo, ifGeneratingDynamicToo,
        whenCannotGenerateDynamicToo,
40
        dynamicTooMkDynamicDynFlags,
Ian Lynagh's avatar
Ian Lynagh committed
41
        DynFlags(..),
42
        FlagSpec(..),
Ian Lynagh's avatar
Ian Lynagh committed
43
        HasDynFlags(..), ContainsDynFlags(..),
44
        OverridingBool(..), overrideWith,
Ian Lynagh's avatar
Ian Lynagh committed
45
        RtsOptsEnabled(..),
Ian Lynagh's avatar
Ian Lynagh committed
46
        HscTarget(..), isObjectTarget, defaultObjectTarget,
47
        targetRetainsAllBindings,
Ian Lynagh's avatar
Ian Lynagh committed
48
49
        GhcMode(..), isOneShot,
        GhcLink(..), isNoLink,
50
        PackageFlag(..), PackageArg(..), ModRenaming(..),
51
        IgnorePackageFlag(..), TrustFlag(..),
52
        PkgConfRef(..),
Ian Lynagh's avatar
Ian Lynagh committed
53
        Option(..), showOpt,
Ian Lynagh's avatar
Ian Lynagh committed
54
        DynLibLoader(..),
55
56
        fFlags, fLangFlags, xFlags,
        wWarningFlags,
57
        dynFlagDependencies,
58
        tablesNextToCode, mkTablesNextToCode,
Ben Gamari's avatar
Ben Gamari committed
59
        makeDynFlagsConsistent,
60

61
        Way(..), mkBuildTag, wayRTSOnly, addWay', updateWays,
62
        wayGeneralFlags, wayUnsetGeneralFlags,
ian@well-typed.com's avatar
ian@well-typed.com committed
63

64
65
        thisPackage, thisComponentId, thisUnitIdInsts,

66
        -- ** Safe Haskell
67
        SafeHaskellMode(..),
68
        safeHaskellOn, safeImportsOn, safeLanguageOn, safeInferOn,
69
        packageTrustOn,
70
        safeDirectImpsReq, safeImplicitImpsReq,
71
        unsafeFlags, unsafeFlagsForInfer,
72

73
        -- ** System tool settings and locations
74
        Settings(..),
75
        targetPlatform, programName, projectVersion,
76
        ghcUsagePath, ghciUsagePath, topDir, tmpDir, rawSettings,
Edsko de Vries's avatar
Edsko de Vries committed
77
        versionedAppDir,
78
79
        extraGccViaCFlags, systemPackageConfig,
        pgm_L, pgm_P, pgm_F, pgm_c, pgm_s, pgm_a, pgm_l, pgm_dll, pgm_T,
80
81
        pgm_windres, pgm_libtool, pgm_lo, pgm_lc, pgm_i,
        opt_L, opt_P, opt_F, opt_c, opt_a, opt_l, opt_i,
82
        opt_windres, opt_lo, opt_lc,
83
84


85
        -- ** Manipulating DynFlags
86
        defaultDynFlags,                -- Settings -> DynFlags
87
        defaultWays,
ian@well-typed.com's avatar
ian@well-typed.com committed
88
        interpWays,
89
        interpreterProfiled, interpreterDynamic,
Ian Lynagh's avatar
Ian Lynagh committed
90
        initDynFlags,                   -- DynFlags -> IO DynFlags
Ian Lynagh's avatar
Ian Lynagh committed
91
        defaultFatalMessager,
92
        defaultLogAction,
93
        defaultLogActionHPrintDoc,
94
        defaultLogActionHPutStrDoc,
95
96
        defaultFlushOut,
        defaultFlushErr,
Ian Lynagh's avatar
Ian Lynagh committed
97

98
        getOpts,                        -- DynFlags -> (DynFlags -> [a]) -> [a]
99
        getVerbFlags,
Ian Lynagh's avatar
Ian Lynagh committed
100
101
        updOptLevel,
        setTmpDir,
102
        setUnitId,
Edsko de Vries's avatar
Edsko de Vries committed
103
        interpretPackageEnv,
Edward Z. Yang's avatar
Edward Z. Yang committed
104
        canonicalizeHomeModule,
Ian Lynagh's avatar
Ian Lynagh committed
105

106
        -- ** Parsing DynFlags
107
108
        parseDynamicFlagsCmdLine,
        parseDynamicFilePragma,
109
110
111
        parseDynamicFlagsFull,

        -- ** Available DynFlags
112
        allNonDeprecatedFlags,
113
114
115
        flagsAll,
        flagsDynamic,
        flagsPackage,
116
        flagsForCompletion,
117

118
        supportedLanguagesAndExtensions,
119
        languageExtensions,
120

121
        -- ** DynFlags C compiler options
Ian Lynagh's avatar
Ian Lynagh committed
122
        picCCOpts, picPOpts,
123
124

        -- * Compiler configuration suitable for display to the user
125
126
        compilerInfo,

127
#ifdef GHCI
128
        rtsIsProfiled,
129
#endif
130
        dynamicGhc,
131

132
#include "GHCConstantsHaskellExports.hs"
133
        bLOCK_SIZE_W,
134
        wORD_SIZE_IN_BITS,
135
136
        tAG_MASK,
        mAX_PTR_TAG,
137
        tARGET_MIN_INT, tARGET_MAX_INT, tARGET_MAX_WORD,
138

139
140
        unsafeGlobalDynFlags, setUnsafeGlobalDynFlags,

141
        -- * SSE and AVX
142
        isSseEnabled,
143
144
        isSse2Enabled,
        isSse4_2Enabled,
145
146
        isAvxEnabled,
        isAvx2Enabled,
147
148
149
150
        isAvx512cdEnabled,
        isAvx512erEnabled,
        isAvx512fEnabled,
        isAvx512pfEnabled,
151

Austin Seipp's avatar
Austin Seipp committed
152
        -- * Linker/compiler information
153
        LinkerInfo(..),
Austin Seipp's avatar
Austin Seipp committed
154
        CompilerInfo(..),
155
156
157
158
  ) where

#include "HsVersions.h"

Rufflewind's avatar
Rufflewind committed
159
160
161
162
163
164
165
166
167
168
#if defined mingw32_HOST_OS && !defined WINAPI
# if defined i386_HOST_ARCH
#  define WINAPI stdcall
# elif defined x86_64_HOST_ARCH
#  define WINAPI ccall
# else
#  error unknown architecture
# endif
#endif

169
import Platform
170
import PlatformConstants
171
import Module
Simon Marlow's avatar
Simon Marlow committed
172
import PackageConfig
173
import {-# SOURCE #-} Hooks
174
import {-# SOURCE #-} PrelNames ( mAIN )
175
import {-# SOURCE #-} Packages (PackageState, emptyPackageState)
Ian Lynagh's avatar
Ian Lynagh committed
176
import DriverPhases     ( Phase(..), phaseInputExt )
177
178
import Config
import CmdLineParser
179
import Constants
180
import Panic
181
import Util
Edsko de Vries's avatar
Edsko de Vries committed
182
import Maybes
183
import MonadUtils
184
import qualified Pretty
185
import SrcLoc
186
import BasicTypes       ( IntWithInf, treatZeroAsInf )
187
import FastString
Simon Marlow's avatar
Simon Marlow committed
188
import Outputable
Ian Lynagh's avatar
Ian Lynagh committed
189
import Foreign.C        ( CInt(..) )
190
import System.IO.Unsafe ( unsafeDupablePerformIO )
191
import {-# SOURCE #-} ErrUtils ( Severity(..), MsgDoc, mkLocMessageAnn )
192

193
import System.IO.Unsafe ( unsafePerformIO )
194
import Data.IORef
195
import Control.Arrow ((&&&))
ian@well-typed.com's avatar
ian@well-typed.com committed
196
import Control.Monad
197
198
199
200
import Control.Monad.Trans.Class
import Control.Monad.Trans.Writer
import Control.Monad.Trans.Reader
import Control.Monad.Trans.Except
Rufflewind's avatar
Rufflewind committed
201
import Control.Exception (catch, throwIO)
simonpj@microsoft.com's avatar
simonpj@microsoft.com committed
202

203
import Data.Ord
204
import Data.Bits
205
import Data.Char
206
import Data.Int
207
import Data.List
208
209
import Data.Map (Map)
import qualified Data.Map as Map
210
211
import Data.Set (Set)
import qualified Data.Set as Set
212
import Data.Word
Ian Lynagh's avatar
Ian Lynagh committed
213
import System.FilePath
Edsko de Vries's avatar
Edsko de Vries committed
214
215
import System.Directory
import System.Environment (getEnv)
216
import System.IO
217
import System.IO.Error
Rufflewind's avatar
Rufflewind committed
218
219
220
221
222
#if defined MIN_VERSION_terminfo
import System.Console.Terminfo (SetupTermError, Terminal, getCapability,
                                setupTermFromEnv, termColors)
import System.Posix (queryTerminal, stdError)
#elif defined mingw32_HOST_OS
223
import Foreign (Ptr, with, peek)
Rufflewind's avatar
Rufflewind committed
224
225
226
import System.Environment (lookupEnv)
import qualified Graphics.Win32 as Win32
#endif
227
228
import Text.ParserCombinators.ReadP hiding (char)
import Text.ParserCombinators.ReadP as R
229

230
231
232
import Data.IntSet (IntSet)
import qualified Data.IntSet as IntSet

233
import GHC.Foreign (withCString, peekCString)
234
import qualified GHC.LanguageExtensions as LangExt
235

236
237
238
239
240
241
242
-- Note [Updating flag description in the User's Guide]
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--
-- If you modify anything in this file please make sure that your changes are
-- described in the User's Guide. Usually at least two sections need to be
-- updated:
--
243
244
--  * Flag Reference section generated from the modules in
--    utils/mkUserGuidePart/Options
245
--
246
--  * Flag description in docs/users_guide/using.rst provides a detailed
247
248
--    explanation of flags' usage.

249
250
251
252
253
254
255
256
257
258
259
260
-- Note [Supporting CLI completion]
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--
-- The command line interface completion (in for example bash) is an easy way
-- for the developer to learn what flags are available from GHC.
-- GHC helps by separating which flags are available when compiling with GHC,
-- and which flags are available when using GHCi.
-- A flag is assumed to either work in both these modes, or only in one of them.
-- When adding or changing a flag, please consider for which mode the flag will
-- have effect, and annotate it accordingly. For Flags use defFlag, defGhcFlag,
-- defGhciFlag, and for FlagSpec use flagSpec or flagGhciSpec.

261
262
263
264
265
266
267
-- Note [Adding a language extension]
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--
-- There are a few steps to adding (or removing) a language extension,
--
--  * Adding the extension to GHC.LanguageExtensions
--
268
269
--    The Extension type in libraries/ghc-boot-th/GHC/LanguageExtensions/Type.hs
--    is the canonical list of language extensions known by GHC.
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
--
--  * Adding a flag to DynFlags.xFlags
--
--    This is fairly self-explanatory. The name should be concise, memorable,
--    and consistent with any previous implementations of the similar idea in
--    other Haskell compilers.
--
--  * Adding the flag to the documentation
--
--    This is the same as any other flag. See
--    Note [Updating flag description in the User's Guide]
--
--  * Adding the flag to Cabal
--
--    The Cabal library has its own list of all language extensions supported
--    by all major compilers. This is the list that user code being uploaded
--    to Hackage is checked against to ensure language extension validity.
--    Consequently, it is very important that this list remains up-to-date.
--
--    To this end, there is a testsuite test (testsuite/tests/driver/T4437.hs)
--    whose job it is to ensure these GHC's extensions are consistent with
--    Cabal.
--
--    The recommended workflow is,
--
--     1. Temporarily add your new language extension to the
--        expectedGhcOnlyExtensions list in T4437 to ensure the test doesn't
--        break while Cabal is updated.
--
--     2. After your GHC change is accepted, submit a Cabal pull request adding
--        your new extension to Cabal's list (found in
--        Cabal/Language/Haskell/Extension.hs).
--
--     3. After your Cabal change is accepted, let the GHC developers know so
--        they can update the Cabal submodule and remove the extensions from
--        expectedGhcOnlyExtensions.
--
--  * Adding the flag to the GHC Wiki
--
--    There is a change log tracking language extension additions and removals
--    on the GHC wiki:  https://ghc.haskell.org/trac/ghc/wiki/LanguagePragmaHistory
--
--  See Trac #4437 and #8176.

314
315
316
-- -----------------------------------------------------------------------------
-- DynFlags

317
data DumpFlag
318
-- See Note [Updating flag description in the User's Guide]
319
320
321

   -- debugging flags
   = Opt_D_dump_cmm
322
   | Opt_D_dump_cmm_from_stg
323
   | Opt_D_dump_cmm_raw
324
325
326
327
   | Opt_D_dump_cmm_verbose
   -- All of the cmm subflags (there are a lot!) automatically
   -- enabled if you run -ddump-cmm-verbose
   -- Each flag corresponds to exact stage of Cmm pipeline.
328
329
   | Opt_D_dump_cmm_cfg
   | Opt_D_dump_cmm_cbe
330
   | Opt_D_dump_cmm_switch
331
332
   | Opt_D_dump_cmm_proc
   | Opt_D_dump_cmm_sp
333
334
   | Opt_D_dump_cmm_sink
   | Opt_D_dump_cmm_caf
335
336
337
338
339
   | Opt_D_dump_cmm_procmap
   | Opt_D_dump_cmm_split
   | Opt_D_dump_cmm_info
   | Opt_D_dump_cmm_cps
   -- end cmm subflags
340
   | Opt_D_dump_asm
341
342
343
344
345
   | Opt_D_dump_asm_native
   | Opt_D_dump_asm_liveness
   | Opt_D_dump_asm_regalloc
   | Opt_D_dump_asm_regalloc_stages
   | Opt_D_dump_asm_conflicts
346
   | Opt_D_dump_asm_stats
347
   | Opt_D_dump_asm_expanded
348
   | Opt_D_dump_llvm
349
   | Opt_D_dump_core_stats
350
351
352
353
   | Opt_D_dump_deriv
   | Opt_D_dump_ds
   | Opt_D_dump_foreign
   | Opt_D_dump_inlinings
354
   | Opt_D_dump_rule_firings
355
   | Opt_D_dump_rule_rewrites
356
   | Opt_D_dump_simpl_trace
357
358
359
   | Opt_D_dump_occur_anal
   | Opt_D_dump_parsed
   | Opt_D_dump_rn
Edward Z. Yang's avatar
Edward Z. Yang committed
360
   | Opt_D_dump_shape
361
362
363
364
365
   | Opt_D_dump_simpl
   | Opt_D_dump_simpl_iterations
   | Opt_D_dump_spec
   | Opt_D_dump_prep
   | Opt_D_dump_stg
366
   | Opt_D_dump_call_arity
367
   | Opt_D_dump_stranal
manav's avatar
manav committed
368
   | Opt_D_dump_str_signatures
369
370
371
372
373
374
375
376
377
   | 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
378
   | Opt_D_dump_cs_trace -- Constraint solver in type checker
379
   | Opt_D_dump_tc_trace
380
   | Opt_D_dump_ec_trace -- Pattern match exhaustiveness checker
381
   | Opt_D_dump_if_trace
382
   | Opt_D_dump_vt_trace
383
   | Opt_D_dump_splices
384
   | Opt_D_th_dec_file
385
386
   | Opt_D_dump_BCOs
   | Opt_D_dump_vect
387
   | Opt_D_dump_ticked
pepe's avatar
pepe committed
388
   | Opt_D_dump_rtti
389
390
391
392
   | Opt_D_source_stats
   | Opt_D_verbose_stg2stg
   | Opt_D_dump_hi
   | Opt_D_dump_hi_diffs
393
   | Opt_D_dump_mod_cycles
394
   | Opt_D_dump_mod_map
395
   | Opt_D_dump_view_pattern_commoning
396
   | Opt_D_verbose_core2core
397
   | Opt_D_dump_debug
398
399
400
401
402

   deriving (Eq, Show, Enum)

-- | Enumerates the simple on-or-off dynamic flags
data GeneralFlag
403
-- See Note [Updating flag description in the User's Guide]
404
405

   = Opt_DumpToFile                     -- ^ Append dump output to files instead of stdout.
406
   | Opt_D_faststring_stats
407
   | Opt_D_dump_minimal_imports
408
409
410
   | Opt_DoCoreLinting
   | Opt_DoStgLinting
   | Opt_DoCmmLinting
Ben.Lippmeier@anu.edu.au's avatar
Ben.Lippmeier@anu.edu.au committed
411
   | Opt_DoAsmLinting
Peter Wortmann's avatar
Peter Wortmann committed
412
   | Opt_DoAnnotationLinting
413
   | Opt_NoLlvmMangler                 -- hidden flag
414

Ian Lynagh's avatar
Ian Lynagh committed
415
   | Opt_WarnIsError                    -- -Werror; makes warnings fatal
416
   | Opt_ShowWarnGroups                 -- Show the group a warning belongs to
417
   | Opt_HideSourcePaths                -- Hide module source/object paths
418

419
   | Opt_PrintExplicitForalls
unknown's avatar
unknown committed
420
   | Opt_PrintExplicitKinds
421
   | Opt_PrintExplicitCoercions
422
   | Opt_PrintExplicitRuntimeReps
423
   | Opt_PrintEqualityRelations
424
   | Opt_PrintUnicodeSyntax
425
   | Opt_PrintExpandedSynonyms
426
   | Opt_PrintPotentialInstances
eir@cis.upenn.edu's avatar
eir@cis.upenn.edu committed
427
   | Opt_PrintTypecheckerElaboration
428

429
   -- optimisation opts
430
   | Opt_CallArity
431
   | Opt_Strictness
432
   | Opt_LateDmdAnal
433
434
   | Opt_KillAbsence
   | Opt_KillOneShot
435
   | Opt_FullLaziness
436
437
   | Opt_FloatIn
   | Opt_Specialise
438
   | Opt_SpecialiseAggressively
439
   | Opt_CrossModuleSpecialise
440
   | Opt_StaticArgumentTransformation
441
   | Opt_CSE
442
443
   | Opt_LiberateCase
   | Opt_SpecConstr
444
445
446
447
448
   | Opt_DoLambdaEtaExpansion
   | Opt_IgnoreAsserts
   | Opt_DoEtaReduction
   | Opt_CaseMerge
   | Opt_UnboxStrictFields
449
   | Opt_UnboxSmallStrictFields
450
   | Opt_DictsCheap
451
   | Opt_EnableRewriteRules             -- Apply rewrite rules during simplification
rl@cse.unsw.edu.au's avatar
rl@cse.unsw.edu.au committed
452
   | Opt_Vectorise
453
   | Opt_VectorisationAvoidance
Ian Lynagh's avatar
Ian Lynagh committed
454
455
   | Opt_RegsGraph                      -- do graph coloring register allocation
   | Opt_RegsIterative                  -- do iterative coalescing graph coloring register allocation
456
   | Opt_PedanticBottoms                -- Be picky about how we treat bottom
457
   | Opt_LlvmTBAA                       -- Use LLVM TBAA infastructure for improving AA (hidden flag)
458
   | Opt_LlvmPassVectorsInRegisters     -- Pass SIMD vectors in registers (requires a patched LLVM) (hidden flag)
459
   | Opt_LlvmFillUndefWithGarbage       -- Testing for undef bugs (hidden flag)
460
   | Opt_IrrefutableTuples
461
   | Opt_CmmSink
462
   | Opt_CmmElimCommonBlocks
463
   | Opt_OmitYields
464
   | Opt_FunToThunk               -- allow WwLib.mkWorkerArgs to remove all value lambdas
465
466
   | Opt_DictsStrict                     -- be strict in argument dictionaries
   | Opt_DmdTxDictSel              -- use a special demand transformer for dictionary selectors
467
   | Opt_Loopification                  -- See Note [Self-recursive tail calls]
468
   | Opt_CprAnal
469
   | Opt_WorkerWrapper
470

471
472
473
474
   -- Interface files
   | Opt_IgnoreInterfacePragmas
   | Opt_OmitInterfacePragmas
   | Opt_ExposeAllUnfoldings
475
   | Opt_WriteInterface -- forces .hi files to be written even with -fno-code
476

Ian Lynagh's avatar
Ian Lynagh committed
477
478
   -- profiling opts
   | Opt_AutoSccsOnIndividualCafs
479
   | Opt_ProfCountEntries
Ian Lynagh's avatar
Ian Lynagh committed
480

481
482
   -- misc opts
   | Opt_Pp
483
   | Opt_ForceRecomp
484
   | Opt_ExcessPrecision
485
   | Opt_EagerBlackHoling
486
487
   | Opt_NoHsMain
   | Opt_SplitObjs
488
   | Opt_SplitSections
489
   | Opt_StgStats
490
   | Opt_HideAllPackages
491
   | Opt_HideAllPluginPackages
492
   | Opt_PrintBindResult
493
   | Opt_Haddock
David Waern's avatar
David Waern committed
494
   | Opt_HaddockOptions
495
   | Opt_BreakOnException
496
   | Opt_BreakOnError
497
   | Opt_PrintEvldWithShow
498
   | Opt_PrintBindContents
499
500
   | Opt_GenManifest
   | Opt_EmbedManifest
Ian Lynagh's avatar
Ian Lynagh committed
501
   | Opt_SharedImplib
502
   | Opt_BuildingCabalPackage
503
   | Opt_IgnoreDotGhci
504
   | Opt_GhciSandbox
Ian Lynagh's avatar
Ian Lynagh committed
505
   | Opt_GhciHistory
506
   | Opt_LocalGhciHistory
507
   | Opt_HelpfulErrors
508
   | Opt_DeferTypeErrors
509
   | Opt_DeferTypedHoles
510
   | Opt_DeferOutOfScopeVariables
Ian Lynagh's avatar
Ian Lynagh committed
511
   | Opt_PIC
512
   | Opt_SccProfilingOn
ian@well-typed.com's avatar
ian@well-typed.com committed
513
   | Opt_Ticky
nfrisby's avatar
nfrisby committed
514
515
516
   | Opt_Ticky_Allocd
   | Opt_Ticky_LNE
   | Opt_Ticky_Dyn_Thunk
517
   | Opt_RPath
518
   | Opt_RelativeDynlibPaths
ian@well-typed.com's avatar
ian@well-typed.com committed
519
   | Opt_Hpc
520
   | Opt_FlatCache
521
   | Opt_ExternalInterpreter
Simon Marlow's avatar
Simon Marlow committed
522
   | Opt_OptimalApplicativeDo
523
   | Opt_VersionMacros
524

525
526
527
528
   -- PreInlining is on by default. The option is there just to see how
   -- bad things get if you turn it off!
   | Opt_SimplPreInlining

529
   -- output style opts
530
531
   | Opt_ErrorSpans -- Include full span info in error messages,
                    -- instead of just the start position.
532
   | Opt_PprCaseAsLet
Peter Wortmann's avatar
Peter Wortmann committed
533
   | Opt_PprShowTicks
534

535
536
537
538
539
540
541
542
543
544
545
   -- Suppress all coercions, them replacing with '...'
   | Opt_SuppressCoercions
   | Opt_SuppressVarKinds
   -- Suppress module id prefixes on variables.
   | Opt_SuppressModulePrefixes
   -- Suppress type applications.
   | Opt_SuppressTypeApplications
   -- Suppress info such as arity and unfoldings on identifiers.
   | Opt_SuppressIdInfo
   -- Suppress separate type signatures in core, but leave types on
   -- lambda bound vars
546
547
   | Opt_SuppressUnfoldings
   -- Suppress the details of even stable unfoldings
548
549
550
551
552
553
   | Opt_SuppressTypeSignatures
   -- Suppress unique ids on variables.
   -- Except for uniques, as some simplifier phases introduce new
   -- variables that have otherwise identical names.
   | Opt_SuppressUniques

554
   -- temporary flags
555
   | Opt_AutoLinkPackages
556
   | Opt_ImplicitImportQualified
557
558
559
560
561
562

   -- keeping stuff
   | Opt_KeepHiDiffs
   | Opt_KeepHcFiles
   | Opt_KeepSFiles
   | Opt_KeepTmpFiles
Jedai's avatar
Jedai committed
563
   | Opt_KeepRawTokenStream
564
   | Opt_KeepLlvmFiles
565
566
   | Opt_KeepHiFiles
   | Opt_KeepOFiles
567

568
569
   | Opt_BuildDynamicToo

570
   -- safe haskell flags
dterei's avatar
dterei committed
571
   | Opt_DistrustAllPackages
572
   | Opt_PackageTrust
573
   deriving (Eq, Show, Enum)
Ian Lynagh's avatar
Ian Lynagh committed
574

575
576
577
578
579
-- | Used when outputting warnings: if a reason is given, it is
-- displayed. If a warning isn't controlled by a flag, this is made
-- explicit at the point of use.
data WarnReason = NoReason | Reason !WarningFlag

580
data WarningFlag =
581
-- See Note [Updating flag description in the User's Guide]
582
     Opt_WarnDuplicateExports
583
   | Opt_WarnDuplicateConstraints
584
   | Opt_WarnRedundantConstraints
585
586
587
588
589
   | Opt_WarnHiShadows
   | Opt_WarnImplicitPrelude
   | Opt_WarnIncompletePatterns
   | Opt_WarnIncompleteUniPatterns
   | Opt_WarnIncompletePatternsRecUpd
590
   | Opt_WarnOverflowedLiterals
591
   | Opt_WarnEmptyEnumerations
592
593
594
   | Opt_WarnMissingFields
   | Opt_WarnMissingImportList
   | Opt_WarnMissingMethods
manav's avatar
manav committed
595
596
   | Opt_WarnMissingSignatures
   | Opt_WarnMissingLocalSignatures
597
598
599
600
   | Opt_WarnNameShadowing
   | Opt_WarnOverlappingPatterns
   | Opt_WarnTypeDefaults
   | Opt_WarnMonomorphism
601
602
603
   | Opt_WarnUnusedTopBinds
   | Opt_WarnUnusedLocalBinds
   | Opt_WarnUnusedPatternBinds
604
605
   | Opt_WarnUnusedImports
   | Opt_WarnUnusedMatches
606
607
   | Opt_WarnUnusedTypePatterns
   | Opt_WarnUnusedForalls
608
   | Opt_WarnContextQuantification -- remove in 8.2
609
610
   | Opt_WarnWarningsDeprecations
   | Opt_WarnDeprecatedFlags
611
   | Opt_WarnAMP -- Introduced in GHC 7.8, obsolete since 7.10
612
   | Opt_WarnMissingMonadFailInstances -- since 8.0
613
   | Opt_WarnSemigroup -- since 8.0
614
615
616
617
618
619
620
621
622
623
624
   | Opt_WarnDodgyExports
   | Opt_WarnDodgyImports
   | Opt_WarnOrphans
   | Opt_WarnAutoOrphans
   | Opt_WarnIdentities
   | Opt_WarnTabs
   | Opt_WarnUnrecognisedPragmas
   | Opt_WarnDodgyForeignImports
   | Opt_WarnUnusedDoBind
   | Opt_WarnWrongDoBind
   | Opt_WarnAlternativeLayoutRuleTransitional
625
626
   | Opt_WarnUnsafe
   | Opt_WarnSafe
627
   | Opt_WarnTrustworthySafe
628
629
   | Opt_WarnMissedSpecs
   | Opt_WarnAllMissedSpecs
630
   | Opt_WarnUnsupportedCallingConventions
631
   | Opt_WarnUnsupportedLlvmVersion
632
   | Opt_WarnInlineRuleShadowing
633
   | Opt_WarnTypedHoles
thomasw's avatar
thomasw committed
634
   | Opt_WarnPartialTypeSignatures
manav's avatar
manav committed
635
   | Opt_WarnMissingExportedSignatures
carlostome's avatar
carlostome committed
636
   | Opt_WarnUntickedPromotedConstructors
637
   | Opt_WarnDerivingTypeable
638
   | Opt_WarnDeferredTypeErrors
639
   | Opt_WarnDeferredOutOfScopeVariables
640
   | Opt_WarnNonCanonicalMonadInstances   -- since 8.0
641
   | Opt_WarnNonCanonicalMonadFailInstances -- since 8.0
642
   | Opt_WarnNonCanonicalMonoidInstances  -- since 8.0
manav's avatar
manav committed
643
   | Opt_WarnMissingPatternSynonymSignatures -- since 8.0
644
   | Opt_WarnUnrecognisedWarningFlags     -- since 8.0
645
   | Opt_WarnSimplifiableClassConstraints -- Since 8.2
646
   | Opt_WarnCPPUndef                     -- Since 8.2
647
   deriving (Eq, Show, Enum)
648

649
data Language = Haskell98 | Haskell2010
Oleg Grenrus's avatar
Oleg Grenrus committed
650
651
652
653
   deriving (Eq, Enum, Show)

instance Outputable Language where
    ppr = text . show
654

655
-- | The various Safe Haskell modes
656
657
data SafeHaskellMode
   = Sf_None
dterei's avatar
dterei committed
658
   | Sf_Unsafe
659
660
661
662
   | Sf_Trustworthy
   | Sf_Safe
   deriving (Eq)

Ian Lynagh's avatar
Ian Lynagh committed
663
instance Show SafeHaskellMode where
Ian Lynagh's avatar
Ian Lynagh committed
664
665
666
667
    show Sf_None         = "None"
    show Sf_Unsafe       = "Unsafe"
    show Sf_Trustworthy  = "Trustworthy"
    show Sf_Safe         = "Safe"
Ian Lynagh's avatar
Ian Lynagh committed
668

669
instance Outputable SafeHaskellMode where
Ian Lynagh's avatar
Ian Lynagh committed
670
    ppr = text . show
671

672
-- | Contains not only a collection of 'GeneralFlag's but also a plethora of
673
-- information relating to the compilation of a single file or GHC session
674
data DynFlags = DynFlags {
Ian Lynagh's avatar
Ian Lynagh committed
675
676
677
  ghcMode               :: GhcMode,
  ghcLink               :: GhcLink,
  hscTarget             :: HscTarget,
678
  settings              :: Settings,
679
  verbosity             :: Int,         -- ^ Verbosity level: see Note [Verbosity levels]
680
  optLevel              :: Int,         -- ^ Optimisation level
681
  debugLevel            :: Int,         -- ^ How much debug information to produce
682
683
  simplPhases           :: Int,         -- ^ Number of simplifier phases
  maxSimplIterations    :: Int,         -- ^ Max simplifier iterations
684
  maxPmCheckIterations  :: Int,         -- ^ Max no iterations for pm checking
Ian Lynagh's avatar
Ian Lynagh committed
685
  ruleCheck             :: Maybe String,
686
  strictnessBefore      :: [Int],       -- ^ Additional demand analysis
687

688
689
  parMakeCount          :: Maybe Int,   -- ^ The number of modules to compile in parallel
                                        --   in --make mode, where Nothing ==> compile as
parcs's avatar
parcs committed
690
691
                                        --   many in parallel as there are CPUs.

692
693
694
  enableTimeStats       :: Bool,        -- ^ Enable RTS timing statistics?
  ghcHeapSize           :: Maybe Int,   -- ^ The heap size to set.

695
696
  maxRelevantBinds      :: Maybe Int,   -- ^ Maximum number of bindings from the type envt
                                        --   to show in type error messages
697
698
  maxUncoveredPatterns  :: Int,         -- ^ Maximum number of unmatched patterns to show
                                        --   in non-exhaustiveness warnings
699
  simplTickFactor       :: Int,         -- ^ Multiplier for simplifier ticks
700
701
  specConstrThreshold   :: Maybe Int,   -- ^ Threshold for SpecConstr
  specConstrCount       :: Maybe Int,   -- ^ Max number of specialisations for any one function
702
703
  specConstrRecursive   :: Int,         -- ^ Max number of specialisations for recursive types
                                        --   Not optional; otherwise ForceSpecConstr can diverge.
704
  liberateCaseThreshold :: Maybe Int,   -- ^ Threshold for LiberateCase
705
  floatLamArgs          :: Maybe Int,   -- ^ Arg count for lambda floating
706
                                        --   See CoreMonad.FloatOutSwitches
707

708
  historySize           :: Int,         -- ^ Simplification history size
709

Ian Lynagh's avatar
Ian Lynagh committed
710
711
712
  importPaths           :: [FilePath],
  mainModIs             :: Module,
  mainFunIs             :: Maybe String,
713
  reductionDepth        :: IntWithInf,   -- ^ Typechecker maximum stack depth
714
715
  solverIterations      :: IntWithInf,   -- ^ Number of iterations in the constraints solver
                                         --   Typically only 1 is needed
716

717
718
719
  thisInstalledUnitId   :: InstalledUnitId,
  thisComponentId_      :: Maybe ComponentId,
  thisUnitIdInsts_      :: Maybe [(ModuleName, Module)],
720
721

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

726
727
728
  -- For object splitting
  splitInfo             :: Maybe (String,Int),

729
  -- paths etc.
Ian Lynagh's avatar
Ian Lynagh committed
730
  objectDir             :: Maybe String,
731
  dylibInstallName      :: Maybe String,
Ian Lynagh's avatar
Ian Lynagh committed
732
733
  hiDir                 :: Maybe String,
  stubDir               :: Maybe String,
734
  dumpDir               :: Maybe String,
735

Ian Lynagh's avatar
Ian Lynagh committed
736
737
738
  objectSuf             :: String,
  hcSuf                 :: String,
  hiSuf                 :: String,
739

740
741
742
743
  canGenerateDynamicToo :: IORef Bool,
  dynObjectSuf          :: String,
  dynHiSuf              :: String,

744
745
746
747
748
749
750
751
  -- Packages.isDllName needs to know whether a call is within a
  -- single DLL or not. Normally it does this by seeing if the call
  -- is to the same package, but for the ghc package, we split the
  -- package between 2 DLLs. The dllSplit tells us which sets of
  -- modules are in which package.
  dllSplitFile          :: Maybe FilePath,
  dllSplit              :: Maybe [Set String],

Ian Lynagh's avatar
Ian Lynagh committed
752
  outputFile            :: Maybe String,
ian@well-typed.com's avatar
ian@well-typed.com committed
753
  dynOutputFile         :: Maybe String,
Ian Lynagh's avatar
Ian Lynagh committed
754
755
  outputHi              :: Maybe String,
  dynLibLoader          :: DynLibLoader,
756

757
  -- | This is set by 'DriverPipeline.runPipeline' based on where
Ian Lynagh's avatar
Ian Lynagh committed
758
759
  --    its output is going.
  dumpPrefix            :: Maybe FilePath,
760

761
762
  -- | Override the 'dumpPrefix' set by 'DriverPipeline.runPipeline'.
  --    Set by @-ddump-file-prefix@
Ian Lynagh's avatar
Ian Lynagh committed
763
764
  dumpPrefixForce       :: Maybe FilePath,

765
  ldInputs              :: [Option],
766

Ian Lynagh's avatar
Ian Lynagh committed
767
768
769
770
771
  includePaths          :: [String],
  libraryPaths          :: [String],
  frameworkPaths        :: [String],    -- used on darwin only
  cmdlineFrameworks     :: [String],    -- ditto

772
  rtsOpts               :: Maybe String,
Ian Lynagh's avatar
Ian Lynagh committed
773
  rtsOptsEnabled        :: RtsOptsEnabled,
774
  rtsOptsSuggestions    :: Bool,
775

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

778
779
780
  -- Plugins
  pluginModNames        :: [ModuleName],
  pluginModNameOpts     :: [(ModuleName,String)],
Edward Z. Yang's avatar
Edward Z. Yang committed
781
  frontendPluginOpts    :: [String],
782

783
784
785
  -- GHC API hooks
  hooks                 :: Hooks,

786
787
788
789
790
791
  --  For ghc -M
  depMakefile           :: FilePath,
  depIncludePkgDeps     :: Bool,
  depExcludeMods        :: [ModuleName],
  depSuffixes           :: [String],

792
  --  Package flags
793
  extraPkgConfs         :: [PkgConfRef] -> [PkgConfRef],
794
        -- ^ The @-package-db@ flags given on the command line, in the order
Ian Lynagh's avatar
Ian Lynagh committed
795
        -- they appeared.
796

797
798
  ignorePackageFlags    :: [IgnorePackageFlag],
        -- ^ The @-ignore-package@ flags from the command line
Ian Lynagh's avatar
Ian Lynagh committed
799
  packageFlags          :: [PackageFlag],
800
        -- ^ The @-package@ and @-hide-package@ flags from the command-line
801
802
  pluginPackageFlags    :: [PackageFlag],
        -- ^ The @-plugin-package-id@ flags from command line
803
804
  trustFlags            :: [TrustFlag],
        -- ^ The @-trust@ and @-distrust@ flags
Edsko de Vries's avatar
Edsko de Vries committed
805
806
  packageEnv            :: Maybe FilePath,
        -- ^ Filepath to the package environment file (if overriding default)
807

808
  -- Package state
Ian Lynagh's avatar
Ian Lynagh committed
809
  -- NB. do not modify this field, it is calculated by
Edward Z. Yang's avatar
Edward Z. Yang committed
810
  -- Packages.initPackages
811
  pkgDatabase           :: Maybe [(FilePath, [PackageConfig])],
Ian Lynagh's avatar
Ian Lynagh committed
812
  pkgState              :: PackageState,
813

814
815
816
817
  -- Temporary files
  -- These have to be IORefs, because the defaultCleanupHandler needs to
  -- know what to clean when an exception happens
  filesToClean          :: IORef [FilePath],
818
  dirsToClean           :: IORef (Map FilePath FilePath),
819
  filesToNotIntermediateClean :: IORef [FilePath],
820
821
  -- The next available suffix to uniquely name a temp file, updated atomically
  nextTempSuffix        :: IORef Int,
822

823
824
825
  -- Names of files which were generated from -ddump-to-file; used to
  -- track which ones we need to truncate because it's our first run
  -- through
826
  generatedDumps        :: IORef (Set FilePath),
827

828
  -- hsc dynamic flags
829
830
  dumpFlags             :: IntSet,
  generalFlags          :: IntSet,
831
  warningFlags          :: IntSet,
832
  fatalWarningFlags     :: IntSet,
833
  -- Don't change this without updating extensionFlags: