[!] Breaking changes to GC infrastructure

Hi all,

In order to support linking AsmWriter separately from CodeGen, the Collector class (a CodeGen component) had to be decoupled from the AsmWriter interface. This required moving the beginAssembly and endAssembly methods to a separate abstract base class. If you had overridden these methods, your class may compile successfully but fail at runtime with a message of the form:

no GCMetadataPrinter registered for collector: %s

The fix is to transition your overrides to a subclass of GCMetadataPrinter:

  1. Subclass GCMetadataPrinter and move your beginAssembly and endAssembly implementations there. The GCMetadataPrinter has the same data accessors as Collector (now GCStrategy), so your implementation shouldn’t need many changes.

class BespokeGCPrinter : public GCMetadataPrinter {
void beginAssembly(…) { … }
void endAssembly(…) { … }

  1. Register your printer with GCMetadataPrinterRegistry.

X(“bespoke”, “my bespoke”);

  1. Set the new UsesMetadata flag in your Collector subclass’ constructor so that the AsmWriter will look for your assembly printer:

MyGC::MyGC() {

UsesMetadata = true;

In addition, I took the breaking change as an opportunity to rename some classes so that their role will hopefully be clearer. In particular, Collector was confusing to implementors. Several thought that this compile-time class was the place to implement their runtime GC heap. Of course, it doesn’t even exist at runtime.

Specifically, the renames are:

Collector → GCStrategy
CollectorMetadata → GCFunctionInfo
CollectorModuleMetadata → GCModuleInfo
CollectorRegistry → GCRegistry
Function::getCollector → getGC [setGC, hasGC, clearGC]

Several accessors and nested types have also been renamed to be consistent. These changes should be obvious.

Please let me know if you have any questions!



P.S. Sorry for the short notice; this just came up yesterday.