The RTS can be built in several different ways, corresponding to global CPP defines. The flavour of the RTS is chosen by GHC when compiling a Haskell program, in response to certain command-line options: -prof, -threaded, etc.
The CPP symbols and their corresponding command-line flags are:
GHC option: -prof
RTS suffix: p
Enables multithreading in the RTS, bound threads, and SMP execution.
GHC option: -threaded
RTS suffix: thr
Enables extra debugging code, assertions, traces, and the `+RTS -D` options.
GHC option: -debug
RTS suffix: debug
Enables RTS tracing and event logging, see rts/Trace.c. Implied by `DEBUG`.
GHC option: -eventlog
RTS suffix: l
So for example, libHSrts_thr_debug.a is the version of the runtime compiled with THREADED_RTS and DEBUG, and will be linked in if you use the -threaded and -debug options to GHC.
The ways that the RTS is built in are controlled by the GhcRTSWays Makefile variable.
All combinations are allowed. Only some are built by default though; see mk/config.mk.in to see how the GhcRTSWays variable is set.
Other configuration options
Disabled the use of hardware registers for the stack pointer (`Sp`), heap pointer (`Hp`), etc. This is
enabled when building "unregisterised" code, which is controlled by the `GhcUnregisterised` build option.
Typically this is necessary when building GHC on a platform for which there is no native code generator
and LLVM does not have a GHC calling convention.
Enables the use of the RTS "mini-interpreter", which simulates tail-calls. Again, this is enabled by
`GhcUnregisterised` in the build system.
Controls whether the info table is placed directly before the entry code for a closure or return continuation.
This is normally turned on if the platform supports it, but is turned off by `GhcUnregisterised`.