--- /dev/null
+
+ GARBAGE COLLECTION
+ ~~~~~~~~~~~~~~~~~~
+
+The following discussion outlines how the GC is organised and what C
+the compiler needs to produce to use it.
+
+The files associated with GC are:
+
+ StgGC.h header file -- macros and externs
+ StgCreate.lc GC init routines
+ StgOverflow.lhc Overflow routines -- interface to GC
+ GC2s.lhc }
+ GC1s.lhc } GC control routines
+ GCdm.lhc } for each particular GC
+ GCap.lhc }
+ GCevac.lc Evacuation code fragments (copying GC)
+ GCscav.lhc Scavenging code fragments (copying GC)
+ GCcompact.lhc Inplace Compacting GC code fragments
+ GCmark.lhc Marking code fragments
+
+Other files:
+
+ In gctest/
+ gctest.c GC Small detail test bed program
+
+ In gcstat/
+ Performance evaluation stuff
+
+
+Basic Requirements of the C code Produced by the Haskell Compiler
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+There are two main aspects of the compiler generated code that
+interact with GC:
+
+1) Compiled haskell code calls the garbage collection routine when the
+ heap overflows by entering the appropriate _HEAP_OVERFLOW_... routine.
+
+ These routines isolate register usage and calls the GC control
+ routine that was defined at compile time.
+
+ For a description of the heap overflow conventions see:
+
+ ~grasp/ghc/compiler/absCSyn/RTSLabels.lhs
+
+
+ The following must be adhered to by the mutator:
+
+ REQUIREMENT COLLECTOR
+ SpA and SpB point to A and B stacks all
+
+ Hp must point to last word allocated dual,comp
+ All updated closures must "know" their original dual,comp
+ size
+
+ HpLim must point to one beyond top of root stack appel
+ Updated closures in the old generation must "know" appel
+ their original size
+
+ The GC Control routines have to know about the pointer stack and
+ Update Stack.
+
+2) The info tables that are pointed to by closures must have the
+ appropriate GC routines within them. This is achieved by using the
+ following C Macros to declare them:
+
+ table_name -- the name given to the info table
+ entry_code -- the name of the normal evaluation
+ entry code required for the closure
+ size -- the No of free var words in the closure
+ ptrs -- the number of pointers in the closure
+
+
+ SPEC_INFO_TABLE(table_name,entry_code,size,ptrs);
+
+ Declares an info table with specialiazed code fragments
+ These are currently available for the following closure
+ configurations: size, ptrs
+ 1,0 2,0 3,0 4,0 5,0
+ 1,1 2,1 3,1
+ 2,2
+ 3,3
+ 4,4
+ 5,5
+ ...
+ 11,11
+
+ GEN_INFO_TABLE(table_name,entry_code,size,ptrs);
+
+ Declares an info table that uses generic code fragments and
+ places data to drive these routines in the info table.
+ These are available for all combinations of size,ptrs (even
+ those for which SPEC routines are provided).
+
+
+ STATIC_INFO_TABLE(table_name,entry_code);
+
+ Declares an info table suitable for a static closure.
+
+
+ DATA_INFO_TABLE(table_name,entry_code);
+
+ Declares an info table suitable for a data closure.
+ This closure contains no heap pointers and its size
+ (of data and size field) in its first word
+
+ See NOTES.arbitary-ints
+
+
+ IND_INFO_TABLE(table_name,ind_code);
+
+ Declares an info table suitable for an indirection.
+ But see below !! (ToDo)
+
+
+Using a Particular Garbage Collection Scheme
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+When deciding which collector to use there are two decision points.
+
+At compile time it must be decided which code fragments are going to
+be attached to closures. This will limit the possible choice of GC
+schemes at run time.
+
+To compile the GC code and compiler-produced C Code for a particular
+set of code fragments an appropriate define (-D) directive is given
+to the compiler.
+
+Possible directives are:
+
+ Code Fragments GC Control Routines
+
+-DGC2s Copying Two Space Collection
+
+-DGC1s Marking & Compacting Inplace Compaction
+
+-DGCdm Copying, Marking DualMode Collection
+ & Compaction (+ TwoSpace and Compaction)
+-DGCap Copying, Marking Appels Collector
+ & Compaction (+ Compaction)
+
+If none of these are defined the result will be No Collection Schame.
+Heap will be allocated but the program will die if it is ever filled.
+
+Other Directives:
+
+-D_GC_DEBUG Provides detailed GC debugging trace output
+ (if showGCTrace set)
+
+Note that the GC code will eventually be set up already compiled for
+the different schemes and all that will be required will be to link
+with the appropriate object files. The compiler produced C will still
+need to be compiled with the appropriate define.
+
+
+Trace and Statistics Info
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+There are a couple of variables that can be set to provide info about
+GC.
+
+showGCTrace -- Provides detailed trace of GC and closure movement
+ TRUE -- Summary about GC invokation and heap location
+ & 2 -- Detailed trace of copying AND compacting collection
+ & 4 -- More detail about linked location lists during compaction
+ & 8 -- Detalied info about marking
+
+ The & options are only available if compiled with -D_GC_DEBUG
+
+showGCStats -- Provides summary statistics about GC performance
+ (ToDo)
+
+ToDo: These should eventually be able to be set by runtime flages
+
+
+Compiler Extensions Required for Compacting Collection
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+There are a number of additional requirements required of the STG
+machine and the resulting C code for Inplace Compaction to work.
+
+The most important and awkward arises from the fact that updated nodes
+will be scanned. This requires updated nodes (blackholes, indirections
+or inplace updates) to know how big the original closure was (so the
+location of the next closure can be determined).
+
+Implications (Suggestions -- Still to be done):
+
+ Need specialized black holes info pointers which know their size.
+
+ Code on the Update Stack needs to know the orig closure size. Either
+ record this size or have specialised update code fragments.
+
+ Updated closures need to know orig size. Possible solns are:
+
+ Create dummy garbage closures at the end to fill the hole.
+
+ Store size of closure in free space beyond and have GC
+ routines which look here for the size.
+
+ Specialised indirections that know their size.
+
+ May be able to search beyond the end of the closure for the next
+ info pointer. Possibly blanking out the unused portion of the
+ closure.