X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=compiler%2Fmain%2FDynFlags.hs;h=8297067b705ff0f813e937bc894c3ae56ce36f16;hp=246fb72a1fed9d88a13b8ad941636968a4428fb3;hb=0b9530245a33b8206ca38b9de6dfb01e056fd8dc;hpb=544d0172c8d442a3d9b9fca5210ac7fda8b44b5f diff --git a/compiler/main/DynFlags.hs b/compiler/main/DynFlags.hs index 246fb72a..8297067 100644 --- a/compiler/main/DynFlags.hs +++ b/compiler/main/DynFlags.hs @@ -1,3 +1,4 @@ + {-# OPTIONS -fno-warn-missing-fields #-} ----------------------------------------------------------------------------- -- @@ -16,7 +17,7 @@ module DynFlags ( -- Dynamic flags DynFlag(..), DynFlags(..), - HscTarget(..), + HscTarget(..), isObjectTarget, defaultObjectTarget, GhcMode(..), isOneShot, GhcLink(..), isNoLink, PackageFlag(..), @@ -46,12 +47,14 @@ module DynFlags ( allFlags, -- misc stuff - machdepCCOpts, picCCOpts + machdepCCOpts, picCCOpts, + supportedLanguages, + compilerInfo, ) where #include "HsVersions.h" -import Module ( Module, mkModuleName, mkModule ) +import Module ( Module, mkModuleName, mkModule, ModLocation ) import PackageConfig import PrelNames ( mAIN ) #ifdef i386_TARGET_ARCH @@ -66,8 +69,8 @@ import CmdLineParser import Constants ( mAX_CONTEXT_REDUCTION_DEPTH ) import Panic ( panic, GhcException(..) ) import UniqFM ( UniqFM ) -import Util ( notNull, splitLongestPrefix, normalisePath ) -import Maybes ( fromJust, orElse ) +import Util +import Maybes ( orElse, fromJust ) import SrcLoc ( SrcSpan ) import Outputable import {-# SOURCE #-} ErrUtils ( Severity(..), Message, mkLocMessage ) @@ -81,13 +84,9 @@ import Data.List ( isPrefixOf ) import Util ( split ) #endif -import Data.Char ( isUpper ) +import Data.Char ( isUpper, toLower ) import System.IO ( hPutStrLn, stderr ) -#ifdef GHCI -import Breakpoints ( BkptHandler ) -import Module ( ModuleName ) -#endif -- ----------------------------------------------------------------------------- -- DynFlags @@ -95,7 +94,15 @@ data DynFlag -- debugging flags = Opt_D_dump_cmm + | Opt_D_dump_cps_cmm | Opt_D_dump_asm + | Opt_D_dump_asm_native + | Opt_D_dump_asm_liveness + | Opt_D_dump_asm_coalesce + | Opt_D_dump_asm_regalloc + | Opt_D_dump_asm_regalloc_stages + | Opt_D_dump_asm_conflicts + | Opt_D_dump_asm_stats | Opt_D_dump_cpranal | Opt_D_dump_deriv | Opt_D_dump_ds @@ -133,14 +140,17 @@ data DynFlag | Opt_D_dump_hi | Opt_D_dump_hi_diffs | Opt_D_dump_minimal_imports + | Opt_D_dump_mod_cycles | Opt_D_faststring_stats + | Opt_DumpToFile -- ^ Append dump output to files instead of stdout. | Opt_DoCoreLinting | Opt_DoStgLinting | Opt_DoCmmLinting - | Opt_WarnIsError -- -Werror; makes warnings fatal + | Opt_WarnIsError -- -Werror; makes warnings fatal | Opt_WarnDuplicateExports | Opt_WarnHiShadows + | Opt_WarnImplicitPrelude | Opt_WarnIncompletePatterns | Opt_WarnIncompletePatternsRecUpd | Opt_WarnMissingFields @@ -150,6 +160,7 @@ data DynFlag | Opt_WarnOverlappingPatterns | Opt_WarnSimplePatterns | Opt_WarnTypeDefaults + | Opt_WarnMonomorphism | Opt_WarnUnusedBinds | Opt_WarnUnusedImports | Opt_WarnUnusedMatches @@ -159,29 +170,62 @@ data DynFlag | Opt_WarnTabs -- language opts - | Opt_AllowOverlappingInstances - | Opt_AllowUndecidableInstances - | Opt_AllowIncoherentInstances + | Opt_OverlappingInstances + | Opt_UndecidableInstances + | Opt_IncoherentInstances | Opt_MonomorphismRestriction | Opt_MonoPatBinds | Opt_ExtendedDefaultRules -- Use GHC's extended rules for defaulting - | Opt_GlasgowExts - | Opt_FFI + | Opt_ForeignFunctionInterface + | Opt_UnliftedFFITypes | Opt_PArr -- Syntactic support for parallel arrays | Opt_Arrows -- Arrow-notation syntax - | Opt_TH + | Opt_TemplateHaskell | Opt_ImplicitParams | Opt_Generics | Opt_ImplicitPrelude | Opt_ScopedTypeVariables + | Opt_UnboxedTuples | Opt_BangPatterns - | Opt_IndexedTypes + | Opt_TypeFamilies | Opt_OverloadedStrings + | Opt_DisambiguateRecordFields + | Opt_RecordWildCards + | Opt_RecordPuns + | Opt_GADTs + | Opt_RelaxedPolyRec + | Opt_StandaloneDeriving + | Opt_DeriveDataTypeable + | Opt_TypeSynonymInstances + | Opt_FlexibleContexts + | Opt_FlexibleInstances + | Opt_ConstrainedClassMethods + | Opt_MultiParamTypeClasses + | Opt_FunctionalDependencies + | Opt_UnicodeSyntax + | Opt_PolymorphicComponents + | Opt_ExistentialQuantification + | Opt_MagicHash + | Opt_EmptyDataDecls + | Opt_KindSignatures + | Opt_PatternSignatures + | Opt_ParallelListComp + | Opt_GeneralizedNewtypeDeriving + | Opt_RecursiveDo + | Opt_PatternGuards + | Opt_PartiallyAppliedClosedTypeSynonyms + | Opt_Rank2Types + | Opt_RankNTypes + | Opt_TypeOperators + + | Opt_PrintExplicitForalls -- optimisation opts | Opt_Strictness | Opt_FullLaziness | Opt_CSE + | Opt_LiberateCase + | Opt_SpecConstr | Opt_IgnoreInterfacePragmas | Opt_OmitInterfacePragmas | Opt_DoLambdaEtaExpansion @@ -191,6 +235,9 @@ data DynFlag | Opt_CaseMerge | Opt_UnboxStrictFields | Opt_DictsCheap + | Opt_RewriteRules + | Opt_Vectorise + | Opt_RegsGraph -- misc opts | Opt_Cpp @@ -204,12 +251,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 + | Opt_BreakOnException + | Opt_GenManifest + | Opt_EmbedManifest -- keeping stuff | Opt_KeepHiDiffs @@ -218,7 +265,7 @@ data DynFlag | Opt_KeepRawSFiles | Opt_KeepTmpFiles - deriving (Eq) + deriving (Eq, Show) data DynFlags = DynFlags { ghcMode :: GhcMode, @@ -232,7 +279,8 @@ data DynFlags = DynFlags { optLevel :: Int, -- optimisation level maxSimplIterations :: Int, -- max simplifier iterations ruleCheck :: Maybe String, - libCaseThreshold :: Int, -- Threshold for liberate-case + + specThreshold :: Int, -- Threshold for function specialisation stolen_x86_regs :: Int, cmdlineHcIncludes :: [String], -- -#includes @@ -260,6 +308,14 @@ data DynFlags = DynFlags { outputFile :: Maybe String, outputHi :: Maybe String, + -- | This is set by DriverPipeline.runPipeline based on where + -- its output is going. + dumpPrefix :: Maybe FilePath, + + -- | Override the dumpPrefix set by runPipeline. + -- Set by -ddump-file-prefix + dumpPrefixForce :: Maybe FilePath, + includePaths :: [String], libraryPaths :: [String], frameworkPaths :: [String], -- used on darwin only @@ -279,8 +335,8 @@ data DynFlags = DynFlags { opt_m :: [String], opt_a :: [String], opt_l :: [String], - opt_dll :: [String], opt_dep :: [String], + opt_windres :: [String], -- commands for particular phases pgm_L :: String, @@ -294,6 +350,7 @@ data DynFlags = DynFlags { pgm_dll :: (String,[Option]), pgm_T :: String, pgm_sysman :: String, + pgm_windres :: String, -- Package flags extraPkgConfs :: [FilePath], @@ -316,11 +373,6 @@ data DynFlags = DynFlags { -- message output log_action :: Severity -> SrcSpan -> PprStyle -> Message -> IO () - -#ifdef GHCI - -- breakpoint handling - ,bkptHandler :: Maybe (BkptHandler Module) -#endif } data HscTarget @@ -331,24 +383,35 @@ data HscTarget | HscNothing deriving (Eq, Show) +-- | will this target result in an object file on the disk? +isObjectTarget :: HscTarget -> Bool +isObjectTarget HscC = True +isObjectTarget HscAsm = True +isObjectTarget _ = False + +-- | The 'GhcMode' tells us whether we're doing multi-module +-- compilation (controlled via the "GHC" API) or one-shot +-- (single-module) compilation. This makes a difference primarily to +-- the "Finder": in one-shot mode we look for interface files for +-- imported modules, but in multi-module mode we look for source files +-- in order to check whether they need to be recompiled. data GhcMode - = BatchCompile -- | @ghc --make Main@ - | Interactive -- | @ghc --interactive@ - | OneShot -- | @ghc -c Foo.hs@ - | JustTypecheck -- | Development environemnts, refactorer, etc. - | MkDepend + = CompManager -- ^ --make, GHCi, etc. + | OneShot -- ^ ghc -c Foo.hs + | MkDepend -- ^ ghc -M, see Finder for why we need this deriving Eq isOneShot :: GhcMode -> Bool isOneShot OneShot = True isOneShot _other = False +-- | What kind of linking to do. data GhcLink -- What to do in the link step, if there is one - = -- Only relevant for modes - -- DoMake and StopBefore StopLn - NoLink -- Don't link at all - | StaticLink -- Ordinary linker [the default] - | MkDLL -- Make a DLL + = NoLink -- Don't link at all + | LinkBinary -- Link object code into a binary + | LinkInMemory -- Use the in-memory dynamic linker + | LinkDynLib -- Link objects into a dynamic lib (DLL on Windows, DSO on ELF platforms) + deriving Eq isNoLink :: GhcLink -> Bool isNoLink NoLink = True @@ -360,7 +423,11 @@ data PackageFlag | IgnorePackage String deriving Eq -defaultHscTarget +defaultHscTarget = defaultObjectTarget + +-- | the 'HscTarget' value corresponding to the default way to create +-- object files on the current platform. +defaultObjectTarget | cGhcWithNativeCodeGen == "YES" = HscAsm | otherwise = HscC @@ -377,8 +444,8 @@ initDynFlags dflags = do defaultDynFlags = DynFlags { - ghcMode = OneShot, - ghcLink = StaticLink, + ghcMode = CompManager, + ghcLink = LinkBinary, coreToDo = Nothing, stgToDo = Nothing, hscTarget = defaultHscTarget, @@ -388,7 +455,7 @@ defaultDynFlags = optLevel = 0, maxSimplIterations = 4, ruleCheck = Nothing, - libCaseThreshold = 20, + specThreshold = 200, stolen_x86_regs = 4, cmdlineHcIncludes = [], importPaths = ["."], @@ -408,6 +475,8 @@ defaultDynFlags = outputFile = Nothing, outputHi = Nothing, + dumpPrefix = Nothing, + dumpPrefixForce = Nothing, includePaths = [], libraryPaths = [], frameworkPaths = [], @@ -417,22 +486,21 @@ defaultDynFlags = hpcDir = ".hpc", opt_L = [], - opt_P = [], + opt_P = (if opt_PIC + then ["-D__PIC__"] + else []), opt_F = [], opt_c = [], opt_a = [], opt_m = [], opt_l = [], - opt_dll = [], opt_dep = [], + opt_windres = [], extraPkgConfs = [], packageFlags = [], pkgDatabase = Nothing, pkgState = panic "no package state yet: call GHC.setSessionDynFlags", -#ifdef GHCI - bkptHandler = Nothing, -#endif flags = [ Opt_ReadUserPackageConf, @@ -442,27 +510,17 @@ defaultDynFlags = Opt_ImplicitPrelude, Opt_MonomorphismRestriction, - Opt_Strictness, - -- strictness is on by default, but this only - -- applies to -O. - Opt_CSE, -- similarly for CSE. - Opt_FullLaziness, -- ...and for full laziness - - Opt_DoLambdaEtaExpansion, - -- This one is important for a tiresome reason: - -- we want to make sure that the bindings for data - -- constructors are eta-expanded. This is probably - -- a good thing anyway, but it seems fragile. - + Opt_DoAsmMangling, - -- and the default no-optimisation options: - Opt_IgnoreInterfacePragmas, - Opt_OmitInterfacePragmas, - + Opt_GenManifest, + Opt_EmbedManifest, + -- on by default: - Opt_PrintBindResult - ] ++ standardWarnings, + Opt_PrintBindResult ] + ++ [f | (ns,f) <- optLevelFlags, 0 `elem` ns] + -- The default -O0 options + ++ standardWarnings, log_action = \severity srcSpan style msg -> case severity of @@ -511,6 +569,8 @@ setHcSuf f d = d{ hcSuf = f} setOutputFile f d = d{ outputFile = f} setOutputHi f d = d{ outputHi = f} +setDumpPrefixForce f d = d { dumpPrefixForce = f} + -- XXX HACK: Prelude> words "'does not' work" ===> ["'does","not'","work"] -- Config.hs should really use Option. setPgmP f d = let (pgm:args) = words f in d{ pgm_P = (pgm, map Option args)} @@ -523,6 +583,7 @@ setPgms f d = d{ pgm_s = (f,[])} setPgma f d = d{ pgm_a = (f,[])} setPgml f d = d{ pgm_l = (f,[])} setPgmdll f d = d{ pgm_dll = (f,[])} +setPgmwindres f d = d{ pgm_windres = f} addOptL f d = d{ opt_L = f : opt_L d} addOptP f d = d{ opt_P = f : opt_P d} @@ -531,8 +592,8 @@ addOptc f d = d{ opt_c = f : opt_c d} addOptm f d = d{ opt_m = f : opt_m d} addOpta f d = d{ opt_a = f : opt_a d} addOptl f d = d{ opt_l = f : opt_l d} -addOptdll f d = d{ opt_dll = f : opt_dll d} addOptdep f d = d{ opt_dep = f : opt_dep d} +addOptwindres f d = d{ opt_windres = f : opt_windres d} addCmdlineFramework f d = d{ cmdlineFrameworks = f : cmdlineFrameworks d} @@ -559,30 +620,39 @@ data Option updOptLevel :: Int -> DynFlags -> DynFlags -- Set dynflags appropriate to the optimisation level updOptLevel n dfs - = dfs2{ optLevel = n } + = dfs2{ optLevel = final_n } where + final_n = max 0 (min 2 n) -- Clamp to 0 <= n <= 2 dfs1 = foldr (flip dopt_unset) dfs remove_dopts dfs2 = foldr (flip dopt_set) dfs1 extra_dopts - extra_dopts - | n == 0 = opt_0_dopts - | otherwise = opt_1_dopts - - remove_dopts - | n == 0 = opt_1_dopts - | otherwise = opt_0_dopts + extra_dopts = [ f | (ns,f) <- optLevelFlags, final_n `elem` ns ] + remove_dopts = [ f | (ns,f) <- optLevelFlags, final_n `notElem` ns ] -opt_0_dopts = [ - Opt_IgnoreInterfacePragmas, - Opt_OmitInterfacePragmas +optLevelFlags :: [([Int], DynFlag)] +optLevelFlags + = [ ([0], Opt_IgnoreInterfacePragmas) + , ([0], Opt_OmitInterfacePragmas) + + , ([1,2], Opt_IgnoreAsserts) + , ([1,2], Opt_RewriteRules) -- Off for -O0; see Note [Scoping for Builtin rules] + -- in PrelRules + , ([1,2], Opt_DoEtaReduction) + , ([1,2], Opt_CaseMerge) + , ([1,2], Opt_Strictness) + , ([1,2], Opt_CSE) + , ([1,2], Opt_FullLaziness) + + , ([2], Opt_LiberateCase) + , ([2], Opt_SpecConstr) + + , ([0,1,2], Opt_DoLambdaEtaExpansion) + -- This one is important for a tiresome reason: + -- we want to make sure that the bindings for data + -- constructors are eta-expanded. This is probably + -- a good thing anyway, but it seems fragile. ] -opt_1_dopts = [ - Opt_IgnoreAsserts, - Opt_DoEtaReduction, - Opt_CaseMerge - ] - -- ----------------------------------------------------------------------------- -- Standard sets of warning options @@ -612,6 +682,16 @@ minusWallOpts Opt_WarnOrphans ] +-- minuswRemovesOpts should be every warning option +minuswRemovesOpts + = minusWallOpts ++ + [Opt_WarnImplicitPrelude, + Opt_WarnIncompletePatternsRecUpd, + Opt_WarnSimplePatterns, + Opt_WarnMonomorphism, + Opt_WarnTabs + ] + -- ----------------------------------------------------------------------------- -- CoreToDo: abstraction of core-to-core passes to run. @@ -638,8 +718,9 @@ data CoreToDo -- These are diff core-to-core passes, | CoreCSE | CoreDoRuleCheck Int{-CompilerPhase-} String -- Check for non-application of rules -- matching this string - - | CoreDoNothing -- useful when building up lists of these things + | CoreDoVectorisation + | CoreDoNothing -- Useful when building up + | CoreDoPasses [CoreToDo] -- lists of these things data SimplifierMode -- See comments in SimplMonad = SimplGently @@ -656,6 +737,9 @@ data FloatOutSwitches -- The core-to-core pass ordering is derived from the DynFlags: +runWhen :: Bool -> CoreToDo -> CoreToDo +runWhen True do_this = do_this +runWhen False do_this = CoreDoNothing getCoreToDo :: DynFlags -> [CoreToDo] getCoreToDo dflags @@ -667,7 +751,10 @@ getCoreToDo dflags strictness = dopt Opt_Strictness dflags full_laziness = dopt Opt_FullLaziness dflags cse = dopt Opt_CSE dflags + spec_constr = dopt Opt_SpecConstr dflags + liberate_case = dopt Opt_LiberateCase dflags rule_check = ruleCheck dflags + vectorisation = dopt Opt_Vectorise dflags core_todo = if opt_level == 0 then @@ -695,12 +782,20 @@ getCoreToDo dflags MaxSimplifierIterations max_iter ], + + -- We run vectorisation here for now, but we might also try to run + -- it later + runWhen vectorisation (CoreDoPasses [ + CoreDoVectorisation, + CoreDoSimplify SimplGently + [NoCaseOfCase, + MaxSimplifierIterations max_iter]]), + -- Specialisation is best done before full laziness -- so that overloaded functions have all their dictionary lambdas manifest CoreDoSpecialising, - if full_laziness then CoreDoFloatOutwards (FloatOutSw False False) - else CoreDoNothing, + runWhen full_laziness (CoreDoFloatOutwards (FloatOutSw False False)), CoreDoFloatInwards, @@ -739,20 +834,19 @@ getCoreToDo dflags case rule_check of { Just pat -> CoreDoRuleCheck 0 pat; Nothing -> CoreDoNothing }, #ifdef OLD_STRICTNESS - CoreDoOldStrictness + CoreDoOldStrictness, #endif - if strictness then CoreDoStrictness else CoreDoNothing, - CoreDoWorkerWrapper, - CoreDoGlomBinds, - - CoreDoSimplify (SimplPhase 0) [ - MaxSimplifierIterations max_iter - ], - - if full_laziness then - CoreDoFloatOutwards (FloatOutSw False -- Not lambdas - True) -- Float constants - else CoreDoNothing, + runWhen strictness (CoreDoPasses [ + CoreDoStrictness, + CoreDoWorkerWrapper, + CoreDoGlomBinds, + CoreDoSimplify (SimplPhase 0) [ + MaxSimplifierIterations max_iter + ]]), + + runWhen full_laziness + (CoreDoFloatOutwards (FloatOutSw False -- Not lambdas + True)), -- Float constants -- nofib/spectral/hartel/wang doubles in speed if you -- do full laziness late in the day. It only happens -- after fusion and other stuff, so the early pass doesn't @@ -760,38 +854,29 @@ getCoreToDo dflags -- f_el22 (f_el21 r_midblock) - -- We want CSE to follow the final full-laziness pass, because it may - -- succeed in commoning up things floated out by full laziness. - -- CSE used to rely on the no-shadowing invariant, but it doesn't any more - - if cse then CoreCSE else CoreDoNothing, + runWhen cse CoreCSE, + -- We want CSE to follow the final full-laziness pass, because it may + -- succeed in commoning up things floated out by full laziness. + -- CSE used to rely on the no-shadowing invariant, but it doesn't any more CoreDoFloatInwards, --- Case-liberation for -O2. This should be after --- strictness analysis and the simplification which follows it. - - case rule_check of { Just pat -> CoreDoRuleCheck 0 pat; Nothing -> CoreDoNothing } - ] - - ++ + case rule_check of { Just pat -> CoreDoRuleCheck 0 pat; Nothing -> CoreDoNothing }, - (if opt_level >= 2 then - [ CoreLiberateCase, - CoreDoSimplify (SimplPhase 0) [ + -- Case-liberation for -O2. This should be after + -- strictness analysis and the simplification which follows it. + runWhen liberate_case (CoreDoPasses [ + CoreLiberateCase, + CoreDoSimplify (SimplPhase 0) [ MaxSimplifierIterations max_iter - ], -- Run the simplifier after LiberateCase to vastly + ] ]), -- Run the simplifier after LiberateCase to vastly -- reduce the possiblility of shadowing -- Reason: see Note [Shadowing] in SpecConstr.lhs - CoreDoSpecConstr - ] - else - []) - ++ + runWhen spec_constr CoreDoSpecConstr, -- Final clean-up simplification: - [ CoreDoSimplify (SimplPhase 0) [ + CoreDoSimplify (SimplPhase 0) [ MaxSimplifierIterations max_iter ] ] @@ -849,6 +934,7 @@ dynamic_flags = [ , ( "pgma" , HasArg (upd . setPgma) ) , ( "pgml" , HasArg (upd . setPgml) ) , ( "pgmdll" , HasArg (upd . setPgmdll) ) + , ( "pgmwindres" , HasArg (upd . setPgmwindres) ) , ( "optL" , HasArg (upd . addOptL) ) , ( "optP" , HasArg (upd . addOptP) ) @@ -857,8 +943,8 @@ dynamic_flags = [ , ( "optm" , HasArg (upd . addOptm) ) , ( "opta" , HasArg (upd . addOpta) ) , ( "optl" , HasArg (upd . addOptl) ) - , ( "optdll" , HasArg (upd . addOptdll) ) , ( "optdep" , HasArg (upd . addOptdep) ) + , ( "optwindres" , HasArg (upd . addOptwindres) ) , ( "split-objs" , NoArg (if can_split then setDynFlag Opt_SplitObjs @@ -867,12 +953,11 @@ dynamic_flags = [ -------- Linking ---------------------------------------------------- , ( "c" , NoArg (upd $ \d -> d{ ghcLink=NoLink } )) , ( "no-link" , NoArg (upd $ \d -> d{ ghcLink=NoLink } )) -- Dep. - , ( "-mk-dll" , NoArg (upd $ \d -> d{ ghcLink=MkDLL } )) + , ( "shared" , NoArg (upd $ \d -> d{ ghcLink=LinkDynLib } )) ------- Libraries --------------------------------------------------- , ( "L" , Prefix addLibraryPath ) - , ( "l" , AnySuffix (\s -> do upd (addOptl s) - upd (addOptdll s))) + , ( "l" , AnySuffix (\s -> do upd (addOptl s))) ------- Frameworks -------------------------------------------------- -- -framework-path should really be -F ... @@ -889,12 +974,18 @@ dynamic_flags = [ , ( "hidir" , HasArg (upd . setHiDir . Just)) , ( "tmpdir" , HasArg (upd . setTmpDir)) , ( "stubdir" , HasArg (upd . setStubDir . Just)) + , ( "ddump-file-prefix", HasArg (upd . setDumpPrefixForce . Just)) ------- Keeping temporary files ------------------------------------- - , ( "keep-hc-file" , AnySuffix (\_ -> setDynFlag Opt_KeepHcFiles)) - , ( "keep-s-file" , AnySuffix (\_ -> setDynFlag Opt_KeepSFiles)) - , ( "keep-raw-s-file", AnySuffix (\_ -> setDynFlag Opt_KeepRawSFiles)) - , ( "keep-tmp-files" , AnySuffix (\_ -> setDynFlag Opt_KeepTmpFiles)) + -- These can be singular (think ghc -c) or plural (think ghc --make) + , ( "keep-hc-file" , NoArg (setDynFlag Opt_KeepHcFiles)) + , ( "keep-hc-files" , NoArg (setDynFlag Opt_KeepHcFiles)) + , ( "keep-s-file" , NoArg (setDynFlag Opt_KeepSFiles)) + , ( "keep-s-files" , NoArg (setDynFlag Opt_KeepSFiles)) + , ( "keep-raw-s-file" , NoArg (setDynFlag Opt_KeepRawSFiles)) + , ( "keep-raw-s-files", NoArg (setDynFlag Opt_KeepRawSFiles)) + -- This only makes sense as plural + , ( "keep-tmp-files" , NoArg (setDynFlag Opt_KeepTmpFiles)) ------- Miscellaneous ---------------------------------------------- , ( "no-hs-main" , NoArg (setDynFlag Opt_NoHsMain)) @@ -928,7 +1019,16 @@ dynamic_flags = [ , ( "dstg-stats", NoArg (setDynFlag Opt_StgStats)) , ( "ddump-cmm", setDumpFlag Opt_D_dump_cmm) + , ( "ddump-cps-cmm", setDumpFlag Opt_D_dump_cps_cmm) , ( "ddump-asm", setDumpFlag Opt_D_dump_asm) + , ( "ddump-asm-native", setDumpFlag Opt_D_dump_asm_native) + , ( "ddump-asm-liveness", setDumpFlag Opt_D_dump_asm_liveness) + , ( "ddump-asm-coalesce", setDumpFlag Opt_D_dump_asm_coalesce) + , ( "ddump-asm-regalloc", setDumpFlag Opt_D_dump_asm_regalloc) + , ( "ddump-asm-conflicts", setDumpFlag Opt_D_dump_asm_conflicts) + , ( "ddump-asm-regalloc-stages", + setDumpFlag Opt_D_dump_asm_regalloc_stages) + , ( "ddump-asm-stats", setDumpFlag Opt_D_dump_asm_stats) , ( "ddump-cpranal", setDumpFlag Opt_D_dump_cpranal) , ( "ddump-deriv", setDumpFlag Opt_D_dump_deriv) , ( "ddump-ds", setDumpFlag Opt_D_dump_ds) @@ -961,12 +1061,13 @@ dynamic_flags = [ , ( "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) , ( "ddump-hpc", setDumpFlag Opt_D_dump_hpc) - + , ( "ddump-mod-cycles", setDumpFlag Opt_D_dump_mod_cycles) + , ( "ddump-to-file", setDumpFlag Opt_DumpToFile) + , ( "ddump-hi-diffs", NoArg (setDynFlag Opt_D_dump_hi_diffs)) , ( "dcore-lint", NoArg (setDynFlag Opt_DoCoreLinting)) , ( "dstg-lint", NoArg (setDynFlag Opt_DoStgLinting)) , ( "dcmm-lint", NoArg (setDynFlag Opt_DoCmmLinting)) @@ -985,106 +1086,248 @@ dynamic_flags = [ , ( "Werror" , NoArg (setDynFlag Opt_WarnIsError) ) , ( "Wall" , NoArg (mapM_ setDynFlag minusWallOpts) ) , ( "Wnot" , NoArg (mapM_ unSetDynFlag minusWallOpts) ) /* DEPREC */ - , ( "w" , NoArg (mapM_ unSetDynFlag minusWallOpts) ) + , ( "w" , NoArg (mapM_ unSetDynFlag minuswRemovesOpts) ) ------ Optimisation flags ------------------------------------------ , ( "O" , NoArg (upd (setOptLevel 1))) - , ( "Onot" , NoArg (upd (setOptLevel 0))) + , ( "Onot" , NoArg (upd (setOptLevel 0))) -- deprecated , ( "O" , OptIntSuffix (\mb_n -> upd (setOptLevel (mb_n `orElse` 1)))) -- If the number is missing, use 1 , ( "fmax-simplifier-iterations", IntSuffix (\n -> upd (\dfs -> dfs{ maxSimplIterations = n })) ) - , ( "fliberate-case-threshold", IntSuffix (\n -> upd (\dfs -> dfs{ libCaseThreshold = n }))) + + -- liberate-case-threshold is an old flag for '-fspec-threshold' + , ( "fspec-threshold", IntSuffix (\n -> upd (\dfs -> dfs{ specThreshold = n }))) + , ( "fliberate-case-threshold", IntSuffix (\n -> upd (\dfs -> dfs{ specThreshold = n }))) + , ( "frule-check", SepArg (\s -> upd (\dfs -> dfs{ ruleCheck = Just s }))) , ( "fcontext-stack" , IntSuffix $ \n -> upd $ \dfs -> dfs{ ctxtStkDepth = n }) ------ Compiler flags ----------------------------------------------- - , ( "fno-code", NoArg (setTarget HscNothing)) - , ( "fasm", AnySuffix (\_ -> setTarget HscAsm) ) - , ( "fvia-c", NoArg (setTarget HscC) ) - , ( "fvia-C", NoArg (setTarget HscC) ) + , ( "fasm", NoArg (setObjTarget HscAsm) ) + , ( "fvia-c", NoArg (setObjTarget HscC) ) + , ( "fvia-C", NoArg (setObjTarget HscC) ) + + , ( "fno-code", NoArg (setTarget HscNothing)) + , ( "fbyte-code", NoArg (setTarget HscInterpreted) ) + , ( "fobject-code", NoArg (setTarget defaultHscTarget) ) , ( "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)) ) + -- the rest of the -f* and -fno-* flags + , ( "f", PrefixPred (isFlag fFlags) + (\f -> setDynFlag (getFlag fFlags f)) ) + , ( "f", PrefixPred (isPrefFlag "no-" fFlags) + (\f -> unSetDynFlag (getPrefFlag "no-" fFlags f)) ) + + -- the -X* and -XNo* flags + , ( "X", PrefixPred (isFlag xFlags) + (\f -> setDynFlag (getFlag xFlags f)) ) + , ( "X", PrefixPred (isPrefFlag "No" xFlags) + (\f -> unSetDynFlag (getPrefFlag "No" xFlags f)) ) ] -- these -f flags can all be reversed with -fno- fFlags = [ - ( "warn-duplicate-exports", Opt_WarnDuplicateExports ), - ( "warn-hi-shadowing", Opt_WarnHiShadows ), - ( "warn-incomplete-patterns", Opt_WarnIncompletePatterns ), - ( "warn-incomplete-record-updates", Opt_WarnIncompletePatternsRecUpd ), - ( "warn-missing-fields", Opt_WarnMissingFields ), - ( "warn-missing-methods", Opt_WarnMissingMethods ), - ( "warn-missing-signatures", Opt_WarnMissingSigs ), - ( "warn-name-shadowing", Opt_WarnNameShadowing ), - ( "warn-overlapping-patterns", Opt_WarnOverlappingPatterns ), - ( "warn-simple-patterns", Opt_WarnSimplePatterns ), - ( "warn-type-defaults", Opt_WarnTypeDefaults ), - ( "warn-unused-binds", Opt_WarnUnusedBinds ), - ( "warn-unused-imports", Opt_WarnUnusedImports ), - ( "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 - ( "parr", Opt_PArr ), - ( "th", Opt_TH ), - ( "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 ), - ( "allow-incoherent-instances", Opt_AllowIncoherentInstances ), - ( "generics", Opt_Generics ), - ( "strictness", Opt_Strictness ), - ( "full-laziness", Opt_FullLaziness ), - ( "cse", Opt_CSE ), - ( "ignore-interface-pragmas", Opt_IgnoreInterfacePragmas ), - ( "omit-interface-pragmas", Opt_OmitInterfacePragmas ), - ( "do-lambda-eta-expansion", Opt_DoLambdaEtaExpansion ), - ( "ignore-asserts", Opt_IgnoreAsserts ), + ( "warn-dodgy-imports", Opt_WarnDodgyImports ), + ( "warn-duplicate-exports", Opt_WarnDuplicateExports ), + ( "warn-hi-shadowing", Opt_WarnHiShadows ), + ( "warn-implicit-prelude", Opt_WarnImplicitPrelude ), + ( "warn-incomplete-patterns", Opt_WarnIncompletePatterns ), + ( "warn-incomplete-record-updates", Opt_WarnIncompletePatternsRecUpd ), + ( "warn-missing-fields", Opt_WarnMissingFields ), + ( "warn-missing-methods", Opt_WarnMissingMethods ), + ( "warn-missing-signatures", Opt_WarnMissingSigs ), + ( "warn-name-shadowing", Opt_WarnNameShadowing ), + ( "warn-overlapping-patterns", Opt_WarnOverlappingPatterns ), + ( "warn-simple-patterns", Opt_WarnSimplePatterns ), + ( "warn-type-defaults", Opt_WarnTypeDefaults ), + ( "warn-monomorphism-restriction", Opt_WarnMonomorphism ), + ( "warn-unused-binds", Opt_WarnUnusedBinds ), + ( "warn-unused-imports", Opt_WarnUnusedImports ), + ( "warn-unused-matches", Opt_WarnUnusedMatches ), + ( "warn-deprecations", Opt_WarnDeprecations ), + ( "warn-orphans", Opt_WarnOrphans ), + ( "warn-tabs", Opt_WarnTabs ), + ( "print-explicit-foralls", Opt_PrintExplicitForalls ), + ( "strictness", Opt_Strictness ), + ( "full-laziness", Opt_FullLaziness ), + ( "liberate-case", Opt_LiberateCase ), + ( "spec-constr", Opt_SpecConstr ), + ( "cse", Opt_CSE ), + ( "ignore-interface-pragmas", Opt_IgnoreInterfacePragmas ), + ( "omit-interface-pragmas", Opt_OmitInterfacePragmas ), + ( "do-lambda-eta-expansion", Opt_DoLambdaEtaExpansion ), + ( "ignore-asserts", Opt_IgnoreAsserts ), ( "ignore-breakpoints", Opt_IgnoreBreakpoints), - ( "do-eta-reduction", Opt_DoEtaReduction ), - ( "case-merge", Opt_CaseMerge ), - ( "unbox-strict-fields", Opt_UnboxStrictFields ), - ( "dicts-cheap", Opt_DictsCheap ), - ( "excess-precision", Opt_ExcessPrecision ), - ( "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 ) + ( "do-eta-reduction", Opt_DoEtaReduction ), + ( "case-merge", Opt_CaseMerge ), + ( "unbox-strict-fields", Opt_UnboxStrictFields ), + ( "dicts-cheap", Opt_DictsCheap ), + ( "excess-precision", Opt_ExcessPrecision ), + ( "asm-mangling", Opt_DoAsmMangling ), + ( "print-bind-result", Opt_PrintBindResult ), + ( "force-recomp", Opt_ForceRecomp ), + ( "hpc-no-auto", Opt_Hpc_No_Auto ), + ( "rewrite-rules", Opt_RewriteRules ), + ( "break-on-exception", Opt_BreakOnException ), + ( "vectorise", Opt_Vectorise ), + ( "regs-graph", Opt_RegsGraph), + -- Deprecated in favour of -XTemplateHaskell: + ( "th", Opt_TemplateHaskell ), + -- Deprecated in favour of -XForeignFunctionInterface: + ( "fi", Opt_ForeignFunctionInterface ), + -- Deprecated in favour of -XForeignFunctionInterface: + ( "ffi", Opt_ForeignFunctionInterface ), + -- Deprecated in favour of -XArrows: + ( "arrows", Opt_Arrows ), + -- Deprecated in favour of -XGenerics: + ( "generics", Opt_Generics ), + -- Deprecated in favour of -XImplicitPrelude: + ( "implicit-prelude", Opt_ImplicitPrelude ), + -- Deprecated in favour of -XBangPatterns: + ( "bang-patterns", Opt_BangPatterns ), + -- Deprecated in favour of -XMonomorphismRestriction: + ( "monomorphism-restriction", Opt_MonomorphismRestriction ), + -- Deprecated in favour of -XMonoPatBinds: + ( "mono-pat-binds", Opt_MonoPatBinds ), + -- Deprecated in favour of -XExtendedDefaultRules: + ( "extended-default-rules", Opt_ExtendedDefaultRules ), + -- Deprecated in favour of -XImplicitParams: + ( "implicit-params", Opt_ImplicitParams ), + -- Deprecated in favour of -XScopedTypeVariables: + ( "scoped-type-variables", Opt_ScopedTypeVariables ), + -- Deprecated in favour of -XPArr: + ( "parr", Opt_PArr ), + -- Deprecated in favour of -XOverlappingInstances: + ( "allow-overlapping-instances", Opt_OverlappingInstances ), + -- Deprecated in favour of -XUndecidableInstances: + ( "allow-undecidable-instances", Opt_UndecidableInstances ), + -- Deprecated in favour of -XIncoherentInstances: + ( "allow-incoherent-instances", Opt_IncoherentInstances ), + ( "gen-manifest", Opt_GenManifest ), + ( "embed-manifest", Opt_EmbedManifest ) ] +supportedLanguages :: [String] +supportedLanguages = map fst xFlags + +-- These -X flags can all be reversed with -XNo +xFlags :: [(String, DynFlag)] +xFlags = [ + ( "CPP", Opt_Cpp ), + ( "PatternGuards", Opt_PatternGuards ), + ( "UnicodeSyntax", Opt_UnicodeSyntax ), + ( "MagicHash", Opt_MagicHash ), + ( "PolymorphicComponents", Opt_PolymorphicComponents ), + ( "ExistentialQuantification", Opt_ExistentialQuantification ), + ( "KindSignatures", Opt_KindSignatures ), + ( "PatternSignatures", Opt_PatternSignatures ), + ( "EmptyDataDecls", Opt_EmptyDataDecls ), + ( "ParallelListComp", Opt_ParallelListComp ), + ( "ForeignFunctionInterface", Opt_ForeignFunctionInterface ), + ( "UnliftedFFITypes", Opt_UnliftedFFITypes ), + ( "PartiallyAppliedClosedTypeSynonyms", + Opt_PartiallyAppliedClosedTypeSynonyms ), + ( "Rank2Types", Opt_Rank2Types ), + ( "RankNTypes", Opt_RankNTypes ), + ( "TypeOperators", Opt_TypeOperators ), + ( "RecursiveDo", Opt_RecursiveDo ), + ( "Arrows", Opt_Arrows ), + ( "PArr", Opt_PArr ), + ( "TemplateHaskell", Opt_TemplateHaskell ), + ( "Generics", Opt_Generics ), + -- On by default: + ( "ImplicitPrelude", Opt_ImplicitPrelude ), + ( "RecordWildCards", Opt_RecordWildCards ), + ( "RecordPuns", Opt_RecordPuns ), + ( "DisambiguateRecordFields", Opt_DisambiguateRecordFields ), + ( "OverloadedStrings", Opt_OverloadedStrings ), + ( "GADTs", Opt_GADTs ), + ( "TypeFamilies", Opt_TypeFamilies ), + ( "BangPatterns", Opt_BangPatterns ), + -- On by default: + ( "MonomorphismRestriction", Opt_MonomorphismRestriction ), + -- On by default (which is not strictly H98): + ( "MonoPatBinds", Opt_MonoPatBinds ), + ( "RelaxedPolyRec", Opt_RelaxedPolyRec), + ( "ExtendedDefaultRules", Opt_ExtendedDefaultRules ), + ( "ImplicitParams", Opt_ImplicitParams ), + ( "ScopedTypeVariables", Opt_ScopedTypeVariables ), + ( "UnboxedTuples", Opt_UnboxedTuples ), + ( "StandaloneDeriving", Opt_StandaloneDeriving ), + ( "DeriveDataTypeable", Opt_DeriveDataTypeable ), + ( "TypeSynonymInstances", Opt_TypeSynonymInstances ), + ( "FlexibleContexts", Opt_FlexibleContexts ), + ( "FlexibleInstances", Opt_FlexibleInstances ), + ( "ConstrainedClassMethods", Opt_ConstrainedClassMethods ), + ( "MultiParamTypeClasses", Opt_MultiParamTypeClasses ), + ( "FunctionalDependencies", Opt_FunctionalDependencies ), + ( "GeneralizedNewtypeDeriving", Opt_GeneralizedNewtypeDeriving ), + ( "OverlappingInstances", Opt_OverlappingInstances ), + ( "UndecidableInstances", Opt_UndecidableInstances ), + ( "IncoherentInstances", Opt_IncoherentInstances ) + ] -glasgowExtsFlags = [ - Opt_GlasgowExts, - Opt_FFI, - Opt_ImplicitParams, - Opt_ScopedTypeVariables, - Opt_IndexedTypes ] +impliedFlags :: [(DynFlag, [DynFlag])] +impliedFlags = [ + ( Opt_GADTs, [Opt_RelaxedPolyRec] ) -- We want type-sig variables to be completely rigid for GADTs + ] -isFFlag f = f `elem` (map fst fFlags) -getFFlag f = fromJust (lookup f fFlags) +glasgowExtsFlags = [ + Opt_PrintExplicitForalls + , Opt_ForeignFunctionInterface + , Opt_UnliftedFFITypes + , Opt_GADTs + , Opt_ImplicitParams + , Opt_ScopedTypeVariables + , Opt_UnboxedTuples + , Opt_TypeSynonymInstances + , Opt_StandaloneDeriving + , Opt_DeriveDataTypeable + , Opt_FlexibleContexts + , Opt_FlexibleInstances + , Opt_ConstrainedClassMethods + , Opt_MultiParamTypeClasses + , Opt_FunctionalDependencies + , Opt_MagicHash + , Opt_PolymorphicComponents + , Opt_ExistentialQuantification + , Opt_UnicodeSyntax + , Opt_PatternGuards + , Opt_PartiallyAppliedClosedTypeSynonyms + , Opt_RankNTypes + , Opt_TypeOperators + , Opt_RecursiveDo + , Opt_ParallelListComp + , Opt_EmptyDataDecls + , Opt_KindSignatures + , Opt_PatternSignatures + , Opt_GeneralizedNewtypeDeriving + , Opt_TypeFamilies ] + +------------------ +isFlag :: [(String,a)] -> String -> Bool +isFlag flags f = any (\(ff,_) -> ff == f) flags + +isPrefFlag :: String -> [(String,a)] -> String -> Bool +isPrefFlag pref flags no_f + | Just f <- maybePrefixMatch pref no_f = isFlag flags f + | otherwise = False + +------------------ +getFlag :: [(String,a)] -> String -> a +getFlag flags f = case [ opt | (ff, opt) <- flags, ff == f] of + (o:os) -> o + [] -> panic ("get_flag " ++ f) + +getPrefFlag :: String -> [(String,a)] -> String -> a +getPrefFlag pref flags f = getFlag flags (fromJust (maybePrefixMatch pref f)) +-- We should only be passed flags which match the prefix -- ----------------------------------------------------------------------------- -- Parsing the dynamic flags. @@ -1105,10 +1348,18 @@ upd f = do dfs <- getCmdLineState putCmdLineState $! (f dfs) +-------------------------- setDynFlag, unSetDynFlag :: DynFlag -> DynP () -setDynFlag f = upd (\dfs -> dopt_set dfs f) +setDynFlag f = upd (\dfs -> foldl dopt_set (dopt_set dfs f) deps) + where + deps = [ d | (f', ds) <- impliedFlags, f' == f, d <- ds ] + -- When you set f, set the ones it implies + -- When you un-set f, however, we don't un-set the things it implies + -- (except for -fno-glasgow-exts, which is treated specially) + unSetDynFlag f = upd (\dfs -> dopt_unset dfs f) +-------------------------- setDumpFlag :: DynFlag -> OptKind DynP setDumpFlag dump_flag = NoArg (setDynFlag Opt_ForceRecomp >> setDynFlag dump_flag) @@ -1137,12 +1388,23 @@ setPackageName p 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 } - _ -> dfs) +-- If we're linking a binary, then only targets that produce object +-- code are allowed (requests for other target types are ignored). +setTarget l = upd set + where + set dfs + | ghcLink dfs /= LinkBinary || isObjectTarget l = dfs{ hscTarget = l } + | otherwise = dfs + +-- Changes the target only if we're compiling object code. This is +-- used by -fasm and -fvia-C, which switch from one to the other, but +-- not from bytecode to object-code. The idea is that -fasm/-fvia-C +-- can be safely used in an OPTIONS_GHC pragma. +setObjTarget l = upd set + where + set dfs + | isObjectTarget (hscTarget dfs) = dfs { hscTarget = l } + | otherwise = dfs setOptLevel :: Int -> DynFlags -> DynFlags setOptLevel n dflags @@ -1283,6 +1545,18 @@ setOptHpcDir arg = upd $ \ d -> d{hpcDir = arg} ----------------------------------------------------------------------------- -- Via-C compilation stuff +-- There are some options that we need to pass to gcc when compiling +-- Haskell code via C, but are only supported by recent versions of +-- gcc. The configure script decides which of these options we need, +-- and puts them in the file "extra-gcc-opts" in $topdir, which is +-- read before each via-C compilation. The advantage of having these +-- in a separate file is that the file can be created at install-time +-- depending on the available gcc version, and even re-generated later +-- if gcc is upgraded. +-- +-- The options below are not dependent on the version of gcc, only the +-- platform. + machdepCCOpts :: DynFlags -> ([String], -- flags for all C compilations [String]) -- for registerised HC compilations machdepCCOpts dflags @@ -1322,23 +1596,9 @@ machdepCCOpts dflags sta = opt_Static in ( [ if sta then "-DDONT_WANT_WIN32_DLL_SUPPORT" else "" --- , if suffixMatch "mingw32" cTARGETPLATFORM then "-mno-cygwin" else "" +-- , if "mingw32" `isSuffixOf` cTARGETPLATFORM then "-mno-cygwin" else "" ], [ "-fno-defer-pop", -#ifdef HAVE_GCC_MNO_OMIT_LFPTR - -- Some gccs are configured with - -- -momit-leaf-frame-pointer on by default, and it - -- apparently takes precedence over - -- -fomit-frame-pointer, so we disable it first here. - "-mno-omit-leaf-frame-pointer", -#endif -#ifdef HAVE_GCC_HAS_NO_UNIT_AT_A_TIME - "-fno-unit-at-a-time", - -- unit-at-a-time doesn't do us any good, and screws - -- up -split-objs by moving the split markers around. - -- It's only turned on with -O2, but put it here just - -- in case someone uses -optc-O2. -#endif "-fomit-frame-pointer", -- we want -fno-builtin, because when gcc inlines -- built-in functions like memcpy() it tends to @@ -1357,13 +1617,6 @@ machdepCCOpts dflags -- and get in the way of -split-objs. Another option -- would be to throw them away in the mangler, but this -- is easier. -#ifdef HAVE_GCC_HAS_NO_UNIT_AT_A_TIME - "-fno-unit-at-a-time", - -- unit-at-a-time doesn't do us any good, and screws - -- up -split-objs by moving the split markers around. - -- It's only turned on with -O2, but put it here just - -- in case someone uses -optc-O2. -#endif "-fno-builtin" -- calling builtins like strlen() using the FFI can -- cause gcc to run out of regs, so use the external @@ -1398,15 +1651,18 @@ picCCOpts dflags -- in dynamic libraries. | opt_PIC - = ["-fno-common"] + = ["-fno-common", "-D__PIC__"] | otherwise = ["-mdynamic-no-pic"] #elif mingw32_TARGET_OS -- no -fPIC for Windows + | opt_PIC + = ["-D__PIC__"] + | otherwise = [] #else | opt_PIC - = ["-fPIC"] + = ["-fPIC", "-D__PIC__"] | otherwise = [] #endif @@ -1415,18 +1671,24 @@ picCCOpts dflags -- Splitting can_split :: Bool -can_split = -#if defined(i386_TARGET_ARCH) \ - || defined(x86_64_TARGET_ARCH) \ - || defined(alpha_TARGET_ARCH) \ - || defined(hppa_TARGET_ARCH) \ - || defined(m68k_TARGET_ARCH) \ - || defined(mips_TARGET_ARCH) \ - || defined(powerpc_TARGET_ARCH) \ - || defined(rs6000_TARGET_ARCH) \ - || defined(sparc_TARGET_ARCH) - True -#else - False -#endif +can_split = cSplitObjs == "YES" + +-- ----------------------------------------------------------------------------- +-- Compiler Info + +compilerInfo :: [(String, String)] +compilerInfo = [("Project name", cProjectName), + ("Project version", cProjectVersion), + ("Booter version", cBooterVersion), + ("Stage", cStage), + ("Interface file version", cHscIfaceFileVersion), + ("Have interpreter", cGhcWithInterpreter), + ("Object splitting", cSplitObjs), + ("Have native code generator", cGhcWithNativeCodeGen), + ("Support SMP", cGhcWithSMP), + ("Unregisterised", cGhcUnregisterised), + ("Tables next to code", cGhcEnableTablesNextToCode), + ("Win32 DLLs", cEnableWin32DLLs), + ("RTS ways", cGhcRTSWays), + ("Leading underscore", cLeadingUnderscore)]