X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fmain%2FStaticFlags.hs;h=a162214919388836180252337738c25d3f7eaf28;hb=922de8ca1aa3f2a1796e8cfa9bf8e52d7b959d9b;hp=54f5953e4cf6a274fb1ae7c21d81150b22c89913;hpb=80564ddc183ea98856994112858f0b9f3e178f94;p=ghc-hetmet.git diff --git a/compiler/main/StaticFlags.hs b/compiler/main/StaticFlags.hs index 54f5953..a162214 100644 --- a/compiler/main/StaticFlags.hs +++ b/compiler/main/StaticFlags.hs @@ -12,9 +12,10 @@ module StaticFlags ( parseStaticFlags, staticFlags, + initStaticOpts, -- Ways - WayName(..), v_Ways, v_Build_tag, v_RTS_Build_tag, + WayName(..), v_Ways, v_Build_tag, v_RTS_Build_tag, isRTSWay, -- Output style options opt_PprUserLength, @@ -27,6 +28,9 @@ module StaticFlags ( opt_SccProfilingOn, opt_DoTickyProfiling, + -- Hpc opts + opt_Hpc, + -- language opts opt_DictsStrict, opt_IrrefutableTuples, @@ -37,9 +41,7 @@ module StaticFlags ( -- optimisation opts opt_NoMethodSharing, opt_NoStateHack, - opt_LiberateCaseThreshold, opt_CprOff, - opt_RulesOff, opt_SimplNoPreInlining, opt_SimplExcessPrecision, opt_MaxWorkerArgs, @@ -52,6 +54,10 @@ module StaticFlags ( opt_UF_UpdateInPlace, opt_UF_DearOp, + -- Related to linking + opt_PIC, + opt_Static, + -- misc opts opt_IgnoreDotGhci, opt_ErrorSpans, @@ -59,10 +65,8 @@ module StaticFlags ( opt_HiVersion, opt_HistorySize, opt_OmitBlackHoling, - opt_Static, opt_Unregisterised, opt_EmitExternalCore, - opt_PIC, v_Ld_inputs, tablesNextToCode ) where @@ -74,46 +78,66 @@ import Config import FastString ( FastString, mkFastString ) import Util import Maybes ( firstJust ) -import Panic ( GhcException(..), ghcError ) +import Panic import Control.Exception ( throwDyn ) import Data.IORef import System.IO.Unsafe ( unsafePerformIO ) import Control.Monad ( when ) import Data.Char ( isDigit ) -import Data.List ( sort, intersperse, nub ) +import Data.List ----------------------------------------------------------------------------- -- Static flags parseStaticFlags :: [String] -> IO [String] parseStaticFlags args = do + ready <- readIORef v_opt_C_ready + when ready $ throwDyn (ProgramError "Too late for parseStaticFlags: call it before newSession") + (leftover, errs) <- processArgs static_flags args when (not (null errs)) $ throwDyn (UsageError (unlines errs)) -- deal with the way flags: the way (eg. prof) gives rise to - -- futher flags, some of which might be static. + -- further flags, some of which might be static. way_flags <- findBuildTag -- if we're unregisterised, add some more flags let unreg_flags | cGhcUnregisterised == "YES" = unregFlags | otherwise = [] + (more_leftover, errs) <- processArgs static_flags (unreg_flags ++ way_flags) + + -- see sanity code in staticOpts + writeIORef v_opt_C_ready True + -- TABLES_NEXT_TO_CODE affects the info table layout. + -- Be careful to do this *after* all processArgs, + -- because evaluating tablesNextToCode involves looking at the global + -- static flags. Those pesky global variables... let cg_flags | tablesNextToCode = ["-optc-DTABLES_NEXT_TO_CODE"] | otherwise = [] - (more_leftover, errs) <- processArgs static_flags - (unreg_flags ++ cg_flags ++ way_flags) when (not (null errs)) $ ghcError (UsageError (unlines errs)) - return (more_leftover++leftover) + return (cg_flags++more_leftover++leftover) +initStaticOpts :: IO () +initStaticOpts = writeIORef v_opt_C_ready True + +static_flags :: [(String, OptKind IO)] +-- All the static flags should appear in this list. It describes how each +-- static flag should be processed. Two main purposes: +-- (a) if a command-line flag doesn't appear in the list, GHC can complain +-- (b) a command-line flag may remove, or add, other flags; e.g. the "-fno-X" things +-- +-- The common (PassFlag addOpt) action puts the static flag into the bunch of +-- things that are searched up by the top-level definitions like +-- opt_foo = lookUp FSLIT("-dfoo") --- note that ordering is important in the following list: any flag which +-- Note that ordering is important in the following list: any flag which -- is a prefix flag (i.e. HasArg, Prefix, OptPrefix, AnySuffix) will override -- flags further down the list with the same prefix. -static_flags :: [(String, OptKind IO)] static_flags = [ ------- GHCi ------------------------------------------------------- ( "ignore-dot-ghci", PassFlag addOpt ) @@ -132,7 +156,6 @@ static_flags = [ -- ToDo: user ways ------ Debugging ---------------------------------------------------- - , ( "dppr-noprags", PassFlag addOpt ) , ( "dppr-debug", PassFlag addOpt ) , ( "dppr-user-length", AnySuffix addOpt ) -- rest of the debugging flags are dynamic @@ -184,7 +207,12 @@ lookup_str :: String -> Maybe String -- holds the static opts while they're being collected, before -- being unsafely read by unpacked_static_opts below. GLOBAL_VAR(v_opt_C, defaultStaticOpts, [String]) -staticFlags = unsafePerformIO (readIORef v_opt_C) +GLOBAL_VAR(v_opt_C_ready, False, Bool) +staticFlags = unsafePerformIO $ do + ready <- readIORef v_opt_C_ready + if (not ready) + then panic "a static opt was looked at too early!" + else readIORef v_opt_C -- -static is the default defaultStaticOpts = ["-static"] @@ -249,7 +277,10 @@ opt_AutoSccsOnAllToplevs = lookUp FSLIT("-fauto-sccs-on-all-toplevs") opt_AutoSccsOnExportedToplevs = lookUp FSLIT("-fauto-sccs-on-exported-toplevs") opt_AutoSccsOnIndividualCafs = lookUp FSLIT("-fauto-sccs-on-individual-cafs") opt_SccProfilingOn = lookUp FSLIT("-fscc-profiling") -opt_DoTickyProfiling = lookUp FSLIT("-fticky-ticky") +opt_DoTickyProfiling = WayTicky `elem` (unsafePerformIO $ readIORef v_Ways) + +-- Hpc opts +opt_Hpc = lookUp FSLIT("-fhpc") -- language opts opt_DictsStrict = lookUp FSLIT("-fdicts-strict") @@ -261,13 +292,11 @@ opt_Flatten = lookUp FSLIT("-fflatten") opt_NoStateHack = lookUp FSLIT("-fno-state-hack") opt_NoMethodSharing = lookUp FSLIT("-fno-method-sharing") opt_CprOff = lookUp FSLIT("-fcpr-off") -opt_RulesOff = lookUp FSLIT("-frules-off") -- Switch off CPR analysis in the new demand analyser -opt_LiberateCaseThreshold = lookup_def_int "-fliberate-case-threshold" (10::Int) opt_MaxWorkerArgs = lookup_def_int "-fmax-worker-args" (10::Int) opt_GranMacros = lookUp FSLIT("-fgransim") -opt_HiVersion = read (cProjectVersionInt ++ cProjectPatchLevel) :: Int +opt_HiVersion = read (cProjectVersionInt ++ cProjectPatchLevel) :: Integer opt_HistorySize = lookup_def_int "-fhistory-size" 20 opt_OmitBlackHoling = lookUp FSLIT("-dno-black-holing") opt_RuntimeTypes = lookUp FSLIT("-fruntime-types") @@ -287,6 +316,11 @@ opt_UF_UpdateInPlace = lookUp FSLIT("-funfolding-update-in-place") opt_UF_DearOp = ( 4 :: Int) +#if darwin_TARGET_OS && x86_64_TARGET_ARCH +opt_PIC = True +#else +opt_PIC = lookUp FSLIT("-fPIC") +#endif opt_Static = lookUp FSLIT("-static") opt_Unregisterised = lookUp FSLIT("-funregisterised") @@ -302,7 +336,6 @@ opt_EmitExternalCore = lookUp FSLIT("-fext-core") -- Include full span info in error messages, instead of just the start position. opt_ErrorSpans = lookUp FSLIT("-ferror-spans") -opt_PIC = lookUp FSLIT("-fPIC") -- object files and libraries to be linked in are collected here. -- ToDo: perhaps this could be done without a global, it wasn't obvious @@ -315,7 +348,6 @@ isStaticFlag f = "fauto-sccs-on-exported-toplevs", "fauto-sccs-on-individual-cafs", "fscc-profiling", - "fticky-ticky", "fdicts-strict", "firrefutable-tuples", "fparallel", @@ -332,12 +364,12 @@ isStaticFlag f = "static", "funregisterised", "fext-core", - "frules-off", "fcpr-off", "ferror-spans", - "fPIC" + "fPIC", + "fhpc" ] - || any (flip prefixMatch f) [ + || any (`isPrefixOf` f) [ "fliberate-case-threshold", "fmax-worker-args", "fhistory-size", @@ -378,13 +410,8 @@ decodeSize str ----------------------------------------------------------------------------- -- RTS Hooks -#if __GLASGOW_HASKELL__ >= 504 foreign import ccall unsafe "setHeapSize" setHeapSize :: Int -> IO () foreign import ccall unsafe "enableTimingStats" enableTimingStats :: IO () -#else -foreign import "setHeapSize" unsafe setHeapSize :: Int -> IO () -foreign import "enableTimingStats" unsafe enableTimingStats :: IO () -#endif ----------------------------------------------------------------------------- -- Ways @@ -458,6 +485,7 @@ findBuildTag :: IO [String] -- new options findBuildTag = do way_names <- readIORef v_Ways let ws = sort (nub way_names) + if not (allowed_combination ws) then throwDyn (CmdLineError $ "combination not supported: " ++ @@ -472,6 +500,8 @@ findBuildTag = do writeIORef v_RTS_Build_tag rts_tag return (concat flags) + + mkBuildTag :: [Way] -> String mkBuildTag ways = concat (intersperse "_" (map wayTag ways)) @@ -480,6 +510,8 @@ lkupWay w = Nothing -> error "findBuildTag" Just details -> details +isRTSWay = wayRTSOnly . lkupWay + data Way = Way { wayTag :: String, wayRTSOnly :: Bool, @@ -510,9 +542,8 @@ way_details = , "-DPROFILING" , "-optc-DPROFILING" ]), - (WayTicky, Way "t" False "Ticky-ticky Profiling" - [ "-fticky-ticky" - , "-DTICKY_TICKY" + (WayTicky, Way "t" True "Ticky-ticky Profiling" + [ "-DTICKY_TICKY" , "-optc-DTICKY_TICKY" ]), (WayUnreg, Way "u" False "Unregisterised"