[project @ 2000-11-01 17:15:28 by simonpj]
[ghc-hetmet.git] / ghc / compiler / main / CmdLineOpts.lhs
index 7459929..747ad04 100644 (file)
@@ -12,7 +12,9 @@ module CmdLineOpts (
        SwitchResult(..),
        HscLang(..),
        DynFlag(..),    -- needed non-abstractly by DriverFlags
-       DynFlags,       -- abstract
+       DynFlags(..),
+
+       v_Static_hsc_opts,
 
        intSwitchSet,
        switchIsOn,
@@ -28,6 +30,7 @@ module CmdLineOpts (
        dopt_CoreToDo,
        dopt_StgToDo,
        dopt_HscLang,
+       dopt_OutName,
 
        -- profiling opts
        opt_AutoSccsOnAllToplevs,
@@ -82,7 +85,6 @@ module CmdLineOpts (
        opt_IgnoreAsserts,
        opt_IgnoreIfacePragmas,
         opt_NoHiCheck,
-       opt_NoImplicitPrelude,
        opt_OmitBlackHoling,
        opt_OmitInterfacePragmas,
        opt_NoPruneTyDecls,
@@ -96,7 +98,7 @@ module CmdLineOpts (
 
 import Array   ( array, (//) )
 import GlaExts
-import Argv
+import IOExts  ( IORef, readIORef )
 import Constants       -- Default values for some flags
 import Util
 import FastTypes
@@ -270,32 +272,38 @@ data DynFlag
    | Opt_AllowUndecidableInstances
    | Opt_GlasgowExts
    | Opt_Generics
+   | Opt_NoImplicitPrelude 
 
    -- misc
    | Opt_ReportCompile
    deriving (Eq)
 
 data DynFlags = DynFlags {
-  coreToDo :: CoreToDo,
-  stgToDo  :: StgToDo,
-  hscLang  :: HscLang,
-  flags    :: [DynFlag]
+  coreToDo   :: [CoreToDo],
+  stgToDo    :: [StgToDo],
+  hscLang    :: HscLang,
+  hscOutName :: String,  -- name of the file in which to place output
+  flags      :: [DynFlag]
  }
 
 dopt :: DynFlag -> DynFlags -> Bool
 dopt f dflags  = f `elem` (flags dflags)
 
-dopt_CoreToDo :: DynFlags -> CoreToDo
+dopt_CoreToDo :: DynFlags -> [CoreToDo]
 dopt_CoreToDo = coreToDo
 
-dopt_StgToDo :: DynFlags -> StgToDo
+dopt_StgToDo :: DynFlags -> [StgToDo]
 dopt_StgToDo = stgToDo
 
+dopt_OutName :: DynFlags -> String
+dopt_OutName = hscOutName
+
 data HscLang
-  = HscC     String   -- String is the filename to put output into
-  | HscAsm   String   -- ditto
-  | HscJava  String   -- ditto
-  | HscInterpreter
+  = HscC
+  | HscAsm
+  | HscJava
+  | HscInterpreted
+    deriving Eq
 
 dopt_HscLang :: DynFlags -> HscLang
 dopt_HscLang = hscLang
@@ -308,15 +316,22 @@ dopt_HscLang = hscLang
 %************************************************************************
 
 \begin{code}
+-- v_Statis_hsc_opts is here to avoid a circular dependency with
+-- main/DriverState.
+GLOBAL_VAR(v_Static_hsc_opts, [], [String])
+
 lookUp          :: FAST_STRING -> Bool
 lookup_int              :: String -> Maybe Int
 lookup_def_int   :: String -> Int -> Int
 lookup_def_float :: String -> Float -> Float
 lookup_str       :: String -> Maybe String
 
-lookUp     sw = sw `elem` argv
+unpacked_static_opts = unsafePerformIO (readIORef v_Static_hsc_opts)
+packed_static_opts   = map _PK_ unpacked_static_opts
+
+lookUp     sw = sw `elem` packed_static_opts
        
-lookup_str sw = firstJust (map (startsWith sw) unpacked_opts)
+lookup_str sw = firstJust (map (startsWith sw) unpacked_static_opts)
 
 lookup_int sw = case (lookup_str sw) of
                  Nothing -> Nothing
@@ -334,7 +349,6 @@ lookup_def_float sw def = case (lookup_str sw) of
                            Nothing -> def              -- Use default
                            Just xx -> read xx
 
-unpacked_opts = map _UNPK_ argv
 
 {-
  Putting the compiler options into temporary at-files
@@ -346,7 +360,7 @@ unpacked_opts :: [String]
 unpacked_opts =
   concat $
   map (expandAts) $
-  map _UNPK_ argv
+  map _UNPK_ argv  -- NOT ARGV any more: v_Static_hsc_opts
   where
    expandAts ('@':fname) = words (unsafePerformIO (readFile fname))
    expandAts l = [l]
@@ -408,7 +422,6 @@ opt_HistorySize                     = lookup_def_int "-fhistory-size" 20
 opt_IgnoreAsserts               = lookUp  SLIT("-fignore-asserts")
 opt_IgnoreIfacePragmas         = lookUp  SLIT("-fignore-interface-pragmas")
 opt_NoHiCheck                   = lookUp  SLIT("-fno-hi-version-check")
-opt_NoImplicitPrelude          = lookUp  SLIT("-fno-implicit-prelude")
 opt_OmitBlackHoling            = lookUp  SLIT("-dno-black-holing")
 opt_OmitInterfacePragmas       = lookUp  SLIT("-fomit-interface-pragmas")
 
@@ -450,58 +463,57 @@ opt_Verbose                       = lookUp SLIT("-v")
 \begin{code}
 isStaticHscFlag f =
   f `elem` [
-       "-fauto-sccs-on-all-toplevs",
-       "-fauto-sccs-on-exported-toplevs",
-       "-fauto-sccs-on-individual-cafs",
-       "-fauto-sccs-on-dicts",
-       "-fscc-profiling",
-       "-fticky-ticky",
-       "-fall-strict",
-       "-fdicts-strict",
-       "-fgenerics",
-       "-firrefutable-tuples",
-       "-fnumbers-strict",
-       "-fparallel",
-       "-fsmp",
-       "-fsemi-tagging",
-       "-ffoldr-build-on",
-       "-flet-no-escape",
-       "-funfold-casms-in-hi-file",
-       "-fusagesp-on",
-       "-funbox-strict-fields",
-       "-femit-extern-decls",
-       "-fglobalise-toplev-names",
-       "-fgransim",
-       "-fignore-asserts",
-       "-fignore-interface-pragmas",
-       "-fno-hi-version-check",
-       "-fno-implicit-prelude",
-       "-dno-black-holing",
-       "-fomit-interface-pragmas",
-       "-fno-pre-inlining",
-       "-fdo-eta-reduction",
-       "-fdo-lambda-eta-expansion",
-       "-fcase-of-case",
-       "-fcase-merge",
-       "-fpedantic-bottoms",
-       "-fexcess-precision",
-       "-funfolding-update-in-place",
-       "-freport-compile",
-       "-fno-prune-decls",
-       "-fno-prune-tydecls",
-       "-static",
-       "-funregisterised",
-       "-v" ]
+       "fauto-sccs-on-all-toplevs",
+       "fauto-sccs-on-exported-toplevs",
+       "fauto-sccs-on-individual-cafs",
+       "fauto-sccs-on-dicts",
+       "fscc-profiling",
+       "fticky-ticky",
+       "fall-strict",
+       "fdicts-strict",
+       "firrefutable-tuples",
+       "fnumbers-strict",
+       "fparallel",
+       "fsmp",
+       "fsemi-tagging",
+       "ffoldr-build-on",
+       "flet-no-escape",
+       "funfold-casms-in-hi-file",
+       "fusagesp-on",
+       "funbox-strict-fields",
+       "femit-extern-decls",
+       "fglobalise-toplev-names",
+       "fgransim",
+       "fignore-asserts",
+       "fignore-interface-pragmas",
+       "fno-hi-version-check",
+       "fno-implicit-prelude",
+       "dno-black-holing",
+       "fomit-interface-pragmas",
+       "fno-pre-inlining",
+       "fdo-eta-reduction",
+       "fdo-lambda-eta-expansion",
+       "fcase-of-case",
+       "fcase-merge",
+       "fpedantic-bottoms",
+       "fexcess-precision",
+       "funfolding-update-in-place",
+       "freport-compile",
+       "fno-prune-decls",
+       "fno-prune-tydecls",
+       "static",
+       "funregisterised",
+       "v" ]
   || any (flip prefixMatch f) [
-       "-fcontext-stack",
-       "-fliberate-case-threshold",
-       "-fhi-version=",
-       "-fhistory-size",
-       "-funfolding-interface-threshold",
-       "-funfolding-creation-threshold",
-       "-funfolding-use-threshold",
-       "-funfolding-fun-discount",
-       "-funfolding-keeness-factor"
+       "fcontext-stack",
+       "fliberate-case-threshold",
+       "fhi-version=",
+       "fhistory-size",
+       "funfolding-interface-threshold",
+       "funfolding-creation-threshold",
+       "funfolding-use-threshold",
+       "funfolding-fun-discount",
+       "funfolding-keeness-factor"
      ]
 \end{code}