+\subsection{Dynamic command-line options}
+%* *
+%************************************************************************
+
+\begin{code}
+data DynFlag
+
+ -- debugging flags
+ = Opt_D_dump_all
+ | Opt_D_dump_most
+ | Opt_D_dump_absC
+ | Opt_D_dump_asm
+ | Opt_D_dump_cpranal
+ | Opt_D_dump_deriv
+ | Opt_D_dump_ds
+ | Opt_D_dump_flatC
+ | Opt_D_dump_foreign
+ | Opt_D_dump_inlinings
+ | Opt_D_dump_occur_anal
+ | Opt_D_dump_parsed
+ | Opt_D_dump_realC
+ | Opt_D_dump_rn
+ | Opt_D_dump_simpl
+ | Opt_D_dump_simpl_iterations
+ | Opt_D_dump_spec
+ | Opt_D_dump_stg
+ | Opt_D_dump_stranal
+ | Opt_D_dump_tc
+ | Opt_D_dump_types
+ | Opt_D_dump_rules
+ | Opt_D_dump_usagesp
+ | Opt_D_dump_cse
+ | Opt_D_dump_worker_wrapper
+ | Opt_D_show_passes
+ | Opt_D_dump_rn_trace
+ | Opt_D_dump_rn_stats
+ | Opt_D_dump_stix
+ | Opt_D_dump_simpl_stats
+ | Opt_D_source_stats
+ | Opt_D_verbose_core2core
+ | Opt_D_verbose_stg2stg
+ | Opt_D_dump_hi_diffs
+ | Opt_D_dump_minimal_imports
+ | Opt_DoCoreLinting
+ | Opt_DoStgLinting
+ | Opt_DoUSPLinting
+
+ -- language opts
+ | Opt_AllowOverlappingInstances
+ | Opt_AllowUndecidableInstances
+ | Opt_GlasgowExts
+ deriving (Eq)
+
+data DynFlags = DynFlags {
+ coreToDo :: CoreToDo,
+ stgToDo :: StgToDo,
+ hscLang :: HscLang,
+ flags :: [DynFlag]
+ }
+
+boolOpt :: DynFlag -> DynFlags -> Bool
+boolOpt f dflags = f `elem` (flags dflags)
+
+dopt_D_dump_all = boolOpt Opt_D_dump_all
+dopt_D_dump_most = boolOpt Opt_D_dump_most
+dopt_D_dump_absC = boolOpt Opt_D_dump_absC
+dopt_D_dump_asm = boolOpt Opt_D_dump_asm
+dopt_D_dump_cpranal = boolOpt Opt_D_dump_cpranal
+dopt_D_dump_deriv = boolOpt Opt_D_dump_deriv
+dopt_D_dump_ds = boolOpt Opt_D_dump_ds
+dopt_D_dump_flatC = boolOpt Opt_D_dump_flatC
+dopt_D_dump_foreign = boolOpt Opt_D_dump_foreign
+dopt_D_dump_inlinings = boolOpt Opt_D_dump_inlinings
+dopt_D_dump_occur_anal = boolOpt Opt_D_dump_occur_anal
+dopt_D_dump_parsed = boolOpt Opt_D_dump_parsed
+dopt_D_dump_realC = boolOpt Opt_D_dump_realC
+dopt_D_dump_rn = boolOpt Opt_D_dump_rn
+dopt_D_dump_simpl = boolOpt Opt_D_dump_simpl
+dopt_D_dump_simpl_iterations = boolOpt Opt_D_dump_simpl_iterations
+dopt_D_dump_spec = boolOpt Opt_D_dump_spec
+dopt_D_dump_stg = boolOpt Opt_D_dump_stg
+dopt_D_dump_stranal = boolOpt Opt_D_dump_stranal
+dopt_D_dump_tc = boolOpt Opt_D_dump_tc
+dopt_D_dump_types = boolOpt Opt_D_dump_types
+dopt_D_dump_rules = boolOpt Opt_D_dump_rules
+dopt_D_dump_usagesp = boolOpt Opt_D_dump_usagesp
+dopt_D_dump_cse = boolOpt Opt_D_dump_cse
+dopt_D_dump_worker_wrapper = boolOpt Opt_D_dump_worker_wrapper
+dopt_D_show_passes = boolOpt Opt_D_show_passes
+dopt_D_dump_rn_trace = boolOpt Opt_D_dump_rn_trace
+dopt_D_dump_rn_stats = boolOpt Opt_D_dump_rn_stats
+dopt_D_dump_stix = boolOpt Opt_D_dump_stix
+dopt_D_dump_simpl_stats = boolOpt Opt_D_dump_simpl_stats
+dopt_D_source_stats = boolOpt Opt_D_source_stats
+dopt_D_verbose_core2core = boolOpt Opt_D_verbose_core2core
+dopt_D_verbose_stg2stg = boolOpt Opt_D_verbose_stg2stg
+dopt_D_dump_hi_diffs = boolOpt Opt_D_dump_hi_diffs
+dopt_D_dump_minimal_imports = boolOpt Opt_D_dump_minimal_imports
+dopt_DoCoreLinting = boolOpt Opt_DoCoreLinting
+dopt_DoStgLinting = boolOpt Opt_DoStgLinting
+dopt_DoUSPLinting = boolOpt Opt_DoUSPLinting
+
+dopt_AllowOverlappingInstances = boolOpt Opt_AllowOverlappingInstances
+dopt_AllowUndecidableInstances = boolOpt Opt_AllowUndecidableInstances
+dopt_GlasgowExts = boolOpt Opt_GlasgowExts
+
+dopt_CoreToDo :: DynFlags -> CoreToDo
+dopt_CoreToDo = coreToDo
+
+dopt_StgToDo :: DynFlags -> StgToDo
+dopt_StgToDo = stgToDo
+
+data HscLang
+ = HscC
+ | HscAsm
+ | HscJava
+ deriving Eq
+
+dopt_HscLang :: DynFlags -> HscLang
+dopt_HscLang = hscLang
+\end{code}
+
+%************************************************************************
+%* *