2 % (c) The University of Glasgow, 1996-2000
4 \section[CmdLineOpts]{Things to do with command-line options}
9 CoreToDo(..), buildCoreToDo, StgToDo(..),
11 SimplifierMode(..), FloatOutSwitches(..),
14 DynFlag(..), -- needed non-abstractly by DriverFlags
22 -- Manipulating DynFlags
23 defaultDynFlags, -- DynFlags
24 dopt, -- DynFlag -> DynFlags -> Bool
25 dopt_set, dopt_unset, -- DynFlags -> DynFlag -> DynFlags
26 dopt_CoreToDo, -- DynFlags -> [CoreToDo]
27 dopt_StgToDo, -- DynFlags -> [StgToDo]
28 dopt_HscLang, -- DynFlags -> HscLang
29 dopt_OutName, -- DynFlags -> String
30 getOpts, -- (DynFlags -> [a]) -> IO [a]
34 -- sets of warning opts
38 -- Output style options
43 opt_AutoSccsOnAllToplevs,
44 opt_AutoSccsOnExportedToplevs,
45 opt_AutoSccsOnIndividualCafs,
51 opt_MaxContextReductionDepth,
52 opt_IrrefutableTuples,
61 opt_LiberateCaseThreshold,
64 opt_SimplNoPreInlining,
65 opt_SimplExcessPrecision,
69 opt_UF_CreationThreshold,
71 opt_UF_FunAppDiscount,
79 opt_EnsureSplittableC,
90 #include "HsVersions.h"
92 import {-# SOURCE #-} Packages (PackageState)
93 import Constants -- Default values for some flags
95 import FastString ( FastString, mkFastString )
97 import Maybes ( firstJust )
99 import Panic ( ghcError, GhcException(UsageError) )
101 import DATA_IOREF ( IORef, readIORef )
102 import UNSAFE_IO ( unsafePerformIO )
105 %************************************************************************
107 \subsection{Command-line options}
109 %************************************************************************
111 The hsc command-line options are split into two categories:
116 Static flags are represented by top-level values of type Bool or Int,
117 for example. They therefore have the same value throughout the
120 Dynamic flags are represented by an abstract type, DynFlags, which is
121 passed into hsc by the compilation manager for every compilation.
122 Dynamic flags are those that change on a per-compilation basis,
123 perhaps because they may be present in the OPTIONS pragma at the top
126 Other flag-related blurb:
128 A list of {\em ToDo}s is things to be done in a particular part of
129 processing. A (fictitious) example for the Core-to-Core simplifier
130 might be: run the simplifier, then run the strictness analyser, then
131 run the simplifier again (three ``todos'').
133 There are three ``to-do processing centers'' at the moment. In the
134 main loop (\tr{main/Main.lhs}), in the Core-to-Core processing loop
135 (\tr{simplCore/SimplCore.lhs), and in the STG-to-STG processing loop
136 (\tr{simplStg/SimplStg.lhs}).
138 %************************************************************************
140 \subsection{Datatypes associated with command-line options}
142 %************************************************************************
145 data CoreToDo -- These are diff core-to-core passes,
146 -- which may be invoked in any order,
147 -- as many times as you like.
149 = CoreDoSimplify -- The core-to-core simplifier.
152 -- Each run of the simplifier can take a different
153 -- set of simplifier-specific flags.
155 | CoreDoFloatOutwards FloatOutSwitches
160 | CoreDoWorkerWrapper
163 | CoreDoOldStrictness
166 | CoreDoRuleCheck Int{-CompilerPhase-} String -- Check for non-application of rules
167 -- matching this string
169 | CoreDoNothing -- useful when building up lists of these things
174 = StgDoMassageForProfiling -- should be (next to) last
175 -- There's also setStgVarInfo, but its absolute "lastness"
176 -- is so critical that it is hardwired in (no flag).
181 data SimplifierMode -- See comments in SimplMonad
185 data SimplifierSwitch
186 = MaxSimplifierIterations Int
189 data FloatOutSwitches
190 = FloatOutSw Bool -- True <=> float lambdas to top level
191 Bool -- True <=> float constants to top level,
192 -- even if they do not escape a lambda
195 %************************************************************************
197 \subsection{Dynamic command-line options}
199 %************************************************************************
212 | Opt_D_dump_inlinings
213 | Opt_D_dump_occur_anal
217 | Opt_D_dump_simpl_iterations
226 | Opt_D_dump_worker_wrapper
227 | Opt_D_dump_rn_trace
228 | Opt_D_dump_rn_stats
230 | Opt_D_dump_simpl_stats
231 | Opt_D_dump_tc_trace
232 | Opt_D_dump_if_trace
237 | Opt_D_verbose_core2core
238 | Opt_D_verbose_stg2stg
240 | Opt_D_dump_hi_diffs
241 | Opt_D_dump_minimal_imports
246 | Opt_WarnIsError -- -Werror; makes warnings fatal
247 | Opt_WarnDuplicateExports
249 | Opt_WarnIncompletePatterns
250 | Opt_WarnIncompletePatternsRecUpd
251 | Opt_WarnMissingFields
252 | Opt_WarnMissingMethods
253 | Opt_WarnMissingSigs
254 | Opt_WarnNameShadowing
255 | Opt_WarnOverlappingPatterns
256 | Opt_WarnSimplePatterns
257 | Opt_WarnTypeDefaults
258 | Opt_WarnUnusedBinds
259 | Opt_WarnUnusedImports
260 | Opt_WarnUnusedMatches
261 | Opt_WarnDeprecations
262 | Opt_WarnDodgyImports
266 | Opt_AllowOverlappingInstances
267 | Opt_AllowUndecidableInstances
268 | Opt_AllowIncoherentInstances
269 | Opt_MonomorphismRestriction
272 | Opt_PArr -- syntactic support for parallel arrays
273 | Opt_Arrows -- Arrow-notation syntax
277 | Opt_ImplicitPrelude
278 | Opt_ScopedTypeVariables
284 | Opt_IgnoreInterfacePragmas
285 | Opt_OmitInterfacePragmas
286 | Opt_DoLambdaEtaExpansion
290 | Opt_UnboxStrictFields
294 data DynFlags = DynFlags {
295 coreToDo :: Maybe [CoreToDo], -- reserved for use with -Ofile
296 stgToDo :: [StgToDo],
298 hscOutName :: String, -- name of the output file
299 hscStubHOutName :: String, -- name of the .stub_h output file
300 hscStubCOutName :: String, -- name of the .stub_c output file
301 extCoreName :: String, -- name of the .core output file
302 verbosity :: Int, -- verbosity level
303 optLevel :: Int, -- optimisation level
304 maxSimplIterations :: Int, -- max simplifier iterations
305 ruleCheck :: Maybe String,
306 cppFlag :: Bool, -- preprocess with cpp?
307 ppFlag :: Bool, -- preprocess with a Haskell Pp?
308 stolen_x86_regs :: Int,
309 cmdlineHcIncludes :: [String], -- -#includes
310 importPaths :: [FilePath],
312 -- options for particular phases
325 extraPkgConfs :: [FilePath],
326 -- The -package-conf flags given on the command line, in the order
329 readUserPkgConf :: Bool,
330 -- Whether or not to read the user package database
331 -- (-no-user-package-conf).
333 packageFlags :: [PackageFlag],
334 -- The -package and -hide-package flags from the command-line
337 pkgState :: PackageState,
344 = ExposePackage String
346 | IgnorePackage String
358 | cGhcWithNativeCodeGen == "YES" &&
359 (prefixMatch "i386" cTARGETPLATFORM ||
360 prefixMatch "sparc" cTARGETPLATFORM ||
361 prefixMatch "powerpc" cTARGETPLATFORM) = HscAsm
364 defaultDynFlags = DynFlags {
365 coreToDo = Nothing, stgToDo = [],
366 hscLang = defaultHscLang,
368 hscStubHOutName = "", hscStubCOutName = "",
372 maxSimplIterations = 4,
377 cmdlineHcIncludes = [],
391 readUserPkgConf = True,
393 pkgState = error "pkgState",
397 Opt_MonomorphismRestriction,
399 -- Generating the helper-functions for
400 -- generics is now on by default
402 -- strictness is on by default, but this only
404 Opt_CSE, -- similarly for CSE.
405 Opt_FullLaziness, -- ...and for full laziness
407 Opt_DoLambdaEtaExpansion,
408 -- This one is important for a tiresome reason:
409 -- we want to make sure that the bindings for data
410 -- constructors are eta-expanded. This is probably
411 -- a good thing anyway, but it seems fragile.
413 -- and the default no-optimisation options:
414 Opt_IgnoreInterfacePragmas,
415 Opt_OmitInterfacePragmas
417 ] ++ standardWarnings
423 0 | print errors & warnings only
424 1 | minimal verbosity: print "compiling M ... done." for each module.
425 2 | equivalent to -dshow-passes
426 3 | equivalent to existing "ghc -v"
427 4 | "ghc -v -ddump-most"
428 5 | "ghc -v -ddump-all"
431 dopt :: DynFlag -> DynFlags -> Bool
432 dopt f dflags = f `elem` (flags dflags)
434 dopt_CoreToDo :: DynFlags -> Maybe [CoreToDo]
435 dopt_CoreToDo = coreToDo
437 dopt_StgToDo :: DynFlags -> [StgToDo]
438 dopt_StgToDo = stgToDo
440 dopt_OutName :: DynFlags -> String
441 dopt_OutName = hscOutName
443 dopt_HscLang :: DynFlags -> HscLang
444 dopt_HscLang = hscLang
446 dopt_set :: DynFlags -> DynFlag -> DynFlags
447 dopt_set dfs f = dfs{ flags = f : flags dfs }
449 dopt_unset :: DynFlags -> DynFlag -> DynFlags
450 dopt_unset dfs f = dfs{ flags = filter (/= f) (flags dfs) }
452 getOpts :: DynFlags -> (DynFlags -> [a]) -> [a]
453 -- We add to the options from the front, so we need to reverse the list
454 getOpts dflags opts = reverse (opts dflags)
457 | verbosity dflags >= 3 = "-v"
460 -----------------------------------------------------------------------------
461 -- Setting the optimisation level
465 then dfs2{ hscLang = HscC, optLevel = n } -- turn on -fvia-C with -O
466 else dfs2{ optLevel = n }
468 dfs1 = foldr (flip dopt_unset) dfs remove_dopts
469 dfs2 = foldr (flip dopt_set) dfs1 extra_dopts
472 | n == 0 = opt_0_dopts
473 | otherwise = opt_1_dopts
476 | n == 0 = opt_1_dopts
477 | otherwise = opt_0_dopts
480 Opt_IgnoreInterfacePragmas,
481 Opt_OmitInterfacePragmas
490 -- Core-to-core phases:
492 buildCoreToDo :: DynFlags -> [CoreToDo]
493 buildCoreToDo dflags = core_todo
495 opt_level = optLevel dflags
496 max_iter = maxSimplIterations dflags
497 strictness = dopt Opt_Strictness dflags
498 full_laziness = dopt Opt_FullLaziness dflags
499 cse = dopt Opt_CSE dflags
500 rule_check = ruleCheck dflags
503 if opt_level == 0 then
505 CoreDoSimplify (SimplPhase 0) [
506 MaxSimplifierIterations max_iter
510 else {- opt_level >= 1 -} [
512 -- initial simplify: mk specialiser happy: minimum effort please
513 CoreDoSimplify SimplGently [
515 -- Don't inline anything till full laziness has bitten
516 -- In particular, inlining wrappers inhibits floating
517 -- e.g. ...(case f x of ...)...
518 -- ==> ...(case (case x of I# x# -> fw x#) of ...)...
519 -- ==> ...(case x of I# x# -> case fw x# of ...)...
520 -- and now the redex (f x) isn't floatable any more
521 -- Similarly, don't apply any rules until after full
522 -- laziness. Notably, list fusion can prevent floating.
525 -- Don't do case-of-case transformations.
526 -- This makes full laziness work better
527 MaxSimplifierIterations max_iter
530 -- Specialisation is best done before full laziness
531 -- so that overloaded functions have all their dictionary lambdas manifest
534 if full_laziness then CoreDoFloatOutwards (FloatOutSw False False)
539 CoreDoSimplify (SimplPhase 2) [
540 -- Want to run with inline phase 2 after the specialiser to give
541 -- maximum chance for fusion to work before we inline build/augment
542 -- in phase 1. This made a difference in 'ansi' where an
543 -- overloaded function wasn't inlined till too late.
544 MaxSimplifierIterations max_iter
546 case rule_check of { Just pat -> CoreDoRuleCheck 2 pat; Nothing -> CoreDoNothing },
548 CoreDoSimplify (SimplPhase 1) [
549 -- Need inline-phase2 here so that build/augment get
550 -- inlined. I found that spectral/hartel/genfft lost some useful
551 -- strictness in the function sumcode' if augment is not inlined
552 -- before strictness analysis runs
553 MaxSimplifierIterations max_iter
555 case rule_check of { Just pat -> CoreDoRuleCheck 1 pat; Nothing -> CoreDoNothing },
557 CoreDoSimplify (SimplPhase 0) [
558 -- Phase 0: allow all Ids to be inlined now
559 -- This gets foldr inlined before strictness analysis
561 MaxSimplifierIterations 3
562 -- At least 3 iterations because otherwise we land up with
563 -- huge dead expressions because of an infelicity in the
565 -- let k = BIG in foldr k z xs
566 -- ==> let k = BIG in letrec go = \xs -> ...(k x).... in go xs
567 -- ==> let k = BIG in letrec go = \xs -> ...(BIG x).... in go xs
571 case rule_check of { Just pat -> CoreDoRuleCheck 0 pat; Nothing -> CoreDoNothing },
573 #ifdef OLD_STRICTNESS
576 if strictness then CoreDoStrictness else CoreDoNothing,
580 CoreDoSimplify (SimplPhase 0) [
581 MaxSimplifierIterations max_iter
584 if full_laziness then
585 CoreDoFloatOutwards (FloatOutSw False -- Not lambdas
586 True) -- Float constants
588 -- nofib/spectral/hartel/wang doubles in speed if you
589 -- do full laziness late in the day. It only happens
590 -- after fusion and other stuff, so the early pass doesn't
591 -- catch it. For the record, the redex is
592 -- f_el22 (f_el21 r_midblock)
595 -- We want CSE to follow the final full-laziness pass, because it may
596 -- succeed in commoning up things floated out by full laziness.
597 -- CSE used to rely on the no-shadowing invariant, but it doesn't any more
599 if cse then CoreCSE else CoreDoNothing,
603 -- Case-liberation for -O2. This should be after
604 -- strictness analysis and the simplification which follows it.
606 case rule_check of { Just pat -> CoreDoRuleCheck 0 pat; Nothing -> CoreDoNothing },
608 if opt_level >= 2 then
612 if opt_level >= 2 then
617 -- Final clean-up simplification:
618 CoreDoSimplify (SimplPhase 0) [
619 MaxSimplifierIterations max_iter
624 %************************************************************************
626 \subsection{Warnings}
628 %************************************************************************
632 = [ Opt_WarnDeprecations,
633 Opt_WarnOverlappingPatterns,
634 Opt_WarnMissingFields,
635 Opt_WarnMissingMethods,
636 Opt_WarnDuplicateExports
640 = standardWarnings ++
641 [ Opt_WarnUnusedBinds,
642 Opt_WarnUnusedMatches,
643 Opt_WarnUnusedImports,
644 Opt_WarnIncompletePatterns,
650 [ Opt_WarnTypeDefaults,
651 Opt_WarnNameShadowing,
658 %************************************************************************
660 \subsection{Classifying command-line options}
662 %************************************************************************
665 -- v_Statis_hsc_opts is here to avoid a circular dependency with
667 GLOBAL_VAR(v_Static_hsc_opts, [], [String])
669 lookUp :: FastString -> Bool
670 lookup_def_int :: String -> Int -> Int
671 lookup_def_float :: String -> Float -> Float
672 lookup_str :: String -> Maybe String
674 unpacked_static_opts = unsafePerformIO (readIORef v_Static_hsc_opts)
675 packed_static_opts = map mkFastString unpacked_static_opts
677 lookUp sw = sw `elem` packed_static_opts
679 -- (lookup_str "foo") looks for the flag -foo=X or -fooX,
680 -- and returns the string X
682 = case firstJust (map (startsWith sw) unpacked_static_opts) of
683 Just ('=' : str) -> Just str
687 lookup_def_int sw def = case (lookup_str sw) of
688 Nothing -> def -- Use default
689 Just xx -> try_read sw xx
691 lookup_def_float sw def = case (lookup_str sw) of
692 Nothing -> def -- Use default
693 Just xx -> try_read sw xx
696 try_read :: Read a => String -> String -> a
697 -- (try_read sw str) tries to read s; if it fails, it
698 -- bleats about flag sw
701 ((x,_):_) -> x -- Be forgiving: ignore trailing goop, and alternative parses
702 [] -> ghcError (UsageError ("Malformed argument " ++ str ++ " for flag " ++ sw))
703 -- ToDo: hack alert. We should really parse the arugments
704 -- and announce errors in a more civilised way.
708 Putting the compiler options into temporary at-files
709 may turn out to be necessary later on if we turn hsc into
710 a pure Win32 application where I think there's a command-line
711 length limit of 255. unpacked_opts understands the @ option.
713 unpacked_opts :: [String]
717 map unpackFS argv -- NOT ARGV any more: v_Static_hsc_opts
719 expandAts ('@':fname) = words (unsafePerformIO (readFile fname))
724 %************************************************************************
726 \subsection{Static options}
728 %************************************************************************
732 opt_PprStyle_Debug = lookUp FSLIT("-dppr-debug")
733 opt_PprUserLength = lookup_def_int "-dppr-user-length" 5 --ToDo: give this a name
736 opt_AutoSccsOnAllToplevs = lookUp FSLIT("-fauto-sccs-on-all-toplevs")
737 opt_AutoSccsOnExportedToplevs = lookUp FSLIT("-fauto-sccs-on-exported-toplevs")
738 opt_AutoSccsOnIndividualCafs = lookUp FSLIT("-fauto-sccs-on-individual-cafs")
739 opt_SccProfilingOn = lookUp FSLIT("-fscc-profiling")
740 opt_DoTickyProfiling = lookUp FSLIT("-fticky-ticky")
743 opt_AllStrict = lookUp FSLIT("-fall-strict")
744 opt_DictsStrict = lookUp FSLIT("-fdicts-strict")
745 opt_IrrefutableTuples = lookUp FSLIT("-firrefutable-tuples")
746 opt_MaxContextReductionDepth = lookup_def_int "-fcontext-stack" mAX_CONTEXT_REDUCTION_DEPTH
747 opt_Parallel = lookUp FSLIT("-fparallel")
748 opt_SMP = lookUp FSLIT("-fsmp")
749 opt_Flatten = lookUp FSLIT("-fflatten")
752 opt_NoStateHack = lookUp FSLIT("-fno-state-hack")
753 opt_NoMethodSharing = lookUp FSLIT("-fno-method-sharing")
754 opt_CprOff = lookUp FSLIT("-fcpr-off")
755 opt_RulesOff = lookUp FSLIT("-frules-off")
756 -- Switch off CPR analysis in the new demand analyser
757 opt_LiberateCaseThreshold = lookup_def_int "-fliberate-case-threshold" (10::Int)
758 opt_MaxWorkerArgs = lookup_def_int "-fmax-worker-args" (10::Int)
760 opt_EmitCExternDecls = lookUp FSLIT("-femit-extern-decls")
761 opt_EnsureSplittableC = lookUp FSLIT("-fglobalise-toplev-names")
762 opt_GranMacros = lookUp FSLIT("-fgransim")
763 opt_HiVersion = read (cProjectVersionInt ++ cProjectPatchLevel) :: Int
764 opt_HistorySize = lookup_def_int "-fhistory-size" 20
765 opt_OmitBlackHoling = lookUp FSLIT("-dno-black-holing")
766 opt_RuntimeTypes = lookUp FSLIT("-fruntime-types")
768 -- Simplifier switches
769 opt_SimplNoPreInlining = lookUp FSLIT("-fno-pre-inlining")
770 -- NoPreInlining is there just to see how bad things
771 -- get if you don't do it!
772 opt_SimplExcessPrecision = lookUp FSLIT("-fexcess-precision")
775 opt_UF_CreationThreshold = lookup_def_int "-funfolding-creation-threshold" (45::Int)
776 opt_UF_UseThreshold = lookup_def_int "-funfolding-use-threshold" (8::Int) -- Discounts can be big
777 opt_UF_FunAppDiscount = lookup_def_int "-funfolding-fun-discount" (6::Int) -- It's great to inline a fn
778 opt_UF_KeenessFactor = lookup_def_float "-funfolding-keeness-factor" (1.5::Float)
779 opt_UF_UpdateInPlace = lookUp FSLIT("-funfolding-update-in-place")
781 opt_UF_DearOp = ( 4 :: Int)
783 opt_Static = lookUp FSLIT("-static")
784 opt_Unregisterised = lookUp FSLIT("-funregisterised")
785 opt_EmitExternalCore = lookUp FSLIT("-fext-core")
787 -- Include full span info in error messages, instead of just the start position.
788 opt_ErrorSpans = lookUp FSLIT("-ferror-spans")
790 opt_PIC = lookUp FSLIT("-fPIC")
793 %************************************************************************
795 \subsection{List of static hsc flags}
797 %************************************************************************
802 "fauto-sccs-on-all-toplevs",
803 "fauto-sccs-on-exported-toplevs",
804 "fauto-sccs-on-individual-cafs",
805 "fauto-sccs-on-dicts",
810 "firrefutable-tuples",
816 "femit-extern-decls",
817 "fglobalise-toplev-names",
819 "fno-hi-version-check",
821 "fno-method-sharing",
826 "funfolding-update-in-place",
836 || any (flip prefixMatch f) [
838 "fliberate-case-threshold",
841 "funfolding-creation-threshold",
842 "funfolding-use-threshold",
843 "funfolding-fun-discount",
844 "funfolding-keeness-factor"
848 %************************************************************************
850 \subsection{Misc functions for command-line options}
852 %************************************************************************
857 startsWith :: String -> String -> Maybe String
858 -- startsWith pfx (pfx++rest) = Just rest
860 startsWith [] str = Just str
861 startsWith (c:cs) (s:ss)
862 = if c /= s then Nothing else startsWith cs ss
863 startsWith _ [] = Nothing
865 endsWith :: String -> String -> Maybe String
867 = case (startsWith (reverse cs) (reverse ss)) of
869 Just rs -> Just (reverse rs)