Merge branch 'master' of http://darcs.haskell.org/ghc into ghc-generics
authorJose Pedro Magalhaes <jpm@cs.uu.nl>
Mon, 2 May 2011 18:48:10 +0000 (20:48 +0200)
committerJose Pedro Magalhaes <jpm@cs.uu.nl>
Mon, 2 May 2011 18:48:10 +0000 (20:48 +0200)
1  2 
compiler/main/DynFlags.hs

@@@ -60,7 -60,7 +60,7 @@@ module DynFlags 
          supportedLanguagesAndExtensions,
  
          -- ** DynFlag C compiler options
-         machdepCCOpts, picCCOpts,
+         picCCOpts,
  
          -- * Configuration of the stg-to-stg passes
          StgToDo(..),
@@@ -77,9 -77,7 +77,7 @@@
  
  #include "HsVersions.h"
  
- #ifndef OMIT_NATIVE_CODEGEN
  import Platform
- #endif
  import Module
  import PackageConfig
  import PrelNames        ( mAIN )
@@@ -110,7 -108,7 +108,7 @@@ import Data.Cha
  import Data.List
  import Data.Map (Map)
  import qualified Data.Map as Map
- -- import Data.Maybe
+ import Distribution.System
  import System.FilePath
  import System.IO        ( stderr, hPutChar )
  
@@@ -323,7 -321,7 +321,7 @@@ data ExtensionFla
     | Opt_TemplateHaskell
     | Opt_QuasiQuotes
     | Opt_ImplicitParams
 -   | Opt_Generics                     -- "Derivable type classes"
 +   | Opt_Generics                     -- generic deriving mechanism
     | Opt_ImplicitPrelude
     | Opt_ScopedTypeVariables
     | Opt_UnboxedTuples
     | Opt_DeriveFunctor
     | Opt_DeriveTraversable
     | Opt_DeriveFoldable
 +   | Opt_DeriveRepresentable
  
     | Opt_TypeSynonymInstances
     | Opt_FlexibleContexts
@@@ -403,9 -400,7 +401,7 @@@ data DynFlags = DynFlags 
    floatLamArgs          :: Maybe Int,   -- ^ Arg count for lambda floating
                                        --   See CoreMonad.FloatOutSwitches
  
- #ifndef OMIT_NATIVE_CODEGEN
-   targetPlatform      :: Platform,    -- ^ The platform we're compiling for. Used by the NCG.
- #endif
+   targetPlatform        :: Platform.Platform, -- ^ The platform we're compiling for. Used by the NCG.
    cmdlineHcIncludes     :: [String],    -- ^ @\-\#includes@
    importPaths           :: [FilePath],
    mainModIs             :: Module,
@@@ -631,6 -626,14 +627,14 @@@ data HscTarge
    | HscNothing     -- ^ Don't generate any code.  See notes above.
    deriving (Eq, Show)
  
+ showHscTargetFlag :: HscTarget -> String
+ showHscTargetFlag HscC           = "-fvia-c"
+ showHscTargetFlag HscAsm         = "-fasm"
+ showHscTargetFlag HscLlvm        = "-fllvm"
+ showHscTargetFlag HscJava        = panic "No flag for HscJava"
+ showHscTargetFlag HscInterpreted = "-fbyte-code"
+ showHscTargetFlag HscNothing     = "-fno-code"
  -- | Will this target result in an object file on the disk?
  isObjectTarget :: HscTarget -> Bool
  isObjectTarget HscC     = True
@@@ -693,8 -696,9 +697,9 @@@ defaultHscTarget = defaultObjectTarge
  -- object files on the current platform.
  defaultObjectTarget :: HscTarget
  defaultObjectTarget
+   | cGhcUnregisterised    == "YES"      =  HscC
    | cGhcWithNativeCodeGen == "YES"      =  HscAsm
-   | otherwise                           =  HscC
+   | otherwise                           =  HscLlvm
  
  data DynLibLoader
    = Deployable
@@@ -741,9 -745,7 +746,7 @@@ defaultDynFlags mySettings 
          floatLamArgs            = Just 0,     -- Default: float only if no fvs
          strictnessBefore        = [],
  
- #ifndef OMIT_NATIVE_CODEGEN
          targetPlatform          = defaultTargetPlatform,
- #endif
          cmdlineHcIncludes       = [],
          importPaths             = ["."],
          mainModIs               = mAIN,
@@@ -1100,12 -1102,13 +1103,13 @@@ parseDynamicFlags_ dflags0 args pkg_fla
    when (not (null errs)) $ ghcError $ errorsToGhcException errs
  
    let (pic_warns, dflags2)
- #if !(x86_64_TARGET_ARCH && linux_TARGET_OS)
-         | (not opt_Static || opt_PIC) && hscTarget dflags1 == HscLlvm
+         | not (cTargetArch == X86_64 && cTargetOS == Linux) &&
+           (not opt_Static || opt_PIC) &&
+           hscTarget dflags1 == HscLlvm
          = ([L noSrcSpan $ "Warning: -fllvm is incompatible with -fPIC and -"
-                 ++ "dynamic on this platform;\n              ignoring -fllvm"],
-                 dflags1{ hscTarget = HscAsm })
- #endif
+                        ++ "dynamic on this platform;\n"
+                        ++ "         using " ++ showHscTargetFlag defaultObjectTarget ++ " instead"],
+                 dflags1{ hscTarget = defaultObjectTarget })
          | otherwise = ([], dflags1)
  
    return (dflags2, leftover, pic_warns ++ warns)
@@@ -1346,10 -1349,11 +1350,11 @@@ dynamic_flags = 
    , Flag "w"      (NoArg (mapM_ unSetDynFlag minuswRemovesOpts))
  
          ------ Optimisation flags ------------------------------------------
-   , Flag "O"      (noArg (setOptLevel 1))
-   , Flag "Onot"   (noArgDF (setOptLevel 0) "Use -O0 instead")
-   , Flag "Odph"   (noArg setDPHOpt)
-   , Flag "O"      (OptIntSuffix (\mb_n -> upd (setOptLevel (mb_n `orElse` 1))))
+   , Flag "O"      (noArgM (setOptLevel 1))
+   , Flag "Onot"   (noArgM (\dflags -> do deprecate "Use -O0 instead"
+                                          setOptLevel 0 dflags))
+   , Flag "Odph"   (noArgM setDPHOpt)
+   , Flag "O"      (optIntSuffixM (\mb_n -> setOptLevel (mb_n `orElse` 1)))
                  -- If the number is missing, use 1
  
    , Flag "fsimplifier-phases"          (intSuffix (\n d -> d{ simplPhases = n }))
@@@ -1673,7 -1677,6 +1678,7 @@@ xFlags = 
    ( "DeriveFunctor",                    Opt_DeriveFunctor, nop ),
    ( "DeriveTraversable",                Opt_DeriveTraversable, nop ),
    ( "DeriveFoldable",                   Opt_DeriveFoldable, nop ),
 +  ( "DeriveRepresentable",              Opt_DeriveRepresentable, nop ),
    ( "TypeSynonymInstances",             Opt_TypeSynonymInstances, nop ),
    ( "FlexibleContexts",                 Opt_FlexibleContexts, nop ),
    ( "FlexibleInstances",                Opt_FlexibleInstances, nop ),
@@@ -1854,7 -1857,6 +1859,7 @@@ glasgowExtsFlags = 
             , Opt_DeriveFunctor
             , Opt_DeriveFoldable
             , Opt_DeriveTraversable
 +           , Opt_DeriveRepresentable
             , Opt_FlexibleContexts
             , Opt_FlexibleInstances
             , Opt_ConstrainedClassMethods
@@@ -1907,13 -1909,21 +1912,21 @@@ checkTemplateHaskellOk _ = return (
  type DynP = EwM (CmdLineP DynFlags)
  
  upd :: (DynFlags -> DynFlags) -> DynP ()
- upd f = liftEwM (do { dfs <- getCmdLineState
-                     ; putCmdLineState $! (f dfs) })
+ upd f = liftEwM (do dflags <- getCmdLineState
+                     putCmdLineState $! f dflags)
+ updM :: (DynFlags -> DynP DynFlags) -> DynP ()
+ updM f = do dflags <- liftEwM getCmdLineState
+             dflags' <- f dflags
+             liftEwM $ putCmdLineState $! dflags'
  
  --------------- Constructor functions for OptKind -----------------
  noArg :: (DynFlags -> DynFlags) -> OptKind (CmdLineP DynFlags)
  noArg fn = NoArg (upd fn)
  
+ noArgM :: (DynFlags -> DynP DynFlags) -> OptKind (CmdLineP DynFlags)
+ noArgM fn = NoArg (updM fn)
  noArgDF :: (DynFlags -> DynFlags) -> String -> OptKind (CmdLineP DynFlags)
  noArgDF fn deprec = NoArg (upd fn >> deprecate deprec)
  
@@@ -1927,6 -1937,10 +1940,10 @@@ hasArgDF fn deprec = HasArg (\s -> do 
  intSuffix :: (Int -> DynFlags -> DynFlags) -> OptKind (CmdLineP DynFlags)
  intSuffix fn = IntSuffix (\n -> upd (fn n))
  
+ optIntSuffixM :: (Maybe Int -> DynFlags -> DynP DynFlags)
+               -> OptKind (CmdLineP DynFlags)
+ optIntSuffixM fn = OptIntSuffix (\mi -> updM (fn mi))
  setDumpFlag :: DynFlag -> OptKind (CmdLineP DynFlags)
  setDumpFlag dump_flag = NoArg (setDumpFlag' dump_flag)
  
@@@ -2025,20 -2039,36 +2042,36 @@@ setTarget l = upd se
  -- not from bytecode to object-code.  The idea is that -fasm/-fllvm
  -- can be safely used in an OPTIONS_GHC pragma.
  setObjTarget :: HscTarget -> DynP ()
- setObjTarget l = upd set
+ setObjTarget l = updM set
    where
-    set dfs
-      | isObjectTarget (hscTarget dfs) = dfs { hscTarget = l }
-      | otherwise = dfs
- setOptLevel :: Int -> DynFlags -> DynFlags
+    set dflags
+      | isObjectTarget (hscTarget dflags)
+        = case l of
+          HscC
+           | cGhcUnregisterised /= "YES" ->
+              do addWarn ("Compiler not unregisterised, so ignoring " ++
+                          showHscTargetFlag l)
+                 return dflags
+          HscAsm
+           | cGhcWithNativeCodeGen /= "YES" ->
+              do addWarn ("Compiler has no native codegen, so ignoring " ++
+                          showHscTargetFlag l)
+                 return dflags
+          HscLlvm
+           | cGhcUnregisterised == "YES" ->
+              do addWarn ("Compiler unregisterised, so ignoring " ++
+                          showHscTargetFlag l)
+                 return dflags
+          _ -> return $ dflags { hscTarget = l }
+      | otherwise = return dflags
+ setOptLevel :: Int -> DynFlags -> DynP DynFlags
  setOptLevel n dflags
     | hscTarget dflags == HscInterpreted && n > 0
-         = dflags
-             -- not in IO any more, oh well:
-             -- putStr "warning: -O conflicts with --interactive; -O ignored.\n"
+         = do addWarn "-O conflicts with --interactive; -O ignored."
+              return dflags
     | otherwise
-         = updOptLevel n dflags
+         = return (updOptLevel n dflags)
  
  
  -- -Odph is equivalent to
  --    -fmax-simplifier-iterations20     this is necessary sometimes
  --    -fsimplifier-phases=3             we use an additional simplifier phase for fusion
  --
- setDPHOpt :: DynFlags -> DynFlags
+ setDPHOpt :: DynFlags -> DynP DynFlags
  setDPHOpt dflags = setOptLevel 2 (dflags { maxSimplIterations  = 20
                                           , simplPhases         = 3
                                           })
@@@ -2203,37 -2233,6 +2236,6 @@@ setOptHpcDir arg  = upd $ \ d -> d{hpcD
  -- The options below are not dependent on the version of gcc, only the
  -- platform.
  
- machdepCCOpts :: DynFlags -> [String] -- flags for all C compilations
- machdepCCOpts _ = cCcOpts ++ machdepCCOpts'
- machdepCCOpts' :: [String] -- flags for all C compilations
- machdepCCOpts'
- #if alpha_TARGET_ARCH
-         =       ["-w", "-mieee"
- #ifdef HAVE_THREADED_RTS_SUPPORT
-                     , "-D_REENTRANT"
- #endif
-                    ]
-         -- 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.
- #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.)
-         = ["-D_HPUX_SOURCE"]
- #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
-       --   the fp (%ebp) for our register maps.
-         =  if opt_Static then ["-DDONT_WANT_WIN32_DLL_SUPPORT"] else []
- #else
-         = []
- #endif
  picCCOpts :: DynFlags -> [String]
  picCCOpts _dflags
  #if darwin_TARGET_OS
@@@ -2303,7 -2302,6 +2305,6 @@@ compilerInfo dflag
         ("Debug on",                    show debugIsOn),
         ("LibDir",                      topDir dflags),
         ("Global Package DB",           systemPackageConfig dflags),
-        ("C compiler flags",            show cCcOpts),
         ("Gcc Linker flags",            show cGccLinkerOpts),
         ("Ld Linker flags",             show cLdLinkerOpts)
        ]