GHC lets you exercise rudimentary control over the RTS settings for any given program, by compiling in a "hook" that is called by the run-time system. The RTS contains stub definitions for all these hooks, but by writing your own version and linking it on the GHC command line, you can override the defaults.
The function `defaultsHook' lets you change various RTS options. The commonest use for this is to give your program a default heap and/or stack size that is greater than the default. For example, to set `-H8m -K1m':
#include "rtsdefs.h" void defaultsHook (void) { RTSflags.GcFlags.stksSize = 1000002 / sizeof(W_); RTSflags.GcFlags.heapSize = 8000002 / sizeof(W_); }
Don't use powers of two for heap/stack sizes: these are more likely to interact badly with direct-mapped caches. The full set of flags is defined in `ghc/includes/RtsFlags.lh' the the GHC source tree.
You can also change the messages printed when the runtime system "blows up," e.g., on stack overflow. The hooks for these are as follows:
For example, here is the "hooks" code used by GHC itself:
#include <stdio.h> #define W_ unsigned long int #define I_ long int void ErrorHdrHook (FILE *where) { fprintf(where, "\n"); /* no "Fail: " */ } void OutOfHeapHook (W_ request_size, W_ heap_size) /* both sizes in bytes */ { fprintf(stderr, "GHC's heap exhausted;\nwhile trying to allocate %lu bytes in a %lu-byte heap;\nuse the `-H<size>' option to increase the total heap size.\n", request_size, heap_size); } void StackOverflowHook (I_ stack_size) /* in bytes */ { fprintf(stderr, "GHC stack-space overflow: current size %ld bytes.\nUse the `-K<size>' option to increase it.\n", stack_size); } void PatErrorHdrHook (FILE *where) { fprintf(where, "\n*** Pattern-matching error within GHC!\n\n This is a compiler bug; please report it to glasgow-haskell-bugs@dcs.gla.ac.uk.\n\nFail: "); } void PreTraceHook (FILE *where) { fprintf(where, "\n"); /* not "Trace On" */ } void PostTraceHook (FILE *where) { fprintf(where, "\n"); /* not "Trace Off" */ }