addCmdlineHCInclude,
buildStaticHscOpts,
machdepCCOpts,
+ picCCOpts,
processArgs, OptKind(..), -- for DriverMkDepend only
) where
#include "HsVersions.h"
-#include "../includes/ghcconfig.h"
import MkIface ( showIface )
import DriverState
-- -fno-code says to stop after Hsc but don't generate any code.
, ( "fno-code" , PassFlag (\f -> do setMode (StopBefore HCc) f
setTarget HscNothing
- writeIORef v_Recomp False))
+ setRecompFlag False))
------- GHCi -------------------------------------------------------
, ( "ignore-dot-ghci", NoArg (writeIORef v_Read_DotGHCi False) )
, ( "read-dot-ghci" , NoArg (writeIORef v_Read_DotGHCi True) )
- ------- recompilation checker --------------------------------------
- , ( "recomp" , NoArg (writeIORef v_Recomp True) )
- , ( "no-recomp" , NoArg (writeIORef v_Recomp False) )
-
------- ways --------------------------------------------------------
, ( "prof" , NoArg (addNoDups v_Ways WayProf) )
, ( "unreg" , NoArg (addNoDups v_Ways WayUnreg) )
, ( "opti", HasArg (addOpt_i) )
#endif
+ ------- recompilation checker --------------------------------------
+ , ( "recomp" , NoArg (setRecompFlag True) )
+ , ( "no-recomp" , NoArg (setRecompFlag False) )
+
------- Packages ----------------------------------------------------
, ( "package-conf" , HasArg extraPkgConf_ )
, ( "no-user-package-conf", NoArg noUserPkgConf_ )
------ Debugging ----------------------------------------------------
, ( "dstg-stats", NoArg (writeIORef v_StgStats True) )
- , ( "ddump-cmm", NoArg (setDynFlag Opt_D_dump_cmm) )
- , ( "ddump-asm", NoArg (setDynFlag Opt_D_dump_asm) )
- , ( "ddump-cpranal", NoArg (setDynFlag Opt_D_dump_cpranal) )
- , ( "ddump-deriv", NoArg (setDynFlag Opt_D_dump_deriv) )
- , ( "ddump-ds", NoArg (setDynFlag Opt_D_dump_ds) )
- , ( "ddump-flatC", NoArg (setDynFlag Opt_D_dump_flatC) )
- , ( "ddump-foreign", NoArg (setDynFlag Opt_D_dump_foreign) )
- , ( "ddump-inlinings", NoArg (setDynFlag Opt_D_dump_inlinings) )
- , ( "ddump-occur-anal", NoArg (setDynFlag Opt_D_dump_occur_anal) )
- , ( "ddump-parsed", NoArg (setDynFlag Opt_D_dump_parsed) )
- , ( "ddump-rn", NoArg (setDynFlag Opt_D_dump_rn) )
- , ( "ddump-simpl", NoArg (setDynFlag Opt_D_dump_simpl) )
- , ( "ddump-simpl-iterations", NoArg (setDynFlag Opt_D_dump_simpl_iterations) )
- , ( "ddump-spec", NoArg (setDynFlag Opt_D_dump_spec) )
- , ( "ddump-prep", NoArg (setDynFlag Opt_D_dump_prep) )
- , ( "ddump-stg", NoArg (setDynFlag Opt_D_dump_stg) )
- , ( "ddump-stranal", NoArg (setDynFlag Opt_D_dump_stranal) )
- , ( "ddump-tc", NoArg (setDynFlag Opt_D_dump_tc) )
- , ( "ddump-types", NoArg (setDynFlag Opt_D_dump_types) )
- , ( "ddump-rules", NoArg (setDynFlag Opt_D_dump_rules) )
- , ( "ddump-cse", NoArg (setDynFlag Opt_D_dump_cse) )
- , ( "ddump-worker-wrapper", NoArg (setDynFlag Opt_D_dump_worker_wrapper) )
- , ( "dshow-passes", NoArg (setVerbosity "2") )
- , ( "ddump-rn-trace", NoArg (setDynFlag Opt_D_dump_rn_trace) )
- , ( "ddump-if-trace", NoArg (setDynFlag Opt_D_dump_if_trace) )
- , ( "ddump-tc-trace", NoArg (setDynFlag Opt_D_dump_tc_trace) )
- , ( "ddump-splices", NoArg (setDynFlag Opt_D_dump_splices) )
- , ( "ddump-rn-stats", NoArg (setDynFlag Opt_D_dump_rn_stats) )
- , ( "ddump-opt-cmm", NoArg (setDynFlag Opt_D_dump_opt_cmm) )
- , ( "ddump-simpl-stats", NoArg (setDynFlag Opt_D_dump_simpl_stats) )
- , ( "ddump-bcos", NoArg (setDynFlag Opt_D_dump_BCOs) )
- , ( "dsource-stats", NoArg (setDynFlag Opt_D_source_stats) )
- , ( "dverbose-core2core", NoArg (setDynFlag Opt_D_verbose_core2core) )
- , ( "dverbose-stg2stg", NoArg (setDynFlag Opt_D_verbose_stg2stg) )
- , ( "ddump-hi-diffs", NoArg (setDynFlag Opt_D_dump_hi_diffs) )
- , ( "ddump-hi", NoArg (setDynFlag Opt_D_dump_hi) )
- , ( "ddump-minimal-imports", NoArg (setDynFlag Opt_D_dump_minimal_imports) )
- , ( "ddump-vect", NoArg (setDynFlag Opt_D_dump_vect) )
- , ( "dcore-lint", NoArg (setDynFlag Opt_DoCoreLinting) )
- , ( "dstg-lint", NoArg (setDynFlag Opt_DoStgLinting) )
- , ( "dcmm-lint", NoArg (setDynFlag Opt_DoCmmLinting) )
+ , ( "ddump-cmm", setDumpFlag Opt_D_dump_cmm)
+ , ( "ddump-asm", setDumpFlag Opt_D_dump_asm)
+ , ( "ddump-cpranal", setDumpFlag Opt_D_dump_cpranal)
+ , ( "ddump-deriv", setDumpFlag Opt_D_dump_deriv)
+ , ( "ddump-ds", setDumpFlag Opt_D_dump_ds)
+ , ( "ddump-flatC", setDumpFlag Opt_D_dump_flatC)
+ , ( "ddump-foreign", setDumpFlag Opt_D_dump_foreign)
+ , ( "ddump-inlinings", setDumpFlag Opt_D_dump_inlinings)
+ , ( "ddump-occur-anal", setDumpFlag Opt_D_dump_occur_anal)
+ , ( "ddump-parsed", setDumpFlag Opt_D_dump_parsed)
+ , ( "ddump-rn", setDumpFlag Opt_D_dump_rn)
+ , ( "ddump-simpl", setDumpFlag Opt_D_dump_simpl)
+ , ( "ddump-simpl-iterations", setDumpFlag Opt_D_dump_simpl_iterations)
+ , ( "ddump-spec", setDumpFlag Opt_D_dump_spec)
+ , ( "ddump-prep", setDumpFlag Opt_D_dump_prep)
+ , ( "ddump-stg", setDumpFlag Opt_D_dump_stg)
+ , ( "ddump-stranal", setDumpFlag Opt_D_dump_stranal)
+ , ( "ddump-tc", setDumpFlag Opt_D_dump_tc)
+ , ( "ddump-types", setDumpFlag Opt_D_dump_types)
+ , ( "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", 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", 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", setDumpFlag Opt_D_dump_hi_diffs)
+ , ( "ddump-hi", setDumpFlag Opt_D_dump_hi)
+ , ( "ddump-minimal-imports", setDumpFlag Opt_D_dump_minimal_imports)
+ , ( "ddump-vect", setDumpFlag Opt_D_dump_vect)
+ , ( "dcore-lint", setDumpFlag Opt_DoCoreLinting)
+ , ( "dstg-lint", setDumpFlag Opt_DoStgLinting)
+ , ( "dcmm-lint", setDumpFlag Opt_DoCmmLinting)
+ , ( "dshow-passes", NoArg (setRecompFlag False >> setVerbosity "2") )
------ Machine dependant (-m<blah>) stuff ---------------------------
setDynFlag f = updDynFlags (\dfs -> dopt_set dfs f)
unSetDynFlag f = updDynFlags (\dfs -> dopt_unset dfs f)
+setDumpFlag :: DynFlag -> OptKind
+setDumpFlag dump_flag
+ = NoArg (setRecompFlag False >> setDynFlag dump_flag)
+ -- Whenver we -ddump, switch off the recompilation checker,
+ -- else you don't see the dump!
+
addOpt_L a = updDynFlags (\s -> s{opt_L = a : opt_L s})
addOpt_P a = updDynFlags (\s -> s{opt_P = a : opt_P s})
addOpt_F a = updDynFlags (\s -> s{opt_F = a : opt_F s})
addOpt_i a = updDynFlags (\s -> s{opt_i = a : opt_i s})
#endif
+setRecompFlag :: Bool -> IO ()
+setRecompFlag recomp = updDynFlags (\dfs -> dfs{ recompFlag = recomp })
+
setVerbosity "" = updDynFlags (\dfs -> dfs{ verbosity = 3 })
setVerbosity n
| all isDigit n = updDynFlags (\dfs -> dfs{ verbosity = read n })
-- )
machdepCCOpts dflags
- | prefixMatch "alpha" cTARGETPLATFORM
+#if alpha_TARGET_ARCH
= return ( ["-w", "-mieee"
#ifdef HAVE_THREADED_RTS_SUPPORT
, "-D_REENTRANT"
-- register used for global register variable", we simply
-- disable all warnings altogether using the -w flag. Oh well.
- | prefixMatch "hppa" cTARGETPLATFORM
+#elif hppa_TARGET_ARCH
-- ___HPUX_SOURCE, not _HPUX_SOURCE, is #defined if -ansi!
-- (very nice, but too bad the HP /usr/include files don't agree.)
= return ( ["-D_HPUX_SOURCE"], [] )
- | prefixMatch "m68k" cTARGETPLATFORM
+#elif m68k_TARGET_ARCH
-- -fno-defer-pop : for the .hc files, we want all the pushing/
-- popping of args to routines to be explicit; if we let things
-- be deferred 'til after an STGJUMP, imminent death is certain!
-- as on iX86, where we *do* steal the frame pointer [%ebp].)
= return ( [], ["-fno-defer-pop", "-fno-omit-frame-pointer"] )
- | prefixMatch "i386" cTARGETPLATFORM
+#elif i386_TARGET_ARCH
-- -fno-defer-pop : basically the same game as for m68k
--
-- -fomit-frame-pointer : *must* in .hc files; because we're stealing
"-DSTOLEN_X86_REGS="++show n_regs ]
)
- | prefixMatch "ia64" cTARGETPLATFORM
+#elif ia64_TARGET_ARCH
= return ( [], ["-fomit-frame-pointer", "-G0"] )
- | prefixMatch "x86_64" cTARGETPLATFORM
+#elif x86_64_TARGET_ARCH
= return ( [], ["-fomit-frame-pointer"] )
- | prefixMatch "mips" cTARGETPLATFORM
+#elif mips_TARGET_ARCH
= return ( ["-static"], [] )
- | prefixMatch "sparc" cTARGETPLATFORM
+#elif sparc_TARGET_ARCH
= return ( [], ["-w"] )
-- For now, to suppress the gcc warning "call-clobbered
-- register used for global register variable", we simply
-- disable all warnings altogether using the -w flag. Oh well.
- | prefixMatch "powerpc-apple-darwin" cTARGETPLATFORM
+#elif powerpc_apple_darwin_TARGET
-- -no-cpp-precomp:
-- Disable Apple's precompiling preprocessor. It's a great thing
-- for "normal" programs, but it doesn't support register variable
-- declarations.
+ = return ( [], ["-no-cpp-precomp"] )
+#else
+ = return ( [], [] )
+#endif
+
+picCCOpts dflags
+#if darwin_TARGET_OS
+ -- Apple prefers to do things the other way round.
+ -- PIC is on by default.
-- -mdynamic-no-pic:
- -- Turn off PIC code generation to save space and time.
+ -- Turn off PIC code generation.
-- -fno-common:
-- Don't generate "common" symbols - these are unwanted
-- in dynamic libraries.
- = if opt_PIC
- then return ( ["-no-cpp-precomp", "-fno-common"],
- ["-fno-common"] )
- else return ( ["-no-cpp-precomp", "-mdynamic-no-pic"],
- ["-mdynamic-no-pic"] )
-
- | prefixMatch "powerpc" cTARGETPLATFORM && opt_PIC
- = return ( ["-fPIC"], ["-fPIC"] )
-
- | otherwise
- = return ( [], [] )
+ | opt_PIC
+ = return ["-fno-common"]
+ | otherwise
+ = return ["-mdynamic-no-pic"]
+#elif mingw32_TARGET_OS
+ -- no -fPIC for Windows
+ = return []
+#else
+ | opt_PIC
+ = return ["-fPIC"]
+ | otherwise
+ = return []
+#endif
-----------------------------------------------------------------------------
-- local utils