-----------------------------------------------------------------------------
--- $Id: DriverFlags.hs,v 1.29 2000/12/08 10:26:41 simonmar Exp $
+-- $Id: DriverFlags.hs,v 1.33 2000/12/11 15:26:00 sewardj Exp $
--
-- Driver flags
--
import Directory ( removeFile )
import Exception
import IOExts
+
import IO
+import Maybe
import Monad
import System
import Char
, ( "rdynamic" , NoArg (return ()) ) -- ignored for compat w/ gcc
----- RTS opts ------------------------------------------------------
-#ifdef not_yet
, ( "H" , HasArg (setHeapSize . fromIntegral . decodeSize) )
-#endif
------ Compiler flags -----------------------------------------------
, ( "O2-for-C" , NoArg (writeIORef v_minus_o2_for_C True) )
, ( "fexcess-precision" , NoArg (do writeIORef v_Excess_precision True
add v_Opt_C "-fexcess-precision"))
+ -- Optimisation flags are treated specially, so the normal
+ -- -fno-* pattern below doesn't work. We therefore allow
+ -- certain optimisation passes to be turned off explicitly:
+ , ( "fno-strictness" , NoArg (writeIORef v_Strictness False) )
+ , ( "fno-cpr" , NoArg (writeIORef v_CPR False) )
+ , ( "fno-cse" , NoArg (writeIORef v_CSE False) )
+
-- flags that are "active negatives"
- , ( "fno-implicit-prelude" , PassFlag (add v_Opt_C) )
, ( "fno-prune-tydecls" , PassFlag (add v_Opt_C) )
, ( "fno-prune-instdecls" , PassFlag (add v_Opt_C) )
, ( "fno-pre-inlining" , PassFlag (add v_Opt_C) )
, ( "dstg-lint", NoArg (setDynFlag Opt_DoStgLinting) )
, ( "dusagesp-lint", NoArg (setDynFlag Opt_DoUSPLinting) )
- ------ Warnings ----------------------------------------------------
-
- , ( "fwarn-duplicate-exports", NoArg (setDynFlag Opt_WarnDuplicateExports) )
- , ( "fwarn-hi-shadowing", NoArg (setDynFlag Opt_WarnHiShadows) )
- , ( "fwarn-incomplete-patterns", NoArg (setDynFlag Opt_WarnIncompletePatterns) )
- , ( "fwarn-missing-fields", NoArg (setDynFlag Opt_WarnMissingFields) )
- , ( "fwarn-missing-methods", NoArg (setDynFlag Opt_WarnMissingMethods))
- , ( "fwarn-missing-signatures", NoArg (setDynFlag Opt_WarnMissingSigs) )
- , ( "fwarn-name-shadowing", NoArg (setDynFlag Opt_WarnNameShadowing) )
- , ( "fwarn-overlapping-patterns", NoArg (setDynFlag Opt_WarnOverlappingPatterns ) )
- , ( "fwarn-simple-patterns", NoArg (setDynFlag Opt_WarnSimplePatterns))
- , ( "fwarn-type-defaults", NoArg (setDynFlag Opt_WarnTypeDefaults) )
- , ( "fwarn-unused-binds", NoArg (setDynFlag Opt_WarnUnusedBinds) )
- , ( "fwarn-unused-imports", NoArg (setDynFlag Opt_WarnUnusedImports) )
- , ( "fwarn-unused-matches", NoArg (setDynFlag Opt_WarnUnusedMatches) )
- , ( "fwarn-deprecations", NoArg (setDynFlag Opt_WarnDeprecations) )
-
------ Machine dependant (-m<blah>) stuff ---------------------------
, ( "monly-2-regs", NoArg (updateState (\s -> s{stolen_x86_regs = 2}) ))
------ Compiler flags -----------------------------------------------
- , ( "fasm" , AnySuffix (\_ -> setLang HscAsm) )
-
- , ( "fvia-c" , NoArg (setLang HscC) )
- , ( "fvia-C" , NoArg (setLang HscC) )
-
- , ( "fglasgow-exts", NoArg (setDynFlag Opt_GlasgowExts) )
- , ( "fno-implicit-prelude", NoArg (setDynFlag Opt_NoImplicitPrelude) )
-
- -- Optimisation flags are treated specially, so the normal
- -- -fno-* pattern below doesn't work. We therefore allow
- -- certain optimisation passes to be turned off explicitly:
- , ( "fno-strictness" , NoArg (writeIORef v_Strictness False) )
- , ( "fno-cpr" , NoArg (writeIORef v_CPR False) )
- , ( "fno-cse" , NoArg (writeIORef v_CSE False) )
+ , ( "fasm", AnySuffix (\_ -> setLang HscAsm) )
+ , ( "fvia-c", NoArg (setLang HscC) )
+ , ( "fvia-C", NoArg (setLang HscC) )
- , ( "fallow-overlapping-instances",
- NoArg (setDynFlag Opt_AllowOverlappingInstances) )
+ -- "active negatives"
+ , ( "fno-implicit-prelude", NoArg (setDynFlag Opt_NoImplicitPrelude) )
- , ( "fallow-undecidable-instances",
- NoArg (setDynFlag Opt_AllowUndecidableInstances) )
+ -- the rest of the -f* and -fno-* flags
+ , ( "fno-", PrefixPred (\f -> isFFlag f) (\f -> unSetDynFlag (getFFlag f)) )
+ , ( "f", PrefixPred (\f -> isFFlag f) (\f -> setDynFlag (getFFlag f)) )
+ ]
- , ( "fgenerics", NoArg (setDynFlag Opt_Generics) )
+-- these -f<blah> flags can all be reversed with -fno-<blah>
+
+fFlags = [
+ ( "warn-duplicate-exports", Opt_WarnDuplicateExports ),
+ ( "warn-hi-shadowing", Opt_WarnHiShadows ),
+ ( "warn-incomplete-patterns", Opt_WarnIncompletePatterns ),
+ ( "warn-missing-fields", Opt_WarnMissingFields ),
+ ( "warn-missing-methods", Opt_WarnMissingMethods ),
+ ( "warn-missing-signatures", Opt_WarnMissingSigs ),
+ ( "warn-name-shadowing", Opt_WarnNameShadowing ),
+ ( "warn-overlapping-patterns", Opt_WarnOverlappingPatterns ),
+ ( "warn-simple-patterns", Opt_WarnSimplePatterns ),
+ ( "warn-type-defaults", Opt_WarnTypeDefaults ),
+ ( "warn-unused-binds", Opt_WarnUnusedBinds ),
+ ( "warn-unused-imports", Opt_WarnUnusedImports ),
+ ( "warn-unused-matches", Opt_WarnUnusedMatches ),
+ ( "warn-deprecations", Opt_WarnDeprecations ),
+ ( "glasgow-exts", Opt_GlasgowExts ),
+ ( "allow-overlapping-instances", Opt_AllowOverlappingInstances ),
+ ( "allow-undecidable-instances", Opt_AllowUndecidableInstances ),
+ ( "fgenerics", Opt_Generics ),
+ ( "report-compile", Opt_ReportCompile )
+ ]
- , ( "freport-compile", NoArg (setDynFlag Opt_ReportCompile) )
- ]
+isFFlag f = f `elem` (map fst fFlags)
+getFFlag f = fromJust (lookup f fFlags)
-----------------------------------------------------------------------------
-- convert sizes like "3.5M" into integers
floatOpt ref str
= writeIORef ref (read str :: Double)
-#ifdef not_yet
+#if __GLASGOW_HASKELL__ >= 411
foreign import "setHeapSize" unsafe setHeapSize :: Int -> IO ()
+#else
+setHeapSize :: Int -> IO () -- -H<size> is ignored
+setHeapSize _ = return ()
#endif
-----------------------------------------------------------------------------
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`
- (\_ -> throwDyn (PhaseFailed phase_name (ExitFailure 1)))
- removeFile tmp
-#endif
+ exit_code <- kludgedSystem cmd phase_name
if exit_code /= ExitSuccess
then throwDyn (PhaseFailed phase_name exit_code)
else do when (verb >= 3) (putStr "\n")
return ()
-