aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/AsmPrinter.cpp
diff options
context:
space:
mode:
authorGordon Henriksen <gordonhenriksen@mac.com>2008-08-17 12:08:44 +0000
committerGordon Henriksen <gordonhenriksen@mac.com>2008-08-17 12:08:44 +0000
commitc317a60c2714a5b90700a11ba646285cb754a5d3 (patch)
tree776b86519f67f3161e148249ea1118c0cc85260f /lib/CodeGen/AsmPrinter.cpp
parentb68dc369e06f8d1666562a70bab6bc3f7d642989 (diff)
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
Diffstat (limited to 'lib/CodeGen/AsmPrinter.cpp')
-rw-r--r--lib/CodeGen/AsmPrinter.cpp37
1 files changed, 35 insertions, 2 deletions
diff --git a/lib/CodeGen/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter.cpp
index 1bc4868a60..3b2dcb31d2 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 @@ AsmPrinter::AsmPrinter(std::ostream &o, TargetMachine &tm,
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 @@ bool AsmPrinter::doInitialization(Module &M) {
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 @@ bool AsmPrinter::doFinalization(Module &M) {
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 @@ void AsmPrinter::printVisibility(const std::string& Name,
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();
+}