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/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter.cpp
index 1bc4868..3b2dcb3 100644
--- a/lib/CodeGen/AsmPrinter.cpp
+++ b/lib/CodeGen/AsmPrinter.cpp
@@ -18,6 +18,7 @@
 #include "llvm/Module.h"
 #include "llvm/CodeGen/Collector.h"
 #include "llvm/CodeGen/CollectorMetadata.h"
+#include "llvm/CodeGen/Collectors.h"
 #include "llvm/CodeGen/MachineConstantPool.h"
 #include "llvm/CodeGen/MachineJumpTableInfo.h"
 #include "llvm/CodeGen/MachineModuleInfo.h"
@@ -43,6 +44,12 @@
     IsInTextSection(false)
 {}
 
+AsmPrinter::~AsmPrinter() {
+  for (gcp_iterator I = GCMetadataPrinters.begin(),
+                    E = GCMetadataPrinters.end(); I != E; ++I)
+    delete I->second;
+}
+    
 std::string AsmPrinter::getSectionForFunction(const Function &F) const {
   return TAI->getTextSection();
 }
@@ -113,7 +120,8 @@
   assert(CMM && "AsmPrinter didn't require CollectorModuleMetadata?");
   for (CollectorModuleMetadata::iterator I = CMM->begin(),
                                          E = CMM->end(); I != E; ++I)
-    (*I)->beginAssembly(O, *this, *TAI);
+    if (GCMetadataPrinter *GCP = GetOrCreateGCPrinter(*I))
+      GCP->beginAssembly(O, *this, *TAI);
   
   if (!M.getModuleInlineAsm().empty())
     O << TAI->getCommentString() << " Start of file scope inline assembly\n"
@@ -188,7 +196,8 @@
   assert(CMM && "AsmPrinter didn't require CollectorModuleMetadata?");
   for (CollectorModuleMetadata::iterator I = CMM->end(),
                                          E = CMM->begin(); I != E; )
-    (*--I)->finishAssembly(O, *this, *TAI);
+    if (GCMetadataPrinter *GCP = GetOrCreateGCPrinter(*--I))
+      GCP->finishAssembly(O, *this, *TAI);
 
   // If we don't have any trampolines, then we don't require stack memory
   // to be executable. Some targets have a directive to declare this.
@@ -1456,3 +1465,27 @@
       O << Directive << Name << '\n';
   }
 }
+
+GCMetadataPrinter *AsmPrinter::GetOrCreateGCPrinter(Collector *C) {
+  if (!C->usesMetadata())
+    return 0;
+  
+  gcp_iterator GCPI = GCMetadataPrinters.find(C);
+  if (GCPI != GCMetadataPrinters.end())
+    return GCPI->second;
+  
+  const char *Name = C->getName().c_str();
+  
+  for (GCMetadataPrinterRegistry::iterator
+         I = GCMetadataPrinterRegistry::begin(),
+         E = GCMetadataPrinterRegistry::end(); I != E; ++I)
+    if (strcmp(Name, I->getName()) == 0) {
+      GCMetadataPrinter *GCP = I->instantiate();
+      GCP->Coll = C;
+      GCMetadataPrinters.insert(std::make_pair(C, GCP));
+      return GCP;
+    }
+  
+  cerr << "no GCMetadataPrinter registered for collector: " << Name << "\n";
+  abort();
+}