[project @ 2001-06-28 09:57:32 by simonmar]
[ghc-hetmet.git] / ghc / compiler / main / DriverState.hs
index 2471eb0..48e683a 100644 (file)
@@ -1,5 +1,5 @@
 -----------------------------------------------------------------------------
--- $Id: DriverState.hs,v 1.31 2001/03/01 17:07:49 simonpj Exp $
+-- $Id: DriverState.hs,v 1.46 2001/06/27 16:38:17 simonmar Exp $
 --
 -- Settings for the driver
 --
@@ -9,19 +9,17 @@
 
 module DriverState where
 
+#include "../includes/config.h"
 #include "HsVersions.h"
 
-import CmStaticInfo
+import Packages                ( PackageConfig(..) )
 import CmdLineOpts
+import DriverPhases
 import DriverUtil
 import Util
 import Config
 import Exception
 import IOExts
-#ifdef mingw32_TARGET_OS
-import TmpFiles        ( newTempName )
-import Directory ( removeFile )
-#endif
 import Panic
 
 import List
@@ -34,10 +32,21 @@ import Monad
 cHaskell1Version = "5" -- i.e., Haskell 98
 
 -----------------------------------------------------------------------------
--- Global compilation flags
+-- GHC modes of operation
+
+data GhcMode
+  = DoMkDependHS                       -- ghc -M
+  | DoMkDLL                            -- ghc --mk-dll
+  | StopBefore Phase                   -- ghc -E | -C | -S | -c
+  | DoMake                             -- ghc --make
+  | DoInteractive                      -- ghc --interactive
+  | DoLink                             -- [ the default ]
+  deriving (Eq)
 
--- location of compiler-related files
-GLOBAL_VAR(v_TopDir,  clibdir, String)
+GLOBAL_VAR(v_GhcMode, error "mode not set", GhcMode)
+
+-----------------------------------------------------------------------------
+-- Global compilation flags
 
 -- Cpp-related flags
 v_Hs_source_cpp_opts = global
@@ -57,7 +66,6 @@ GLOBAL_VAR(v_Keep_tmp_files,          False,          Bool)
 
 -- Misc
 GLOBAL_VAR(v_Scale_sizes_by,           1.0,            Double)
-GLOBAL_VAR(v_Dry_run,                  False,          Bool)
 GLOBAL_VAR(v_Static,                   True,           Bool)
 GLOBAL_VAR(v_NoHsMain,                         False,          Bool)
 GLOBAL_VAR(v_Recomp,                   True,           Bool)
@@ -69,8 +77,9 @@ GLOBAL_VAR(v_Excess_precision,                False,          Bool)
 -- Splitting object files (for libraries)
 
 GLOBAL_VAR(v_Split_object_files,       False,          Bool)
-GLOBAL_VAR(v_Split_prefix,             "",             String)
-GLOBAL_VAR(v_N_split_files,            0,              Int)
+GLOBAL_VAR(v_Split_info,               ("",0),         (String,Int))
+       -- The split prefix and number of files
+
        
 can_split :: Bool
 can_split =  prefixMatch "i386"    cTARGETPLATFORM
@@ -92,10 +101,14 @@ defaultHscLang
   | otherwise                                  =  HscC
 
 GLOBAL_VAR(v_Output_dir,  Nothing, Maybe String)
-GLOBAL_VAR(v_Object_suf,  Nothing, Maybe String)
 GLOBAL_VAR(v_Output_file, Nothing, Maybe String)
 GLOBAL_VAR(v_Output_hi,   Nothing, Maybe String)
 
+GLOBAL_VAR(v_Object_suf,  Nothing, Maybe String)
+GLOBAL_VAR(v_HC_suf,     Nothing, Maybe String)
+GLOBAL_VAR(v_Hi_dir,      Nothing, Maybe String)
+GLOBAL_VAR(v_Hi_suf,      "hi",           String)
+
 GLOBAL_VAR(v_Ld_inputs,        [],      [String])
 
 odir_ify :: String -> IO String
@@ -113,12 +126,6 @@ osuf_ify f = do
        Just s  -> return (newsuf s f)
 
 -----------------------------------------------------------------------------
--- Hi Files
-
-GLOBAL_VAR(v_Hi_on_stdout,     False,  Bool)
-GLOBAL_VAR(v_Hi_suf,           "hi",   String)
-
------------------------------------------------------------------------------
 -- Compiler optimisation options
 
 GLOBAL_VAR(v_OptLevel, 0, Int)
@@ -281,20 +288,6 @@ buildCoreToDo = do
        else
           CoreDoNothing,
        if opt_level >= 2 then
-               CoreDoSimplify (isAmongSimpl [
-                  MaxSimplifierIterations max_iter
-               -- No -finline-phase: allow all Ids to be inlined now
-               ])
-       else
-         CoreDoNothing,
-               -- Simplify before SpecConstr, because LiberateCase leaves
-               -- case binders the wrong way round. E.g. it leaves it like
-               --      case x of wild { ... f x .... }
-               -- rather than
-               --      case x of wild { ... f wild ... }
-               -- The latter is better because 'wild' has the unfolding for
-               -- x inside it.
-       if opt_level >= 2 then
           CoreDoSpecConstr
        else
           CoreDoNothing,
@@ -336,11 +329,11 @@ addToDirList ref path
   = do paths <- readIORef ref
        writeIORef ref (paths ++ split split_marker path)
 
+GLOBAL_VAR(v_HCHeader, "", String)
+
 -----------------------------------------------------------------------------
 -- Packages
 
-GLOBAL_VAR(v_Path_package_config, error "path_package_config", String)
-
 -- package list is maintained in dependency order
 GLOBAL_VAR(v_Packages, ("std":"rts":"gmp":[]), [String])
 
@@ -348,7 +341,7 @@ addPackage :: String -> IO ()
 addPackage package
   = do pkg_details <- readIORef v_Package_details
        case lookupPkg package pkg_details of
-         Nothing -> throwDyn (OtherError ("unknown package name: " ++ package))
+         Nothing -> throwDyn (CmdLineError ("unknown package name: " ++ package))
          Just details -> do
            ps <- readIORef v_Packages
            unless (package `elem` ps) $ do
@@ -359,7 +352,7 @@ addPackage package
 getPackageImportPath   :: IO [String]
 getPackageImportPath = do
   ps <- getPackageInfo
-  return (nub (concat (map import_dirs ps)))
+  return (nub (filter (not.null) (concatMap import_dirs ps)))
 
 getPackageIncludePath   :: IO [String]
 getPackageIncludePath = do
@@ -375,7 +368,7 @@ getPackageCIncludes = do
 getPackageLibraryPath  :: IO [String]
 getPackageLibraryPath = do
   ps <- getPackageInfo
-  return (nub (concat (map library_dirs ps)))
+  return (nub (filter (not.null) (concatMap library_dirs ps)))
 
 getPackageLibraries    :: IO [String]
 getPackageLibraries = do
@@ -401,23 +394,24 @@ getPackageExtraLdOpts = do
   ps <- getPackageInfo
   return (concatMap extra_ld_opts ps)
 
-getPackageInfo :: IO [Package]
+getPackageInfo :: IO [PackageConfig]
 getPackageInfo = do
   ps <- readIORef v_Packages
   getPackageDetails ps
 
-getPackageDetails :: [String] -> IO [Package]
+getPackageDetails :: [String] -> IO [PackageConfig]
 getPackageDetails ps = do
   pkg_details <- readIORef v_Package_details
   return [ pkg | p <- ps, Just pkg <- [ lookupPkg p pkg_details ] ]
 
-GLOBAL_VAR(v_Package_details, (error "package_details"), [Package])
+GLOBAL_VAR(v_Package_details, (error "package_details"), [PackageConfig])
 
-lookupPkg :: String -> [Package] -> Maybe Package
+lookupPkg :: String -> [PackageConfig] -> Maybe PackageConfig
 lookupPkg nm ps
    = case [p | p <- ps, name p == nm] of
         []    -> Nothing
         (p:_) -> Just p
+
 -----------------------------------------------------------------------------
 -- Ways
 
@@ -474,7 +468,7 @@ findBuildTag :: IO [String]  -- new options
 findBuildTag = do
   way_names <- readIORef v_Ways
   case sort way_names of
-     []  -> do  writeIORef v_Build_tag ""
+     []  -> do  -- writeIORef v_Build_tag ""
                return []
 
      [w] -> do let details = lkupWay w
@@ -482,7 +476,7 @@ findBuildTag = do
               return (wayOpts details)
 
      ws  -> if not (allowed_combination ws)
-               then throwDyn (OtherError $
+               then throwDyn (CmdLineError $
                                "combination not supported: "  ++
                                foldr1 (\a b -> a ++ '/':b) 
                                (map (wayName . lkupWay) ws))
@@ -521,14 +515,45 @@ way_details =
     (WayUnreg, Way  "u" "Unregisterised" 
        unregFlags ),
 
+    -- optl's below to tell linker where to find the PVM library -- HWL
     (WayPar, Way  "mp" "Parallel" 
        [ "-fparallel"
        , "-D__PARALLEL_HASKELL__"
        , "-optc-DPAR"
        , "-package concurrent"
+        , "-optc-w"
+        , "-optl-L${PVM_ROOT}/lib/${PVM_ARCH}"
+        , "-optl-lpvm3"
+        , "-optl-lgpvm3"
+       , "-fvia-C" ]),
+
+    -- at the moment we only change the RTS and could share compiler and libs!
+    (WayPar, Way  "mt" "Parallel ticky profiling" 
+       [ "-fparallel"
+       , "-D__PARALLEL_HASKELL__"
+       , "-optc-DPAR"
+       , "-optc-DPAR_TICKY"
+       , "-package concurrent"
+        , "-optc-w"
+        , "-optl-L${PVM_ROOT}/lib/${PVM_ARCH}"
+        , "-optl-lpvm3"
+        , "-optl-lgpvm3"
        , "-fvia-C" ]),
 
-    (WayGran, Way  "mg" "Gransim" 
+    (WayPar, Way  "md" "Distributed" 
+       [ "-fparallel"
+       , "-D__PARALLEL_HASKELL__"
+       , "-D__DISTRIBUTED_HASKELL__"
+       , "-optc-DPAR"
+       , "-optc-DDIST"
+       , "-package concurrent"
+        , "-optc-w"
+        , "-optl-L${PVM_ROOT}/lib/${PVM_ARCH}"
+        , "-optl-lpvm3"
+        , "-optl-lgpvm3"
+       , "-fvia-C" ]),
+
+    (WayGran, Way  "mg" "GranSim" 
        [ "-fgransim"
        , "-D__GRANSIM__"
        , "-optc-DGRAN"
@@ -571,15 +596,6 @@ unregFlags =
 -----------------------------------------------------------------------------
 -- Programs for particular phases
 
-GLOBAL_VAR(v_Pgm_L,   error "pgm_L", String)
-GLOBAL_VAR(v_Pgm_P,   cRAWCPP,       String)
-GLOBAL_VAR(v_Pgm_c,   cGCC,          String)
-GLOBAL_VAR(v_Pgm_m,   error "pgm_m", String)
-GLOBAL_VAR(v_Pgm_s,   error "pgm_s", String)
-GLOBAL_VAR(v_Pgm_a,   cGCC,          String)
-GLOBAL_VAR(v_Pgm_l,   cGCC,          String)
-GLOBAL_VAR(v_Pgm_dll, cMkDLL,        String)
-
 GLOBAL_VAR(v_Opt_dep,    [], [String])
 GLOBAL_VAR(v_Anti_opt_C, [], [String])
 GLOBAL_VAR(v_Opt_C,      [], [String])