4.17. Flag reference
Prev | Chapter 4. Using GHC | Next

## 4.17. Flag reference

This section is a quick-reference for GHC's command-line flags. For each flag, we also list its static/dynamic status (see Section 4.2, “Static vs. Dynamic options”), and the flag's opposite (if available).

### 4.17.1. Help and verbosity options

Section 4.5, “Help and verbosity options”

Flag | Description | Static/Dynamic | Reverse
--- | --- | --- | ---
`-?` | help | static | -
`-help` | help | static | -
`-v` | verbose mode (equivalent to `-v3`) | dynamic | -
`-v` `n` | set verbosity level | dynamic | -
`-V` | display GHC version | static | -
`––version` | display GHC version | static | -
`––numeric-version` | display GHC version (numeric only) | static | -
`––print-libdir` | display GHC library directory | static | -
`-ferror-spans` | output full span in error messages | static | -

### 4.17.2. Which phases to run

Section 4.4.3, “Batch compiler mode”

Flag | Description | Static/Dynamic | Reverse
--- | --- | --- | ---
`-E` | Stop after preprocessing (`.hspp` file) | static | -
`-C` | Stop after generating C (`.hc` file) | static | -
`-S` | Stop after generating assembly (`.s` file) | static | -
`-c` | Stop after compiling to object code (`.o` file) | static | -

### 4.17.3. Alternative modes of operation

Section 4.4, “Modes of operation”

Flag | Description | Static/Dynamic | Reverse
--- | --- | --- | ---
`--interactive` | Interactive mode - normally used by just running ghci | static | -
`--make` | Build a multi-module Haskell program, automatically figuring out dependencies. Likely to be much easier, and faster, than using make. | static | -
`-e `expr`` | Evaluate `expr` | static | -
`-M` | Generate dependency information suitable for use in a `Makefile`. | static | -
`--mk-dll` | DLL-creation mode (Windows only) | static | -

### 4.17.4. Redirecting output

Section 4.6.4, “Redirecting the compilation output(s)”

Flag | Description | Static/Dynamic | Reverse
--- | --- | --- | ---
`-hcsuf` `suffix` | set the suffix to use for intermediate C files | static | -
`-hidir` `dir` | set directory for interface files | static | -
`-hisuf` `suffix` | set the suffix to use for interface files | static | -
`-o` `filename` | set output filename | static | -
`-odir` `dir` | set output directory | static | -
`-ohi` `filename` | set the filename in which to put the interface | static |
`-osuf` `suffix` | set the output file suffix | static | -

### 4.17.5. Keeping intermediate files

Section 4.6.5, “Keeping Intermediate Files”

Flag | Description | Static/Dynamic | Reverse
--- | --- | --- | ---
`-keep-hc-file` | retain intermediate `.hc` files | static | -
`-keep-s-file` | retain intermediate `.s` files | static | -
`-keep-raw-s-file` | retain intermediate `.raw_s` files | static | -
`-keep-tmp-files` | retain all intermediate temporary files | static | -

### 4.17.6. Temporary files

Section 4.6.6, “Redirecting temporary files”

Flag | Description | Static/Dynamic | Reverse
--- | --- | --- | ---
`-tmpdir` | set the directory for temporary files | static | -

### 4.17.7. Finding imports

Section 4.6.3, “The search path”

Flag | Description | Static/Dynamic | Reverse
--- | --- | --- | ---
`-i` `dir1`:`dir2`:... | add `dir`, `dir2`, etc. to import path | static | -
`-i` | Empty the import directory list | static | -

### 4.17.8. Interface file options

Section 4.6.7, “Other options related to interface files”

Flag | Description | Static/Dynamic | Reverse
--- | --- | --- | ---
`-ddump-hi` | Dump the new interface to stdout | dynamic | -
`-ddump-hi-diffs` | Show the differences vs. the old interface | dynamic | -
`-ddump-minimal-imports` | Dump a minimal set of imports | dynamic | -
`--show-iface` `file` | Read the interface in `file` and dump it as text to `stdout`. | static | -

### 4.17.9. Recompilation checking

Section 4.6.8, “The recompilation checker”

Flag | Description | Static/Dynamic | Reverse
--- | --- | --- | ---
`-no-recomp` | Turn off recompilation checking; implied by any `-ddump-X` option | dynamic | `-recomp`

### 4.17.10. Interactive-mode options

Section 3.8, “The `.ghci` file”

Flag | Description | Static/Dynamic | Reverse
--- | --- | --- | ---
`-ignore-dot-ghci` | Disable reading of `.ghci` files | static | -
`-read-dot-ghci` | Enable reading of `.ghci` files | static | -

### 4.17.11. Packages

Section 4.8, “ Packages ”

Flag | Description | Static/Dynamic | Reverse
--- | --- | --- | ---
`-package` `P` | Expose package `P` | static | -
`-hide-package` `name` | Hide package `P` | static | -
`-ignore-package` `name` | Ignore package `P` | static | -
`-package-conf` `file` | Load more packages from `file` | static | -
`-no-user-package-conf` | Don't load the user's package config file. | static | -

### 4.17.12. Language options

Section 7.1, “Language options”

Flag | Description | Static/Dynamic | Reverse
--- | --- | --- | ---
`-fallow-overlapping-instances` | Enable overlapping instances | dynamic | `-fno-allow-overlapping-instances`
`-fallow-undecidable-instances` | Enable undecidable instances | dynamic | `-fno-allow-undecidable-instances`
`-fallow-incoherent-instances` | Enable incoherent instances | dynamic | `-fno-allow-incoherent-instances`
`-farrows` | Enable arrow notation extension | dynamic | `-fno-arrows`
`-fcontext-stack` `n` | set the limit for context reduction | static | `-`
`-ffi` or `-fffi` | Enable foreign function interface (implied by `-fglasgow-exts`) | dynamic | `-fno-ffi`
`-fgenerics` | Enable generics | dynamic | `-fno-fgenerics`
`-fglasgow-exts` | Enable most language extensions | dynamic | `-fno-glasgow-exts`
`-fignore-asserts` | Ignore assertions | dynamic | `-fno-ignore-asserts`
`-fimplicit-params` | Enable Implicit Parameters. Implied by `-fglasgow-exts`. | dynamic | `-fno-implicit-params`
`-firrefutable-tuples` | Make tuple pattern matching irrefutable | dynamic | `-fno-irrefutable-tuples`
`-fno-implicit-prelude` | Don't implicitly `import Prelude` | dynamic | `-fimplicit-prelude`
`-fno-monomorphism-restriction` | Disable the monomorphism restriction | dynamic | `-fmonomorphism-restriction`
`-fscoped-type-variables` | Enable lexically-scoped type variables. Implied by `-fglasgow-exts`. | dynamic | `-fno-scoped-type-variables`
`-fth` | Enable Template Haskell. Implied by `-fglasgow-exts`. | dynamic | `-fno-th`

### 4.17.13. Warnings

(Section 4.7, “Warnings and sanity-checking”

Flag | Description | Static/Dynamic | Reverse
--- | --- | --- | ---
`-W` | enable normal warnings | dynamic | `-w`
`-w` | disable all warnings | dynamic | -
`-Wall` | enable all warnings | dynamic | `-w`
`-Werror` | make warnings fatal | dynamic |
`-fwarn-deprecations` | warn about uses of functions & types that are deprecated | dynamic | `-fno-warn-deprecations`
`-fwarn-duplicate-exports` | warn when an entity is exported multiple times | dynamic | `-fno-warn-duplicate-exports`
`-fwarn-hi-shadowing` | warn when a `.hi` file in the current directory shadows a library | dynamic | `-fno-warn-hi-shadowing`
`-fwarn-incomplete-patterns` | warn when a pattern match could fail | dynamic | `-fno-warn-incomplete-patterns`
`-fwarn-incomplete-record-updates` | warn when a record update could fail | dynamic | `-fno-warn-incomplete-record-updates`
`-fwarn-misc` | enable miscellaneous warnings | dynamic | `-fno-warn-misc`
`-fwarn-missing-fields` | warn when fields of a record are uninitialised | dynamic | `-fno-warn-missing-fields`
`-fwarn-missing-methods` | warn when class methods are undefined | dynamic | `-fno-warn-missing-methods`
`-fwarn-missing-signatures` | warn about top-level functions without signatures | dynamic | `-fno-warn-missing-signatures`
`-fwarn-name-shadowing` | warn when names are shadowed | dynamic | `-fno-warn-name-shadowing`
`-fwarn-oprhans` | warn when the module contains "orphan" instance declarations or rewrite rules | dynamic | `-fno-warn-orphans`
`-fwarn-overlapping-patterns` | warn about overlapping patterns | dynamic | `-fno-warn-overlapping-patterns`
`-fwarn-simple-patterns` | warn about lambda-patterns that can fail | dynamic | `-fno-warn-simple-patterns`
`-fwarn-type-defaults` | warn when defaulting happens | dynamic | `-fno-warn-type-defaults`
`-fwarn-unused-binds` | warn about bindings that are unused | dynamic | `-fno-warn-unused-binds`
`-fwarn-unused-imports` | warn about unnecessary imports | dynamic | `-fno-warn-unused-imports`
`-fwarn-unused-matches` | warn about variables in patterns that aren't used | dynamic | `-fno-warn-unused-matches`

### 4.17.14. Optimisation levels

Section 4.9, “Optimisation (code improvement)”

Flag | Description | Static/Dynamic | Reverse
--- | --- | --- | ---
`-O` | Enable default optimisation (level 1) | dynamic | `-O0`
`-O` `n` | Set optimisation level `n` | dynamic | `-O0`

### 4.17.15. Individual optimisations

Section 4.9.2, “`-f*`: platform-independent flags”

Flag | Description | Static/Dynamic | Reverse
--- | --- | --- | ---
`-fcase-merge` | Enable case-merging | dynamic | `-fno-case-merge`
`-fdicts-strict` | Make dictionaries strict | static | `-fno-dicts-strict`
`-fdo-eta-reduction` | Enable eta-reduction | dynamic | `-fno-do-eta-reduction`
`-fdo-lambda-eta-expansion` | Enable lambda eta-reduction | dynamic | `-fno-do-lambda-eta-expansion`
`-fexcess-precision` | Enable excess intermediate precision | static | `-fno-excess-precision`
`-frules-off` | Switch off all rewrite rules (including rules generated by automatic specialisation of overloaded functions) | static | `-frules-off`
`-fignore-asserts` | Ignore assertions in the source | static | `-fno-ignore-asserts`
`-fignore-interface-pragmas` | Ignore pragmas in interface files | static | `-fno-ignore-interface-pragmas`
`-fliberate-case-threshold` | Tweak the liberate-case optimisation (default: 10) | static | `-fno-liberate-case-threshold`
`-fomit-interface-pragmas` | Don't generate interface pragmas | dynamic | `-fno-omit-interface-pragmas`
`-fmax-worker-args` | If a worker has that many arguments, none will be unpacked anymore (default: 10) | static | -
`-fmax-simplifier-iterations` | Set the max iterations for the simplifier | dynamic | -
`-fno-state-hack` | Turn off the "state hack" whereby any lambda with a real-world state token as argument is considered to be single-entry. Hence OK to inline things inside it. | static | -
`-fno-cpr` | Turn off CPR analysis | static | -fcpr
`-fno-cse` | Turn off common sub-expression | dynamic | -
`-fno-full-laziness` | Turn off full laziness (floating bindings outwards). It is on by default. | dynamic | -ffull-laziness
`-fno-pre-inlining` | Turn off pre-inlining | static | -
`-fno-strictness` | Turn off strictness analysis | dynamic | -
`-fnumbers-strict` | Make numbers strict | dynamic | `-fno-numbers-strict`
`-funbox-strict-fields` | Flatten strict constructor fields | dynamic | `-fno-unbox-strict-fields`
`-funfolding-creation-threshold` | Tweak unfolding settings | static | `-fno-unfolding-creation-threshold`
`-funfolding-fun-discount` | Tweak unfolding settings | static | `-fno-unfolding-fun-discount`
`-funfolding-keeness-factor` | Tweak unfolding settings | static | `-fno-unfolding-keeness-factor`
`-funfolding-update-in-place` | Tweak unfolding settings | static | `-fno-unfolding-update-in-place`
`-funfolding-use-threshold` | Tweak unfolding settings | static | `-fno-unfolding-use-threshold`

### 4.17.16. Profiling options

Chapter 5, Profiling

Flag | Description | Static/Dynamic | Reverse
--- | --- | --- | ---
`-auto` | Auto-add `_scc_`s to all exported functions | static | `-no-auto`
`-auto-all` | Auto-add `_scc_`s to all top-level functions | static | `-no-auto-all`
`-auto-dicts` | Auto-add `_scc_`s to all dictionaries | static | `-no-auto-dicts`
`-caf-all` | Auto-add `_scc_`s to all CAFs | static | `-no-caf-all`
`-prof` | Turn on profiling | static | -
`-ticky` | Turn on ticky-ticky profiling | static | -

### 4.17.17. Parallelism options

Section 4.12, “Using parallel Haskell”

Flag | Description | Static/Dynamic | Reverse
--- | --- | --- | ---
`-gransim` | Enable GRANSIM | static | -
`-parallel` | Enable Parallel Haskell | static | -
`-smp` | Enable SMP support | static | -

### 4.17.18. C pre-processor options

Section 4.10.3, “Options affecting the C pre-processor”

Flag | Description | Static/Dynamic | Reverse
--- | --- | --- | ---
`-cpp` | Run the C pre-processor on Haskell source files | dynamic | -
`-D` `symbol`[=`value`] | Define a symbol in the C pre-processor | dynamic | `-U` `symbol`
`-U` `symbol` | Undefine a symbol in the C pre-processor | dynamic | -
`-I` `dir` | Add `dir` to the directory search list for `#include` files | static | -

### 4.17.19. C compiler options

Section 4.10.5, “Options affecting the C compiler (if applicable)”

Flag | Description | Static/Dynamic | Reverse
--- | --- | --- | ---
`-#include` `file` | Include `file` when compiling the `.hc` file | dynamic | -

### 4.17.20. Code generation options

Section 4.10.6, “Options affecting code generation”

Flag | Description | Static/Dynamic | Reverse
--- | --- | --- | ---
`-fasm` | Use the native code generator | dynamic | -fvia-C
`-fvia-C` | Compile via C | dynamic | -fasm
`-fno-code` | Omit code generation | static | -

### 4.17.21. Linking options

Section 4.10.7, “Options affecting linking”

Flag | Description | Static/Dynamic | Reverse
--- | --- | --- | ---
`-dynamic` | Use dynamic Haskell libraries (if available) | static | -
`-framework` `name` | On Darwin/MacOS X only, link in the framework `name`. This option corresponds to the `-framework` option for Apple's Linker. | static | -
`-framework-path` `name` | On Darwin/MacOS X only, add `dir` to the list of directories searched for frameworks. This option corresponds to the `-F` option for Apple's Linker. | static | -
`-l` `lib` | Link in library `lib` | static | -
`-L` `dir` | Add `dir` to the list of directories searched for libraries | static | -
`-main-is` | Set main function | static | -
`-no-hs-main` | Don't assume this program contains `main` | static | -
`-no-link` | Omit linking | static | -
`-package` `name` | Link in package `name` | static | -
`-split-objs` | Split objects (for libraries) | static | -
`-static` | Use static Haskell libraries | static | -
`-threaded` | Use the threaded runtime | static | -
`-debug` | Use the debugging runtime | static | -

### 4.17.22. Replacing phases

Section 4.10.1, “Replacing the program for one or more phases”

Flag | Description | Static/Dynamic | Reverse
--- | --- | --- | ---
`-pgmL` `cmd` | Use `cmd` as the literate pre-processor | static | -
`-pgmP` `cmd` | Use `cmd` as the C pre-processor (with `-cpp` only) | static | -
`-pgmc` `cmd` | Use `cmd` as the C compiler | static | -
`-pgma` `cmd` | Use `cmd` as the assembler | static | -
`-pgml` `cmd` | Use `cmd` as the linker | static | -
`-pgmdll` `cmd` | Use `cmd` as the DLL generator | static | -
`-pgmdep` `cmd` | Use `cmd` as the dependency generator | static | -
`-pgmF` `cmd` | Use `cmd` as the pre-processor (with `-F` only) | static | -

### 4.17.23. Forcing options to particular phases

Section 4.10.2, “Forcing options to a particular phase”

Flag | Description | Static/Dynamic | Reverse
--- | --- | --- | ---
`-optL` `option` | pass `option` to the literate pre-processor | dynamic | -
`-optP` `option` | pass `option` to cpp (with `-cpp` only) | dynamic | -
`-optF` `option` | pass `option` to the custom pre-processor | dynamic | -
`-optc` `option` | pass `option` to the C compiler | dynamic | -
`-opta` `option` | pass `option` to the assembler | dynamic | -
`-optl` `option` | pass `option` to the linker | static | -
`-optdll` `option` | pass `option` to the DLL generator | static | -
`-optdep` `option` | pass `option` to the dependency generator | static | -

### 4.17.24. Platform-specific options

Section 4.13, “Platform-specific Flags”

Flag | Description | Static/Dynamic | Reverse
--- | --- | --- | ---
`-mv8` | (SPARC only) enable version 8 support | static | -
`-monly-[32]-regs` | (x86 only) give some registers back to the C compiler | dynamic | -

### 4.17.25. External core file options

Section 4.15, “Generating and compiling External Core Files”

Flag | Description | Static/Dynamic | Reverse
--- | --- | --- | ---
`-fext-core` | Generate `.hcr` external Core files | static | -

### 4.17.26. Compiler debugging options

Section 4.16, “Debugging the compiler”

Flag | Description | Static/Dynamic | Reverse
--- | --- | --- | ---
`-dcore-lint` | Turn on internal sanity checking | dynamic | -
`-ddump-absC` | Dump abstract C | dynamic | -
`-ddump-asm` | Dump assembly | dynamic | -
`-ddump-bcos` | Dump interpreter byte code | dynamic | -
`-ddump-cpranal` | Dump output from CPR analysis | dynamic | -
`-ddump-cse` | Dump CSE output | dynamic | -
`-ddump-deriv` | Dump deriving output | dynamic | -
`-ddump-ds` | Dump desugarer output | dynamic | -
`-ddump-flatC` | Dump “flat” C | dynamic | -
`-ddump-foreign` | Dump `foreign export` stubs | dynamic | -
`-ddump-inlinings` | Dump inlining info | dynamic | -
`-ddump-occur-anal` | Dump occurrence analysis output | dynamic | -
`-ddump-parsed` | Dump parse tree | dynamic | -
`-ddump-realC` | Dump “real” C | dynamic | -
`-ddump-rn` | Dump renamer output | dynamic | -
`-ddump-rules` | Dump rules | dynamic | -
`-ddump-sat` | Dump saturated output | dynamic | -
`-ddump-simpl` | Dump final simplifier output | dynamic | -
`-ddump-simpl-iterations` | Dump output from each simplifier iteration | dynamic | -
`-ddump-spec` | Dump specialiser output | dynamic | -
`-ddump-stg` | Dump final STG | dynamic | -
`-ddump-stranal` | Dump strictness analyser output | dynamic | -
`-ddump-tc` | Dump typechecker output | dynamic | -
`-ddump-types` | Dump type signatures | dynamic | -
`-ddump-usagesp` | Dump UsageSP analysis output | dynamic | -
`-ddump-worker-wrapper` | Dump worker-wrapper output | dynamic | -
`-ddump-rn-trace` | Trace renamer | dynamic | -
`-ddump-rn-stats` | Renamer stats | dynamic | -
`-ddump-stix` | Native code generator intermediate form | dynamic | -
`-ddump-simpl-stats` | Dump simplifier stats | dynamic | -
`-dppr-debug` | Turn on debug printing (more verbose) | static | -
`-dppr-noprags` | Don't output pragma info in dumps | static | -
`-dppr-user-length` | Set the depth for printing expressions in error msgs | static | -
`-dsource-stats` | Dump haskell source stats | dynamic | -
`-dstg-lint` | STG pass sanity checking | dynamic | -
`-dstg-stats` | Dump STG stats | dynamic | -
`-dusagesp-lint` | UsageSP sanity checker | dynamic | -
`-dverbose-core2core` | Show output from each core-to-core pass | dynamic | -
`-dverbose-stg2stg` | Show output from each STG-to-STG pass | dynamic | -
`-unreg` | Enable unregisterised compilation | static | -

### 4.17.27. Misc compiler options

Flag | Description | Static/Dynamic | Reverse
--- | --- | --- | ---
`-femit-extern-decls` | ??? | static | -
`-fglobalise-toplev-names` | Make all top-level names global (for `-split-objs`) | static | -
`-fno-hi-version-check` | Don't complain about `.hi` file mismatches | static | -
`-dno-black-holing` | Turn off black holing (probably doesn't work) | static | -
`-fno-method-sharing` | Don't share specialisations of overloaded functions | static | -
`-fno-prune-decls` | Renamer: don't prune declarations | static | -
`-fhistory-size` | Set simplification history size | static | -
`-funregisterised` | Unregisterised compilation (use `-unreg` instead) | static | -
`-fno-asm-mangling` | Turn off assembly mangling (use `-unreg` instead) | static | -

Prev | Up | Next
4.16. Debugging the compiler | Home | Chapter 5. Profiling