2 % (c) The University of Glasgow, 1996-2000
4 \section[CmdLineOpts]{Things to do with command-line options}
9 CoreToDo(..), StgToDo(..),
11 SimplifierMode(..), FloatOutSwitches(..),
14 DynFlag(..), -- needed non-abstractly by DriverFlags
21 -- Manipulating DynFlags
22 defaultDynFlags, -- DynFlags
23 dopt, -- DynFlag -> DynFlags -> Bool
24 dopt_set, dopt_unset, -- DynFlags -> DynFlag -> DynFlags
25 dopt_CoreToDo, -- DynFlags -> [CoreToDo]
26 dopt_StgToDo, -- DynFlags -> [StgToDo]
27 dopt_HscLang, -- DynFlags -> HscLang
28 dopt_OutName, -- DynFlags -> String
30 -- Manipulating the DynFlags state
31 getDynFlags, -- IO DynFlags
32 setDynFlags, -- DynFlags -> IO ()
33 updDynFlags, -- (DynFlags -> DynFlags) -> IO ()
34 dynFlag, -- (DynFlags -> a) -> IO a
35 setDynFlag, unSetDynFlag, -- DynFlag -> IO ()
36 saveDynFlags, -- IO ()
37 restoreDynFlags, -- IO DynFlags
39 -- sets of warning opts
44 -- Output style options
46 opt_PprStyle_RawTypes,
51 opt_AutoSccsOnAllToplevs,
52 opt_AutoSccsOnExportedToplevs,
53 opt_AutoSccsOnIndividualCafs,
61 opt_MaxContextReductionDepth,
62 opt_IrrefutableTuples,
66 opt_NoMonomorphismRestriction,
73 opt_LiberateCaseThreshold,
74 opt_StgDoLetNoEscapes,
77 opt_UnboxStrictFields,
78 opt_SimplNoPreInlining,
79 opt_SimplDoEtaReduction,
80 opt_SimplDoLambdaEtaExpansion,
82 opt_SimplExcessPrecision,
86 opt_UF_CreationThreshold,
88 opt_UF_FunAppDiscount,
97 opt_EnsureSplittableC,
102 opt_IgnoreIfacePragmas,
105 opt_OmitInterfacePragmas,
113 #include "HsVersions.h"
116 import IOExts ( IORef, readIORef, writeIORef )
117 import Constants -- Default values for some flags
122 import Maybes ( firstJust )
125 %************************************************************************
127 \subsection{Command-line options}
129 %************************************************************************
131 The hsc command-line options are split into two categories:
136 Static flags are represented by top-level values of type Bool or Int,
137 for example. They therefore have the same value throughout the
140 Dynamic flags are represented by an abstract type, DynFlags, which is
141 passed into hsc by the compilation manager for every compilation.
142 Dynamic flags are those that change on a per-compilation basis,
143 perhaps because they may be present in the OPTIONS pragma at the top
146 Other flag-related blurb:
148 A list of {\em ToDo}s is things to be done in a particular part of
149 processing. A (fictitious) example for the Core-to-Core simplifier
150 might be: run the simplifier, then run the strictness analyser, then
151 run the simplifier again (three ``todos'').
153 There are three ``to-do processing centers'' at the moment. In the
154 main loop (\tr{main/Main.lhs}), in the Core-to-Core processing loop
155 (\tr{simplCore/SimplCore.lhs), and in the STG-to-STG processing loop
156 (\tr{simplStg/SimplStg.lhs}).
158 %************************************************************************
160 \subsection{Datatypes associated with command-line options}
162 %************************************************************************
165 data CoreToDo -- These are diff core-to-core passes,
166 -- which may be invoked in any order,
167 -- as many times as you like.
169 = CoreDoSimplify -- The core-to-core simplifier.
172 -- Each run of the simplifier can take a different
173 -- set of simplifier-specific flags.
175 | CoreDoFloatOutwards FloatOutSwitches
180 | CoreDoWorkerWrapper
187 | CoreDoRuleCheck Int{-CompilerPhase-} String -- Check for non-application of rules
188 -- matching this string
190 | CoreDoNothing -- useful when building up lists of these things
195 = StgDoMassageForProfiling -- should be (next to) last
196 -- There's also setStgVarInfo, but its absolute "lastness"
197 -- is so critical that it is hardwired in (no flag).
202 data SimplifierMode -- See comments in SimplMonad
206 data SimplifierSwitch
207 = MaxSimplifierIterations Int
210 data FloatOutSwitches
211 = FloatOutSw Bool -- True <=> float lambdas to top level
212 Bool -- True <=> float constants to top level,
213 -- even if they do not escape a lambda
216 %************************************************************************
218 \subsection{Dynamic command-line options}
220 %************************************************************************
233 | Opt_D_dump_inlinings
234 | Opt_D_dump_occur_anal
239 | Opt_D_dump_simpl_iterations
249 | Opt_D_dump_worker_wrapper
250 | Opt_D_dump_rn_trace
251 | Opt_D_dump_rn_stats
253 | Opt_D_dump_simpl_stats
254 | Opt_D_dump_tc_trace
257 | Opt_D_verbose_core2core
258 | Opt_D_verbose_stg2stg
260 | Opt_D_dump_hi_diffs
261 | Opt_D_dump_minimal_imports
266 | Opt_WarnDuplicateExports
268 | Opt_WarnIncompletePatterns
269 | Opt_WarnMissingFields
270 | Opt_WarnMissingMethods
271 | Opt_WarnMissingSigs
272 | Opt_WarnNameShadowing
273 | Opt_WarnOverlappingPatterns
274 | Opt_WarnSimplePatterns
275 | Opt_WarnTypeDefaults
276 | Opt_WarnUnusedBinds
277 | Opt_WarnUnusedImports
278 | Opt_WarnUnusedMatches
279 | Opt_WarnDeprecations
283 | Opt_AllowOverlappingInstances
284 | Opt_AllowUndecidableInstances
285 | Opt_AllowIncoherentInstances
288 | Opt_NoImplicitPrelude
292 data DynFlags = DynFlags {
293 coreToDo :: [CoreToDo],
294 stgToDo :: [StgToDo],
296 hscOutName :: String, -- name of the output file
297 hscStubHOutName :: String, -- name of the .stub_h output file
298 hscStubCOutName :: String, -- name of the .stub_c output file
299 extCoreName :: String, -- name of the .core output file
300 verbosity :: Int, -- verbosity level
301 cppFlag :: Bool, -- preprocess with cpp?
302 ppFlag :: Bool, -- preprocess with a Haskell Pp?
303 stolen_x86_regs :: Int,
304 cmdlineHcIncludes :: [String], -- -#includes
306 -- options for particular phases
331 defaultDynFlags = DynFlags {
332 coreToDo = [], stgToDo = [],
335 hscStubHOutName = "", hscStubCOutName = "",
341 cmdlineHcIncludes = [],
352 flags = standardWarnings,
358 0 | print errors & warnings only
359 1 | minimal verbosity: print "compiling M ... done." for each module.
360 2 | equivalent to -dshow-passes
361 3 | equivalent to existing "ghc -v"
362 4 | "ghc -v -ddump-most"
363 5 | "ghc -v -ddump-all"
366 dopt :: DynFlag -> DynFlags -> Bool
367 dopt f dflags = f `elem` (flags dflags)
369 dopt_CoreToDo :: DynFlags -> [CoreToDo]
370 dopt_CoreToDo = coreToDo
372 dopt_StgToDo :: DynFlags -> [StgToDo]
373 dopt_StgToDo = stgToDo
375 dopt_OutName :: DynFlags -> String
376 dopt_OutName = hscOutName
378 dopt_HscLang :: DynFlags -> HscLang
379 dopt_HscLang = hscLang
381 dopt_set :: DynFlags -> DynFlag -> DynFlags
382 dopt_set dfs f = dfs{ flags = f : flags dfs }
384 dopt_unset :: DynFlags -> DynFlag -> DynFlags
385 dopt_unset dfs f = dfs{ flags = filter (/= f) (flags dfs) }
388 -----------------------------------------------------------------------------
389 -- Mess about with the mutable variables holding the dynamic arguments
392 -- is the "baseline" dynamic flags, initialised from
393 -- the defaults and command line options, and updated by the
394 -- ':s' command in GHCi.
397 -- is the dynamic flags for the current compilation. It is reset
398 -- to the value of v_InitDynFlags before each compilation, then
399 -- updated by reading any OPTIONS pragma in the current module.
402 GLOBAL_VAR(v_InitDynFlags, defaultDynFlags, DynFlags)
403 GLOBAL_VAR(v_DynFlags, defaultDynFlags, DynFlags)
405 setDynFlags :: DynFlags -> IO ()
406 setDynFlags dfs = writeIORef v_DynFlags dfs
408 saveDynFlags :: IO ()
409 saveDynFlags = do dfs <- readIORef v_DynFlags
410 writeIORef v_InitDynFlags dfs
412 restoreDynFlags :: IO DynFlags
413 restoreDynFlags = do dfs <- readIORef v_InitDynFlags
414 writeIORef v_DynFlags dfs
417 getDynFlags :: IO DynFlags
418 getDynFlags = readIORef v_DynFlags
420 updDynFlags :: (DynFlags -> DynFlags) -> IO ()
421 updDynFlags f = do dfs <- readIORef v_DynFlags
422 writeIORef v_DynFlags (f dfs)
424 dynFlag :: (DynFlags -> a) -> IO a
425 dynFlag f = do dflags <- readIORef v_DynFlags; return (f dflags)
427 setDynFlag, unSetDynFlag :: DynFlag -> IO ()
428 setDynFlag f = updDynFlags (\dfs -> dopt_set dfs f)
429 unSetDynFlag f = updDynFlags (\dfs -> dopt_unset dfs f)
433 %************************************************************************
435 \subsection{Warnings}
437 %************************************************************************
441 = [ Opt_WarnDeprecations,
442 Opt_WarnOverlappingPatterns,
443 Opt_WarnMissingFields,
444 Opt_WarnMissingMethods,
445 Opt_WarnDuplicateExports
449 = standardWarnings ++
450 [ Opt_WarnUnusedBinds,
451 Opt_WarnUnusedMatches,
452 Opt_WarnUnusedImports,
453 Opt_WarnIncompletePatterns,
459 [ Opt_WarnTypeDefaults,
460 Opt_WarnNameShadowing,
466 %************************************************************************
468 \subsection{Classifying command-line options}
470 %************************************************************************
473 -- v_Statis_hsc_opts is here to avoid a circular dependency with
475 GLOBAL_VAR(v_Static_hsc_opts, [], [String])
477 lookUp :: FAST_STRING -> Bool
478 lookup_int :: String -> Maybe Int
479 lookup_def_int :: String -> Int -> Int
480 lookup_def_float :: String -> Float -> Float
481 lookup_str :: String -> Maybe String
483 unpacked_static_opts = unsafePerformIO (readIORef v_Static_hsc_opts)
484 packed_static_opts = map _PK_ unpacked_static_opts
486 lookUp sw = sw `elem` packed_static_opts
488 lookup_str sw = firstJust (map (startsWith sw) unpacked_static_opts)
490 lookup_int sw = case (lookup_str sw) of
492 Just xx -> Just (read xx)
494 lookup_def_int sw def = case (lookup_str sw) of
495 Nothing -> def -- Use default
498 lookup_def_float sw def = case (lookup_str sw) of
499 Nothing -> def -- Use default
504 Putting the compiler options into temporary at-files
505 may turn out to be necessary later on if we turn hsc into
506 a pure Win32 application where I think there's a command-line
507 length limit of 255. unpacked_opts understands the @ option.
509 unpacked_opts :: [String]
513 map _UNPK_ argv -- NOT ARGV any more: v_Static_hsc_opts
515 expandAts ('@':fname) = words (unsafePerformIO (readFile fname))
520 %************************************************************************
522 \subsection{Static options}
524 %************************************************************************
528 opt_PprStyle_NoPrags = lookUp SLIT("-dppr-noprags")
529 opt_PprStyle_Debug = lookUp SLIT("-dppr-debug")
530 opt_PprStyle_RawTypes = lookUp SLIT("-dppr-rawtypes")
531 opt_PprUserLength = lookup_def_int "-dppr-user-length" 5 --ToDo: give this a name
534 opt_AutoSccsOnAllToplevs = lookUp SLIT("-fauto-sccs-on-all-toplevs")
535 opt_AutoSccsOnExportedToplevs = lookUp SLIT("-fauto-sccs-on-exported-toplevs")
536 opt_AutoSccsOnIndividualCafs = lookUp SLIT("-fauto-sccs-on-individual-cafs")
537 opt_AutoSccsOnDicts = lookUp SLIT("-fauto-sccs-on-dicts")
538 opt_SccProfilingOn = lookUp SLIT("-fscc-profiling")
539 opt_DoTickyProfiling = lookUp SLIT("-fticky-ticky")
542 opt_AllStrict = lookUp SLIT("-fall-strict")
543 opt_NoMonomorphismRestriction = lookUp SLIT("-fno-monomorphism-restriction")
544 opt_DictsStrict = lookUp SLIT("-fdicts-strict")
545 opt_IrrefutableTuples = lookUp SLIT("-firrefutable-tuples")
546 opt_MaxContextReductionDepth = lookup_def_int "-fcontext-stack" mAX_CONTEXT_REDUCTION_DEPTH
547 opt_NumbersStrict = lookUp SLIT("-fnumbers-strict")
548 opt_Parallel = lookUp SLIT("-fparallel")
549 opt_SMP = lookUp SLIT("-fsmp")
552 opt_NoMethodSharing = lookUp SLIT("-fno-method-sharing")
553 opt_DoSemiTagging = lookUp SLIT("-fsemi-tagging")
554 opt_FoldrBuildOn = lookUp SLIT("-ffoldr-build-on")
555 opt_LiberateCaseThreshold = lookup_def_int "-fliberate-case-threshold" (10::Int)
556 opt_StgDoLetNoEscapes = lookUp SLIT("-flet-no-escape")
557 opt_UnfoldCasms = lookUp SLIT("-funfold-casms-in-hi-file")
558 opt_UsageSPOn = lookUp SLIT("-fusagesp-on")
559 opt_UnboxStrictFields = lookUp SLIT("-funbox-strict-fields")
560 opt_MaxWorkerArgs = lookup_def_int "-fmax-worker-args" (10::Int)
563 The optional '-inpackage=P' flag tells what package
564 we are compiling this module for.
565 The Prelude, for example is compiled with '-inpackage std'
567 opt_InPackage = case lookup_str "-inpackage=" of
569 Nothing -> SLIT("Main") -- The package name if none is specified
571 opt_EmitCExternDecls = lookUp SLIT("-femit-extern-decls")
572 opt_EnsureSplittableC = lookUp SLIT("-fglobalise-toplev-names")
573 opt_GranMacros = lookUp SLIT("-fgransim")
574 opt_HiVersion = read cProjectVersionInt :: Int
575 opt_HistorySize = lookup_def_int "-fhistory-size" 20
576 opt_IgnoreAsserts = lookUp SLIT("-fignore-asserts")
577 opt_IgnoreIfacePragmas = lookUp SLIT("-fignore-interface-pragmas")
578 opt_NoHiCheck = lookUp SLIT("-fno-hi-version-check")
579 opt_OmitBlackHoling = lookUp SLIT("-dno-black-holing")
580 opt_OmitInterfacePragmas = lookUp SLIT("-fomit-interface-pragmas")
581 opt_RuntimeTypes = lookUp SLIT("-fruntime-types")
583 -- Simplifier switches
584 opt_SimplNoPreInlining = lookUp SLIT("-fno-pre-inlining")
585 -- NoPreInlining is there just to see how bad things
586 -- get if you don't do it!
587 opt_SimplDoEtaReduction = lookUp SLIT("-fdo-eta-reduction")
588 opt_SimplDoLambdaEtaExpansion = lookUp SLIT("-fdo-lambda-eta-expansion")
589 opt_SimplCaseMerge = lookUp SLIT("-fcase-merge")
590 opt_SimplExcessPrecision = lookUp SLIT("-fexcess-precision")
593 opt_UF_CreationThreshold = lookup_def_int "-funfolding-creation-threshold" (45::Int)
594 opt_UF_UseThreshold = lookup_def_int "-funfolding-use-threshold" (8::Int) -- Discounts can be big
595 opt_UF_FunAppDiscount = lookup_def_int "-funfolding-fun-discount" (6::Int) -- It's great to inline a fn
596 opt_UF_KeenessFactor = lookup_def_float "-funfolding-keeness-factor" (1.5::Float)
597 opt_UF_UpdateInPlace = lookUp SLIT("-funfolding-update-in-place")
599 opt_UF_CheapOp = ( 1 :: Int) -- Only one instruction; and the args are charged for
600 opt_UF_DearOp = ( 4 :: Int)
602 opt_NoPruneDecls = lookUp SLIT("-fno-prune-decls")
603 opt_NoPruneTyDecls = lookUp SLIT("-fno-prune-tydecls")
604 opt_Static = lookUp SLIT("-static")
605 opt_Unregisterised = lookUp SLIT("-funregisterised")
606 opt_EmitExternalCore = lookUp SLIT("-fext-core")
609 %************************************************************************
611 \subsection{List of static hsc flags}
613 %************************************************************************
618 "fauto-sccs-on-all-toplevs",
619 "fauto-sccs-on-exported-toplevs",
620 "fauto-sccs-on-individual-cafs",
621 "fauto-sccs-on-dicts",
626 "firrefutable-tuples",
633 "funfold-casms-in-hi-file",
635 "funbox-strict-fields",
636 "femit-extern-decls",
637 "fglobalise-toplev-names",
640 "fignore-interface-pragmas",
641 "fno-hi-version-check",
643 "fno-method-sharing",
644 "fno-monomorphism-restriction",
645 "fomit-interface-pragmas",
649 "fdo-lambda-eta-expansion",
652 "funfolding-update-in-place",
660 || any (flip prefixMatch f) [
662 "fliberate-case-threshold",
665 "funfolding-creation-threshold",
666 "funfolding-use-threshold",
667 "funfolding-fun-discount",
668 "funfolding-keeness-factor"
672 %************************************************************************
674 \subsection{Misc functions for command-line options}
676 %************************************************************************
681 startsWith :: String -> String -> Maybe String
682 -- startsWith pfx (pfx++rest) = Just rest
684 startsWith [] str = Just str
685 startsWith (c:cs) (s:ss)
686 = if c /= s then Nothing else startsWith cs ss
687 startsWith _ [] = Nothing
689 endsWith :: String -> String -> Maybe String
691 = case (startsWith (reverse cs) (reverse ss)) of
693 Just rs -> Just (reverse rs)