Use -O0 rather than -Onot in compiler/Makefile
[ghc-hetmet.git] / compiler / main / Main.hs
index 4c31fcd..8297323 100644 (file)
@@ -30,13 +30,14 @@ import InteractiveUI        ( interactiveUI, ghciWelcomeMsg )
 
 -- Various other random stuff that we need
 import Config
+import HscTypes
 import Packages                ( dumpPackages )
 import DriverPhases    ( Phase(..), isSourceFilename, anyHsc,
                          startPhase, isHaskellSrcFilename )
 import StaticFlags
 import DynFlags
 import BasicTypes      ( failed )
-import ErrUtils                ( putMsg )
+import ErrUtils
 import FastString
 import Outputable
 import Util
@@ -77,10 +78,10 @@ main =
         mbMinusB | null minusB_args = Nothing
                  | otherwise = Just (drop 2 (last minusB_args))
 
-  argv2 <- parseStaticFlags argv1
+  (argv2, staticFlagWarnings) <- parseStaticFlags argv1
 
   -- 2. Parse the "mode" flags (--make, --interactive etc.)
-  (cli_mode, argv3) <- parseModeFlags argv2
+  (cli_mode, argv3, modeFlagWarnings) <- parseModeFlags argv2
 
   -- If all we want to do is to show the version number then do it
   -- now, before we start a GHC session etc.
@@ -128,7 +129,12 @@ main =
 
        -- The rest of the arguments are "dynamic"
        -- Leftover ones are presumably files
-  (dflags, fileish_args) <- GHC.parseDynamicFlags dflags1 argv3
+  (dflags, fileish_args, dynamicFlagWarnings) <- GHC.parseDynamicFlags dflags1 argv3
+
+  let flagWarnings = staticFlagWarnings
+                  ++ modeFlagWarnings
+                  ++ dynamicFlagWarnings
+  handleFlagWarnings dflags flagWarnings
 
        -- make sure we clean up after ourselves
   GHC.defaultCleanupHandler dflags $ do
@@ -137,7 +143,8 @@ main =
 
   -- we've finished manipulating the DynFlags, update the session
   GHC.setSessionDynFlags session dflags
-  dflags <- GHC.getSessionDynFlags session
+  dflags  <- GHC.getSessionDynFlags session
+  hsc_env <- GHC.sessionHscEnv      session
 
   let
      -- To simplify the handling of filepaths, we normalise all filepaths right 
@@ -172,7 +179,7 @@ main =
     ShowInterface f        -> doShowIface dflags f
     DoMake                 -> doMake session srcs
     DoMkDependHS           -> doMkDependHS session (map fst srcs)
-    StopBefore p           -> oneShot dflags p srcs
+    StopBefore p           -> oneShot hsc_env p srcs
     DoInteractive          -> interactiveUI session srcs Nothing
     DoEval exprs           -> interactiveUI session srcs $ Just $ reverse exprs
 
@@ -353,48 +360,65 @@ isCompManagerMode _             = False
 -- -----------------------------------------------------------------------------
 -- Parsing the mode flag
 
-parseModeFlags :: [String] -> IO (CmdLineMode, [String])
+parseModeFlags :: [String] -> IO (CmdLineMode, [String], [String])
 parseModeFlags args = do
-  let ((leftover, errs), (mode, _, flags)) = 
+  let ((leftover, errs, warns), (mode, _, flags)) = 
         runCmdLine (processArgs mode_flags args) (StopBefore StopLn, "", []) 
   when (not (null errs)) $ do
     throwDyn (UsageError (unlines errs))
-  return (mode, flags ++ leftover)
+  return (mode, flags ++ leftover, warns)
 
-type ModeM a = CmdLineP (CmdLineMode, String, [String]) a
+type ModeM = CmdLineP (CmdLineMode, String, [String])
   -- mode flags sometimes give rise to new DynFlags (eg. -C, see below)
   -- so we collect the new ones and return them.
 
-mode_flags :: [(String, OptKind (CmdLineP (CmdLineMode, String, [String])))]
+mode_flags :: [Flag ModeM]
 mode_flags =
   [  ------- help / version ----------------------------------------------
-     ( "?"                   , PassFlag (setMode ShowUsage))
-  ,  ( "-help"               , PassFlag (setMode ShowUsage))
-  ,  ( "-print-libdir"       , PassFlag (setMode PrintLibdir))
-  ,  ( "V"                   , PassFlag (setMode ShowVersion))
-  ,  ( "-version"            , PassFlag (setMode ShowVersion))
-  ,  ( "-numeric-version"    , PassFlag (setMode ShowNumVersion))
-  ,  ( "-info"               , PassFlag (setMode ShowInfo))
-  ,  ( "-supported-languages", PassFlag (setMode ShowSupportedLanguages))
+    Flag "?"                    (PassFlag (setMode ShowUsage))
+         Supported
+  , Flag "-help"                (PassFlag (setMode ShowUsage))
+         Supported
+  , Flag "-print-libdir"        (PassFlag (setMode PrintLibdir))
+         Supported
+  , Flag "V"                    (PassFlag (setMode ShowVersion))
+         Supported
+  , Flag "-version"             (PassFlag (setMode ShowVersion))
+         Supported
+  , Flag "-numeric-version"     (PassFlag (setMode ShowNumVersion))
+         Supported
+  , Flag "-info"                (PassFlag (setMode ShowInfo))
+         Supported
+  , Flag "-supported-languages" (PassFlag (setMode ShowSupportedLanguages))
+         Supported
 
       ------- interfaces ----------------------------------------------------
-  ,  ( "-show-iface"     , HasArg (\f -> setMode (ShowInterface f)
-                                                 "--show-iface"))
+  , Flag "-show-iface"  (HasArg (\f -> setMode (ShowInterface f)
+                                               "--show-iface"))
+         Supported
 
       ------- primary modes ------------------------------------------------
-  ,  ( "M"              , PassFlag (setMode DoMkDependHS))
-  ,  ( "E"              , PassFlag (setMode (StopBefore anyHsc)))
-  ,  ( "C"              , PassFlag (\f -> do setMode (StopBefore HCc) f
-                                             addFlag "-fvia-C"))
-  ,  ( "S"              , PassFlag (setMode (StopBefore As)))
-  ,  ( "-make"          , PassFlag (setMode DoMake))
-  ,  ( "-interactive"   , PassFlag (setMode DoInteractive))
-  ,  ( "e"              , HasArg   (\s -> updateMode (updateDoEval s) "-e"))
+  , Flag "M"            (PassFlag (setMode DoMkDependHS))
+         Supported
+  , Flag "E"            (PassFlag (setMode (StopBefore anyHsc)))
+         Supported
+  , Flag "C"            (PassFlag (\f -> do setMode (StopBefore HCc) f
+                                            addFlag "-fvia-C"))
+         Supported
+  , Flag "S"            (PassFlag (setMode (StopBefore As)))
+         Supported
+  , Flag "-make"        (PassFlag (setMode DoMake))
+         Supported
+  , Flag "-interactive" (PassFlag (setMode DoInteractive))
+         Supported
+  , Flag "e"            (HasArg   (\s -> updateMode (updateDoEval s) "-e"))
+         Supported
 
        -- -fno-code says to stop after Hsc but don't generate any code.
-  ,  ( "fno-code"       , PassFlag (\f -> do setMode (StopBefore HCc) f
-                                             addFlag "-fno-code"
-                                             addFlag "-no-recomp"))
+  , Flag "fno-code"     (PassFlag (\f -> do setMode (StopBefore HCc) f
+                                            addFlag "-fno-code"
+                                            addFlag "-no-recomp"))
+         Supported
   ]
 
 setMode :: CmdLineMode -> String -> ModeM ()
@@ -431,8 +455,8 @@ doMake sess srcs  = do
        haskellish (_,Just phase) = 
          phase `notElem` [As, Cc, CmmCpp, Cmm, StopLn]
 
-    dflags <- GHC.getSessionDynFlags sess
-    o_files <- mapM (compileFile dflags StopLn) non_hs_srcs
+    hsc_env <- GHC.sessionHscEnv sess
+    o_files <- mapM (compileFile hsc_env StopLn) non_hs_srcs
     mapM_ (consIORef v_Ld_inputs) (reverse o_files)
 
     targets <- mapM (uncurry GHC.guessTarget) hs_srcs