[project @ 2001-06-13 15:50:25 by rrt]
[ghc-hetmet.git] / ghc / compiler / main / DriverFlags.hs
index fa1fa47..50692f0 100644 (file)
@@ -1,7 +1,7 @@
 {-# OPTIONS -#include "hschooks.h" #-}
 
 -----------------------------------------------------------------------------
--- $Id: DriverFlags.hs,v 1.40 2001/01/19 15:26:37 simonmar Exp $
+-- $Id: DriverFlags.hs,v 1.57 2001/06/13 15:50:25 rrt Exp $
 --
 -- Driver flags
 --
@@ -9,11 +9,17 @@
 --
 -----------------------------------------------------------------------------
 
-module DriverFlags where
+module DriverFlags ( 
+       processArgs, OptKind(..), static_flags, dynamic_flags, 
+       v_InitDynFlags, v_DynFlags, getDynFlags, dynFlag, 
+       getOpts, getVerbFlag, addCmdlineHCInclude,
+       buildStaticHscOpts, 
+       runSomething,
+       machdepCCOpts
+  ) where
 
 #include "HsVersions.h"
 
-import PackageMaintenance
 import DriverState
 import DriverUtil
 import TmpFiles        ( v_TmpDir )
@@ -38,7 +44,7 @@ import Char
 --
 --     * parse the initial list of flags and remove any flags understood
 --      by the driver only.  Determine whether we're in multi-compilation
---      or single-compilation mode.
+--      or single-compilation mode (done in Main.main).
 --
 --     * gather the list of "static" hsc flags, and assign them to the global
 --      static hsc flags variable.
@@ -180,10 +186,6 @@ static_flags =
   ,  ( "dppr-user-length", AnySuffix (add v_Opt_C) )
       -- rest of the debugging flags are dynamic
 
-       ------- Interface files ---------------------------------------------
-  ,  ( "hi"            , NoArg (writeIORef v_ProduceHi True) )
-  ,  ( "nohi"          , NoArg (writeIORef v_ProduceHi False) )
-
        --------- Profiling --------------------------------------------------
   ,  ( "auto-dicts"    , NoArg (add v_Opt_C "-fauto-sccs-on-dicts") )
   ,  ( "auto-all"      , NoArg (add v_Opt_C "-fauto-sccs-on-all-toplevs") )
@@ -204,11 +206,12 @@ static_flags =
   ,  ( "odir"          , HasArg (writeIORef v_Output_dir  . Just) )
   ,  ( "o"             , SepArg (writeIORef v_Output_file . Just) )
   ,  ( "osuf"          , HasArg (writeIORef v_Object_suf  . Just) )
+  ,  ( "hcsuf"         , HasArg (writeIORef v_HC_suf      . Just) )
   ,  ( "hisuf"         , HasArg (writeIORef v_Hi_suf) )
+  ,  ( "hidir"         , HasArg (writeIORef v_Hi_dir . Just) )
+  ,  ( "buildtag"      , HasArg (writeIORef v_Build_tag) )
   ,  ( "tmpdir"                , HasArg (writeIORef v_TmpDir . (++ "/")) )
-  ,  ( "ohi"           , HasArg (\s -> case s of 
-                                         "-" -> writeIORef v_Hi_on_stdout True
-                                         _   -> writeIORef v_Output_hi (Just s)) )
+  ,  ( "ohi"           , HasArg (writeIORef v_Output_hi   . Just) )
        -- -odump?
 
   ,  ( "keep-hc-file"   , AnySuffix (\_ -> writeIORef v_Keep_hc_files True) )
@@ -238,10 +241,6 @@ static_flags =
   ,  ( "package"        , HasArg (addPackage) )
   ,  ( "syslib"         , HasArg (addPackage) )        -- for compatibility w/ old vsns
 
-  ,  ( "-list-packages"  , NoArg (listPackages) )
-  ,  ( "-add-package"    , NoArg (newPackage) )
-  ,  ( "-delete-package" , SepArg (deletePackage) )
-
         ------- Specific phases  --------------------------------------------
   ,  ( "pgmL"           , HasArg (writeIORef v_Pgm_L) )
   ,  ( "pgmP"           , HasArg (writeIORef v_Pgm_P) )
@@ -255,12 +254,6 @@ static_flags =
   ,  ( "optl"          , HasArg (add v_Opt_l) )
   ,  ( "optdll"                , HasArg (add v_Opt_dll) )
 
-       ------ Warning opts -------------------------------------------------
-  ,  ( "W"             , NoArg (writeIORef v_Warning_opt W_) )
-  ,  ( "Wall"          , NoArg (writeIORef v_Warning_opt W_all) )
-  ,  ( "Wnot"          , NoArg (writeIORef v_Warning_opt W_not) )
-  ,  ( "w"             , NoArg (writeIORef v_Warning_opt W_not) )
-
        ----- Linker --------------------------------------------------------
   ,  ( "static"        , NoArg (writeIORef v_Static True) )
   ,  ( "dynamic"        , NoArg (writeIORef v_Static False) )
@@ -292,11 +285,6 @@ static_flags =
   ,  ( "fno-cpr"          , NoArg (writeIORef v_CPR False) )
   ,  ( "fno-cse"          , NoArg (writeIORef v_CSE False) )
 
-       -- flags that are "active negatives"
-  ,  ( "fno-prune-tydecls"     , PassFlag (add v_Opt_C) )
-  ,  ( "fno-prune-instdecls"   , PassFlag (add v_Opt_C) )
-  ,  ( "fno-pre-inlining"      , PassFlag (add v_Opt_C) )
-
        -- All other "-fno-<blah>" options cancel out "-f<blah>" on the hsc cmdline
   ,  ( "fno-",                 PrefixPred (\s -> isStaticHscFlag ("f"++s))
                                    (\s -> add v_Anti_opt_C ("-f"++s)) )
@@ -331,8 +319,8 @@ getDynFlags = readIORef v_DynFlags
 dynFlag :: (DynFlags -> a) -> IO a
 dynFlag f = do dflags <- readIORef v_DynFlags; return (f dflags)
 
-setDynFlag f   = updDynFlags (\dfs -> dfs{ flags = f : flags dfs })
-unSetDynFlag f = updDynFlags (\dfs -> dfs{ flags = filter (/= f) (flags dfs) })
+setDynFlag f   = updDynFlags (\dfs -> dopt_set dfs f)
+unSetDynFlag f = updDynFlags (\dfs -> dopt_unset dfs f)
 
 addOpt_L     a = updDynFlags (\s -> s{opt_L =  a : opt_L s})
 addOpt_P     a = updDynFlags (\s -> s{opt_P =  a : opt_P s})
@@ -349,11 +337,13 @@ getOpts opts = dynFlag opts >>= return . reverse
 
 -- we can only change HscC to HscAsm and vice-versa with dynamic flags 
 -- (-fvia-C and -fasm).
+-- NB: we can also set the new lang to ILX, via -filx.  I hope this is right
 setLang l = do
    dfs <- readIORef v_DynFlags
    case hscLang dfs of
        HscC   -> writeIORef v_DynFlags dfs{ hscLang = l }
        HscAsm -> writeIORef v_DynFlags dfs{ hscLang = l }
+       HscILX -> writeIORef v_DynFlags dfs{ hscLang = l }
        _      -> return ()
 
 setVerbosityAtLeast n =
@@ -364,7 +354,7 @@ setVerbosityAtLeast n =
 setVerbosity "" = updDynFlags (\dfs -> dfs{ verbosity = 3 })
 setVerbosity n 
   | all isDigit n = updDynFlags (\dfs -> dfs{ verbosity = read n })
-  | otherwise     = throwDyn (OtherError "can't parse verbosity flag (-v<n>)")
+  | otherwise     = throwDyn (UsageError "can't parse verbosity flag (-v<n>)")
 
 getVerbFlag = do
    verb <- dynFlag verbosity
@@ -416,6 +406,7 @@ dynamic_flags = [
   ,  ( "ddump-worker-wrapper",   NoArg (setDynFlag Opt_D_dump_worker_wrapper) )
   ,  ( "dshow-passes",           NoArg (setVerbosity "2") )
   ,  ( "ddump-rn-trace",         NoArg (setDynFlag Opt_D_dump_rn_trace) )
+  ,  ( "ddump-tc-trace",         NoArg (setDynFlag Opt_D_dump_tc_trace) )
   ,  ( "ddump-rn-stats",         NoArg (setDynFlag Opt_D_dump_rn_stats) )
   ,  ( "ddump-stix",             NoArg (setDynFlag Opt_D_dump_stix) )
   ,  ( "ddump-simpl-stats",      NoArg (setDynFlag Opt_D_dump_simpl_stats) )
@@ -436,11 +427,18 @@ dynamic_flags = [
   ,  ( "monly-3-regs",         NoArg (updDynFlags (\s -> s{stolen_x86_regs = 3}) ))
   ,  ( "monly-4-regs",         NoArg (updDynFlags (\s -> s{stolen_x86_regs = 4}) ))
 
+       ------ Warning opts -------------------------------------------------
+  ,  ( "W"             , NoArg (mapM_ setDynFlag   minusWOpts)    )
+  ,  ( "Wall"          , NoArg (mapM_ setDynFlag   minusWallOpts) )
+  ,  ( "Wnot"          , NoArg (mapM_ unSetDynFlag minusWallOpts) ) /* DEPREC */
+  ,  ( "w"             , NoArg (mapM_ unSetDynFlag minusWallOpts) )
+
         ------ Compiler flags -----------------------------------------------
 
   ,  ( "fasm",         AnySuffix (\_ -> setLang HscAsm) )
   ,  ( "fvia-c",       NoArg (setLang HscC) )
   ,  ( "fvia-C",       NoArg (setLang HscC) )
+  ,  ( "filx",         NoArg (setLang HscILX) )
 
        -- "active negatives"
   ,  ( "fno-implicit-prelude",  NoArg (setDynFlag Opt_NoImplicitPrelude) )
@@ -470,8 +468,7 @@ fFlags = [
   ( "glasgow-exts",                    Opt_GlasgowExts ),
   ( "allow-overlapping-instances",     Opt_AllowOverlappingInstances ),
   ( "allow-undecidable-instances",     Opt_AllowUndecidableInstances ),
-  ( "fgenerics",                       Opt_Generics ),
-  ( "report-compile",                  Opt_ReportCompile )
+  ( "generics",                        Opt_Generics )
   ]
 
 isFFlag f = f `elem` (map fst fFlags)
@@ -486,7 +483,7 @@ decodeSize str
   | c == "K" || c == "k" = truncate (n * 1000)
   | c == "M" || c == "m" = truncate (n * 1000 * 1000)
   | c == "G" || c == "g" = truncate (n * 1000 * 1000 * 1000)
-  | otherwise            = throwDyn (OtherError ("can't decode size: " ++ str))
+  | otherwise            = throwDyn (CmdLineError ("can't decode size: " ++ str))
   where (m, c) = span pred str
         n      = read m  :: Double
        pred c = isDigit c || c == '.'
@@ -546,7 +543,7 @@ runSomething phase_name cmd
    unless n $ do 
 
    -- and run it!
-   exit_code <- kludgedSystem cmd phase_name
+   exit_code <- system cmd
 
    if exit_code /= ExitSuccess
        then throwDyn (PhaseFailed phase_name exit_code)