Index: llvm/trunk/include/llvm/CodeGen/GCMetadataPrinter.h =================================================================== --- llvm/trunk/include/llvm/CodeGen/GCMetadataPrinter.h +++ llvm/trunk/include/llvm/CodeGen/GCMetadataPrinter.h @@ -55,16 +55,14 @@ public: GCStrategy &getStrategy() { return *S; } - const Module &getModule() const { return S->getModule(); } /// begin/end - Iterate over the collected function metadata. iterator begin() { return S->begin(); } iterator end() { return S->end(); } /// beginAssembly/finishAssembly - Emit module metadata as assembly code. - virtual void beginAssembly(AsmPrinter &AP); - - virtual void finishAssembly(AsmPrinter &AP); + virtual void beginAssembly(Module &M, AsmPrinter &AP); + virtual void finishAssembly(Module &M, AsmPrinter &AP); virtual ~GCMetadataPrinter(); }; Index: llvm/trunk/include/llvm/CodeGen/GCStrategy.h =================================================================== --- llvm/trunk/include/llvm/CodeGen/GCStrategy.h +++ llvm/trunk/include/llvm/CodeGen/GCStrategy.h @@ -59,7 +59,6 @@ private: friend class GCModuleInfo; - const Module *M; std::string Name; list_type Functions; @@ -84,10 +83,6 @@ /// const std::string &getName() const { return Name; } - /// getModule - The module within which the GC strategy is operating. - /// - const Module &getModule() const { return *M; } - /// needsSafePoitns - True if safe points of any kind are required. By // default, none are recorded. bool needsSafePoints() const { Index: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp =================================================================== --- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -210,7 +210,7 @@ assert(MI && "AsmPrinter didn't require GCModuleInfo?"); for (auto &I : *MI) if (GCMetadataPrinter *MP = GetOrCreateGCPrinter(*I)) - MP->beginAssembly(*this); + MP->beginAssembly(M, *this); // Emit module-level inline asm if it exists. if (!M.getModuleInlineAsm().empty()) { @@ -985,7 +985,7 @@ assert(MI && "AsmPrinter didn't require GCModuleInfo?"); for (GCModuleInfo::iterator I = MI->end(), E = MI->begin(); I != E; ) if (GCMetadataPrinter *MP = GetOrCreateGCPrinter(**--I)) - MP->finishAssembly(*this); + MP->finishAssembly(M, *this); // Emit llvm.ident metadata in an '.ident' directive. EmitModuleIdents(M); Index: llvm/trunk/lib/CodeGen/AsmPrinter/ErlangGCPrinter.cpp =================================================================== --- llvm/trunk/lib/CodeGen/AsmPrinter/ErlangGCPrinter.cpp +++ llvm/trunk/lib/CodeGen/AsmPrinter/ErlangGCPrinter.cpp @@ -36,8 +36,8 @@ class ErlangGCPrinter : public GCMetadataPrinter { public: - void beginAssembly(AsmPrinter &AP) override; - void finishAssembly(AsmPrinter &AP) override; + void beginAssembly(Module &M, AsmPrinter &AP) override; + void finishAssembly(Module &M, AsmPrinter &AP) override; }; } @@ -47,9 +47,9 @@ void llvm::linkErlangGCPrinter() { } -void ErlangGCPrinter::beginAssembly(AsmPrinter &AP) { } +void ErlangGCPrinter::beginAssembly(Module &M, AsmPrinter &AP) { } -void ErlangGCPrinter::finishAssembly(AsmPrinter &AP) { +void ErlangGCPrinter::finishAssembly(Module &M, AsmPrinter &AP) { MCStreamer &OS = AP.OutStreamer; unsigned IntPtrSize = AP.TM.getSubtargetImpl()->getDataLayout()->getPointerSize(); Index: llvm/trunk/lib/CodeGen/AsmPrinter/OcamlGCPrinter.cpp =================================================================== --- llvm/trunk/lib/CodeGen/AsmPrinter/OcamlGCPrinter.cpp +++ llvm/trunk/lib/CodeGen/AsmPrinter/OcamlGCPrinter.cpp @@ -34,8 +34,8 @@ class OcamlGCMetadataPrinter : public GCMetadataPrinter { public: - void beginAssembly(AsmPrinter &AP) override; - void finishAssembly(AsmPrinter &AP) override; + void beginAssembly(Module &M, AsmPrinter &AP) override; + void finishAssembly(Module &M, AsmPrinter &AP) override; }; } @@ -67,12 +67,12 @@ AP.OutStreamer.EmitLabel(Sym); } -void OcamlGCMetadataPrinter::beginAssembly(AsmPrinter &AP) { +void OcamlGCMetadataPrinter::beginAssembly(Module &M, AsmPrinter &AP) { AP.OutStreamer.SwitchSection(AP.getObjFileLowering().getTextSection()); - EmitCamlGlobal(getModule(), AP, "code_begin"); + EmitCamlGlobal(M, AP, "code_begin"); AP.OutStreamer.SwitchSection(AP.getObjFileLowering().getDataSection()); - EmitCamlGlobal(getModule(), AP, "data_begin"); + EmitCamlGlobal(M, AP, "data_begin"); } /// emitAssembly - Print the frametable. The ocaml frametable format is thus: @@ -91,21 +91,21 @@ /// (FrameSize and LiveOffsets would overflow). FrameTablePrinter will abort if /// either condition is detected in a function which uses the GC. /// -void OcamlGCMetadataPrinter::finishAssembly(AsmPrinter &AP) { +void OcamlGCMetadataPrinter::finishAssembly(Module &M, AsmPrinter &AP) { unsigned IntPtrSize = AP.TM.getSubtargetImpl()->getDataLayout()->getPointerSize(); AP.OutStreamer.SwitchSection(AP.getObjFileLowering().getTextSection()); - EmitCamlGlobal(getModule(), AP, "code_end"); + EmitCamlGlobal(M, AP, "code_end"); AP.OutStreamer.SwitchSection(AP.getObjFileLowering().getDataSection()); - EmitCamlGlobal(getModule(), AP, "data_end"); + EmitCamlGlobal(M, AP, "data_end"); // FIXME: Why does ocaml emit this?? AP.OutStreamer.EmitIntValue(0, IntPtrSize); AP.OutStreamer.SwitchSection(AP.getObjFileLowering().getDataSection()); - EmitCamlGlobal(getModule(), AP, "frametable"); + EmitCamlGlobal(M, AP, "frametable"); int NumDescriptors = 0; for (iterator I = begin(), IE = end(); I != IE; ++I) { Index: llvm/trunk/lib/CodeGen/GCMetadata.cpp =================================================================== --- llvm/trunk/lib/CodeGen/GCMetadata.cpp +++ llvm/trunk/lib/CodeGen/GCMetadata.cpp @@ -71,7 +71,6 @@ E = GCRegistry::end(); I != E; ++I) { if (Name == I->getName()) { std::unique_ptr S = I->instantiate(); - S->M = M; S->Name = Name; StrategyMap[Name] = S.get(); StrategyList.push_back(std::move(S)); Index: llvm/trunk/lib/CodeGen/GCMetadataPrinter.cpp =================================================================== --- llvm/trunk/lib/CodeGen/GCMetadataPrinter.cpp +++ llvm/trunk/lib/CodeGen/GCMetadataPrinter.cpp @@ -18,10 +18,10 @@ GCMetadataPrinter::~GCMetadataPrinter() { } -void GCMetadataPrinter::beginAssembly(AsmPrinter &AP) { +void GCMetadataPrinter::beginAssembly(Module &M, AsmPrinter &AP) { // Default is no action. } -void GCMetadataPrinter::finishAssembly(AsmPrinter &AP) { +void GCMetadataPrinter::finishAssembly(Module &M, AsmPrinter &AP) { // Default is no action. }