diff options
| author | Gordon Henriksen <gordonhenriksen@mac.com> | 2008-08-17 12:08:44 +0000 |
|---|---|---|
| committer | Gordon Henriksen <gordonhenriksen@mac.com> | 2008-08-17 12:08:44 +0000 |
| commit | dbe06d3b69cab1ae6e708f5eca69cb0538a09842 (patch) | |
| tree | e58d6b41bc207476d3207d8bef38e8348a72210e /llvm/lib/CodeGen/AsmPrinter.cpp | |
| parent | b97ff82bd4c875004d233424a9cb0da089ddb96f (diff) | |
| download | bcm5719-llvm-dbe06d3b69cab1ae6e708f5eca69cb0538a09842.tar.gz bcm5719-llvm-dbe06d3b69cab1ae6e708f5eca69cb0538a09842.zip | |
Factor GC metadata table assembly generation out of Collector in preparation for splitting AsmPrinter into its own library.
llvm-svn: 54880
Diffstat (limited to 'llvm/lib/CodeGen/AsmPrinter.cpp')
| -rw-r--r-- | llvm/lib/CodeGen/AsmPrinter.cpp | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter.cpp index 1bc4868a608..3b2dcb31d29 100644 --- a/llvm/lib/CodeGen/AsmPrinter.cpp +++ b/llvm/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(); +} |

