IR: Move creation logic down to MDTuple, NFC
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>
Mon, 12 Jan 2015 20:13:56 +0000 (20:13 +0000)
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>
Mon, 12 Jan 2015 20:13:56 +0000 (20:13 +0000)
Move creation logic for `MDTuple`s down where it belongs.  Once there
are a few more subclasses, these functions really won't make much sense
here (the `friend` relationship was already awkward).  For now, leave
the `MDNode` versions around, but have it forward down.

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

include/llvm/IR/Metadata.h
lib/IR/Metadata.cpp

index e0363af57a784e28657632b73a8d0e42b329ea75..6b202d88a96ca0bfa3c2cfda8dad6e175f9cb59d 100644 (file)
@@ -604,25 +604,15 @@ protected:
 
   void dropAllReferences();
 
-  static MDNode *getMDNode(LLVMContext &C, ArrayRef<Metadata *> MDs,
-                           bool Insert = true);
-
   MDOperand *mutable_begin() { return mutable_end() - NumOperands; }
   MDOperand *mutable_end() { return reinterpret_cast<MDOperand *>(this); }
 
 public:
-  static MDNode *get(LLVMContext &Context, ArrayRef<Metadata *> MDs) {
-    return getMDNode(Context, MDs, true);
-  }
-
-  static MDNode *getIfExists(LLVMContext &Context, ArrayRef<Metadata *> MDs) {
-    return getMDNode(Context, MDs, false);
-  }
-
-  /// \brief Return a distinct node.
-  ///
-  /// Return a distinct node -- i.e., a node that is not uniqued.
-  static MDNode *getDistinct(LLVMContext &Context, ArrayRef<Metadata *> MDs);
+  static inline MDNode *get(LLVMContext &Context, ArrayRef<Metadata *> MDs);
+  static inline MDNode *getIfExists(LLVMContext &Context,
+                                    ArrayRef<Metadata *> MDs);
+  static inline MDNode *getDistinct(LLVMContext &Context,
+                                    ArrayRef<Metadata *> MDs);
 
   /// \brief Return a temporary MDNode
   ///
@@ -774,7 +764,6 @@ private:
 class MDTuple : public UniquableMDNode {
   friend class LLVMContextImpl;
   friend class UniquableMDNode;
-  friend class MDNode;
 
   MDTuple(LLVMContext &C, ArrayRef<Metadata *> Vals, bool AllowRAUW)
       : UniquableMDNode(C, MDTupleKind, Vals, AllowRAUW) {}
@@ -783,15 +772,40 @@ class MDTuple : public UniquableMDNode {
   void setHash(unsigned Hash) { MDNodeSubclassData = Hash; }
   void recalculateHash();
 
+  static MDTuple *getImpl(LLVMContext &Context, ArrayRef<Metadata *> MDs,
+                          bool ShouldCreate);
+
 public:
   /// \brief Get the hash, if any.
   unsigned getHash() const { return MDNodeSubclassData; }
 
+  static MDTuple *get(LLVMContext &Context, ArrayRef<Metadata *> MDs) {
+    return getImpl(Context, MDs, /* ShouldCreate */ true);
+  }
+  static MDTuple *getIfExists(LLVMContext &Context, ArrayRef<Metadata *> MDs) {
+    return getImpl(Context, MDs, /* ShouldCreate */ false);
+  }
+
+  /// \brief Return a distinct node.
+  ///
+  /// Return a distinct node -- i.e., a node that is not uniqued.
+  static MDTuple *getDistinct(LLVMContext &Context, ArrayRef<Metadata *> MDs);
+
   static bool classof(const Metadata *MD) {
     return MD->getMetadataID() == MDTupleKind;
   }
 };
 
+MDNode *MDNode::get(LLVMContext &Context, ArrayRef<Metadata *> MDs) {
+  return MDTuple::get(Context, MDs);
+}
+MDNode *MDNode::getIfExists(LLVMContext &Context, ArrayRef<Metadata *> MDs) {
+  return MDTuple::getIfExists(Context, MDs);
+}
+MDNode *MDNode::getDistinct(LLVMContext &Context, ArrayRef<Metadata *> MDs) {
+  return MDTuple::getDistinct(Context, MDs);
+}
+
 /// \brief Forward declaration of metadata.
 ///
 /// Forward declaration of metadata, in the form of a basic tuple.  Unlike \a
index 8ff46735757750f3f375964ca80021c61b38cc03..3d444660c67c86ed58ccfc510f76e96d44c549a7 100644 (file)
@@ -581,15 +581,15 @@ void UniquableMDNode::handleChangedOperand(void *Ref, Metadata *New) {
   storeDistinctInContext();
 }
 
-MDNode *MDNode::getMDNode(LLVMContext &Context, ArrayRef<Metadata *> MDs,
-                          bool Insert) {
-  auto &Store = Context.pImpl->MDTuples;
-
+MDTuple *MDTuple::getImpl(LLVMContext &Context, ArrayRef<Metadata *> MDs,
+                          bool ShouldCreate) {
   MDTupleInfo::KeyTy Key(MDs);
+
+  auto &Store = Context.pImpl->MDTuples;
   auto I = Store.find_as(Key);
   if (I != Store.end())
     return *I;
-  if (!Insert)
+  if (!ShouldCreate)
     return nullptr;
 
   // Coallocate space for the node and Operands together, then placement new.
@@ -599,7 +599,7 @@ MDNode *MDNode::getMDNode(LLVMContext &Context, ArrayRef<Metadata *> MDs,
   return N;
 }
 
-MDNode *MDNode::getDistinct(LLVMContext &Context, ArrayRef<Metadata *> MDs) {
+MDTuple *MDTuple::getDistinct(LLVMContext &Context, ArrayRef<Metadata *> MDs) {
   auto *N = new (MDs.size()) MDTuple(Context, MDs, /* AllowRAUW */ false);
   N->storeDistinctInContext();
   return N;