Factor GC metadata table assembly generation out of Collector in preparation for splitting AsmPrinter into its own library.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@54880 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/OcamlCollector.cpp b/lib/CodeGen/OcamlCollector.cpp
index 9823d24..7f58f58 100644
--- a/lib/CodeGen/OcamlCollector.cpp
+++ b/lib/CodeGen/OcamlCollector.cpp
@@ -27,7 +27,10 @@
   class VISIBILITY_HIDDEN OcamlCollector : public Collector {
   public:
     OcamlCollector();
-    
+  };
+
+  class VISIBILITY_HIDDEN OcamlGCMetadataPrinter : public GCMetadataPrinter {
+  public:
     void beginAssembly(std::ostream &OS, AsmPrinter &AP,
                        const TargetAsmInfo &TAI);
     
@@ -40,6 +43,9 @@
 static CollectorRegistry::Add<OcamlCollector>
 X("ocaml", "ocaml 3.10-compatible collector");
 
+static GCMetadataPrinterRegistry::Add<OcamlGCMetadataPrinter>
+Y("ocaml", "ocaml 3.10-compatible collector");
+
 // -----------------------------------------------------------------------------
 
 static void EmitCamlGlobal(const Module &M, std::ostream &OS, AsmPrinter &AP,
@@ -68,10 +74,11 @@
 
 OcamlCollector::OcamlCollector() {
   NeededSafePoints = 1 << GC::PostCall;
+  UsesMetadata = true;
 }
 
-void OcamlCollector::beginAssembly(std::ostream &OS, AsmPrinter &AP,
-                                   const TargetAsmInfo &TAI) {
+void OcamlGCMetadataPrinter::beginAssembly(std::ostream &OS, AsmPrinter &AP,
+                                           const TargetAsmInfo &TAI) {
   AP.SwitchToTextSection(TAI.getTextSection());
   EmitCamlGlobal(getModule(), OS, AP, TAI, "code_begin");
   
@@ -95,8 +102,8 @@
 /// (FrameSize and LiveOffsets would overflow). FrameTablePrinter will abort if
 /// either condition is detected in a function which uses the collector.
 /// 
-void OcamlCollector::finishAssembly(std::ostream &OS, AsmPrinter &AP,
-                                    const TargetAsmInfo &TAI) {
+void OcamlGCMetadataPrinter::finishAssembly(std::ostream &OS, AsmPrinter &AP,
+                                            const TargetAsmInfo &TAI) {
   const char *AddressDirective;
   int AddressAlignLog;
   if (AP.TM.getTargetData()->getPointerSize() == sizeof(int32_t)) {