+{-# OPTIONS -fno-cse #-}
+-- -fno-cse is needed for GLOBAL_VAR's to behave properly
+
-----------------------------------------------------------------------------
--
-- Static flags
-----------------------------------------------------------------------------
module StaticFlags (
- parseStaticFlags,
staticFlags,
+ initStaticOpts,
-- Ways
- WayName(..), v_Ways, v_Build_tag, v_RTS_Build_tag,
+ WayName(..), Way(..), v_Ways, isRTSWay, mkBuildTag,
-- Output style options
opt_PprUserLength,
+ opt_SuppressUniques,
+ opt_SuppressCoercions,
opt_PprStyle_Debug,
+ opt_NoDebugOutput,
-- profiling opts
- opt_AutoSccsOnAllToplevs,
- opt_AutoSccsOnExportedToplevs,
- opt_AutoSccsOnIndividualCafs,
opt_SccProfilingOn,
- opt_DoTickyProfiling,
+
+ -- Hpc opts
+ opt_Hpc,
-- language opts
opt_DictsStrict,
opt_IrrefutableTuples,
opt_Parallel,
- opt_RuntimeTypes,
- opt_Flatten,
-- optimisation opts
- opt_NoMethodSharing,
+ opt_DsMultiTyVar,
opt_NoStateHack,
- opt_LiberateCaseThreshold,
+ opt_SimpleListLiterals,
opt_CprOff,
- opt_RulesOff,
opt_SimplNoPreInlining,
opt_SimplExcessPrecision,
opt_MaxWorkerArgs,
opt_UF_CreationThreshold,
opt_UF_UseThreshold,
opt_UF_FunAppDiscount,
+ opt_UF_DictDiscount,
opt_UF_KeenessFactor,
- opt_UF_UpdateInPlace,
opt_UF_DearOp,
+ -- Optimization fuel controls
+ opt_Fuel,
+
+ -- Related to linking
+ opt_PIC,
+ opt_Static,
+
-- misc opts
opt_IgnoreDotGhci,
opt_ErrorSpans,
- opt_EmitCExternDecls,
opt_GranMacros,
opt_HiVersion,
opt_HistorySize,
opt_OmitBlackHoling,
- opt_Static,
opt_Unregisterised,
- opt_EmitExternalCore,
- opt_PIC,
v_Ld_inputs,
+ tablesNextToCode,
+ opt_StubDeadValues,
+ opt_Ticky,
+
+ -- For the parser
+ addOpt, removeOpt, addWay, getWayFlags, v_opt_C_ready
) where
#include "HsVersions.h"
-import Util ( consIORef )
-import CmdLineParser
-import Config ( cProjectVersionInt, cProjectPatchLevel,
- cGhcUnregisterised )
-import FastString ( FastString, mkFastString )
+import Config
+import FastString
import Util
import Maybes ( firstJust )
-import Panic ( GhcException(..), ghcError )
+import Panic
-import EXCEPTION ( throwDyn )
-import DATA_IOREF
-import UNSAFE_IO ( unsafePerformIO )
-import Monad ( when )
-import Char ( isDigit )
-import Data.List ( sort, intersperse, nub )
+import Data.Maybe ( listToMaybe )
+import Data.IORef
+import System.IO.Unsafe ( unsafePerformIO )
+import Data.List
-----------------------------------------------------------------------------
-- Static flags
-parseStaticFlags :: [String] -> IO [String]
-parseStaticFlags args = do
- (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.
- 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)
- when (not (null errs)) $ ghcError (UsageError (unlines errs))
- return (more_leftover++leftover)
-
-
--- 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 )
- , ( "read-dot-ghci" , NoArg (removeOpt "-ignore-dot-ghci") )
-
- ------- ways --------------------------------------------------------
- , ( "prof" , NoArg (addWay WayProf) )
- , ( "unreg" , NoArg (addWay WayUnreg) )
- , ( "ticky" , NoArg (addWay WayTicky) )
- , ( "parallel" , NoArg (addWay WayPar) )
- , ( "gransim" , NoArg (addWay WayGran) )
- , ( "smp" , NoArg (addWay WayThreaded) ) -- backwards compat.
- , ( "debug" , NoArg (addWay WayDebug) )
- , ( "ndp" , NoArg (addWay WayNDP) )
- , ( "threaded" , NoArg (addWay WayThreaded) )
- -- ToDo: user ways
-
- ------ Debugging ----------------------------------------------------
- , ( "dppr-noprags", PassFlag addOpt )
- , ( "dppr-debug", PassFlag addOpt )
- , ( "dppr-user-length", AnySuffix addOpt )
- -- rest of the debugging flags are dynamic
-
- --------- Profiling --------------------------------------------------
- , ( "auto-all" , NoArg (addOpt "-fauto-sccs-on-all-toplevs") )
- , ( "auto" , NoArg (addOpt "-fauto-sccs-on-exported-toplevs") )
- , ( "caf-all" , NoArg (addOpt "-fauto-sccs-on-individual-cafs") )
- -- "ignore-sccs" doesn't work (ToDo)
-
- , ( "no-auto-all" , NoArg (removeOpt "-fauto-sccs-on-all-toplevs") )
- , ( "no-auto" , NoArg (removeOpt "-fauto-sccs-on-exported-toplevs") )
- , ( "no-caf-all" , NoArg (removeOpt "-fauto-sccs-on-individual-cafs") )
-
- ------- Miscellaneous -----------------------------------------------
- , ( "no-link-chk" , NoArg (return ()) ) -- ignored for backwards compat
-
- ----- Linker --------------------------------------------------------
- , ( "static" , PassFlag addOpt )
- , ( "dynamic" , NoArg (removeOpt "-static") )
- , ( "rdynamic" , NoArg (return ()) ) -- ignored for compat w/ gcc
-
- ----- RTS opts ------------------------------------------------------
- , ( "H" , HasArg (setHeapSize . fromIntegral . decodeSize) )
- , ( "Rghc-timing" , NoArg (enableTimingStats) )
-
- ------ Compiler flags -----------------------------------------------
- -- All other "-fno-<blah>" options cancel out "-f<blah>" on the hsc cmdline
- , ( "fno-", PrefixPred (\s -> isStaticFlag ("f"++s))
- (\s -> removeOpt ("-f"++s)) )
-
- -- Pass all remaining "-f<blah>" options to hsc
- , ( "f", AnySuffixPred (isStaticFlag) addOpt )
- ]
+initStaticOpts :: IO ()
+initStaticOpts = writeIORef v_opt_C_ready True
+addOpt :: String -> IO ()
addOpt = consIORef v_opt_C
-addWay = consIORef v_Ways
+addWay :: WayName -> IO ()
+addWay = consIORef v_Ways . lkupWay
+removeOpt :: String -> IO ()
removeOpt f = do
fs <- readIORef v_opt_C
writeIORef v_opt_C $! filter (/= f) fs
-- 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 :: [String]
+staticFlags = unsafePerformIO $ do
+ ready <- readIORef v_opt_C_ready
+ if (not ready)
+ then panic "Static flags have not been initialised!\n Please call GHC.newSession or GHC.parseStaticFlags early enough."
+ else readIORef v_opt_C
-- -static is the default
+defaultStaticOpts :: [String]
defaultStaticOpts = ["-static"]
+packed_static_opts :: [FastString]
packed_static_opts = map mkFastString staticFlags
lookUp sw = sw `elem` packed_static_opts
-- (lookup_str "foo") looks for the flag -foo=X or -fooX,
-- and returns the string X
lookup_str sw
- = case firstJust (map (startsWith sw) staticFlags) of
+ = case firstJust (map (stripPrefix sw) staticFlags) of
Just ('=' : str) -> Just str
Just str -> Just str
Nothing -> Nothing
expandAts l = [l]
-}
-
-opt_IgnoreDotGhci = lookUp FSLIT("-ignore-dot-ghci")
+opt_IgnoreDotGhci :: Bool
+opt_IgnoreDotGhci = lookUp (fsLit "-ignore-dot-ghci")
-- debugging opts
-opt_PprStyle_Debug = lookUp FSLIT("-dppr-debug")
+opt_SuppressUniques :: Bool
+opt_SuppressUniques = lookUp (fsLit "-dsuppress-uniques")
+opt_SuppressCoercions :: Bool
+opt_SuppressCoercions = lookUp (fsLit "-dsuppress-coercions")
+opt_PprStyle_Debug :: Bool
+opt_PprStyle_Debug = lookUp (fsLit "-dppr-debug")
+opt_PprUserLength :: Int
opt_PprUserLength = lookup_def_int "-dppr-user-length" 5 --ToDo: give this a name
+opt_Fuel :: Int
+opt_Fuel = lookup_def_int "-dopt-fuel" maxBound
+opt_NoDebugOutput :: Bool
+opt_NoDebugOutput = lookUp (fsLit "-dno-debug-output")
+
-- profiling opts
-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_SccProfilingOn :: Bool
+opt_SccProfilingOn = lookUp (fsLit "-fscc-profiling")
+
+-- Hpc opts
+opt_Hpc :: Bool
+opt_Hpc = lookUp (fsLit "-fhpc")
-- language opts
-opt_DictsStrict = lookUp FSLIT("-fdicts-strict")
-opt_IrrefutableTuples = lookUp FSLIT("-firrefutable-tuples")
-opt_Parallel = lookUp FSLIT("-fparallel")
-opt_Flatten = lookUp FSLIT("-fflatten")
+opt_DictsStrict :: Bool
+opt_DictsStrict = lookUp (fsLit "-fdicts-strict")
+opt_IrrefutableTuples :: Bool
+opt_IrrefutableTuples = lookUp (fsLit "-firrefutable-tuples")
+opt_Parallel :: Bool
+opt_Parallel = lookUp (fsLit "-fparallel")
-- optimisation opts
-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")
+opt_DsMultiTyVar :: Bool
+opt_DsMultiTyVar = not (lookUp (fsLit "-fno-ds-multi-tyvar"))
+ -- On by default
+
+opt_SimpleListLiterals :: Bool
+opt_SimpleListLiterals = lookUp (fsLit "-fsimple-list-literals")
+
+opt_NoStateHack :: Bool
+opt_NoStateHack = lookUp (fsLit "-fno-state-hack")
+
+opt_CprOff :: Bool
+opt_CprOff = lookUp (fsLit "-fcpr-off")
-- Switch off CPR analysis in the new demand analyser
-opt_LiberateCaseThreshold = lookup_def_int "-fliberate-case-threshold" (10::Int)
+opt_MaxWorkerArgs :: Int
opt_MaxWorkerArgs = lookup_def_int "-fmax-worker-args" (10::Int)
-opt_EmitCExternDecls = lookUp FSLIT("-femit-extern-decls")
-opt_GranMacros = lookUp FSLIT("-fgransim")
-opt_HiVersion = read (cProjectVersionInt ++ cProjectPatchLevel) :: Int
+opt_GranMacros :: Bool
+opt_GranMacros = lookUp (fsLit "-fgransim")
+opt_HiVersion :: Integer
+opt_HiVersion = read (cProjectVersionInt ++ cProjectPatchLevel) :: Integer
+opt_HistorySize :: Int
opt_HistorySize = lookup_def_int "-fhistory-size" 20
-opt_OmitBlackHoling = lookUp FSLIT("-dno-black-holing")
-opt_RuntimeTypes = lookUp FSLIT("-fruntime-types")
+opt_OmitBlackHoling :: Bool
+opt_OmitBlackHoling = lookUp (fsLit "-dno-black-holing")
+opt_StubDeadValues :: Bool
+opt_StubDeadValues = lookUp (fsLit "-dstub-dead-values")
-- Simplifier switches
-opt_SimplNoPreInlining = lookUp FSLIT("-fno-pre-inlining")
+opt_SimplNoPreInlining :: Bool
+opt_SimplNoPreInlining = lookUp (fsLit "-fno-pre-inlining")
-- NoPreInlining is there just to see how bad things
-- get if you don't do it!
-opt_SimplExcessPrecision = lookUp FSLIT("-fexcess-precision")
+opt_SimplExcessPrecision :: Bool
+opt_SimplExcessPrecision = lookUp (fsLit "-fexcess-precision")
-- Unfolding control
-opt_UF_CreationThreshold = lookup_def_int "-funfolding-creation-threshold" (45::Int)
-opt_UF_UseThreshold = lookup_def_int "-funfolding-use-threshold" (8::Int) -- Discounts can be big
-opt_UF_FunAppDiscount = lookup_def_int "-funfolding-fun-discount" (6::Int) -- It's great to inline a fn
-opt_UF_KeenessFactor = lookup_def_float "-funfolding-keeness-factor" (1.5::Float)
-opt_UF_UpdateInPlace = lookUp FSLIT("-funfolding-update-in-place")
-
-opt_UF_DearOp = ( 4 :: Int)
-
-opt_Static = lookUp FSLIT("-static")
-opt_Unregisterised = lookUp FSLIT("-funregisterised")
-opt_EmitExternalCore = lookUp FSLIT("-fext-core")
+-- See Note [Discounts and thresholds] in CoreUnfold
+
+opt_UF_CreationThreshold, opt_UF_UseThreshold :: Int
+opt_UF_DearOp, opt_UF_FunAppDiscount, opt_UF_DictDiscount :: Int
+opt_UF_KeenessFactor :: Float
+
+opt_UF_CreationThreshold = lookup_def_int "-funfolding-creation-threshold" (45::Int)
+opt_UF_UseThreshold = lookup_def_int "-funfolding-use-threshold" (6::Int)
+opt_UF_FunAppDiscount = lookup_def_int "-funfolding-fun-discount" (6::Int)
+opt_UF_DictDiscount = lookup_def_int "-funfolding-dict-discount" (1::Int)
+opt_UF_KeenessFactor = lookup_def_float "-funfolding-keeness-factor" (1.5::Float)
+opt_UF_DearOp = ( 4 :: Int)
+
+
+-- Related to linking
+opt_PIC :: Bool
+#if darwin_TARGET_OS && x86_64_TARGET_ARCH
+opt_PIC = True
+#elif darwin_TARGET_OS
+opt_PIC = lookUp (fsLit "-fPIC") || not opt_Static
+#else
+opt_PIC = lookUp (fsLit "-fPIC")
+#endif
+opt_Static :: Bool
+opt_Static = lookUp (fsLit "-static")
+opt_Unregisterised :: Bool
+opt_Unregisterised = lookUp (fsLit "-funregisterised")
+
+-- Derived, not a real option. Determines whether we will be compiling
+-- info tables that reside just before the entry code, or with an
+-- indirection to the entry code. See TABLES_NEXT_TO_CODE in
+-- includes/rts/storage/InfoTables.h.
+tablesNextToCode :: Bool
+tablesNextToCode = not opt_Unregisterised
+ && cGhcEnableTablesNextToCode == "YES"
-- Include full span info in error messages, instead of just the start position.
-opt_ErrorSpans = lookUp FSLIT("-ferror-spans")
+opt_ErrorSpans :: Bool
+opt_ErrorSpans = lookUp (fsLit "-ferror-spans")
-opt_PIC = lookUp FSLIT("-fPIC")
+opt_Ticky :: Bool
+opt_Ticky = lookUp (fsLit "-ticky")
-- object files and libraries to be linked in are collected here.
-- ToDo: perhaps this could be done without a global, it wasn't obvious
-- how to do it though --SDM.
GLOBAL_VAR(v_Ld_inputs, [], [String])
-isStaticFlag f =
- f `elem` [
- "fauto-sccs-on-all-toplevs",
- "fauto-sccs-on-exported-toplevs",
- "fauto-sccs-on-individual-cafs",
- "fscc-profiling",
- "fticky-ticky",
- "fall-strict",
- "fdicts-strict",
- "firrefutable-tuples",
- "fparallel",
- "fflatten",
- "fsemi-tagging",
- "flet-no-escape",
- "femit-extern-decls",
- "fgransim",
- "fno-hi-version-check",
- "dno-black-holing",
- "fno-method-sharing",
- "fno-state-hack",
- "fruntime-types",
- "fno-pre-inlining",
- "fexcess-precision",
- "funfolding-update-in-place",
- "static",
- "funregisterised",
- "fext-core",
- "frule-check",
- "frules-off",
- "fcpr-off",
- "ferror-spans",
- "fPIC"
- ]
- || any (flip prefixMatch f) [
- "fliberate-case-threshold",
- "fmax-worker-args",
- "fhistory-size",
- "funfolding-creation-threshold",
- "funfolding-use-threshold",
- "funfolding-fun-discount",
- "funfolding-keeness-factor"
- ]
-
-
-
--- Misc functions for command-line options
-
-startsWith :: String -> String -> Maybe String
--- startsWith pfx (pfx++rest) = Just rest
-
-startsWith [] str = Just str
-startsWith (c:cs) (s:ss)
- = if c /= s then Nothing else startsWith cs ss
-startsWith _ [] = Nothing
-
-
------------------------------------------------------------------------------
--- convert sizes like "3.5M" into integers
-
-decodeSize :: String -> Integer
-decodeSize str
- | c == "" = truncate n
- | c == "K" || c == "k" = truncate (n * 1000)
- | c == "M" || c == "m" = truncate (n * 1000 * 1000)
- | c == "G" || c == "g" = truncate (n * 1000 * 1000 * 1000)
- | otherwise = throwDyn (CmdLineError ("can't decode size: " ++ str))
- where (m, c) = span pred str
- n = read m :: Double
- pred c = isDigit c || c == '.'
-
-
------------------------------------------------------------------------------
--- 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
-- non-profiling objects.
-- After parsing the command-line options, we determine which "way" we
--- are building - this might be a combination way, eg. profiling+ticky-ticky.
+-- are building - this might be a combination way, eg. profiling+threaded.
-- We then find the "build-tag" associated with this way, and this
-- becomes the suffix used to find .hi files and libraries used in
-- this compilation.
-GLOBAL_VAR(v_Build_tag, "", String)
-
--- The RTS has its own build tag, because there are some ways that
--- affect the RTS only.
-GLOBAL_VAR(v_RTS_Build_tag, "", String)
-
data WayName
= WayThreaded
| WayDebug
| WayProf
- | WayUnreg
- | WayTicky
+ | WayEventLog
| WayPar
| WayGran
| WayNDP
- | WayUser_a
- | WayUser_b
- | WayUser_c
- | WayUser_d
- | WayUser_e
- | WayUser_f
- | WayUser_g
- | WayUser_h
- | WayUser_i
- | WayUser_j
- | WayUser_k
- | WayUser_l
- | WayUser_m
- | WayUser_n
- | WayUser_o
- | WayUser_A
- | WayUser_B
+ | WayDyn
deriving (Eq,Ord)
-GLOBAL_VAR(v_Ways, [] ,[WayName])
+GLOBAL_VAR(v_Ways, [] ,[Way])
+allowed_combination :: [WayName] -> Bool
allowed_combination way = and [ x `allowedWith` y
| x <- way, y <- way, x < y ]
where
-- <= the right argument, according to the Ord instance
-- on Way above.
+ -- dyn is allowed with everything
+ _ `allowedWith` WayDyn = True
+ WayDyn `allowedWith` _ = True
+
-- debug is allowed with everything
_ `allowedWith` WayDebug = True
WayDebug `allowedWith` _ = True
- WayProf `allowedWith` WayUnreg = True
WayProf `allowedWith` WayNDP = True
+ WayThreaded `allowedWith` WayProf = True
+ WayThreaded `allowedWith` WayEventLog = True
_ `allowedWith` _ = False
-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 $
+getWayFlags :: IO [String] -- new options
+getWayFlags = do
+ unsorted <- readIORef v_Ways
+ let ways = sortBy (compare `on` wayName) $
+ nubBy ((==) `on` wayName) $ unsorted
+ writeIORef v_Ways ways
+
+ if not (allowed_combination (map wayName ways))
+ then ghcError (CmdLineError $
"combination not supported: " ++
foldr1 (\a b -> a ++ '/':b)
- (map (wayName . lkupWay) ws))
- else let ways = map lkupWay ws
- tag = mkBuildTag (filter (not.wayRTSOnly) ways)
- rts_tag = mkBuildTag ways
- flags = map wayOpts ways
- in do
- writeIORef v_Build_tag tag
- writeIORef v_RTS_Build_tag rts_tag
- return (concat flags)
+ (map wayDesc ways))
+ else
+ return (concatMap wayOpts ways)
mkBuildTag :: [Way] -> String
mkBuildTag ways = concat (intersperse "_" (map wayTag ways))
+lkupWay :: WayName -> Way
lkupWay w =
- case lookup w way_details of
+ case listToMaybe (filter ((==) w . wayName) way_details) of
Nothing -> error "findBuildTag"
Just details -> details
+isRTSWay :: WayName -> Bool
+isRTSWay = wayRTSOnly . lkupWay
+
data Way = Way {
+ wayName :: WayName,
wayTag :: String,
wayRTSOnly :: Bool,
- wayName :: String,
+ wayDesc :: String,
wayOpts :: [String]
}
-way_details :: [ (WayName, Way) ]
+way_details :: [ Way ]
way_details =
- [ (WayThreaded, Way "thr" True "Threaded" [
+ [ Way WayThreaded "thr" True "Threaded" [
#if defined(freebsd_TARGET_OS)
-- "-optc-pthread"
-- , "-optl-pthread"
#elif defined(solaris2_TARGET_OS)
"-optl-lrt"
#endif
- ] ),
-
- (WayDebug, Way "debug" True "Debug" [] ),
+ ],
+
+ Way WayDebug "debug" True "Debug" [],
+
+ Way WayDyn "dyn" False "Dynamic"
+ [ "-DDYNAMIC"
+ , "-optc-DDYNAMIC"
+#if defined(mingw32_TARGET_OS)
+ -- On Windows, code that is to be linked into a dynamic library must be compiled
+ -- with -fPIC. Labels not in the current package are assumed to be in a DLL
+ -- different from the current one.
+ , "-fPIC"
+#endif
+ ],
- (WayProf, Way "p" False "Profiling"
+ Way WayProf "p" False "Profiling"
[ "-fscc-profiling"
, "-DPROFILING"
- , "-optc-DPROFILING" ]),
-
- (WayTicky, Way "t" False "Ticky-ticky Profiling"
- [ "-fticky-ticky"
- , "-DTICKY_TICKY"
- , "-optc-DTICKY_TICKY" ]),
+ , "-optc-DPROFILING" ],
- (WayUnreg, Way "u" False "Unregisterised"
- unregFlags ),
+ Way WayEventLog "l" True "RTS Event Logging"
+ [ "-DTRACING"
+ , "-optc-DTRACING" ],
- -- optl's below to tell linker where to find the PVM library -- HWL
- (WayPar, Way "mp" False "Parallel"
+ Way WayPar "mp" False "Parallel"
[ "-fparallel"
, "-D__PARALLEL_HASKELL__"
, "-optc-DPAR"
, "-optc-w"
, "-optl-L${PVM_ROOT}/lib/${PVM_ARCH}"
, "-optl-lpvm3"
- , "-optl-lgpvm3" ]),
+ , "-optl-lgpvm3" ],
-- at the moment we only change the RTS and could share compiler and libs!
- (WayPar, Way "mt" False "Parallel ticky profiling"
+ Way WayPar "mt" False "Parallel ticky profiling"
[ "-fparallel"
, "-D__PARALLEL_HASKELL__"
, "-optc-DPAR"
, "-optc-w"
, "-optl-L${PVM_ROOT}/lib/${PVM_ARCH}"
, "-optl-lpvm3"
- , "-optl-lgpvm3" ]),
+ , "-optl-lgpvm3" ],
- (WayPar, Way "md" False "Distributed"
+ Way WayPar "md" False "Distributed"
[ "-fparallel"
, "-D__PARALLEL_HASKELL__"
, "-D__DISTRIBUTED_HASKELL__"
, "-optc-w"
, "-optl-L${PVM_ROOT}/lib/${PVM_ARCH}"
, "-optl-lpvm3"
- , "-optl-lgpvm3" ]),
+ , "-optl-lgpvm3" ],
- (WayGran, Way "mg" False "GranSim"
+ Way WayGran "mg" False "GranSim"
[ "-fgransim"
, "-D__GRANSIM__"
, "-optc-DGRAN"
- , "-package concurrent" ]),
-
- (WayNDP, Way "ndp" False "Nested data parallelism"
- [ "-fparr"
- , "-fflatten"]),
-
- (WayUser_a, Way "a" False "User way 'a'" ["$WAY_a_REAL_OPTS"]),
- (WayUser_b, Way "b" False "User way 'b'" ["$WAY_b_REAL_OPTS"]),
- (WayUser_c, Way "c" False "User way 'c'" ["$WAY_c_REAL_OPTS"]),
- (WayUser_d, Way "d" False "User way 'd'" ["$WAY_d_REAL_OPTS"]),
- (WayUser_e, Way "e" False "User way 'e'" ["$WAY_e_REAL_OPTS"]),
- (WayUser_f, Way "f" False "User way 'f'" ["$WAY_f_REAL_OPTS"]),
- (WayUser_g, Way "g" False "User way 'g'" ["$WAY_g_REAL_OPTS"]),
- (WayUser_h, Way "h" False "User way 'h'" ["$WAY_h_REAL_OPTS"]),
- (WayUser_i, Way "i" False "User way 'i'" ["$WAY_i_REAL_OPTS"]),
- (WayUser_j, Way "j" False "User way 'j'" ["$WAY_j_REAL_OPTS"]),
- (WayUser_k, Way "k" False "User way 'k'" ["$WAY_k_REAL_OPTS"]),
- (WayUser_l, Way "l" False "User way 'l'" ["$WAY_l_REAL_OPTS"]),
- (WayUser_m, Way "m" False "User way 'm'" ["$WAY_m_REAL_OPTS"]),
- (WayUser_n, Way "n" False "User way 'n'" ["$WAY_n_REAL_OPTS"]),
- (WayUser_o, Way "o" False "User way 'o'" ["$WAY_o_REAL_OPTS"]),
- (WayUser_A, Way "A" False "User way 'A'" ["$WAY_A_REAL_OPTS"]),
- (WayUser_B, Way "B" False "User way 'B'" ["$WAY_B_REAL_OPTS"])
- ]
+ , "-package concurrent" ],
-unregFlags =
- [ "-optc-DNO_REGS"
- , "-optc-DUSE_MINIINTERPRETER"
- , "-fno-asm-mangling"
- , "-funregisterised"
- , "-fvia-C" ]
+ Way WayNDP "ndp" False "Nested data parallelism"
+ [ "-XParr"
+ , "-fvectorise"]
+ ]