Notes From a Beginning GHC Hacker

General notes (some just for Windows)

  1. The Building Guide is very good, read the appropriate parts.
  2. Optimize your set up for build speed. Having to wait 10 minutes to compile because you added an export to a critical module is no fun.
    1. Use MSYS, not cygwin. MSYS is much faster.
    2. Do not use -O to compile GHC while you are making heavy changes. Once things compile smoothly and you want to test it, compile with optimization (on my machine, adding -O triples the compile time for a fresh 'make').
  3. If you do a 'make tags' then you can go right to the definition of a function (from any module) using alt-. in emacs.
  4. If you need to add or delete modules, use 'make boot' to fix up the dependencies.

Notes on the type system (and its interactions)

The compiler is, of course, found in the fptools/compiler directory. Important subdirectories for hacking on the type system include:

  • basicTypes (Name, Var, OccName)
  • prelude (PrelNames, TysWiredIn)
  • types
  • typecheck
  • iface (IfaceType, BinIface)
  • parser (ParserCore)

The critical parts dealing with types are in the 'types' and 'typecheck' directories:


  • TypeRep.lhs
    • The representation of types, the Type datatype, is defined here and exported concretely
    • A few crucial type constructors (like ->) are defined here in order to avoid excessive module loops
  • TyCon.lhs
    • The representation of type constructors, TyCon, is defined here and exported abstractly
    • Construction and manipulation functions for type constructors are here
  • Type.lhs
    • Contains the bulk of the type system, imports the concrete representation from TypeRep, and re-exports Type abstractly

(more to come)

Debugging the compiler

  1. Make good use of ASSERT ( booleanCondition ), or better yet, ASSERT2 ( booleanCondition, msg )
  2. You can add trace messages to the forcing of expr with pprTrace str sDoc $ expr
  3. Read about the GHC Debugging Options; the following debugging options are particularly useful:
    • -dshow-passes : shows the compilations phases
    • -ddump-tc-trace : shows the typechecking status messages inserted by traceTc
    • -ddump-simpl : shows the Core code after simplification
    • -dppr-debug : makes the debugging dumps more noisy (and useful); among other things, shows kinds for type variables
  4. such debugging options can be added to make by passing the argument EXTRA_HC_OPTS='flags'

Running the testsuite

To run the testsuite:

  1. darcs get --partial
  2. make the compiler and libraries
  3. cd testsuite/tests/ghc-regress; make
Last modified 10 years ago Last modified on Feb 17, 2010 11:04:44 PM