[project @ 2002-01-03 17:09:13 by simonmar]
[ghc-hetmet.git] / ghc / compiler / main / DriverState.hs
index 93c581a..409835e 100644 (file)
@@ -1,5 +1,5 @@
 -----------------------------------------------------------------------------
--- $Id: DriverState.hs,v 1.59 2001/10/01 14:28:37 rrt Exp $
+-- $Id: DriverState.hs,v 1.65 2001/12/15 12:03:08 panne Exp $
 --
 -- Settings for the driver
 --
@@ -48,6 +48,10 @@ data GhcMode
 
 GLOBAL_VAR(v_GhcMode, error "mode not set", GhcMode)
 
+isCompManagerMode DoMake        = True
+isCompManagerMode DoInteractive = True
+isCompManagerMode _             = False
+
 -----------------------------------------------------------------------------
 -- Global compilation flags
 
@@ -60,13 +64,17 @@ v_Hs_source_cpp_opts = global
        ]
 {-# NOINLINE v_Hs_source_cpp_opts #-}
 
+
 -- Keep output from intermediate phases
 GLOBAL_VAR(v_Keep_hi_diffs,            False,          Bool)
 GLOBAL_VAR(v_Keep_hc_files,            False,          Bool)
-GLOBAL_VAR(v_Keep_il_files,            False,          Bool)
 GLOBAL_VAR(v_Keep_s_files,             False,          Bool)
 GLOBAL_VAR(v_Keep_raw_s_files,         False,          Bool)
 GLOBAL_VAR(v_Keep_tmp_files,           False,          Bool)
+#ifdef ILX
+GLOBAL_VAR(v_Keep_il_files,            False,          Bool)
+GLOBAL_VAR(v_Keep_ilx_files,           False,          Bool)
+#endif
 
 -- Misc
 GLOBAL_VAR(v_Scale_sizes_by,           1.0,            Double)
@@ -78,6 +86,9 @@ GLOBAL_VAR(v_Do_asm_mangling,         True,           Bool)
 GLOBAL_VAR(v_Excess_precision,         False,          Bool)
 GLOBAL_VAR(v_Read_DotGHCi,             True,           Bool)
 
+-- Preprocessor flags
+GLOBAL_VAR(v_Hs_source_pp_opts, [], [String])
+
 -----------------------------------------------------------------------------
 -- Splitting object files (for libraries)
 
@@ -148,7 +159,9 @@ GLOBAL_VAR(v_MaxSimplifierIterations,   4,     Int)
 GLOBAL_VAR(v_StgStats,                  False, Bool)
 GLOBAL_VAR(v_UsageSPInf,               False, Bool)  -- Off by default
 GLOBAL_VAR(v_Strictness,               True,  Bool)
+#ifdef DEBUG
 GLOBAL_VAR(v_CPR,                      True,  Bool)
+#endif
 GLOBAL_VAR(v_CSE,                      True,  Bool)
 GLOBAL_VAR(v_RuleCheck,                Nothing,  Maybe String)
 
@@ -188,7 +201,9 @@ buildCoreToDo = do
    max_iter   <- readIORef v_MaxSimplifierIterations
    usageSP    <- readIORef v_UsageSPInf
    strictness <- readIORef v_Strictness
+#ifdef DEBUG
    cpr        <- readIORef v_CPR
+#endif
    cse        <- readIORef v_CSE
    rule_check <- readIORef v_RuleCheck
 
@@ -223,7 +238,7 @@ buildCoreToDo = do
        -- so that overloaded functions have all their dictionary lambdas manifest
        CoreDoSpecialising,
 
-       CoreDoFloatOutwards False{-not full-},
+       CoreDoFloatOutwards (FloatOutSw False False),
        CoreDoFloatInwards,
 
        CoreDoSimplify (SimplPhase 2) [
@@ -264,7 +279,9 @@ buildCoreToDo = do
        ],
        case rule_check of { Just pat -> CoreDoRuleCheck 0 pat; Nothing -> CoreDoNothing },
 
+#ifdef DEBUG
        if cpr        then CoreDoCPResult   else CoreDoNothing,
+#endif
        if strictness then CoreDoStrictness else CoreDoNothing,
        CoreDoWorkerWrapper,
        CoreDoGlomBinds,
@@ -273,7 +290,8 @@ buildCoreToDo = do
           MaxSimplifierIterations max_iter
        ],
 
-       CoreDoFloatOutwards False{-not full-},
+       CoreDoFloatOutwards (FloatOutSw False   -- Not lambdas
+                                       True),  -- Float constants
                -- nofib/spectral/hartel/wang doubles in speed if you
                -- do full laziness late in the day.  It only happens
                -- after fusion and other stuff, so the early pass doesn't
@@ -281,13 +299,6 @@ buildCoreToDo = do
                --        f_el22 (f_el21 r_midblock)
 
 
--- Leave out lambda lifting for now
---       "-fsimplify", -- Tidy up results of full laziness
---         "[", 
---               "-fmax-simplifier-iterations2",
---         "]",
---       "-ffloat-outwards-full",      
-
        -- We want CSE to follow the final full-laziness pass, because it may
        -- succeed in commoning up things floated out by full laziness.
        -- CSE used to rely on the no-shadowing invariant, but it doesn't any more
@@ -345,8 +356,11 @@ addToDirList :: IORef [String] -> String -> IO ()
 addToDirList ref path
   = do paths           <- readIORef ref
        shiny_new_ones  <- splitUp path
-       writeIORef ref (paths ++ shiny_new_ones)
-
+       writeIORef ref (paths ++ filter (not.null) shiny_new_ones)
+               -- empty paths are ignored: there might be a trailing
+               -- ':' in the initial list, for example.  Empty paths can
+               -- cause confusion when they are translated into -I options
+               -- for passing to gcc.
   where
     splitUp ::String -> IO [String]
 #ifdef mingw32_TARGET_OS