[project @ 2001-03-23 16:36:20 by simonmar]
[ghc-hetmet.git] / ghc / compiler / main / DriverState.hs
index a825926..0500b66 100644 (file)
@@ -1,5 +1,5 @@
 -----------------------------------------------------------------------------
--- $Id: DriverState.hs,v 1.18 2000/12/05 12:09:43 sewardj Exp $
+-- $Id: DriverState.hs,v 1.35 2001/03/23 16:36:20 simonmar Exp $
 --
 -- Settings for the driver
 --
@@ -22,81 +22,13 @@ import IOExts
 import TmpFiles        ( newTempName )
 import Directory ( removeFile )
 #endif
+import Panic
 
-import System
-import IO
 import List
 import Char  
 import Monad
 
 -----------------------------------------------------------------------------
--- Driver state
-
--- certain flags can be specified on a per-file basis, in an OPTIONS
--- pragma at the beginning of the source file.  This means that when
--- compiling mulitple files, we have to restore the global option
--- settings before compiling a new file.  
---
--- The DriverState record contains the per-file-mutable state.
-
-data DriverState = DriverState {
-
-       -- are we runing cpp on this file?
-       cpp_flag                :: Bool,
-
-       -- misc
-       stolen_x86_regs         :: Int,
-       cmdline_hc_includes     :: [String],
-
-       -- options for a particular phase
-       opt_L                   :: [String],
-       opt_P                   :: [String],
-       opt_c                   :: [String],
-       opt_a                   :: [String],
-       opt_m                   :: [String]
-   }
-
-initDriverState = DriverState {
-       cpp_flag                = False,
-       stolen_x86_regs         = 4,
-       cmdline_hc_includes     = [],
-       opt_L                   = [],
-       opt_P                   = [],
-       opt_c                   = [],
-       opt_a                   = [],
-       opt_m                   = [],
-   }
-       
--- The driver state is first initialized from the command line options,
--- and then reset to this initial state before each compilation.
--- v_InitDriverState contains the saved initial state, and v_DriverState
--- contains the current state (modified by any OPTIONS pragmas, for example).
---
--- v_InitDriverState may also be modified from the GHCi prompt, using :set.
---
-GLOBAL_VAR(v_InitDriverState, initDriverState, DriverState)
-GLOBAL_VAR(v_Driver_state,    initDriverState, DriverState)
-
-readState :: (DriverState -> a) -> IO a
-readState f = readIORef v_Driver_state >>= return . f
-
-updateState :: (DriverState -> DriverState) -> IO ()
-updateState f = readIORef v_Driver_state >>= writeIORef v_Driver_state . f
-
-addOpt_L     a = updateState (\s -> s{opt_L =  a : opt_L s})
-addOpt_P     a = updateState (\s -> s{opt_P =  a : opt_P s})
-addOpt_c     a = updateState (\s -> s{opt_c =  a : opt_c s})
-addOpt_a     a = updateState (\s -> s{opt_a =  a : opt_a s})
-addOpt_m     a = updateState (\s -> s{opt_m =  a : opt_m s})
-
-addCmdlineHCInclude a = 
-   updateState (\s -> s{cmdline_hc_includes =  a : cmdline_hc_includes s})
-
-       -- we add to the options from the front, so we need to reverse the list
-getOpts :: (DriverState -> [a]) -> IO [a]
-getOpts opts = readState opts >>= return . reverse
-
------------------------------------------------------------------------------
 -- non-configured things
 
 cHaskell1Version = "5" -- i.e., Haskell 98
@@ -126,11 +58,7 @@ 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)
-#if !defined(HAVE_WIN32_DLL_SUPPORT) || defined(DONT_WANT_WIN32_DLL_SUPPORT)
 GLOBAL_VAR(v_Static,                   True,           Bool)
-#else
-GLOBAL_VAR(v_Static,                   False,          Bool)
-#endif
 GLOBAL_VAR(v_NoHsMain,                         False,          Bool)
 GLOBAL_VAR(v_Recomp,                   True,           Bool)
 GLOBAL_VAR(v_Collect_ghc_timing,       False,          Bool)
@@ -187,48 +115,10 @@ osuf_ify f = do
 -----------------------------------------------------------------------------
 -- Hi Files
 
-GLOBAL_VAR(v_ProduceHi,        True,   Bool)
 GLOBAL_VAR(v_Hi_on_stdout,     False,  Bool)
 GLOBAL_VAR(v_Hi_suf,           "hi",   String)
 
 -----------------------------------------------------------------------------
--- Warnings & sanity checking
-
--- Warning packages that are controlled by -W and -Wall.  The 'standard'
--- warnings that you get all the time are
---        
---        -fwarn-overlapping-patterns
---        -fwarn-missing-methods
---        -fwarn-missing-fields
---        -fwarn-deprecations
---        -fwarn-duplicate-exports
--- 
--- these are turned off by -Wnot.
-
-
-standardWarnings  = [ "-fwarn-overlapping-patterns"
-                   , "-fwarn-missing-methods"
-                   , "-fwarn-missing-fields"
-                   , "-fwarn-deprecations"
-                   , "-fwarn-duplicate-exports"
-                   ]
-minusWOpts       = standardWarnings ++ 
-                   [ "-fwarn-unused-binds"
-                   , "-fwarn-unused-matches"
-                   , "-fwarn-incomplete-patterns"
-                   , "-fwarn-unused-imports"
-                   ]
-minusWallOpts    = minusWOpts ++
-                   [ "-fwarn-type-defaults"
-                   , "-fwarn-name-shadowing"
-                   , "-fwarn-missing-signatures"
-                   , "-fwarn-hi-shadowing"
-                   ]
-
-data WarningState = W_default | W_ | W_all | W_not
-GLOBAL_VAR(v_Warning_opt, W_default, WarningState)
-
------------------------------------------------------------------------------
 -- Compiler optimisation options
 
 GLOBAL_VAR(v_OptLevel, 0, Int)
@@ -249,24 +139,32 @@ GLOBAL_VAR(v_Strictness,                  True,  Bool)
 GLOBAL_VAR(v_CPR,                      True,  Bool)
 GLOBAL_VAR(v_CSE,                      True,  Bool)
 
-hsc_minusO2_flags = hsc_minusO_flags   -- for now
-
+-- these are the static flags you get without -O.
 hsc_minusNoO_flags =
        [ 
        "-fignore-interface-pragmas",
-       "-fomit-interface-pragmas"
+       "-fomit-interface-pragmas",
+       "-fdo-lambda-eta-expansion",    -- 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.
+       "-flet-no-escape"
        ]
 
+-- these are the static flags you get when -O is on.
 hsc_minusO_flags =
   [ 
+       "-fignore-asserts",
        "-ffoldr-build-on",
         "-fdo-eta-reduction",
        "-fdo-lambda-eta-expansion",
-       "-fcase-of-case",
        "-fcase-merge",
-       "-flet-to-case"
+       "-flet-to-case",
+       "-flet-no-escape"
    ]
 
+hsc_minusO2_flags = hsc_minusO_flags   -- for now
+
 getStaticOptimisationFlags 0 = hsc_minusNoO_flags
 getStaticOptimisationFlags 1 = hsc_minusO_flags
 getStaticOptimisationFlags n = hsc_minusO2_flags
@@ -287,7 +185,7 @@ buildCoreToDo = do
        ])
       ]
 
-    else {- level >= 1 -} return [ 
+    else {- opt_level >= 1 -} return [ 
 
        -- initial simplify: mk specialiser happy: minimum effort please
        CoreDoSimplify (isAmongSimpl [
@@ -359,6 +257,7 @@ buildCoreToDo = do
                -- catch it.  For the record, the redex is 
                --        f_el22 (f_el21 r_midblock)
 
+
 -- Leave out lambda lifting for now
 --       "-fsimplify", -- Tidy up results of full laziness
 --         "[", 
@@ -368,12 +267,8 @@ buildCoreToDo = do
 
        -- We want CSE to follow the final full-laziness pass, because it may
        -- succeed in commoning up things floated out by full laziness.
-       --
-       -- CSE must immediately follow a simplification pass, because it relies
-       -- on the no-shadowing invariant.  See comments at the top of CSE.lhs
-       -- So it must NOT follow float-inwards, which can give rise to shadowing,
-       -- even if its input doesn't have shadows.  Hence putting it between
-       -- the two passes.
+       -- CSE used to rely on the no-shadowing invariant, but it doesn't any more
+
        if cse then CoreCSE else CoreDoNothing,
 
        CoreDoFloatInwards,
@@ -381,11 +276,14 @@ buildCoreToDo = do
 -- Case-liberation for -O2.  This should be after
 -- strictness analysis and the simplification which follows it.
 
---       ( ($OptLevel != 2)
---       ? ""
---       : "-fliberate-case -fsimplify [ $Oopt_FB_Support -ffloat-lets-exposing-whnf -ffloat-primops-ok -fcase-of-case -fdo-case-elim -fcase-merge -fdo-lambda-eta-expansion -freuse-con -flet-to-case $Oopt_PedanticBottoms $Oopt_MaxSimplifierIterations $Oopt_ShowSimplifierProgress ]" ),
---
---       "-fliberate-case",
+       if opt_level >= 2 then
+          CoreLiberateCase
+       else
+          CoreDoNothing,
+       if opt_level >= 2 then
+          CoreDoSpecConstr
+       else
+          CoreDoNothing,
 
        -- Final clean-up simplification:
        CoreDoSimplify (isAmongSimpl [
@@ -424,6 +322,8 @@ addToDirList ref path
   = do paths <- readIORef ref
        writeIORef ref (paths ++ split split_marker path)
 
+GLOBAL_VAR(v_HCHeader, "", String)
+
 -----------------------------------------------------------------------------
 -- Packages
 
@@ -489,19 +389,19 @@ 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
@@ -607,20 +507,47 @@ way_details =
        , "-fvia-C" ]),
 
     (WayUnreg, Way  "u" "Unregisterised" 
-       [ "-optc-DNO_REGS"
-       , "-optc-DUSE_MINIINTERPRETER"
-       , "-fno-asm-mangling"
-       , "-funregisterised"
-       , "-fvia-C" ]),
+       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"
@@ -653,6 +580,13 @@ way_details =
     (WayUser_B,  Way  "B"  "User way 'B'"  ["$WAY_B_REAL_OPTS"]) 
   ]
 
+unregFlags = 
+   [ "-optc-DNO_REGS"
+   , "-optc-DUSE_MINIINTERPRETER"
+   , "-fno-asm-mangling"
+   , "-funregisterised"
+   , "-fvia-C" ]
+
 -----------------------------------------------------------------------------
 -- Programs for particular phases
 
@@ -663,6 +597,7 @@ 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])
@@ -672,53 +607,3 @@ GLOBAL_VAR(v_Opt_dll,    [], [String])
 
 getStaticOpts :: IORef [String] -> IO [String]
 getStaticOpts ref = readIORef ref >>= return . reverse
-
------------------------------------------------------------------------------
--- Via-C compilation stuff
-
--- flags returned are: ( all C compilations
---                    , registerised HC compilations
---                    )
-
-machdepCCOpts 
-   | prefixMatch "alpha"   cTARGETPLATFORM  
-       = return ( ["-static"], [] )
-
-   | prefixMatch "hppa"    cTARGETPLATFORM  
-        -- ___HPUX_SOURCE, not _HPUX_SOURCE, is #defined if -ansi!
-        -- (very nice, but too bad the HP /usr/include files don't agree.)
-       = return ( ["-static", "-D_HPUX_SOURCE"], [] )
-
-   | prefixMatch "m68k"    cTARGETPLATFORM
-      -- -fno-defer-pop : for the .hc files, we want all the pushing/
-      --    popping of args to routines to be explicit; if we let things
-      --    be deferred 'til after an STGJUMP, imminent death is certain!
-      --
-      -- -fomit-frame-pointer : *don't*
-      --     It's better to have a6 completely tied up being a frame pointer
-      --     rather than let GCC pick random things to do with it.
-      --     (If we want to steal a6, then we would try to do things
-      --     as on iX86, where we *do* steal the frame pointer [%ebp].)
-       = return ( [], ["-fno-defer-pop", "-fno-omit-frame-pointer"] )
-
-   | prefixMatch "i386"    cTARGETPLATFORM  
-      -- -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.
-       = do n_regs <- readState stolen_x86_regs
-            sta    <- readIORef v_Static
-            return ( [ if sta then "-DDONT_WANT_WIN32_DLL_SUPPORT" else "",
-                        if suffixMatch "mingw32" cTARGETPLATFORM then "-mno-cygwin" else "" ],
-                     [ "-fno-defer-pop", "-fomit-frame-pointer",
-                       "-DSTOLEN_X86_REGS="++show n_regs ]
-                   )
-
-   | prefixMatch "mips"    cTARGETPLATFORM
-       = return ( ["static"], [] )
-
-   | prefixMatch "powerpc" cTARGETPLATFORM || prefixMatch "rs6000" cTARGETPLATFORM
-       = return ( ["static"], ["-finhibit-size-directive"] )
-
-   | otherwise
-       = return ( [], [] )