DynFlags.hs 77.3 KB
Newer Older
1

2 3 4 5 6 7 8 9 10 11 12 13 14 15
-----------------------------------------------------------------------------
--
-- 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.
--
-- (c) The University of Glasgow 2005
--
-----------------------------------------------------------------------------

module DynFlags (
Ian Lynagh's avatar
Ian Lynagh committed
16 17 18 19 20 21 22 23 24
        -- Dynamic flags
        DynFlag(..),
        DynFlags(..),
        HscTarget(..), isObjectTarget, defaultObjectTarget,
        GhcMode(..), isOneShot,
        GhcLink(..), isNoLink,
        PackageFlag(..),
        Option(..),
        DynLibLoader(..),
25
        fFlags, xFlags,
26

Ian Lynagh's avatar
Ian Lynagh committed
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
        -- Configuration of the core-to-core and stg-to-stg phases
        CoreToDo(..),
        StgToDo(..),
        SimplifierSwitch(..),
        SimplifierMode(..), FloatOutSwitches(..),
        getCoreToDo, getStgToDo,

        -- Manipulating DynFlags
        defaultDynFlags,                -- DynFlags
        initDynFlags,                   -- DynFlags -> IO DynFlags

        dopt,                           -- DynFlag -> DynFlags -> Bool
        dopt_set, dopt_unset,           -- DynFlags -> DynFlag -> DynFlags
        getOpts,                        -- (DynFlags -> [a]) -> IO [a]
        getVerbFlag,
        updOptLevel,
        setTmpDir,
        setPackageName,

        -- parsing DynFlags
        parseDynamicFlags,
48
        allFlags,
49

Ian Lynagh's avatar
Ian Lynagh committed
50 51
        -- misc stuff
        machdepCCOpts, picCCOpts,
52
    supportedLanguages, languageOptions,
53
    compilerInfo,
54 55 56 57
  ) where

#include "HsVersions.h"

58
import Module
Simon Marlow's avatar
Simon Marlow committed
59
import PackageConfig
Ian Lynagh's avatar
Ian Lynagh committed
60
import PrelNames        ( mAIN )
Simon Marlow's avatar
Simon Marlow committed
61
#ifdef i386_TARGET_ARCH
Ian Lynagh's avatar
Ian Lynagh committed
62
import StaticFlags      ( opt_Static )
Simon Marlow's avatar
Simon Marlow committed
63
#endif
Ian Lynagh's avatar
Ian Lynagh committed
64 65
import StaticFlags      ( opt_PIC, WayName(..), v_Ways, v_Build_tag,
                          v_RTS_Build_tag )
66
import {-# SOURCE #-} Packages (PackageState)
Ian Lynagh's avatar
Ian Lynagh committed
67
import DriverPhases     ( Phase(..), phaseInputExt )
68 69
import Config
import CmdLineParser
Ian Lynagh's avatar
Ian Lynagh committed
70 71
import Constants        ( mAX_CONTEXT_REDUCTION_DEPTH )
import Panic            ( panic, GhcException(..) )
72
import UniqFM           ( UniqFM )
73
import Util
74
import Maybes           ( orElse )
75
import SrcLoc           ( SrcSpan )
Simon Marlow's avatar
Simon Marlow committed
76 77
import Outputable
import {-# SOURCE #-} ErrUtils ( Severity(..), Message, mkLocMessage )
78

Ian Lynagh's avatar
Ian Lynagh committed
79
import Data.IORef       ( readIORef )
Simon Marlow's avatar
Simon Marlow committed
80
import Control.Exception ( throwDyn )
Ian Lynagh's avatar
Ian Lynagh committed
81
import Control.Monad    ( when )
simonpj@microsoft.com's avatar
simonpj@microsoft.com committed
82

83
import Data.Char
Ian Lynagh's avatar
Ian Lynagh committed
84
import System.FilePath
85 86
import System.IO        ( hPutStrLn, stderr )

87 88 89 90 91 92 93
-- -----------------------------------------------------------------------------
-- DynFlags

data DynFlag

   -- debugging flags
   = Opt_D_dump_cmm
94
   | Opt_D_dump_cmmz
95
   | Opt_D_dump_cmmz_pretty
96
   | Opt_D_dump_cps_cmm
97
   | Opt_D_dump_cvt_cmm
98
   | Opt_D_dump_asm
99 100
   | Opt_D_dump_asm_native
   | Opt_D_dump_asm_liveness
101
   | Opt_D_dump_asm_coalesce
102 103 104
   | Opt_D_dump_asm_regalloc
   | Opt_D_dump_asm_regalloc_stages
   | Opt_D_dump_asm_conflicts
105
   | Opt_D_dump_asm_stats
106 107 108 109 110 111
   | Opt_D_dump_cpranal
   | Opt_D_dump_deriv
   | Opt_D_dump_ds
   | Opt_D_dump_flatC
   | Opt_D_dump_foreign
   | Opt_D_dump_inlinings
112
   | Opt_D_dump_rule_firings
113 114 115 116 117
   | Opt_D_dump_occur_anal
   | Opt_D_dump_parsed
   | Opt_D_dump_rn
   | Opt_D_dump_simpl
   | Opt_D_dump_simpl_iterations
118
   | Opt_D_dump_simpl_phases
119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
   | 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
   | Opt_D_dump_tc_trace
   | Opt_D_dump_if_trace
   | Opt_D_dump_splices
   | Opt_D_dump_BCOs
   | Opt_D_dump_vect
andy@galois.com's avatar
andy@galois.com committed
137
   | Opt_D_dump_hpc
138 139 140 141 142 143
   | 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
144
   | Opt_D_dump_mod_cycles
145
   | Opt_D_dump_view_pattern_commoning
146
   | Opt_D_faststring_stats
Ian Lynagh's avatar
Ian Lynagh committed
147
   | Opt_DumpToFile                     -- ^ Append dump output to files instead of stdout.
Simon Marlow's avatar
Simon Marlow committed
148
   | Opt_D_no_debug_output
149 150 151
   | Opt_DoCoreLinting
   | Opt_DoStgLinting
   | Opt_DoCmmLinting
Ben.Lippmeier@anu.edu.au's avatar
Ben.Lippmeier@anu.edu.au committed
152
   | Opt_DoAsmLinting
153

Ian Lynagh's avatar
Ian Lynagh committed
154
   | Opt_WarnIsError                    -- -Werror; makes warnings fatal
155 156
   | Opt_WarnDuplicateExports
   | Opt_WarnHiShadows
157
   | Opt_WarnImplicitPrelude
158 159 160 161 162 163 164 165 166
   | Opt_WarnIncompletePatterns
   | Opt_WarnIncompletePatternsRecUpd
   | Opt_WarnMissingFields
   | Opt_WarnMissingMethods
   | Opt_WarnMissingSigs
   | Opt_WarnNameShadowing
   | Opt_WarnOverlappingPatterns
   | Opt_WarnSimplePatterns
   | Opt_WarnTypeDefaults
167
   | Opt_WarnMonomorphism
168 169 170 171
   | Opt_WarnUnusedBinds
   | Opt_WarnUnusedImports
   | Opt_WarnUnusedMatches
   | Opt_WarnDeprecations
172
   | Opt_WarnDeprecatedFlags
173 174
   | Opt_WarnDodgyImports
   | Opt_WarnOrphans
175
   | Opt_WarnTabs
176 177

   -- language opts
178 179 180
   | Opt_OverlappingInstances
   | Opt_UndecidableInstances
   | Opt_IncoherentInstances
181
   | Opt_MonomorphismRestriction
182
   | Opt_MonoPatBinds
Ian Lynagh's avatar
Ian Lynagh committed
183
   | Opt_ExtendedDefaultRules           -- Use GHC's extended rules for defaulting
184
   | Opt_ForeignFunctionInterface
Ian Lynagh's avatar
Ian Lynagh committed
185
   | Opt_UnliftedFFITypes
Ian Lynagh's avatar
Ian Lynagh committed
186 187
   | Opt_PArr                           -- Syntactic support for parallel arrays
   | Opt_Arrows                         -- Arrow-notation syntax
188
   | Opt_TemplateHaskell
189
   | Opt_QuasiQuotes
190 191
   | Opt_ImplicitParams
   | Opt_Generics
Ian Lynagh's avatar
Ian Lynagh committed
192
   | Opt_ImplicitPrelude
193
   | Opt_ScopedTypeVariables
Ian Lynagh's avatar
Ian Lynagh committed
194
   | Opt_UnboxedTuples
simonpj@microsoft.com's avatar
simonpj@microsoft.com committed
195
   | Opt_BangPatterns
196
   | Opt_TypeFamilies
197
   | Opt_OverloadedStrings
198
   | Opt_DisambiguateRecordFields
199
   | Opt_RecordWildCards
200
   | Opt_RecordPuns
201
   | Opt_ViewPatterns
202
   | Opt_GADTs
203
   | Opt_RelaxedPolyRec
204
   | Opt_StandaloneDeriving
205
   | Opt_DeriveDataTypeable
206
   | Opt_TypeSynonymInstances
Ian Lynagh's avatar
Ian Lynagh committed
207
   | Opt_FlexibleContexts
208
   | Opt_FlexibleInstances
209
   | Opt_ConstrainedClassMethods
Ian Lynagh's avatar
Ian Lynagh committed
210
   | Opt_MultiParamTypeClasses
211
   | Opt_FunctionalDependencies
Ian Lynagh's avatar
Ian Lynagh committed
212
   | Opt_UnicodeSyntax
Ian Lynagh's avatar
Ian Lynagh committed
213
   | Opt_PolymorphicComponents
214
   | Opt_ExistentialQuantification
215
   | Opt_MagicHash
Ian Lynagh's avatar
Ian Lynagh committed
216
   | Opt_EmptyDataDecls
Ian Lynagh's avatar
Ian Lynagh committed
217
   | Opt_KindSignatures
Ian Lynagh's avatar
Ian Lynagh committed
218
   | Opt_PatternSignatures
Ian Lynagh's avatar
Ian Lynagh committed
219
   | Opt_ParallelListComp
220
   | Opt_TransformListComp
221
   | Opt_GeneralizedNewtypeDeriving
Ian Lynagh's avatar
Ian Lynagh committed
222
   | Opt_RecursiveDo
Ian Lynagh's avatar
Ian Lynagh committed
223
   | Opt_PatternGuards
224
   | Opt_LiberalTypeSynonyms
225 226
   | Opt_Rank2Types
   | Opt_RankNTypes
227
   | Opt_ImpredicativeTypes
Ian Lynagh's avatar
Ian Lynagh committed
228
   | Opt_TypeOperators
229

230 231
   | Opt_PrintExplicitForalls

232 233 234
   -- optimisation opts
   | Opt_Strictness
   | Opt_FullLaziness
235
   | Opt_StaticArgumentTransformation
236
   | Opt_CSE
237 238
   | Opt_LiberateCase
   | Opt_SpecConstr
239 240 241 242 243 244 245
   | Opt_IgnoreInterfacePragmas
   | Opt_OmitInterfacePragmas
   | Opt_DoLambdaEtaExpansion
   | Opt_IgnoreAsserts
   | Opt_DoEtaReduction
   | Opt_CaseMerge
   | Opt_UnboxStrictFields
246
   | Opt_MethodSharing
247
   | Opt_DictsCheap
248
   | Opt_RewriteRules
rl@cse.unsw.edu.au's avatar
rl@cse.unsw.edu.au committed
249
   | Opt_Vectorise
Ian Lynagh's avatar
Ian Lynagh committed
250 251
   | Opt_RegsGraph                      -- do graph coloring register allocation
   | Opt_RegsIterative                  -- do iterative coalescing graph coloring register allocation
252 253 254 255

   -- misc opts
   | Opt_Cpp
   | Opt_Pp
256
   | Opt_ForceRecomp
257 258 259 260 261 262 263
   | Opt_DryRun
   | Opt_DoAsmMangling
   | Opt_ExcessPrecision
   | Opt_ReadUserPackageConf
   | Opt_NoHsMain
   | Opt_SplitObjs
   | Opt_StgStats
264
   | Opt_HideAllPackages
265
   | Opt_PrintBindResult
266
   | Opt_Haddock
David Waern's avatar
David Waern committed
267
   | Opt_HaddockOptions
268
   | Opt_Hpc_No_Auto
269
   | Opt_BreakOnException
270
   | Opt_BreakOnError
271
   | Opt_PrintEvldWithShow
272
   | Opt_PrintBindContents
273 274
   | Opt_GenManifest
   | Opt_EmbedManifest
275 276
   | Opt_RunCPSZ
   | Opt_ConvertToZipCfgAndBack
277 278 279 280 281 282 283 284

   -- keeping stuff
   | Opt_KeepHiDiffs
   | Opt_KeepHcFiles
   | Opt_KeepSFiles
   | Opt_KeepRawSFiles
   | Opt_KeepTmpFiles

285
   deriving (Eq, Show)
Ian Lynagh's avatar
Ian Lynagh committed
286

287
data DynFlags = DynFlags {
Ian Lynagh's avatar
Ian Lynagh committed
288 289 290 291 292 293 294 295 296
  ghcMode               :: GhcMode,
  ghcLink               :: GhcLink,
  coreToDo              :: Maybe [CoreToDo], -- reserved for -Ofile
  stgToDo               :: Maybe [StgToDo],  -- similarly
  hscTarget             :: HscTarget,
  hscOutName            :: String,      -- name of the output file
  extCoreName           :: String,      -- name of the .core output file
  verbosity             :: Int,         -- verbosity level
  optLevel              :: Int,         -- optimisation level
297
  simplPhases           :: Int,         -- number of simplifier phases
Ian Lynagh's avatar
Ian Lynagh committed
298
  maxSimplIterations    :: Int,         -- max simplifier iterations
299
  shouldDumpSimplPhase  :: SimplifierMode -> Bool,
Ian Lynagh's avatar
Ian Lynagh committed
300
  ruleCheck             :: Maybe String,
301

Ian Lynagh's avatar
Ian Lynagh committed
302 303 304
  specConstrThreshold   :: Maybe Int,   -- Threshold for SpecConstr
  specConstrCount       :: Maybe Int,   -- Max number of specialisations for any one function
  liberateCaseThreshold :: Maybe Int,   -- Threshold for LiberateCase
305

Ian Lynagh's avatar
Ian Lynagh committed
306 307 308 309 310 311
  stolen_x86_regs       :: Int,
  cmdlineHcIncludes     :: [String],    -- -#includes
  importPaths           :: [FilePath],
  mainModIs             :: Module,
  mainFunIs             :: Maybe String,
  ctxtStkDepth          :: Int,         -- Typechecker context stack depth
312

Ian Lynagh's avatar
Ian Lynagh committed
313
  thisPackage           :: PackageId,
314 315

  -- ways
Ian Lynagh's avatar
Ian Lynagh committed
316 317 318 319
  wayNames              :: [WayName],   -- way flags from the cmd line
  buildTag              :: String,      -- the global "way" (eg. "p" for prof)
  rtsBuildTag           :: String,      -- the RTS "way"

320
  -- paths etc.
Ian Lynagh's avatar
Ian Lynagh committed
321 322 323
  objectDir             :: Maybe String,
  hiDir                 :: Maybe String,
  stubDir               :: Maybe String,
324

Ian Lynagh's avatar
Ian Lynagh committed
325 326 327
  objectSuf             :: String,
  hcSuf                 :: String,
  hiSuf                 :: String,
328

Ian Lynagh's avatar
Ian Lynagh committed
329 330 331
  outputFile            :: Maybe String,
  outputHi              :: Maybe String,
  dynLibLoader          :: DynLibLoader,
332

333
  -- | This is set by DriverPipeline.runPipeline based on where
Ian Lynagh's avatar
Ian Lynagh committed
334 335
  --    its output is going.
  dumpPrefix            :: Maybe FilePath,
336 337

  -- | Override the dumpPrefix set by runPipeline.
Ian Lynagh's avatar
Ian Lynagh committed
338 339 340 341 342 343 344 345 346
  --    Set by -ddump-file-prefix
  dumpPrefixForce       :: Maybe FilePath,

  includePaths          :: [String],
  libraryPaths          :: [String],
  frameworkPaths        :: [String],    -- used on darwin only
  cmdlineFrameworks     :: [String],    -- ditto
  tmpDir                :: String,      -- no trailing '/'

347 348 349
  ghcUsagePath          :: FilePath,    -- Filled in by SysTools
  ghciUsagePath         :: FilePath,    -- ditto

Ian Lynagh's avatar
Ian Lynagh committed
350
  hpcDir                :: String,      -- ^ path to store the .mix files
andy@galois.com's avatar
andy@galois.com committed
351

352
  -- options for particular phases
Ian Lynagh's avatar
Ian Lynagh committed
353 354 355 356 357 358 359 360 361
  opt_L                 :: [String],
  opt_P                 :: [String],
  opt_F                 :: [String],
  opt_c                 :: [String],
  opt_m                 :: [String],
  opt_a                 :: [String],
  opt_l                 :: [String],
  opt_dep               :: [String],
  opt_windres           :: [String],
362 363

  -- commands for particular phases
Ian Lynagh's avatar
Ian Lynagh committed
364 365 366 367 368 369 370 371 372
  pgm_L                 :: String,
  pgm_P                 :: (String,[Option]),
  pgm_F                 :: String,
  pgm_c                 :: (String,[Option]),
  pgm_m                 :: (String,[Option]),
  pgm_s                 :: (String,[Option]),
  pgm_a                 :: (String,[Option]),
  pgm_l                 :: (String,[Option]),
  pgm_dll               :: (String,[Option]),
373 374
  pgm_T                 :: String,
  pgm_sysman            :: String,
375
  pgm_windres           :: String,
376

377
  --  Package flags
Ian Lynagh's avatar
Ian Lynagh committed
378
  extraPkgConfs         :: [FilePath],
379 380
  topDir                :: FilePath,    -- filled in by SysTools
  systemPackageConfig   :: FilePath,    -- ditto
Ian Lynagh's avatar
Ian Lynagh committed
381 382
        -- The -package-conf flags given on the command line, in the order
        -- they appeared.
383

Ian Lynagh's avatar
Ian Lynagh committed
384 385
  packageFlags          :: [PackageFlag],
        -- The -package and -hide-package flags from the command-line
386

387
  -- Package state
Ian Lynagh's avatar
Ian Lynagh committed
388
  -- NB. do not modify this field, it is calculated by
389
  -- Packages.initPackages and Packages.updatePackages.
390
  pkgDatabase           :: Maybe (UniqFM PackageConfig),
Ian Lynagh's avatar
Ian Lynagh committed
391
  pkgState              :: PackageState,
392 393

  -- hsc dynamic flags
Ian Lynagh's avatar
Ian Lynagh committed
394 395
  flags                 :: [DynFlag],

396
  -- message output
David Waern's avatar
David Waern committed
397 398 399
  log_action            :: Severity -> SrcSpan -> PprStyle -> Message -> IO (),

  haddockOptions :: Maybe String
400 401 402 403 404 405 406 407 408 409
 }

data HscTarget
  = HscC
  | HscAsm
  | HscJava
  | HscInterpreted
  | HscNothing
  deriving (Eq, Show)

410 411 412 413 414 415 416 417 418 419 420 421
-- | will this target result in an object file on the disk?
isObjectTarget :: HscTarget -> Bool
isObjectTarget HscC     = True
isObjectTarget HscAsm   = True
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.
422
data GhcMode
423
  = CompManager         -- ^ --make, GHCi, etc.
Ian Lynagh's avatar
Ian Lynagh committed
424
  | OneShot             -- ^ ghc -c Foo.hs
425
  | MkDepend            -- ^ ghc -M, see Finder for why we need this
426 427 428 429 430 431
  deriving Eq

isOneShot :: GhcMode -> Bool
isOneShot OneShot = True
isOneShot _other  = False

432
-- | What kind of linking to do.
Ian Lynagh's avatar
Ian Lynagh committed
433 434 435
data GhcLink    -- What to do in the link step, if there is one
  = NoLink              -- Don't link at all
  | LinkBinary          -- Link object code into a binary
436
  | LinkInMemory        -- Use the in-memory dynamic linker
Ian Lynagh's avatar
Ian Lynagh committed
437
  | LinkDynLib          -- Link objects into a dynamic lib (DLL on Windows, DSO on ELF platforms)
438
  deriving (Eq, Show)
439 440 441

isNoLink :: GhcLink -> Bool
isNoLink NoLink = True
twanvl's avatar
twanvl committed
442
isNoLink _      = False
443 444 445 446 447

data PackageFlag
  = ExposePackage  String
  | HidePackage    String
  | IgnorePackage  String
448
  deriving Eq
449

twanvl's avatar
twanvl committed
450
defaultHscTarget :: HscTarget
451 452 453 454
defaultHscTarget = defaultObjectTarget

-- | the 'HscTarget' value corresponding to the default way to create
-- object files on the current platform.
twanvl's avatar
twanvl committed
455
defaultObjectTarget :: HscTarget
456
defaultObjectTarget
Ian Lynagh's avatar
Ian Lynagh committed
457 458
  | cGhcWithNativeCodeGen == "YES"      =  HscAsm
  | otherwise                           =  HscC
459

460 461 462 463 464 465
data DynLibLoader
  = Deployable
  | Wrapped (Maybe String)
  | SystemDependent
  deriving Eq

twanvl's avatar
twanvl committed
466
initDynFlags :: DynFlags -> IO DynFlags
467 468 469 470 471 472
initDynFlags dflags = do
 -- someday these will be dynamic flags
 ways <- readIORef v_Ways
 build_tag <- readIORef v_Build_tag
 rts_build_tag <- readIORef v_RTS_Build_tag
 return dflags{
Ian Lynagh's avatar
Ian Lynagh committed
473 474 475 476
        wayNames        = ways,
        buildTag        = build_tag,
        rtsBuildTag     = rts_build_tag
        }
477

twanvl's avatar
twanvl committed
478
defaultDynFlags :: DynFlags
479 480
defaultDynFlags =
     DynFlags {
Ian Lynagh's avatar
Ian Lynagh committed
481 482 483 484 485 486 487 488 489
        ghcMode                 = CompManager,
        ghcLink                 = LinkBinary,
        coreToDo                = Nothing,
        stgToDo                 = Nothing,
        hscTarget               = defaultHscTarget,
        hscOutName              = "",
        extCoreName             = "",
        verbosity               = 0,
        optLevel                = 0,
490
        simplPhases             = 2,
Ian Lynagh's avatar
Ian Lynagh committed
491
        maxSimplIterations      = 4,
492
        shouldDumpSimplPhase    = const False,
Ian Lynagh's avatar
Ian Lynagh committed
493 494 495
        ruleCheck               = Nothing,
        specConstrThreshold     = Just 200,
        specConstrCount         = Just 3,
496
        liberateCaseThreshold   = Just 200,
Ian Lynagh's avatar
Ian Lynagh committed
497 498 499 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 525 526 527 528 529 530 531 532 533 534 535 536
        stolen_x86_regs         = 4,
        cmdlineHcIncludes       = [],
        importPaths             = ["."],
        mainModIs               = mAIN,
        mainFunIs               = Nothing,
        ctxtStkDepth            = mAX_CONTEXT_REDUCTION_DEPTH,

        thisPackage             = mainPackageId,

        objectDir               = Nothing,
        hiDir                   = Nothing,
        stubDir                 = Nothing,

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

        outputFile              = Nothing,
        outputHi                = Nothing,
        dynLibLoader            = Deployable,
        dumpPrefix              = Nothing,
        dumpPrefixForce         = Nothing,
        includePaths            = [],
        libraryPaths            = [],
        frameworkPaths          = [],
        cmdlineFrameworks       = [],
        tmpDir                  = cDEFAULT_TMPDIR,

        hpcDir                  = ".hpc",

        opt_L                   = [],
        opt_P                   = (if opt_PIC
                                   then ["-D__PIC__"]
                                   else []),
        opt_F                   = [],
        opt_c                   = [],
        opt_a                   = [],
        opt_m                   = [],
        opt_l                   = [],
        opt_dep                 = [],
537
        opt_windres             = [],
Ian Lynagh's avatar
Ian Lynagh committed
538 539 540

        extraPkgConfs           = [],
        packageFlags            = [],
541 542
        pkgDatabase             = Nothing,
        pkgState                = panic "no package state yet: call GHC.setSessionDynFlags",
Ian Lynagh's avatar
Ian Lynagh committed
543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564
        wayNames                = panic "defaultDynFlags: No wayNames",
        buildTag                = panic "defaultDynFlags: No buildTag",
        rtsBuildTag             = panic "defaultDynFlags: No rtsBuildTag",
        -- initSysTools fills all these in
        ghcUsagePath            = panic "defaultDynFlags: No ghciUsagePath",
        ghciUsagePath           = panic "defaultDynFlags: No ghciUsagePath",
        topDir                  = panic "defaultDynFlags: No topDir",
        systemPackageConfig     = panic "defaultDynFlags: No systemPackageConfig",
        pgm_L                   = panic "defaultDynFlags: No pgm_L",
        pgm_P                   = panic "defaultDynFlags: No pgm_P",
        pgm_F                   = panic "defaultDynFlags: No pgm_F",
        pgm_c                   = panic "defaultDynFlags: No pgm_c",
        pgm_m                   = panic "defaultDynFlags: No pgm_m",
        pgm_s                   = panic "defaultDynFlags: No pgm_s",
        pgm_a                   = panic "defaultDynFlags: No pgm_a",
        pgm_l                   = panic "defaultDynFlags: No pgm_l",
        pgm_dll                 = panic "defaultDynFlags: No pgm_dll",
        pgm_T                   = panic "defaultDynFlags: No pgm_T",
        pgm_sysman              = panic "defaultDynFlags: No pgm_sysman",
        pgm_windres             = panic "defaultDynFlags: No pgm_windres",
        -- end of initSysTools values
        haddockOptions = Nothing,
565 566 567 568 569 570 571 572 573 574
        flags = [
            Opt_ReadUserPackageConf,

            Opt_MonoPatBinds,   -- Experimentally, I'm making this non-standard
                                -- behaviour the default, to see if anyone notices
                                -- SLPJ July 06

            Opt_ImplicitPrelude,
            Opt_MonomorphismRestriction,

575 576
            Opt_MethodSharing,

577 578
            Opt_DoAsmMangling,

579
            Opt_GenManifest,
580 581
            Opt_EmbedManifest,
            Opt_PrintBindContents
582 583 584 585 586
            ]
            ++ [f | (ns,f) <- optLevelFlags, 0 `elem` ns]
                    -- The default -O0 options
            ++ standardWarnings,

Ian Lynagh's avatar
Ian Lynagh committed
587
        log_action = \severity srcSpan style msg ->
588 589 590 591
                        case severity of
                          SevInfo  -> hPutStrLn stderr (show (msg style))
                          SevFatal -> hPutStrLn stderr (show (msg style))
                          _        -> hPutStrLn stderr ('\n':show ((mkLocMessage srcSpan msg) style))
592 593
      }

Ian Lynagh's avatar
Ian Lynagh committed
594
{-
595
    Verbosity levels:
Ian Lynagh's avatar
Ian Lynagh committed
596 597

    0   |   print errors & warnings only
598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615
    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"
-}

dopt :: DynFlag -> DynFlags -> Bool
dopt f dflags  = f `elem` (flags dflags)

dopt_set :: DynFlags -> DynFlag -> DynFlags
dopt_set dfs f = dfs{ flags = f : flags dfs }

dopt_unset :: DynFlags -> DynFlag -> DynFlags
dopt_unset dfs f = dfs{ flags = filter (/= f) (flags dfs) }

getOpts :: DynFlags -> (DynFlags -> [a]) -> [a]
getOpts dflags opts = reverse (opts dflags)
Ian Lynagh's avatar
Ian Lynagh committed
616
        -- We add to the options from the front, so we need to reverse the list
617 618

getVerbFlag :: DynFlags -> String
Ian Lynagh's avatar
Ian Lynagh committed
619 620
getVerbFlag dflags
  | verbosity dflags >= 3  = "-v"
621 622
  | otherwise =  ""

twanvl's avatar
twanvl committed
623 624 625 626 627 628 629 630
setObjectDir, setHiDir, setStubDir, setObjectSuf, setHiSuf, setHcSuf, parseDynLibLoaderMode,
         setPgmP, setPgmL, setPgmF, setPgmc, setPgmm, setPgms, setPgma, setPgml, setPgmdll, setPgmwindres,
         addOptL, addOptP, addOptF, addOptc, addOptm, addOpta, addOptl, addOptdep, addOptwindres,
         addCmdlineFramework, addHaddockOpts
   :: String -> DynFlags -> DynFlags
setOutputFile, setOutputHi, setDumpPrefixForce
   :: Maybe String -> DynFlags -> DynFlags

631 632 633 634 635
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
  -- #included from the .hc file when compiling with -fvia-C.
636

637 638
setObjectSuf  f d = d{ objectSuf  = f}
setHiSuf      f d = d{ hiSuf      = f}
639 640 641 642
setHcSuf      f d = d{ hcSuf      = f}

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

644 645 646 647 648 649 650 651 652
parseDynLibLoaderMode f d =
 case splitAt 8 f of
   ("deploy", "")       -> d{ dynLibLoader = Deployable }
   ("sysdep", "")       -> d{ dynLibLoader = SystemDependent }
   ("wrapped", "")      -> d{ dynLibLoader = Wrapped Nothing }
   ("wrapped:", "hard") -> d{ dynLibLoader = Wrapped Nothing }
   ("wrapped:", flex)   -> d{ dynLibLoader = Wrapped (Just flex) }
   (_,_)                -> error "Unknown dynlib loader"

653 654
setDumpPrefixForce f d = d { dumpPrefixForce = f}

655 656 657 658 659 660 661 662 663 664 665 666
-- XXX HACK: Prelude> words "'does not' work" ===> ["'does","not'","work"]
-- Config.hs should really use Option.
setPgmP   f d = let (pgm:args) = words f in d{ pgm_P   = (pgm, map Option args)}

setPgmL   f d = d{ pgm_L   = f}
setPgmF   f d = d{ pgm_F   = f}
setPgmc   f d = d{ pgm_c   = (f,[])}
setPgmm   f d = d{ pgm_m   = (f,[])}
setPgms   f d = d{ pgm_s   = (f,[])}
setPgma   f d = d{ pgm_a   = (f,[])}
setPgml   f d = d{ pgm_l   = (f,[])}
setPgmdll f d = d{ pgm_dll = (f,[])}
667
setPgmwindres f d = d{ pgm_windres = f}
668 669 670 671 672 673 674 675 676

addOptL   f d = d{ opt_L   = f : opt_L d}
addOptP   f d = d{ opt_P   = f : opt_P d}
addOptF   f d = d{ opt_F   = f : opt_F d}
addOptc   f d = d{ opt_c   = f : opt_c d}
addOptm   f d = d{ opt_m   = f : opt_m d}
addOpta   f d = d{ opt_a   = f : opt_a d}
addOptl   f d = d{ opt_l   = f : opt_l d}
addOptdep f d = d{ opt_dep = f : opt_dep d}
677
addOptwindres f d = d{ opt_windres = f : opt_windres d}
678 679 680

addCmdlineFramework f d = d{ cmdlineFrameworks = f : cmdlineFrameworks d}

David Waern's avatar
David Waern committed
681 682
addHaddockOpts f d = d{ haddockOptions = Just f}

683 684 685 686 687 688 689 690 691 692 693 694
-- -----------------------------------------------------------------------------
-- Command-line options

-- When invoking external tools as part of the compilation pipeline, we
-- pass these a sequence of options on the command-line. Rather than
-- just using a list of Strings, we use a type that allows us to distinguish
-- between filepaths and 'other stuff'. [The reason being, of course, that
-- this type gives us a handle on transforming filenames, and filenames only,
-- to whatever format they're expected to be on a particular platform.]

data Option
 = FileOption -- an entry that _contains_ filename(s) / filepaths.
Ian Lynagh's avatar
Ian Lynagh committed
695 696 697
              String  -- a non-filepath prefix that shouldn't be
                      -- transformed (e.g., "/out=")
              String  -- the filepath/filename portion
698
 | Option     String
Ian Lynagh's avatar
Ian Lynagh committed
699

700 701 702 703 704 705
-----------------------------------------------------------------------------
-- Setting the optimisation level

updOptLevel :: Int -> DynFlags -> DynFlags
-- Set dynflags appropriate to the optimisation level
updOptLevel n dfs
706
  = dfs2{ optLevel = final_n }
707
  where
Ian Lynagh's avatar
Ian Lynagh committed
708
   final_n = max 0 (min 2 n)    -- Clamp to 0 <= n <= 2
709 710 711
   dfs1 = foldr (flip dopt_unset) dfs  remove_dopts
   dfs2 = foldr (flip dopt_set)   dfs1 extra_dopts

712 713
   extra_dopts  = [ f | (ns,f) <- optLevelFlags, final_n `elem` ns ]
   remove_dopts = [ f | (ns,f) <- optLevelFlags, final_n `notElem` ns ]
Ian Lynagh's avatar
Ian Lynagh committed
714

715 716
optLevelFlags :: [([Int], DynFlag)]
optLevelFlags
Ian Lynagh's avatar
Ian Lynagh committed
717
  = [ ([0],     Opt_IgnoreInterfacePragmas)
718
    , ([0],     Opt_OmitInterfacePragmas)
719

Ian Lynagh's avatar
Ian Lynagh committed
720 721 722 723 724 725 726 727
    , ([1,2],   Opt_IgnoreAsserts)
    , ([1,2],   Opt_RewriteRules)       -- Off for -O0; see Note [Scoping for Builtin rules]
                                        --              in PrelRules
    , ([1,2],   Opt_DoEtaReduction)
    , ([1,2],   Opt_CaseMerge)
    , ([1,2],   Opt_Strictness)
    , ([1,2],   Opt_CSE)
    , ([1,2],   Opt_FullLaziness)
728

Ian Lynagh's avatar
Ian Lynagh committed
729 730 731
    , ([2],     Opt_LiberateCase)
    , ([2],     Opt_SpecConstr)
    , ([2],     Opt_StaticArgumentTransformation)
732 733

    , ([0,1,2], Opt_DoLambdaEtaExpansion)
Ian Lynagh's avatar
Ian Lynagh committed
734 735 736 737
                -- This one is important for a tiresome reason:
                -- we want to make sure that the bindings for data
                -- constructors are eta-expanded.  This is probably
                -- a good thing anyway, but it seems fragile.
738 739 740 741 742
    ]

-- -----------------------------------------------------------------------------
-- Standard sets of warning options

twanvl's avatar
twanvl committed
743
standardWarnings :: [DynFlag]
744 745
standardWarnings
    = [ Opt_WarnDeprecations,
746
        Opt_WarnDeprecatedFlags,
Ian Lynagh's avatar
Ian Lynagh committed
747 748 749 750
        Opt_WarnOverlappingPatterns,
        Opt_WarnMissingFields,
        Opt_WarnMissingMethods,
        Opt_WarnDuplicateExports
751 752
      ]

twanvl's avatar
twanvl committed
753
minusWOpts :: [DynFlag]
754
minusWOpts
Ian Lynagh's avatar
Ian Lynagh committed
755 756 757 758 759 760
    = standardWarnings ++
      [ Opt_WarnUnusedBinds,
        Opt_WarnUnusedMatches,
        Opt_WarnUnusedImports,
        Opt_WarnIncompletePatterns,
        Opt_WarnDodgyImports
761 762
      ]

twanvl's avatar
twanvl committed
763
minusWallOpts :: [DynFlag]
764 765
minusWallOpts
    = minusWOpts ++
Ian Lynagh's avatar
Ian Lynagh committed
766 767 768 769 770
      [ Opt_WarnTypeDefaults,
        Opt_WarnNameShadowing,
        Opt_WarnMissingSigs,
        Opt_WarnHiShadows,
        Opt_WarnOrphans
771 772
      ]

773
-- minuswRemovesOpts should be every warning option
twanvl's avatar
twanvl committed
774
minuswRemovesOpts :: [DynFlag]
775 776 777 778 779 780 781 782 783
minuswRemovesOpts
    = minusWallOpts ++
      [Opt_WarnImplicitPrelude,
       Opt_WarnIncompletePatternsRecUpd,
       Opt_WarnSimplePatterns,
       Opt_WarnMonomorphism,
       Opt_WarnTabs
      ]

784 785 786
-- -----------------------------------------------------------------------------
-- CoreToDo:  abstraction of core-to-core passes to run.

Ian Lynagh's avatar
Ian Lynagh committed
787 788 789
data CoreToDo           -- These are diff core-to-core passes,
                        -- which may be invoked in any order,
                        -- as many times as you like.
790

Ian Lynagh's avatar
Ian Lynagh committed
791 792 793 794 795
  = CoreDoSimplify      -- The core-to-core simplifier.
        SimplifierMode
        [SimplifierSwitch]
                        -- Each run of the simplifier can take a different
                        -- set of simplifier-specific flags.
796 797 798 799 800 801 802 803 804 805 806 807
  | CoreDoFloatInwards
  | CoreDoFloatOutwards FloatOutSwitches
  | CoreLiberateCase
  | CoreDoPrintCore
  | CoreDoStaticArgs
  | CoreDoStrictness
  | CoreDoWorkerWrapper
  | CoreDoSpecialising
  | CoreDoSpecConstr
  | CoreDoOldStrictness
  | CoreDoGlomBinds
  | CoreCSE
Ian Lynagh's avatar
Ian Lynagh committed
808 809
  | CoreDoRuleCheck Int{-CompilerPhase-} String -- Check for non-application of rules
                                                -- matching this string
810
  | CoreDoVectorisation
Ian Lynagh's avatar
Ian Lynagh committed
811 812
  | CoreDoNothing                -- Useful when building up
  | CoreDoPasses [CoreToDo]      -- lists of these things
813

Ian Lynagh's avatar
Ian Lynagh committed
814
data SimplifierMode             -- See comments in SimplMonad
815
  = SimplGently
816
  | SimplPhase Int [String]
817 818 819 820 821 822

data SimplifierSwitch
  = MaxSimplifierIterations Int
  | NoCaseOfCase

data FloatOutSwitches
Ian Lynagh's avatar
Ian Lynagh committed
823 824 825
  = FloatOutSw  Bool    -- True <=> float lambdas to top level
                Bool    -- True <=> float constants to top level,
                        --          even if they do not escape a lambda
826 827 828


-- The core-to-core pass ordering is derived from the DynFlags:
829 830
runWhen :: Bool -> CoreToDo -> CoreToDo
runWhen True  do_this = do_this
twanvl's avatar
twanvl committed
831
runWhen False _       = CoreDoNothing
832

833 834 835 836
runMaybe :: Maybe a -> (a -> CoreToDo) -> CoreToDo
runMaybe (Just x) f = f x
runMaybe Nothing  _ = CoreDoNothing

837 838 839 840 841
getCoreToDo :: DynFlags -> [CoreToDo]
getCoreToDo dflags
  | Just todo <- coreToDo dflags = todo -- set explicitly by user
  | otherwise = core_todo
  where
Ian Lynagh's avatar
Ian Lynagh committed
842
    opt_level     = optLevel dflags
843
    phases        = simplPhases dflags
Ian Lynagh's avatar
Ian Lynagh committed
844
    max_iter      = maxSimplIterations dflags
845 846 847
    strictness    = dopt Opt_Strictness dflags
    full_laziness = dopt Opt_FullLaziness dflags
    cse           = dopt Opt_CSE dflags
848 849
    spec_constr   = dopt Opt_SpecConstr dflags
    liberate_case = dopt Opt_LiberateCase dflags
850
    rule_check    = ruleCheck dflags
851
    vectorisation = dopt Opt_Vectorise dflags
Simon Marlow's avatar
Simon Marlow committed
852
    -- static_args   = dopt Opt_StaticArgumentTransformation dflags
853

854
    maybe_rule_check phase = runMaybe rule_check (CoreDoRuleCheck phase)
855

856 857 858 859 860 861 862
    simpl_phase phase names iter
      = CoreDoPasses
          [ CoreDoSimplify (SimplPhase phase names) [
              MaxSimplifierIterations iter
            ],
            maybe_rule_check phase
          ]
863

864 865
                -- By default, we have 2 phases before phase 0.

Ian Lynagh's avatar
Ian Lynagh committed
866 867 868 869
                -- Want to run with inline phase 2 after the specialiser to give
                -- maximum chance for fusion to work before we inline build/augment
                -- in phase 1.  This made a difference in 'ansi' where an
                -- overloaded function wasn't inlined till too late.
870

Ian Lynagh's avatar
Ian Lynagh committed
871 872 873 874
                -- Need phase 1 so that build/augment get
                -- inlined.  I found that spectral/hartel/genfft lost some useful
                -- strictness in the function sumcode' if augment is not inlined
                -- before strictness analysis runs
875
    simpl_phases = CoreDoPasses [ simpl_phase phase ["main"] max_iter
876 877
                                  | phase <- [phases, phases-1 .. 1] ]

878

Ian Lynagh's avatar
Ian Lynagh committed
879
        -- initial simplify: mk specialiser happy: minimum effort please
880
    simpl_gently = CoreDoSimplify SimplGently [
Ian Lynagh's avatar
Ian Lynagh committed
881 882 883 884 885 886 887 888 889 890 891 892 893 894
                        --      Simplify "gently"
                        -- Don't inline anything till full laziness has bitten
                        -- In particular, inlining wrappers inhibits floating
                        -- e.g. ...(case f x of ...)...
                        --  ==> ...(case (case x of I# x# -> fw x#) of ...)...
                        --  ==> ...(case x of I# x# -> case fw x# of ...)...
                        -- and now the redex (f x) isn't floatable any more
                        -- Similarly, don't apply any rules until after full
                        -- laziness.  Notably, list fusion can prevent floating.

            NoCaseOfCase,       -- Don't do case-of-case transformations.
                                -- This makes full laziness work better
            MaxSimplifierIterations max_iter
        ]
895

rl@cse.unsw.edu.au's avatar
rl@cse.unsw.edu.au committed
896
    core_todo =
897
     if opt_level == 0 then
rl@cse.unsw.edu.au's avatar
rl@cse.unsw.edu.au committed
898 899
       [runWhen vectorisation (CoreDoPasses [ simpl_gently, CoreDoVectorisation ]),
        simpl_phase 0 ["final"] max_iter]
Ian Lynagh's avatar
Ian Lynagh committed
900
     else {- opt_level >= 1 -} [
901

902 903 904 905
    -- We want to do the static argument transform before full laziness as it
    -- may expose extra opportunities to float things outwards. However, to fix
    -- up the output of the transformation we need at do at least one simplify
    -- after this before anything else
Ian Lynagh's avatar
Ian Lynagh committed
906
            -- runWhen static_args CoreDoStaticArgs,
Simon Marlow's avatar
Simon Marlow committed
907
            -- XXX disabled, see #2321
908

Ian Lynagh's avatar
Ian Lynagh committed
909
        -- initial simplify: mk specialiser happy: minimum effort please
910
        simpl_gently,
911 912 913

        -- We run vectorisation here for now, but we might also try to run
        -- it later
914
        runWhen vectorisation (CoreDoPasses [ CoreDoVectorisation, simpl_gently ]),
915

Ian Lynagh's avatar
Ian Lynagh committed
916 917 918
        -- Specialisation is best done before full laziness
        -- so that overloaded functions have all their dictionary lambdas manifest
        CoreDoSpecialising,
919

Ian Lynagh's avatar
Ian Lynagh committed
920
        runWhen full_laziness (CoreDoFloatOutwards (FloatOutSw False False)),
921

Ian Lynagh's avatar
Ian Lynagh committed
922
        CoreDoFloatInwards,
923

924
        simpl_phases,
925

Ian Lynagh's avatar
Ian Lynagh committed
926 927
                -- Phase 0: allow all Ids to be inlined now
                -- This gets foldr inlined before strictness analysis
928

Ian Lynagh's avatar
Ian Lynagh committed
929 930 931 932 933 934 935 936
                -- At least 3 iterations because otherwise we land up with
                -- huge dead expressions because of an infelicity in the
                -- simpifier.
                --      let k = BIG in foldr k z xs
                -- ==>  let k = BIG in letrec go = \xs -> ...(k x).... in go xs
                -- ==>  let k = BIG in letrec go = \xs -> ...(BIG x).... in go xs
                -- Don't stop now!
        simpl_phase 0 ["main"] (max max_iter 3),
937 938 939


#ifdef OLD_STRICTNESS
Ian Lynagh's avatar
Ian Lynagh committed
940
        CoreDoOldStrictness,
941
#endif
Ian Lynagh's avatar
Ian Lynagh committed
942 943 944 945
        runWhen strictness (CoreDoPasses [
                CoreDoStrictness,
                CoreDoWorkerWrapper,
                CoreDoGlomBinds,
946
                simpl_phase 0 ["post-worker-wrapper"] max_iter
947
                ]),
948

Ian Lynagh's avatar
Ian Lynagh committed
949 950 951 952 953 954 955 956
        runWhen full_laziness
          (CoreDoFloatOutwards (FloatOutSw False    -- Not lambdas
                                           True)),  -- Float constants
                -- nofib/spectral/hartel/wang doubles in speed if you
                -- do full laziness late in the day.  It only happens
                -- after fusion and other stuff, so the early pass doesn't
                -- catch it.  For the record, the redex is
                --        f_el22 (f_el21 r_midblock)
957 958


Ian Lynagh's avatar
Ian Lynagh committed
959 960 961 962
        runWhen cse CoreCSE,
                -- We want CSE to follow the final full-laziness pass, because it may
                -- succeed in commoning up things floated out by full laziness.
                -- CSE used to rely on the no-shadowing invariant, but it doesn't any more
963

Ian Lynagh's avatar
Ian Lynagh committed
964
        CoreDoFloatInwards,
965

Ian Lynagh's avatar
Ian Lynagh committed
966
        maybe_rule_check 0,
967

Ian Lynagh's avatar
Ian Lynagh committed
968 969 970 971
                -- Case-liberation for -O2.  This should be after
                -- strictness analysis and the simplification which follows it.
        runWhen liberate_case (CoreDoPasses [
            CoreLiberateCase,
972
            simpl_phase 0 ["post-liberate-case"] max_iter
Ian Lynagh's avatar
Ian Lynagh committed
973 974 975
            ]),         -- Run the simplifier after LiberateCase to vastly
                        -- reduce the possiblility of shadowing
                        -- Reason: see Note [Shadowing] in SpecConstr.lhs
976

Ian Lynagh's avatar
Ian Lynagh committed
977
        runWhen spec_constr CoreDoSpecConstr,
978

979
        maybe_rule_check 0,
980

Ian Lynagh's avatar
Ian Lynagh committed
981
        -- Final clean-up simplification:
982
        simpl_phase 0 ["final"] max_iter
983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998
     ]

-- -----------------------------------------------------------------------------
-- StgToDo:  abstraction of stg-to-stg passes to run.

data StgToDo
  = StgDoMassageForProfiling  -- should be (next to) last
  -- There's also setStgVarInfo, but its absolute "lastness"
  -- is so critical that it is hardwired in (no flag).
  | D_stg_stats

getStgToDo :: DynFlags -> [StgToDo]
getStgToDo dflags
  | Just todo <- stgToDo dflags = todo -- set explicitly by user
  | otherwise = todo2
  where
Ian Lynagh's avatar
Ian Lynagh committed
999
        stg_stats = dopt Opt_StgStats dflags
1000

Ian Lynagh's avatar
Ian Lynagh committed
1001
        todo1 = if stg_stats then [D_stg_stats] else []
1002

Ian Lynagh's avatar
Ian Lynagh committed
1003 1004 1005 1006
        todo2 | WayProf `elem` wayNames dflags
              = StgDoMassageForProfiling : todo1
              | otherwise
              = todo1
1007 1008 1009 1010

-- -----------------------------------------------------------------------------
-- DynFlags parser

1011 1012
allFlags :: [String]
allFlags = map ('-':) $
1013
           [ flagName flag | flag <- dynamic_flags, ok (flagOptKind flag) ] ++
1014
           map ("fno-"++) flags ++
1015
           map ("f