Revert GCStrategy ownership changes
authorPhilip Reames <listmail@philipreames.com>
Mon, 26 Jan 2015 18:26:35 +0000 (18:26 +0000)
committerPhilip Reames <listmail@philipreames.com>
Mon, 26 Jan 2015 18:26:35 +0000 (18:26 +0000)
This change reverts the interesting parts of 226311 (and 227046).  This change introduced two problems, and I've been convinced that an alternate approach is preferrable anyways.

The bugs were:
- Registery appears to require all users be within the same linkage unit.  After this change, asking for "statepoint-example" in Transform/ would sometimes get you nullptr, whereas asking the same question in CodeGen would return the right GCStrategy.  The correct long term fix is to get rid of the utter hack which is Registry, but I don't have time for that right now.  227046 appears to have been an attempt to fix this, but I don't believe it does so completely.
- GCMetadataPrinter::finishAssembly was being called more than once per GCStrategy.  Each Strategy was being added to the GCModuleInfo multiple times.

Once I get time again, I'm going to split GCModuleInfo into the gc.root specific part and a GCStrategy owning Analysis pass.  I'm probably also going to kill off the Registry.  Once that's done, I'll move the new GCStrategyAnalysis and all built in GCStrategies into Analysis.  (As original suggested by Chandler.)  This will accomplish my original goal of being able to access GCStrategy from Transform/  without adding all of the builtin GCs to IR/.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@227109 91177308-0d34-0410-b5e6-96231b3b80d8

21 files changed:
include/llvm/CodeGen/GCMetadata.h
include/llvm/CodeGen/GCMetadataPrinter.h
include/llvm/CodeGen/GCStrategy.h [new file with mode: 0644]
include/llvm/IR/Function.h
include/llvm/IR/GCStrategy.h [deleted file]
lib/CodeGen/CMakeLists.txt
lib/CodeGen/ErlangGC.cpp
lib/CodeGen/GCMetadata.cpp
lib/CodeGen/GCRootLowering.cpp
lib/CodeGen/GCStrategy.cpp [new file with mode: 0644]
lib/CodeGen/OcamlGC.cpp
lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
lib/CodeGen/SelectionDAG/StatepointLowering.cpp
lib/CodeGen/ShadowStackGC.cpp
lib/CodeGen/StatepointExampleGC.cpp
lib/IR/CMakeLists.txt
lib/IR/Function.cpp
lib/IR/GCStrategy.cpp [deleted file]
lib/IR/LLVMContextImpl.cpp
lib/IR/LLVMContextImpl.h

index 19aa0b031f36dd90c14a17b95fc23e9aa9c1c496..357b2d8a7ca7addf1ecf0b6f0b0e2e1ea77168bc 100644 (file)
 #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
index 3e7d64cd15c0dd0aecc543539c23688f977cba9c..e07bb24e5f9cf3020229a208126e8989918cee2d 100644 (file)
@@ -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/CodeGen/GCStrategy.h b/include/llvm/CodeGen/GCStrategy.h
new file mode 100644 (file)
index 0000000..fbf4eac
--- /dev/null
@@ -0,0 +1,193 @@
+//===-- llvm/CodeGen/GCStrategy.h - Garbage collection ----------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// GCStrategy coordinates code generation algorithms and implements some itself
+// in order to generate code compatible with a target code generator as
+// specified in a function's 'gc' attribute. Algorithms are enabled by setting
+// flags in a subclass's constructor, and some virtual methods can be
+// overridden.
+//
+// GCStrategy is relevant for implementations using either gc.root or
+// gc.statepoint based lowering strategies, but is currently focused mostly on
+// options for gc.root.  This will change over time.
+//
+// When requested by a subclass of GCStrategy, the gc.root implementation will
+// populate GCModuleInfo and GCFunctionInfo with that about each Function in
+// the Module that opts in to garbage collection.  Specifically:
+//
+// - Safe points
+//   Garbage collection is generally only possible at certain points in code.
+//   GCStrategy can request that the collector insert such points:
+//
+//     - At and after any call to a subroutine
+//     - Before returning from the current function
+//     - Before backwards branches (loops)
+//
+// - Roots
+//   When a reference to a GC-allocated object exists on the stack, it must be
+//   stored in an alloca registered with llvm.gcoot.
+//
+// This information can used to emit the metadata tables which are required by
+// the target garbage collector runtime.
+//
+// When used with gc.statepoint, information about safepoint and roots can be
+// found in the binary StackMap section after code generation.  Safepoint
+// placement is currently the responsibility of the frontend, though late
+// insertion support is planned.  gc.statepoint does not currently support
+// custom stack map formats; such can be generated by parsing the standard
+// stack map section if desired.
+//
+// The read and write barrier support can be used with either implementation.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_IR_GCSTRATEGY_H
+#define LLVM_IR_GCSTRATEGY_H
+
+#include "llvm/ADT/Optional.h"
+#include "llvm/IR/Value.h"
+#include "llvm/IR/Function.h"
+#include "llvm/IR/Module.h"
+#include "llvm/Support/ErrorHandling.h"
+#include "llvm/Support/Registry.h"
+#include <string>
+
+namespace llvm {
+namespace GC {
+/// PointKind - The type of a collector-safe point.
+///
+enum PointKind {
+  Loop,    ///< Instr is a loop (backwards branch).
+  Return,  ///< Instr is a return instruction.
+  PreCall, ///< Instr is a call instruction.
+  PostCall ///< Instr is the return address of a call.
+};
+}
+
+/// GCStrategy describes a garbage collector algorithm's code generation
+/// requirements, and provides overridable hooks for those needs which cannot
+/// be abstractly described.  GCStrategy objects must be looked up through
+/// the Function.  The objects themselves are owned by the Context and must
+/// be immutable.
+class GCStrategy {
+private:
+  std::string Name;
+  friend class GCModuleInfo;
+
+protected:
+  bool UseStatepoints; /// Uses gc.statepoints as opposed to gc.roots,
+                       /// if set, none of the other options can be
+                       /// anything but their default values.
+
+  unsigned NeededSafePoints; ///< Bitmask of required safe points.
+  bool CustomReadBarriers;   ///< Default is to insert loads.
+  bool CustomWriteBarriers;  ///< Default is to insert stores.
+  bool CustomRoots;          ///< Default is to pass through to backend.
+  bool InitRoots;            ///< If set, roots are nulled during lowering.
+  bool UsesMetadata;         ///< If set, backend must emit metadata tables.
+
+public:
+  GCStrategy();
+  virtual ~GCStrategy() {}
+
+  /// Return the name of the GC strategy.  This is the value of the collector
+  /// name string specified on functions which use this strategy.
+  const std::string &getName() const { return Name; }
+
+  /// By default, write barriers are replaced with simple store
+  /// instructions. If true, then performCustomLowering must instead lower
+  /// them.
+  bool customWriteBarrier() const { return CustomWriteBarriers; }
+
+  /// By default, read barriers are replaced with simple load
+  /// instructions. If true, then performCustomLowering must instead lower
+  /// them.
+  bool customReadBarrier() const { return CustomReadBarriers; }
+
+  /// Returns true if this strategy is expecting the use of gc.statepoints,
+  /// and false otherwise.
+  bool useStatepoints() const { return UseStatepoints; }
+
+  /** @name Statepoint Specific Properties */
+  ///@{
+
+  /// If the value specified can be reliably distinguished, returns true for
+  /// pointers to GC managed locations and false for pointers to non-GC
+  /// managed locations.  Note a GCStrategy can always return 'None' (i.e. an
+  /// empty optional indicating it can't reliably distinguish.
+  virtual Optional<bool> isGCManagedPointer(const Value *V) const {
+    return None;
+  }
+  ///@}
+
+  /** @name GCRoot Specific Properties
+   * These properties and overrides only apply to collector strategies using
+   * GCRoot.
+   */
+  ///@{
+
+  /// True if safe points of any kind are required. By default, none are
+  /// recorded.
+  bool needsSafePoints() const { return NeededSafePoints != 0; }
+
+  /// True if the given kind of safe point is required. By default, none are
+  /// recorded.
+  bool needsSafePoint(GC::PointKind Kind) const {
+    return (NeededSafePoints & 1 << Kind) != 0;
+  }
+
+  /// By default, roots are left for the code generator so it can generate a
+  /// stack map. If true, then performCustomLowering must delete them.
+  bool customRoots() const { return CustomRoots; }
+
+  /// If set, gcroot intrinsics should initialize their allocas to null
+  /// before the first use. This is necessary for most GCs and is enabled by
+  /// default.
+  bool initializeRoots() const { return InitRoots; }
+
+  /// If set, appropriate metadata tables must be emitted by the back-end
+  /// (assembler, JIT, or otherwise). For statepoint, this method is
+  /// currently unsupported.  The stackmap information can be found in the
+  /// StackMap section as described in the documentation.
+  bool usesMetadata() const { return UsesMetadata; }
+
+  ///@}
+
+  /// initializeCustomLowering/performCustomLowering - If any of the actions
+  /// are set to custom, performCustomLowering must be overriden to transform
+  /// the corresponding actions to LLVM IR. initializeCustomLowering is
+  /// optional to override. These are the only GCStrategy methods through
+  /// which the LLVM IR can be modified.  These methods apply mostly to
+  /// gc.root based implementations, but can be overriden to provide custom
+  /// barrier lowerings with gc.statepoint as well.
+  ///@{
+  virtual bool initializeCustomLowering(Module &F) {
+    // No changes made
+    return false;
+  }
+  virtual bool performCustomLowering(Function &F) {
+    llvm_unreachable("GCStrategy subclass specified a configuration which"
+                     "requires a custom lowering without providing one");
+  }
+};
+
+/// Subclasses of GCStrategy are made available for use during compilation by
+/// adding them to the global GCRegistry.  This can done either within the
+/// LLVM source tree or via a loadable plugin.  An example registeration
+/// would be:
+/// static GCRegistry::Add<CustomGC> X("custom-name",
+///        "my custom supper fancy gc strategy");
+///
+/// Note that to use a custom GCMetadataPrinter w/gc.roots, you must also
+/// register your GCMetadataPrinter subclass with the
+/// GCMetadataPrinterRegistery as well.
+typedef Registry<GCStrategy> GCRegistry;
+}
+
+#endif
index e9d0806eaddde185231d4c04cce9b5e62dea0ac2..51403281e964e6927eced0db01859002cde9e517 100644 (file)
@@ -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/include/llvm/IR/GCStrategy.h b/include/llvm/IR/GCStrategy.h
deleted file mode 100644 (file)
index c9b0a84..0000000
+++ /dev/null
@@ -1,196 +0,0 @@
-//===-- llvm/IR/GCStrategy.h - Garbage collection ----------*- C++ -*-===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// GCStrategy coordinates code generation algorithms and implements some itself
-// in order to generate code compatible with a target code generator as
-// specified in a function's 'gc' attribute. Algorithms are enabled by setting
-// flags in a subclass's constructor, and some virtual methods can be
-// overridden.
-//
-// GCStrategy is relevant for implementations using either gc.root or
-// gc.statepoint based lowering strategies, but is currently focused mostly on
-// options for gc.root.  This will change over time.
-//
-// When requested by a subclass of GCStrategy, the gc.root implementation will
-// populate GCModuleInfo and GCFunctionInfo with that about each Function in
-// the Module that opts in to garbage collection.  Specifically:
-//
-// - Safe points
-//   Garbage collection is generally only possible at certain points in code.
-//   GCStrategy can request that the collector insert such points:
-//
-//     - At and after any call to a subroutine
-//     - Before returning from the current function
-//     - Before backwards branches (loops)
-//
-// - Roots
-//   When a reference to a GC-allocated object exists on the stack, it must be
-//   stored in an alloca registered with llvm.gcoot.
-//
-// This information can used to emit the metadata tables which are required by
-// the target garbage collector runtime.
-//
-// When used with gc.statepoint, information about safepoint and roots can be
-// found in the binary StackMap section after code generation.  Safepoint
-// placement is currently the responsibility of the frontend, though late
-// insertion support is planned.  gc.statepoint does not currently support
-// custom stack map formats; such can be generated by parsing the standard
-// stack map section if desired.
-//
-// The read and write barrier support can be used with either implementation.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_IR_GCSTRATEGY_H
-#define LLVM_IR_GCSTRATEGY_H
-
-#include "llvm/ADT/Optional.h"
-#include "llvm/IR/Value.h"
-#include "llvm/IR/Function.h"
-#include "llvm/IR/Module.h"
-#include "llvm/Support/ErrorHandling.h"
-#include "llvm/Support/Registry.h"
-#include <string>
-
-namespace llvm {
-namespace GC {
-/// PointKind - The type of a collector-safe point.
-///
-enum PointKind {
-  Loop,    ///< Instr is a loop (backwards branch).
-  Return,  ///< Instr is a return instruction.
-  PreCall, ///< Instr is a call instruction.
-  PostCall ///< Instr is the return address of a call.
-};
-}
-
-/// GCStrategy describes a garbage collector algorithm's code generation
-/// requirements, and provides overridable hooks for those needs which cannot
-/// be abstractly described.  GCStrategy objects must be looked up through
-/// the Function.  The objects themselves are owned by the Context and must
-/// be immutable.
-class GCStrategy {
-private:
-  std::string Name;
-  friend class LLVMContextImpl;
-
-protected:
-  bool UseStatepoints; /// Uses gc.statepoints as opposed to gc.roots,
-                       /// if set, none of the other options can be
-                       /// anything but their default values.
-
-  unsigned NeededSafePoints; ///< Bitmask of required safe points.
-  bool CustomReadBarriers;   ///< Default is to insert loads.
-  bool CustomWriteBarriers;  ///< Default is to insert stores.
-  bool CustomRoots;          ///< Default is to pass through to backend.
-  bool InitRoots;            ///< If set, roots are nulled during lowering.
-  bool UsesMetadata;         ///< If set, backend must emit metadata tables.
-
-public:
-  GCStrategy();
-  virtual ~GCStrategy() {}
-
-  /// Return the name of the GC strategy.  This is the value of the collector
-  /// name string specified on functions which use this strategy.
-  const std::string &getName() const { return Name; }
-
-  /// By default, write barriers are replaced with simple store
-  /// instructions. If true, then performCustomLowering must instead lower
-  /// them.
-  bool customWriteBarrier() const { return CustomWriteBarriers; }
-
-  /// By default, read barriers are replaced with simple load
-  /// instructions. If true, then performCustomLowering must instead lower
-  /// them.
-  bool customReadBarrier() const { return CustomReadBarriers; }
-
-  /// Returns true if this strategy is expecting the use of gc.statepoints,
-  /// and false otherwise.
-  bool useStatepoints() const { return UseStatepoints; }
-
-  /** @name Statepoint Specific Properties */
-  ///@{
-
-  /// If the value specified can be reliably distinguished, returns true for
-  /// pointers to GC managed locations and false for pointers to non-GC
-  /// managed locations.  Note a GCStrategy can always return 'None' (i.e. an
-  /// empty optional indicating it can't reliably distinguish.
-  virtual Optional<bool> isGCManagedPointer(const Value *V) const {
-    return None;
-  }
-  ///@}
-
-  /** @name GCRoot Specific Properties
-   * These properties and overrides only apply to collector strategies using
-   * GCRoot.
-   */
-  ///@{
-
-  /// True if safe points of any kind are required. By default, none are
-  /// recorded.
-  bool needsSafePoints() const { return NeededSafePoints != 0; }
-
-  /// True if the given kind of safe point is required. By default, none are
-  /// recorded.
-  bool needsSafePoint(GC::PointKind Kind) const {
-    return (NeededSafePoints & 1 << Kind) != 0;
-  }
-
-  /// By default, roots are left for the code generator so it can generate a
-  /// stack map. If true, then performCustomLowering must delete them.
-  bool customRoots() const { return CustomRoots; }
-
-  /// If set, gcroot intrinsics should initialize their allocas to null
-  /// before the first use. This is necessary for most GCs and is enabled by
-  /// default.
-  bool initializeRoots() const { return InitRoots; }
-
-  /// If set, appropriate metadata tables must be emitted by the back-end
-  /// (assembler, JIT, or otherwise). For statepoint, this method is
-  /// currently unsupported.  The stackmap information can be found in the
-  /// StackMap section as described in the documentation.
-  bool usesMetadata() const { return UsesMetadata; }
-
-  ///@}
-
-  /// initializeCustomLowering/performCustomLowering - If any of the actions
-  /// are set to custom, performCustomLowering must be overriden to transform
-  /// the corresponding actions to LLVM IR. initializeCustomLowering is
-  /// optional to override. These are the only GCStrategy methods through
-  /// which the LLVM IR can be modified.  These methods apply mostly to
-  /// gc.root based implementations, but can be overriden to provide custom
-  /// barrier lowerings with gc.statepoint as well.
-  ///@{
-  virtual bool initializeCustomLowering(Module &F) {
-    // No changes made
-    return false;
-  }
-  virtual bool performCustomLowering(Function &F) {
-    llvm_unreachable("GCStrategy subclass specified a configuration which"
-                     "requires a custom lowering without providing one");
-  }
-};
-
-/// Subclasses of GCStrategy are made available for use during compilation by
-/// adding them to the global GCRegistry.  This can done either within the
-/// LLVM source tree or via a loadable plugin.  An example registeration
-/// would be:
-/// static GCRegistry::Add<CustomGC> X("custom-name",
-///        "my custom supper fancy gc strategy");
-///
-/// Note that to use a custom GCMetadataPrinter w/gc.roots, you must also
-/// 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
index 7f7f5225180c5874019d9e9a5e45281de6a06311..f0b2dfe365b73b59007ce310541b51ac7f86563f 100644 (file)
@@ -23,6 +23,7 @@ add_llvm_library(LLVMCodeGen
   GCMetadata.cpp
   GCMetadataPrinter.cpp
   GCRootLowering.cpp
+  GCStrategy.cpp
   GlobalMerge.cpp
   IfConversion.cpp
   InlineSpiller.cpp
index 30af07f12141ad1f6b11e5ca56ef7d8e1c03b2ac..a40bbb5052abdd582035b62768973b427b865af8 100644 (file)
@@ -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"
index 7a61d61e7d02c1556770b7c18c49ba48d93d242e..ab8383a45c4c2e2af7a9103bf81d0ac08b2e75cb 100644 (file)
@@ -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);
+}
index 7cb459874ef27146bf8279e60900b881ae899f75..ee89ac4e61436673946d49591503f8e9730ed1ac 100644 (file)
@@ -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/CodeGen/GCStrategy.cpp b/lib/CodeGen/GCStrategy.cpp
new file mode 100644 (file)
index 0000000..554d326
--- /dev/null
@@ -0,0 +1,22 @@
+//===-- GCStrategy.cpp - Garbage Collector Description --------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file implements the policy object GCStrategy which describes the
+// behavior of a given garbage collector.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/CodeGen/GCStrategy.h"
+
+using namespace llvm;
+
+GCStrategy::GCStrategy()
+    : UseStatepoints(false), NeededSafePoints(0), CustomReadBarriers(false),
+      CustomWriteBarriers(false), CustomRoots(false), InitRoots(true),
+      UsesMetadata(false) {}
index 164e3700909e41e270e267ff37929049a7601202..17654a6ac3a20da74caf9e384e4c880df02ab91d 100644 (file)
@@ -15,7 +15,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "llvm/CodeGen/GCs.h"
-#include "llvm/IR/GCStrategy.h"
+#include "llvm/CodeGen/GCStrategy.h"
 
 using namespace llvm;
 
index 8c25783f4ea1c4018783fe72456e8c606e9585bc..699e2bbff6ae96d191550832e4bc76ede953909d 100644 (file)
@@ -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"
index c56973a44fa3f23a6cf8cbd43eb45e6c46ba6ef7..63f3d5eb4070f049ff485888bce0e688c4790cd0 100644 (file)
@@ -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"
index 94f09bdc2f964761c5be1e5d6c9f9f0a655dce5d..d3090a968456b17f531a681937796be3fa0e153d 100644 (file)
 #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"
index 163d0efc07a81ef5c23f35dc42cb414d3ceba5a4..e4a389195eec9e90cc89336910740876c643eae8 100644 (file)
@@ -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"
index 67f40c826fafb288390faf39458556351c5cdd72..95dfd75018c13b28de77b439106f94301c390c17 100644 (file)
@@ -16,7 +16,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "llvm/IR/GCStrategy.h"
+#include "llvm/CodeGen/GCStrategy.h"
 #include "llvm/IR/DerivedTypes.h"
 #include "llvm/IR/Value.h"
 
index 621c7ca922429aa1fc0a8eda4081a687ec767215..1a210e05827546445c2a7607648f4f37f378214f 100644 (file)
@@ -17,7 +17,6 @@ add_llvm_library(LLVMCore
   Dominators.cpp
   Function.cpp
   GCOV.cpp
-  GCStrategy.cpp
   GVMaterializer.cpp
   Globals.cpp
   IRBuilder.cpp
index ddfbaf7a187c0653252fdc88e34cf17a846a4f34..070513edef22d75670934d516c2f646ad3b114b1 100644 (file)
@@ -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/GCStrategy.cpp b/lib/IR/GCStrategy.cpp
deleted file mode 100644 (file)
index b451310..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-//===-- GCStrategy.cpp - Garbage Collector Description --------------------===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This file implements the policy object GCStrategy which describes the
-// behavior of a given garbage collector.
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/IR/GCStrategy.h"
-
-template class llvm::Registry<llvm::GCStrategy>;
-
-using namespace llvm;
-
-GCStrategy::GCStrategy()
-    : UseStatepoints(false), NeededSafePoints(0), CustomReadBarriers(false),
-      CustomWriteBarriers(false), CustomRoots(false), InitRoots(true),
-      UsesMetadata(false) {}
index 3370bdb0f8898f042538feb865e1f039c113dce4..d717b92d9fe1e0cdb95416982622b25e6991abb3 100644 (file)
@@ -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;
-}
-
-
index 12b150741dda35ee9952824163b7772887b755f1..e4e9f8f2a45341e331d61065aa8647825dfe9b46 100644 (file)
@@ -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();