summaryrefslogtreecommitdiff
path: root/docs/users_guide/using.xml
diff options
context:
space:
mode:
Diffstat (limited to 'docs/users_guide/using.xml')
-rw-r--r--docs/users_guide/using.xml3648
1 files changed, 0 insertions, 3648 deletions
diff --git a/docs/users_guide/using.xml b/docs/users_guide/using.xml
deleted file mode 100644
index 797e78485f..0000000000
--- a/docs/users_guide/using.xml
+++ /dev/null
@@ -1,3648 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<chapter id="using-ghc">
- <title>Using GHC</title>
-
- <indexterm><primary>GHC, using</primary></indexterm>
- <indexterm><primary>using GHC</primary></indexterm>
-
- <sect1>
- <title>Getting started: compiling programs</title>
-
- <para>
- In this chapter you'll find a complete reference to the GHC
- command-line syntax, including all 400+ flags. It's a large and
- complex system, and there are lots of details, so it can be
- quite hard to figure out how to get started. With that in mind,
- this introductory section provides a quick introduction to the
- basic usage of GHC for compiling a Haskell program, before the
- following sections dive into the full syntax.
- </para>
-
- <para>
- Let's create a Hello World program, and compile and run it.
- First, create a file <filename>hello.hs</filename> containing
- the Haskell code:
- </para>
-
-<programlisting>
-main = putStrLn "Hello, World!"
-</programlisting>
-
- <para>To compile the program, use GHC like this:</para>
-
-<screen>
-$ ghc hello.hs
-</screen>
-
- <para>(where <literal>$</literal> represents the prompt: don't
- type it). GHC will compile the source
- file <filename>hello.hs</filename>, producing
- an <firstterm>object
- file</firstterm> <filename>hello.o</filename> and
- an <firstterm>interface
- file</firstterm> <filename>hello.hi</filename>, and then it
- will link the object file to the libraries that come with GHC
- to produce an executable called <filename>hello</filename> on
- Unix/Linux/Mac, or <filename>hello.exe</filename> on
- Windows.</para>
-
- <para>
- By default GHC will be very quiet about what it is doing, only
- printing error messages. If you want to see in more detail
- what's going on behind the scenes, add <option>-v</option> to
- the command line.
- </para>
-
- <para>
- Then we can run the program like this:
- </para>
-
-<screen>
-$ ./hello
-Hello World!
-</screen>
-
- <para>
- If your program contains multiple modules, then you only need to
- tell GHC the name of the source file containing
- the <filename>Main</filename> module, and GHC will examine
- the <literal>import</literal> declarations to find the other
- modules that make up the program and find their source files.
- This means that, with the exception of
- the <literal>Main</literal> module, every source file should be
- named after the module name that it contains (with dots replaced
- by directory separators). For example, the
- module <literal>Data.Person</literal> would be in the
- file <filename>Data/Person.hs</filename> on Unix/Linux/Mac,
- or <filename>Data\Person.hs</filename> on Windows.
- </para>
- </sect1>
-
- <sect1>
- <title>Options overview</title>
-
- <para>GHC's behaviour is controlled by
- <firstterm>options</firstterm>, which for historical reasons are
- also sometimes referred to as command-line flags or arguments.
- Options can be specified in three ways:</para>
-
- <sect2>
- <title>Command-line arguments</title>
-
- <indexterm><primary>structure, command-line</primary></indexterm>
- <indexterm><primary>command-line</primary><secondary>arguments</secondary></indexterm>
- <indexterm><primary>arguments</primary><secondary>command-line</secondary></indexterm>
-
- <para>An invocation of GHC takes the following form:</para>
-
-<screen>
-ghc [argument...]
-</screen>
-
- <para>Command-line arguments are either options or file names.</para>
-
- <para>Command-line options begin with <literal>-</literal>.
- They may <emphasis>not</emphasis> be grouped:
- <option>-vO</option> is different from <option>-v -O</option>.
- Options need not precede filenames: e.g., <literal>ghc *.o -o
- foo</literal>. All options are processed and then applied to
- all files; you cannot, for example, invoke <literal>ghc -c -O1
- Foo.hs -O2 Bar.hs</literal> to apply different optimisation
- levels to the files <filename>Foo.hs</filename> and
- <filename>Bar.hs</filename>.</para>
- </sect2>
-
- <sect2 id="source-file-options">
- <title>Command line options in source files</title>
-
- <indexterm><primary>source-file options</primary></indexterm>
-
- <para>Sometimes it is useful to make the connection between a
- source file and the command-line options it requires quite
- tight. For instance, if a Haskell source file deliberately
- uses name shadowing, it should be compiled with the
- <option>-fno-warn-name-shadowing</option> option. Rather than maintaining
- the list of per-file options in a <filename>Makefile</filename>,
- it is possible to do this directly in the source file using the
- <literal>OPTIONS_GHC</literal> pragma <indexterm><primary>OPTIONS_GHC
- pragma</primary></indexterm>:</para>
-
-<programlisting>
-{-# OPTIONS_GHC -fno-warn-name-shadowing #-}
-module X where
-...
-</programlisting>
-
- <para><literal>OPTIONS_GHC</literal> is a <emphasis>file-header pragma</emphasis>
- (see <xref linkend="pragmas"/>).</para>
-
- <para>Only <emphasis>dynamic</emphasis> flags can be used in an <literal>OPTIONS_GHC</literal> pragma
- (see <xref linkend="static-dynamic-flags"/>).</para>
-
- <para>Note that your command shell does not
- get to the source file options, they are just included literally
- in the array of command-line arguments the compiler
- maintains internally, so you'll be desperately disappointed if
- you try to glob etc. inside <literal>OPTIONS_GHC</literal>.</para>
-
- <para>NOTE: the contents of OPTIONS_GHC are appended to the
- command-line options, so options given in the source file
- override those given on the command-line.</para>
-
- <para>It is not recommended to move all the contents of your
- Makefiles into your source files, but in some circumstances, the
- <literal>OPTIONS_GHC</literal> pragma is the Right Thing. (If you
- use <option>-keep-hc-file</option> and have OPTION flags in
- your module, the OPTIONS_GHC will get put into the generated .hc
- file).</para>
- </sect2>
-
- <sect2>
- <title>Setting options in GHCi</title>
-
- <para>Options may also be modified from within GHCi, using the
- <literal>:set</literal> command. See <xref linkend="ghci-set"/>
- for more details.</para>
- </sect2>
- </sect1>
-
- <sect1 id="static-dynamic-flags">
- <title>Static, Dynamic, and Mode options</title>
- <indexterm><primary>static</primary><secondary>options</secondary>
- </indexterm>
- <indexterm><primary>dynamic</primary><secondary>options</secondary>
- </indexterm>
- <indexterm><primary>mode</primary><secondary>options</secondary>
- </indexterm>
-
- <para>Each of GHC's command line options is classified as
- <firstterm>static</firstterm>, <firstterm>dynamic</firstterm> or
- <firstterm>mode</firstterm>:</para>
-
- <variablelist>
- <varlistentry>
- <term>Mode flags</term>
- <listitem>
- <para>For example, <option>--make</option> or <option>-E</option>.
- There may only be a single mode flag on the command line. The
- available modes are listed in <xref linkend="modes"/>.</para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Dynamic Flags</term>
- <listitem>
- <para>Most non-mode flags fall into this category. A dynamic flag
- may be used on the command line, in a
- <literal>OPTIONS_GHC</literal> pragma in a source file, or set
- using <literal>:set</literal> in GHCi.</para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Static Flags</term>
- <listitem>
- <para>A few flags are "static", which means they can only be used on
- the command-line, and remain in force over the entire GHC/GHCi
- run.</para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <para>The flag reference tables (<xref
- linkend="flag-reference"/>) lists the status of each flag.</para>
-
- <para>There are a few flags that are static except that they can
- also be used with GHCi's <literal>:set</literal> command; these
- are listed as &ldquo;static/<literal>:set</literal>&rdquo; in the
- table.</para>
- </sect1>
-
- <sect1 id="file-suffixes">
- <title>Meaningful file suffixes</title>
-
- <indexterm><primary>suffixes, file</primary></indexterm>
- <indexterm><primary>file suffixes for GHC</primary></indexterm>
-
- <para>File names with &ldquo;meaningful&rdquo; suffixes (e.g.,
- <filename>.lhs</filename> or <filename>.o</filename>) cause the
- &ldquo;right thing&rdquo; to happen to those files.</para>
-
- <variablelist>
-
- <varlistentry>
- <term><filename>.hs</filename></term>
- <listitem>
- <para>A Haskell module.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <filename>.lhs</filename>
- <indexterm><primary><literal>lhs</literal> suffix</primary></indexterm>
- </term>
- <listitem>
- <para>A &ldquo;literate Haskell&rdquo; module.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><filename>.hspp</filename></term>
- <listitem>
- <para>A file created by the preprocessor.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><filename>.hi</filename></term>
- <listitem>
- <para>A Haskell interface file, probably
- compiler-generated.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><filename>.hc</filename></term>
- <listitem>
- <para>Intermediate C file produced by the Haskell
- compiler.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><filename>.c</filename></term>
- <listitem>
- <para>A C&nbsp;file not produced by the Haskell
- compiler.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><filename>.ll</filename></term>
- <listitem>
- <para>An llvm-intermediate-language source file, usually
- produced by the compiler.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><filename>.bc</filename></term>
- <listitem>
- <para>An llvm-intermediate-language bitcode file, usually
- produced by the compiler.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><filename>.s</filename></term>
- <listitem>
- <para>An assembly-language source file, usually produced by
- the compiler.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><filename>.o</filename></term>
- <listitem>
- <para>An object file, produced by an assembler.</para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <para>Files with other suffixes (or without suffixes) are passed
- straight to the linker.</para>
-
- </sect1>
-
- <sect1 id="modes">
- <title>Modes of operation</title>
- <indexterm><primary>help options</primary></indexterm>
-
- <para>
- GHC's behaviour is firstly controlled by a mode flag. Only one
- of these flags may be given, but it does not necessarily need to
- be the first option on the command-line.
- </para>
-
- <para>
- If no mode flag is present, then GHC will enter make mode
- (<xref linkend="make-mode" />) if there are any Haskell source
- files given on the command line, or else it will link the
- objects named on the command line to produce an executable.
- </para>
-
- <para>The available mode flags are:</para>
-
- <variablelist>
- <varlistentry>
- <term>
- <cmdsynopsis><command>ghc --interactive</command>
- </cmdsynopsis>
- <indexterm><primary>interactive mode</primary></indexterm>
- <indexterm><primary>ghci</primary></indexterm>
- </term>
- <listitem>
- <para>Interactive mode, which is also available as
- <command>ghci</command>. Interactive mode is described in
- more detail in <xref linkend="ghci"/>.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <cmdsynopsis><command>ghc --make</command>
- </cmdsynopsis>
- <indexterm><primary>make mode</primary></indexterm>
- <indexterm><primary><option>--make</option></primary></indexterm>
- </term>
- <listitem>
- <para>In this mode, GHC will build a multi-module Haskell
- program automatically, figuring out dependencies for itself.
- If you have a straightforward Haskell program, this is
- likely to be much easier, and faster, than using
- <command>make</command>. Make mode is described in <xref
- linkend="make-mode"/>.</para>
-
- <para>
- This mode is the default if there are any Haskell
- source files mentioned on the command line, and in this case
- the <option>--make</option> option can be omitted.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <cmdsynopsis><command>ghc -e</command>
- <arg choice='plain'><replaceable>expr</replaceable></arg>
- </cmdsynopsis>
- <indexterm><primary>eval mode</primary></indexterm>
- </term>
- <listitem>
- <para>Expression-evaluation mode. This is very similar to
- interactive mode, except that there is a single expression
- to evaluate (<replaceable>expr</replaceable>) which is given
- on the command line. See <xref linkend="eval-mode"/> for
- more details.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <cmdsynopsis>
- <command>ghc -E</command>
- <command>ghc -C</command>
- <command>ghc -S</command>
- <command>ghc -c</command>
- </cmdsynopsis>
- <indexterm><primary><option>-E</option></primary></indexterm>
- <indexterm><primary><option>-C</option></primary></indexterm>
- <indexterm><primary><option>-S</option></primary></indexterm>
- <indexterm><primary><option>-c</option></primary></indexterm>
- </term>
- <listitem>
- <para>This is the traditional batch-compiler mode, in which
- GHC can compile source files one at a time, or link objects
- together into an executable. See <xref
- linkend="options-order"/>.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <cmdsynopsis>
- <command>ghc -M</command>
- </cmdsynopsis>
- <indexterm><primary>dependency-generation mode</primary></indexterm>
- </term>
- <listitem>
- <para>Dependency-generation mode. In this mode, GHC can be
- used to generate dependency information suitable for use in
- a <literal>Makefile</literal>. See <xref
- linkend="makefile-dependencies"/>.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <cmdsynopsis>
- <command>ghc --mk-dll</command>
- </cmdsynopsis>
- <indexterm><primary>DLL-creation mode</primary></indexterm>
- </term>
- <listitem>
- <para>DLL-creation mode (Windows only). See <xref
- linkend="win32-dlls-create"/>.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <cmdsynopsis>
- <command>ghc --help</command> <command>ghc -?</command>
- </cmdsynopsis>
- <indexterm><primary><option>--help</option></primary></indexterm>
- </term>
- <listitem>
- <para>Cause GHC to spew a long usage message to standard
- output and then exit.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <cmdsynopsis>
- <command>ghc --show-iface <replaceable>file</replaceable></command>
- </cmdsynopsis>
- <indexterm><primary><option>--show-iface</option></primary></indexterm>
- </term>
- <listitem>
- <para>Read the interface in
- <replaceable>file</replaceable> and dump it as text to
- <literal>stdout</literal>. For example <literal>ghc --show-iface M.hi</literal>.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <cmdsynopsis>
- <command>ghc --supported-extensions</command>
- <command>ghc --supported-languages</command>
- </cmdsynopsis>
- <indexterm><primary><option>--supported-extensions</option></primary><primary><option>--supported-languages</option></primary></indexterm>
- </term>
- <listitem>
- <para>Print the supported language extensions.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <cmdsynopsis>
- <command>ghc --show-options</command>
- </cmdsynopsis>
- <indexterm><primary><option>--show-options</option></primary></indexterm>
- </term>
- <listitem>
- <para>Print the supported command line options. This flag can be used for autocompletion in a shell.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <cmdsynopsis>
- <command>ghc --info</command>
- </cmdsynopsis>
- <indexterm><primary><option>--info</option></primary></indexterm>
- </term>
- <listitem>
- <para>Print information about the compiler.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <cmdsynopsis>
- <command>ghc --version</command>
- <command>ghc -V</command>
- </cmdsynopsis>
- <indexterm><primary><option>-V</option></primary></indexterm>
- <indexterm><primary><option>--version</option></primary></indexterm>
- </term>
- <listitem>
- <para>Print a one-line string including GHC's version number.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <cmdsynopsis>
- <command>ghc --numeric-version</command>
- </cmdsynopsis>
- <indexterm><primary><option>--numeric-version</option></primary></indexterm>
- </term>
- <listitem>
- <para>Print GHC's numeric version number only.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <cmdsynopsis>
- <command>ghc --print-libdir</command>
- </cmdsynopsis>
- <indexterm><primary><option>--print-libdir</option></primary></indexterm>
- </term>
- <listitem>
- <para>Print the path to GHC's library directory. This is
- the top of the directory tree containing GHC's libraries,
- interfaces, and include files (usually something like
- <literal>/usr/local/lib/ghc-5.04</literal> on Unix). This
- is the value of
- <literal>$libdir</literal><indexterm><primary><literal>libdir</literal></primary></indexterm>
- in the package configuration file
- (see <xref linkend="packages"/>).</para>
- </listitem>
- </varlistentry>
-
- </variablelist>
-
- <sect2 id="make-mode">
- <title>Using <command>ghc</command> <option>--make</option></title>
- <indexterm><primary><option>--make</option></primary></indexterm>
- <indexterm><primary>separate compilation</primary></indexterm>
-
- <para>In this mode, GHC will build a multi-module Haskell program by following
- dependencies from one or more root modules (usually just
- <literal>Main</literal>). For example, if your
- <literal>Main</literal> module is in a file called
- <filename>Main.hs</filename>, you could compile and link the
- program like this:</para>
-
-<screen>
-ghc --make Main.hs
-</screen>
-
- <para>
- In fact, GHC enters make mode automatically if there are any
- Haskell source files on the command line and no other mode is
- specified, so in this case we could just type
- </para>
-
-<screen>
-ghc Main.hs
-</screen>
-
- <para>Any number of source file names or module names may be
- specified; GHC will figure out all the modules in the program by
- following the imports from these initial modules. It will then
- attempt to compile each module which is out of date, and
- finally, if there is a <literal>Main</literal> module, the
- program will also be linked into an executable.</para>
-
- <para>The main advantages to using <literal>ghc
- --make</literal> over traditional
- <literal>Makefile</literal>s are:</para>
-
- <itemizedlist>
- <listitem>
- <para>GHC doesn't have to be restarted for each compilation,
- which means it can cache information between compilations.
- Compiling a multi-module program with <literal>ghc
- --make</literal> can be up to twice as fast as
- running <literal>ghc</literal> individually on each source
- file.</para>
- </listitem>
- <listitem>
- <para>You don't have to write a <literal>Makefile</literal>.</para>
- <indexterm><primary><literal>Makefile</literal>s</primary><secondary>avoiding</secondary></indexterm>
- </listitem>
- <listitem>
- <para>GHC re-calculates the dependencies each time it is
- invoked, so the dependencies never get out of sync with the
- source.</para>
- </listitem>
- <listitem>
- <para>Using the <literal>-j</literal> flag, you can compile
- modules in parallel. Specify <literal>-jN</literal> to
- compile <replaceable>N</replaceable> jobs in parallel.</para>
- </listitem>
- </itemizedlist>
-
- <para>Any of the command-line options described in the rest of
- this chapter can be used with
- <option>--make</option>, but note that any options
- you give on the command line will apply to all the source files
- compiled, so if you want any options to apply to a single source
- file only, you'll need to use an <literal>OPTIONS_GHC</literal>
- pragma (see <xref linkend="source-file-options"/>).</para>
-
- <para>If the program needs to be linked with additional objects
- (say, some auxiliary C code), then the object files can be
- given on the command line and GHC will include them when linking
- the executable.</para>
-
- <para>For backward compatibility with existing make scripts, when
- used in combination with <option>-c</option>, the linking phase
- is omitted (same as <option>--make</option>
- <option>-no-link</option>).</para>
-
- <para>Note that GHC can only follow dependencies if it has the
- source file available, so if your program includes a module for
- which there is no source file, even if you have an object and an
- interface file for the module, then GHC will complain. The
- exception to this rule is for package modules, which may or may
- not have source files.</para>
-
- <para>The source files for the program don't all need to be in
- the same directory; the <option>-i</option> option can be used
- to add directories to the search path (see <xref
- linkend="search-path"/>).</para>
- </sect2>
-
- <sect2 id="eval-mode">
- <title>Expression evaluation mode</title>
-
- <para>This mode is very similar to interactive mode, except that
- there is a single expression to evaluate which is specified on
- the command line as an argument to the <option>-e</option>
- option:</para>
-
-<screen>
-ghc -e <replaceable>expr</replaceable>
-</screen>
-
- <para>Haskell source files may be named on the command line, and
- they will be loaded exactly as in interactive mode. The
- expression is evaluated in the context of the loaded
- modules.</para>
-
- <para>For example, to load and run a Haskell program containing
- a module <literal>Main</literal>, we might say</para>
-
-<screen>
-ghc -e Main.main Main.hs
-</screen>
-
- <para>or we can just use this mode to evaluate expressions in
- the context of the <literal>Prelude</literal>:</para>
-
-<screen>
-$ ghc -e "interact (unlines.map reverse.lines)"
-hello
-olleh
-</screen>
- </sect2>
-
- <sect2 id="options-order">
- <title>Batch compiler mode</title>
-
- <para>In <emphasis>batch mode</emphasis>, GHC will compile one or more source files
- given on the command line.</para>
-
- <para>The first phase to run is determined by each input-file
- suffix, and the last phase is determined by a flag. If no
- relevant flag is present, then go all the way through to linking.
- This table summarises:</para>
-
- <informaltable>
- <tgroup cols="4">
- <colspec align="left"/>
- <colspec align="left"/>
- <colspec align="left"/>
- <colspec align="left"/>
-
- <thead>
- <row>
- <entry>Phase of the compilation system</entry>
- <entry>Suffix saying &ldquo;start here&rdquo;</entry>
- <entry>Flag saying &ldquo;stop after&rdquo;</entry>
- <entry>(suffix of) output file</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>literate pre-processor</entry>
- <entry><literal>.lhs</literal></entry>
- <entry>-</entry>
- <entry><literal>.hs</literal></entry>
- </row>
-
- <row>
- <entry>C pre-processor (opt.) </entry>
- <entry><literal>.hs</literal> (with
- <option>-cpp</option>)</entry>
- <entry><option>-E</option></entry>
- <entry><literal>.hspp</literal></entry>
- </row>
-
- <row>
- <entry>Haskell compiler</entry>
- <entry><literal>.hs</literal></entry>
- <entry><option>-C</option>, <option>-S</option></entry>
- <entry><literal>.hc</literal>, <literal>.s</literal></entry>
- </row>
-
- <row>
- <entry>C compiler (opt.)</entry>
- <entry><literal>.hc</literal> or <literal>.c</literal></entry>
- <entry><option>-S</option></entry>
- <entry><literal>.s</literal></entry>
- </row>
-
- <row>
- <entry>assembler</entry>
- <entry><literal>.s</literal></entry>
- <entry><option>-c</option></entry>
- <entry><literal>.o</literal></entry>
- </row>
-
- <row>
- <entry>linker</entry>
- <entry><replaceable>other</replaceable></entry>
- <entry>-</entry>
- <entry><filename>a.out</filename></entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- <indexterm><primary><option>-C</option></primary></indexterm>
- <indexterm><primary><option>-E</option></primary></indexterm>
- <indexterm><primary><option>-S</option></primary></indexterm>
- <indexterm><primary><option>-c</option></primary></indexterm>
-
- <para>Thus, a common invocation would be: </para>
-
-<screen>
-ghc -c Foo.hs
-</screen>
-
- <para>to compile the Haskell source file
- <filename>Foo.hs</filename> to an object file
- <filename>Foo.o</filename>.</para>
-
- <para>Note: What the Haskell compiler proper produces depends on what
- backend code generator is used. See <xref linkend="code-generators"/>
- for more details.</para>
-
- <para>Note: C pre-processing is optional, the
- <option>-cpp</option><indexterm><primary><option>-cpp</option></primary></indexterm>
- flag turns it on. See <xref linkend="c-pre-processor"/> for more
- details.</para>
-
- <para>Note: The option <option>-E</option><indexterm><primary>-E
- option</primary></indexterm> runs just the pre-processing passes
- of the compiler, dumping the result in a file.</para>
-
- <para>Note: The option <option>-C</option> is only available when
- GHC is built in unregisterised mode. See <xref linkend="unreg"/>
- for more details.</para>
-
- <sect3 id="overriding-suffixes">
- <title>Overriding the default behaviour for a file</title>
-
- <para>As described above, the way in which a file is processed by GHC
- depends on its suffix. This behaviour can be overridden using the
- <option>-x</option> option:</para>
-
- <variablelist>
- <varlistentry>
- <term><option>-x</option> <replaceable>suffix</replaceable>
- <indexterm><primary><option>-x</option></primary>
- </indexterm></term>
- <listitem>
- <para>Causes all files following this option on the command
- line to be processed as if they had the suffix
- <replaceable>suffix</replaceable>. For example, to compile a
- Haskell module in the file <literal>M.my-hs</literal>,
- use <literal>ghc -c -x hs M.my-hs</literal>.</para>
- </listitem>
- </varlistentry>
- </variablelist>
- </sect3>
-
- </sect2>
- </sect1>
-
- <sect1 id="options-help">
- <title>Verbosity options</title>
-
- <indexterm><primary>verbosity options</primary></indexterm>
-
- <para>See also the <option>--help</option>, <option>--version</option>, <option>--numeric-version</option>,
- and <option>--print-libdir</option> modes in <xref linkend="modes"/>.</para>
- <variablelist>
- <varlistentry>
- <term>
- <option>-v</option>
- <indexterm><primary><option>-v</option></primary></indexterm>
- </term>
- <listitem>
- <para>The <option>-v</option> option makes GHC
- <emphasis>verbose</emphasis>: it reports its version number
- and shows (on stderr) exactly how it invokes each phase of
- the compilation system. Moreover, it passes the
- <option>-v</option> flag to most phases; each reports its
- version number (and possibly some other information).</para>
-
- <para>Please, oh please, use the <option>-v</option> option
- when reporting bugs! Knowing that you ran the right bits in
- the right order is always the first thing we want to
- verify.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-v</option><replaceable>n</replaceable>
- <indexterm><primary><option>-v</option></primary></indexterm>
- </term>
- <listitem>
- <para>To provide more control over the compiler's verbosity,
- the <option>-v</option> flag takes an optional numeric
- argument. Specifying <option>-v</option> on its own is
- equivalent to <option>-v3</option>, and the other levels
- have the following meanings:</para>
-
- <variablelist>
- <varlistentry>
- <term><option>-v0</option></term>
- <listitem>
- <para>Disable all non-essential messages (this is the
- default).</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-v1</option></term>
- <listitem>
- <para>Minimal verbosity: print one line per
- compilation (this is the default when
- <option>--make</option> or
- <option>--interactive</option> is on).</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-v2</option></term>
- <listitem>
- <para>Print the name of each compilation phase as it
- is executed. (equivalent to
- <option>-dshow-passes</option>).</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-v3</option></term>
- <listitem>
- <para>The same as <option>-v2</option>, except that in
- addition the full command line (if appropriate) for
- each compilation phase is also printed.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-v4</option></term>
- <listitem>
- <para>The same as <option>-v3</option> except that the
- intermediate program representation after each
- compilation phase is also printed (excluding
- preprocessed and C/assembly files).</para>
- </listitem>
- </varlistentry>
- </variablelist>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>--fprint-potential-instances</option>
- <indexterm><primary><option>-fprint-potential-instances</option></primary></indexterm>
- </term>
- <listitem>
- <para>When GHC can't find an instance for a class, it displays a short list of some
- in the instances it knows about. With this flag it prints <emphasis>all</emphasis>
- the instances it knows about.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fprint-explicit-foralls, -fprint-explicit-kinds, -fprint-unicode-syntax</option>
- <indexterm><primary><option>-fprint-explicit-foralls</option></primary></indexterm>
- <indexterm><primary><option>-fprint-explicit-kinds</option></primary></indexterm>
- <indexterm><primary><option>-fprint-unicode-syntax</option></primary></indexterm>
- </term>
- <listitem>
- <para>These three flags control the way in which GHC displays types, in error messages and in GHCi.
- Using <option>-fprint-explicit-foralls</option> makes GHC print explicit <literal>forall</literal>
- quantification at the top level of a type; normally this is suppressed. For example, in GHCi:
-<screen>
-ghci> let f x = x
-ghci> :t f
-f :: a -> a
-ghci> :set -fprint-explicit-foralls
-ghci> :t f
-f :: forall a. a -> a
-</screen>
-However, regardless of the flag setting, the quantifiers are printed under these circumstances:
-<itemizedlist>
-<listitem><para>For nested <literal>foralls</literal>, e.g.
-<screen>
-ghci> :t GHC.ST.runST
-GHC.ST.runST :: (forall s. GHC.ST.ST s a) -> a
-</screen>
-</para></listitem>
-<listitem><para>If any of the quantified type variables has a kind
-that mentions a kind variable, e.g.
-<screen>
-ghci> :i Data.Type.Equality.sym
-Data.Type.Equality.sym ::
- forall (k :: BOX) (a :: k) (b :: k).
- (a Data.Type.Equality.:~: b) -> b Data.Type.Equality.:~: a
- -- Defined in Data.Type.Equality
-</screen>
-</para></listitem>
-</itemizedlist>
- </para>
- <para>
- Using <option>-fprint-explicit-kinds</option> makes GHC print kind arguments
- in types, which are normally suppressed. This can be important when you are using kind polymorphism.
- For example:
-<screen>
-ghci> :set -XPolyKinds
-ghci> data T a = MkT
-ghci> :t MkT
-MkT :: forall (k :: BOX) (a :: k). T a
-ghci> :set -fprint-explicit-foralls
-ghci> :t MkT
-MkT :: forall (k :: BOX) (a :: k). T k a
-</screen>
- </para>
- <para>
- When <option>-fprint-unicode-syntax</option> is enabled, GHC prints type signatures using
- the unicode symbols from the <option>-XUnicodeSyntax</option> extension.
-<screen>
-ghci> :set -fprint-unicode-syntax
-ghci> :t (>>)
-(>>) :: &forall; (m :: * &rarr; *) a b. Monad m &rArr; m a &rarr; m b &rarr; m b
-</screen>
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fprint-expanded-synonyms</option>
- <indexterm><primary><option>-fprint-expanded-synonyms</option></primary></indexterm>
- </term>
- <listitem>
- <para>
- When enabled, GHC also prints type-synonym-expanded types in type
- errors.
-
- For example, with this type synonyms:
-
-<screen>
-type Foo = Int
-type Bar = Bool
-type MyBarST s = ST s Bar
-</screen>
-
- This error message:
-
-<screen>
-Couldn't match type 'Int' with 'Bool'
-Expected type: ST s Foo
- Actual type: MyBarST s
-</screen>
-
- Becomes this:
-
-<screen>
-Couldn't match type 'Int' with 'Bool'
-Expected type: ST s Foo
- Actual type: MyBarST s
-Type synonyms expanded:
-Expected type: ST s Int
- Actual type: ST s Bool
-</screen>
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-ferror-spans</option>
- <indexterm><primary><option>-ferror-spans</option></primary>
- </indexterm>
- </term>
- <listitem>
- <para>Causes GHC to emit the full source span of the
- syntactic entity relating to an error message. Normally, GHC
- emits the source location of the start of the syntactic
- entity only.</para>
-
- <para>For example:</para>
-
-<screen>
-test.hs:3:6: parse error on input `where'
-</screen>
-
- <para>becomes:</para>
-
-<screen>
-test296.hs:3:6-10: parse error on input `where'
-</screen>
-
- <para>And multi-line spans are possible too:</para>
-
-<screen>
-test.hs:(5,4)-(6,7):
- Conflicting definitions for `a'
- Bound at: test.hs:5:4
- test.hs:6:7
- In the binding group for: a, b, a
-</screen>
-
- <para>Note that line numbers start counting at one, but
- column numbers start at zero. This choice was made to
- follow existing convention (i.e. this is how Emacs does
- it).</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-H</option><replaceable>size</replaceable>
- <indexterm><primary><option>-H</option></primary></indexterm>
- </term>
- <listitem>
- <para>Set the minimum size of the heap to
- <replaceable>size</replaceable>.
- This option is equivalent to
- <literal>+RTS&nbsp;-H<replaceable>size</replaceable></literal>,
- see <xref linkend="rts-options-gc" />.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-Rghc-timing</option>
- <indexterm><primary><option>-Rghc-timing</option></primary></indexterm>
- </term>
- <listitem>
- <para>Prints a one-line summary of timing statistics for the
- GHC run. This option is equivalent to
- <literal>+RTS&nbsp;-tstderr</literal>, see <xref
- linkend="rts-options-gc" />.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- </sect1>
-
- &separate;
-
- <sect1 id="options-sanity">
- <title>Warnings and sanity-checking</title>
-
- <indexterm><primary>sanity-checking options</primary></indexterm>
- <indexterm><primary>warnings</primary></indexterm>
-
-
- <para>GHC has a number of options that select which types of
- non-fatal error messages, otherwise known as warnings, can be
- generated during compilation. By default, you get a standard set
- of warnings which are generally likely to indicate bugs in your
- program. These are:
- <option>-fwarn-overlapping-patterns</option>,
- <option>-fwarn-warnings-deprecations</option>,
- <option>-fwarn-deprecated-flags</option>,
- <option>-fwarn-unrecognised-pragmas</option>,
- <option>-fwarn-missed-specialisations</option>,
- <option>-fwarn-duplicate-constraints</option>,
- <option>-fwarn-duplicate-exports</option>,
- <option>-fwarn-overflowed-literals</option>,
- <option>-fwarn-empty-enumerations</option>,
- <option>-fwarn-missing-fields</option>,
- <option>-fwarn-missing-methods</option>,
- <option>-fwarn-wrong-do-bind</option>,
- <option>-fwarn-unsupported-calling-conventions</option>,
- <option>-fwarn-dodgy-foreign-imports</option>,
- <option>-fwarn-inline-rule-shadowing</option>,
- <option>-fwarn-unsupported-llvm-version</option>,
- <option>-fwarn-context-quantification</option>, and
- <option>-fwarn-tabs</option>.
- The following flags are simple ways to select standard
- &ldquo;packages&rdquo; of warnings:
- </para>
-
- <variablelist>
-
- <varlistentry>
- <term><option>-W</option>:</term>
- <listitem>
- <indexterm><primary>-W option</primary></indexterm>
- <para>Provides the standard warnings plus
- <option>-fwarn-unused-binds</option>,
- <option>-fwarn-unused-matches</option>,
- <option>-fwarn-unused-imports</option>,
- <option>-fwarn-incomplete-patterns</option>,
- <option>-fwarn-dodgy-exports</option>, and
- <option>-fwarn-dodgy-imports</option>.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-Wall</option>:</term>
- <listitem>
- <indexterm><primary><option>-Wall</option></primary></indexterm>
- <para>Turns on all warning options that indicate potentially
- suspicious code. The warnings that are
- <emphasis>not</emphasis> enabled by <option>-Wall</option>
- are
- <option>-fwarn-incomplete-uni-patterns</option>,
- <option>-fwarn-incomplete-record-updates</option>,
- <option>-fwarn-monomorphism-restriction</option>,
- <option>-fwarn-auto-orphans</option>,
- <option>-fwarn-implicit-prelude</option>,
- <option>-fwarn-missing-local-sigs</option>,
- <option>-fwarn-missing-exported-sigs</option>,
- <option>-fwarn-missing-import-lists</option> and
- <option>-fwarn-identities</option>.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-w</option>:</term>
- <listitem>
- <indexterm><primary><option>-w</option></primary></indexterm>
- <para>Turns off all warnings, including the standard ones and
- those that <literal>-Wall</literal> doesn't enable.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-Werror</option>:</term>
- <listitem>
- <indexterm><primary><option>-Werror</option></primary></indexterm>
- <para>Makes any warning into a fatal error. Useful so that you don't
- miss warnings when doing batch compilation. </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-Wwarn</option>:</term>
- <listitem>
- <indexterm><primary><option>-Wwarn</option></primary></indexterm>
- <para>Warnings are treated only as warnings, not as errors. This is
- the default, but can be useful to negate a
- <option>-Werror</option> flag.</para>
- </listitem>
- </varlistentry>
-
- </variablelist>
-
- <para>The full set of warning options is described below. To turn
- off any warning, simply give the corresponding
- <option>-fno-warn-...</option> option on the command line.</para>
-
- <variablelist>
-
- <varlistentry>
- <term><option>-fwarn-typed-holes</option>:</term>
- <listitem>
- <indexterm><primary><option>-fwarn-typed-holes</option></primary>
- </indexterm>
- <indexterm><primary>warnings</primary></indexterm>
- <para>
- Determines whether the compiler reports typed holes warnings. Has
- no effect unless typed holes errors are deferred until runtime.
- See <xref linkend="typed-holes"/> and <xref linkend="defer-type-errors"/>
- </para>
-
- <para>This warning is on by default.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fwarn-type-errors</option>:</term>
- <listitem>
- <indexterm><primary><option>-fwarn-type-errors</option></primary>
- </indexterm>
- <indexterm><primary>warnings</primary></indexterm>
- <para>Causes a warning to be reported when a type error is deferred
- until runtime. See <xref linkend="defer-type-errors"/></para>
- <para>This warning is on by default.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fdefer-type-errors</option>:</term>
- <listitem>
- <indexterm><primary><option>-fdefer-type-errors</option></primary>
- </indexterm>
- <indexterm><primary>warnings</primary></indexterm>
- <para>Defer as many type errors as possible until runtime.
- At compile time you get a warning (instead of an error). At
- runtime, if you use a value that depends on a type error, you
- get a runtime error; but you can run any type-correct parts of your code
- just fine. See <xref linkend="defer-type-errors"/></para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fdefer-typed-holes</option>:</term>
- <listitem>
- <indexterm><primary><option>-fdefer-typed-holes</option></primary>
- </indexterm>
- <indexterm><primary>warnings</primary></indexterm>
- <para>
- Defer typed holes errors until runtime. This will turn the errors
- produced by <link linked="typed-holes">typed holes</link> into
- warnings. Using a value that depends on a typed hole produces a
- runtime error, the same as <option>-fdefer-type-errors</option>
- (which implies this option). See <xref linkend="typed-holes"/>
- and <xref linkend="defer-type-errors"/>.
- </para>
- <para>
- Implied by <option>-fdefer-type-errors</option>. See also
- <option>-fwarn-typed-holes</option>.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fwarn-partial-type-signatures</option>:</term>
- <listitem>
- <indexterm><primary><option>-fwarn-partial-type-signatures</option></primary>
- </indexterm>
- <indexterm><primary>warnings</primary></indexterm>
- <para>
- Determines whether the compiler reports holes in partial type
- signatures as warnings. Has no effect unless
- <option>-XPartialTypeSignatures</option> is enabled, which
- controls whether errors should be generated for holes in types
- or not. See <xref linkend="partial-type-signatures"/>.
- </para>
-
- <para>This warning is on by default.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fhelpful-errors</option>:</term>
- <listitem>
- <indexterm><primary><option>-fhelpful-errors</option></primary>
- </indexterm>
- <indexterm><primary>warnings</primary></indexterm>
- <para>When a name or package is not found in scope, make
- suggestions for the name or package you might have meant instead.</para>
- <para>This option is on by default.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fwarn-unrecognised-pragmas</option>:</term>
- <listitem>
- <indexterm><primary><option>-fwarn-unrecognised-pragmas</option></primary>
- </indexterm>
- <indexterm><primary>warnings</primary></indexterm>
- <indexterm><primary>pragmas</primary></indexterm>
- <para>Causes a warning to be emitted when a
- pragma that GHC doesn't recognise is used. As well as pragmas
- that GHC itself uses, GHC also recognises pragmas known to be used
- by other tools, e.g. <literal>OPTIONS_HUGS</literal> and
- <literal>DERIVE</literal>.</para>
-
- <para>This option is on by default.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fwarn-missed-specialisations</option>, <option>-fwarn-all-missed-specialisations</option>:</term>
- <listitem>
- <indexterm><primary><option>-fwarn-missed-specialisations</option></primary></indexterm>
- <indexterm><primary><option>-fwarn-all-missed-specialisations</option></primary></indexterm>
- <indexterm><primary>warnings</primary></indexterm>
- <indexterm><primary>pragmas</primary></indexterm>
- <para>Emits a warning if GHC cannot specialise a function that is
- imported and overloaded, usually because the function needs an
- <literal>INLINEABLE</literal> pragma.. The "all" form reports all
- such situations. The "non-all" form only reports when the situation
- arises during specialisation of an imported function; presumably teh latter
- was marked <literal>INLINEABLE</literal> so that it would specialise
- but if it, in turn, calls other functions that are not specialised
- you won't get the performance boost you expect.</para>
-
- <para><option>-fwarn-missed-specialisations</option> is on by default;
- <option>-fwarn-all-missed-specialisations</option> is implied by <option>-Wall</option>.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fwarn-warnings-deprecations</option>:</term>
- <listitem>
- <indexterm><primary><option>-fwarn-warnings-deprecations</option></primary>
- </indexterm>
- <indexterm><primary>warnings</primary></indexterm>
- <indexterm><primary>deprecations</primary></indexterm>
- <para>Causes a warning to be emitted when a
- module, function or type with a WARNING or DEPRECATED pragma
- is used. See <xref linkend="warning-deprecated-pragma"/> for more
- details on the pragmas.</para>
-
- <para>This option is on by default.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fwarn-amp</option>:</term>
- <listitem>
- <indexterm><primary><option>-fwarn-amp</option></primary>
- </indexterm>
- <indexterm><primary>amp</primary></indexterm>
- <indexterm><primary>applicative-monad proposal</primary></indexterm>
- <para>Causes a warning to be emitted when a definition
- is in conflict with the AMP (Applicative-Monad proosal),
- namely:
- 1. Instance of Monad without Applicative;
- 2. Instance of MonadPlus without Alternative;
- 3. Custom definitions of join/pure/&lt;*&gt;</para>
-
- <para>This option is on by default.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fwarn-deprecated-flags</option>:</term>
- <listitem>
- <indexterm><primary><option>-fwarn-deprecated-flags</option></primary>
- </indexterm>
- <indexterm><primary>deprecated-flags</primary></indexterm>
- <para>Causes a warning to be emitted when a deprecated
- command-line flag is used.</para>
-
- <para>This option is on by default.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fwarn-unsupported-calling-conventions</option>:</term>
- <listitem>
- <indexterm><primary><option>-fwarn-unsupported-calling-conventions</option></primary>
- </indexterm>
- <para>Causes a warning to be emitted for foreign declarations
- that use unsupported calling conventions. In particular,
- if the <literal>stdcall</literal> calling convention is used
- on an architecture other than i386 then it will be treated
- as <literal>ccall</literal>.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fwarn-dodgy-foreign-imports</option>:</term>
- <listitem>
- <indexterm><primary><option>-fwarn-dodgy-foreign-imports</option></primary>
- </indexterm>
- <para>Causes a warning to be emitted for foreign imports of
- the following form:</para>
-
-<programlisting>
-foreign import "f" f :: FunPtr t
-</programlisting>
-
- <para>on the grounds that it probably should be</para>
-
-<programlisting>
-foreign import "&amp;f" f :: FunPtr t
-</programlisting>
-
- <para>The first form declares that `f` is a (pure) C
- function that takes no arguments and returns a pointer to a
- C function with type `t`, whereas the second form declares
- that `f` itself is a C function with type `t`. The first
- declaration is usually a mistake, and one that is hard to
- debug because it results in a crash, hence this
- warning.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fwarn-dodgy-exports</option>:</term>
- <listitem>
- <indexterm><primary><option>-fwarn-dodgy-exports</option></primary>
- </indexterm>
- <para>Causes a warning to be emitted when a datatype
- <literal>T</literal> is exported
- with all constructors, i.e. <literal>T(..)</literal>, but is it
- just a type synonym.</para>
- <para>Also causes a warning to be emitted when a module is
- re-exported, but that module exports nothing.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fwarn-dodgy-imports</option>:</term>
- <listitem>
- <indexterm><primary><option>-fwarn-dodgy-imports</option></primary>
- </indexterm>
- <para>Causes a warning to be emitted in the following cases:</para>
- <itemizedlist>
- <listitem>
- <para>When a datatype <literal>T</literal> is imported with all
- constructors, i.e. <literal>T(..)</literal>, but has been
- exported abstractly, i.e. <literal>T</literal>.
- </para>
- </listitem>
- <listitem>
- <para>When an <literal>import</literal> statement hides an
- entity that is not exported.</para>
- </listitem>
- </itemizedlist>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fwarn-overflowed-literals</option>:</term>
- <listitem>
- <indexterm><primary><option>-fwarn-overflowed-literals</option></primary>
- </indexterm>
- <para>
- Causes a warning to be emitted if a literal will overflow,
- e.g. <literal>300 :: Word8</literal>.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fwarn-empty-enumerations</option>:</term>
- <listitem>
- <indexterm><primary><option>-fwarn-empty-enumerations</option></primary>
- </indexterm>
- <para>
- Causes a warning to be emitted if an enumeration is
- empty, e.g. <literal>[5 .. 3]</literal>.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fwarn-lazy-unlifted-bindings</option>:</term>
- <listitem>
- <indexterm><primary><option>-fwarn-lazy-unlifted-bindings</option></primary>
- </indexterm>
- <para>This flag is a no-op, and will be removed in GHC 7.10.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fwarn-duplicate-constraints</option>:</term>
- <listitem>
- <indexterm><primary><option>-fwarn-duplicate-constraints</option></primary></indexterm>
- <indexterm><primary>duplicate constraints, warning</primary></indexterm>
-
- <para>Have the compiler warn about duplicate constraints in a type signature. For
- example
- <programlisting>
- f :: (Eq a, Show a, Eq a) => a -> a
- </programlisting>
- The warning will indicate the duplicated <literal>Eq a</literal> constraint.
- </para>
-
- <para>This option is now deprecated in favour of <option>-fwarn-redundant-constraints</option>.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fwarn-redundant-constraints</option>:</term>
- <listitem>
- <indexterm><primary><option>-fwarn-redundant-constraints</option></primary></indexterm>
- <indexterm><primary>redundant constraints, warning</primary></indexterm>
-
- <para>Have the compiler warn about redundant constraints in a type signature.
- In particular:
- <itemizedlist>
- <listitem><para>
- A redundant constraint within the type signature itself:
- <programlisting>
- f :: (Eq a, Ord a) => a -> a
- </programlisting>
- The warning will indicate the redundant <literal>Eq a</literal> constraint:
- it is subsumed by the <literal>Ord a</literal> constraint.
- </para></listitem>
- <listitem><para>
- A constraint in the type signature is not used in the code it covers:
- <programlisting>
- f :: Eq a => a -> a -> Bool
- f x y = True
- </programlisting>
- The warning will indicate the redundant <literal>Eq a</literal> constraint:
- : it is not used by the definition of <literal>f</literal>.)
- </para></listitem>
- </itemizedlist>
- Similar warnings are given for a redundant constraint in an instance declaration.
- </para>
- <para>This option is on by default. As usual you can suppress it on a per-module basis
- with <option>-fno-warn-redundant-constraints</option>. Occasionally you may specifically
- want a function to have a more constrained signature than necessary, perhaps to
- leave yourself wiggle-room for changing the implementation without changing the
- API. In that case, you can suppress the warning on a per-function basis, using a
- call in a dead binding. For example:
- <programlisting>
- f :: Eq a => a -> a -> Bool
- f x y = True
- where
- _ = x == x -- Suppress the redundant-constraint warning for (Eq a)
- </programlisting>
- Here the call to <literal>(==)</literal> makes GHC think that the <literal>(Eq a)</literal>
- constraint is needed, so no warning is issued.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fwarn-duplicate-exports</option>:</term>
- <listitem>
- <indexterm><primary><option>-fwarn-duplicate-exports</option></primary></indexterm>
- <indexterm><primary>duplicate exports, warning</primary></indexterm>
- <indexterm><primary>export lists, duplicates</primary></indexterm>
-
- <para>Have the compiler warn about duplicate entries in
- export lists. This is useful information if you maintain
- large export lists, and want to avoid the continued export
- of a definition after you've deleted (one) mention of it in
- the export list.</para>
-
- <para>This option is on by default.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fwarn-hi-shadowing</option>:</term>
- <listitem>
- <indexterm><primary><option>-fwarn-hi-shadowing</option></primary></indexterm>
- <indexterm><primary>shadowing</primary>
- <secondary>interface files</secondary></indexterm>
-
- <para>Causes the compiler to emit a warning when a module or
- interface file in the current directory is shadowing one
- with the same module name in a library or other
- directory.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fwarn-identities</option>:</term>
- <listitem>
- <indexterm><primary><option>-fwarn-identities</option></primary></indexterm>
- <para>Causes the compiler to emit a warning when a Prelude numeric
- conversion converts a type T to the same type T; such calls
- are probably no-ops and can be omitted. The functions checked for
- are: <literal>toInteger</literal>,
- <literal>toRational</literal>,
- <literal>fromIntegral</literal>,
- and <literal>realToFrac</literal>.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fwarn-implicit-prelude</option>:</term>
- <listitem>
- <indexterm><primary><option>-fwarn-implicit-prelude</option></primary></indexterm>
- <indexterm><primary>implicit prelude, warning</primary></indexterm>
- <para>Have the compiler warn if the Prelude is implicitly
- imported. This happens unless either the Prelude module is
- explicitly imported with an <literal>import ... Prelude ...</literal>
- line, or this implicit import is disabled (either by
- <option>-XNoImplicitPrelude</option> or a
- <literal>LANGUAGE NoImplicitPrelude</literal> pragma).</para>
-
- <para>Note that no warning is given for syntax that implicitly
- refers to the Prelude, even if <option>-XNoImplicitPrelude</option>
- would change whether it refers to the Prelude.
- For example, no warning is given when
- <literal>368</literal> means
- <literal>Prelude.fromInteger (368::Prelude.Integer)</literal>
- (where <literal>Prelude</literal> refers to the actual Prelude module,
- regardless of the imports of the module being compiled).</para>
-
- <para>This warning is off by default.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fwarn-incomplete-patterns</option>,
- <option>-fwarn-incomplete-uni-patterns</option>:
- </term>
- <listitem>
- <indexterm><primary><option>-fwarn-incomplete-patterns</option></primary></indexterm>
- <indexterm><primary><option>-fwarn-incomplete-uni-patterns</option></primary></indexterm>
- <indexterm><primary>incomplete patterns, warning</primary></indexterm>
- <indexterm><primary>patterns, incomplete</primary></indexterm>
-
- <para>The option <option>-fwarn-incomplete-patterns</option> warns
- about places where
- a pattern-match might fail at runtime.
- The function
- <function>g</function> below will fail when applied to
- non-empty lists, so the compiler will emit a warning about
- this when <option>-fwarn-incomplete-patterns</option> is
- enabled.
-
-<programlisting>
-g [] = 2
-</programlisting>
-
- This option isn't enabled by default because it can be
- a bit noisy, and it doesn't always indicate a bug in the
- program. However, it's generally considered good practice
- to cover all the cases in your functions, and it is switched
- on by <option>-W</option>.</para>
-
- <para>The flag <option>-fwarn-incomplete-uni-patterns</option> is
- similar, except that it
- applies only to lambda-expressions and pattern bindings, constructs
- that only allow a single pattern:
-
-<programlisting>
-h = \[] -> 2
-Just k = f y
-</programlisting>
-
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fwarn-incomplete-record-updates</option>:</term>
- <listitem>
- <indexterm><primary><option>-fwarn-incomplete-record-updates</option></primary></indexterm>
- <indexterm><primary>incomplete record updates, warning</primary></indexterm>
- <indexterm><primary>record updates, incomplete</primary></indexterm>
-
- <para>The function
- <function>f</function> below will fail when applied to
- <literal>Bar</literal>, so the compiler will emit a warning about
- this when <option>-fwarn-incomplete-record-updates</option> is
- enabled.</para>
-
-<programlisting>
-data Foo = Foo { x :: Int }
- | Bar
-
-f :: Foo -> Foo
-f foo = foo { x = 6 }
-</programlisting>
-
- <para>This option isn't enabled by default because it can be
- very noisy, and it often doesn't indicate a bug in the
- program.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fwarn-missing-fields</option>:
- <indexterm><primary><option>-fwarn-missing-fields</option></primary></indexterm>
- <indexterm><primary>missing fields, warning</primary></indexterm>
- <indexterm><primary>fields, missing</primary></indexterm>
- </term>
- <listitem>
-
- <para>This option is on by default, and warns you whenever
- the construction of a labelled field constructor isn't
- complete, missing initialisers for one or more fields. While
- not an error (the missing fields are initialised with
- bottoms), it is often an indication of a programmer error.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fwarn-missing-import-lists</option>:
- <indexterm><primary><option>-fwarn-import-lists</option></primary></indexterm>
- <indexterm><primary>missing import lists, warning</primary></indexterm>
- <indexterm><primary>import lists, missing</primary></indexterm>
- </term>
- <listitem>
-
- <para>This flag warns if you use an unqualified
- <literal>import</literal> declaration
- that does not explicitly list the entities brought into scope. For
- example
- </para>
-
-<programlisting>
-module M where
- import X( f )
- import Y
- import qualified Z
- p x = f x x
-</programlisting>
-
- <para>
- The <option>-fwarn-import-lists</option> flag will warn about the import
- of <literal>Y</literal> but not <literal>X</literal>
- If module <literal>Y</literal> is later changed to export (say) <literal>f</literal>,
- then the reference to <literal>f</literal> in <literal>M</literal> will become
- ambiguous. No warning is produced for the import of <literal>Z</literal>
- because extending <literal>Z</literal>'s exports would be unlikely to produce
- ambiguity in <literal>M</literal>.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fwarn-missing-methods</option>:</term>
- <listitem>
- <indexterm><primary><option>-fwarn-missing-methods</option></primary></indexterm>
- <indexterm><primary>missing methods, warning</primary></indexterm>
- <indexterm><primary>methods, missing</primary></indexterm>
-
- <para>This option is on by default, and warns you whenever
- an instance declaration is missing one or more methods, and
- the corresponding class declaration has no default
- declaration for them.</para>
- <para>The warning is suppressed if the method name
- begins with an underscore. Here's an example where this is useful:
- <programlisting>
- class C a where
- _simpleFn :: a -> String
- complexFn :: a -> a -> String
- complexFn x y = ... _simpleFn ...
- </programlisting>
- The idea is that: (a) users of the class will only call <literal>complexFn</literal>;
- never <literal>_simpleFn</literal>; and (b)
- instance declarations can define either <literal>complexFn</literal> or <literal>_simpleFn</literal>.
- </para>
- <para>The MINIMAL pragma can be used to change which combination of methods will be required for instances of a particular class. See <xref linkend="minimal-pragma"/>.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fwarn-missing-signatures</option>:</term>
- <listitem>
- <indexterm><primary><option>-fwarn-missing-signatures</option></primary></indexterm>
- <indexterm><primary>type signatures, missing</primary></indexterm>
-
- <para>If you would like GHC to check that every top-level
- function/value has a type signature, use the
- <option>-fwarn-missing-signatures</option> option. As part of
- the warning GHC also reports the inferred type. The
- option is off by default.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fwarn-missing-exported-sigs</option>:</term>
- <listitem>
- <indexterm><primary><option>-fwarn-missing-exported-sigs</option></primary></indexterm>
- <indexterm><primary>type signatures, missing</primary></indexterm>
-
- <para>If you would like GHC to check that every exported top-level
- function/value has a type signature, but not check unexported values, use the
- <option>-fwarn-missing-exported-sigs</option> option. This option
- takes precedence over <option>-fwarn-missing-signatures</option>.
- As part of the warning GHC also reports the inferred type. The
- option is off by default.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fwarn-missing-local-sigs</option>:</term>
- <listitem>
- <indexterm><primary><option>-fwarn-missing-local-sigs</option></primary></indexterm>
- <indexterm><primary>type signatures, missing</primary></indexterm>
-
- <para>If you use the
- <option>-fwarn-missing-local-sigs</option> flag GHC will warn
- you about any polymorphic local bindings. As part of
- the warning GHC also reports the inferred type. The
- option is off by default.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fwarn-name-shadowing</option>:</term>
- <listitem>
- <indexterm><primary><option>-fwarn-name-shadowing</option></primary></indexterm>
- <indexterm><primary>shadowing, warning</primary></indexterm>
-
- <para>This option causes a warning to be emitted whenever an
- inner-scope value has the same name as an outer-scope value,
- i.e. the inner value shadows the outer one. This can catch
- typographical errors that turn into hard-to-find bugs, e.g.,
- in the inadvertent capture of what would be a recursive call in
- <literal>f = ... let f = id in ... f ...</literal>.</para>
- <para>The warning is suppressed for names beginning with an underscore. For example
- <programlisting>
- f x = do { _ignore &lt;- this; _ignore &lt;- that; return (the other) }
- </programlisting>
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fwarn-orphans, -fwarn-auto-orphans</option>:</term>
- <listitem>
- <indexterm><primary><option>-fwarn-orphans</option></primary></indexterm>
- <indexterm><primary><option>-fwarn-auto-orphans</option></primary></indexterm>
- <indexterm><primary>orphan instances, warning</primary></indexterm>
- <indexterm><primary>orphan rules, warning</primary></indexterm>
-
- <para>These flags cause a warning to be emitted whenever the
- module contains an "orphan" instance declaration or rewrite rule.
- An instance declaration is an orphan if it appears in a module in
- which neither the class nor the type being instanced are declared
- in the same module. A rule is an orphan if it is a rule for a
- function declared in another module. A module containing any
- orphans is called an orphan module.</para>
- <para>The trouble with orphans is that GHC must pro-actively read the interface
- files for all orphan modules, just in case their instances or rules
- play a role, whether or not the module's interface would otherwise
- be of any use. See <xref linkend="orphan-modules"/> for details.
- </para>
- <para>The flag <option>-fwarn-orphans</option> warns about user-written
- orphan rules or instances. The flag <option>-fwarn-auto-orphans</option>
- warns about automatically-generated orphan rules, notably as a result of
- specialising functions, for type classes (<literal>Specialise</literal>)
- or argument values (<literal>-fspec-constr</literal>).</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fwarn-overlapping-patterns</option>:
- <indexterm><primary><option>-fwarn-overlapping-patterns</option></primary></indexterm>
- <indexterm><primary>overlapping patterns, warning</primary></indexterm>
- <indexterm><primary>patterns, overlapping</primary></indexterm>
- </term>
- <listitem>
- <para>By default, the compiler will warn you if a set of
- patterns are overlapping, e.g.,</para>
-
-<programlisting>
-f :: String -&#62; Int
-f [] = 0
-f (_:xs) = 1
-f "2" = 2
-</programlisting>
-
- <para>where the last pattern match in <function>f</function>
- won't ever be reached, as the second pattern overlaps
- it. More often than not, redundant patterns is a programmer
- mistake/error, so this option is enabled by default.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fwarn-tabs</option>:</term>
- <listitem>
- <indexterm><primary><option>-fwarn-tabs</option></primary></indexterm>
- <indexterm><primary>tabs, warning</primary></indexterm>
- <para>Have the compiler warn if there are tabs in your source
- file.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fwarn-type-defaults</option>:</term>
- <listitem>
- <indexterm><primary><option>-fwarn-type-defaults</option></primary></indexterm>
- <indexterm><primary>defaulting mechanism, warning</primary></indexterm>
- <para>Have the compiler warn/inform you where in your source
- the Haskell defaulting mechanism for numeric types kicks
- in. This is useful information when converting code from a
- context that assumed one default into one with another,
- e.g., the &lsquo;default default&rsquo; for Haskell 1.4 caused the
- otherwise unconstrained value <constant>1</constant> to be
- given the type <literal>Int</literal>, whereas Haskell 98
- and later
- defaults it to <literal>Integer</literal>. This may lead to
- differences in performance and behaviour, hence the
- usefulness of being non-silent about this.</para>
-
- <para>This warning is off by default.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fwarn-monomorphism-restriction</option>:</term>
- <listitem>
- <indexterm><primary><option>-fwarn-monomorphism-restriction</option></primary></indexterm>
- <indexterm><primary>monomorphism restriction, warning</primary></indexterm>
- <para>Have the compiler warn/inform you where in your source
- the Haskell Monomorphism Restriction is applied. If applied silently
- the MR can give rise to unexpected behaviour, so it can be helpful
- to have an explicit warning that it is being applied.</para>
-
- <para>This warning is off by default.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fwarn-unticked-promoted-constructors</option>:</term>
- <listitem>
- <indexterm><primary><option>-fwarn-unticked-promoted-constructors</option></primary></indexterm>
- <indexterm><primary>promoted constructor, warning</primary></indexterm>
- <para>Warn if a promoted data constructor is used without a tick preceding it's name.
- </para>
- <para>For example:
- </para>
-<programlisting>
-data Nat = Succ Nat | Zero
-
-data Vec n s where
- Nil :: Vec Zero a
- Cons :: a -> Vec n a -> Vec (Succ n) a
-</programlisting>
- <para> Will raise two warnings because <function>Zero</function>
- and <function>Succ</function> are not written as <function>'Zero</function> and
- <function>'Succ</function>.
- </para>
- <para>This warning is is enabled by default in <literal>-Wall</literal> mode.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fwarn-unused-binds</option>:</term>
- <listitem>
- <indexterm><primary><option>-fwarn-unused-binds</option></primary></indexterm>
- <indexterm><primary>unused binds, warning</primary></indexterm>
- <indexterm><primary>binds, unused</primary></indexterm>
- <para>Report any function definitions (and local bindings) which are unused. An alias for
- <itemizedlist>
- <listitem><option>-fwarn-unused-top-binds</option></listitem>
- <listitem><option>-fwarn-unused-local-binds</option></listitem>
- <listitem><option>-fwarn-unused-pattern-binds</option></listitem>
- </itemizedlist>
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fwarn-unused-top-binds</option>:</term>
- <listitem>
- <indexterm><primary><option>-fwarn-unused-top-binds</option></primary></indexterm>
- <indexterm><primary>unused binds, warning</primary></indexterm>
- <indexterm><primary>binds, unused</primary></indexterm>
- <para>Report any function definitions which are unused.</para>
-
- <para>More precisely, warn if a binding brings into scope a variable that is not used,
- except if the variable's name starts with an underscore. The "starts-with-underscore"
- condition provides a way to selectively disable the warning.
- </para>
- <para>
- A variable is regarded as "used" if
- <itemizedlist>
- <listitem><para>It is exported, or</para></listitem>
- <listitem><para>It appears in the right hand side of a binding that binds at
- least one used variable that is used</para></listitem>
- </itemizedlist>
- For example
- <programlisting>
-module A (f) where
-f = let (p,q) = rhs1 in t p -- No warning: q is unused, but is locally bound
-t = rhs3 -- No warning: f is used, and hence so is t
-g = h x -- Warning: g unused
-h = rhs2 -- Warning: h is only used in the right-hand side of another unused binding
-_w = True -- No warning: _w starts with an underscore
- </programlisting>
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fwarn-unused-local-binds</option>:</term>
- <listitem>
- <indexterm><primary><option>-fwarn-unused-local-binds</option></primary></indexterm>
- <indexterm><primary>unused binds, warning</primary></indexterm>
- <indexterm><primary>binds, unused</primary></indexterm>
- <para>Report any local definitions which are unused. For example
- <programlisting>
-module A (f) where
-f = let (p,q) = rhs1 in t p -- Warning: q is unused
-g = h x -- No warning: g is unused, but is a top-level binding
- </programlisting>
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fwarn-unused-pattern-binds</option>:</term>
- <listitem>
- <indexterm><primary><option>-fwarn-unused-pattern-binds</option></primary></indexterm>
- <indexterm><primary>unused binds, warning</primary></indexterm>
- <indexterm><primary>binds, unused</primary></indexterm>
- <para>
- Warn if a pattern binding binds no variables at all, unless it is a lone, possibly-banged, wild-card pattern.
- For example:
- <programlisting>
-Just _ = rhs3 -- Warning: unused pattern binding
-(_, _) = rhs4 -- Warning: unused pattern binding
-_ = rhs3 -- No warning: lone wild-card pattern
-!_ = rhs4 -- No warning: banged wild-card pattern; behaves like seq
- </programlisting>
- The motivation for allowing lone wild-card patterns is they
- are not very different from <literal>_v = rhs3</literal>,
- which elicits no warning; and they can be useful to add a type
- constraint, e.g. <literal>_ = x::Int</literal>. A lone
- banged wild-card pattern is useful as an alternative
- (to <literal>seq</literal>) way to force evaluation.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fwarn-unused-imports</option>:</term>
- <listitem>
- <indexterm><primary><option>-fwarn-unused-imports</option></primary></indexterm>
- <indexterm><primary>unused imports, warning</primary></indexterm>
- <indexterm><primary>imports, unused</primary></indexterm>
-
- <para>Report any modules that are explicitly imported but
- never used. However, the form <literal>import M()</literal> is
- never reported as an unused import, because it is a useful idiom
- for importing instance declarations, which are anonymous in Haskell.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fwarn-unused-matches</option>:</term>
- <listitem>
- <indexterm><primary><option>-fwarn-unused-matches</option></primary></indexterm>
- <indexterm><primary>unused matches, warning</primary></indexterm>
- <indexterm><primary>matches, unused</primary></indexterm>
-
- <para>Report all unused variables which arise from pattern
- matches, including patterns consisting of a single variable.
- For instance <literal>f x y = []</literal> would report
- <varname>x</varname> and <varname>y</varname> as unused. The
- warning is suppressed if the variable name begins with an underscore, thus:
- <programlisting>
- f _x = True
- </programlisting>
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fwarn-unused-do-bind</option>:</term>
- <listitem>
- <indexterm><primary><option>-fwarn-unused-do-bind</option></primary></indexterm>
- <indexterm><primary>unused do binding, warning</primary></indexterm>
- <indexterm><primary>do binding, unused</primary></indexterm>
-
- <para>Report expressions occurring in <literal>do</literal> and <literal>mdo</literal> blocks
- that appear to silently throw information away.
- For instance <literal>do { mapM popInt xs ; return 10 }</literal> would report
- the first statement in the <literal>do</literal> block as suspicious,
- as it has the type <literal>StackM [Int]</literal> and not <literal>StackM ()</literal>, but that
- <literal>[Int]</literal> value is not bound to anything. The warning is suppressed by
- explicitly mentioning in the source code that your program is throwing something away:
- <programlisting>
- do { _ &lt;- mapM popInt xs ; return 10 }
- </programlisting>
- Of course, in this particular situation you can do even better:
- <programlisting>
- do { mapM_ popInt xs ; return 10 }
- </programlisting>
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fwarn-context-quantification</option>:</term>
- <listitem>
- <indexterm><primary><option>-fwarn-context-quantification</option></primary></indexterm>
- <indexterm><primary>implicit context quantification, warning</primary></indexterm>
- <indexterm><primary>context, implicit quantification</primary></indexterm>
-
- <para>Report if a variable is quantified only due to its presence
- in a context (see <xref linkend="universal-quantification"/>). For example,
- <programlisting>
- type T a = Monad m => a -> f a
- </programlisting>
- It is recommended to write this polymorphic type as
- <programlisting>
- type T a = forall m. Monad m => a -> f a
- </programlisting>
- instead.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fwarn-wrong-do-bind</option>:</term>
- <listitem>
- <indexterm><primary><option>-fwarn-wrong-do-bind</option></primary></indexterm>
- <indexterm><primary>apparently erroneous do binding, warning</primary></indexterm>
- <indexterm><primary>do binding, apparently erroneous</primary></indexterm>
-
- <para>Report expressions occurring in <literal>do</literal> and <literal>mdo</literal> blocks
- that appear to lack a binding.
- For instance <literal>do { return (popInt 10) ; return 10 }</literal> would report
- the first statement in the <literal>do</literal> block as suspicious,
- as it has the type <literal>StackM (StackM Int)</literal> (which consists of two nested applications
- of the same monad constructor), but which is not then &quot;unpacked&quot; by binding the result.
- The warning is suppressed by explicitly mentioning in the source code that your program is throwing something away:
- <programlisting>
- do { _ &lt;- return (popInt 10) ; return 10 }
- </programlisting>
- For almost all sensible programs this will indicate a bug, and you probably intended to write:
- <programlisting>
- do { popInt 10 ; return 10 }
- </programlisting>
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-fwarn-inline-rule-shadowing</option>:</term>
- <listitem>
- <indexterm><primary><option>-fwarn-inline-rule-shadowing</option></primary></indexterm>
- <para>Warn if a rewrite RULE might fail to fire because the function might be
- inlined before the rule has a chance to fire. See <xref linkend="rules-inline"/>.
- </para>
- </listitem>
- </varlistentry>
-
- </variablelist>
-
- <para>If you're feeling really paranoid, the
- <option>-dcore-lint</option>
- option<indexterm><primary><option>-dcore-lint</option></primary></indexterm>
- is a good choice. It turns on heavyweight intra-pass
- sanity-checking within GHC. (It checks GHC's sanity, not
- yours.)</para>
-
- </sect1>
-
- &packages;
-
- <sect1 id="options-optimise">
- <title>Optimisation (code improvement)</title>
-
- <indexterm><primary>optimisation</primary></indexterm>
- <indexterm><primary>improvement, code</primary></indexterm>
-
- <para>The <option>-O*</option> options specify convenient
- &ldquo;packages&rdquo; of optimisation flags; the
- <option>-f*</option> options described later on specify
- <emphasis>individual</emphasis> optimisations to be turned on/off;
- the <option>-m*</option> options specify
- <emphasis>machine-specific</emphasis> optimisations to be turned
- on/off.</para>
-
- <para>Most of these options are boolean and have options to turn them both
- &ldquo;on&rdquo; and &ldquo;off&rdquo; (beginning with the prefix
- <option>no-</option>). For instance, while <option>-fspecialise</option>
- enables specialisation, <option>-fno-specialise</option> disables it. When
- multiple flags for the same option appear in the command-line they are
- evaluated from left to right. For instance <option>-fno-specialise
- -fspecialise</option> will enable specialisation.
- </para>
-
- <para>It is important to note that the <option>-O*</option> flags are roughly
- equivalent to combinations of <option>-f*</option> flags. For this reason,
- the effect of the <option>-O*</option> and <option>-f*</option> flags is
- dependent upon the order in which they occur on the command line.
- </para>
-
- <para>For instance, take the example of <option>-fno-specialise
- -O1</option>. Despite the <option>-fno-specialise</option> appearing in the
- command line, specialisation will still be enabled. This is the case
- as <option>-O1</option> implies <option>-fspecialise</option>, overriding
- the previous flag. By contrast, <option>-O1 -fno-specialise</option> will
- compile without specialisation, as one would expect.
- </para>
-
- <sect2 id="optimise-pkgs">
- <title><option>-O*</option>: convenient &ldquo;packages&rdquo; of optimisation flags.</title>
-
- <para>There are <emphasis>many</emphasis> options that affect
- the quality of code produced by GHC. Most people only have a
- general goal, something like &ldquo;Compile quickly&rdquo; or
- &ldquo;Make my program run like greased lightning.&rdquo; The
- following &ldquo;packages&rdquo; of optimisations (or lack
- thereof) should suffice.</para>
-
- <para>Note that higher optimisation levels cause more
- cross-module optimisation to be performed, which can have an
- impact on how much of your program needs to be recompiled when
- you change something. This is one reason to stick to
- no-optimisation when developing code.</para>
-
- <variablelist>
-
- <varlistentry>
- <term>
- No <option>-O*</option>-type option specified:
- <indexterm><primary>-O* not specified</primary></indexterm>
- </term>
- <listitem>
- <para>This is taken to mean: &ldquo;Please compile
- quickly; I'm not over-bothered about compiled-code
- quality.&rdquo; So, for example: <command>ghc -c
- Foo.hs</command></para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-O0</option>:
- <indexterm><primary><option>-O0</option></primary></indexterm>
- </term>
- <listitem>
- <para>Means &ldquo;turn off all optimisation&rdquo;,
- reverting to the same settings as if no
- <option>-O</option> options had been specified. Saying
- <option>-O0</option> can be useful if
- eg. <command>make</command> has inserted a
- <option>-O</option> on the command line already.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-O</option> or <option>-O1</option>:
- <indexterm><primary>-O option</primary></indexterm>
- <indexterm><primary>-O1 option</primary></indexterm>
- <indexterm><primary>optimise</primary><secondary>normally</secondary></indexterm>
- </term>
- <listitem>
- <para>Means: &ldquo;Generate good-quality code without
- taking too long about it.&rdquo; Thus, for example:
- <command>ghc -c -O Main.lhs</command></para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-O2</option>:
- <indexterm><primary>-O2 option</primary></indexterm>
- <indexterm><primary>optimise</primary><secondary>aggressively</secondary></indexterm>
- </term>
- <listitem>
- <para>Means: &ldquo;Apply every non-dangerous
- optimisation, even if it means significantly longer
- compile times.&rdquo;</para>
-
- <para>The avoided &ldquo;dangerous&rdquo; optimisations
- are those that can make runtime or space
- <emphasis>worse</emphasis> if you're unlucky. They are
- normally turned on or off individually.</para>
-
- <para>At the moment, <option>-O2</option> is
- <emphasis>unlikely</emphasis> to produce better code than
- <option>-O</option>.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-Odph</option>:
- <indexterm><primary>-Odph</primary></indexterm>
- <indexterm><primary>optimise</primary><secondary>DPH</secondary></indexterm>
- </term>
- <listitem>
- <para>Enables all <option>-O2</option> optimisation, sets
- <option>-fmax-simplifier-iterations=20</option>
- and <option>-fsimplifier-phases=3</option>. Designed for use with
- <link linkend="dph">Data Parallel Haskell (DPH)</link>.</para>
- </listitem>
- </varlistentry>
-
- </variablelist>
-
- <para>We don't use a <option>-O*</option> flag for day-to-day
- work. We use <option>-O</option> to get respectable speed;
- e.g., when we want to measure something. When we want to go for
- broke, we tend to use <option>-O2</option> (and we go for
- lots of coffee breaks).</para>
-
- <para>The easiest way to see what <option>-O</option> (etc.)
- &ldquo;really mean&rdquo; is to run with <option>-v</option>,
- then stand back in amazement.</para>
- </sect2>
-
- <sect2 id="options-f">
- <title><option>-f*</option>: platform-independent flags</title>
-
- <indexterm><primary>-f* options (GHC)</primary></indexterm>
- <indexterm><primary>-fno-* options (GHC)</primary></indexterm>
-
- <para>These flags turn on and off individual optimisations.
- Flags marked as <emphasis>Enabled by default</emphasis> are
- enabled by <option>-O</option>, and as such you shouldn't
- need to set any of them explicitly. A flag <option>-fwombat</option>
- can be negated by saying <option>-fno-wombat</option>.
- See <xref linkend="options-f-compact"/> for a compact list.
- </para>
-
- <variablelist>
- <varlistentry>
- <term>
- <option>-fcase-merge</option>
- <indexterm><primary><option></option></primary></indexterm>
- </term>
- <listitem>
- <para><emphasis>On by default.</emphasis>
- Merge immediately-nested case expressions that scrutinse the same variable. Example
-<programlisting>
- case x of
- Red -> e1
- _ -> case x of
- Blue -> e2
- Green -> e3
-==>
- case x of
- Red -> e1
- Blue -> e2
- Green -> e2
-</programlisting>
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fcall-arity</option>
- <indexterm><primary><option>-fcall-arity</option></primary></indexterm>
- </term>
- <listitem>
- <para><emphasis>On by default.</emphasis>.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fcmm-elim-common-blocks</option>
- <indexterm><primary><option>-felim-common-blocks</option></primary></indexterm>
- </term>
- <listitem>
- <para><emphasis>On by default.</emphasis>. Enables the common block
- elimination optimisation in the code generator. This optimisation
- attempts to find identical Cmm blocks and eliminate the duplicates.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fcmm-sink</option>
- <indexterm><primary><option>-fcmm-sink</option></primary></indexterm>
- </term>
- <listitem>
- <para><emphasis>On by default.</emphasis>. Enables the sinking pass
- in the code generator. This optimisation
- attempts to find identical Cmm blocks and eliminate the duplicates
- attempts to move variable bindings closer to their usage sites. It
- also inlines simple expressions like literals or registers.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fcpr-off</option>
- <indexterm><primary><option>-fcpr-Off</option></primary></indexterm>
- </term>
- <listitem>
- <para>Switch off CPR analysis in the demand analyser.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fcse</option>
- <indexterm><primary><option>-fcse</option></primary></indexterm>
- </term>
- <listitem>
- <para><emphasis>On by default.</emphasis>. Enables the common-sub-expression
- elimination optimisation.
- Switching this off can be useful if you have some <literal>unsafePerformIO</literal>
- expressions that you don't want commoned-up.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fdicts-cheap</option>
- <indexterm><primary><option></option></primary></indexterm>
- </term>
- <listitem>
- <para>A very experimental flag that makes dictionary-valued
- expressions seem cheap to the optimiser.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fdicts-strict</option>
- <indexterm><primary><option></option></primary></indexterm>
- </term>
- <listitem>
- <para>Make dictionaries strict.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fdmd-tx-dict-sel</option>
- <indexterm><primary><option>-fdmd-tx-dict-sel</option></primary></indexterm>
- </term>
- <listitem>
- <para><emphasis>On by default for <option>-O0</option>, <option>-O</option>,
- <option>-O2</option>.</emphasis>
- </para>
- <para>Use a special demand transformer for dictionary selectors.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fdo-eta-reduction</option>
- <indexterm><primary><option></option></primary></indexterm>
- </term>
- <listitem>
- <para><emphasis>On by default.</emphasis>
- Eta-reduce lambda expressions, if doing so gets rid of a whole
- group of lambdas.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fdo-lambda-eta-expansion</option>
- <indexterm><primary><option></option></primary></indexterm>
- </term>
- <listitem>
- <para><emphasis>On by default.</emphasis>
- Eta-expand let-bindings to increase their arity.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-feager-blackholing</option>
- <indexterm><primary><option></option></primary></indexterm>
- </term>
- <listitem>
- <para>Usually GHC black-holes a thunk only when it switches
- threads. This flag makes it do so as soon as the thunk is
- entered. See <ulink url="http://research.microsoft.com/en-us/um/people/simonpj/papers/parallel/">
- Haskell on a shared-memory multiprocessor</ulink>.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fexcess-precision</option>
- <indexterm><primary><option>-fexcess-precision</option></primary></indexterm>
- </term>
- <listitem>
- <para>When this option is given, intermediate floating
- point values can have a <emphasis>greater</emphasis>
- precision/range than the final type. Generally this is a
- good thing, but some programs may rely on the exact
- precision/range of
- <literal>Float</literal>/<literal>Double</literal> values
- and should not use this option for their compilation.</para>
-
- <para>
- Note that the 32-bit x86 native code generator only
- supports excess-precision mode, so neither
- <option>-fexcess-precision</option> nor
- <option>-fno-excess-precision</option> has any effect.
- This is a known bug, see <xref linkend="bugs-ghc" />.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fexpose-all-unfoldings</option>
- <indexterm><primary><option></option></primary></indexterm>
- </term>
- <listitem>
- <para>An experimental flag to expose all unfoldings, even for very
- large or recursive functions. This allows for all functions to be
- inlined while usually GHC would avoid inlining larger functions.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-ffloat-in</option>
- <indexterm><primary><option></option></primary></indexterm>
- </term>
- <listitem>
- <para><emphasis>On by default.</emphasis>
- Float let-bindings inwards, nearer their binding site. See
- <ulink url="http://research.microsoft.com/en-us/um/people/simonpj/papers/float.ps.gz">
- Let-floating: moving bindings to give faster programs (ICFP'96)</ulink>.
- </para>
-
- <para>This optimisation moves let bindings closer to their use
- site. The benefit here is that this may avoid unnecessary
- allocation if the branch the let is now on is never executed. It
- also enables other optimisation passes to work more effectively
- as they have more information locally.
- </para>
-
- <para>This optimisation isn't always beneficial though (so GHC
- applies some heuristics to decide when to apply it). The details
- get complicated but a simple example is that it is often beneficial
- to move let bindings outwards so that multiple let bindings can be
- grouped into a larger single let binding, effectively batching
- their allocation and helping the garbage collector and allocator.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-ffull-laziness</option>
- <indexterm><primary><option>-ffull-laziness</option></primary></indexterm>
- </term>
- <listitem>
- <para><emphasis>On by default.</emphasis>
- Run the full laziness optimisation (also known as let-floating),
- which floats let-bindings outside enclosing lambdas, in the hope
- they will be thereby be computed less often. See
- <ulink url="http://research.microsoft.com/en-us/um/people/simonpj/papers/float.ps.gz">Let-floating:
- moving bindings to give faster programs (ICFP'96)</ulink>.
- Full laziness increases sharing, which can lead to increased memory
- residency.
- </para>
-
- <para>NOTE: GHC doesn't implement complete full-laziness.
- When optimisation in on, and <option>-fno-full-laziness</option>
- is not given, some transformations that increase sharing are
- performed, such as extracting repeated computations from a loop.
- These are the same transformations that a fully lazy
- implementation would do, the difference is that GHC doesn't
- consistently apply full-laziness, so don't rely on it.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-ffun-to-thunk</option>
- <indexterm><primary><option>-ffun-to-thunk</option></primary></indexterm>
- </term>
- <listitem>
- <para>Worker-wrapper removes unused arguments, but usually we do
- not remove them all, lest it turn a function closure into a thunk,
- thereby perhaps creating a space leak and/or disrupting inlining.
- This flag allows worker/wrapper to remove <emphasis>all</emphasis>
- value lambdas. Off by default.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fignore-asserts</option>
- <indexterm><primary><option>-fignore-asserts</option></primary></indexterm>
- </term>
- <listitem>
- <para><emphasis>On by default.</emphasis>.
- Causes GHC to ignore uses of the function
- <literal>Exception.assert</literal> in source code (in
- other words, rewriting <literal>Exception.assert p
- e</literal> to <literal>e</literal> (see <xref
- linkend="assertions"/>).
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fignore-interface-pragmas</option>
- <indexterm><primary><option>-fignore-interface-pragmas</option></primary></indexterm>
- </term>
- <listitem>
- <para>Tells GHC to ignore all inessential information when reading interface files.
- That is, even if <filename>M.hi</filename> contains unfolding or strictness information
- for a function, GHC will ignore that information.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-flate-dmd-anal</option>
- <indexterm><primary><option>-flate-dmd-anal</option></primary></indexterm>
- </term>
- <listitem>
- <para>Run demand analysis
- again, at the end of the simplification pipeline. We found some opportunities
- for discovering strictness that were not visible earlier; and optimisations like
- <literal>-fspec-constr</literal> can create functions with unused arguments which
- are eliminated by late demand analysis. Improvements are modest, but so is the
- cost. See notes on the <ulink url="http://ghc.haskell.org/trac/ghc/wiki/LateDmd">Trac wiki page</ulink>.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fliberate-case</option>
- <indexterm><primary><option>-fliberate-case</option></primary></indexterm>
- </term>
- <listitem>
- <para><emphasis>Off by default, but enabled by -O2.</emphasis>
- Turn on the liberate-case transformation. This unrolls recursive
- function once in its own RHS, to avoid repeated case analysis of
- free variables. It's a bit like the call-pattern specialiser
- (<option>-fspec-constr</option>) but for free variables rather than
- arguments.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fliberate-case-threshold=<replaceable>n</replaceable></option>
- <indexterm><primary><option>-fliberate-case-threshold</option></primary></indexterm>
- </term>
- <listitem>
- <para>Set the size threshold for the liberate-case transformation. Default: 2000
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-floopification</option>
- <indexterm><primary><option>-floopification</option></primary></indexterm>
- </term>
- <listitem>
- <para><emphasis>On by default.</emphasis>
- </para>
- <para>When this optimisation is enabled the code generator will turn
- all self-recursive saturated tail calls into local jumps rather
- than function calls.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fmax-inline-alloc-size=<replaceable>n</replaceable></option>
- <indexterm><primary><option>-fmax-inline-alloc-size</option></primary></indexterm>
- </term>
- <listitem>
- <para>Set the maximum size of inline array allocations to n bytes
- (default: 128). GHC will allocate non-pinned arrays of statically
- known size in the current nursery block if they're no bigger
- than n bytes, ignoring GC overheap. This value should be quite
- a bit smaller than the block size (typically: 4096).
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fmax-inline-memcpy-insn=<replaceable>n</replaceable></option>
- <indexterm><primary><option>-fmax-inline-memcpy-insn</option></primary></indexterm>
- </term>
- <listitem>
- <para>Inline <literal>memcpy</literal> calls if they would generate
- no more than n pseudo instructions (default: 32).
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fmax-inline-memset-insns=<replaceable>n</replaceable></option>
- <indexterm><primary><option>-fmax-inline-memset-insns</option></primary></indexterm>
- </term>
- <listitem>
- <para>Inline <literal>memset</literal> calls if they would generate
- no more than n pseudo instructions (default: 32).
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fmax-relevant-binds=<replaceable>n</replaceable></option>
- <indexterm><primary><option>-fmax-relevant-bindings</option></primary></indexterm>
- </term>
- <listitem>
- <para>The type checker sometimes displays a fragment of the type environment
- in error messages, but only up to some maximum number, set by this flag.
- The default is 6. Turning it off with <option>-fno-max-relevant-bindings</option>
- gives an unlimited number. Syntactically top-level bindings are also
- usually excluded (since they may be numerous), but
- <option>-fno-max-relevant-bindings</option> includes them too.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fmax-simplifier-iterations=<replaceable>n</replaceable></option>
- <indexterm><primary><option>-fmax-simplifier-iterations</option></primary></indexterm>
- </term>
- <listitem>
- <para>Sets the maximal number of iterations for the simplifier. Defult: 4.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fmax-worker-args=<replaceable>n</replaceable></option>
- <indexterm><primary><option>-fmax-worker-args</option></primary></indexterm>
- </term>
- <listitem>
- <para>If a worker has that many arguments, none will be unpacked anymore (default: 10)
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fno-opt-coercion</option>
- <indexterm><primary><option>-fno-opt-coercion</option></primary></indexterm>
- </term>
- <listitem>
- <para>Turn off the coercion optimiser.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fno-pre-inlining</option>
- <indexterm><primary><option>-fno-pre-inlining</option></primary></indexterm>
- </term>
- <listitem>
- <para>Turn off pre-inlining.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fno-state-hack</option>
- <indexterm><primary><option>-fno-state-hack</option></primary></indexterm>
- </term>
- <listitem>
- <para>Turn off the "state hack" whereby any lambda with a
- <literal>State#</literal> token as argument is considered to be
- single-entry, hence it is considered OK to inline things inside
- it. This can improve performance of IO and ST monad code, but it
- runs the risk of reducing sharing.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fomit-interface-pragmas</option>
- <indexterm><primary><option>-fomit-interface-pragmas</option></primary></indexterm>
- </term>
- <listitem>
- <para>Tells GHC to omit all inessential information from the
- interface file generated for the module being compiled (say M).
- This means that a module importing M will see only the
- <emphasis>types</emphasis> of the functions that M exports, but
- not their unfoldings, strictness info, etc. Hence, for example,
- no function exported by M will be inlined into an importing module.
- The benefit is that modules that import M will need to be
- recompiled less often (only when M's exports change their type, not
- when they change their implementation).</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fomit-yields</option>
- <indexterm><primary><option>-fomit-yields</option></primary></indexterm>
- </term>
- <listitem>
- <para><emphasis>On by default.</emphasis> Tells GHC to omit
- heap checks when no allocation is being performed. While this improves
- binary sizes by about 5%, it also means that threads run in
- tight non-allocating loops will not get preempted in a timely
- fashion. If it is important to always be able to interrupt such
- threads, you should turn this optimization off. Consider also
- recompiling all libraries with this optimization turned off, if you
- need to guarantee interruptibility.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fpedantic-bottoms</option>
- <indexterm><primary><option>-fpedantic-bottoms</option></primary></indexterm>
- </term>
- <listitem>
- <para>Make GHC be more precise about its treatment of bottom (but see also
- <option>-fno-state-hack</option>). In particular, stop GHC
- eta-expanding through a case expression, which is good for
- performance, but bad if you are using <literal>seq</literal> on
- partial applications.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fregs-graph</option>
- <indexterm><primary><option>-fregs-graph</option></primary></indexterm>
- </term>
- <listitem>
- <para><emphasis>Off by default due to a performance regression bug.
- Only applies in combination with the native code generator.</emphasis>
- Use the graph colouring register allocator for register allocation
- in the native code generator. By default, GHC uses a simpler,
- faster linear register allocator. The downside being that the
- linear register allocator usually generates worse code.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fregs-iterative</option>
- <indexterm><primary><option>-fregs-iterative</option></primary></indexterm>
- </term>
- <listitem>
- <para><emphasis>Off by default, only applies in combination with
- the native code generator.</emphasis>
- Use the iterative coalescing graph colouring register allocator for
- register allocation in the native code generator. This is the same
- register allocator as the <option>-fregs-graph</option> one but also
- enables iterative coalescing during register allocation.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fsimplifier-phases=<replaceable>n</replaceable></option>
- <indexterm><primary><option>-fsimplifier-phases</option></primary></indexterm>
- </term>
- <listitem>
- <para>Set the number of phases for the simplifier (default 2). Ignored with -O0.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fsimpl-tick-factor=<replaceable>n</replaceable></option>
- <indexterm><primary><option>-fsimpl-tick-factor</option></primary></indexterm>
- </term>
- <listitem>
- <para>GHC's optimiser can diverge if you write rewrite rules (
- <xref linkend="rewrite-rules"/>) that don't terminate, or (less
- satisfactorily) if you code up recursion through data types
- (<xref linkend="bugs-ghc"/>). To avoid making the compiler fall
- into an infinite loop, the optimiser carries a "tick count" and
- stops inlining and applying rewrite rules when this count is
- exceeded. The limit is set as a multiple of the program size, so
- bigger programs get more ticks. The
- <option>-fsimpl-tick-factor</option> flag lets you change the
- multiplier. The default is 100; numbers larger than 100 give more
- ticks, and numbers smaller than 100 give fewer.
- </para>
-
- <para>If the tick-count expires, GHC summarises what simplifier
- steps it has done; you can use
- <option>-fddump-simpl-stats</option> to generate a much more
- detailed list. Usually that identifies the loop quite
- accurately, because some numbers are very large.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fspec-constr</option>
- <indexterm><primary><option>-fspec-constr</option></primary></indexterm>
- </term>
- <listitem>
- <para><emphasis>Off by default, but enabled by -O2.</emphasis>
- Turn on call-pattern specialisation; see
- <ulink url="http://research.microsoft.com/en-us/um/people/simonpj/papers/spec-constr/index.htm">
- Call-pattern specialisation for Haskell programs</ulink>.
- </para>
-
- <para>This optimisation specializes recursive functions according to
- their argument "shapes". This is best explained by example so
- consider:
-<programlisting>
-last :: [a] -> a
-last [] = error "last"
-last (x : []) = x
-last (x : xs) = last xs
-</programlisting>
- In this code, once we pass the initial check for an empty list we
- know that in the recursive case this pattern match is redundant. As
- such <option>-fspec-constr</option> will transform the above code
- to:
-<programlisting>
-last :: [a] -> a
-last [] = error "last"
-last (x : xs) = last' x xs
- where
- last' x [] = x
- last' x (y : ys) = last' y ys
-</programlisting>
- </para>
-
- <para>As well avoid unnecessary pattern matching it also helps avoid
- unnecessary allocation. This applies when a argument is strict in
- the recursive call to itself but not on the initial entry. As
- strict recursive branch of the function is created similar to the
- above example.
- </para>
-
- <para>It is also possible for library writers to instruct
- GHC to perform call-pattern specialisation extremely
- aggressively. This is necessary for some highly optimized
- libraries, where we may want to specialize regardless of
- the number of specialisations, or the size of the code. As
- an example, consider a simplified use-case from the
- <literal>vector</literal> library:</para>
-<programlisting>
-import GHC.Types (SPEC(..))
-
-foldl :: (a -> b -> a) -> a -> Stream b -> a
-{-# INLINE foldl #-}
-foldl f z (Stream step s _) = foldl_loop SPEC z s
- where
- foldl_loop !sPEC z s = case step s of
- Yield x s' -> foldl_loop sPEC (f z x) s'
- Skip -> foldl_loop sPEC z s'
- Done -> z
-</programlisting>
-
- <para>Here, after GHC inlines the body of
- <literal>foldl</literal> to a call site, it will perform
- call-pattern specialisation very aggressively on
- <literal>foldl_loop</literal> due to the use of
- <literal>SPEC</literal> in the argument of the loop
- body. <literal>SPEC</literal> from
- <literal>GHC.Types</literal> is specifically recognised by
- the compiler.</para>
-
- <para>(NB: it is extremely important you use
- <literal>seq</literal> or a bang pattern on the
- <literal>SPEC</literal> argument!)</para>
-
- <para>In particular, after inlining this will
- expose <literal>f</literal> to the loop body directly,
- allowing heavy specialisation over the recursive
- cases.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fspec-constr-count=<replaceable>n</replaceable></option>
- <indexterm><primary><option>-fspec-constr-count</option></primary></indexterm>
- </term>
- <listitem>
- <para>Set the maximum number of specialisations
- that will be created for any one function by the SpecConstr
- transformation (default: 3).
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fspec-constr-threshold=<replaceable>n</replaceable></option>
- <indexterm><primary><option>-fspec-constr-threshold</option></primary></indexterm>
- </term>
- <listitem>
- <para>Set the size threshold for the SpecConstr transformation (default: 2000).
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fspecialise</option>
- <indexterm><primary><option>-fspecialise</option></primary></indexterm>
- </term>
- <listitem>
- <para><emphasis>On by default.</emphasis>
- Specialise each type-class-overloaded function defined in this
- module for the types at which it is called in this module. If
- <literal>-fcross-module-specialise</literal> is set imported
- functions that have an INLINABLE pragma
- (<xref linkend="inlinable-pragma"/>) will be specialised as well.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fcross-module-specialise</option>
- <indexterm><primary><option>-fcross-module-specialise</option></primary></indexterm>
- </term>
- <listitem>
- <para><emphasis>On by default.</emphasis>
- Specialise <literal>INLINABLE</literal> (<xref linkend="inlinable-pragma"/>)
- type-class-overloaded functions imported from other modules for the
- types at which they are called in this module. Note that specialisation must
- be enabled (by <literal>-fspecialise</literal>) for this to have any effect.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fstatic-argument-transformation</option>
- <indexterm><primary><option>-fstatic-argument-transformation</option></primary></indexterm>
- </term>
- <listitem>
- <para>Turn on the static argument transformation, which turns a
- recursive function into a non-recursive one with a local
- recursive loop. See Chapter 7 of
- <ulink url="http://research.microsoft.com/en-us/um/people/simonpj/papers/santos-thesis.ps.gz">
- Andre Santos's PhD thesis</ulink>
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fstrictness</option>
- <indexterm><primary><option></option></primary></indexterm>
- </term>
- <listitem>
- <para> <emphasis>On by default.</emphasis>.
- Switch on the strictness analyser. There is a very old paper about GHC's
- strictness analyser, <ulink url="http://research.microsoft.com/en-us/um/people/simonpj/papers/simple-strictnes-analyser.ps.gz">
- Measuring the effectiveness of a simple strictness analyser</ulink>,
- but the current one is quite a bit different.
- </para>
-
- <para>The strictness analyser figures out when arguments and
- variables in a function can be treated 'strictly' (that is they
- are always evaluated in the function at some point). This allow
- GHC to apply certain optimisations such as unboxing that
- otherwise don't apply as they change the semantics of the program
- when applied to lazy arguments.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fstrictness-before=<replaceable>n</replaceable></option>
- <indexterm><primary><option>-fstrictness-before</option></primary></indexterm>
- </term>
- <listitem>
- <para>Run an additional strictness analysis before simplifier phase n.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-funbox-small-strict-fields</option>:
- <indexterm><primary><option>-funbox-small-strict-fields</option></primary></indexterm>
- <indexterm><primary>strict constructor fields</primary></indexterm>
- <indexterm><primary>constructor fields, strict</primary></indexterm>
- </term>
- <listitem>
- <para><emphasis>On by default.</emphasis>. This option
- causes all constructor fields which are marked strict
- (i.e. &ldquo;!&rdquo;) and which representation is smaller
- or equal to the size of a pointer to be unpacked, if
- possible. It is equivalent to adding an
- <literal>UNPACK</literal> pragma (see <xref
- linkend="unpack-pragma"/>) to every strict constructor
- field that fulfils the size restriction.
- </para>
-
- <para>For example, the constructor fields in the following
- data types
-<programlisting>
-data A = A !Int
-data B = B !A
-newtype C = C B
-data D = D !C
-</programlisting>
- would all be represented by a single
- <literal>Int#</literal> (see <xref linkend="primitives"/>)
- value with
- <option>-funbox-small-strict-fields</option> enabled.
- </para>
-
- <para>This option is less of a sledgehammer than
- <option>-funbox-strict-fields</option>: it should rarely make things
- worse. If you use <option>-funbox-small-strict-fields</option>
- to turn on unboxing by default you can disable it for certain
- constructor fields using the <literal>NOUNPACK</literal> pragma (see
- <xref linkend="nounpack-pragma"/>).</para>
-
- <para>
- Note that for consistency <literal>Double</literal>,
- <literal>Word64</literal>, and <literal>Int64</literal> constructor
- fields are unpacked on 32-bit platforms, even though they are
- technically larger than a pointer on those platforms.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-funbox-strict-fields</option>:
- <indexterm><primary><option>-funbox-strict-fields</option></primary></indexterm>
- <indexterm><primary>strict constructor fields</primary></indexterm>
- <indexterm><primary>constructor fields, strict</primary></indexterm>
- </term>
- <listitem>
- <para>This option causes all constructor fields which are marked
- strict (i.e. &ldquo;!&rdquo;) to be unpacked if possible. It is
- equivalent to adding an <literal>UNPACK</literal> pragma to every
- strict constructor field (see <xref linkend="unpack-pragma"/>).
- </para>
-
- <para>This option is a bit of a sledgehammer: it might sometimes
- make things worse. Selectively unboxing fields by using
- <literal>UNPACK</literal> pragmas might be better. An alternative
- is to use <option>-funbox-strict-fields</option> to turn on
- unboxing by default but disable it for certain constructor
- fields using the <literal>NOUNPACK</literal> pragma (see
- <xref linkend="nounpack-pragma"/>).</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-funfolding-creation-threshold=<replaceable>n</replaceable></option>:
- <indexterm><primary><option>-funfolding-creation-threshold</option></primary></indexterm>
- <indexterm><primary>inlining, controlling</primary></indexterm>
- <indexterm><primary>unfolding, controlling</primary></indexterm>
- </term>
- <listitem>
- <para>(Default: 750) Governs the maximum size that GHC will allow a
- function unfolding to be. (An unfolding has a &ldquo;size&rdquo;
- that reflects the cost in terms of &ldquo;code bloat&rdquo; of
- expanding (aka inlining) that unfolding at a call site. A bigger
- function would be assigned a bigger cost.)
- </para>
-
- <para>Consequences: (a) nothing larger than this will be inlined
- (unless it has an INLINE pragma); (b) nothing larger than this
- will be spewed into an interface file.
- </para>
-
- <para>Increasing this figure is more likely to result in longer
- compile times than faster code. The
- <option>-funfolding-use-threshold</option> is more useful.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-funfolding-dict-discount=<replaceable>n</replaceable></option>:
- <indexterm><primary><option>-funfolding-dict-discount</option></primary></indexterm>
- <indexterm><primary>inlining, controlling</primary></indexterm>
- <indexterm><primary>unfolding, controlling</primary></indexterm>
- </term>
- <listitem>
- <para>Default: 30
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-funfolding-fun-discount=<replaceable>n</replaceable></option>:
- <indexterm><primary><option>-funfolding-fun-discount</option></primary></indexterm>
- <indexterm><primary>inlining, controlling</primary></indexterm>
- <indexterm><primary>unfolding, controlling</primary></indexterm>
- </term>
- <listitem>
- <para>Default: 60
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-funfolding-keeness-factor=<replaceable>n</replaceable></option>:
- <indexterm><primary><option>-funfolding-keeness-factor</option></primary></indexterm>
- <indexterm><primary>inlining, controlling</primary></indexterm>
- <indexterm><primary>unfolding, controlling</primary></indexterm>
- </term>
- <listitem>
- <para>Default: 1.5
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-funfolding-use-threshold=<replaceable>n</replaceable></option>
- <indexterm><primary><option>-funfolding-use-threshold</option></primary></indexterm>
- <indexterm><primary>inlining, controlling</primary></indexterm>
- <indexterm><primary>unfolding, controlling</primary></indexterm>
- </term>
- <listitem>
- <para>(Default: 60) This is the magic cut-off figure for unfolding
- (aka inlining): below this size, a function definition will be
- unfolded at the call-site, any bigger and it won't. The size
- computed for a function depends on two things: the actual size of
- the expression minus any discounts that apply depending on the
- context into which the expression is to be inlined.
- </para>
-
- <para>The difference between this and
- <option>-funfolding-creation-threshold</option> is that this one
- determines if a function definition will be inlined <emphasis>at
- a call site</emphasis>. The other option determines if a
- function definition will be kept around at all for potential
- inlining.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fvectorisation-avoidance</option>
- <indexterm><primary><option></option></primary></indexterm>
- </term>
- <listitem>
- <para>Part of <link linkend="dph">Data Parallel Haskell
- (DPH)</link>.</para>
-
- <para><emphasis>On by default.</emphasis> Enable the
- <emphasis>vectorisation</emphasis> avoidance optimisation. This
- optimisation only works when used in combination with the
- <option>-fvectorise</option> transformation.</para>
-
- <para>While vectorisation of code using DPH is often a big win, it
- can also produce worse results for some kinds of code. This
- optimisation modifies the vectorisation transformation to try to
- determine if a function would be better of unvectorised and if
- so, do just that.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fvectorise</option>
- <indexterm><primary><option></option></primary></indexterm>
- </term>
- <listitem>
- <para>Part of <link linkend="dph">Data Parallel Haskell
- (DPH)</link>.</para>
-
- <para><emphasis>Off by default.</emphasis> Enable the
- <emphasis>vectorisation</emphasis> optimisation transformation. This
- optimisation transforms the nested data parallelism code of programs
- using DPH into flat data parallelism. Flat data parallel programs
- should have better load balancing, enable SIMD parallelism and
- friendlier cache behaviour.</para>
- </listitem>
- </varlistentry>
-
- </variablelist>
-
- </sect2>
-
- </sect1>
-
- &code-gens;
-
- &phases;
-
- &shared_libs;
-
- <sect1 id="using-concurrent">
- <title>Using Concurrent Haskell</title>
- <indexterm><primary>Concurrent Haskell</primary><secondary>using</secondary></indexterm>
-
- <para>GHC supports Concurrent Haskell by default, without requiring a
- special option or libraries compiled in a certain way. To get access to
- the support libraries for Concurrent Haskell, just import
- <ulink
- url="&libraryBaseLocation;/Control-Concurrent.html"><literal>Control.Concurrent</literal></ulink>. More information on Concurrent Haskell is provided in the documentation for that module.</para>
-
- <para>
- Optionally, the program may be linked with
- the <option>-threaded</option> option (see
- <xref linkend="options-linker" />. This provides two benefits:
-
- <itemizedlist>
- <listitem>
- <para>It enables the <option>-N</option><indexterm><primary><option>-N<replaceable>x</replaceable></option></primary><secondary>RTS option</secondary></indexterm> RTS option to be
- used, which allows threads to run in
- parallel<indexterm><primary>parallelism</primary></indexterm>
- on a
- multiprocessor<indexterm><primary>multiprocessor</primary></indexterm><indexterm><primary>SMP</primary></indexterm>
- or
- multicore<indexterm><primary>multicore</primary></indexterm>
- machine. See <xref linkend="using-smp" />.</para>
- </listitem>
- <listitem>
- <para>If a thread makes a foreign call (and the call is
- not marked <literal>unsafe</literal>), then other
- Haskell threads in the program will continue to run
- while the foreign call is in progress.
- Additionally, <literal>foreign export</literal>ed
- Haskell functions may be called from multiple OS
- threads simultaneously. See
- <xref linkend="ffi-threads" />.</para>
- </listitem>
- </itemizedlist>
- </para>
-
- <para>The following RTS option(s) affect the behaviour of Concurrent
- Haskell programs:<indexterm><primary>RTS options, concurrent</primary></indexterm></para>
-
- <variablelist>
- <varlistentry>
- <term><option>-C<replaceable>s</replaceable></option></term>
- <listitem>
- <para><indexterm><primary><option>-C<replaceable>s</replaceable></option></primary><secondary>RTS option</secondary></indexterm>
- Sets the context switch interval to <replaceable>s</replaceable>
- seconds. A context switch will occur at the next heap block
- allocation after the timer expires (a heap block allocation occurs
- every 4k of allocation). With <option>-C0</option> or
- <option>-C</option>, context switches will occur as often as
- possible (at every heap block allocation). By default, context
- switches occur every 20ms.</para>
- </listitem>
- </varlistentry>
- </variablelist>
- </sect1>
-
- <sect1 id="using-smp">
- <title>Using SMP parallelism</title>
- <indexterm><primary>parallelism</primary>
- </indexterm>
- <indexterm><primary>SMP</primary>
- </indexterm>
-
- <para>GHC supports running Haskell programs in parallel on an SMP
- (symmetric multiprocessor).</para>
-
- <para>There's a fine distinction between
- <emphasis>concurrency</emphasis> and <emphasis>parallelism</emphasis>:
- parallelism is all about making your program run
- <emphasis>faster</emphasis> by making use of multiple processors
- simultaneously. Concurrency, on the other hand, is a means of
- abstraction: it is a convenient way to structure a program that must
- respond to multiple asynchronous events.</para>
-
- <para>However, the two terms are certainly related. By making use of
- multiple CPUs it is possible to run concurrent threads in parallel,
- and this is exactly what GHC's SMP parallelism support does. But it
- is also possible to obtain performance improvements with parallelism
- on programs that do not use concurrency. This section describes how to
- use GHC to compile and run parallel programs, in <xref
- linkend="lang-parallel" /> we describe the language features that affect
- parallelism.</para>
-
- <sect2 id="parallel-compile-options">
- <title>Compile-time options for SMP parallelism</title>
-
- <para>In order to make use of multiple CPUs, your program must be
- linked with the <option>-threaded</option> option (see <xref
- linkend="options-linker" />). Additionally, the following
- compiler options affect parallelism:</para>
-
- <variablelist>
- <varlistentry>
- <term><option>-feager-blackholing</option></term>
- <indexterm><primary><option>-feager-blackholing</option></primary></indexterm>
- <listitem>
- <para>
- Blackholing is the act of marking a thunk (lazy
- computuation) as being under evaluation. It is useful for
- three reasons: firstly it lets us detect certain kinds of
- infinite loop (the <literal>NonTermination</literal>
- exception), secondly it avoids certain kinds of space
- leak, and thirdly it avoids repeating a computation in a
- parallel program, because we can tell when a computation
- is already in progress.</para>
-
- <para>
- The option <option>-feager-blackholing</option> causes
- each thunk to be blackholed as soon as evaluation begins.
- The default is "lazy blackholing", whereby thunks are only
- marked as being under evaluation when a thread is paused
- for some reason. Lazy blackholing is typically more
- efficient (by 1-2&percnt; or so), because most thunks don't
- need to be blackholed. However, eager blackholing can
- avoid more repeated computation in a parallel program, and
- this often turns out to be important for parallelism.
- </para>
-
- <para>
- We recommend compiling any code that is intended to be run
- in parallel with the <option>-feager-blackholing</option>
- flag.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- </sect2>
-
- <sect2 id="parallel-options">
- <title>RTS options for SMP parallelism</title>
-
- <para>There are two ways to run a program on multiple
- processors:
- call <literal>Control.Concurrent.setNumCapabilities</literal> from your
- program, or use the RTS <option>-N</option> option.</para>
-
- <variablelist>
- <varlistentry>
- <term><option>-N<optional><replaceable>x</replaceable></optional></option></term>
- <listitem>
- <para><indexterm><primary><option>-N<replaceable>x</replaceable></option></primary><secondary>RTS option</secondary></indexterm>
- Use <replaceable>x</replaceable> simultaneous threads when
- running the program.</para>
-
- <para>The runtime manages a set of virtual processors,
- which we call <emphasis>capabilities</emphasis>, the
- number of which is determined by the <option>-N</option>
- option. Each capability can run one Haskell thread at a
- time, so the number of capabilities is equal to the
- number of Haskell threads that can run physically in
- parallel. A capability is animated by one or more OS
- threads; the runtime manages a pool of OS threads for
- each capability, so that if a Haskell thread makes a
- foreign call (see <xref linkend="ffi-threads" />)
- another OS thread can take over that capability.
- </para>
-
- <para>Normally <replaceable>x</replaceable> should be
- chosen to match the number of CPU cores on the
- machine<footnote><para>Whether hyperthreading cores
- should be counted or not is an open question; please
- feel free to experiment and let us know what results you
- find.</para></footnote>. For example, on a dual-core
- machine we would probably use <literal>+RTS -N2
- -RTS</literal>.</para>
-
- <para>Omitting <replaceable>x</replaceable>,
- i.e. <literal>+RTS -N -RTS</literal>, lets the runtime
- choose the value of <replaceable>x</replaceable> itself
- based on how many processors are in your machine.</para>
-
- <para>Be careful when using all the processors in your
- machine: if some of your processors are in use by other
- programs, this can actually harm performance rather than
- improve it.</para>
-
- <para>Setting <option>-N</option> also has the effect of
- enabling the parallel garbage collector (see
- <xref linkend="rts-options-gc" />).</para>
-
- <para>The current value of the <option>-N</option> option
- is available to the Haskell program via
- <literal>Control.Concurrent.getNumCapabilities</literal>,
- and it may be changed while the program is running by
- calling
- <literal>Control.Concurrent.setNumCapabilities</literal>.</para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <para>The following options affect the way the runtime schedules
- threads on CPUs:</para>
-
- <variablelist>
- <varlistentry>
- <term><option>-qa</option></term>
- <indexterm><primary><option>-qa</option></primary><secondary>RTS
- option</secondary></indexterm>
- <listitem>
- <para>Use the OS's affinity facilities to try to pin OS
- threads to CPU cores.</para>
-
- <para>When this option is enabled, the OS threads for a
- capability <emphasis>i</emphasis> are bound to the CPU
- core <emphasis>i</emphasis> using the API provided by the
- OS for setting thread affinity. e.g. on Linux
- GHC uses <literal>sched_setaffinity()</literal>.</para>
-
- <para>Depending on your workload and the other activity on
- the machine, this may or may not result in a performance
- improvement. We recommend trying it out and measuring the
- difference.</para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><option>-qm</option></term>
- <indexterm><primary><option>-qm</option></primary><secondary>RTS
- option</secondary></indexterm>
- <listitem>
- <para>Disable automatic migration for load balancing.
- Normally the runtime will automatically try to schedule
- threads across the available CPUs to make use of idle
- CPUs; this option disables that behaviour. Note that
- migration only applies to threads; sparks created
- by <literal>par</literal> are load-balanced separately
- by work-stealing.</para>
-
- <para>
- This option is probably only of use for concurrent
- programs that explicitly schedule threads onto CPUs
- with <literal>Control.Concurrent.forkOn</literal>.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- </sect2>
-
- <sect2>
- <title>Hints for using SMP parallelism</title>
-
- <para>Add the <literal>-s</literal> RTS option when
- running the program to see timing stats, which will help to tell you
- whether your program got faster by using more CPUs or not. If the user
- time is greater than
- the elapsed time, then the program used more than one CPU. You should
- also run the program without <literal>-N</literal> for
- comparison.</para>
-
- <para>The output of <literal>+RTS -s</literal> tells you how
- many &ldquo;sparks&rdquo; were created and executed during the
- run of the program (see <xref linkend="rts-options-gc" />), which
- will give you an idea how well your <literal>par</literal>
- annotations are working.</para>
-
- <para>GHC's parallelism support has improved in 6.12.1 as a
- result of much experimentation and tuning in the runtime
- system. We'd still be interested to hear how well it works
- for you, and we're also interested in collecting parallel
- programs to add to our benchmarking suite.</para>
- </sect2>
- </sect1>
-
- <sect1 id="options-platform">
- <title>Platform-specific Flags</title>
-
- <indexterm><primary>-m* options</primary></indexterm>
- <indexterm><primary>platform-specific options</primary></indexterm>
- <indexterm><primary>machine-specific options</primary></indexterm>
-
- <para>Some flags only make sense for particular target
- platforms.</para>
-
- <variablelist>
-
- <varlistentry>
- <term><option>-msse2</option>:</term>
- <listitem>
- <para>
- (x86 only, added in GHC 7.0.1) Use the SSE2 registers and
- instruction set to implement floating point operations when using
- the <link linkend="native-code-gen">native code generator</link>.
- This gives a substantial performance improvement for floating
- point, but the resulting compiled code
- will only run on processors that support SSE2 (Intel Pentium 4 and
- later, or AMD Athlon 64 and later). The
- <link linkend="llvm-code-gen">LLVM backend</link> will also use SSE2
- if your processor supports it but detects this automatically so no
- flag is required.
- </para>
- <para>
- SSE2 is unconditionally used on x86-64 platforms.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-msse4.2</option>:</term>
- <listitem>
- <para>
- (x86 only, added in GHC 7.4.1) Use the SSE4.2 instruction set to
- implement some floating point and bit operations when using the
- <link linkend="native-code-gen">native code generator</link>. The
- resulting compiled code will only run on processors that
- support SSE4.2 (Intel Core i7 and later). The
- <link linkend="llvm-code-gen">LLVM backend</link> will also use
- SSE4.2 if your processor supports it but detects this automatically
- so no flag is required.
- </para>
- </listitem>
- </varlistentry>
-
- </variablelist>
-
- </sect1>
-
-&runtime;
-&debug;
-&flags;
-
-</chapter>
-
-<!-- Emacs stuff:
- ;;; Local Variables: ***
- ;;; sgml-parent-document: ("users_guide.xml" "book" "chapter") ***
- ;;; ispell-local-dictionary: "british" ***
- ;;; End: ***
- -->