diff options
Diffstat (limited to 'lib/CodeGen')
-rw-r--r-- | lib/CodeGen/AsmPrinter.cpp | 37 | ||||
-rw-r--r-- | lib/CodeGen/Collector.cpp | 29 | ||||
-rw-r--r-- | lib/CodeGen/Collectors.cpp | 7 | ||||
-rw-r--r-- | lib/CodeGen/OcamlCollector.cpp | 17 |
4 files changed, 72 insertions, 18 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(); +} diff --git a/lib/CodeGen/Collector.cpp b/lib/CodeGen/Collector.cpp index 1a1fb7c733..6fd018961a 100644 --- a/lib/CodeGen/Collector.cpp +++ b/lib/CodeGen/Collector.cpp @@ -92,7 +92,8 @@ Collector::Collector() : CustomReadBarriers(false), CustomWriteBarriers(false), CustomRoots(false), - InitRoots(true) + InitRoots(true), + UsesMetadata(false) {} Collector::~Collector() { @@ -110,16 +111,6 @@ bool Collector::performCustomLowering(Function &F) { return 0; } -void Collector::beginAssembly(std::ostream &OS, AsmPrinter &AP, - const TargetAsmInfo &TAI) { - // Default is no action. -} - -void Collector::finishAssembly(std::ostream &OS, AsmPrinter &AP, - const TargetAsmInfo &TAI) { - // Default is no action. -} - CollectorMetadata *Collector::insertFunctionMetadata(const Function &F) { CollectorMetadata *CM = new CollectorMetadata(F, *this); Functions.push_back(CM); @@ -128,6 +119,22 @@ CollectorMetadata *Collector::insertFunctionMetadata(const Function &F) { // ----------------------------------------------------------------------------- +GCMetadataPrinter::GCMetadataPrinter() { } + +GCMetadataPrinter::~GCMetadataPrinter() { } + +void GCMetadataPrinter::beginAssembly(std::ostream &OS, AsmPrinter &AP, + const TargetAsmInfo &TAI) { + // Default is no action. +} + +void GCMetadataPrinter::finishAssembly(std::ostream &OS, AsmPrinter &AP, + const TargetAsmInfo &TAI) { + // Default is no action. +} + +// ----------------------------------------------------------------------------- + FunctionPass *llvm::createGCLoweringPass() { return new LowerIntrinsics(); } diff --git a/lib/CodeGen/Collectors.cpp b/lib/CodeGen/Collectors.cpp index e063d47a99..3b0c554daf 100644 --- a/lib/CodeGen/Collectors.cpp +++ b/lib/CodeGen/Collectors.cpp @@ -19,3 +19,10 @@ template<> CollectorRegistry::node *CollectorRegistry::Head = 0; template<> CollectorRegistry::node *CollectorRegistry::Tail = 0; template<> CollectorRegistry::listener *CollectorRegistry::ListenerHead = 0; template<> CollectorRegistry::listener *CollectorRegistry::ListenerTail = 0; + +template<> GCMetadataPrinterRegistry::node *GCMetadataPrinterRegistry::Head = 0; +template<> GCMetadataPrinterRegistry::node *GCMetadataPrinterRegistry::Tail = 0; +template<> GCMetadataPrinterRegistry::listener * +GCMetadataPrinterRegistry::ListenerHead = 0; +template<> GCMetadataPrinterRegistry::listener * +GCMetadataPrinterRegistry::ListenerTail = 0; diff --git a/lib/CodeGen/OcamlCollector.cpp b/lib/CodeGen/OcamlCollector.cpp index 9823d24986..7f58f58c29 100644 --- a/lib/CodeGen/OcamlCollector.cpp +++ b/lib/CodeGen/OcamlCollector.cpp @@ -27,7 +27,10 @@ namespace { 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 @@ namespace { 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 @@ Collector *llvm::createOcamlCollector() { 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 @@ void OcamlCollector::beginAssembly(std::ostream &OS, AsmPrinter &AP, /// (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)) { |