X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=compiler%2Fmain%2FDynFlags.hs;h=cda06e5f4c9f444cc929b4882f84a8c9f87d0be0;hp=86598e9eb29779105ae0b69af7c544ce03699b95;hb=7d52c74cab50d3c9a5e76be5b97d63b60069bc2e;hpb=a1579a34bba86590e3656e5c7e88a78a9fb2f584 diff --git a/compiler/main/DynFlags.hs b/compiler/main/DynFlags.hs index 86598e9..cda06e5 100644 --- a/compiler/main/DynFlags.hs +++ b/compiler/main/DynFlags.hs @@ -1,3 +1,4 @@ + {-# OPTIONS -fno-warn-missing-fields #-} ----------------------------------------------------------------------------- -- @@ -16,7 +17,7 @@ module DynFlags ( -- Dynamic flags DynFlag(..), DynFlags(..), - HscTarget(..), + HscTarget(..), isObjectTarget, defaultObjectTarget, GhcMode(..), isOneShot, GhcLink(..), isNoLink, PackageFlag(..), @@ -39,13 +40,14 @@ module DynFlags ( getVerbFlag, updOptLevel, setTmpDir, + setPackageName, -- parsing DynFlags parseDynamicFlags, allFlags, -- misc stuff - machdepCCOpts, picCCOpts, + machdepCCOpts, picCCOpts ) where #include "HsVersions.h" @@ -66,22 +68,22 @@ import Constants ( mAX_CONTEXT_REDUCTION_DEPTH ) import Panic ( panic, GhcException(..) ) import UniqFM ( UniqFM ) import Util ( notNull, splitLongestPrefix, normalisePath ) -import Maybes ( fromJust, orElse ) +import Maybes ( orElse, fromJust ) import SrcLoc ( SrcSpan ) +import Outputable +import {-# SOURCE #-} ErrUtils ( Severity(..), Message, mkLocMessage ) -import DATA_IOREF ( readIORef ) -import EXCEPTION ( throwDyn ) -import Monad ( when ) +import Data.IORef ( readIORef ) +import Control.Exception ( throwDyn ) +import Control.Monad ( when ) #ifdef mingw32_TARGET_OS import Data.List ( isPrefixOf ) #else import Util ( split ) #endif -import Char ( isDigit, isUpper ) -import Outputable +import Data.Char ( isUpper, toLower ) import System.IO ( hPutStrLn, stderr ) -import {-# SOURCE #-} ErrUtils ( Severity(..), Message, mkLocMessage ) -- ----------------------------------------------------------------------------- -- DynFlags @@ -90,6 +92,7 @@ data DynFlag -- debugging flags = Opt_D_dump_cmm + | Opt_D_dump_cps_cmm | Opt_D_dump_asm | Opt_D_dump_cpranal | Opt_D_dump_deriv @@ -97,6 +100,7 @@ data DynFlag | Opt_D_dump_flatC | Opt_D_dump_foreign | Opt_D_dump_inlinings + | Opt_D_dump_rule_firings | Opt_D_dump_occur_anal | Opt_D_dump_parsed | Opt_D_dump_rn @@ -120,12 +124,14 @@ data DynFlag | Opt_D_dump_splices | Opt_D_dump_BCOs | Opt_D_dump_vect + | Opt_D_dump_hpc | 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 + | Opt_D_dump_mod_cycles | Opt_D_faststring_stats | Opt_DoCoreLinting | Opt_DoStgLinting @@ -134,6 +140,7 @@ data DynFlag | Opt_WarnIsError -- -Werror; makes warnings fatal | Opt_WarnDuplicateExports | Opt_WarnHiShadows + | Opt_WarnImplicitPrelude | Opt_WarnIncompletePatterns | Opt_WarnIncompletePatternsRecUpd | Opt_WarnMissingFields @@ -143,12 +150,14 @@ data DynFlag | Opt_WarnOverlappingPatterns | Opt_WarnSimplePatterns | Opt_WarnTypeDefaults + | Opt_WarnMonomorphism | Opt_WarnUnusedBinds | Opt_WarnUnusedImports | Opt_WarnUnusedMatches | Opt_WarnDeprecations | Opt_WarnDodgyImports | Opt_WarnOrphans + | Opt_WarnTabs -- language opts | Opt_AllowOverlappingInstances @@ -167,12 +176,31 @@ data DynFlag | Opt_ImplicitPrelude | Opt_ScopedTypeVariables | Opt_BangPatterns - | Opt_IndexedTypes + | Opt_TypeFamilies + | Opt_OverloadedStrings + | Opt_DisambiguateRecordFields + | Opt_RecordWildCards + | Opt_RecordPuns + | Opt_GADTs + | Opt_RelaxedPolyRec -- -X=RelaxedPolyRec + | Opt_TypeSynonymInstances + | Opt_FlexibleInstances + | Opt_MultiParamTypeClasses + | Opt_FunctionalDependencies + | Opt_MagicHash + | Opt_EmptyDataDecls + | Opt_KindSignatures + | Opt_ParallelListComp + | Opt_GeneralizedNewtypeDeriving + | Opt_RecursiveDo + | Opt_PatternGuards -- optimisation opts | Opt_Strictness | Opt_FullLaziness | Opt_CSE + | Opt_LiberateCase + | Opt_SpecConstr | Opt_IgnoreInterfacePragmas | Opt_OmitInterfacePragmas | Opt_DoLambdaEtaExpansion @@ -182,11 +210,13 @@ data DynFlag | Opt_CaseMerge | Opt_UnboxStrictFields | Opt_DictsCheap + | Opt_RewriteRules + | Opt_Vectorise -- misc opts | Opt_Cpp | Opt_Pp - | Opt_RecompChecking + | Opt_ForceRecomp | Opt_DryRun | Opt_DoAsmMangling | Opt_ExcessPrecision @@ -196,6 +226,9 @@ data DynFlag | Opt_StgStats | Opt_HideAllPackages | Opt_PrintBindResult + | Opt_Haddock + | Opt_Hpc_No_Auto + | Opt_BreakOnException -- keeping stuff | Opt_KeepHiDiffs @@ -218,6 +251,9 @@ data DynFlags = DynFlags { optLevel :: Int, -- optimisation level maxSimplIterations :: Int, -- max simplifier iterations ruleCheck :: Maybe String, + + specThreshold :: Int, -- Threshold for function specialisation + stolen_x86_regs :: Int, cmdlineHcIncludes :: [String], -- -#includes importPaths :: [FilePath], @@ -253,6 +289,8 @@ data DynFlags = DynFlags { ghcUsagePath :: FilePath, -- Filled in by SysTools ghciUsagePath :: FilePath, -- ditto + hpcDir :: String, -- ^ path to store the .mix files + -- options for particular phases opt_L :: [String], opt_P :: [String], @@ -304,29 +342,39 @@ data HscTarget = HscC | HscAsm | HscJava - | HscILX | HscInterpreted | HscNothing deriving (Eq, Show) +-- | 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. data GhcMode - = BatchCompile -- | @ghc --make Main@ - | Interactive -- | @ghc --interactive@ - | OneShot -- | @ghc -c Foo.hs@ - | JustTypecheck -- | Development environemnts, refactorer, etc. - | MkDepend + = CompManager -- ^ --make, GHCi, etc. + | OneShot -- ^ ghc -c Foo.hs + | MkDepend -- ^ ghc -M, see Finder for why we need this deriving Eq isOneShot :: GhcMode -> Bool isOneShot OneShot = True isOneShot _other = False +-- | What kind of linking to do. data GhcLink -- What to do in the link step, if there is one - = -- Only relevant for modes - -- DoMake and StopBefore StopLn - NoLink -- Don't link at all - | StaticLink -- Ordinary linker [the default] - | MkDLL -- Make a DLL + = NoLink -- Don't link at all + | LinkBinary -- Link object code into a binary + | LinkInMemory -- Use the in-memory dynamic linker + | LinkDynLib -- Link objects into a dynamic lib (DLL on Windows, DSO on ELF platforms) + deriving Eq isNoLink :: GhcLink -> Bool isNoLink NoLink = True @@ -338,7 +386,11 @@ data PackageFlag | IgnorePackage String deriving Eq -defaultHscTarget +defaultHscTarget = defaultObjectTarget + +-- | the 'HscTarget' value corresponding to the default way to create +-- object files on the current platform. +defaultObjectTarget | cGhcWithNativeCodeGen == "YES" = HscAsm | otherwise = HscC @@ -355,8 +407,8 @@ initDynFlags dflags = do defaultDynFlags = DynFlags { - ghcMode = OneShot, - ghcLink = StaticLink, + ghcMode = CompManager, + ghcLink = LinkBinary, coreToDo = Nothing, stgToDo = Nothing, hscTarget = defaultHscTarget, @@ -366,6 +418,7 @@ defaultDynFlags = optLevel = 0, maxSimplIterations = 4, ruleCheck = Nothing, + specThreshold = 200, stolen_x86_regs = 4, cmdlineHcIncludes = [], importPaths = ["."], @@ -391,6 +444,8 @@ defaultDynFlags = cmdlineFrameworks = [], tmpDir = cDEFAULT_TMPDIR, + hpcDir = ".hpc", + opt_L = [], opt_P = [], opt_F = [], @@ -405,9 +460,7 @@ defaultDynFlags = packageFlags = [], pkgDatabase = Nothing, pkgState = panic "no package state yet: call GHC.setSessionDynFlags", - flags = [ - Opt_RecompChecking, Opt_ReadUserPackageConf, Opt_MonoPatBinds, -- Experimentally, I'm making this non-standard @@ -416,27 +469,14 @@ defaultDynFlags = Opt_ImplicitPrelude, Opt_MonomorphismRestriction, - Opt_Strictness, - -- strictness is on by default, but this only - -- applies to -O. - Opt_CSE, -- similarly for CSE. - Opt_FullLaziness, -- ...and for full laziness - - Opt_DoLambdaEtaExpansion, - -- 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. - + Opt_DoAsmMangling, - -- and the default no-optimisation options: - Opt_IgnoreInterfacePragmas, - Opt_OmitInterfacePragmas - -- on by default: - Opt_PrintBindResult - ] ++ standardWarnings, + Opt_PrintBindResult ] + ++ [f | (ns,f) <- optLevelFlags, 0 `elem` ns] + -- The default -O0 options + ++ standardWarnings, log_action = \severity srcSpan style msg -> case severity of @@ -533,32 +573,39 @@ data Option updOptLevel :: Int -> DynFlags -> DynFlags -- Set dynflags appropriate to the optimisation level updOptLevel n dfs - = if (n >= 1) - then dfs2{ hscTarget = HscC, optLevel = n } -- turn on -fvia-C with -O - else dfs2{ optLevel = n } + = dfs2{ optLevel = final_n } where + final_n = max 0 (min 2 n) -- Clamp to 0 <= n <= 2 dfs1 = foldr (flip dopt_unset) dfs remove_dopts dfs2 = foldr (flip dopt_set) dfs1 extra_dopts - extra_dopts - | n == 0 = opt_0_dopts - | otherwise = opt_1_dopts - - remove_dopts - | n == 0 = opt_1_dopts - | otherwise = opt_0_dopts + extra_dopts = [ f | (ns,f) <- optLevelFlags, final_n `elem` ns ] + remove_dopts = [ f | (ns,f) <- optLevelFlags, final_n `notElem` ns ] -opt_0_dopts = [ - Opt_IgnoreInterfacePragmas, - Opt_OmitInterfacePragmas +optLevelFlags :: [([Int], DynFlag)] +optLevelFlags + = [ ([0], Opt_IgnoreInterfacePragmas) + , ([0], Opt_OmitInterfacePragmas) + + , ([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) + + , ([2], Opt_LiberateCase) + , ([2], Opt_SpecConstr) + + , ([0,1,2], Opt_DoLambdaEtaExpansion) + -- 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. ] -opt_1_dopts = [ - Opt_IgnoreAsserts, - Opt_DoEtaReduction, - Opt_CaseMerge - ] - -- ----------------------------------------------------------------------------- -- Standard sets of warning options @@ -614,8 +661,8 @@ data CoreToDo -- These are diff core-to-core passes, | CoreCSE | CoreDoRuleCheck Int{-CompilerPhase-} String -- Check for non-application of rules -- matching this string - - | CoreDoNothing -- useful when building up lists of these things + | CoreDoNothing -- Useful when building up + | CoreDoPasses [CoreToDo] -- lists of these things data SimplifierMode -- See comments in SimplMonad = SimplGently @@ -632,6 +679,9 @@ data FloatOutSwitches -- The core-to-core pass ordering is derived from the DynFlags: +runWhen :: Bool -> CoreToDo -> CoreToDo +runWhen True do_this = do_this +runWhen False do_this = CoreDoNothing getCoreToDo :: DynFlags -> [CoreToDo] getCoreToDo dflags @@ -643,6 +693,8 @@ getCoreToDo dflags strictness = dopt Opt_Strictness dflags full_laziness = dopt Opt_FullLaziness dflags cse = dopt Opt_CSE dflags + spec_constr = dopt Opt_SpecConstr dflags + liberate_case = dopt Opt_LiberateCase dflags rule_check = ruleCheck dflags core_todo = @@ -675,8 +727,7 @@ getCoreToDo dflags -- so that overloaded functions have all their dictionary lambdas manifest CoreDoSpecialising, - if full_laziness then CoreDoFloatOutwards (FloatOutSw False False) - else CoreDoNothing, + runWhen full_laziness (CoreDoFloatOutwards (FloatOutSw False False)), CoreDoFloatInwards, @@ -715,20 +766,19 @@ getCoreToDo dflags case rule_check of { Just pat -> CoreDoRuleCheck 0 pat; Nothing -> CoreDoNothing }, #ifdef OLD_STRICTNESS - CoreDoOldStrictness + CoreDoOldStrictness, #endif - if strictness then CoreDoStrictness else CoreDoNothing, - CoreDoWorkerWrapper, - CoreDoGlomBinds, - - CoreDoSimplify (SimplPhase 0) [ - MaxSimplifierIterations max_iter - ], - - if full_laziness then - CoreDoFloatOutwards (FloatOutSw False -- Not lambdas - True) -- Float constants - else CoreDoNothing, + runWhen strictness (CoreDoPasses [ + CoreDoStrictness, + CoreDoWorkerWrapper, + CoreDoGlomBinds, + CoreDoSimplify (SimplPhase 0) [ + MaxSimplifierIterations max_iter + ]]), + + 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 @@ -736,38 +786,29 @@ getCoreToDo dflags -- f_el22 (f_el21 r_midblock) - -- 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 - - if cse then CoreCSE else CoreDoNothing, + 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 CoreDoFloatInwards, --- Case-liberation for -O2. This should be after --- strictness analysis and the simplification which follows it. - - case rule_check of { Just pat -> CoreDoRuleCheck 0 pat; Nothing -> CoreDoNothing } - ] - - ++ + case rule_check of { Just pat -> CoreDoRuleCheck 0 pat; Nothing -> CoreDoNothing }, - (if opt_level >= 2 then - [ CoreLiberateCase, - CoreDoSimplify (SimplPhase 0) [ + -- Case-liberation for -O2. This should be after + -- strictness analysis and the simplification which follows it. + runWhen liberate_case (CoreDoPasses [ + CoreLiberateCase, + CoreDoSimplify (SimplPhase 0) [ MaxSimplifierIterations max_iter - ], -- Run the simplifier after LiberateCase to vastly + ] ]), -- Run the simplifier after LiberateCase to vastly -- reduce the possiblility of shadowing -- Reason: see Note [Shadowing] in SpecConstr.lhs - CoreDoSpecConstr - ] - else - []) - ++ + runWhen spec_constr CoreDoSpecConstr, -- Final clean-up simplification: - [ CoreDoSimplify (SimplPhase 0) [ + CoreDoSimplify (SimplPhase 0) [ MaxSimplifierIterations max_iter ] ] @@ -843,7 +884,7 @@ dynamic_flags = [ -------- Linking ---------------------------------------------------- , ( "c" , NoArg (upd $ \d -> d{ ghcLink=NoLink } )) , ( "no-link" , NoArg (upd $ \d -> d{ ghcLink=NoLink } )) -- Dep. - , ( "-mk-dll" , NoArg (upd $ \d -> d{ ghcLink=MkDLL } )) + , ( "shared" , NoArg (upd $ \d -> d{ ghcLink=LinkDynLib } )) ------- Libraries --------------------------------------------------- , ( "L" , Prefix addLibraryPath ) @@ -867,23 +908,30 @@ dynamic_flags = [ , ( "stubdir" , HasArg (upd . setStubDir . Just)) ------- Keeping temporary files ------------------------------------- - , ( "keep-hc-file" , AnySuffix (\_ -> setDynFlag Opt_KeepHcFiles)) - , ( "keep-s-file" , AnySuffix (\_ -> setDynFlag Opt_KeepSFiles)) - , ( "keep-raw-s-file", AnySuffix (\_ -> setDynFlag Opt_KeepRawSFiles)) - , ( "keep-tmp-files" , AnySuffix (\_ -> setDynFlag Opt_KeepTmpFiles)) + -- These can be singular (think ghc -c) or plural (think ghc --make) + , ( "keep-hc-file" , NoArg (setDynFlag Opt_KeepHcFiles)) + , ( "keep-hc-files" , NoArg (setDynFlag Opt_KeepHcFiles)) + , ( "keep-s-file" , NoArg (setDynFlag Opt_KeepSFiles)) + , ( "keep-s-files" , NoArg (setDynFlag Opt_KeepSFiles)) + , ( "keep-raw-s-file" , NoArg (setDynFlag Opt_KeepRawSFiles)) + , ( "keep-raw-s-files", NoArg (setDynFlag Opt_KeepRawSFiles)) + -- This only makes sense as plural + , ( "keep-tmp-files" , NoArg (setDynFlag Opt_KeepTmpFiles)) ------- Miscellaneous ---------------------------------------------- , ( "no-hs-main" , NoArg (setDynFlag Opt_NoHsMain)) , ( "main-is" , SepArg setMainIs ) + , ( "haddock" , NoArg (setDynFlag Opt_Haddock) ) + , ( "hpcdir" , SepArg setOptHpcDir ) - ------- recompilation checker -------------------------------------- - , ( "recomp" , NoArg (setDynFlag Opt_RecompChecking) ) - , ( "no-recomp" , NoArg (unSetDynFlag Opt_RecompChecking) ) + ------- recompilation checker (DEPRECATED, use -fforce-recomp) ----- + , ( "recomp" , NoArg (unSetDynFlag Opt_ForceRecomp) ) + , ( "no-recomp" , NoArg (setDynFlag Opt_ForceRecomp) ) ------- Packages ---------------------------------------------------- , ( "package-conf" , HasArg extraPkgConf_ ) , ( "no-user-package-conf", NoArg (unSetDynFlag Opt_ReadUserPackageConf) ) - , ( "package-name" , HasArg setPackageName ) + , ( "package-name" , HasArg (upd . setPackageName) ) , ( "package" , HasArg exposePackage ) , ( "hide-package" , HasArg hidePackage ) , ( "hide-all-packages", NoArg (setDynFlag Opt_HideAllPackages) ) @@ -902,6 +950,7 @@ dynamic_flags = [ , ( "dstg-stats", NoArg (setDynFlag Opt_StgStats)) , ( "ddump-cmm", setDumpFlag Opt_D_dump_cmm) + , ( "ddump-cps-cmm", setDumpFlag Opt_D_dump_cps_cmm) , ( "ddump-asm", setDumpFlag Opt_D_dump_asm) , ( "ddump-cpranal", setDumpFlag Opt_D_dump_cpranal) , ( "ddump-deriv", setDumpFlag Opt_D_dump_deriv) @@ -909,6 +958,7 @@ dynamic_flags = [ , ( "ddump-flatC", setDumpFlag Opt_D_dump_flatC) , ( "ddump-foreign", setDumpFlag Opt_D_dump_foreign) , ( "ddump-inlinings", setDumpFlag Opt_D_dump_inlinings) + , ( "ddump-rule-firings", setDumpFlag Opt_D_dump_rule_firings) , ( "ddump-occur-anal", setDumpFlag Opt_D_dump_occur_anal) , ( "ddump-parsed", setDumpFlag Opt_D_dump_parsed) , ( "ddump-rn", setDumpFlag Opt_D_dump_rn) @@ -923,25 +973,28 @@ dynamic_flags = [ , ( "ddump-rules", setDumpFlag Opt_D_dump_rules) , ( "ddump-cse", setDumpFlag Opt_D_dump_cse) , ( "ddump-worker-wrapper", setDumpFlag Opt_D_dump_worker_wrapper) - , ( "ddump-rn-trace", NoArg (setDynFlag Opt_D_dump_rn_trace)) - , ( "ddump-if-trace", NoArg (setDynFlag Opt_D_dump_if_trace)) + , ( "ddump-rn-trace", setDumpFlag Opt_D_dump_rn_trace) + , ( "ddump-if-trace", setDumpFlag Opt_D_dump_if_trace) , ( "ddump-tc-trace", setDumpFlag Opt_D_dump_tc_trace) , ( "ddump-splices", setDumpFlag Opt_D_dump_splices) - , ( "ddump-rn-stats", NoArg (setDynFlag Opt_D_dump_rn_stats)) + , ( "ddump-rn-stats", setDumpFlag Opt_D_dump_rn_stats) , ( "ddump-opt-cmm", setDumpFlag Opt_D_dump_opt_cmm) , ( "ddump-simpl-stats", setDumpFlag Opt_D_dump_simpl_stats) , ( "ddump-bcos", setDumpFlag Opt_D_dump_BCOs) , ( "dsource-stats", setDumpFlag Opt_D_source_stats) , ( "dverbose-core2core", setDumpFlag Opt_D_verbose_core2core) , ( "dverbose-stg2stg", setDumpFlag Opt_D_verbose_stg2stg) - , ( "ddump-hi-diffs", NoArg (setDynFlag Opt_D_dump_hi_diffs)) , ( "ddump-hi", setDumpFlag Opt_D_dump_hi) - , ( "ddump-minimal-imports", NoArg (setDynFlag Opt_D_dump_minimal_imports)) + , ( "ddump-minimal-imports", setDumpFlag Opt_D_dump_minimal_imports) , ( "ddump-vect", setDumpFlag Opt_D_dump_vect) + , ( "ddump-hpc", setDumpFlag Opt_D_dump_hpc) + , ( "ddump-mod-cycles", setDumpFlag Opt_D_dump_mod_cycles) + + , ( "ddump-hi-diffs", NoArg (setDynFlag Opt_D_dump_hi_diffs)) , ( "dcore-lint", NoArg (setDynFlag Opt_DoCoreLinting)) , ( "dstg-lint", NoArg (setDynFlag Opt_DoStgLinting)) , ( "dcmm-lint", NoArg (setDynFlag Opt_DoCmmLinting)) - , ( "dshow-passes", NoArg (do unSetDynFlag Opt_RecompChecking + , ( "dshow-passes", NoArg (do setDynFlag Opt_ForceRecomp setVerbosity (Just 2)) ) , ( "dfaststring-stats", NoArg (setDynFlag Opt_D_faststring_stats)) @@ -959,36 +1012,45 @@ dynamic_flags = [ , ( "w" , NoArg (mapM_ unSetDynFlag minusWallOpts) ) ------ Optimisation flags ------------------------------------------ - , ( "O" , NoArg (upd (setOptLevel 1))) - , ( "Onot" , NoArg (upd (setOptLevel 0))) - , ( "O" , PrefixPred (all isDigit) - (\f -> upd (setOptLevel (read f)))) + , ( "O" , NoArg (upd (setOptLevel 1))) + , ( "Onot" , NoArg (upd (setOptLevel 0))) + , ( "O" , OptIntSuffix (\mb_n -> upd (setOptLevel (mb_n `orElse` 1)))) + -- If the number is missing, use 1 + + , ( "fmax-simplifier-iterations", IntSuffix (\n -> + upd (\dfs -> dfs{ maxSimplIterations = n })) ) - , ( "fmax-simplifier-iterations", - PrefixPred (all isDigit) - (\n -> upd (\dfs -> - dfs{ maxSimplIterations = read n })) ) + -- liberate-case-threshold is an old flag for '-fspec-threshold' + , ( "fspec-threshold", IntSuffix (\n -> upd (\dfs -> dfs{ specThreshold = n }))) + , ( "fliberate-case-threshold", IntSuffix (\n -> upd (\dfs -> dfs{ specThreshold = n }))) - , ( "frule-check", - SepArg (\s -> upd (\dfs -> dfs{ ruleCheck = Just s }))) + , ( "frule-check", SepArg (\s -> upd (\dfs -> dfs{ ruleCheck = Just s }))) + , ( "fcontext-stack" , IntSuffix $ \n -> upd $ \dfs -> dfs{ ctxtStkDepth = n }) ------ Compiler flags ----------------------------------------------- + , ( "fasm", NoArg (setObjTarget HscAsm) ) + , ( "fvia-c", NoArg (setObjTarget HscC) ) + , ( "fvia-C", NoArg (setObjTarget HscC) ) + , ( "fno-code", NoArg (setTarget HscNothing)) - , ( "fasm", AnySuffix (\_ -> setTarget HscAsm) ) - , ( "fvia-c", NoArg (setTarget HscC) ) - , ( "fvia-C", NoArg (setTarget HscC) ) - , ( "filx", NoArg (setTarget HscILX) ) + , ( "fbyte-code", NoArg (setTarget HscInterpreted) ) + , ( "fobject-code", NoArg (setTarget defaultHscTarget) ) , ( "fglasgow-exts", NoArg (mapM_ setDynFlag glasgowExtsFlags) ) , ( "fno-glasgow-exts", NoArg (mapM_ unSetDynFlag glasgowExtsFlags) ) - , ( "fcontext-stack" , OptIntSuffix $ \mb_n -> upd $ \dfs -> - dfs{ ctxtStkDepth = mb_n `orElse` 3 }) - -- the rest of the -f* and -fno-* flags - , ( "fno-", PrefixPred (\f -> isFFlag f) (\f -> unSetDynFlag (getFFlag f)) ) - , ( "f", PrefixPred (\f -> isFFlag f) (\f -> setDynFlag (getFFlag f)) ) + , ( "f", PrefixPred (isFlag fFlags) (\f -> setDynFlag (getFlag fFlags f)) ) + , ( "f", PrefixPred (isNoFlag fFlags) (\f -> unSetDynFlag (getNoFlag fFlags f)) ) + + -- For now, allow -X flags with -f; ToDo: report this as deprecated + , ( "f", PrefixPred (isFlag xFlags) (\f -> setDynFlag (getFlag xFlags f)) ) + , ( "f", PrefixPred (isNoFlag xFlags) (\f -> unSetDynFlag (getNoFlag xFlags f)) ) + + -- the rest of the -X* and -Xno-* flags + , ( "X", PrefixPred (isFlag xFlags) (\f -> setDynFlag (getFlag xFlags f)) ) + , ( "X", PrefixPred (isNoFlag xFlags) (\f -> unSetDynFlag (getNoFlag xFlags f)) ) ] -- these -f flags can all be reversed with -fno- @@ -996,6 +1058,7 @@ dynamic_flags = [ fFlags = [ ( "warn-duplicate-exports", Opt_WarnDuplicateExports ), ( "warn-hi-shadowing", Opt_WarnHiShadows ), + ( "warn-implicit-prelude", Opt_WarnImplicitPrelude ), ( "warn-incomplete-patterns", Opt_WarnIncompletePatterns ), ( "warn-incomplete-record-updates", Opt_WarnIncompletePatternsRecUpd ), ( "warn-missing-fields", Opt_WarnMissingFields ), @@ -1005,30 +1068,17 @@ fFlags = [ ( "warn-overlapping-patterns", Opt_WarnOverlappingPatterns ), ( "warn-simple-patterns", Opt_WarnSimplePatterns ), ( "warn-type-defaults", Opt_WarnTypeDefaults ), + ( "warn-monomorphism-restriction", Opt_WarnMonomorphism ), ( "warn-unused-binds", Opt_WarnUnusedBinds ), ( "warn-unused-imports", Opt_WarnUnusedImports ), ( "warn-unused-matches", Opt_WarnUnusedMatches ), ( "warn-deprecations", Opt_WarnDeprecations ), ( "warn-orphans", Opt_WarnOrphans ), - ( "fi", Opt_FFI ), -- support `-ffi'... - ( "ffi", Opt_FFI ), -- ...and also `-fffi' - ( "arrows", Opt_Arrows ), -- arrow syntax - ( "parr", Opt_PArr ), - ( "th", Opt_TH ), - ( "implicit-prelude", Opt_ImplicitPrelude ), - ( "scoped-type-variables", Opt_ScopedTypeVariables ), - ( "bang-patterns", Opt_BangPatterns ), - ( "indexed-types", Opt_IndexedTypes ), - ( "monomorphism-restriction", Opt_MonomorphismRestriction ), - ( "mono-pat-binds", Opt_MonoPatBinds ), - ( "extended-default-rules", Opt_ExtendedDefaultRules ), - ( "implicit-params", Opt_ImplicitParams ), - ( "allow-overlapping-instances", Opt_AllowOverlappingInstances ), - ( "allow-undecidable-instances", Opt_AllowUndecidableInstances ), - ( "allow-incoherent-instances", Opt_AllowIncoherentInstances ), - ( "generics", Opt_Generics ), + ( "warn-tabs", Opt_WarnTabs ), ( "strictness", Opt_Strictness ), ( "full-laziness", Opt_FullLaziness ), + ( "liberate-case", Opt_LiberateCase ), + ( "spec-constr", Opt_SpecConstr ), ( "cse", Opt_CSE ), ( "ignore-interface-pragmas", Opt_IgnoreInterfacePragmas ), ( "omit-interface-pragmas", Opt_OmitInterfacePragmas ), @@ -1041,18 +1091,123 @@ fFlags = [ ( "dicts-cheap", Opt_DictsCheap ), ( "excess-precision", Opt_ExcessPrecision ), ( "asm-mangling", Opt_DoAsmMangling ), - ( "print-bind-result", Opt_PrintBindResult ) + ( "print-bind-result", Opt_PrintBindResult ), + ( "force-recomp", Opt_ForceRecomp ), + ( "hpc-no-auto", Opt_Hpc_No_Auto ), + ( "rewrite-rules", Opt_RewriteRules ), + ( "break-on-exception", Opt_BreakOnException ), + ( "vectorise", Opt_Vectorise ) + ] + + +-- These -X flags can all be reversed with -Xno- +xFlags :: [(String, DynFlag)] +xFlags = [ + ( "PatternGuards", Opt_PatternGuards ), + ( "MagicHash", Opt_MagicHash ), + ( "KindSignatures", Opt_KindSignatures ), + ( "EmptyDataDecls", Opt_EmptyDataDecls ), + ( "ParallelListComp", Opt_ParallelListComp ), + ( "FI", Opt_FFI ), -- support `-ffi'... + ( "FFI", Opt_FFI ), -- ...and also `-fffi' + ( "ForeignFunctionInterface", Opt_FFI ), + + ( "RecursiveDo", Opt_RecursiveDo ), + ( "Arrows", Opt_Arrows ), -- arrow syntax + ( "Parr", Opt_PArr ), + + ( "TH", Opt_TH ), -- support -fth + ( "TemplateHaskelll", Opt_TH ), + + ( "Generics", Opt_Generics ), + + ( "ImplicitPrelude", Opt_ImplicitPrelude ), -- On by default + + ( "RecordWildCards", Opt_RecordWildCards ), + ( "RecordPuns", Opt_RecordPuns ), + ( "DisambiguateRecordFields", Opt_DisambiguateRecordFields ), + + ( "OverloadedStrings", Opt_OverloadedStrings ), + ( "GADTs", Opt_GADTs ), + ( "TypeFamilies", Opt_TypeFamilies ), + ( "BangPatterns", Opt_BangPatterns ), + ( "MonomorphismRestriction", Opt_MonomorphismRestriction ), -- On by default + ( "MonoPatBinds", Opt_MonoPatBinds ), -- On by default (which is not strictly H98) + ( "RelaxedPolyRec", Opt_RelaxedPolyRec), + ( "ExtendedDefaultRules", Opt_ExtendedDefaultRules ), + ( "ImplicitParams", Opt_ImplicitParams ), + ( "ScopedTypeVariables", Opt_ScopedTypeVariables ), + ( "TypeSynonymInstances", Opt_TypeSynonymInstances ), + ( "FlexibleInstances", Opt_FlexibleInstances ), + ( "MultiParamTypeClasses", Opt_MultiParamTypeClasses ), + ( "FunctionalDependencies", Opt_FunctionalDependencies ), + ( "GeneralizedNewtypeDeriving", Opt_GeneralizedNewtypeDeriving ), + ( "AllowOverlappingInstances", Opt_AllowOverlappingInstances ), + ( "AllowUndecidableInstances", Opt_AllowUndecidableInstances ), + ( "AllowIncoherentInstances", Opt_AllowIncoherentInstances ) ] -glasgowExtsFlags = [ - Opt_GlasgowExts, - Opt_FFI, - Opt_ImplicitParams, - Opt_ScopedTypeVariables, - Opt_IndexedTypes ] +impliedFlags :: [(DynFlag, [DynFlag])] +impliedFlags = [ + ( Opt_GADTs, [Opt_RelaxedPolyRec] ) -- We want type-sig variables to be completely rigid for GADTs + ] -isFFlag f = f `elem` (map fst fFlags) -getFFlag f = fromJust (lookup f fFlags) +glasgowExtsFlags = [ Opt_GlasgowExts + , Opt_FFI + , Opt_GADTs + , Opt_ImplicitParams + , Opt_ScopedTypeVariables + , Opt_TypeSynonymInstances + , Opt_FlexibleInstances + , Opt_MultiParamTypeClasses + , Opt_FunctionalDependencies + , Opt_MagicHash + , Opt_PatternGuards + , Opt_RecursiveDo + , Opt_ParallelListComp + , Opt_EmptyDataDecls + , Opt_KindSignatures + , Opt_GeneralizedNewtypeDeriving + , Opt_TypeFamilies ] + +------------------ +isNoFlag, isFlag :: [(String,a)] -> String -> Bool + +isFlag flags f = is_flag flags (normaliseFlag f) + +isNoFlag flags no_f + | Just f <- noFlag_maybe (normaliseFlag no_f) = is_flag flags f + | otherwise = False + +is_flag flags nf = any (\(ff,_) -> normaliseFlag ff == nf) flags + -- nf is normalised alreadly + +------------------ +getFlag, getNoFlag :: [(String,a)] -> String -> a + +getFlag flags f = get_flag flags (normaliseFlag f) + +getNoFlag flags f = get_flag flags (fromJust (noFlag_maybe (normaliseFlag f))) + -- The flag should be a no-flag already + +get_flag flags nf = case [ opt | (ff, opt) <- flags, normaliseFlag ff == nf] of + (o:os) -> o + [] -> panic ("get_flag " ++ nf) + +------------------ +noFlag_maybe :: String -> Maybe String +-- The input is normalised already +noFlag_maybe ('n' : 'o' : f) = Just f +noFlag_maybe other = Nothing + +normaliseFlag :: String -> String +-- Normalise a option flag by +-- * map to lower case +-- * removing hyphens +-- Thus: -X=overloaded-strings or -XOverloadedStrings +normaliseFlag [] = [] +normaliseFlag ('-':s) = normaliseFlag s +normaliseFlag (c:s) = toLower c : normaliseFlag s -- ----------------------------------------------------------------------------- -- Parsing the dynamic flags. @@ -1073,13 +1228,21 @@ upd f = do dfs <- getCmdLineState putCmdLineState $! (f dfs) +-------------------------- setDynFlag, unSetDynFlag :: DynFlag -> DynP () -setDynFlag f = upd (\dfs -> dopt_set dfs f) +setDynFlag f = upd (\dfs -> foldl dopt_set (dopt_set dfs f) deps) + where + deps = [ d | (f', ds) <- impliedFlags, f' == f, d <- ds ] + -- When you set f, set the ones it implies + -- When you un-set f, however, we don't un-set the things it implies + -- (except for -fno-glasgow-exts, which is treated specially) + unSetDynFlag f = upd (\dfs -> dopt_unset dfs f) +-------------------------- setDumpFlag :: DynFlag -> OptKind DynP setDumpFlag dump_flag - = NoArg (unSetDynFlag Opt_RecompChecking >> setDynFlag dump_flag) + = NoArg (setDynFlag Opt_ForceRecomp >> setDynFlag dump_flag) -- Whenver we -ddump, switch off the recompilation checker, -- else you don't see the dump! @@ -1096,21 +1259,32 @@ hidePackage p = upd (\s -> s{ packageFlags = HidePackage p : packageFlags s }) ignorePackage p = upd (\s -> s{ packageFlags = IgnorePackage p : packageFlags s }) + setPackageName p | Nothing <- unpackPackageId pid = throwDyn (CmdLineError ("cannot parse \'" ++ p ++ "\' as a package identifier")) | otherwise - = upd (\s -> s{ thisPackage = pid }) + = \s -> s{ thisPackage = pid } where pid = stringToPackageId p --- we can only switch between HscC, HscAsmm, and HscILX with dynamic flags --- (-fvia-C, -fasm, -filx respectively). -setTarget l = upd (\dfs -> case hscTarget dfs of - HscC -> dfs{ hscTarget = l } - HscAsm -> dfs{ hscTarget = l } - HscILX -> dfs{ hscTarget = l } - _ -> dfs) +-- If we're linking a binary, then only targets that produce object +-- code are allowed (requests for other target types are ignored). +setTarget l = upd set + where + set dfs + | ghcLink dfs /= LinkBinary || isObjectTarget l = dfs{ hscTarget = l } + | otherwise = dfs + +-- Changes the target only if we're compiling object code. This is +-- used by -fasm and -fvia-C, which switch from one to the other, but +-- not from bytecode to object-code. The idea is that -fasm/-fvia-C +-- can be safely used in an OPTIONS_GHC pragma. +setObjTarget l = upd set + where + set dfs + | isObjectTarget (hscTarget dfs) = dfs { hscTarget = l } + | otherwise = dfs setOptLevel :: Int -> DynFlags -> DynFlags setOptLevel n dflags @@ -1243,6 +1417,12 @@ setTmpDir dir dflags = dflags{ tmpDir = canonicalise dir } #endif ----------------------------------------------------------------------------- +-- Hpc stuff + +setOptHpcDir :: String -> DynP () +setOptHpcDir arg = upd $ \ d -> d{hpcDir = arg} + +----------------------------------------------------------------------------- -- Via-C compilation stuff machdepCCOpts :: DynFlags -> ([String], -- flags for all C compilations @@ -1284,7 +1464,7 @@ machdepCCOpts dflags sta = opt_Static in ( [ if sta then "-DDONT_WANT_WIN32_DLL_SUPPORT" else "" --- , if suffixMatch "mingw32" cTARGETPLATFORM then "-mno-cygwin" else "" +-- , if "mingw32" `isSuffixOf` cTARGETPLATFORM then "-mno-cygwin" else "" ], [ "-fno-defer-pop", #ifdef HAVE_GCC_MNO_OMIT_LFPTR @@ -1332,9 +1512,6 @@ machdepCCOpts dflags -- version. ] ) -#elif mips_TARGET_ARCH - = ( ["-static"], [] ) - #elif sparc_TARGET_ARCH = ( [], ["-w"] ) -- For now, to suppress the gcc warning "call-clobbered