# The GHC Commentary - The Marvellous Module Structure of GHC

GHC is built out of about 245 Haskell modules. It can be quite tricky to figure out what the module dependency graph looks like. It can be important, too, because loops in the module dependency graph need to be broken carefully using `.hi-boot` interface files.

This section of the commentary documents the subtlest part of the module dependency graph, namely the part near the bottom.

- The list is given in compilation order: that is, module near the top are more primitive, and are compiled earlier.
- Each module is listed together with its most critical dependencies in parentheses; that is, the dependencies that prevent it being compiled earlier.
- Modules in the same bullet don't depend on each other.
- Loops are documented by a dependency such as "`loop Type.Type`". This means tha the module imports `Type.Type`, but module `Type` has not yet been compiled, so the import comes from `Type.hi-boot`.

Compilation order is as follows:

- First comes a layer of modules that have few interdependencies, and which implement very basic data types: `
  - Util
  - OccName
  - Pretty
  - Outputable
  - StringBuffer
  - ListSetOps
  - Maybes
  - etc
  `

- Now comes the main subtle layer, involving types, classes, type constructors identifiers, expressions, rules, and their operations. `
  - Name
    PrimRep

  - PrelNames

  - Var (Name, loop IdInfo.IdInfo, loop Type.Type, loop Type.Kind)

  - VarEnv, VarSet, ThinAir

  - Class (loop TyCon.TyCon, loop Type.Type)

  - TyCon (loop Type.Type, loop Type.Kind, loop DataCon.DataCon, loop Generics.GenInfo)

  - Type (loop DataCon.DataCon, loop Subst.substTy)

  - FieldLabel( Type)
    TysPrim(Type)
    PprEnv (loop DataCon.DataCon, Type)

  - Unify
    PprType (PprEnv)

  - Literal (TysPrim, PprType)
    DataCon (loop PprType)

  - TysWiredIn (DataCon.mkDataCon, loop MkId.mkDataConId, loop Generics.mkGenInfo)

  - TcType( lots of TysWiredIn stuff)

  - PprType( lots of TcType stuff )

  - PrimOp (PprType, TysWiredIn)

  - CoreSyn [does not import Id]

  - IdInfo (CoreSyn.Unfolding, CoreSyn.CoreRules)

  - Id (lots from IdInfo)

  - CoreFVs
    PprCore

  - CoreUtils (PprCore.pprCoreExpr, CoreFVs.exprFreeVars, CoreSyn.isEvaldUnfolding CoreSyn.maybeUnfoldingTemplate)

  - CoreLint( CoreUtils )
    OccurAnal (CoreUtils.exprIsTrivial)
    CoreTidy (CoreUtils.exprArity )

  - CoreUnfold (OccurAnal.occurAnalyseGlobalExpr)

  - Subst (CoreUnfold.Unfolding, CoreFVs)
    Generics (CoreUnfold.mkTopUnfolding)

  - Rules (CoreUnfold.Unfolding, PprCore.pprTidyIdRules)

  - MkId (CoreUnfold.mkUnfolding, Subst, Rules.addRule)

  - PrelInfo (MkId)
    HscTypes( Rules.RuleBase )
  `

- That is the end of the infrastructure. Now we get the main layer of mdoules that perform useful work. `

  - CoreTidy (HscTypes.PersistentCompilerState)
  `

Last modified: Wed Aug 22 16:46:33 GMT Daylight Time 2001