X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fmain%2FDynFlags.hs;h=206b4948705280586455d8115c4f6f9338ec2198;hb=90dc9026b091be5cca5da4c6cbd3713ecc493361;hp=731ac29b498b5cc4adafced3bf759628bd8b1399;hpb=10ffe4f78dc4bd53d5bc2da1deb8a67669ccb476;p=ghc-hetmet.git diff --git a/compiler/main/DynFlags.hs b/compiler/main/DynFlags.hs index 731ac29..206b494 100644 --- a/compiler/main/DynFlags.hs +++ b/compiler/main/DynFlags.hs @@ -1,3 +1,4 @@ +{-# OPTIONS -fno-warn-missing-fields #-} ----------------------------------------------------------------------------- -- -- Dynamic flags @@ -38,41 +39,55 @@ module DynFlags ( getVerbFlag, updOptLevel, setTmpDir, + setPackageName, -- parsing DynFlags parseDynamicFlags, allFlags, -- misc stuff - machdepCCOpts, picCCOpts, + machdepCCOpts, picCCOpts ) where #include "HsVersions.h" -import Module ( Module, mkModule ) +import Module ( Module, mkModuleName, mkModule ) +import PackageConfig import PrelNames ( mAIN ) -import StaticFlags ( opt_Static, opt_PIC, - WayName(..), v_Ways, v_Build_tag, v_RTS_Build_tag ) +#ifdef i386_TARGET_ARCH +import StaticFlags ( opt_Static ) +#endif +import StaticFlags ( opt_PIC, WayName(..), v_Ways, v_Build_tag, + v_RTS_Build_tag ) import {-# SOURCE #-} Packages (PackageState) import DriverPhases ( Phase(..), phaseInputExt ) import Config import CmdLineParser +import Constants ( mAX_CONTEXT_REDUCTION_DEPTH ) import Panic ( panic, GhcException(..) ) -import Util ( notNull, splitLongestPrefix, split, normalisePath ) +import UniqFM ( UniqFM ) +import Util ( notNull, splitLongestPrefix, normalisePath ) +import Maybes ( fromJust, orElse ) 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 Maybe ( fromJust ) -import Char ( isDigit, isUpper ) -import Outputable + +import Data.Char ( isUpper ) import System.IO ( hPutStrLn, stderr ) -import {-# SOURCE #-} ErrUtils ( Severity(..), Message, mkLocMessage ) +#ifdef GHCI +import Breakpoints ( BkptHandler ) +import Module ( ModuleName ) +#endif -- ----------------------------------------------------------------------------- -- DynFlags @@ -87,6 +102,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 @@ -110,6 +126,7 @@ 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 @@ -139,6 +156,7 @@ data DynFlag | Opt_WarnDeprecations | Opt_WarnDodgyImports | Opt_WarnOrphans + | Opt_WarnTabs -- language opts | Opt_AllowOverlappingInstances @@ -146,16 +164,19 @@ data DynFlag | Opt_AllowIncoherentInstances | Opt_MonomorphismRestriction | Opt_MonoPatBinds + | Opt_ExtendedDefaultRules -- Use GHC's extended rules for defaulting | Opt_GlasgowExts | Opt_FFI - | Opt_PArr -- syntactic support for parallel arrays - | Opt_Arrows -- Arrow-notation syntax + | Opt_PArr -- Syntactic support for parallel arrays + | Opt_Arrows -- Arrow-notation syntax | Opt_TH | Opt_ImplicitParams | Opt_Generics | Opt_ImplicitPrelude | Opt_ScopedTypeVariables | Opt_BangPatterns + | Opt_IndexedTypes + | Opt_OverloadedStrings -- optimisation opts | Opt_Strictness @@ -174,7 +195,7 @@ data DynFlag -- misc opts | Opt_Cpp | Opt_Pp - | Opt_RecompChecking + | Opt_ForceRecomp | Opt_DryRun | Opt_DoAsmMangling | Opt_ExcessPrecision @@ -183,6 +204,12 @@ data DynFlag | Opt_SplitObjs | Opt_StgStats | Opt_HideAllPackages +#if defined(GHCI) && defined(DEBUGGER) + | Opt_Debugging +#endif + | Opt_PrintBindResult + | Opt_Haddock + | Opt_Hpc_No_Auto -- keeping stuff | Opt_KeepHiDiffs @@ -205,11 +232,16 @@ data DynFlags = DynFlags { optLevel :: Int, -- optimisation level maxSimplIterations :: Int, -- max simplifier iterations ruleCheck :: Maybe String, + libCaseThreshold :: Int, -- Threshold for liberate-case + stolen_x86_regs :: Int, cmdlineHcIncludes :: [String], -- -#includes importPaths :: [FilePath], mainModIs :: Module, mainFunIs :: Maybe String, + ctxtStkDepth :: Int, -- Typechecker context stack depth + + thisPackage :: PackageId, -- ways wayNames :: [WayName], -- way flags from the cmd line @@ -234,6 +266,11 @@ data DynFlags = DynFlags { cmdlineFrameworks :: [String], -- ditto tmpDir :: String, -- no trailing '/' + 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], @@ -255,16 +292,23 @@ data DynFlags = DynFlags { pgm_a :: (String,[Option]), pgm_l :: (String,[Option]), pgm_dll :: (String,[Option]), + pgm_T :: String, + pgm_sysman :: String, - -- ** Package flags + -- Package flags extraPkgConfs :: [FilePath], + topDir :: FilePath, -- filled in by SysTools + systemPackageConfig :: FilePath, -- ditto -- The -package-conf flags given on the command line, in the order -- they appeared. packageFlags :: [PackageFlag], -- The -package and -hide-package flags from the command-line - -- ** Package state + -- Package state + -- NB. do not modify this field, it is calculated by + -- Packages.initPackages and Packages.updatePackages. + pkgDatabase :: Maybe (UniqFM InstalledPackageInfo), pkgState :: PackageState, -- hsc dynamic flags @@ -272,13 +316,17 @@ data DynFlags = DynFlags { -- message output log_action :: Severity -> SrcSpan -> PprStyle -> Message -> IO () + +#ifdef GHCI + -- breakpoint handling + ,bkptHandler :: Maybe (BkptHandler Module) +#endif } data HscTarget = HscC | HscAsm | HscJava - | HscILX | HscInterpreted | HscNothing deriving (Eq, Show) @@ -310,6 +358,7 @@ data PackageFlag = ExposePackage String | HidePackage String | IgnorePackage String + deriving Eq defaultHscTarget | cGhcWithNativeCodeGen == "YES" = HscAsm @@ -339,15 +388,15 @@ defaultDynFlags = optLevel = 0, maxSimplIterations = 4, ruleCheck = Nothing, + libCaseThreshold = 20, stolen_x86_regs = 4, cmdlineHcIncludes = [], importPaths = ["."], mainModIs = mAIN, mainFunIs = Nothing, - - wayNames = panic "ways", - buildTag = panic "buildTag", - rtsBuildTag = panic "rtsBuildTag", + ctxtStkDepth = mAX_CONTEXT_REDUCTION_DEPTH, + + thisPackage = mainPackageId, objectDir = Nothing, hiDir = Nothing, @@ -365,6 +414,8 @@ defaultDynFlags = cmdlineFrameworks = [], tmpDir = cDEFAULT_TMPDIR, + hpcDir = ".hpc", + opt_L = [], opt_P = [], opt_F = [], @@ -375,22 +426,14 @@ defaultDynFlags = opt_dll = [], opt_dep = [], - pgm_L = panic "pgm_L", - pgm_P = panic "pgm_P", - pgm_F = panic "pgm_F", - pgm_c = panic "pgm_c", - pgm_m = panic "pgm_m", - pgm_s = panic "pgm_s", - pgm_a = panic "pgm_a", - pgm_l = panic "pgm_l", - pgm_dll = panic "pgm_mkdll", - extraPkgConfs = [], packageFlags = [], - pkgState = panic "pkgState", - + pkgDatabase = Nothing, + pkgState = panic "no package state yet: call GHC.setSessionDynFlags", +#ifdef GHCI + bkptHandler = Nothing, +#endif flags = [ - Opt_RecompChecking, Opt_ReadUserPackageConf, Opt_MonoPatBinds, -- Experimentally, I'm making this non-standard @@ -415,8 +458,10 @@ defaultDynFlags = -- and the default no-optimisation options: Opt_IgnoreInterfacePragmas, - Opt_OmitInterfacePragmas + Opt_OmitInterfacePragmas, + -- on by default: + Opt_PrintBindResult ] ++ standardWarnings, log_action = \severity srcSpan style msg -> @@ -514,9 +559,7 @@ 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 = n } where dfs1 = foldr (flip dopt_unset) dfs remove_dopts dfs2 = foldr (flip dopt_set) dfs1 extra_dopts @@ -794,7 +837,7 @@ dynamic_flags = [ , ( "cpp" , NoArg (setDynFlag Opt_Cpp)) , ( "F" , NoArg (setDynFlag Opt_Pp)) , ( "#include" , HasArg (addCmdlineHCInclude) ) - , ( "v" , OptPrefix (setVerbosity) ) + , ( "v" , OptIntSuffix setVerbosity ) ------- Specific phases -------------------------------------------- , ( "pgmL" , HasArg (upd . setPgmL) ) @@ -856,15 +899,17 @@ dynamic_flags = [ ------- 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 ignorePackage ) -- for compatibility + , ( "package-name" , HasArg (upd . setPackageName) ) , ( "package" , HasArg exposePackage ) , ( "hide-package" , HasArg hidePackage ) , ( "hide-all-packages", NoArg (setDynFlag Opt_HideAllPackages) ) @@ -890,6 +935,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) @@ -919,11 +965,13 @@ dynamic_flags = [ , ( "ddump-hi", setDumpFlag Opt_D_dump_hi) , ( "ddump-minimal-imports", NoArg (setDynFlag Opt_D_dump_minimal_imports)) , ( "ddump-vect", setDumpFlag Opt_D_dump_vect) + , ( "ddump-hpc", setDumpFlag Opt_D_dump_hpc) + , ( "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 - setVerbosity "2") ) + , ( "dshow-passes", NoArg (do setDynFlag Opt_ForceRecomp + setVerbosity (Just 2)) ) , ( "dfaststring-stats", NoArg (setDynFlag Opt_D_faststring_stats)) ------ Machine dependant (-m) stuff --------------------------- @@ -940,18 +988,16 @@ 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", - PrefixPred (all isDigit) - (\n -> upd (\dfs -> - dfs{ maxSimplIterations = read n })) ) - - , ( "frule-check", - SepArg (\s -> upd (\dfs -> dfs{ ruleCheck = Just s }))) + , ( "fmax-simplifier-iterations", IntSuffix (\n -> + upd (\dfs -> dfs{ maxSimplIterations = n })) ) + , ( "fliberate-case-threshold", IntSuffix (\n -> upd (\dfs -> dfs{ libCaseThreshold = n }))) + , ( "frule-check", SepArg (\s -> upd (\dfs -> dfs{ ruleCheck = Just s }))) + , ( "fcontext-stack" , IntSuffix $ \n -> upd $ \dfs -> dfs{ ctxtStkDepth = n }) ------ Compiler flags ----------------------------------------------- @@ -959,11 +1005,11 @@ dynamic_flags = [ , ( "fasm", AnySuffix (\_ -> setTarget HscAsm) ) , ( "fvia-c", NoArg (setTarget HscC) ) , ( "fvia-C", NoArg (setTarget HscC) ) - , ( "filx", NoArg (setTarget HscILX) ) , ( "fglasgow-exts", NoArg (mapM_ setDynFlag glasgowExtsFlags) ) , ( "fno-glasgow-exts", NoArg (mapM_ unSetDynFlag glasgowExtsFlags) ) + -- 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)) ) @@ -988,6 +1034,7 @@ fFlags = [ ( "warn-unused-matches", Opt_WarnUnusedMatches ), ( "warn-deprecations", Opt_WarnDeprecations ), ( "warn-orphans", Opt_WarnOrphans ), + ( "warn-tabs", Opt_WarnTabs ), ( "fi", Opt_FFI ), -- support `-ffi'... ( "ffi", Opt_FFI ), -- ...and also `-fffi' ( "arrows", Opt_Arrows ), -- arrow syntax @@ -996,8 +1043,11 @@ fFlags = [ ( "implicit-prelude", Opt_ImplicitPrelude ), ( "scoped-type-variables", Opt_ScopedTypeVariables ), ( "bang-patterns", Opt_BangPatterns ), + ( "overloaded-strings", Opt_OverloadedStrings ), + ( "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 ), @@ -1016,15 +1066,22 @@ fFlags = [ ( "unbox-strict-fields", Opt_UnboxStrictFields ), ( "dicts-cheap", Opt_DictsCheap ), ( "excess-precision", Opt_ExcessPrecision ), - ( "asm-mangling", Opt_DoAsmMangling ) + ( "asm-mangling", Opt_DoAsmMangling ), + ( "print-bind-result", Opt_PrintBindResult ), +#if defined(GHCI) && defined(DEBUGGER) + ( "debugging", Opt_Debugging), +#endif + ( "force-recomp", Opt_ForceRecomp ), + ( "hpc-no-auto", Opt_Hpc_No_Auto ) ] + glasgowExtsFlags = [ Opt_GlasgowExts, Opt_FFI, Opt_ImplicitParams, Opt_ScopedTypeVariables, - Opt_BangPatterns ] + Opt_IndexedTypes ] isFFlag f = f `elem` (map fst fFlags) getFFlag f = fromJust (lookup f fFlags) @@ -1054,14 +1111,12 @@ 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! -setVerbosity "" = upd (\dfs -> dfs{ verbosity = 3 }) -setVerbosity n - | all isDigit n = upd (\dfs -> dfs{ verbosity = read n }) - | otherwise = throwDyn (UsageError "can't parse verbosity flag (-v)") +setVerbosity :: Maybe Int -> DynP () +setVerbosity mb_n = upd (\dfs -> dfs{ verbosity = mb_n `orElse` 3 }) addCmdlineHCInclude a = upd (\s -> s{cmdlineHcIncludes = a : cmdlineHcIncludes s}) @@ -1074,12 +1129,19 @@ hidePackage p = ignorePackage p = upd (\s -> s{ packageFlags = IgnorePackage p : packageFlags s }) --- we can only switch between HscC, HscAsmm, and HscILX with dynamic flags +setPackageName p + | Nothing <- unpackPackageId pid + = throwDyn (CmdLineError ("cannot parse \'" ++ p ++ "\' as a package identifier")) + | otherwise + = \s -> s{ thisPackage = pid } + where + pid = stringToPackageId p + +-- we can only switch between HscC, and HscAsmm 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) setOptLevel :: Int -> DynFlags -> DynFlags @@ -1096,10 +1158,10 @@ setMainIs :: String -> DynP () setMainIs arg | not (null main_fn) -- The arg looked like "Foo.baz" = upd $ \d -> d{ mainFunIs = Just main_fn, - mainModIs = mkModule main_mod } + mainModIs = mkModule mainPackageId (mkModuleName main_mod) } | isUpper (head main_mod) -- The arg looked like "Foo" - = upd $ \d -> d{ mainModIs = mkModule main_mod } + = upd $ \d -> d{ mainModIs = mkModule mainPackageId (mkModuleName main_mod) } | otherwise -- The arg looked like "baz" = upd $ \d -> d{ mainFunIs = Just main_mod } @@ -1213,6 +1275,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 @@ -1302,9 +1370,6 @@ machdepCCOpts dflags -- version. ] ) -#elif mips_TARGET_ARCH - = ( ["-static"], [] ) - #elif sparc_TARGET_ARCH = ( [], ["-w"] ) -- For now, to suppress the gcc warning "call-clobbered