[project @ 2000-10-27 14:45:18 by simonmar]
[ghc-hetmet.git] / ghc / compiler / main / DriverFlags.hs
1 -----------------------------------------------------------------------------
2 -- $Id: DriverFlags.hs,v 1.11 2000/10/27 14:45:18 simonmar Exp $
3 --
4 -- Driver flags
5 --
6 -- (c) Simon Marlow 2000
7 --
8 -----------------------------------------------------------------------------
9
10 module DriverFlags where
11
12 #include "HsVersions.h"
13
14 import PackageMaintenance
15 import DriverState
16 import DriverUtil
17 import CmdLineOpts
18 import Config
19 import Util
20 import CmdLineOpts
21
22 import Exception
23 import IOExts
24 import IO
25 import System
26 import Char
27
28 -----------------------------------------------------------------------------
29 -- Flags
30
31 -- Flag parsing is now done in stages:
32 --
33 --     * parse the initial list of flags and remove any flags understood
34 --       by the driver only.  Determine whether we're in multi-compilation
35 --       or single-compilation mode.
36 --
37 --     * gather the list of "static" hsc flags, and assign them to the global
38 --       static hsc flags variable.
39 --
40 --     * build the inital DynFlags from the remaining flags.
41 --
42 --     * complain if we've got any flags left over.
43 --
44 --     * for each source file: grab the OPTIONS, and build a new DynFlags
45 --       to pass to the compiler.
46
47 -----------------------------------------------------------------------------
48 -- Process command-line  
49
50 data OptKind
51         = NoArg (IO ())                     -- flag with no argument
52         | HasArg (String -> IO ())          -- flag has an argument (maybe prefix)
53         | SepArg (String -> IO ())          -- flag has a separate argument
54         | Prefix (String -> IO ())          -- flag is a prefix only
55         | OptPrefix (String -> IO ())       -- flag may be a prefix
56         | AnySuffix (String -> IO ())       -- flag is a prefix, pass whole arg to fn
57         | PassFlag  (String -> IO ())       -- flag with no arg, pass flag to fn
58         | PrefixPred (String -> Bool) (String -> IO ())
59         | AnySuffixPred (String -> Bool) (String -> IO ())
60
61 processArgs :: [(String,OptKind)] -> [String] -> [String]
62    -> IO [String]  -- returns spare args
63 processArgs _spec [] spare = return (reverse spare)
64 processArgs spec args@(('-':arg):args') spare = do
65   putStrLn ( "processArg: " ++ arg)
66   case findArg spec arg of
67     Just (rest,action) -> 
68       do args' <- processOneArg action rest args
69          processArgs spec args' spare
70     Nothing -> 
71       processArgs spec args' (('-':arg):spare)
72 processArgs spec (arg:args) spare = 
73   processArgs spec args (arg:spare)
74
75 processOneArg :: OptKind -> String -> [String] -> IO [String]
76 processOneArg action rest (dash_arg@('-':arg):args) =
77   case action of
78         NoArg  io -> 
79                 if rest == ""
80                         then io >> return args
81                         else unknownFlagErr dash_arg
82
83         HasArg fio -> 
84                 if rest /= "" 
85                         then fio rest >> return args
86                         else case args of
87                                 [] -> unknownFlagErr dash_arg
88                                 (arg1:args1) -> fio arg1 >> return args1
89
90         SepArg fio -> 
91                 case args of
92                         [] -> unknownFlagErr dash_arg
93                         (arg1:args1) -> fio arg1 >> return args1
94
95         Prefix fio -> 
96                 if rest /= ""
97                         then fio rest >> return args
98                         else unknownFlagErr dash_arg
99         
100         PrefixPred p fio -> 
101                 if rest /= ""
102                         then fio rest >> return args
103                         else unknownFlagErr dash_arg
104         
105         OptPrefix fio       -> fio rest >> return args
106
107         AnySuffix fio       -> fio dash_arg >> return args
108
109         AnySuffixPred p fio -> fio dash_arg >> return args
110
111         PassFlag fio  -> 
112                 if rest /= ""
113                         then unknownFlagErr dash_arg
114                         else fio dash_arg >> return args
115
116 findArg :: [(String,OptKind)] -> String -> Maybe (String,OptKind)
117 findArg spec arg
118   = trace ("findArg: " ++ arg) $
119     case [ (remove_spaces rest, k) 
120          | (pat,k) <- spec, Just rest <- [my_prefix_match pat arg],
121            arg_ok k rest arg ] 
122     of
123         []      -> Nothing
124         (one:_) -> Just one
125
126 arg_ok (NoArg _)            rest arg = null rest
127 arg_ok (HasArg _)           rest arg = True
128 arg_ok (SepArg _)           rest arg = null rest
129 arg_ok (Prefix _)           rest arg = not (null rest)
130 arg_ok (PrefixPred p _)     rest arg = not (null rest) && p rest
131 arg_ok (OptPrefix _)        rest arg = True
132 arg_ok (PassFlag _)         rest arg = null rest 
133 arg_ok (AnySuffix _)        rest arg = not (null rest)
134 arg_ok (AnySuffixPred p _)  rest arg = not (null rest) && p arg
135
136 -----------------------------------------------------------------------------
137 -- Static flags
138
139 -- note that ordering is important in the following list: any flag which
140 -- is a prefix flag (i.e. HasArg, Prefix, OptPrefix, AnySuffix) will override
141 -- flags further down the list with the same prefix.
142
143 static_flags = 
144   [  ------- help -------------------------------------------------------
145      ( "?"              , NoArg long_usage)
146   ,  ( "-help"          , NoArg long_usage)
147   
148
149       ------- version ----------------------------------------------------
150   ,  ( "-version"        , NoArg (do hPutStrLn stdout (cProjectName
151                                       ++ ", version " ++ version_str)
152                                      exitWith ExitSuccess))
153   ,  ( "-numeric-version", NoArg (do hPutStrLn stdout version_str
154                                      exitWith ExitSuccess))
155
156       ------- verbosity ----------------------------------------------------
157   ,  ( "v"              , NoArg (writeIORef v_Verbose True) )
158   ,  ( "n"              , NoArg (writeIORef v_Dry_run True) )
159
160         ------- recompilation checker --------------------------------------
161   ,  ( "recomp"         , NoArg (writeIORef v_Recomp True) )
162   ,  ( "no-recomp"      , NoArg (writeIORef v_Recomp False) )
163
164         ------- ways --------------------------------------------------------
165   ,  ( "prof"           , NoArg (addNoDups v_Ways       WayProf) )
166   ,  ( "unreg"          , NoArg (addNoDups v_Ways       WayUnreg) )
167   ,  ( "dll"            , NoArg (addNoDups v_Ways WayDll) )
168   ,  ( "ticky"          , NoArg (addNoDups v_Ways       WayTicky) )
169   ,  ( "parallel"       , NoArg (addNoDups v_Ways       WayPar) )
170   ,  ( "gransim"        , NoArg (addNoDups v_Ways       WayGran) )
171   ,  ( "smp"            , NoArg (addNoDups v_Ways       WaySMP) )
172   ,  ( "debug"          , NoArg (addNoDups v_Ways       WayDebug) )
173         -- ToDo: user ways
174
175         ------ Debugging ----------------------------------------------------
176   ,  ( "dppr-noprags",     PassFlag (add v_Opt_C) )
177   ,  ( "dppr-debug",       PassFlag (add v_Opt_C) )
178   ,  ( "dppr-user-length", AnySuffix (add v_Opt_C) )
179       -- rest of the debugging flags are dynamic
180
181         ------- Interface files ---------------------------------------------
182   ,  ( "hi"             , NoArg (writeIORef v_ProduceHi True) )
183   ,  ( "nohi"           , NoArg (writeIORef v_ProduceHi False) )
184
185         --------- Profiling --------------------------------------------------
186   ,  ( "auto-dicts"     , NoArg (add v_Opt_C "-fauto-sccs-on-dicts") )
187   ,  ( "auto-all"       , NoArg (add v_Opt_C "-fauto-sccs-on-all-toplevs") )
188   ,  ( "auto"           , NoArg (add v_Opt_C "-fauto-sccs-on-exported-toplevs") )
189   ,  ( "caf-all"        , NoArg (add v_Opt_C "-fauto-sccs-on-individual-cafs") )
190          -- "ignore-sccs"  doesn't work  (ToDo)
191
192   ,  ( "no-auto-dicts"  , NoArg (add v_Anti_opt_C "-fauto-sccs-on-dicts") )
193   ,  ( "no-auto-all"    , NoArg (add v_Anti_opt_C "-fauto-sccs-on-all-toplevs") )
194   ,  ( "no-auto"        , NoArg (add v_Anti_opt_C "-fauto-sccs-on-exported-toplevs") )
195   ,  ( "no-caf-all"     , NoArg (add v_Anti_opt_C "-fauto-sccs-on-individual-cafs") )
196
197         ------- Miscellaneous -----------------------------------------------
198   ,  ( "no-link-chk"    , NoArg (return ()) ) -- ignored for backwards compat
199
200         ------- Output Redirection ------------------------------------------
201   ,  ( "odir"           , HasArg (writeIORef v_Output_dir  . Just) )
202   ,  ( "o"              , SepArg (writeIORef v_Output_file . Just) )
203   ,  ( "osuf"           , HasArg (writeIORef v_Output_suf  . Just) )
204   ,  ( "hisuf"          , HasArg (writeIORef v_Hi_suf) )
205   ,  ( "tmpdir"         , HasArg (writeIORef v_TmpDir . (++ "/")) )
206   ,  ( "ohi"            , HasArg (\s -> case s of 
207                                           "-" -> writeIORef v_Hi_on_stdout True
208                                           _   -> writeIORef v_Output_hi (Just s)) )
209         -- -odump?
210
211   ,  ( "keep-hc-file"   , AnySuffix (\_ -> writeIORef v_Keep_hc_files True) )
212   ,  ( "keep-s-file"    , AnySuffix (\_ -> writeIORef v_Keep_s_files  True) )
213   ,  ( "keep-raw-s-file", AnySuffix (\_ -> writeIORef v_Keep_raw_s_files  True) )
214   ,  ( "keep-tmp-files" , AnySuffix (\_ -> writeIORef v_Keep_tmp_files True) )
215
216   ,  ( "split-objs"     , NoArg (if can_split
217                                     then do writeIORef v_Split_object_files True
218                                             add v_Opt_C "-fglobalise-toplev-names"
219 -- TODO!!!!!                                add opt_c "-DUSE_SPLIT_MARKERS"
220                                     else hPutStrLn stderr
221                                             "warning: don't know how to  split \
222                                             \object files on this architecture"
223                                 ) )
224   
225         ------- Include/Import Paths ----------------------------------------
226   ,  ( "i"              , OptPrefix (addToDirList v_Import_paths) )
227   ,  ( "I"              , Prefix    (addToDirList v_Include_paths) )
228
229         ------- Libraries ---------------------------------------------------
230   ,  ( "L"              , Prefix (addToDirList v_Library_paths) )
231   ,  ( "l"              , Prefix (add v_Cmdline_libraries) )
232
233         ------- Packages ----------------------------------------------------
234   ,  ( "package-name"   , HasArg (\s -> add v_Opt_C ("-inpackage="++s)) )
235
236   ,  ( "package"        , HasArg (addPackage) )
237   ,  ( "syslib"         , HasArg (addPackage) ) -- for compatibility w/ old vsns
238
239   ,  ( "-list-packages"  , NoArg (listPackages) )
240   ,  ( "-add-package"    , NoArg (newPackage) )
241   ,  ( "-delete-package" , SepArg (deletePackage) )
242
243         ------- Specific phases  --------------------------------------------
244   ,  ( "pgmL"           , HasArg (writeIORef v_Pgm_L) )
245   ,  ( "pgmP"           , HasArg (writeIORef v_Pgm_P) )
246   ,  ( "pgmc"           , HasArg (writeIORef v_Pgm_c) )
247   ,  ( "pgmm"           , HasArg (writeIORef v_Pgm_m) )
248   ,  ( "pgms"           , HasArg (writeIORef v_Pgm_s) )
249   ,  ( "pgma"           , HasArg (writeIORef v_Pgm_a) )
250   ,  ( "pgml"           , HasArg (writeIORef v_Pgm_l) )
251
252   ,  ( "optdep"         , HasArg (add v_Opt_dep) )
253   ,  ( "optl"           , HasArg (add v_Opt_l) )
254   ,  ( "optdll"         , HasArg (add v_Opt_dll) )
255
256         ------ Warning opts -------------------------------------------------
257   ,  ( "W"              , NoArg (writeIORef v_Warning_opt W_) )
258   ,  ( "Wall"           , NoArg (writeIORef v_Warning_opt W_all) )
259   ,  ( "Wnot"           , NoArg (writeIORef v_Warning_opt W_not) )
260   ,  ( "w"              , NoArg (writeIORef v_Warning_opt W_not) )
261
262         ----- Linker --------------------------------------------------------
263   ,  ( "static"         , NoArg (writeIORef v_Static True) )
264
265         ------ Compiler flags -----------------------------------------------
266   ,  ( "O2-for-C"          , NoArg (writeIORef v_minus_o2_for_C True) )
267   ,  ( "O"                 , OptPrefix (setOptLevel) )
268
269   ,  ( "fasm"              , OptPrefix (\_ -> writeIORef v_Hsc_Lang HscAsm) )
270
271   ,  ( "fvia-c"            , NoArg (writeIORef v_Hsc_Lang HscC) )
272   ,  ( "fvia-C"            , NoArg (writeIORef v_Hsc_Lang HscC) )
273
274   ,  ( "fno-asm-mangling"  , NoArg (writeIORef v_Do_asm_mangling False) )
275
276   ,  ( "fmax-simplifier-iterations", 
277                 Prefix (writeIORef v_MaxSimplifierIterations . read) )
278
279   ,  ( "fusagesp"          , NoArg (do writeIORef v_UsageSPInf True
280                                        add v_Opt_C "-fusagesp-on") )
281
282   ,  ( "fexcess-precision" , NoArg (do writeIORef v_Excess_precision True
283                                        add v_Opt_C "-fexcess-precision"))
284
285         -- flags that are "active negatives"
286   ,  ( "fno-implicit-prelude"   , PassFlag (add v_Opt_C) )
287   ,  ( "fno-prune-tydecls"      , PassFlag (add v_Opt_C) )
288   ,  ( "fno-prune-instdecls"    , PassFlag (add v_Opt_C) )
289   ,  ( "fno-pre-inlining"       , PassFlag (add v_Opt_C) )
290
291         -- All other "-fno-<blah>" options cancel out "-f<blah>" on the hsc cmdline
292   ,  ( "fno-",                  PrefixPred (\s -> isStaticHscFlag ("f"++s))
293                                     (\s -> add v_Anti_opt_C ("-f"++s)) )
294
295         -- Pass all remaining "-f<blah>" options to hsc
296   ,  ( "f",                     AnySuffixPred (isStaticHscFlag) (add v_Opt_C) )
297   ]
298
299 -----------------------------------------------------------------------------
300 -- parse the dynamic arguments
301
302 GLOBAL_VAR(v_InitDynFlags, error "no InitDynFlags", DynFlags)
303 GLOBAL_VAR(v_DynFlags, error "no DynFlags", DynFlags)
304
305 setDynFlag f = do
306    dfs <- readIORef v_DynFlags
307    writeIORef v_DynFlags dfs{ flags = f : flags dfs }
308
309 unSetDynFlag f = do
310    dfs <- readIORef v_DynFlags
311    writeIORef v_DynFlags dfs{ flags = filter (/= f) (flags dfs) }
312
313 dynamic_flags = [
314
315      ( "cpp",           NoArg  (updateState (\s -> s{ cpp_flag = True })) )
316   ,  ( "#include",      HasArg (addCmdlineHCInclude) )
317
318   ,  ( "optL",          HasArg (addOpt_L) )
319   ,  ( "optP",          HasArg (addOpt_P) )
320   ,  ( "optc",          HasArg (addOpt_c) )
321   ,  ( "optm",          HasArg (addOpt_m) )
322   ,  ( "opta",          HasArg (addOpt_a) )
323
324         ------ HsCpp opts ---------------------------------------------------
325   ,  ( "D",             Prefix (\s -> addOpt_P ("-D'"++s++"'") ) )
326   ,  ( "U",             Prefix (\s -> addOpt_P ("-U'"++s++"'") ) )
327
328         ------ Debugging ----------------------------------------------------
329   ,  ( "dstg-stats",    NoArg (writeIORef v_StgStats True) )
330
331   ,  ( "ddump-all",              NoArg (setDynFlag Opt_D_dump_all) )
332   ,  ( "ddump-most",             NoArg (setDynFlag Opt_D_dump_most) )
333   ,  ( "ddump-absC",             NoArg (setDynFlag Opt_D_dump_absC) )
334   ,  ( "ddump-asm",              NoArg (setDynFlag Opt_D_dump_asm) )
335   ,  ( "ddump-cpranal",          NoArg (setDynFlag Opt_D_dump_cpranal) )
336   ,  ( "ddump-deriv",            NoArg (setDynFlag Opt_D_dump_deriv) )
337   ,  ( "ddump-ds",               NoArg (setDynFlag Opt_D_dump_ds) )
338   ,  ( "ddump-flatC",            NoArg (setDynFlag Opt_D_dump_flatC) )
339   ,  ( "ddump-foreign",          NoArg (setDynFlag Opt_D_dump_foreign) )
340   ,  ( "ddump-inlinings",        NoArg (setDynFlag Opt_D_dump_inlinings) )
341   ,  ( "ddump-occur-anal",       NoArg (setDynFlag Opt_D_dump_occur_anal) )
342   ,  ( "ddump-parsed",           NoArg (setDynFlag Opt_D_dump_parsed) )
343   ,  ( "ddump-realC",            NoArg (setDynFlag Opt_D_dump_realC) )
344   ,  ( "ddump-rn",               NoArg (setDynFlag Opt_D_dump_rn) )
345   ,  ( "ddump-simpl",            NoArg (setDynFlag Opt_D_dump_simpl) )
346   ,  ( "ddump-simpl-iterations", NoArg (setDynFlag Opt_D_dump_simpl_iterations) )
347   ,  ( "ddump-spec",             NoArg (setDynFlag Opt_D_dump_spec) )
348   ,  ( "ddump-stg",              NoArg (setDynFlag Opt_D_dump_stg) )
349   ,  ( "ddump-stranal",          NoArg (setDynFlag Opt_D_dump_stranal) )
350   ,  ( "ddump-tc",               NoArg (setDynFlag Opt_D_dump_tc) )
351   ,  ( "ddump-types",            NoArg (setDynFlag Opt_D_dump_types) )
352   ,  ( "ddump-rules",            NoArg (setDynFlag Opt_D_dump_rules) )
353   ,  ( "ddump-usagesp",          NoArg (setDynFlag Opt_D_dump_usagesp) )
354   ,  ( "ddump-cse",              NoArg (setDynFlag Opt_D_dump_cse) )
355   ,  ( "ddump-worker-wrapper",   NoArg (setDynFlag Opt_D_dump_worker_wrapper) )
356   ,  ( "dshow-passes",           NoArg (setDynFlag Opt_D_show_passes) )
357   ,  ( "ddump-rn-trace",         NoArg (setDynFlag Opt_D_dump_rn_trace) )
358   ,  ( "ddump-rn-stats",         NoArg (setDynFlag Opt_D_dump_rn_stats) )
359   ,  ( "ddump-stix",             NoArg (setDynFlag Opt_D_dump_stix) )
360   ,  ( "ddump-simpl-stats",      NoArg (setDynFlag Opt_D_dump_simpl_stats) )
361   ,  ( "dsource-stats",          NoArg (setDynFlag Opt_D_source_stats) )
362   ,  ( "dverbose-core2core",     NoArg (setDynFlag Opt_D_verbose_core2core) )
363   ,  ( "dverbose-stg2stg",       NoArg (setDynFlag Opt_D_verbose_stg2stg) )
364   ,  ( "ddump-hi-diffs",         NoArg (setDynFlag Opt_D_dump_hi_diffs) )
365   ,  ( "ddump-minimal-imports",  NoArg (setDynFlag Opt_D_dump_minimal_imports) )
366   ,  ( "dcore-lint",             NoArg (setDynFlag Opt_DoCoreLinting) )
367   ,  ( "dstg-lint",              NoArg (setDynFlag Opt_DoStgLinting) )
368   ,  ( "dusagesp-lint",          NoArg (setDynFlag Opt_DoUSPLinting) )
369
370         ------ Warnings ----------------------------------------------------
371
372   ,  ( "fwarn-duplicate-exports", NoArg (setDynFlag Opt_WarnDuplicateExports) )
373   ,  ( "fwarn-hi-shadowing",      NoArg (setDynFlag Opt_WarnHiShadows) )
374   ,  ( "fwarn-incomplete-patterns",  NoArg (setDynFlag Opt_WarnIncompletePatterns) )
375   ,  ( "fwarn-missing-fields",    NoArg (setDynFlag Opt_WarnMissingFields) )
376   ,  ( "fwarn-missing-methods",   NoArg (setDynFlag Opt_WarnMissingMethods))
377   ,  ( "fwarn-missing-signatures", NoArg (setDynFlag Opt_WarnMissingSigs) )
378   ,  ( "fwarn-name-shadowing",    NoArg (setDynFlag Opt_WarnNameShadowing) )
379   ,  ( "fwarn-overlapping-patterns", NoArg (setDynFlag Opt_WarnOverlappingPatterns ) )
380   ,  ( "fwarn-simple-patterns",   NoArg (setDynFlag Opt_WarnSimplePatterns))
381   ,  ( "fwarn-type-defaults",     NoArg (setDynFlag Opt_WarnTypeDefaults) )
382   ,  ( "fwarn-unused-binds",      NoArg (setDynFlag Opt_WarnUnusedBinds) )
383   ,  ( "fwarn-unused-imports",    NoArg (setDynFlag Opt_WarnUnusedImports) )
384   ,  ( "fwarn-unused-matches",    NoArg (setDynFlag Opt_WarnUnusedMatches) )
385   ,  ( "fwarn-deprecations",      NoArg (setDynFlag Opt_WarnDeprecations) )
386
387         ------ Machine dependant (-m<blah>) stuff ---------------------------
388
389   ,  ( "monly-2-regs",  NoArg (updateState (\s -> s{stolen_x86_regs = 2}) ))
390   ,  ( "monly-3-regs",  NoArg (updateState (\s -> s{stolen_x86_regs = 3}) ))
391   ,  ( "monly-4-regs",  NoArg (updateState (\s -> s{stolen_x86_regs = 4}) ))
392
393         ------ Compiler flags -----------------------------------------------
394
395   ,  ( "fglasgow-exts", NoArg (setDynFlag Opt_GlasgowExts) )
396
397   ,  ( "fallow-overlapping-instances",  
398                 NoArg (setDynFlag Opt_AllowOverlappingInstances) )
399
400   ,  ( "fallow-undecidable-instances",
401                 NoArg (setDynFlag Opt_AllowUndecidableInstances) )
402
403   ,  ( "fgenerics",  NoArg (setDynFlag Opt_Generics) )
404
405   ,  ( "freport-compile", NoArg (setDynFlag Opt_ReportCompile) )
406  ]
407
408 -----------------------------------------------------------------------------
409 -- convert sizes like "3.5M" into integers
410
411 decodeSize :: String -> Integer
412 decodeSize str
413   | c == ""              = truncate n
414   | c == "K" || c == "k" = truncate (n * 1000)
415   | c == "M" || c == "m" = truncate (n * 1000 * 1000)
416   | c == "G" || c == "g" = truncate (n * 1000 * 1000 * 1000)
417   | otherwise            = throwDyn (OtherError ("can't decode size: " ++ str))
418   where (m, c) = span pred str
419         n      = read m  :: Double
420         pred c = isDigit c || c == '.'
421
422 floatOpt :: IORef Double -> String -> IO ()
423 floatOpt ref str
424   = writeIORef ref (read str :: Double)
425
426 -----------------------------------------------------------------------------
427 -- Build the Hsc static command line opts
428
429 buildStaticHscOpts :: IO [String]
430 buildStaticHscOpts = do
431
432   opt_C_ <- getStaticOpts v_Opt_C               -- misc hsc opts
433
434         -- optimisation
435   minus_o <- readIORef v_OptLevel
436   let optimisation_opts = 
437         case minus_o of
438             0 -> hsc_minusNoO_flags
439             1 -> hsc_minusO_flags
440             2 -> hsc_minusO2_flags
441             _ -> error "unknown opt level"
442             -- ToDo: -Ofile
443  
444   let stg_opts = [ "-flet-no-escape" ]
445         -- let-no-escape always on for now
446
447         -- take into account -fno-* flags by removing the equivalent -f*
448         -- flag from our list.
449   anti_flags <- getStaticOpts v_Anti_opt_C
450   let basic_opts = opt_C_ ++ optimisation_opts ++ stg_opts
451       filtered_opts = filter (`notElem` anti_flags) basic_opts
452
453   verb <- is_verbose
454   let hi_vers = "-fhi-version="++cProjectVersionInt
455
456   static <- (do s <- readIORef v_Static; if s then return "-static" 
457                                               else return "")
458
459   return ( filtered_opts ++ [ hi_vers, static, verb ] )