diff --git a/basis/compiler/codegen/gc-maps/gc-maps-docs.factor b/basis/compiler/codegen/gc-maps/gc-maps-docs.factor
new file mode 100644
index 0000000000..d583300fc0
--- /dev/null
+++ b/basis/compiler/codegen/gc-maps/gc-maps-docs.factor
@@ -0,0 +1,73 @@
+USING: bit-arrays byte-arrays compiler.cfg.instructions help.markup help.syntax
+kernel math ;
+IN: compiler.codegen.gc-maps
+
+ARTICLE: "compiler.codegen.gc-maps" "GC maps"
+"The " { $vocab-link "compiler.codegen.gc-maps" } " handles generating code for keeping track of garbage collection maps. Every code block either ends with:"
+{ $list "uint 0" }
+"or"
+{ $list
+  {
+      "bitmap, byte aligned, three subsequences:"
+      { $list
+        "<scrubbed data stack locations>"
+        "<scrubbed retain stack locations>"
+        "<GC root spill slots>"
+      }
+  }
+  "uint[] <base pointers>"
+  "uint[] <return addresses>"
+  "uint <largest scrubbed data stack location>"
+  "uint <largest scrubbed retain stack location>"
+  "uint <largest GC root spill slot>"
+  "uint <largest derived root spill slot>"
+  "int <number of return addresses>"
+} ;
+
+HELP: emit-gc-info-bitmaps
+{ $values
+  { "scrub-d-count" "Number of scrubbable datastack locations" }
+  { "scrub-r-count" "Number of scrubbable retainstack locations" }
+  { "gc-root-count" "Unknown!" }
+}
+{ $description "Emits the scrub location data in all gc-maps registered in the " { $link gc-maps } " variable to the make sequence being created. The result is a concatenation of all datastack scrub locations, retainstack scrub locations and gc root locations converted into a byte-array. Given that byte-array and knowledge of the number of scrub locations, the original gc-map can be reconstructed."  } ;
+
+HELP: emit-scrub
+{ $values
+  { "seqs" "a sequence of sequences of 0/1" }
+  { "n" "length of the longest sequence" }
+}
+{ $description "Emits a space-efficient " { $link bit-array } " to the make sequence being created. The outputted array will be of length n times the number of sequences given. Each group of n elements in the array contains true values if the stack location should be scrubbed, and false if it shouldn't." }
+{ $examples
+  { $example
+    "USING: bit-arrays byte-arrays compiler.codegen.gc-maps make prettyprint ;"
+    "[ { B{ 0 } B{ 0 } B{ 1 1 1 0 } } emit-scrub ] ?{ } make . ."
+    "?{ t f f f t f f f f f f t }\n4"
+  }
+} ;
+
+{ emit-gc-info-bitmaps emit-scrub } related-words
+
+HELP: emit-uint
+{ $values { "n" integer } }
+{ $description "Emits an unsigned 32 bit integer to the make sequence being created. The word takes care of ensuring that the byte order is correct for the current machine." }
+{ $examples
+  { $example
+    "USING: compiler.codegen.gc-maps make prettyprint ;"
+    "[ 0xffff emit-uint ] B{ } make ."
+    "B{ 255 255 0 0 }"
+  }
+} ;
+
+HELP: gc-maps
+{ $var-description "Variable that holds a sequence of " { $link gc-map } " tuples." } ;
+
+HELP: gc-map-needed?
+{ $values { "gc-map" gc-map } { "?" "a boolean" } }
+{ $description "If all slots in the gc-map are empty, then it doesn't need to be emitted." } ;
+
+HELP: serialize-gc-maps
+{ $values { "byte-array" byte-array } }
+{ $description "Serializes the gc-maps that have been registered in the " { $link gc-maps } " variable into a byte-array." } ;
+
+ABOUT: "compiler.codegen.gc-maps"