[project @ 2004-10-18 18:24:59 by igloo]
[ghc-hetmet.git] / ghc / compiler / main / DriverFlags.hs
index c6077f7..ac9e92c 100644 (file)
@@ -1,9 +1,8 @@
 -----------------------------------------------------------------------------
--- $Id: DriverFlags.hs,v 1.118 2003/08/08 16:46:51 simonmar Exp $
 --
 -- Driver flags
 --
--- (c) Simon Marlow 2000
+-- (c) The University of Glasgow 2000-2003
 --
 -----------------------------------------------------------------------------
 
@@ -15,7 +14,7 @@ module DriverFlags (
   ) where
 
 #include "HsVersions.h"
-#include "../includes/config.h"
+#include "../includes/ghcconfig.h"
 
 import MkIface         ( showIface )
 import DriverState
@@ -94,7 +93,7 @@ processOneArg action rest (dash_arg@('-':arg):args) =
                if rest /= "" 
                        then fio rest >> return args
                        else case args of
-                               [] -> unknownFlagErr dash_arg
+                               [] -> missingArgErr dash_arg
                                (arg1:args1) -> fio arg1 >> return args1
 
        SepArg fio -> 
@@ -156,9 +155,8 @@ static_flags =
   ,  ( "-help"          , NoArg showGhcUsage)
   ,  ( "-print-libdir"   , NoArg (do getTopDir >>= putStrLn
                                     exitWith ExitSuccess))  
-  ,  ( "-version"       , NoArg (do putStrLn (cProjectName
-                                     ++ ", version " ++ cProjectVersion)
-                                    exitWith ExitSuccess))
+  ,  ( "V"              , NoArg showVersion)
+  ,  ( "-version"       , NoArg showVersion)
   ,  ( "-numeric-version", NoArg (do putStrLn cProjectVersion
                                     exitWith ExitSuccess))
 
@@ -179,6 +177,7 @@ static_flags =
   ,  ( "-make"         , PassFlag (setMode DoMake))
   ,  ( "-interactive"  , PassFlag (setMode DoInteractive))
   ,  ( "-mk-dll"       , PassFlag (setMode DoMkDLL))
+  ,  ( "e"              , HasArg   (\s -> setMode (DoEval s) "-e"))
 
        -- -fno-code says to stop after Hsc but don't generate any code.
   ,  ( "fno-code"      , PassFlag (\f -> do setMode (StopBefore HCc) f
@@ -202,8 +201,11 @@ static_flags =
   ,  ( "smp"           , NoArg (addNoDups v_Ways       WaySMP) )
   ,  ( "debug"         , NoArg (addNoDups v_Ways       WayDebug) )
   ,  ( "ndp"           , NoArg (addNoDups v_Ways       WayNDP) )
+  ,  ( "threaded"      , NoArg (addNoDups v_Ways       WayThreaded) )
        -- ToDo: user ways
 
+       ------ RTS ways -----------------------------------------------------
+
        ------ Debugging ----------------------------------------------------
   ,  ( "dppr-noprags",     PassFlag (add v_Opt_C) )
   ,  ( "dppr-debug",       PassFlag (add v_Opt_C) )
@@ -252,12 +254,11 @@ static_flags =
                                    then do writeIORef v_Split_object_files True
                                            add v_Opt_C "-fglobalise-toplev-names"
                                    else hPutStrLn stderr
-                                           "warning: don't know how to  split \ 
-                                           \object files on this architecture"
+                                           "warning: don't know how to split object files on this architecture"
                                ) )
 
        ------- Include/Import Paths ----------------------------------------
-  ,  ( "i"             , OptPrefix (addToDirList v_Import_paths) )
+  ,  ( "i"             , OptPrefix (addToOrDeleteDirList v_Import_paths) )
   ,  ( "I"             , Prefix    (addToDirList v_Include_paths) )
 
        ------- Libraries ---------------------------------------------------
@@ -280,13 +281,13 @@ static_flags =
         ------- Specific phases  --------------------------------------------
   ,  ( "pgmL"           , HasArg setPgmL )
   ,  ( "pgmP"           , HasArg setPgmP )
-  ,  ( "pgmP"           , HasArg setPgmP )
   ,  ( "pgmF"           , HasArg setPgmF )
   ,  ( "pgmc"           , HasArg setPgmc )
   ,  ( "pgmm"           , HasArg setPgmm )
   ,  ( "pgms"           , HasArg setPgms )
   ,  ( "pgma"           , HasArg setPgma )
   ,  ( "pgml"           , HasArg setPgml )
+  ,  ( "pgmdll"                , HasArg setPgmDLL )
 #ifdef ILX
   ,  ( "pgmI"           , HasArg setPgmI )
   ,  ( "pgmi"           , HasArg setPgmi )
@@ -307,28 +308,11 @@ static_flags =
   ,  ( "Rghc-timing"      , NoArg  (enableTimingStats) )
 
         ------ Compiler flags -----------------------------------------------
-  ,  ( "O2-for-C"         , NoArg (writeIORef v_minus_o2_for_C True) )
-  ,  ( "O"                , NoArg (setOptLevel 1))
-  ,  ( "Onot"             , NoArg (setOptLevel 0))
-  ,  ( "O"                , PrefixPred (all isDigit) (setOptLevel . read))
-
   ,  ( "fno-asm-mangling"  , NoArg (writeIORef v_Do_asm_mangling False) )
 
-  ,  ( "fmax-simplifier-iterations", 
-               PrefixPred (all isDigit) (writeIORef v_MaxSimplifierIterations . read) )
-
-  ,  ( "frule-check", 
-               SepArg (\s -> writeIORef v_RuleCheck (Just s)) )
-
   ,  ( "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-cse"          , NoArg (writeIORef v_CSE False) )
-
        -- 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)) )
@@ -363,7 +347,7 @@ dynamic_flags = [
        ------ Debugging ----------------------------------------------------
   ,  ( "dstg-stats",   NoArg (writeIORef v_StgStats True) )
 
-  ,  ( "ddump-absC",            NoArg (setDynFlag Opt_D_dump_absC) )
+  ,  ( "ddump-cmm",             NoArg (setDynFlag Opt_D_dump_cmm) )
   ,  ( "ddump-asm",             NoArg (setDynFlag Opt_D_dump_asm) )
   ,  ( "ddump-cpranal",         NoArg (setDynFlag Opt_D_dump_cpranal) )
   ,  ( "ddump-deriv",           NoArg (setDynFlag Opt_D_dump_deriv) )
@@ -373,7 +357,6 @@ dynamic_flags = [
   ,  ( "ddump-inlinings",       NoArg (setDynFlag Opt_D_dump_inlinings) )
   ,  ( "ddump-occur-anal",      NoArg (setDynFlag Opt_D_dump_occur_anal) )
   ,  ( "ddump-parsed",          NoArg (setDynFlag Opt_D_dump_parsed) )
-  ,  ( "ddump-realC",           NoArg (setDynFlag Opt_D_dump_realC) )
   ,  ( "ddump-rn",              NoArg (setDynFlag Opt_D_dump_rn) )
   ,  ( "ddump-simpl",           NoArg (setDynFlag Opt_D_dump_simpl) )
   ,  ( "ddump-simpl-iterations", NoArg (setDynFlag Opt_D_dump_simpl_iterations) )
@@ -388,10 +371,11 @@ 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-if-trace",         NoArg (setDynFlag Opt_D_dump_if_trace) )
   ,  ( "ddump-tc-trace",         NoArg (setDynFlag Opt_D_dump_tc_trace) )
   ,  ( "ddump-splices",          NoArg (setDynFlag Opt_D_dump_splices) )
   ,  ( "ddump-rn-stats",         NoArg (setDynFlag Opt_D_dump_rn_stats) )
-  ,  ( "ddump-stix",             NoArg (setDynFlag Opt_D_dump_stix) )
+  ,  ( "ddump-opt-cmm",          NoArg (setDynFlag Opt_D_dump_opt_cmm) )
   ,  ( "ddump-simpl-stats",      NoArg (setDynFlag Opt_D_dump_simpl_stats) )
   ,  ( "ddump-bcos",             NoArg (setDynFlag Opt_D_dump_BCOs) )
   ,  ( "dsource-stats",          NoArg (setDynFlag Opt_D_source_stats) )
@@ -403,6 +387,7 @@ dynamic_flags = [
   ,  ( "ddump-vect",            NoArg (setDynFlag Opt_D_dump_vect) )
   ,  ( "dcore-lint",            NoArg (setDynFlag Opt_DoCoreLinting) )
   ,  ( "dstg-lint",             NoArg (setDynFlag Opt_DoStgLinting) )
+  ,  ( "dcmm-lint",             NoArg (setDynFlag Opt_DoCmmLinting) )
 
        ------ Machine dependant (-m<blah>) stuff ---------------------------
 
@@ -417,6 +402,19 @@ dynamic_flags = [
   ,  ( "Wnot"          , NoArg (mapM_ unSetDynFlag minusWallOpts) ) /* DEPREC */
   ,  ( "w"             , NoArg (mapM_ unSetDynFlag minusWallOpts) )
 
+       ------ Optimisation flags ------------------------------------------
+  ,  ( "O"                , NoArg (setOptLevel 1))
+  ,  ( "Onot"             , NoArg (setOptLevel 0))
+  ,  ( "O"                , PrefixPred (all isDigit) (setOptLevel . read))
+
+  ,  ( "fmax-simplifier-iterations", 
+               PrefixPred (all isDigit) 
+                 (\n -> updDynFlags (\dfs -> 
+                       dfs{ maxSimplIterations = read n })) )
+
+  ,  ( "frule-check", 
+               SepArg (\s -> updDynFlags (\dfs -> dfs{ ruleCheck = Just s })))
+
         ------ Compiler flags -----------------------------------------------
 
   ,  ( "fasm",         AnySuffix (\_ -> setLang HscAsm) )
@@ -424,6 +422,9 @@ dynamic_flags = [
   ,  ( "fvia-C",       NoArg (setLang HscC) )
   ,  ( "filx",         NoArg (setLang HscILX) )
 
+  ,  ( "fglasgow-exts",    NoArg (mapM_ setDynFlag   glasgowExtsFlags) )
+  ,  ( "fno-glasgow-exts", NoArg (mapM_ unSetDynFlag glasgowExtsFlags) )
+
        -- "active negatives"
   ,  ( "fno-implicit-prelude",  NoArg (setDynFlag Opt_NoImplicitPrelude) )
   ,  ( "fno-monomorphism-restriction", 
@@ -440,6 +441,7 @@ fFlags = [
   ( "warn-duplicate-exports",          Opt_WarnDuplicateExports ),
   ( "warn-hi-shadowing",               Opt_WarnHiShadows ),
   ( "warn-incomplete-patterns",        Opt_WarnIncompletePatterns ),
+  ( "warn-incomplete-record-updates",          Opt_WarnIncompletePatternsRecUpd ),
   ( "warn-missing-fields",             Opt_WarnMissingFields ),
   ( "warn-missing-methods",            Opt_WarnMissingMethods ),
   ( "warn-missing-signatures",         Opt_WarnMissingSigs ),
@@ -451,18 +453,30 @@ fFlags = [
   ( "warn-unused-imports",             Opt_WarnUnusedImports ),
   ( "warn-unused-matches",             Opt_WarnUnusedMatches ),
   ( "warn-deprecations",               Opt_WarnDeprecations ),
-  ( "glasgow-exts",                    Opt_GlasgowExts ),
   ( "fi",                              Opt_FFI ),  -- support `-ffi'...
   ( "ffi",                             Opt_FFI ),  -- ...and also `-fffi'
-  ( "with",                            Opt_With ), -- with keyword
   ( "arrows",                          Opt_Arrows ), -- arrow syntax
   ( "parr",                            Opt_PArr ),
+  ( "th",                              Opt_TH ),
+  ( "implicit-params",                 Opt_ImplicitParams ),
   ( "allow-overlapping-instances",     Opt_AllowOverlappingInstances ),
   ( "allow-undecidable-instances",     Opt_AllowUndecidableInstances ),
   ( "allow-incoherent-instances",      Opt_AllowIncoherentInstances ),
-  ( "generics",                        Opt_Generics )
+  ( "generics",                        Opt_Generics ),
+  ( "strictness",                      Opt_Strictness ),
+  ( "full-laziness",                   Opt_FullLaziness ),
+  ( "cse",                             Opt_CSE ),
+  ( "ignore-interface-pragmas",                Opt_IgnoreInterfacePragmas ),
+  ( "omit-interface-pragmas",          Opt_OmitInterfacePragmas ),
+  ( "do-lambda-eta-expansion",         Opt_DoLambdaEtaExpansion ),
+  ( "ignore-asserts",                  Opt_IgnoreAsserts ),
+  ( "do-eta-reduction",                        Opt_DoEtaReduction ),
+  ( "case-merge",                      Opt_CaseMerge ),
+  ( "unbox-strict-fields",             Opt_UnboxStrictFields )
   ]
 
+glasgowExtsFlags = [ Opt_GlasgowExts, Opt_FFI, Opt_TH, Opt_ImplicitParams ]
+
 isFFlag f = f `elem` (map fst fFlags)
 getFFlag f = fromJust (lookup f fFlags)
 
@@ -500,21 +514,10 @@ buildStaticHscOpts = do
 
   opt_C_ <- getStaticOpts v_Opt_C      -- misc hsc opts from the command line
 
-       -- optimisation
-  minus_o <- readIORef v_OptLevel
-  let optimisation_opts = 
-        case minus_o of
-           0 -> hsc_minusNoO_flags
-           1 -> hsc_minusO_flags
-           2 -> hsc_minusO2_flags
-           n -> throwDyn (CmdLineError ("unknown optimisation level: "
-                                         ++ show n))
-           -- ToDo: -Ofile
        -- take into account -fno-* flags by removing the equivalent -f*
        -- flag from our list.
   anti_flags <- getStaticOpts v_Anti_opt_C
-  let basic_opts = opt_C_ ++ optimisation_opts
+  let basic_opts = opt_C_
       filtered_opts = filter (`notElem` anti_flags) basic_opts
 
   static <- (do s <- readIORef v_Static; if s then return "-static" 
@@ -601,6 +604,9 @@ machdepCCOpts
    | prefixMatch "ia64"    cTARGETPLATFORM  
        = return ( [], ["-fomit-frame-pointer", "-G0"] )
 
+   | prefixMatch "x86_64"  cTARGETPLATFORM
+       = return ( [], ["-fomit-frame-pointer"] )
+
    | prefixMatch "mips"    cTARGETPLATFORM
        = return ( ["-static"], [] )
 
@@ -616,14 +622,20 @@ machdepCCOpts
       --     for "normal" programs, but it doesn't support register variable
       --     declarations.
       -- -mdynamic-no-pic:
-      --     As we don't support haskell code in shared libraries anyway,
-      --     we might as well turn of PIC code generation and save space and time.
-      --     This is completely optional.
-       = return ( ["-no-cpp-precomp","-mdynamic-no-pic"], [] )
-
-   | prefixMatch "powerpc" cTARGETPLATFORM || prefixMatch "rs6000" cTARGETPLATFORM
-       = return ( ["-static"], ["-finhibit-size-directive"] )
-
+      --     Turn off PIC code generation to save space and time.
+      -- -fno-common:
+      --     Don't generate "common" symbols - these are unwanted
+      --     in dynamic libraries.
+
+        = if opt_PIC
+            then return ( ["-no-cpp-precomp", "-fno-common"],
+                          ["-fno-common"] )
+            else return ( ["-no-cpp-precomp", "-mdynamic-no-pic"],
+                          ["-mdynamic-no-pic"] )
+
+   | prefixMatch "powerpc" cTARGETPLATFORM && opt_PIC
+        = return ( ["-fPIC"], ["-fPIC"] )
+  
    | otherwise
        = return ( [], [] )
 
@@ -647,3 +659,25 @@ setVerbosity n
   | otherwise     = throwDyn (UsageError "can't parse verbosity flag (-v<n>)")
 
 addCmdlineHCInclude a = updDynFlags (\s -> s{cmdlineHcIncludes =  a : cmdlineHcIncludes s})
+
+-- -----------------------------------------------------------------------------
+-- Version and usage messages
+
+showVersion :: IO ()
+showVersion = do
+  putStrLn (cProjectName ++ ", version " ++ cProjectVersion)
+  exitWith ExitSuccess
+
+showGhcUsage = do 
+  (ghc_usage_path,ghci_usage_path) <- getUsageMsgPaths
+  mode <- readIORef v_GhcMode
+  let usage_path 
+       | mode == DoInteractive  = ghci_usage_path
+       | otherwise              = ghc_usage_path
+  usage <- readFile usage_path
+  dump usage
+  exitWith ExitSuccess
+  where
+     dump ""         = return ()
+     dump ('$':'$':s) = hPutStr stderr progName >> dump s
+     dump (c:s)              = hPutChar stderr c >> dump s