opt_SccProfilingOn,
opt_DoTickyProfiling,
+ -- Hpc opts
+ opt_Hpc,
+ opt_Hpc_Tracer,
+
-- language opts
opt_DictsStrict,
opt_IrrefutableTuples,
-- optimisation opts
opt_NoMethodSharing,
opt_NoStateHack,
- opt_LiberateCaseThreshold,
opt_CprOff,
opt_RulesOff,
opt_SimplNoPreInlining,
opt_UF_UpdateInPlace,
opt_UF_DearOp,
+ -- 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
) where
#include "HsVersions.h"
-import Util ( consIORef )
import CmdLineParser
-import Config ( cProjectVersionInt, cProjectPatchLevel,
- cGhcUnregisterised )
+import Config
import FastString ( FastString, mkFastString )
import Util
import Maybes ( firstJust )
import Panic ( GhcException(..), ghcError )
-import EXCEPTION ( throwDyn )
-import DATA_IOREF
-import UNSAFE_IO ( unsafePerformIO )
-import Monad ( when )
-import Char ( isDigit )
+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 )
-----------------------------------------------------------------------------
| otherwise = []
(more_leftover, errs) <- processArgs static_flags (unreg_flags ++ way_flags)
+
+ -- 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 = []
+
when (not (null errs)) $ ghcError (UsageError (unlines errs))
- return (more_leftover++leftover)
+ return (cg_flags++more_leftover++leftover)
+
+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 )
-- ToDo: user ways
------ Debugging ----------------------------------------------------
- , ( "dppr-noprags", PassFlag addOpt )
, ( "dppr-debug", PassFlag addOpt )
, ( "dppr-user-length", AnySuffix addOpt )
-- rest of the debugging flags are dynamic
+ --------- Haskell Program Coverage -----------------------------------
+
+ , ( "fhpc" , PassFlag addOpt )
+ , ( "fhpc-tracer" , PassFlag addOpt )
+
--------- Profiling --------------------------------------------------
, ( "auto-all" , NoArg (addOpt "-fauto-sccs-on-all-toplevs") )
, ( "auto" , NoArg (addOpt "-fauto-sccs-on-exported-toplevs") )
opt_SccProfilingOn = lookUp FSLIT("-fscc-profiling")
opt_DoTickyProfiling = lookUp FSLIT("-fticky-ticky")
+
+-- Hpc opts
+
+opt_Hpc = lookUp FSLIT("-fhpc")
+ || opt_Hpc_Tracer
+opt_Hpc_Tracer = lookUp FSLIT("-fhpc-tracer")
+
-- language opts
opt_DictsStrict = lookUp FSLIT("-fdicts-strict")
opt_IrrefutableTuples = lookUp FSLIT("-firrefutable-tuples")
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_EmitCExternDecls = lookUp FSLIT("-femit-extern-decls")
opt_GranMacros = lookUp FSLIT("-fgransim")
opt_HiVersion = read (cProjectVersionInt ++ cProjectPatchLevel) :: Int
opt_HistorySize = lookup_def_int "-fhistory-size" 20
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")
+
+-- 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/InfoTables.h.
+tablesNextToCode = not opt_Unregisterised
+ && cGhcEnableTablesNextToCode == "YES"
+
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
"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",
- "fglobalise-toplev-names",
"fgransim",
"fno-hi-version-check",
"dno-black-holing",
"static",
"funregisterised",
"fext-core",
- "frule-check",
"frules-off",
"fcpr-off",
"ferror-spans",
_ `allowedWith` WayDebug = True
WayDebug `allowedWith` _ = True
- WayThreaded `allowedWith` WayProf = True
WayProf `allowedWith` WayUnreg = True
WayProf `allowedWith` WayNDP = True
_ `allowedWith` _ = False