Give locations of flag warnings/errors
[ghc-hetmet.git] / compiler / main / DriverPipeline.hs
index a59cf46..7620d07 100644 (file)
@@ -1,3 +1,6 @@
+{-# OPTIONS -fno-cse #-}
+-- -fno-cse is needed for GLOBAL_VAR's to behave properly
+
 -----------------------------------------------------------------------------
 --
 -- GHC Driver
@@ -43,17 +46,16 @@ import StringBuffer ( hGetStringBuffer )
 import BasicTypes      ( SuccessFlag(..) )
 import Maybes          ( expectJust )
 import ParserCoreUtils ( getCoreModuleName )
-import SrcLoc          ( unLoc )
-import SrcLoc          ( Located(..) )
+import SrcLoc
 import FastString
 
-import Control.Exception as Exception
+import Exception
 import Data.IORef      ( readIORef, writeIORef, IORef )
 import GHC.Exts                ( Int(..) )
 import System.Directory
 import System.FilePath
 import System.IO
-import SYSTEM_IO_ERROR as IO
+import System.IO.Error as IO
 import Control.Monad
 import Data.List       ( isSuffixOf )
 import Data.Maybe
@@ -348,7 +350,7 @@ compileFile :: HscEnv -> Phase -> (FilePath, Maybe Phase) -> IO FilePath
 compileFile hsc_env stop_phase (src, mb_phase) = do
    exists <- doesFileExist src
    when (not exists) $ 
-       throwDyn (CmdLineError ("does not exist: " ++ src))
+       ghcError (CmdLineError ("does not exist: " ++ src))
    
    let
         dflags = hsc_dflags hsc_env
@@ -389,7 +391,9 @@ doLink dflags stop_phase o_files
   where
    -- Always link in the haskell98 package for static linking.  Other
    -- packages have to be specified via the -package flag.
-    link_pkgs = [haskell98PackageId]
+    link_pkgs
+     | dopt Opt_AutoLinkPackages dflags = [haskell98PackageId]
+     | otherwise                        = []
 
 
 -- ---------------------------------------------------------------------------
@@ -446,7 +450,7 @@ runPipeline stop_phase hsc_env0 (input_fn, mb_phase) mb_basename output maybe_lo
   -- before B in a normal compilation pipeline.
 
   when (not (start_phase `happensBefore` stop_phase)) $
-       throwDyn (UsageError 
+       ghcError (UsageError 
                    ("cannot compile this file to desired target: "
                       ++ input_fn))
 
@@ -611,12 +615,12 @@ runPhase (Unlit sf) _stop hsc_env _basename _suff input_fn get_output_fn maybe_l
 -- Cpp phase : (a) gets OPTIONS out of file
 --            (b) runs cpp if necessary
 
-runPhase (Cpp sf) _stop hsc_env basename suff input_fn get_output_fn maybe_loc
+runPhase (Cpp sf) _stop hsc_env _basename _suff input_fn get_output_fn maybe_loc
   = do let dflags0 = hsc_dflags hsc_env
        src_opts <- getOptionsFromFile dflags0 input_fn
-       (dflags, unhandled_flags, warns) <- parseDynamicFlags dflags0 (map unLoc src_opts)
+       (dflags, unhandled_flags, warns) <- parseDynamicFlags dflags0 src_opts
        handleFlagWarnings dflags warns
-       checkProcessArgsResult unhandled_flags (basename <.> suff)
+       checkProcessArgsResult unhandled_flags
 
        if not (dopt Opt_Cpp dflags) then
            -- no need to preprocess CPP, just pass input file along
@@ -772,7 +776,7 @@ runPhase (Hsc src_flavour) stop hsc_env basename suff input_fn get_output_fn _ma
                           Nothing       -- No "module i of n" progress info
 
        case mbResult of
-          Nothing -> throwDyn (PhaseFailed "hsc" (ExitFailure 1))
+          Nothing -> ghcError (PhaseFailed "hsc" (ExitFailure 1))
           Just HscNoRecomp
               -> do SysTools.touch dflags' "Touching object file" o_file
                     -- The .o file must have a later modification date
@@ -813,7 +817,7 @@ runPhase Cmm stop hsc_env basename _ input_fn get_output_fn maybe_loc
 
        ok <- hscCmmFile hsc_env' input_fn
 
-       when (not ok) $ throwDyn (PhaseFailed "cmm" (ExitFailure 1))
+       when (not ok) $ ghcError (PhaseFailed "cmm" (ExitFailure 1))
 
        return (next_phase, dflags, maybe_loc, output_fn)
 
@@ -847,7 +851,13 @@ runPhase cc_phase _stop hsc_env _basename _suff input_fn get_output_fn maybe_loc
 
         let verb = getVerbFlag dflags
 
-       pkg_extra_cc_opts <- getPackageExtraCcOpts dflags pkgs
+        -- cc-options are not passed when compiling .hc files.  Our
+        -- hc code doesn't not #include any header files anyway, so these
+        -- options aren't necessary.
+       pkg_extra_cc_opts <-
+          if cc_phase `eqPhase` HCc
+             then return []
+             else getPackageExtraCcOpts dflags pkgs
 
 #ifdef darwin_TARGET_OS
         pkg_framework_paths <- getPackageFrameworkPath dflags pkgs
@@ -1115,7 +1125,7 @@ runPhase_MoveBinary dflags input_fn dep_packages
            pvm_executable_base = "=" ++ input_fn
            pvm_executable = pvm_root ++ "/bin/" ++ pvm_arch ++ "/" ++ pvm_executable_base
         -- nuke old binary; maybe use configur'ed names for cp and rm?
-        Panic.try (removeFile pvm_executable)
+        tryIO (removeFile pvm_executable)
         -- move the newly created binary into PVM land
         copy dflags "copying PVM executable" input_fn pvm_executable
         -- generate a wrapper script for running a parallel prg under PVM
@@ -1347,7 +1357,7 @@ linkBinary dflags o_files dep_packages = do
     -- parallel only: move binary to another dir -- HWL
     success <- runPhase_MoveBinary dflags output_fn dep_packages
     if success then return ()
-               else throwDyn (InstallationError ("cannot move binary"))
+               else ghcError (InstallationError ("cannot move binary"))
 
 
 exeFileName :: DynFlags -> FilePath
@@ -1428,13 +1438,19 @@ linkDynLib dflags o_files dep_packages = do
     let verb = getVerbFlag dflags
     let o_file = outputFile dflags
 
-    pkg_lib_paths <- getPackageLibraryPath dflags dep_packages
+    -- We don't want to link our dynamic libs against the RTS package,
+    -- because the RTS lib comes in several flavours and we want to be
+    -- able to pick the flavour when a binary is linked.
+    pkgs <- getPreloadPackagesAnd dflags dep_packages
+    let pkgs_no_rts = filter ((/= rtsPackageId) . packageConfigId) pkgs
+
+    let pkg_lib_paths = collectLibraryPaths pkgs_no_rts
     let pkg_lib_path_opts = map ("-L"++) pkg_lib_paths
 
     let lib_paths = libraryPaths dflags
     let lib_path_opts = map ("-L"++) lib_paths
 
-    pkg_link_opts <- getPackageLinkOpts dflags dep_packages
+    let pkg_link_opts = collectLinkOpts dflags pkgs_no_rts
 
        -- probably _stub.o files
     extra_ld_inputs <- readIORef v_Ld_inputs