diff --git a/include/llvm/CodeGen/GCMetadata.h b/include/llvm/CodeGen/GCMetadata.h index 19aa0b031f3..357b2d8a7ca 100644 --- a/include/llvm/CodeGen/GCMetadata.h +++ b/include/llvm/CodeGen/GCMetadata.h @@ -34,9 +34,10 @@ #define LLVM_CODEGEN_GCMETADATA_H #include "llvm/ADT/DenseMap.h" +#include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringMap.h" +#include "llvm/CodeGen/GCStrategy.h" #include "llvm/IR/DebugLoc.h" -#include "llvm/IR/GCStrategy.h" #include "llvm/Pass.h" #include @@ -151,11 +152,17 @@ public: /// Records both the function level information used by GCRoots and a /// cache of the 'active' gc strategy objects for the current Module. class GCModuleInfo : public ImmutablePass { - /// A list of GCStrategies which are active in this Module. These are - /// not owning pointers. - std::vector StrategyList; + /// An owning list of all GCStrategies which have been created + SmallVector, 1> GCStrategyList; + /// A helper map to speedup lookups into the above list + StringMap GCStrategyMap; public: + /// Lookup the GCStrategy object associated with the given gc name. + /// Objects are owned internally; No caller should attempt to delete the + /// returned objects. + GCStrategy *getGCStrategy(const StringRef Name); + /// List of per function info objects. In theory, Each of these /// may be associated with a different GC. typedef std::vector> FuncInfoVec; @@ -173,7 +180,7 @@ private: finfo_map_type FInfoMap; public: - typedef std::vector::const_iterator iterator; + typedef SmallVector,1>::const_iterator iterator; static char ID; @@ -186,8 +193,8 @@ public: /// begin/end - Iterators for used strategies. /// - iterator begin() const { return StrategyList.begin(); } - iterator end() const { return StrategyList.end(); } + iterator begin() const { return GCStrategyList.begin(); } + iterator end() const { return GCStrategyList.end(); } /// get - Look up function metadata. This is currently assumed /// have the side effect of initializing the associated GCStrategy. That diff --git a/include/llvm/CodeGen/GCMetadataPrinter.h b/include/llvm/CodeGen/GCMetadataPrinter.h index 3e7d64cd15c..e07bb24e5f9 100644 --- a/include/llvm/CodeGen/GCMetadataPrinter.h +++ b/include/llvm/CodeGen/GCMetadataPrinter.h @@ -21,7 +21,7 @@ #define LLVM_CODEGEN_GCMETADATAPRINTER_H #include "llvm/CodeGen/GCMetadata.h" -#include "llvm/IR/GCStrategy.h" +#include "llvm/CodeGen/GCStrategy.h" #include "llvm/Support/Registry.h" namespace llvm { diff --git a/include/llvm/IR/GCStrategy.h b/include/llvm/CodeGen/GCStrategy.h similarity index 97% rename from include/llvm/IR/GCStrategy.h rename to include/llvm/CodeGen/GCStrategy.h index c9b0a848ab7..fbf4eac0d05 100644 --- a/include/llvm/IR/GCStrategy.h +++ b/include/llvm/CodeGen/GCStrategy.h @@ -1,4 +1,4 @@ -//===-- llvm/IR/GCStrategy.h - Garbage collection ----------*- C++ -*-===// +//===-- llvm/CodeGen/GCStrategy.h - Garbage collection ----------*- C++ -*-===// // // The LLVM Compiler Infrastructure // @@ -78,7 +78,7 @@ enum PointKind { class GCStrategy { private: std::string Name; - friend class LLVMContextImpl; + friend class GCModuleInfo; protected: bool UseStatepoints; /// Uses gc.statepoints as opposed to gc.roots, @@ -188,9 +188,6 @@ public: /// register your GCMetadataPrinter subclass with the /// GCMetadataPrinterRegistery as well. typedef Registry GCRegistry; - -/// GCStrategy is instantiated in GCStrategy.cpp. -extern template class Registry; } #endif diff --git a/include/llvm/IR/Function.h b/include/llvm/IR/Function.h index e9d0806eadd..51403281e96 100644 --- a/include/llvm/IR/Function.h +++ b/include/llvm/IR/Function.h @@ -29,7 +29,6 @@ namespace llvm { class FunctionType; -class GCStrategy; class LLVMContext; // Traits for intrusive list of basic blocks... @@ -226,10 +225,6 @@ public: void setGC(const char *Str); void clearGC(); - /// Returns the GCStrategy associated with the specified garbage collector - /// algorithm or nullptr if one is not set. - GCStrategy *getGCStrategy() const; - /// @brief adds the attribute to the list of attributes. void addAttribute(unsigned i, Attribute::AttrKind attr); diff --git a/lib/CodeGen/CMakeLists.txt b/lib/CodeGen/CMakeLists.txt index 7f7f5225180..f0b2dfe365b 100644 --- a/lib/CodeGen/CMakeLists.txt +++ b/lib/CodeGen/CMakeLists.txt @@ -23,6 +23,7 @@ add_llvm_library(LLVMCodeGen GCMetadata.cpp GCMetadataPrinter.cpp GCRootLowering.cpp + GCStrategy.cpp GlobalMerge.cpp IfConversion.cpp InlineSpiller.cpp diff --git a/lib/CodeGen/ErlangGC.cpp b/lib/CodeGen/ErlangGC.cpp index 30af07f1214..a40bbb5052a 100644 --- a/lib/CodeGen/ErlangGC.cpp +++ b/lib/CodeGen/ErlangGC.cpp @@ -16,7 +16,7 @@ #include "llvm/CodeGen/GCs.h" #include "llvm/CodeGen/MachineInstrBuilder.h" -#include "llvm/IR/GCStrategy.h" +#include "llvm/CodeGen/GCStrategy.h" #include "llvm/MC/MCContext.h" #include "llvm/MC/MCSymbol.h" #include "llvm/Target/TargetInstrInfo.h" diff --git a/lib/CodeGen/GCMetadata.cpp b/lib/CodeGen/GCMetadata.cpp index 7a61d61e7d0..ab8383a45c4 100644 --- a/lib/CodeGen/GCMetadata.cpp +++ b/lib/CodeGen/GCMetadata.cpp @@ -14,8 +14,8 @@ #include "llvm/CodeGen/GCMetadata.h" #include "llvm/CodeGen/MachineFrameInfo.h" #include "llvm/CodeGen/Passes.h" +#include "llvm/CodeGen/GCStrategy.h" #include "llvm/IR/Function.h" -#include "llvm/IR/GCStrategy.h" #include "llvm/MC/MCSymbol.h" #include "llvm/Pass.h" #include "llvm/Support/Debug.h" @@ -66,15 +66,7 @@ GCFunctionInfo &GCModuleInfo::getFunctionInfo(const Function &F) { if (I != FInfoMap.end()) return *I->second; - GCStrategy *S = F.getGCStrategy(); - if (!S) { - std::string error = std::string("unsupported GC: ") + F.getGC(); - report_fatal_error(error); - } - // Save the fact this strategy is associated with this module. Note that - // these are non-owning references, the GCStrategy remains owned by the - // Context. - StrategyList.push_back(S); + GCStrategy *S = getGCStrategy(F.getGC()); Functions.push_back(make_unique(F, *S)); GCFunctionInfo *GFI = Functions.back().get(); FInfoMap[&F] = GFI; @@ -84,7 +76,7 @@ GCFunctionInfo &GCModuleInfo::getFunctionInfo(const Function &F) { void GCModuleInfo::clear() { Functions.clear(); FInfoMap.clear(); - StrategyList.clear(); + GCStrategyList.clear(); } // ----------------------------------------------------------------------------- @@ -159,3 +151,23 @@ bool Printer::doFinalization(Module &M) { GMI->clear(); return false; } + + +GCStrategy *GCModuleInfo::getGCStrategy(const StringRef Name) { + // TODO: Arguably, just doing a linear search would be faster for small N + auto NMI = GCStrategyMap.find(Name); + if (NMI != GCStrategyMap.end()) + return NMI->getValue(); + + for (auto& Entry : GCRegistry::entries()) { + if (Name == Entry.getName()) { + std::unique_ptr S = Entry.instantiate(); + S->Name = Name; + GCStrategyMap[Name] = S.get(); + GCStrategyList.push_back(std::move(S)); + return GCStrategyList.back().get(); + } + } + + report_fatal_error(std::string("unsupported GC: ") + Name); +} diff --git a/lib/CodeGen/GCRootLowering.cpp b/lib/CodeGen/GCRootLowering.cpp index 7cb459874ef..ee89ac4e614 100644 --- a/lib/CodeGen/GCRootLowering.cpp +++ b/lib/CodeGen/GCRootLowering.cpp @@ -16,9 +16,9 @@ #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/MachineInstrBuilder.h" #include "llvm/CodeGen/MachineModuleInfo.h" +#include "llvm/CodeGen/GCStrategy.h" #include "llvm/CodeGen/Passes.h" #include "llvm/IR/Dominators.h" -#include "llvm/IR/GCStrategy.h" #include "llvm/IR/IntrinsicInst.h" #include "llvm/IR/Module.h" #include "llvm/Support/Debug.h" diff --git a/lib/IR/GCStrategy.cpp b/lib/CodeGen/GCStrategy.cpp similarity index 90% rename from lib/IR/GCStrategy.cpp rename to lib/CodeGen/GCStrategy.cpp index b451310f7f0..554d326942e 100644 --- a/lib/IR/GCStrategy.cpp +++ b/lib/CodeGen/GCStrategy.cpp @@ -12,9 +12,7 @@ // //===----------------------------------------------------------------------===// -#include "llvm/IR/GCStrategy.h" - -template class llvm::Registry; +#include "llvm/CodeGen/GCStrategy.h" using namespace llvm; diff --git a/lib/CodeGen/OcamlGC.cpp b/lib/CodeGen/OcamlGC.cpp index 164e3700909..17654a6ac3a 100644 --- a/lib/CodeGen/OcamlGC.cpp +++ b/lib/CodeGen/OcamlGC.cpp @@ -15,7 +15,7 @@ //===----------------------------------------------------------------------===// #include "llvm/CodeGen/GCs.h" -#include "llvm/IR/GCStrategy.h" +#include "llvm/CodeGen/GCStrategy.h" using namespace llvm; diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp index 8c25783f4ea..699e2bbff6a 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -26,6 +26,7 @@ #include "llvm/CodeGen/FastISel.h" #include "llvm/CodeGen/FunctionLoweringInfo.h" #include "llvm/CodeGen/GCMetadata.h" +#include "llvm/CodeGen/GCStrategy.h" #include "llvm/CodeGen/MachineFrameInfo.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/MachineInstrBuilder.h" @@ -40,7 +41,6 @@ #include "llvm/IR/DebugInfo.h" #include "llvm/IR/DerivedTypes.h" #include "llvm/IR/Function.h" -#include "llvm/IR/GCStrategy.h" #include "llvm/IR/GlobalVariable.h" #include "llvm/IR/InlineAsm.h" #include "llvm/IR/Instructions.h" diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index c56973a44fa..63f3d5eb407 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -11,6 +11,7 @@ // //===----------------------------------------------------------------------===// +#include "llvm/CodeGen/GCStrategy.h" #include "llvm/CodeGen/SelectionDAGISel.h" #include "ScheduleDAGSDNodes.h" #include "SelectionDAGBuilder.h" @@ -35,7 +36,6 @@ #include "llvm/IR/Constants.h" #include "llvm/IR/DebugInfo.h" #include "llvm/IR/Function.h" -#include "llvm/IR/GCStrategy.h" #include "llvm/IR/InlineAsm.h" #include "llvm/IR/Instructions.h" #include "llvm/IR/IntrinsicInst.h" diff --git a/lib/CodeGen/SelectionDAG/StatepointLowering.cpp b/lib/CodeGen/SelectionDAG/StatepointLowering.cpp index 94f09bdc2f9..d3090a96845 100644 --- a/lib/CodeGen/SelectionDAG/StatepointLowering.cpp +++ b/lib/CodeGen/SelectionDAG/StatepointLowering.cpp @@ -18,10 +18,10 @@ #include "llvm/ADT/Statistic.h" #include "llvm/CodeGen/GCMetadata.h" #include "llvm/CodeGen/FunctionLoweringInfo.h" +#include "llvm/CodeGen/GCStrategy.h" #include "llvm/CodeGen/SelectionDAG.h" #include "llvm/CodeGen/StackMaps.h" #include "llvm/IR/CallingConv.h" -#include "llvm/IR/GCStrategy.h" #include "llvm/IR/Instructions.h" #include "llvm/IR/IntrinsicInst.h" #include "llvm/IR/Intrinsics.h" diff --git a/lib/CodeGen/ShadowStackGC.cpp b/lib/CodeGen/ShadowStackGC.cpp index 163d0efc07a..e4a389195ee 100644 --- a/lib/CodeGen/ShadowStackGC.cpp +++ b/lib/CodeGen/ShadowStackGC.cpp @@ -26,9 +26,9 @@ //===----------------------------------------------------------------------===// #include "llvm/CodeGen/GCs.h" +#include "llvm/CodeGen/GCStrategy.h" #include "llvm/ADT/StringExtras.h" #include "llvm/IR/CallSite.h" -#include "llvm/IR/GCStrategy.h" #include "llvm/IR/IRBuilder.h" #include "llvm/IR/IntrinsicInst.h" #include "llvm/IR/Module.h" diff --git a/lib/CodeGen/StatepointExampleGC.cpp b/lib/CodeGen/StatepointExampleGC.cpp index 67f40c826fa..95dfd75018c 100644 --- a/lib/CodeGen/StatepointExampleGC.cpp +++ b/lib/CodeGen/StatepointExampleGC.cpp @@ -16,7 +16,7 @@ // //===----------------------------------------------------------------------===// -#include "llvm/IR/GCStrategy.h" +#include "llvm/CodeGen/GCStrategy.h" #include "llvm/IR/DerivedTypes.h" #include "llvm/IR/Value.h" diff --git a/lib/IR/CMakeLists.txt b/lib/IR/CMakeLists.txt index 621c7ca9224..1a210e05827 100644 --- a/lib/IR/CMakeLists.txt +++ b/lib/IR/CMakeLists.txt @@ -17,7 +17,6 @@ add_llvm_library(LLVMCore Dominators.cpp Function.cpp GCOV.cpp - GCStrategy.cpp GVMaterializer.cpp Globals.cpp IRBuilder.cpp diff --git a/lib/IR/Function.cpp b/lib/IR/Function.cpp index ddfbaf7a187..070513edef2 100644 --- a/lib/IR/Function.cpp +++ b/lib/IR/Function.cpp @@ -386,12 +386,6 @@ void Function::clearGC() { } } -GCStrategy *Function::getGCStrategy() const { - // Lookup the GCStrategy (which is owned by the Context), given the name of - // the GC in question. - return getContext().pImpl->getGCStrategy(getGC()); -} - /// copyAttributesFrom - copy all additional attributes (those not needed to /// create a Function) from the Function Src to this one. void Function::copyAttributesFrom(const GlobalValue *Src) { diff --git a/lib/IR/LLVMContextImpl.cpp b/lib/IR/LLVMContextImpl.cpp index 3370bdb0f88..d717b92d9fe 100644 --- a/lib/IR/LLVMContextImpl.cpp +++ b/lib/IR/LLVMContextImpl.cpp @@ -15,7 +15,6 @@ #include "llvm/ADT/STLExtras.h" #include "llvm/IR/Attributes.h" #include "llvm/IR/DiagnosticInfo.h" -#include "llvm/IR/GCStrategy.h" #include "llvm/IR/Module.h" #include using namespace llvm; @@ -239,25 +238,3 @@ void GetElementPtrConstantExpr::anchor() { } void CompareConstantExpr::anchor() { } -GCStrategy *LLVMContextImpl::getGCStrategy(const StringRef Name) { - // TODO: Arguably, just doing a linear search would be faster for small N - auto NMI = GCStrategyMap.find(Name); - if (NMI != GCStrategyMap.end()) - return NMI->getValue(); - - for (auto& Entry : GCRegistry::entries()) { - if (Name == Entry.getName()) { - std::unique_ptr S = Entry.instantiate(); - S->Name = Name; - GCStrategyMap[Name] = S.get(); - GCStrategyList.push_back(std::move(S)); - return GCStrategyList.back().get(); - } - } - - // No GCStrategy found for that name, error reporting is the job of our - // callers. - return nullptr; -} - - diff --git a/lib/IR/LLVMContextImpl.h b/lib/IR/LLVMContextImpl.h index 12b150741dd..e4e9f8f2a45 100644 --- a/lib/IR/LLVMContextImpl.h +++ b/lib/IR/LLVMContextImpl.h @@ -457,17 +457,6 @@ public: int getOrAddScopeRecordIdxEntry(MDNode *N, int ExistingIdx); int getOrAddScopeInlinedAtIdxEntry(MDNode *Scope, MDNode *IA,int ExistingIdx); - /// An owning list of all GCStrategies which have been created - SmallVector, 1> GCStrategyList; - /// A helper map to speedup lookups into the above list - StringMap GCStrategyMap; - - /// Lookup the GCStrategy object associated with the given gc name. If one - /// can't be found, returns nullptr. The lifetime of the returned objects - /// is dictated by the lifetime of the associated context. No caller should - /// attempt to delete the returned objects. - GCStrategy *getGCStrategy(const StringRef Name); - LLVMContextImpl(LLVMContext &C); ~LLVMContextImpl();