summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/include/llvm/CodeGen/GCMetadata.h21
-rw-r--r--llvm/include/llvm/CodeGen/GCMetadataPrinter.h2
-rw-r--r--llvm/include/llvm/CodeGen/GCStrategy.h (renamed from llvm/include/llvm/IR/GCStrategy.h)7
-rw-r--r--llvm/include/llvm/IR/Function.h5
-rw-r--r--llvm/lib/CodeGen/CMakeLists.txt1
-rw-r--r--llvm/lib/CodeGen/ErlangGC.cpp2
-rw-r--r--llvm/lib/CodeGen/GCMetadata.cpp34
-rw-r--r--llvm/lib/CodeGen/GCRootLowering.cpp2
-rw-r--r--llvm/lib/CodeGen/GCStrategy.cpp (renamed from llvm/lib/IR/GCStrategy.cpp)4
-rw-r--r--llvm/lib/CodeGen/OcamlGC.cpp2
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp2
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp2
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp2
-rw-r--r--llvm/lib/CodeGen/ShadowStackGC.cpp2
-rw-r--r--llvm/lib/CodeGen/StatepointExampleGC.cpp2
-rw-r--r--llvm/lib/IR/CMakeLists.txt1
-rw-r--r--llvm/lib/IR/Function.cpp6
-rw-r--r--llvm/lib/IR/LLVMContextImpl.cpp23
-rw-r--r--llvm/lib/IR/LLVMContextImpl.h11
19 files changed, 50 insertions, 81 deletions
diff --git a/llvm/include/llvm/CodeGen/GCMetadata.h b/llvm/include/llvm/CodeGen/GCMetadata.h
index 19aa0b031f3..357b2d8a7ca 100644
--- a/llvm/include/llvm/CodeGen/GCMetadata.h
+++ b/llvm/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 <memory>
@@ -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<GCStrategy *> StrategyList;
+ /// An owning list of all GCStrategies which have been created
+ SmallVector<std::unique_ptr<GCStrategy>, 1> GCStrategyList;
+ /// A helper map to speedup lookups into the above list
+ StringMap<GCStrategy*> 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<std::unique_ptr<GCFunctionInfo>> FuncInfoVec;
@@ -173,7 +180,7 @@ private:
finfo_map_type FInfoMap;
public:
- typedef std::vector<GCStrategy *>::const_iterator iterator;
+ typedef SmallVector<std::unique_ptr<GCStrategy>,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/llvm/include/llvm/CodeGen/GCMetadataPrinter.h b/llvm/include/llvm/CodeGen/GCMetadataPrinter.h
index 3e7d64cd15c..e07bb24e5f9 100644
--- a/llvm/include/llvm/CodeGen/GCMetadataPrinter.h
+++ b/llvm/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/llvm/include/llvm/IR/GCStrategy.h b/llvm/include/llvm/CodeGen/GCStrategy.h
index c9b0a848ab7..fbf4eac0d05 100644
--- a/llvm/include/llvm/IR/GCStrategy.h
+++ b/llvm/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<GCStrategy> GCRegistry;
-
-/// GCStrategy is instantiated in GCStrategy.cpp.
-extern template class Registry<GCStrategy>;
}
#endif
diff --git a/llvm/include/llvm/IR/Function.h b/llvm/include/llvm/IR/Function.h
index e9d0806eadd..51403281e96 100644
--- a/llvm/include/llvm/IR/Function.h
+++ b/llvm/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/llvm/lib/CodeGen/CMakeLists.txt b/llvm/lib/CodeGen/CMakeLists.txt
index 7f7f5225180..f0b2dfe365b 100644
--- a/llvm/lib/CodeGen/CMakeLists.txt
+++ b/llvm/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/llvm/lib/CodeGen/ErlangGC.cpp b/llvm/lib/CodeGen/ErlangGC.cpp
index 30af07f1214..a40bbb5052a 100644
--- a/llvm/lib/CodeGen/ErlangGC.cpp
+++ b/llvm/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/llvm/lib/CodeGen/GCMetadata.cpp b/llvm/lib/CodeGen/GCMetadata.cpp
index 7a61d61e7d0..ab8383a45c4 100644
--- a/llvm/lib/CodeGen/GCMetadata.cpp
+++ b/llvm/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<GCFunctionInfo>(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<GCStrategy> 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/llvm/lib/CodeGen/GCRootLowering.cpp b/llvm/lib/CodeGen/GCRootLowering.cpp
index 7cb459874ef..ee89ac4e614 100644
--- a/llvm/lib/CodeGen/GCRootLowering.cpp
+++ b/llvm/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/llvm/lib/IR/GCStrategy.cpp b/llvm/lib/CodeGen/GCStrategy.cpp
index b451310f7f0..554d326942e 100644
--- a/llvm/lib/IR/GCStrategy.cpp
+++ b/llvm/lib/CodeGen/GCStrategy.cpp
@@ -12,9 +12,7 @@
//
//===----------------------------------------------------------------------===//
-#include "llvm/IR/GCStrategy.h"
-
-template class llvm::Registry<llvm::GCStrategy>;
+#include "llvm/CodeGen/GCStrategy.h"
using namespace llvm;
diff --git a/llvm/lib/CodeGen/OcamlGC.cpp b/llvm/lib/CodeGen/OcamlGC.cpp
index 164e3700909..17654a6ac3a 100644
--- a/llvm/lib/CodeGen/OcamlGC.cpp
+++ b/llvm/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/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
index 8c25783f4ea..699e2bbff6a 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
+++ b/llvm/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/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
index c56973a44fa..63f3d5eb407 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
+++ b/llvm/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/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp
index 94f09bdc2f9..d3090a96845 100644
--- a/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp
+++ b/llvm/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/llvm/lib/CodeGen/ShadowStackGC.cpp b/llvm/lib/CodeGen/ShadowStackGC.cpp
index 163d0efc07a..e4a389195ee 100644
--- a/llvm/lib/CodeGen/ShadowStackGC.cpp
+++ b/llvm/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/llvm/lib/CodeGen/StatepointExampleGC.cpp b/llvm/lib/CodeGen/StatepointExampleGC.cpp
index 67f40c826fa..95dfd75018c 100644
--- a/llvm/lib/CodeGen/StatepointExampleGC.cpp
+++ b/llvm/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/llvm/lib/IR/CMakeLists.txt b/llvm/lib/IR/CMakeLists.txt
index 621c7ca9224..1a210e05827 100644
--- a/llvm/lib/IR/CMakeLists.txt
+++ b/llvm/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/llvm/lib/IR/Function.cpp b/llvm/lib/IR/Function.cpp
index ddfbaf7a187..070513edef2 100644
--- a/llvm/lib/IR/Function.cpp
+++ b/llvm/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/llvm/lib/IR/LLVMContextImpl.cpp b/llvm/lib/IR/LLVMContextImpl.cpp
index 3370bdb0f88..d717b92d9fe 100644
--- a/llvm/lib/IR/LLVMContextImpl.cpp
+++ b/llvm/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 <algorithm>
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<GCStrategy> 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/llvm/lib/IR/LLVMContextImpl.h b/llvm/lib/IR/LLVMContextImpl.h
index 12b150741dd..e4e9f8f2a45 100644
--- a/llvm/lib/IR/LLVMContextImpl.h
+++ b/llvm/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<std::unique_ptr<GCStrategy>, 1> GCStrategyList;
- /// A helper map to speedup lookups into the above list
- StringMap<GCStrategy*> 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();
OpenPOWER on IntegriCloud