X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Fmain%2FDriverState.hs;h=5723788fbe900be9f19b67e4e64502da29e4514e;hb=7752abc1008b633fdc7a0b9f283ceca40747b609;hp=4b94d287e9eb084a4a85cd62fb63b7195c4810d6;hpb=292c077de7dbe98eb44911648f16e243b40db2ac;p=ghc-hetmet.git diff --git a/ghc/compiler/main/DriverState.hs b/ghc/compiler/main/DriverState.hs index 4b94d28..5723788 100644 --- a/ghc/compiler/main/DriverState.hs +++ b/ghc/compiler/main/DriverState.hs @@ -1,5 +1,5 @@ ----------------------------------------------------------------------------- --- $Id: DriverState.hs,v 1.14 2000/11/16 11:39:37 simonmar Exp $ +-- $Id: DriverState.hs,v 1.20 2000/12/12 14:35:08 simonmar Exp $ -- -- Settings for the driver -- @@ -22,9 +22,8 @@ import IOExts import TmpFiles ( newTempName ) import Directory ( removeFile ) #endif +import Panic -import System -import IO import List import Char import Monad @@ -67,7 +66,15 @@ initDriverState = DriverState { opt_m = [], } -GLOBAL_VAR(v_Driver_state, initDriverState, DriverState) +-- 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 @@ -75,11 +82,11 @@ 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}) +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}) @@ -98,7 +105,6 @@ cHaskell1Version = "5" -- i.e., Haskell 98 -- location of compiler-related files GLOBAL_VAR(v_TopDir, clibdir, String) -GLOBAL_VAR(v_Inplace, False, Bool) -- Cpp-related flags v_Hs_source_cpp_opts = global @@ -109,10 +115,6 @@ v_Hs_source_cpp_opts = global ] {-# NOINLINE v_Hs_source_cpp_opts #-} --- Verbose -GLOBAL_VAR(v_Verbose, False, Bool) -is_verbose = do v <- readIORef v_Verbose; if v then return "-v" else return "" - -- Keep output from intermediate phases GLOBAL_VAR(v_Keep_hi_diffs, False, Bool) GLOBAL_VAR(v_Keep_hc_files, False, Bool) @@ -142,14 +144,14 @@ GLOBAL_VAR(v_Split_prefix, "", String) GLOBAL_VAR(v_N_split_files, 0, Int) can_split :: Bool -can_split = prefixMatch "i386" cTARGETPLATFORM - || prefixMatch "alpha" cTARGETPLATFORM - || prefixMatch "hppa" cTARGETPLATFORM - || prefixMatch "m68k" cTARGETPLATFORM - || prefixMatch "mips" cTARGETPLATFORM +can_split = prefixMatch "i386" cTARGETPLATFORM + || prefixMatch "alpha" cTARGETPLATFORM + || prefixMatch "hppa" cTARGETPLATFORM + || prefixMatch "m68k" cTARGETPLATFORM + || prefixMatch "mips" cTARGETPLATFORM || prefixMatch "powerpc" cTARGETPLATFORM - || prefixMatch "rs6000" cTARGETPLATFORM - || prefixMatch "sparc" cTARGETPLATFORM + || prefixMatch "rs6000" cTARGETPLATFORM + || prefixMatch "sparc" cTARGETPLATFORM ----------------------------------------------------------------------------- -- Compiler output options @@ -264,6 +266,10 @@ hsc_minusO_flags = "-flet-to-case" ] +getStaticOptimisationFlags 0 = hsc_minusNoO_flags +getStaticOptimisationFlags 1 = hsc_minusO_flags +getStaticOptimisationFlags n = hsc_minusO2_flags + buildCoreToDo :: IO [CoreToDo] buildCoreToDo = do opt_level <- readIORef v_OptLevel @@ -280,7 +286,7 @@ buildCoreToDo = do ]) ] - else {- level >= 1 -} return [ + else {- opt_level >= 1 -} return [ -- initial simplify: mk specialiser happy: minimum effort please CoreDoSimplify (isAmongSimpl [ @@ -352,6 +358,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 -- "[", @@ -361,12 +368,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, @@ -374,11 +377,10 @@ 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, -- Final clean-up simplification: CoreDoSimplify (isAmongSimpl [ @@ -520,7 +522,6 @@ GLOBAL_VAR(v_Build_tag, "", String) data WayName = WayProf | WayUnreg - | WayDll | WayTicky | WayPar | WayGran @@ -547,12 +548,10 @@ data WayName GLOBAL_VAR(v_Ways, [] ,[WayName]) --- ToDo: allow WayDll with any other allowed combination - -allowed_combinations = - [ [WayProf,WayUnreg], - [WayProf,WaySMP] -- works??? - ] +allowed_combination way = way `elem` combs + where -- the sub-lists must be ordered according to WayName, + -- because findBuildTag sorts them + combs = [ [WayProf,WayUnreg], [WayProf,WaySMP] ] findBuildTag :: IO [String] -- new options findBuildTag = do @@ -565,7 +564,7 @@ findBuildTag = do writeIORef v_Build_tag (wayTag details) return (wayOpts details) - ws -> if ws `notElem` allowed_combinations + ws -> if not (allowed_combination ws) then throwDyn (OtherError $ "combination not supported: " ++ foldr1 (\a b -> a ++ '/':b) @@ -609,9 +608,6 @@ way_details = , "-funregisterised" , "-fvia-C" ]), - (WayDll, Way "dll" "DLLized" - [ ]), - (WayPar, Way "mp" "Parallel" [ "-fparallel" , "-D__PARALLEL_HASKELL__" @@ -707,7 +703,8 @@ machdepCCOpts -- 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 "" ], + 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 ] ) @@ -720,40 +717,3 @@ machdepCCOpts | otherwise = return ( [], [] ) - - ------------------------------------------------------------------------------ --- Running an external program - -run_something phase_name cmd - = do - verb <- readIORef v_Verbose - when verb $ do - putStr phase_name - putStrLn ":" - putStrLn cmd - hFlush stdout - - -- test for -n flag - n <- readIORef v_Dry_run - unless n $ do - - -- and run it! -#ifndef mingw32_TARGET_OS - exit_code <- system cmd `catchAllIO` - (\_ -> throwDyn (PhaseFailed phase_name (ExitFailure 1))) -#else - tmp <- newTempName "sh" - h <- openFile tmp WriteMode - hPutStrLn h cmd - hClose h - exit_code <- system ("sh - " ++ tmp) `catchAllIO` - (\e -> throwDyn (PhaseFailed phase_name (ExitFailure 1))) - removeFile tmp -#endif - - if exit_code /= ExitSuccess - then throwDyn (PhaseFailed phase_name exit_code) - else do when verb (putStr "\n") - return () -